文章目录
- 3.2 for循环
- 3.2.1 for语句的语法
- 3.2.2 for循环中的break和continue
- 3.2.3 for语句的循环控制变量
- 3.2.4 一些for循环的变种
- 3.2.5 一道笔试题
- 3.3 do while循环
- 3.3.1 do语句的语法
- 3.3.2 do语句的特点
- 3.3.3 do while循环中的break和continue
- 3.4 练习
- 3.4.1 计算 n的阶乘
- 3.4.2 计算 1!+2!+3!+……+10!
- 3.4.3 在一个有序数组中查找具体的某个数字n
- 3.4.4 多个字符从两端移动,向中间汇聚
- 3.4.5 模拟用户登录情景
- 附:
3.2 for循环
3.2.1 for语句的语法
使用for循环在屏幕上打印1-10的数字。
#include <stdio.h>int main()
{int i = 0;for (i = 1; i <= 10; i++){printf("%d ", i);}return 0;
}
for语句的执行流程如下:
现在我们对比一下for循环和while循环:
#include <stdio.h>int main()
{int i = 1;//1.初始化while (i <= 10)//2.判断{printf("%d ", i);i++;//3.调整}return 0;
}
可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹,for循环使用的频率也最高。
3.2.2 for循环中的break和continue
break:
#include <stdio.h>int main()
{int i = 0;for (i = 1; i <= 10; i++){ if (5 == i){break;}printf("%d ", i);}return 0;
}//1 2 3 4
continue:
#include <stdio.h>int main()
{int i = 0;for (i = 1; i <= 10; i++){if (5 == i){continue;}printf("%d ", i);}return 0;
}//1 2 3 4 6 7 8 9 10
3.2.3 for语句的循环控制变量
建议:
- 不可在for循环体内修改循环变量,防止for循环失去控制。
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
#include <stdio.h>int main()
{int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };// 0 1 2 3 4 5 6 7 8 9int i = 0;//[0,10)for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}
3.2.4 一些for循环的变种
#include <stdio.h>int main()
{//初始化和调整部分的省略就是啥都不做//判断部分省略了,意味着判断是恒为真的//建议不要随便省略for (;;){printf("hehe\n");}return 0;
}
#include <stdio.h>int main()
{int i = 0;int j = 0;for (i = 0; i < 4; i++){for (j = 0; j < 4; j++){printf("hehe\n");}}return 0;
}//打印16个hehe
#include <stdio.h>int main()
{int i = 0;int j = 0;for (; i < 4; i++){for (; j < 4; j++){printf("hehe\n");}}return 0;
}//打印4个hehe
//使用多余一个变量控制循环#include <stdio.h>int main()
{int x = 0;int y = 0;for (x=0, y=0; (x<2) && (y<5); ++x, y++){printf("hehe\n");}return 0;
}//打印2个hehe
3.2.5 一道笔试题
//请问循环要循环多少次?#include <stdio.h>int main()
{int i = 0;int k = 0;for (i = 0, k = 0; k = 0; i++, k++)k++;return 0;
}//循环0次
3.3 do while循环
3.3.1 do语句的语法
那么do语句的执行流程是怎样的呢?
3.3.2 do语句的特点
循环至少执行一次,使用的场景有限,所以不是经常使用。
//使用do while语句打印1~10#include <stdio.h>int main()
{int i = 1;do{printf("%d ", i);i++;} while (i <= 10);return 0;
}
3.3.3 do while循环中的break和continue
break:
#include <stdio.h>int main()
{int i = 1;do{if (5 == i){break;}printf("%d ", i);i++;} while (i <= 10);return 0;
}//1 2 3 4
continue:
#include <stdio.h>int main()
{int i = 1;do{ if (5 == i){continue;}printf("%d ", i);i++;} while (i <= 10);return 0;
}//1 2 3 4 死循环
3.4 练习
3.4.1 计算 n的阶乘
//5! = 1*2*3*4*5
//n! = 1~n 累积相乘//不考虑溢出
#include <stdio.h>int main()
{int n = 0;scanf("%d", &n);int i = 0;int ret = 1;for (i = 1; i <= n; i++){ret = ret * i;}printf("%d\n", ret);return 0;
}
3.4.2 计算 1!+2!+3!+……+10!
#include <stdio.h>int main()
{int i = 0;int n = 0;int sum = 0;for (n = 1; n <= 10; n++){int ret = 1;for (i = 1; i <= n; i++){ret = ret * i;}sum = sum + ret;}printf("%d\n", sum);return 0;
}
//以下方法更好#include <stdio.h>int main()
{int n = 0;int ret = 1;int sum = 0;//1!//2! = 1*2//3! = 1*2*3//4! = 1*2*3*4//每次在前面一次的基础上多乘了一个数,所以不需要每次都把ret改成1重来一遍for (n = 1; n <= 10; n++){ret *= n;sum += ret;}printf("%d\n", sum);return 0;
}
3.4.3 在一个有序数组中查找具体的某个数字n
#include <stdio.h>int main()
{int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//升序int k = 7;int i = 0;for (i = 0; i < 10; i++){if (k == arr[i]){printf("找到了,下标是%d\n", i);break;}}if (10 == i){printf("找不到了\n");}return 0;
}
//以下方法更好#include <stdio.h>int main()
{int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//升序//printf("%d\n", sizeof(arr));//计算数组的总大小,单位是字节//printf("%d\n", sizeof(arr[0]));//4//printf("%d\n", sizeof(arr) / sizeof(arr[0]));int k = 7;int sz = sizeof(arr) / sizeof(arr[0]);//1int left = 0;int right = sz - 1;int flag = 0;//flag的作用是标志是否找到了//2while (left <= right){int mid = (left + right) / 2;if (k == arr[mid]){printf("找到了,下标是:%d\n", mid);flag = 1;break;}else if (arr[mid] < k){left = mid + 1;}else{right = mid - 1;}}if (0 == flag){printf("没找到\n");}return 0;
}
3.4.4 多个字符从两端移动,向中间汇聚
//welcome to bit!!!!!
//###################
//w#################!
//we###############!!
//wel#############!!!
//...
//welcome to bit!!!!!//welcome to bit!!!!!
//####################include <stdio.h>
#include <string.h>
#include <windows.h>//Sleep需要一个windows.h的头文件int main()
{char arr1[] = "welcome to bit!!!!!";char arr2[] = "###################";int left = 0;int right = strlen(arr1) - 1;while (left <= right){arr2[left] = arr1[left];arr2[right] = arr1[right];printf("%s\n", arr2);Sleep(1000);//单位是毫秒system("cls");//system函数可以执行系统命令,cls是清理屏幕left++;right--;}printf("%s\n", arr2);return 0;
}
3.4.5 模拟用户登录情景
编写代码实现模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确,则提示登录成功;如果三次均输入错误,则退出程序。)
//假设密码是:"123456"#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);//判断密码是否正确//两个字符串比较相等是不能使用==的,应该使用strcmp库函数 //strcmp返回0表示2个字符串相等//strcmp返回>0的数字,表示第一个字符串大于第二个字符串//strcmp返回<0的数字,表示第一个字符串小于第二个字符串//字符串比较大小是比较对应位置上的ASCII码值////abcd\0//abq\0////abq大于abcdif (0 == strcmp(password, "123456")){printf("登录成功\n");break;}else{printf("密码错误\n");}}if (3 == i){printf("退出程序\n");}return 0;
}
//也可以这样写#include <stdio.h>int main()
{int i = 0;char password[20] = { 0 };int flag = 0;for (i = 0; i < 3; i++){printf("请输入密码:>");scanf("%s", password);if (0 == strcmp(password, "123456")){printf("登录成功\n");flag = 1;break;}else{printf("密码错误\n");}}if (0 == flag){printf("退出程序\n");}return 0;
}