循环控制语句

循环语句

文章目录

  • 循环语句
  • **一、goto循环**
    • **1.1 goto的基本使用格式**
    • **1.2 执行逻辑**
    • **1.3 使用goto实现循环**
  • 二、 while循环
    • **2.1 格式**
    • **2.2 执行逻辑**
  • **三、 do..while循环**
    • **3.1 格式**
    • **3.2 执行逻辑**
  • **四、 for循环**
    • **4.1 格式**
    • **4.2 执行逻辑**
    • **4.3关于for循环的三个表达式**
  • **五、 死循环**
  • **六、辅助控制关键字**
    • **6.1 break**
    • **6.2 cuntinue**
    • **6.3 return**
  • **七、控制语句综合练习**
    • 1.输出 [1,100] 范围内所有的偶数
    • 2.输入一个数,输出这个数的所有因子。
    • 3.输入一个数,判断这个数是不是完数。
    • 4.输出 [1,999] 范围内所有的完数

一、goto循环

goto原本是用于实现代码的跳转的,注意:只能在同一个函数中跳转。

goto对代码的逻辑性和易读性是有一定的影响的,所以要慎用goto

1.1 goto的基本使用格式

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

1.2 执行逻辑

先执行代码块1,然后遇到goto语句,直接跳转到对应的标签继续向下执行代码块3

代码块2 就被跳过了 不执行。

上面代码中的 NEXT叫做标签,名字可以随便起 符合命名规范即可,一般都是大写。

代码中可以定义多个标签,goto到哪个标签,就到哪个标签后面开始执行。

例:

#include int main(int argc, const char *argv[])
{printf("11111111\n");goto NEXT; //直接跳转到 NEXT 继续向下执行printf("22222222\n");//被跳过printf("33333333\n");//被跳过printf("44444444\n");//被跳过
NEXT:printf("55555555\n");return 0;
}

1.3 使用goto实现循环

我们平时使用的循环一般都是有结束条件的

否则就是死循环了

例:使用goto输出 5行 hello world

#include int main(int argc, const char *argv[])
{printf("----start----\n");int count = 0; //用来计数的
LOOP:printf("hello world\n");count++;   //count = count + 1;if(count<5){   //这个条件不满足时 就不再goto了goto LOOP;//如果无条件的goto 就是死循环了}printf("----end----\n");return 0;
}

练习:

使用goto实现计算 1+2+3+…+100 求和。

实现思路:
#if 0
int sum = 0;
sum += 1;
sum += 2;
...
sum += 100;
#endif#if 0
int sum = 0;
int i = 1; //用于控制循环次数的变量 称之为循环变量 i j k 
sum += i;
i++;
sum += i;
i++;
....
sum += i;
i++;
#endifint sum = 0;
int i = 1;
LOOP:
sum+=i;
i++;
if(i<=0){goto LOOP;
}

答案:

#include 
int main(){int sum = 0;//用来保存求和的结果 此处初始化成0 是必须的int i = 0;//用来控制循环的次数 以及每次加的值
LOOP:sum += i;i++;if(i<=100){goto LOOP;}printf("sum = %d\n", sum);return 0;
}

二、 while循环

2.1 格式

while(表达式){代码块;
}

2.2 执行逻辑

先执行表达式,如果表达式为真,则执行代码块

然后继续执行表达式,如果还为真,就再执行代码块

直到表达式为假 循环立即结束 继续执行循环后面的代码

while中表达式的用法和 if…else 的表达式用法一样。

注意:代码块中一般都有用于表达式结果的语句 来控制循环的次数

例:使用while循环实现 打印 5行 hello world

#include int main(int argc, const char *argv[])
{printf("----start----\n");int i = 0; //循环变量命名 一般都是  i j kwhile(i < 5){printf("hello world\n");i++;}printf("----end----\n");return 0;
}

练习:

1.使用while循环,计算 1~100 求和。

#include 
int main(){int sum = 0;int i = 1;while(i <= 100){sum += i;i++;}printf("sum = %d\n", sum);return 0;
}

2.猴子吃桃问题

猴子第一天摘了若干个桃,当即就吃掉了一半数量的桃

没吃过瘾,又多吃了一个;

第二天,在剩下的桃中,又吃了一般数量

没吃过瘾,又多吃了一个;

。。。

依次类推,以后的每天都吃一半数量再多一个

到10天再想吃桃的时候,发现,只剩下一个了。

问:猴子第一天摘了多少个桃。

要求使用while循环实现。

/*
9
第10天 1个
第9天  4个      (1+1)*2
第8天  10个     (4+1)*2
..
*/#include 
int main(){int count = 1;int i = 0;while(i < 9){count = (count+1)*2;i++;}//当循环结束的时候 count记录的就是 第一天的桃子的数量printf("第一天有 %d 个桃\n", count);return 0;
}

思考:

如何实现:把每天剩余的桃子数量都输出出来?

#include 
int main(){int count = 1;int i = 0;while(i < 9){printf("第 %d 天有 %d 个桃\n", 10-i, count);count = (count+1)*2;i++;}printf("第 %d 天有 %d 个桃\n", 10-i, count);return 0;
}

3.思考 下面的代码会输出什么?

//没有代码块的while循环可以将{}用分号 ; 替换
//while(表达式);int x = 100;
while(x--){}
//while(x--);  //这种写法和上面那行是一样的
printf("%d\n", x); // -1int x = 100;
while(--x);
printf("%d\n", x); // 0

三、 do…while循环

3.1 格式

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

3.2 执行逻辑

先执行代码块,然后执行表达式,如果表达式为真,

则继续执行代码块,直到表达式为假,循环立即结束。

do…while 和 while 的区别:

while 先判断 后执行

do…while 先执行 后判断

do…while的代码块,不管表达式是否为真,都至少执行一次。

例:使用 do…while 实现 1~100 求和

#include int main(int argc, const char *argv[])
{int sum = 0;int i = 1;do{sum+=i;i++;}while(i<=100);printf("sum = %d\n", sum);return 0;
}

编码:输入一个日期,输出这个日期是这一年的第几天(考虑平年闰年问题)。

如:2022年3月1日 则输出 2022年3月1日是2022年的第60天

2020年3月1日 则输出 2022年3月1日是2022年的第61天

#include //输入一个日期,输出当前日期是这一年的第几天#define MONTH_1 31
#define MONTH_2 28
#define MONTH_3 31
#define MONTH_4 30
#define MONTH_5 31
#define MONTH_6 30
#define MONTH_7 31
#define MONTH_8 31
#define MONTH_9 30
#define MONTH_10 31
#define MONTH_11 30
#define MONTH_12 31int main()
{int year, month, day;printf("请输入要查询的日期(年/月/日):");scanf("%d/%d/%d", &year, &month, &day);//闰年的增量  也是闰年的标志位  0  平年  1 闰年int leap = 0;//printf("%d/%d/%d\n", year, month, day);//判断输入的日期是否有误//判断年是闰年还是平年if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)){leap = 1;}//判断月份输入的是否有误if(month < 1 || month > 12){printf("您输入的月份有误,请重新输入\n");//在main函数里面使用return,结束整个程序return -1;}//判断日是否有误//月份:1 3 5 7 8 10 12 最多31天if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){if(day < 1 || day > 31){printf("您输入的日期有误,请重新输入\n");return -1;}}//月份:4 6 9 11 最多30天if(month==4 || month==6 || month==9 || month==11){if(day < 1 || day > 30){printf("您输入的日期有误,请重新输入\n");return -1;}}//月份:2 闰年最多29天 平年最多28天if(month == 2){if(leap == 1){ //闰年if(day < 1 || day > 29){printf("您输入的日期有误,请重新输入\n");return -1;} }else if(leap == 0){ //平年if(day < 1 || day > 28){printf("您输入的日期有误,请重新输入\n");return -1;}}}int days = 0;switch(month){case 12:days += MONTH_11;case 11:days += MONTH_10;case 10:days += MONTH_9;case 9:days += MONTH_8;case 8:days += MONTH_7;case 7:days += MONTH_6;case 6:days += MONTH_5;case 5:days += MONTH_4;case 4:days += MONTH_3;case 3:days += MONTH_2 + leap;case 2:days += MONTH_1;case 1:days += day;break;}printf("%d年%d月%d日%d年的第%d天\n", year, month, day, year, days);return 0;
}

四、 for循环

4.1 格式

for(表达式1;表达式2;表达式3){代码块;
}

4.2 执行逻辑

先执行表达式1,然后执行表达式2,如果表达式2为真,则执行代码块,然后执行表达式3

然后再执行表达式2,如果还为真,则继续执行代码块和表达式3,

直到表达式2为假,循环立即结束。

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

表达式1:只执行一次,一般是用来给循环变量赋初值的

----C99的编译器允许for循环的第一个表达式中定义变量,

但是注意,这种方式定义的变量只能在循环内部使用

表达式2:和if或者while的表达式一样,

一般是有关系运算符和逻辑运算符组成用来判断真假的

表达式3:一般是用来改变循环变量的值从而控制循环结束的

注意:

1.这三个表达式如果不需要其中某几个,可以不写,但是两个分号 ;; 必须写

2.表达式1和表达式3,每个都可以不只是一句,如果是多句,用逗号分隔

例:

#include int main(int argc, const char *argv[])
{printf("----start----\n");#if 0for(int i = 0; i < 5; i++){//在表达式1中定义的 i 只能在循环内部使用printf("hello world\n");}//printf("i = %d\n", i);//i不能再使用了
#endif#if 1int i = 0;for(i = 0; i < 5; i++){printf("hello world\n");}printf("i = %d\n", i); // 5  i可以使用
#endifprintf("----end----\n");return 0;
}

练习:

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

#include int main(){int sum = 0;int i = 0;for(i = 1; i <= 100; i++){sum += i;}printf("sum = %d\n", sum);return 0;
}

把 goto 、while 、do…while 、for 实现的1~100求和的代码 拿出来 自己对比一下。

int sum = 0;
int i = 0;
LOOP:
sum += i;
i++;
if(i <= 100){goto LOOP;
}int sum = 0;
int i = 0;
while(i <= 100){sum += i;i++;
}int sum = 0;
int i = 0;
do{sum += i;i++;
}while(i <= 100);int sum = 0;
int i = 0;
for(i = 0; i <= 100; i++){sum += i;
}

2.在终端输入一个数 [100,999]范围内的,判断这个是是不是水仙花数

水仙花数:个位个位个位 + 十位十位十位 + 百位百位百位 == 自身

如:153 <==> 333 + 555 + 111 == 27 +125 + 1 == 153

#include int main(int argc, const char *argv[])
{int num = 0;scanf("%d", &num);int g = num % 10;int s = num % 100 / 10;int b = num / 100;if(g*g*g + s*s*s + b*b*b == num){printf("%d 是水仙花数\n", num);}return 0;
}

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

#include int main(int argc, const char *argv[])
{int num = 0;int g = 0;int s = 0;int b = 0;for(num = 100; num < 1000; num++){//循环里面尽量不要定义变量//因为频繁的分配和回收内存空间会产生额外的时间开销//int g = num % 10;//int s = num % 100 / 10;//int b = num / 100;g = num % 10;s = num % 100 / 10;b = num / 100;if(g*g*g + s*s*s + b*b*b == num){printf("%d 是水仙花数\n", num);}}return 0;
}

C语言中计算幂的函数和开平方的函数–了解即可

使用时需要加头文件 #include

编译时需要链接数学库 需要加编译选项 -lm

double pow(double x, double y); //pow 计算x的y次方

double sqrt(double x); //sqrt 计算x的非负平方根

#include 
#include int main(int argc, const char *argv[])
{int a = 2;int b = 3;double ret1 = pow(a, b);printf("ret1 = %lf\n", ret1); //8.000000printf("%lf\n", pow(3, 4));	//81.000000int x = 16;printf("%lf\n", sqrt(x)); //4.000000return 0;
}

4.使用循环配合着 putchar 函数,打印下面的图案。

在这里插入图片描述

#include int main(int argc, const char *argv[])
{int i = 0;int j = 0;char value = 'F';//外面循环控制行数for(i = 0; i < 6; i++){//循环体 就是一行要输出的内容//打印没一行的下划线的for(j = 0; j < i; j++){putchar('_');}//打印字母的value = 'F'; //此处重置 value 的值为 'F' 是必要的for(j = 0; j < 6-i; j++){putchar(value--);}putchar(10);//换行}return 0;
}

五、 死循环

所谓的死循环就是程序一直在循环里面执行,无限循环。

while(1){  //常用的写法//循环体
}for(;;){   //注意所有表达式都可以不写 但是 两个 ;; 必须要写//循环体
}//如果自己写代码 不小心死循环了 按 ctrl +  c 退出

例:

#include 
#include int main(int argc, const char *argv[])
{printf("----start----\n");#if 0while(1){printf("hello world\n");sleep(1);  //休眠1秒}
#endiffor(;;){ //表达式可以不写 两个分号必须写printf("hello world\n");sleep(1);  //休眠1秒}printf("----end----\n");//永远执行不到return 0;
}

六、辅助控制关键字

6.1 break

break可以用在switch…case语句中,表示执行完某一个分支就立即结束整个switch…case语句

break也可以用在循环中,表示立即结束本层的循环。

6.2 cuntinue

continue 只能用于循环中,表示立即结束本层的本次循环。

6.3 return

return 如果用在函数中,使用来返回函数运行的结果的;

return 如果用在main函数中,表示理解结束整个程序。

例:

#include int main(int argc, const char *argv[])
{int i = 0;int j = 0;for(i = 1; i <=5; i++){for(j = 1; j <= 5; j++){if(3 == j){//break;//continue;return 0;}printf("%d--%d\n", i, j);}}return 0;
}

七、控制语句综合练习

1.输出 [1,100] 范围内所有的偶数

#include int main(int argc, const char *argv[])
{int num = 0;for(num = 1; num <= 100; num++){if(0 == num%2){printf("%d 是偶数\n", num);}}return 0;
}

2.输入一个数,输出这个数的所有因子。

例如:输入 12 则输出 1 2 3 4 6 12

#include int main(int argc, const char *argv[])
{int num = 0;scanf("%d", &num);int i = 0;//遍历 1~numfor(i = 1; i <= num; i++){if(num%i == 0){printf("%d\n", i);}}return 0;
}

3.输入一个数,判断这个数是不是完数。

完数:除了自身之外的所有因子和还等于自身。

如: 6 == 1 + 2 + 3 说明 6就是完数

#include int main(int argc, const char *argv[])
{int n = 0;scanf("%d", &n);int sum = 0;int i = 1;//计算因子和for(i = 1; i < n; i++){if(n%i == 0){sum += i;}}//当上面的循环结束的时候//sum中保存的就是 n的所有因子和(不包括n)if(sum == n){printf("%d 是完数\n", n);}return 0;
}

4.输出 [1,999] 范围内所有的完数

#include int main(int argc, const char *argv[])
{int n = 0;int sum = 0;int i = 0;for(n = 1; n < 1000; n++){sum = 0; //注意:此处的 sum重新置0是必要的//因为sum中还保存着上一个数的因子和呢//计算n的因子和for(i = 1; i < n; i++){if(n%i == 0){sum += i;}}//当上面的循环结束的时候//sum中保存的就是 n的所有因子和(不包括n)if(sum == n){printf("%d 是完数\n", n);}}return 0;
}

5.输出 [2, 99] 范围内所有的质数

质数:因子只有自身和1的数

解决方式1:通过标志位处理

#include int main(int argc, const char *argv[])
{int num = 0;int flag = 0;	//质数的标识位 0 是质数  1 不是质数int i = 0;for(num = 2; num < 100; num++){flag = 0;  //如果使用的是标识位来判断 记得每次 重新置0for(i = 2; i < num; i++){if(num%i == 0){flag = 1;break;}}if(flag == 0){printf("%d 是质数\n", num);	}}return 0;
}

解决方式2:通过判断循环结束的条件来处理

#include int main(int argc, const char *argv[])
{int num = 0;int i = 0;for(num = 2; num < 100; num++){for(i = 2; i < num; i++){if(num%i == 0){break;}}//上面的循化有两种结束情况//第一种:由于表达式2为加导致的正常结束//第二中:由于break导致的提前结束if(i == num){printf("%d 是质数\n", num);	}}return 0;
}

n的所有因子和(不包括n)
if(sum == n){
printf(“%d 是完数\n”, n);
}
}

return 0;

}


5.输出 [2, 99] 范围内所有的质数质数:因子只有自身和1的数解决方式1:通过标志位处理

#include

int main(int argc, const char *argv[])
{
int num = 0;
int flag = 0; //质数的标识位 0 是质数 1 不是质数
int i = 0;
for(num = 2; num < 100; num++){
flag = 0; //如果使用的是标识位来判断 记得每次 重新置0
for(i = 2; i < num; i++){
if(num%i == 0){
flag = 1;
break;
}
}

	if(flag == 0){printf("%d 是质数\n", num);	}
}
return 0;

}


解决方式2:通过判断循环结束的条件来处理​            

#include

int main(int argc, const char *argv[])
{
int num = 0;
int i = 0;
for(num = 2; num < 100; num++){
for(i = 2; i < num; i++){
if(num%i == 0){
break;
}
}
//上面的循化有两种结束情况
//第一种:由于表达式2为加导致的正常结束
//第二中:由于break导致的提前结束
if(i == num){
printf(“%d 是质数\n”, num);
}
}
return 0;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部