5.for循环
for( 初始化;判断 ;调整 ) {} 复制代码
初始化,判断,调整三个部分:
1.可以省略
2.判断部分只要省略了,就意味着判断恒为“真”
3.尽量不要省略
int i = 0; int j = 0; for(;i < 10; i++) { for(; j < 10; j++) { printf("hehe\n"); } } //只打印10个hehe //原因:第一次进入循环,j初始化为0 第二次进入循环之后,j没有重置,,j已经是10了,不满足J < 10了,不打印了。 复制代码
练习题1:计算n的阶乘
// n! = 1*2*3*...*n //写法1 int main() { int n = 0; scanf("%d",&n); int i = 0; int sum = 1; //注意sum和i不能初始化为0,因为0乘任何数为0 for(i = 1; i <= n; i++) { sum*=i; } printf("%d\n",sum); return 0; } //写法2-- n! = 1*2*3*...*n int Fic(int n ) { return n <=1 ? 1 : Fic(n-1)*n; } int main() { int n = 0; scanf("%d",&n); int ret = Fic(n); printf("%d\n",ret); return 0; } 复制代码
练习题2:计算1!+2!+3!+.....+10!
int main() { int n = 0; scanf("%d",&n); int i = 0; int sum = 1; //注意sum和i不能初始化为0,因为0乘任何数为0 for(i = 1; i <= n; i++) { sum*=i; //计算每一个阶乘 ret += sum; //阶乘相加 } printf("%d\n",sum); return 0; } 复制代码
练习题3:在一个有序数组中查找具体的某个数字 - 二分查找
//二分法 int BinarySearch(int* arr, int sz,int k) { int right = sz - 1; //右下标 int left = 0; //左下标 while (left <= right) { int mid = (right + left) >> 1; //中间值 //mid = (right + left)/2 //左移 == 除2 右移 == 乘2 if (arr[mid] > k) { right = mid - 1; //右下标 变成中间值-1位置 } else if (arr[mid] < k) { left = mid + 1; //左下标 变成中间值+1位置 } else return mid; } return -1; //找不到 } int main() { int arr[] = { 0,1,2,3,4,5,6,7,8,9 }; int sz = sizeof(arr) / sizeof(arr[0]); int k = 7; //要找的数字 int ret = BinarySearch(arr, sz,k); if (ret != -1) { printf("找到了,下标为:%d\n", ret); } else { printf("找不到\n"); } return 0; } 复制代码
练习题4:演示多个字符从两端移动,向中间汇聚
int main() { char arr1[] = "hello world"; char arr2[] = "***********"; int len = strlen(arr1); int left = 0; int right = len - 1; while (left <= right) { arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf(arr2); printf("\n"); right--; left++; Sleep(1000);//Sleep-休眠函数,C语言中,单位为毫秒 1000毫秒 = 1秒 system("cls"); //清屏函数-用来执行系统命名 引用windows.h头文件 } printf(arr2); return 0; } 复制代码
练习题5:模拟用户登陆场景,并且只能登陆三次(只允许输入三次密码。如果密码正确则提升登录成功,三次均输入错误,则退出程序)
//字符串比较使用strcmp 函数,若字符串相同,返回0 int main() { int count = 0;//统计输入密码次数 char arr[20] = { 0 }; //输入密码 printf("请输入密码:->\n"); while (count < 3) { gets(arr); if (strcmp(arr, "Mango") == 0) { count++; printf("登陆成功,你共输入了%d次密码\n", count ); break; } else { count++; printf("密码错误,重新输入,剩余机会%d\n",3-count); } } return 0; } 复制代码
6.goto语句
//情形1 int main() { again: printf("hehe\n"); goto again; return 0; } //死循环打印hehe 复制代码
//情形2 --err //原因:goto不可以跨函数跳转 int test() { again: printf("hehe\n"); } int main() { printf("hehe\n"); goto again; return 0; } 复制代码
关机程序
int main() { int count = 0; //次数确认 char arr[20] = { 0 }; printf("请输入:我是猪 否则将在1min内关机,你只有3次机会\n"); system("shutdown -s -t 60"); again: gets(arr); if (strcmp(arr, "我是猪") == 0) { printf("取消关机\n"); system("shutdown -a"); } else { count++; if (count == 3) { printf("你没有机会啦,拜拜\n"); return 0; } printf("仅剩机会%d次\n", 3 - count); goto again; } return 0; } 复制代码
//使用循环的写法 int main() { int count = 0; //次数确认 char arr[20] = { 0 }; printf("请输入:我是猪 否则将在1min内关机,你只有3次机会\n"); system("shutdown -s -t 60"); while (1) { gets(arr); if (strcmp(arr, "我是猪") == 0) { printf("取消关机\n"); system("shutdown -a"); break; } else { count++; if (count == 3) { printf("你没有机会啦,拜拜\n"); break; } printf("仅剩机会%d次\n", 3 - count); } } return 0; } 复制代码
//简易写法 printf("1min内关机,输入我是猪取消关机\n"); system("shutdown -s -t 60"); while(1) { gets(arr); if (strcmp(arr, "我是猪") == 0) { printf("取消关机\n"); system("shutdown -a"); break; } } 复制代码
7.猜数字游戏
规则: 1.生成一个随机数 2.猜数字(大,小,正确) 3.可以反复玩 复制代码
rand()函数:
如何产生随机数:
生成随机数-- 引用stdllib.h头文件
rand()生成的随机数:0-32767
想要产生范围为0-99的数字:rand() %100
想要产生范围为1-100的数字: rand()%100 +1
想要产生范围为0-3的数字: rand() % 3
//产生随机数,但这样的话产生的值是固定的 int main() { printf("%d\n", rand()); return 0; } 复制代码
srand()函数
为了防止每次产生的随机数都是一样的:
在使用rand()函数前,引用srand()函数初始化随机数生成器
srand(): --引用stdlib.h ,注意函数参数为size_t -unsigned int
当srand()函数的参数发生变化时,产生的随机数也发生变化,否则还是产生一样的数
int main() { srand(0); printf("%d\n", rand()); srand(1); printf("%d\n", rand()); return 0; } //两次产生的随机值都不一样 复制代码
时间戳
时间戳:当前时间与计算机起始时间(1970年1月1日0时0分0秒)的差值
C语言中如何使用时间戳:
time()函数
time()函数 -引用头文件 time.h
参数返回类型:time_t
返回类型为:time_t
本质上是长整形
函数参数类型为:长整形指针
设置随机数生成起点
srand(unsigned int)time(NULL) //拿时间戳作为参数 //只需设置一次即可 复制代码
代码
注意:
1.生成的随机数要放在while外面 不然每次循环都又生成一个新的随机数
2.每次游戏都产生一个新的随机数
3.因为至少要进入循环一次进行选择->使用do-while循环
void menu() { printf("***********************\n"); printf("***** 1.猜数字游戏*****\n"); printf("***** 0.退出游戏 *****\n"); printf("***********************\n"); } void game() { //生成随机数范围:1-100 // rand() % 100 -> 0 - 99 int ret = rand() % 100 + 1; int guess = 0; int count = 0; //猜数字 while (1) { printf("请输入你猜的数字,范围为:1-100\n"); scanf("%d", &guess); if (guess > ret) { count++; printf("猜大了\n"); } else if (guess < ret) { count++; printf("猜小了\n"); } else { count++; if (count < 5) { printf("你真牛,共猜了%d次,才猜对\n", count); } else { printf("你运气真差,猜了%d次才猜对\n", count); } break; } } } int main() { srand((size_t)time(NULL)); //设置随机数生成起点,以时间戳为参数 int input = 0; do { menu(); printf("请选择->\n"); scanf("%d", &input); switch(input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("请重新选择\n"); break; } } while (input); //0表示假,非0表示真 return 0; } 复制代码