这是更新补发的第6天的课程,内容是循环语句。
循环语句总共有三种:
- for循环
- while循环
- do-while循环
第5天其实已经讲了一些for循环,今天再复习一下。
一、for循环
三个循环语句中我特别喜欢for循环,因为它很简洁。
我们先来看一个例子:
例1:编程输出100行:你好,C语言!
程序如下:
for循环的语法格式如下:
注意:当循环体只有一条语句时,循环体前后的大括号{ }可以去掉。
所以例1也可以写成:
循环体printf("你好,C语言!\n"); 前面的 { 和后面的 } 去掉了。
再看一个例子:
例2:编程输出从1到100的整数,每行输出1个。
程序如下:
例2也可以写成:
知道{ }的作用嗎?
if (條件) 語句;
if (條件) 語句1;else 語句2;
凡是語法中出現一條語句的地方,想要放多條語句,就用{ }。
这段话很简洁描述了大括号的作用,是头条友友ScholarMartin在我的评论区留言的,我原封不动放上来,非常感谢@ScholarMartin。
再次强调:当循环体只有一条语句时,循环体前后的大括号{ }可以去掉。
个人建议保留大括号{ },不要去掉。
例3:编程输入10个整数,求平均值。
注意输出是用printf( )函数,输入是scanf( )函数。
程序如下:
运行时输入10个整数,就可以得到平均值。
注意输入的10个整数,以回车间隔(就是输入一个整数就回车一次),或者以空格隔开(输入的10个整数之间用空格间隔,输入完10个数后回车),都行。
比如我输入1、2、3、4、5、6、7、8、9、10这10个整数,每输入1个数就回车一次,运行结果如下:
如果运行时输入10个整数,还是输入1到10,数字之间以空格隔开,输入完10个数以后回车,得到平均值。运行结果如下:
前面1到10是输入的10个整数,最后得到平均值是5.5。
注意之前说过,%f输出的实数默认保留6位小数,那么我只想保留2位小数怎么办呢?把输出语句中%f改成%.2f,就是%和f之间加上.2,注意2前面的小数点不要漏了,表示保留2位小数。
例4:编程输入10个整数,求平均值,要求输出的平均值保留2位小数。
运行时输入10个整数,还是输入1到10,数字之间以空格隔开,输入完10个数以后回车,得到平均值。运行结果如下:
还有一个问题,大家看程序中平均值变量ave的数据类型是float型,不是int型,因为平均值是可能有小数的,所以平均值变量的数据类型不是int,而是float型。
另外,求出总和s以后,除以10得到平均值,程序中不是
ave = s / 10 ;
而是
ave = s / 10.0 ;
因为这个除法运算符/, 它左右两边是整数的话,得出来的结果会自动取整(就是自动去掉小数部分),而它左右两边只要有一个为实数,结果才是实数。
比如: 55/10的结果是5, 55/10.0的结果是5.5, 55.0/10的结果也是5.5。
好了,我们再来看看while循环。
二、wile循环
for循环的循环次数是确定的,我一看
就知道循环要执行10次。
因为i一开始赋值为1,只要i小于等于10,就要执行循环体,执行循环体以后再执行i++(就是i增加1),每执行一次循环i加一次1,直到加到大于10才停止循环,所以知道循环次数为10次。
而while循环只看循环条件,循环次数不一定是确定的。
1、while语法格式
注意while括号后面没有分号。
当条件为真时,重复执行循环体,直到条件为假。
2、while执行步骤
首先判断条件是否为真,若为真执行循环体,然后再回头判断条件是否为真,重复这个过程,直到条件为假,再执行后续语句。
注意:如果一开始条件就为假,则循环体一次也不执行,直接执行while后续语句了。
3、实践
例5:编程求1+2+3+…+100的和。
运行结果为5050。
可能你觉得这道题还是用for循环简洁,确实,用哪种循环语句看个人习惯,你可以选用for循环,也可以选用while循环。
for循环可以改成while循环很简单:
for循环语法格式:
改成while循环就是:
前面讲了,一般循环次数确定时用for循环,循环次数不确定时用while循环。
例6:编程输入若干个整数,直到输入0为止,求这些整数的和。
这道题循环次数是不确定的,因为你不知道用户输入多少个数以后才输入0,所以我们用while循环实现。
运行时输入100、-2、90、0,则得出结果为188。
这里先输入一个整数n,才能判断n是否等于0,有些伙伴可能会犯这样的错误:
就是while之前没有输入n,此时n没有值,就无法判断它是否为0,所以这是不对的。
在判断n是否为0之前,n必须先有值。
所以在
之前,一定要有
这道程序还有一个容易错的地方,大家看以下程序有什么问题?
例7:程序功能为输入若干整数,直到输入0为止,求这些整数的和。请问如下程序有什么问题。
看出问题所在了吗?
这个程序,循环体中没有
也就是说,程序只输入了一次整数n,在循环没开始的时候输入的(while之前有一个scanf),
假设一开始输入的整数是10,那么程序是一个死循环,因为n永远值等于10,它没有办法改变,因为循环体里面没有重新输入,n就没有办法变成0,它永远是10,永远无法让条件为假,就是永远没法结束循环。
三、do-wile循环
while循环和for循环一样,都是先判断条件是否为真,如果条件为真就进入循环,直到循环条件为假则结束循环。那么,如果一开始条件就为假,则循环一次都不会被执行。
do-whille循环与前面两种循环不一样,它是先执行循环体,然后判断条件是否为真,如果循环为真则继续执行循环体,否则结束循环。
1、do-while语法格式
注意do后面没有分号,while(条件)后面有一个分号。
先执行循环体,然后判断条件,当条件为真时,重复执行循环体,直到条件为假。
2、do-while执行步骤
先执行循环体,然后判断条件,当条件为真时,重复执行循环体,重复这个过程,直到条件为假,再执行后续语句。
所以不管三七二十一,循环体至少会执行一次。
和for和while不一样,for和while如果一开始条件就为假,则循环体一次也不执行,但是do-while循环体至少会执行一次。
3、实践
例8:编程求1+2+3+…+100的和。
可以看出while改成do-while也很容易:
while的语法格式:
改成do-while语句如下:
例9:编程输入若干整数,直到输入0为止,求这些整数的和,用do-while实现。程序如下:
执行时如果输入100、-2、98和0,运行结果为196。
四、break语句和continue语句
1、break语句
break的功能:中断循环。
语法格式:
break;
break的意思就是中断循环,或者说跳出循环。
例10:下列程序的运行结果是什么?
运行结果只输出1和2:
循环体中,当满足条件( i%3==0 ),执行break; 中断循环,执行循环后续语句即printf(“\n”);
2、continue语句
continue语句功能:跳过循环体中在continue后面的语句,执行下一次循环。
语法格式:
continue;
break的意思是中断循环,而continue是跳过循环体后面的语句,执行下一次循环。
我们把例10中的break改成continue,看看发生了什么?
例11:下列程序的运行结果是什么?
运行结果是输出1 2 4 5 7 8 10,而3、6、9不能被输出:
当满足条件( i%3==0 )时,执行continue; 此时跳过continue;后面的语句printf(“%d ”, i);,执行下次循环,直到循环条件为假,才结束循环,执行后续语句printf(“\n”);
也就是说,当continue被执行时,它后面的语句printf(“%d ”, i);就不能执行了(跳过了),所以3、6、9没有输出。
break语句和continue语句没明白的也不要紧,可以先略过,你只要先懂得for、while和do-while循环就可以了。
另外强调一下,我们知道输入方式有两种状态:
C程序中的符号,只要不是输出信息的(不是在printf()的双引号里面的信息),那么所有的圆括号、尖括号、大括号、逗号、分号、双引号等等所有这些符号,都必须是这个状态下的符号: