C语言--循环结构
知识内容总结
for循环语句
使用该语句可以实现 C 语句的重复执行,一般形式为:
for ( 表达式1; 表达式2; 表达式3)
{
循环体语句;
}
for语句的执行流程是:先计算表达式1,再判断表达式2,若为“真”,则执行循环体语句,并接着计算表达式3,然后继续循环,若值为“假”,则结束循环,继续执行for的下一条语句。
- 表达式1:初值表达式,对循环变量赋初值,从而指定循环的起点。
- 表达式2:条件表达式,给出循环继续的条件。
- 表达式3:步长表达式,这个表达式是单次循环结束后需要执行的语句。
- 循环体语句:每一次循环需要执行的语句。
应用举例:
while循环
我们已经学习了for循环语句,现在我们学习的while语句也可以实现循环,而且使用范围更广泛。该语句的一般形式为
while ( 表达式 )
{
循环体语句;
}
while语句的执行流程为:当表达式的值为“真”时,循环执行,直到表达式的值为“假”,循环中止并继续执行while的下一条语句。
while循环的特点:
- while语句中的表达式可以是任意合法的表达式;
- while语句的构成简单,只有一个表达式和循环体语句,分别对应循环的两个核心要素:循环条件和循环体,可以直接把循环问題的分析设计转换为语句实现;
- while的循环体语句中必须包含能最终改变循环条件真假性的操作;
- while语句是在循环前先判断条件,只有条件为“真”才进入循环。
应用举例:
do-while循环
for语句和while语句都是在循环前先判断条件,只有条件满足才会进人循环,如果一开始条件就不满足,则循环一次都不执行。do-while循环语句与上述两种循环语句略有不同,它先执行循环体,后判断循环条件。所以无论循环条件的值如何,至少会执行一次循环体。
一般形式为:
do
{
循环体语句;
}while ( 表达式 );
do-while语句的执行流程为:第一次进入循环时,首先执行循环体语句,然后再检查循环控制条件,即计算表达式,若值为“真”,继续循环,直到表达式的值为“假”,循环结束,执行do-while的下一条语句。
do-while循环的特点:
- 语句中的表达式可以是任意合法的表达式;
- 使用时要另加初始化部分,循环体语句必须包含能最终改变条件真假性的操作;
- 该语句先循环、后判断循环条件,一般在循环体的执行过程中明确循环控制条件;
- 它每执行一次循环体后,再判断条件,以决定是否进行下一次循环。
应用举例:
三种循环语句小结
for循环与while循环的区别:
循环的实现一般包括4个部分,即初始化、条件控制、重复的操作以及通过改变循环变量的值最终改变条件的真假性,使循环能正常结束。这4个部分可以直接和for语句中的4个成分(表达式1、表达式2、循环体语句和表达式3)相对应。当使用while语句时,由于它只有2个成分(表达式和循环体语句),这时就需要另加初始化部分,至于第4个部分,while语句的循环体语句可包含for语句的循环体语句和表达式3, 所以while的循环体语句中必须包含能最终改变循环条件真假性的操作。
应用举例:
for循环语句:
while循环语句:
while循环与do-while循环的异同:
- while循环是先判断后运行,do-while循环是先执行后判断,因此无论是否符合条件,do-while循环至少执行一次。
例如:
图二的代码由于变量i不符合(i <= 10)的条件,无法进入循环,但是图一的代码会先循环一次,再进行判断。 - 当循环需要执行两次以上时,两种循环的运行效果相同。
例如:用代码求1+2+……+9+10的和
图一的代码循环了10次,在第十次结束时,由于i=11,就此结束了循环,图二的代码也执行了10次,在第11次循环开始时,由于i=11,因此第11次循环没有被运行。
循环语句的选择:
- 循环有固定的次数,使用for循环语句;
- 循环必须执行一次,使用do-while循环语句;
- 其他情况,使用while循环语句。
4.循环控制:break语句和continue语句
当循环结构中出现多个循环条件时,可以由循环语句中的表达式和break语句共同控制。break语句强制循环结束,一旦执行了break语句,循环提前结束,不再执行循环体中位于其后的其他语句。break语句应该和if语句配合使用,即条件满足时,才执行break跳出循环;否则,若break无条件执行,意味着永远不会执行循环体中break后面的其他语句。continue语句的作用是跳过循环体中continue后面的语句,继续下一次循环,该语句一般也需要与if语句配合使用。
两个语句的区别在于:break语句用于结束循环,而continue语句只是跳过后面的语句继续循环。break除了可以中止循环外,还应用与switch语句,而continue语句只能用于循环结构。
- break语句只能跳出其所在的一个循环,在嵌套循环结构中,不能跳出所有循环。
5.goto语句
goto语句也称为无条件转移语句,其一般格式如下:goto 语句标号; 其中语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加冒号。语句标号起标识语句的作用,与goto 语句配合使用。
例如:输入一行字符串,用代码实现字符数量统计:
编译器不限制程序中使用标号的次数,但各标号不得重名。goto语句能实现跳转功能,转去执行语句标号所标识的语句, goto语句通常与条件语句配合使用,可用来实现条件转移, 构成循环,跳出循环体等功能。 但是,我们一般不主张使用goto语句,因为使用该语句容易造成程序流程的混乱,容易破坏程序的严谨性、结构性,使理解和调试程序都产生困难。
6.嵌套循环结构
通过对题目的分析,我们可以知道这道题的本质是求解二元一次方程“n = (98 * f - 199 * y)”,其中n为输入的支票原始面额。同时我们也知道,计算机并不是那么聪明,它没办法直接解出f,y这两个未知量的值,但是计算机擅长高速度的重复运算,因此我们就让计算机发挥它的特长,用穷举法来写这道题。
代码实现:
从这道例题中,我们就把在代码中的循环形式称为嵌套循环(或多重循环),简单的说就是在循环结构里面还有循环结构。对于我们初学者而言,嵌套循环的写法相对比较灵活,因此我们需要对内、外层循环有清晰的思路,特别是初始化语句,初学者容易因为混淆了内、外层循环的初始化,从而把循环的初始化语句放在了错误的位置上。
7.循环结构实际应用——打印日历
这段代码能实现1994~1999年的日历打印,运行效果:
核心部分在于:
这段代码控制着年份的准确输入和第一个日期打印的位置。但是这段代码只能打印区区6个年份的日历,现在我要拓宽可打印的日历年限,让这个程序能够成功地打印2019年。
代码实现:
我们利用了刚学习的for循环结构成功地找出了输入年份的第一个日期的位置,查询1900年的日历,1900年1月1日是星期一,接下来的年份的1月1日的position都会比上一年加上1,如果上一年是闰年就加上2,以7为最小正周期来变化。现在的代码打印的年份下限是1900年,上限是多少呢?——int类型的上限有多大,年份上限就有多大!我们甚至可以把int统统改为double类型。
现在,我还想再加一段代码进去:
运行效果:
例题讲解
单词长度
代码截图
测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
It's great to see you here. | 4 5 2 3 3 4 | sample |
I'm a vegetable chicken. | 3 1 9 7 | sample等价 |
(空格)(空格)I'm a vegetable chicken(空格)(空格). | 3 1 9 7 | 开头结尾多空格 |
. | 只有句号 | |
(空格)(空格)(空格)(空格)(空格). | 空句子 | |
Yeah. | 4 | 一个单词 |
!@# $%^ &() _+}{ }":?> </- + . | 3 3 4 4 5 4 1 | 一个神秘的句子 |
求幂级数展开的部分和
代码截图
定义变量 mol 存放下一项的分子,定义变量 den 存放下一项的分母,定义变量 x 存放输入的数字,定义变量 sum 存放幂级数部分和,定义变量 next 存放下一项,用于结束循环。
测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
1.2 | 3.3201 | sample |
1.7 | 5.4739 | sample等价 |
0.5 | 1.6487 | 输入的x小于1大于0 |
1 | 2.7183 | 输入的x等于1 |
0 | 1.0000 | 输入的x取最小值 |
5 | 148.4132 | 输入的x取最大值 |
龟兔赛跑
代码截图
定义变量 T 为输入的时间,变量 rabbit 兔子跑过的路程,并初始化为 0,变量 tortoise 乌龟跑过的路程,并初始化为 0 变量 i 经过的分钟,变量 rest 休息时间,并初始化为 0,变量 flag 用于表示兔子处于休息状态,并初始化为 0。
测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
242 | @_@ 726 | sample |
0 | -_- 0 | 没出发 |
9 | _ 81 | 兔子赢 |
20 | _ 90 | 兔子躺赢 |
29 | _ 90 | 兔子赢临界点 |
30 | -_- 90 | 并驾齐驱 |
31 | @_@ 93 | 乌龟赢临界点 |
44 | @_@ 132 | 乌龟赢临界点 |
45 | -_- 135 | 并驾齐驱 |
46 | _ 144 | 兔子赢临界点 |
59 | _ 180 | 兔子赢临界点 |
60 | -_- 180 | 并驾齐驱 |
61 | @_@ 183 | 乌龟赢临界点 |
90 | -_- 270 | 并驾齐驱 |