C语言------分支和循环(三)
目录
1.for循环
for循环语法
for循环中的break与continue和while循环中的作用一样的;
1.break
2.continue
关于for循环的一些变种
关于for循环这里有一道曾今的笔试题(看看能否做对):
2.do...while循环
do..while 循环语法
do ...while循环中的break和continue
1.break:
2.continue
一些循环练习:
goto语句:
关机代码循环实现(goto):
前言
前面两期我们已经介绍了分支( if、switch ) 、while循环以及 gechar/putchar 这两个函数,这一期我们来介绍一下for循环、do..while循环、goto语句以及练习几个栗子!
1.for循环
for循环语法
for (初始化; 循环条件; 循环变量的迭代)
{
循环语句;
}
注意的是:这里for里的每一个表达式都是用 ; 号隔开的!
OK,举个栗子(打印1---10):
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d\t", i);
}
return 0;
}
运行结果以及代码解释:
这里我们会发现,在for循环中也有初始化、条件判断、调整三步;那么他和while循环有什么区别呢?我们来对比一下:
我们可以发现,他们由于风格原因导致形式大大不同,while循环三个部分偏离的较远,有时候让人看不清楚调整这一步!而for循环就不同了,它的三步在同一行,让人一眼就能看清楚!因此在很多时候for循环更胜一筹!
break和continue在for循环中的使用
for循环中的break与continue和while循环中的作用一样的;
让我们来看几个代码:
1.break
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}
printf("%d\t", i);
}
return 0;
}
运行结果:
2.continue
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
continue;
}
printf("%d\t", i);
}
return 0;
}
运行结果:
关于for循环的一些变种
1.思考线面代码会打印多少个hehe?
#include<stdio.h>
int main()
{
for (; ;)
{
printf("hehe\n");
}
return 0;
}
运行结果以及解释:
注意:for循环中初始化、条件判断、调整这三步都是能省略的,但建议一般不要省略!否则可能会带来不必要的麻烦!
请看下面的两段代码,思考能打印多少个hehe?
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
int c = 1;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
printf("%d hehe\n",c);
c++;
}
}
return 0;
}
运行结果:
请继续看下面的两段代码,思考能打印多少个hehe?
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
int c = 1;//计数器
for (; i < 10; i++)
{
for (; j < 10; j++)
{
printf("%d hehe\n",c);
c++;
}
}
return 0;
}
运行结果以及代码解释:
注意:上面两段代码就差一个初始化,打印的结果却很不同!所以还是建议一般不要轻易的省略这三步(初始化、条件判断、调整)。
ok,再来看一个for循环的特殊情况:
#include<stdio.h>
int main()
{
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
运行结果以及代码演示:
关于for循环这里有一道曾今的笔试题(看看能否做对):
#include<stdio.h>
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
{
k++;
}
return 0;
}
请问上述代码循环了几次?
答案是 0 次,因为在条件判断的时候是 k= 0 这里注意是直接赋值为0,所以一开始 就是假的(C语言中0 表示真,非0表示假),所以循环压根就没进去!
2.do...while循环
do..while 循环语法
do{
循环语句;xu
} while(循环判断表达式);
注意:do ...while循环的特点是无论什么场景都先执行一次即:先执行再判断!
OK,举个例子(打印1--10):
#include<stdio.h>
int main()
{
int i = 1;
do {
printf("%d\t", i);
i++;
} while (i <= 10);
return 0;
}
运行结果和代码解释:
do ...while循环中的break和continue
1.break:
#include<stdio.h>
int main()
{
int i = 1;
do {
if (i == 5)
{
break;
}
printf("%d\t", i);
i++;
} while (i <= 10);
return 0;
}
代码运行结果:
2.continue
#include<stdio.h>
int main()
{
int i = 1;
do {
if (i == 5)
{
continue;
}
printf("%d\t", i);
i++;
} while (i <= 10);
return 0;
}
运行结果和代码解释:
一些循环练习:
1.计算n的阶乘
#include<stdio.h>
int main()
{
int n = 0;
int i = 0;
int ret = 1;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
printf("%d ", ret);
return 0;
运行结果:
2.计算1!+2!+...+n!
int main()
{
int n = 0;
int ret = 1;
int i = 0;
int sum = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
ret = 1;
for (int j = 1; j <= i; j++)
{
ret *= j;
}
sum += ret;
}
printf("%d ", sum);
return 0;
}
运行结果及代码解释:
上面这种方法如果不注意ret = 1的话就会错!下面这种方法也可以:
3.在一个有序的数组中查找具体的某个数(二分查找)
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
scanf("%d", &k);
int left = 0;
int mid = 0;
int right = sizeof(arr) / sizeof(arr[0]);
while (left <= right)
{
mid = (left + right) / 2;
if (k > arr[mid])
{
left = mid + 1;
}
else if (k < arr[mid])
{
right = mid - 1;
}
else
{
break;
}
}
if (left <= right)
{
printf("找到了,下标是 %d ", mid);
}
else
{
printf("没找到!\n");
}
return 0;
}
代码解释和运行结果:
goto语句:
C语言中提供了可以随意跳跃的goto语句和标记跳转的记号;从理论上讲goto语句是没有必要的,能用goto的一定能用循环实现的!但在某种场合下goto 还是有他自身优势的!例如多重循环结束的时候如果用break要多个但是用goto的话就一次能结束!
关于goto栗子(关机代码goto实现):
int main()
{
char arr[20] = { 0 };
system("shutdown -s -t 60");
flag:
printf("您的电脑讲在1分钟后关机,如果输入:我是猪则取消关机");
scanf("%s", arr);
if (0 == strcmp(arr, "我是猪"))
{
system("shutdown -a");
}
else
{
goto flag;
}
return 0;
}
关机代码循环实现(goto):
int main()
{
char arr[20] = { 0 };
system("shutdown -s -t 60");
while (1)
{
printf("您的电脑讲在1分钟后关机,如果输入:我是猪则取消关机");
scanf("%s", arr);
if (0 == strcmp(arr, "我是猪"))
{
system("shutdown -a");
break;
}
}
return 0;
}
ok!好兄弟,下期再见!
你的小10: 大佬,互关!
战斧: 内容很具体,结构条理也挺清晰,读了以后感觉学到了不少,谢谢博主大佬了
战斧: 内容很具体,结构条理也挺清晰,读了以后感觉学到了不少,谢谢博主大佬了
普通网友: 优质好文,博主的文章细节很到位,兼顾实用性和可操作性,期待博主持续带来更多好文【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】
战斧: 看了很久,发现写的真的很好 很难得的一篇博客 相信再过一段时间回看会有更新的理解