C语言学习记录
1.memset的使用
#include <stdio.h>
#include <stdlib.h>
int main()
{
char arr[] = “hello word”;
memset(arr, '’, 5); //将arr中前五个字符变成(中间只能放一个字符)
printf("%s", arr);
return 0;
}
2.extern使用
#include <stdio.h>
#include <stdlib.h>
extern int add(int, int); //extern:引用外部(其他目录)函数或变量
int main()
{
printf(“请输入两个整数\n”);
int a, b;
scanf("%d%d",&a, &b);
int sum = add(a, b);
printf(“sum = %d\n”, sum);
return 0;
}
3.strcpy使用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str1[20] ={0};
char str2[] = “china”;
strcpy(str1,str2);
printf("%s\n",str1);
return 0;
}
4.static使用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str1[20] = {0};
char str2[] = “china”;
strcpy(str1,str2);
printf("%s\n",str1);
return 0;
}
5.sizeof求字节长度
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d",sizeof(double*));
printf("%d",sizeof(int*));
printf("%d",sizeof(float*));
printf("%d",sizeof(char*));
return 0;
}
6.memset使用
#include <stdio.h>
#include <stdlib.h>
int main()
{
char arr[] = “hello word”;
memset(arr, '’, 5);//将arr中前五个字符变成(中间只能放一个字符)
printf("%s", arr);
return 0;
}
6.struct结构体
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct movie//创建一个结构体
{
char name[30];
int price;
}; //注意分号
int main()
{
struct movie m1 = {“摩尔庄园”,200};//使用一个变量命名这一结构体,用逗号隔开结构体具体内容
//字符(汉字)用双引号括起来
printf(“书名:%s\n”,m1.name);//结构体变量.结构体中的成员
printf(“价格:%d\n”,m1.price);//也可以printf(“价格:%d”,(*pb).price);
struct movie *pb=&m1;//指针打印
printf("%s\n",pb->name);//结构体指针->结构体成员
printf("%d\n",pb->price);
//改变价格和书名的方法
m1.price=15;
strcpy(m1.name,“海绵宝宝”);//strcpy为字符拷贝,需要用到头文件#include<string.h>
printf("%d\n",m1.price);
printf("%s",m1.name);
return 0;
}
7.goto使用
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
i:
{
Sleep(100);
printf(“I love you!\n”);
}
goto i;
return 0;
}
8.*解引用操作符
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 1;
int b = 0;
int* p = &a; //类型为int*,指明p为指针变量
p = 20; //——解引用操作符/间接访问操作符
printf("%d,%p,%p",a, &b, p);
return 0;
}
9.宏定义
#include <stdio.h>
#include <stdlib.h>
#define MAX(x, y) (x>y?x:y)
int main()
{
int a, b, c;
scanf("%d%d",&a, &b);
c = MAX(a, b);
printf(“较大的数是%d\n”, c);
return 0;
}
10.求1~100之间3的倍数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
for(i=1; i<=100; i++)
{
if(i%3 == 0)
{
printf("%d ",i);
}
}
return 0;
}
11.打印乘法口诀表
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int j = 0;
for(i=1; i<=9; i++)
{
for(j=1; j<=i; j++)
{
printf("%d * %d = %-2d “, j, i, i*j);
}
printf(”\n");
printf("\n");
}
return 0;
}
12.求1-1/2+1/3-1/4+……+1/99-1/100
#include <stdio.h>
#include <stdlib.h>
int main()
{
double sum1 = 0;
double sum2 = 0;
double i = 0;
double j = 0;
for(i=1; i<=100; i+=2)
{
sum1 = sum1 + 1.0/i;
}
for(j=2; j<=100; j+=2)
{
sum2 = sum2 + 1.0/j;
}
printf("%lf",sum1 - sum2);
return 0;
}
13.计算1!+2!+3!=?
#include <stdio.h>
#include <stdlib.h>
//计算1!+2!+3!=?
int main()
{
int i, j, sum = 0;
int ret = 1;
/*for(j=1; j<=3; j++)
{
ret = 1;//使ret恢复1,计算下一次阶乘
for(i=1; i<=j; i++)
{
ret = ret * i;
}
sum = sum + ret;
}
printf("%d",sum);
return 0;
}*/
//算法优化
for(j=1; j<=3; j++)
{
ret = ret * j;
sum = sum + ret;
}
printf("%d", sum);
return 0;
}
14.判断闰年
#include <stdio.h>
#include <stdlib.h>
//闰年判断方法:能被四百整除,或者能被四整除而不能被一百整除
int main()
{
int year = 0, count = 0;
for(year=1000; year<=2000; year++)
{
/*if(year%4==0 && year%100!=0)
{
printf("%d ", year);
count++;
}
else if(year % 400 == 0)
{
printf("%d ", year);
count++;
}*/
//和并在一起写
if(year%400 == 0 || (year%4==0 && year%100 != 0))
{
printf("%d ", year);
count++;
}
}
printf("\n一共有%d个闰年\n", count);
return 0;
}
15.求素数
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//求100~200的素数
int main()
{
int i = 0;
int count = 0;
for(i=1; i<=100; i+=2)
{
//判断素数:1.试除法:不能被2到i-1整除的数 2.优化:试除2~根号i的数能否整除 3.进一步优化:从奇数里面找
int j = 0;
for(j=2; j<=sqrt(i); j++)//如果i=a*b,说明i不是素数,而a和b中至少有一个数小于等于根号i
{
if(i%j == 0)
break;//两种跳出可能:1,i不是素数跳出 2,当j大于根号i时跳出,表明i是素数
}
if(j>sqrt(i))
{
count++;
printf("%d ", i);
}
}
printf("\n个数为%d", count);
return 0;
}
16.求十个整数中的最大值
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[] = {-1, -2, -3, -10, -4, -5, -6, -7, -8, -9, -20, -11};
int i;
int sz = sizeof(arr)/sizeof(arr[0]);
int max = arr[0];//关键点:假设第一个数位为最大值
for(i=0; i<sz; i++)
{
if(max<arr[i])
{
max = arr[i];
}
}
printf("%d", max);
return 0;
}
17.设置一个密码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int ret=0, a=0;
char password[20] = {0};
printf(“请输入密码”);
scanf("%s",password);//scanf数组不需要&符号
printf(“请确定密码是否正确(Y/N)”);
a = getchar();//吃掉输入密码后的回车
ret = getchar();
if(ret == ‘Y’)
{
printf(“确认成功”);
}
else
{
printf(“放弃确认”);
}
return 0;
}
18.设置123456密码登录
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
int i = 0;
char password[20] = {0};
for(i=0; i<3; i++)
{
printf(“请输入密码:>”);
scanf("%s", password);
if (strcmp(password, “123456”)==0) //==不能比较两个字符串是否相等,应该用strcmp函数
{
printf(“登陆成功\n”);
break;
}
else
{
printf(“密码错误\n”);
}
}
if(i == 3)
{
printf(“三次密码输入错误,程序退出”);
}
return 0;
}
19.寻找“单身狗”
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[] = {1,2,3,4,1,2,3,4,5,6};
int i = 0;
int j = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=0; i<sz; i++)
{
int count = 0; //计数器要加到循环里面
for(j=0; j<sz; j++)
{
if(arr[i] == arr[j])
{
count++;
}
}
if(count == 1)
{
printf(“单身狗是:%d\n”, arr[i]);
}
}
return 0;
}
20.找数组中数字下标
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int k;
scanf("%d",&k);
int sz = sizeof(arr)/sizeof(arr[0]);
int i;
for(i=0; i<sz; i++)
{
if(k == arr[i])
{
printf(“找到了数字7的下标为%d”,i);
}
break;
}
if(i == sz)
printf(“找不到”);
return 0;
}
21.找数组中数字下标(二分查找法)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<windows.h>
//找到所求元素下标
int main()
{
int arr[]= {1,2,3,4,5,6,7,7,8,9,10};
int k = 0;
scanf("%d", &k);
int sz = sizeof(arr)/sizeof(arr[0]);
int left = 0;//左下标
int right = sz - 1;//右下标
while(right>=left)
{
int mid = (left + right)/2;//重点:mid要放到循环中求
if(k>arr[mid])
{
left = mid + 1;
}
else if(k<arr[mid])
{
right = mid - 1;
}
else
{
printf("找到了,下标是%d",mid);
break;
}
}
if(left>right)
{
printf(“找不到”);
}
return 0;
}
22.汇聚打印,数组左右同时替换
{
char arr1[] = “you are so cute,I love you very much!”;
char arr2[] = " “;
int left = 0;//左下标
//int right = (sizeof(arr1)/sizeof(arr1[0]))-2;//右下标:减2是因为数组右边存在”\0"
int right = strlen(arr1)-1;
while(left<=right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf(" %s\n",arr2);
Sleep(100);//头文件#include<windows.h>,停留一段时间单位毫秒
system(“cls”);//清空屏幕,头文件#include <stdlib.h>
left++;
right–;
}
printf(“you are so cute,I love you very much!”);
return 0;
}
23.猜数字游戏
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("*****\n");
printf(" 1.play 0.exit \n"); //设置0的巧妙之处:当输入值为零时程序退出
printf("\n");
}
void game()
{
int guess = 0;//接收猜的数字
int ret = 0;
ret = rand()%100+1;//生成随机数032767变成0100的数
while(1)
{
printf(“请猜数字:>”);
scanf("%d", &guess);
if(guess > ret)
{
printf(“很遗憾猜大了\n”);
}
else if(guess < ret)
{
printf(“很遗憾猜小了\n”);
}
else
{
printf(“恭喜你猜对了!\n”);
break;
}
}
}
int main()
{
int input;//接收是否开始游戏
srand ((unsigned int)time(NULL));//利用时间戳生成随机起点
do
{
menu();
printf("请选择>:");
scanf("%d", &input);
switch(input)
{
case 1:
printf("**********************游戏开始**********************\n");
game();
break;
case 0: //设置0的巧妙之处:当输入值为零时程序退出
printf("退出游戏\n");
break;
default:
printf("选择错误 请重新选择\n");
break;
}
}
while(input);
return 0;
}
24.输入三个数从大到小排序
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int a = 0, b = 0, c = 0;
scanf("%d%d%d", &a, &b, &c);
if(a<b)
{
int temp = 0;
temp = a;
a = b;
b = temp;
}
if(a<c)
{
int temp = 0;
temp = a;
a = c;
c = temp;
}
if(b<c)
{
int temp = 0;
temp = b;
b = c;
c = temp;
}
printf("%d,%d,%d", a, b, c);
return 0;
}
25.辗转相除法求最大公约数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int r = 0;
int m = 0, n = 0;
while(1)
{
printf(“请输入两个数:”);
scanf("%d%d", &m, &n);
while(r = m%n)
{
//r = m % n;
m = n;
n = r;
}
printf(“最大公约数是:%d\n”,n);
}
return 0;
}
27.“我是猪”关机程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
system(“shutdown -s -t 60”);//设置一分钟后关机
printf(“请注意你的电脑将在一分钟后关机\n”);
printf(“如果你输入“我是猪”将取消关机\n”);
char str1[] = “我是猪”;
char str2[20] = {0};
while(1)
{
printf(“请输入:>”);
scanf("%s", str2);
if(strcmp(str1, str2) == 0)
{
system(“shutdown -a”);//取消关机
break;
}
}
return 0;
}
28.函数求闰年
#include <stdio.h>
#include <stdlib.h>
int is_leap_year(int n)
{
if((n%40&&n%100 != 0) || n%4000)
{
return 1;
}
}
int main()
{
int year = 0;
int count = 0;
for(year=1000; year<=2000; year++)
{
if(is_leap_year(year) == 1)
{
printf("%d “, year);
count++;
}
}
printf(”\ncount = %d", count);
return 0;
}
29.函数求素数
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int is_prime(int n)
{
int j = 0;
for(j=2; j<n; j++)
{
if(n%j == 0)
break;
}
return 1;
}
int main()
{
int i = 0;
scanf("%d", &i);
if(1 == is_prime(i))
{
printf("%d是素数", i);
}
return 0;
}
30.函数求素数优化
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//函数判断一个数是否为素数
int is_prime(int n)
{
int j = 0;
for(j=2; j<=sqrt(n); j++)
{
if(n%j == 0)
return 0;
}
//if(n > j)
return 1;
}
int main()
{
int i = 0;
scanf("%d", &i);
if(is_prime(i) == 1)
{
printf("%d是素数", i);
}
else
{
printf("%d不是是素数", i);
}
return 0;
}
31.函数num自加1
#include <stdlib.h>
void add(int* num)
{
(num)++; //注意num是整体 不加括号++只作用于num
}
int main()
{
int num = 0;
add(&num);
printf(“num = %d\n”, num);
add(&num);
printf(“num = %d\n”, num);
add(&num);
printf(“num = %d”, num);
return 0;
}
32.swap(两个整形利用交换)函数
#include <stdio.h>
#include <stdlib.h>
//实参必须要有确定的值
void swap(int* pa, int* pb)
{
int temp = 0;
temp = *pa;
*pa = *pb;
*pb = temp;
}
int main()
{
int a = 10;
int b = 20;
printf(“a = %d, b = %d\n”, a, b);
swap(&a, &b); // 把a,b的地址传过去进行交换(传值过去不能完成任务)
printf(“a = %d, b = %d”, a, b);
return 0;
}
33.get_max函数
#include <stdio.h>
#include <stdlib.h>
int get_max(int x, int y)
{
int z = x>y ? x:y;
return z;
}
int main()
{
int a = 20;
int b = 30;
printf(“max = %d\n”, get_max(a, b));//实参必须要有确定的值
printf(“max = %d\n”, get_max(100, 200+1));//实参可以是表达式
printf(“max = %d\n”, get_max(5, get_max(3, 7)));//可以是函数
return 0;
}
34.冒泡排序bubble_sort函数
#include <stdio.h>
#include <stdlib.h>
void bubble_sort(int arr[], int sz) //数组名为首元素地址
{
int i = 0;
for(i = 0; i < sz - 1; i++)
{
//每一趟冒泡排序:比较9时一共有8对比较大小,所以要循环8次
int j = 0;
int falg = 1; //使用falg进行优化:当 falg = 1 时数组已经有序,falg = 0 时需要排序
for(j = 0; j < sz - 1 - i; j++)
{
if(arr[j]>arr[j+1])
{
int temp = 0;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
falg = 0; //数组需要排序
}
}
if(falg == 1) //如果falg还等于一,跳出循环
{
break;
}
}
}
int main()
{
int arr[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
int sz = sizeof(arr)/sizeof(arr[0]);
int i = 0;
bubble_sort(arr, sz);
for(i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
35.递归:按顺序打印数字
#include <stdio.h>
#include <stdlib.h>
void print(int n)
{
if(n>9) //递归要设置递归条件,防止溢出,每次递归后要越来越接近这一条件
{
print(n/10);
}
printf("%d “, n%10);
}
int main()
{
unsigned int num = 0;
scanf(”%d", &num);
//递归
print(num); //设置一个函数
return 0;
}
36.递归与迭代求n!
#include <stdio.h>
#include <stdlib.h>
int Fac(int n)
{
if(n <= 1)
{
return 1;
}
else
{
return n * Fac(n - 1);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fac(n);
printf(“n! = %d”, ret);
return 0;
}
37.递归求字符串长度
#include <stdio.h>
#include <stdlib.h>
/int my_strlen(char str) //地址用指针接收
{
int count = 0; //计数器
while(str != ‘\0’)
{
count++;
str++; //移动字符
}
return count;
}/
//不使用计数器临时变量创建函数
//my_strlen(bit)
//1+my_strlen(it)
//1+1+my_strlen(i)
//1+1+1+0 = 3
int my_strlen(char* str)
{
if(*str != ‘\0’) //解引用后 != 0
{
return 1 + my_strlen(str+1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = “bit”;
int len = my_strlen(arr); //字符串传给形参的是首字母的地址
printf(“len = %d”, len);
return 0;
}
38.递归斐波那契数列
#include <stdio.h>
#include <stdlib.h>
//斐波那契数列:1,1,2,3,5,8,13,21,34,55
//递归求法
int Fib(int n)
{
if(n <= 2)
{
return 1;
}
else
{
return Fib(n - 1)+Fib(n - 2);
}
}
39.斐波那契数列函数循环优化
int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1; // 当n<=2时c的值都为1
while(n > 2)
{
c = a + b;
a = b;
b = c;
n–;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf(“ret = %d”, ret);
return 0;
}
40.函数链式访问
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int len = 0;
len = strlen(“abc”);
//1普通访问
printf("%d\n", len);
//2.链式访问
printf("%d\n", strlen(“abc”));
printf("%d", printf("%d", printf("%d", printf("%d", 43))));// 43后面的printf打印数字个数
return 0;
}
41.函数嵌套调用
#include <stdio.h>
#include <stdlib.h>
void new_line()
{
printf(“hh\n”);
}
void three_line()
{
int i = 0;
for(i=0; i<3; i++)
{
new_line();
}
}
int main()
{
three_line();
return 0;
}
42.三子棋游戏程序
#include <stdio.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
#include <time.h>
#include <windows.h>
//返回1表示棋盘满了
//返回0表示棋盘没满
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
for(i = 0; i < row; i++)
{
int j = 0;
for(j = 0; j < col; j++)
{
if(board[i][j] == '\0')
{
return 0; //满了
}
}
}
return 1; //没满
}
char is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
//判断横三行
for(i = 0; i < ROW; i++)
{
if(board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ‘\0’)
{
return board[i][2];
}
}
//判断竖三列
for(i = 0; i < COL; i++)
{
if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ‘\0’)
{
return board[0][i];
}
}
//判断两条对角线
if(board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ‘\0’)
{
return board[1][1];
}
if(board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ‘\0’)
{
return board[1][1];
}
//判断是否平局
if(1 == is_full(board, ROW, COL))
{
return ‘Q’;
}
return ‘c’;
}
void computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf(“电脑下棋:>\n”);
while(1)
{
x = rand() % ROW;
y = rand() % COL;
if(board[x][y] == ‘\0’)
{
board[x][y] = ‘#’;
break;
}
}
}
void player_move(char board[ROW][COL], int row, int col)
{
printf(“玩家下棋:> \n”);
int x = 0;
int y = 0;
while(1)
{
printf(“请输入坐标:>\n”);
scanf("%d%d", &x, &y);
//判断x,y坐标合法性
if(x >= 1 && x <= row && y >= 1 && y <= col)
{
if(board[x - 1][y - 1] == ‘\0’)
{
board[x - 1][y - 1] = '’;
break;
}
else
{
printf(“该坐标已被占用 “);
}
}
else
{
printf(“坐标非法,请重新输入\n”);
}
}
}
void Dispalyboard(char board[ROW][COL], int row, int col)
{
int i = 0;
for(i = 0; i < row; i++)
{
//打印数据
int j = 0;
for(j = 0; j < col; j++)
{
printf(” %c “, board[i][j]);
if(j < col - 1)
{
printf(”|”);
}
}
printf("\n");
//打印分割行
if(i < row - 1)
{
for(j = 0; j < col; j++)
{
printf("—");
if(j < col - 1)
printf("|");
}
printf("\n");
}
}
}
void Initboard(char board[ROW][COL], int row, int col) //棋盘初始化
{
int i = 0;
int j = 0;
for(i = 0; i < row; i++)
{
for(j = 0; j < col; j++)
{
board[row][col] = ’ ';
}
}
}
void game() //游戏实现
{
char ret = 0;
char board[ROW][COL] = {0};//全部空格
//初始化棋盘
Initboard(board, ROW, COL);
//打印棋盘
Dispalyboard(board, ROW, COL);
//下棋
while(1)
{
//玩家下棋
player_move(board, ROW, COL);
system(“cls”);
Dispalyboard(board, ROW, COL);
//判断玩家输赢
ret = is_win(board, ROW, COL); //告诉我们四种游戏结果:电脑赢# 玩家赢 平局Q 继续C
if(ret != ‘c’)
{
break;
}
//电脑下棋
computer_move(board, ROW, COL);
system(“cls”);
Dispalyboard(board, ROW, COL);
//判断电脑输赢
ret = is_win(board, ROW, COL);
if(ret != ‘c’)
{
break;
}
}
if(ret == '’)
{
printf(“玩家赢\n”);
}
else if(ret == ‘#’)
{
printf(“电脑赢\n”);
}
else
{
printf(“平局\n”);
}
}
void menu()
{
printf(“三子棋\n”);
printf("1. play 0. exit\n");
printf("************************************\n");
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf(“请选择:> “);
scanf(”%d”, &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf(“退出游戏\n”);
break;
default:
printf(“选择错误,请从新选择\n”);
break;
}
}
while(input);
}
int main()
{
test();
return 0;
}