for循环
在while循环中打印1-10,代码如下
int main()
{
int i = 1;//初始化
while(i <= 10)//判断部分
{
printf("%d",i);
i++;//调整部分
}
return 0;
}
while循环中的初始化部分与判断部分和调整部分相离太远,而在for循环中语法如下:
语法
for(表达式1;表达式2;表达式3)
{
循环语句;
}
表达式1为初始化部分;表达式2为条件判断部分;表达式3为调整部分
for循环在屏幕上打印1-10
int main()
{
int i=0;
for(i=1;i<=10;i++)
{ //初始化;判断;调整
printf("%d",i);
}
return 0;
}
我们可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。 for循环使用的频率也最高。
for循环中的break
int main()
{
int i=0;
for(i=1;i<=10;i++)
{
if(i==5)
break;
printf("%d",i);//1234
}
return 0;
}
break的作用与while循环一样,也是跳出整个循环。
for循环中的continue
int main()
{
int i=0;
for(i=1;i<=10;i++)
{
if(i==5)
continue;
printf("%d",i);//1234 678910
}
return 0;
}
在i=5时,continue,continue的作用跳过continue下面的语句,所以continue跳过了i=5时的打印,跳过后继续i++,所以有了后面的打印。
对于写for循环的建议
1.不要在调整循环体内修改循环变量的值,防止循环体失去控制
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}
int main()
{
int arr[10]={0};
int i=0;
for(i=0;i<10;i++)
{
printf("%d",arr[i]);
}
//两边都是闭区间
/*for(i=0;i<=9;i++)
{
printf("%d",arr[i]);
}*/
return 0;
}
一些for循环的变种
判断部分的省略 - 判断部分恒为真
int main()
{
for(;;)
{
printf("haha");//陷入死循环
}
return 0;
}
这是判断部分恒为真,所以陷入死循环
下面再看一个代码
int main()
{
int i=0;
int j=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("haha\n");//9个haha
}
}
return 0;
}
上面嵌套循环,当我们将i=0;j=0;初始化部分省略
int main()
{
int i=0;
int j=0;
for(;i<3;i++)
{
for(;j<3;j++)
{
printf("haha\n");//3个haha
}
}
return 0;
}
这里只执行了i=0时的三个haha,当i=1时,此时j=3,j不小于3,进不去循环,以此类推,后面都进不去循环
笔试题
请问循环要循环多少次?
int main()
{
int i=0;
int k=0;
for(i=0,k=0;k=0;i++,k++)
k++;
return 0;
}
答案是0次,注意判断区域是赋值号,判断为假,所以循环进不去。
do……while循环
do
循环语句;
whlie(表达式);
do语句的特点
循环至少执行一次,使用的场景有限,所以不是经常使用。
do while循环打印1-10:
int main()
{
int i=1;
do
{
printf("%d ",i);
i++;
}while(i<=10);
}
do while循环中的break和continue
int main()
{
int i=1;
do
{
if(i==5)
{
break;
}
printf("%d ",i);
i++;
}while(i<=10);
}
打印1 2 3 4,i==5时,break跳出循环
int main()
{
int i=1;
do
{
if(i==5)
{
continue;
}
printf("%d ",i);
i++;
}while(i<=10);
}
continue跳过之后的语句,跳过了i++,所以打印了1 2 3 4 后陷入了死循环
练习
1.计算n的阶乘
//计算n的阶乘
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int temp = 1;
for (int i = 1; i <= n; i++)
{
temp = temp * i;
}
printf("%d", temp);
return 0;
}
2.计算1!+……+10!
方法一:
//计算1!+……+10!
//方法一:
#include<stdio.h>
int main()
{
int n = 0;
int temp = 1;
int sum = 0;
for (n=1;n<=10; n++)
{
temp = 1;//计算n的阶乘之前,把temp置为1
for (int i = 1; i <= n; i++)
{
temp = temp * i;
}
sum = sum + temp;
}
printf("%d", sum);
return 0;
}
方法二:
#include<stdio.h>
int main()
{
int temp = 1;
int sum = 0;
for (int n = 1; n <= 3; n++)
{
temp = temp * n;
//1*1 1*1*2 1*1*2*3//
sum = sum + temp;
}
printf("%d", sum);
return 0;
}
- 折半查找算法
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;//要查找的数字
//在arr这个有序的数组中查找k(7)的值
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left<=right)
{
int mid = (left + right) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标为:%d\n", arr[mid]);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
-
编写代码,演示多个字符从两端移动,向中间汇聚。
#include<stdio.h> #include<windows.h> #include<string.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");//清空屏幕 left++; right--; } return 0; }
-
编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。
#include<stdio.h> #include<string.h> int main() { int i = 0; //假设正确密码"123456" char password[20] = { 0 }; for (i = 0; i < 3; i++) { printf("请输入密码:>"); scanf("%s", password); //if(password=="123456")//err-字符串比较不能使用==,需要使用strcmp if (strcmp(password, "123456") == 0)//比较成功返回0 { printf("登陆成功\n"); } else { printf("密码错误,重新输入!\n"); } } if (i == 3) { printf("三次密码均错误,退出程序\n"); } return 0; }
6.猜数字游戏
//猜数字游戏 //1.自动产生一个1-100之间的随机数 //2.猜数字 // a.猜对了,就恭喜你,游戏结束 // b.你猜错了,会告诉你猜大了,还是猜小了,继续猜,知道猜对 //3.游戏一个一直玩,除非退出游戏 #include<stdio.h> #include<time.h> void menu() { printf("***************************\n"); printf("******** 1.play *********\n"); printf("******** 0.exit *********\n"); printf("***************************\n"); } void game() { //猜数字游戏的实现 //1.生成随机数 //rand函数返回了一个0-32767之间的数字 //一个时间对应一个时间戳 int ret = rand()%100+1;//%100的余数是0-99,然后+1,就是0-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("恭喜你猜对了\n"); break; } } } int main() { 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("选择错误,重新选择"); break; } } while(input); return 0; }