C语言—循环控制语句

1 使用go to语句实现循环

goto本身是用来实现代码跳转的,注意只能在同一个函数中进行跳转。
注意:goto对代码的逻辑性和易读性有一定的影响,使用goto时要谨慎一些。

1.1 格式

1 代码块1;
2 goto NEXT;
3 代码块2;
4 NEXT: //标签
5 代码块3;

1.2 执行逻辑

先执行代码块1,然后遇到了goto语句,直接跳转到对应的标签向下执行代码块3。代码块2被跳过了,不会被执行。上面的NEXT叫做标签名,也是一个标识符,要符合标识符命名规范。
一般情况下,标签名都采用大写字母。
例:

1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 printf("111111\n");
6 goto NEXT;
7 printf("222222\n");//不执行
8 printf("222222\n");//不执行
9 printf("222222\n");//不执行
10 NEXT:
11 printf("333333\n");
12
13 return 0;
14 }
//上面的代码 输出完1111之后直接输出3333 中间的部分都被跳过了 不执行

1.3 使用goto实现循环
我们一般情况下使用的循环都是有结束条件的
如果没有结束条件,就变成了 死循环
例:使用goto实现输出5行 “hello world”

1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 printf("‐‐‐‐start‐‐‐‐\n");
6 int count = 0;//用来记录次数
7 LOOP:
8 printf("hello world\n");
9 count++;
10 if(count < 5){ //count<5 为假时 就是循环结束的条件
11 goto LOOP;
12 }
13 printf("‐‐‐‐end‐‐‐‐\n");
14
15 return 0;
16 }

练习:
使用goto实现 1~100求和 计算 1+2+3+…+99+100 的结果

1 思路:
2 /*
3 int sum = 0;//用来保存求和的结果
4 sum = sum + 1;
5 sum = sum + 2;
6 ...
7 sum = sum + 100;
8 */
9
10 /*
11 int sum = 0;
12 int i = 1;
13 sum = sum + i;
14 i++;
15 sum = sum + i;
16 i++;
17 ...
18 sum = sum + i;
19 i++;
20 */
21
22 //答案
23 #include <stdio.h>
24 int main(){
25 int sum = 0;
26 int i = 1;//用来控制循环次数的变量 我们称之为 循环变量
27 //命名时使用 i j k
28 LOOP:
29 sum = sum + i;
30 i++;
31 if(i <= 100){
32 goto LOOP;
33 }
34 printf("sum = %d\n", sum);//5050
35 return 0;
36 }

2 while循环

2.1 格式

1 while(表达式){
2 代码块;//一般循环中的代码块 我们也叫作循环体 就是要循环执行的代码
3 }

2.2 执行逻辑

先执行表达式,如果表达式为真,则执行代码块
然后再执行表达式,如果还为真,就继续执行代码块
直到表达式为假,循环立即结束
代码块中一般都会存在能改变表达式结果从而控制循环结束的语句
如果没有,就又是死循环了
表达式的用法和if…else语句的表达式的用法一样。
例:
使用while循环输出 5行 hello world

1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 printf("‐‐‐‐start‐‐‐‐\n");
6 int i = 0;
7 while(i < 5){
8 printf("hello world\n");
9 i++; //这个i++ 就是能改变表达式结果的语句
10 }
11 printf("‐‐‐‐end‐‐‐‐\n");//没有被循环包住的代码不受循环的影响
12 return 0;
13 }

2.3 while循环练习

1.使用while实现 1~100 求和。

1 #include <stdio.h>
2 int main(){
3 int sum = 0;
4 int i = 1;
5 while(i <= 100){
6 sum += i;
7 i++;
8 }
9 printf("sum = %d\n", sum);//5050
10 return 0;
11 }

2.猴子吃桃问题
猴子第一天摘了若干个桃
当即就吃了一半数量的桃,没吃过瘾,又多吃了一个
第二天将剩下的桃又吃了一半数量,没吃过瘾,又多吃了一个
以后每天都按照这种方式吃桃
直到第十天再想吃桃的时候,发现,只剩下一个桃了。
问:猴子第一天摘了多少个桃。
要求:使用while循环解决

1 思路:
210天 有1个桃
39天 有4个桃 (1+1)*2
48天 有10个桃 (4+1)*2
5 ...
6
7 #include <stdio.h>
8 int main(){
9 int sum = 1;
10 int i = 0;
11 while(i<9){
12 sum = (sum+1) * 2;
13 i++;
14 }
15 //上面的循环结束之后 sum保存的就是第一天桃子的数量
16 printf("sum = %d\n", sum);//
17 return 0;
18 }

再试一试,把每天吃桃之前桃子的数量都打印出来:
第10天有1个桃
第9天有4个桃

第1天有1534个桃

1 #include <stdio.h>
2 int main(){
3 int sum = 1;
4 int i = 0;
5 while(i<9){
6 printf("第%d天有%d个桃\n", 10‐i, sum);
7 sum = (sum+1) * 2;
8 i++;
9 }
10 printf("第%d天有%d个桃\n", 10‐i, sum);
11
12 return 0;
13 }

在这里插入图片描述

3 do…while循环

3.1 格式

1 do{
2 代码块;
3 }while(表达式); //别忘了此处有一个 分号

3.2 执行逻辑

先执行代码块,然后执行表达式,如果表达式为真,
则继续执行代码块,直到表达式为假,循环立即结束。
do…while 和 while的区别
while:先判断,后执行
do…while:先执行,再判断
不管表达式为真还是为假,do…while的代码块至少执行一次。
例如:

1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 printf("‐‐‐‐start‐‐‐‐\n");
6 int sum = 0;
7 int i = 0;
8 do{
9 printf("hello world\n");
10 i++;
11 }while(i<5);//即使此处的表达式为假 也会先输出一行hello world
12 printf("‐‐‐‐end‐‐‐‐\n");
13
14 return 0;
15 }

4 for循环

4.1 格式

1 for(表达式1; 表达式2; 表达式3){ //表达式之间用 ; 分隔
2 循环体;
3 }

4.2 执行逻辑

先执行表达式1,然后执行表达式2,如果表达式2为真,则执行循环体.然后执行表达式3,然后再执行表达式2,如果还为真,则继续执行循环体和表达式3。直到表达式2为假,循环立即结束。

4.3 关于for循环的三个表达式

表达式1:只执行一次,一般是用来给循环变量赋初值的
----C99标准的编译器,允许在for循环的表达式中定义变量
但是注意,这种定义的变量 只能在循环内部访问
表达式2:和前面讲的while循环的表达式一样,一般是用来判断真假的
表达式3:一般是用来改变循环变量的值从而确定循环结束条件的
注意:这三个表达式,如果哪个不需要,都可以不写,但是 ;; 必须要写
例:

1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 printf("‐‐‐‐start‐‐‐‐\n");
6 #if 0
7 for(int i = 0; i < 5; i++){
8 printf("hello world\n");
9 printf("i = %d\n", i);
10 }
11 //printf("i = %d\n", i);//错误的 在for循环的表达式1中定义的变量
12 //出了循环就不能访问了
13 #endif
14 #if 1
15 int i = 0;
16 for(i = 0; i < 5; i++){
17 printf("hello world\n");
18 printf("i = %d\n", i);
19 }
20 printf("i = %d\n", i);//正确的 在循环外面定义的变量 不受循环作用域
的影响
21 #endif
22 printf("‐‐‐‐end‐‐‐‐\n");
23
24 return 0;
25 }

4.4 for循环练习

1.使用for循环实现 1~100 求和。

1 #include <stdio.h>
2 int main(){
3 int sum = 0;
4 int i = 0;
5 for(i = 1; i <= 100; i++){
6 sum+=i;
7 }
8 printf("sum = %d\n", sum);//5050
9 return 0;
10 }

2.输入一个三位数 [100,999],判断这个数是否是 水仙花数 并输出是不是。
水仙花数:三位数的 个个+十十+百百==自身
如:153 == 111 + 555 + 333 == 1+125+27 == 153

1 #include <stdio.h>
2 int main(){
3 int num = 0;
4 printf("请输入一个三位数[100, 999]:");
5 scanf("%d", &num);
6
7 int g = num % 10;
8 int s = num % 100 / 10;
9 int b = num / 100;
10 if(g*g*g + s*s*s + b*b*b ==  num){
11 printf("是\n");
12 }else{
13 printf("不是\n");
14 }
15 return 0;
16 }

3.输出 [100, 999] 范围内所有的水仙花数,及水仙花数的个数。

1 #include <stdio.h>
2 int main(){
3 int num = 0;
4 int count = 0; //记录水仙花数的个数
5 int g = 0;
6 int s = 0;
7 int b = 0;
8 for(num = 100; num < 1000; num++){
9 //最好不要在循环里面定义变量
10 //因为分配内存空间也会有时间上的开销
11 //int g = num % 10;
12 //int s = num % 100 / 10;
13 //int b = num / 100;
14 g = num % 10;
15 s = num % 100 / 10;
16 b = num / 100;
17 if(g*g*g + s*s*s + b*b*b == num){
18 printf("%d是水仙花数\n", num);
19 count++;
20 }
21 }
22 printf("共有 %d 个水仙花数\n", count);
23 return 0;
24 }

C语言中处理幂运算和开平方运算的函数 ----了解即可
编译时,需要加编译选项 -lm
#include <math.h>
double pow(double x, double y);
功能:计算x的y次幂
返回值:计算的结果
#include <math.h>
double sqrt(double x);
功能:计算x的非负平方根
返回值:计算的结果
例:

1 #include <stdio.h>
2 #include <math.h>
3
4 int main(int argc, const char *argv[])
5 {
6 int a = 2;
7 int b = 3;
8 double ret1 = pow(a, b);
9 printf("ret1 = %lf\n", ret1);//8.000000
10 ret1 = pow(3, 2);
11 printf("ret1 = %lf\n", ret1);//9.000000
12
13 int c = 16;
14 double ret2 = sqrt(c);
15 printf("ret2 = %lf\n", ret2);//4.000000
16 ret2 = sqrt(25);
17 printf("ret2 = %lf\n", ret2);//5.000000
18
19 return 0;
20 }

5 死循环

死循环并不是没有用,一般服务器程序中都会涉及到死循环。
死循环的写法:
while(1){ ----常用的写法
循环体;
}
for(;;){ //3个表达式都可以不写 但是 两个分号必须写
循环体;
}
如果不想用死循环时,不小心写出了死循环的代码,可以在终端按 ctrl c 结束程序。
例:

1 #include <stdio.h>
2 #include <unistd.h>
3
4 int main(int argc, const char *argv[])
5 {
6 #if 0
7 while(1){
8 printf("hello world\n");
9 sleep(1);//程序休眠1秒
10 }
11 #endif
12
13 for(;;){
14 printf("hello world\n");
15 sleep(1);//程序休眠1秒
16 }
17
18 return 0;
19 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值