1. for循环
对比一下 for 循环和 while 循环。
int i = 0; //实现相同的功能,使用while i=1;//初始化部分 while(i<=10)//判断部分 { printf("hehe\n"); i = i+1;//调整部分 } //实现相同的功能,使用while for(i=1; i<=10; i++) { printf("hehe\n"); }
for 循环的风格更胜一筹; for 循环使用的频率也最高。
1.1 break和continue在for循环中
在 for 循环中也可以出现 break 和 continue ,他们的意义和在 while 循环中是一样的。
但是还是有些差异的。
break(终止循环)
#include <stdio.h> int main() { int i = 0; for(i=1; i<=10; i++) { if(i == 5) 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(i == 5) continue; printf("%d ",i); } return 0; }
结果是 1 2 3 4 6 7 8 9 10
1.2 for语句的循环控制变量
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
int i = 0; //前闭后开的写法 for(i=0; i<10; i++) {} //两边都是闭区间 for(i=0; i<=9; i++) {}
1.3 一些for循环的变种
#include <stdio.h> int main() { //代码1 for(;;) { printf("hehe\n"); }
for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问 题。
int i = 0; int j = 0; //这里打印多少个hehe? for(i=0; i<10; i++) { for(j=0; j<10; j++) { printf("hehe\n"); } }
结果为9个hehe
int i = 0; int j = 0; //如果省略掉初始化部分,这里打印多少个hehe? for(; i<10; i++) { for(; j<10; j++) { printf("hehe\n"); } }
结果为3个hehe
可以使用多余一个变量控制循环
int x, y; for (x = 0, y = 0; x<2 && y<5; ++x, y++) { printf("hehe\n"); } return 0; }
例题
//请问循环要循环多少次? #include <stdio.h> int main() { int i = 0; int k = 0; for(i =0,k=0; k=0; i++,k++) k++; return 0; }
k=0是赋值,结果为假,直接进入死循环,表达式必须为真。
2.do...while()循环
注意:判断比循环多一次
2.1 do语句的语法
do 循环语句; while(表达式);
2.2 do语句的特点
循环至少执行一次
#include <stdio.h> int main() { int i = 1; do { printf("%d ", i); i=i+1; }while(i<=10); return 0; }
2.3 do while循环中的break和continue
#include <stdio.h> int main() { int i = 1; do { if(5 == i) break; printf("%d ", i); i=i+1; }while(i<=10); return 0; } #include <stdio.h> int main() { int i = 1; do { if(5 == i) continue; printf("%d ", i); i=i+1; }while(i<=10); return 0; }
加break的结果为1 2 3 4
加continue的结果为1 2 3 4 死循环
3. break与continue总结
break应用于:for,while,do,switch
continue应用于:for,while,do
4.练习
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 *=i; } printf("%d", ret); return 0; }
2. 计算 1!+2!+3!+……+10!
#include <stdio.h> //计算 1!+2!+3!+……+10! int main() { int n = 0; scanf("%d", &n); int i = 0; int ret = 1; int sum = 0; for (n = 1;n <= 10; n++) { ret = 1; for (i = 1; i <= n; i++) { ret *= i; } sum += ret; } printf("%d\n", sum); return 0; }
优化一下
#include <stdio.h> //计算 1!+2!+3!+……+10! int main() { int n = 0; scanf("%d", &n); int i = 0; int ret = 1; int sum = 0; for (n = 1;n <= 10; n++) { ret *= n; sum += ret; } printf("%d\n", sum); return 0; }
这样效率会更高,不易产生bug。
3.在一个有序数组中查找具体的某个数字n。(讲解二分查找)
#include <stdio.h> //在一个有序数组中查找具体的某个数字n。(讲解二分查找) int main() { int arr[] = {1,2,3,4,5,6,7,8,9,10}; int n = 7; //n是要查找的数字 int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); //折半查找(二分查找),前提是数组有序 int left = 0; int right = sz - 1; int flag = 0; while (left <= right) { //int mid = (left + right) / 2; //考虑结果相加值过大,会溢出从而导致越界,所以采用另一种方法求平均值 int mid = left + (right - left) / 2; if (arr[mid] < n) { left = mid + 1; } else if (arr[mid] > n) { right = mid - 1; } else { printf("找到了,下标是:%d\n", mid); flag = 1; break; } } if (flag == 0) { printf("找不到\n"); } return 0; }
利用二分查找必须在数组有序的前提下才可以!!!
4. 编写代码,演示多个字符从两端移动,向中间汇聚。
#include <stdio.h> #include <string.h> #include <Windows.h> int main() //编写代码,演示多个字符从两端移动,向中间汇聚。 { char arr1[] = "hello world !!!"; 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"); left++; right--; } printf("%s\n", arr2); return 0; }
5. 编写代码实现,模拟用户登录情景,并且只能登录三次。
注意:只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。
#include <stdio.h> int main() //编写代码实现,模拟用户登录情景,并且只能登录三次。 { //假设密码为123456. char password[20] = { 0 }; int i = 0; int flag = 0; for ( i = 0; i < 3; i++) { printf("请输入密码:\n"); scanf("%s", password); //判断 if (strcmp(password,"123456") == 0) //千万不可以用password == "123456",两个常量不可以用等号! { //变量要取地址&,数组名相当于地址,所以不需要取地址,例:password,arr等。 flag = 1; printf("密码正确\n"); break; } else { printf("密码错误\n"); } } if (flag == 0) printf("三次密码均输入错误,退出程序\n"); return 0; }