for循环:
for(表达式1;表达式2;表达式3){ }
//表达式123分别为初始化、判断、调整部分
//初始化、判断、调整部分均可以省略
//如果把判断部分省略了,就意味着判断为真
//建议大家不要轻易省略
省略初始化部分
//省略初始化部分 int main() { int i = 0; int j = 0; for (; i < 3; i++) { for (; j < 3; j++) { printf("hehe\n"); } } }
运行结果:
只打印三次的原因是当i=0进入for(int ...)循环中,j循环三次调整为3时,再次进入for(i)循环i=1时此时j的值仍然是3,所以不执行printf语句,再次进入for(i)循环也是这样。
break和continue在for循环中
int main() { int i = 0; for (i = 1; i <= 10; i++) { if (i == 5) break; printf("%d", i); }
int main() { int i = 0; for (i = 1; i <= 10; i++) { if (i == 5) continue; printf("%d", i); }
continue
break和continue使用范围总结:
break:for 循环;while循环; do循环; switch循环
continue:for循环; while循环
do while 语句的语法
do 循环语句; while(表达式);
//使用do...while..语句打印1-10 int main() { int i = 1; do { printf("%d", i); i++; } while (i <= 10); return 0; }
运行结果:
执行语句的次数要比判断语句的次数多一次,因为最后一次判断了但是不执行
//使用do...while..语句打印1-10加入break int main() { int i = 1; do { if (i == 5) break; printf("%d", i); i++; } while (i <= 10); return 0; }
当i=5时跳出do while循环
运行结果:
//使用do...while..语句打印1-10加入continue int main() { int i = 1; do { if (i == 5) continue; printf("%d", i); i++; } while (i <= 10); return 0; }
当i=5时执行continue语句,不执行下面的代码,再进入do循环,i还是5,由此反复进入死循环
运行结果:
练习:
- 产生n的阶乘
int main() { int n = 0; //输入 scanf("%d", &n); //计算n的阶乘 int i = 0; int ret = 1;//ret代表累计相乘的结果 for (i = 1; i <= n; i++) { ret = ret * i; } printf("%d\n", ret); return 0; }
2.计算1!+2!+3!+.....+10!
int main() { int n = 0; //输入 //计算n的阶乘 int i = 0; int ret = 1; int sum = 0; for (n = 1; n <= 10; n++) { //计算n的阶乘 //每一次求阶乘的时候都要更新ret,如果不更新就会在每一次的ret的结果上累乘 ret = 1; for (i = 1; i <= n; i++) { ret *= i;//也就是ret=ret*i; } sum = sum + ret; } printf("%d\n", sum); }
3.在一个有序数组中查找某个数字n
遍历法:
//遍历法 int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; // 0 1 2 3 4 5 6 7 8 9 int k = 7;//要查找的数字 int i = 0; int sz = sizeof(arr) / sizeof(arr[0]);//strlen是求字符串长度的,不能用它 int flag = 0; for (i = 0; i < sz; i++) { if (k == arr[i]) { printf("找到了,下标是:%d\n", i); break; } } if (i == sz) printf("找不到\n"); return 0; }
折半查找算法(mid=left+right)/2
例如查找k=7;
int main() { int arr[ ] = { 1,2,3,4,5,6,7,8,9,10 }; // 0 1 2 3 4 5 6 7 8 9 int k = 7;//要查找的数字 int sz = sizeof(arr) / sizeof(arr[0]);//strlen是求字符串长度的,不能用它 //折半查找,前提是数组有序 int left = 0; int right = sz - 1; int flag = 0; while (left<=right) { int mid = (left + right) / 2;//当lfet和right太大时,加和的结果就会可能溢出程序所允许的最大数值,导致丢失一些数据所以最好使用 //所以最好使用:int mid=(right-left)/2+left; if (arr[mid] < k) { left = mid + 1; } else if (arr[mid] > k) { right = mid - 1; } else { printf("找到了,下标是%d", mid); flag = 1; break; } } if (flag == 0) printf("没找到\n"); return 0; }
其中使用:int mid=(right-left)/2+left; 原理图
4.编写代码,演示多个字符从两端移动,向中间汇聚
注意:字符串求长度用strlen
//编写代码,演示多个字符从两端移动,向中间汇聚 //welcome to bit!!!! //****************** //w****************! //we**************!! //......... //welcome to bit!!!! #include<string.h> #include<stdlib.h> #include<windows.h> int main() { char arr1[] = "welcome to bit!!!!"; char arr2[] = "******************"; int left = 0; int right = strlen(arr1) - 1;//字符串右下标 while (left < right) { //for(left=0,right=strlen(arr1)-1;left<=right;left++,right--){} arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf("%s\n", arr2); Sleep(1000);//如果想要在打印的时候停留一下,可以使用Sleep(),休息1000毫秒=1秒,使用头文件#include<windows.h> //system("cls");//cls是清空屏幕的意思,system()引用头文件#include<stdlib.h>,使用Sleep(1000)和system("cls")的效果是每次在屏幕上间隔1秒打印一行 left++; right--; } }
5.编写代码实现,模拟用户登录情景,并且只能登陆三次(只允许输入三次密码,如果密码正确,提示登录成功,如果三次均错误的话,则退出程序)
注意第8行:数组名本来就是地址,所以不用取地址&
判断两个字符串是否相等,应该使用库函数strcmp( , ),相等的话返回值为0,使用strcmp需要引用头文件#include<string.h>
#include<stdio.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需要引用头文件#include<string.h> printf("登录成功\n"); break; } else { printf("密码错误\n"); } } if (i == 3) printf("三次密码均错误,退出程序\n"); return 0; }
猜数字游戏
- 电脑生成一个1-100随机数
- 猜数字
猜大了,告诉你:猜大了;
猜小了,告诉你:猜小了;
猜对了,告诉你:恭喜你,猜对了;
#include<stdlib.h> #include<time.h> void menu() { printf("****************************\n"); printf("********** 1.play*********\n"); printf("********** 0.exit*********\n"); printf("****************************\n"); } //时间戳 每一分每一秒都有不同的时间戳time(),头文件#include<time.h> void game() { //玩一次游戏就会调用一次game() //设置了随机数的生成器 srand((unsigned int)time(NULL)); //在使用rand()之前必须使用srand(),必须配套使用 //srand()在使用时,传进去一个值,这个值总是在变化 //时间戳:当前计算机的时间-计算机起始时间=()秒,拿时间戳来设置随机数的生成起始点 // srand()的生成起点只设置一次就好了,不要频繁的设置,所以最好放在主函数中 //1.生成随机数 int ret= rand()%100+1;//头文件是#include<stdlib.h>,rand()会生成0-randmax之间一个随机数 //生成1-100之间的随机数,%100余数0-99,所以再加1,即1-100 //printf("%d\n", ret); //2.猜数字 int guess = 0; while (1) { printf("请输入数字:>"); scanf("%d", &guess); if (guess < ret) { printf("猜小了\n"); } else if(guess > ret){ printf("猜大了\n"); } else { printf("恭喜你,猜对了"); break; } } } //RAND_MAX;点击查看最大随机数是多少,0-32767 int main() { int input = 0; do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: printf("猜数字游戏:"); switch (input); case 2: game(); break; case 3: printf("退出游戏\n"); break; default: printf("选择错误\n"); break; } } while (input); return 0; }