C语言--循环结构

知识内容总结

for循环语句

使用该语句可以实现 C 语句的重复执行,一般形式为:

for ( 表达式1; 表达式2; 表达式3)
{
      循环体语句;
}

for语句的执行流程是:先计算表达式1,再判断表达式2,若为“真”,则执行循环体语句,并接着计算表达式3,然后继续循环,若值为“假”,则结束循环,继续执行for的下一条语句。

  • 表达式1:初值表达式,对循环变量赋初值,从而指定循环的起点。
  • 表达式2:条件表达式,给出循环继续的条件。
  • 表达式3:步长表达式,这个表达式是单次循环结束后需要执行的语句。
  • 循环体语句:每一次循环需要执行的语句。
    应用举例:

while循环

我们已经学习了for循环语句,现在我们学习的while语句也可以实现循环,而且使用范围更广泛。该语句的一般形式为

while ( 表达式 )
{
      循环体语句;
}

while语句的执行流程为:当表达式的值为“真”时,循环执行,直到表达式的值为“假”,循环中止并继续执行while的下一条语句。

while循环的特点:

  1. while语句中的表达式可以是任意合法的表达式;
  2. while语句的构成简单,只有一个表达式和循环体语句,分别对应循环的两个核心要素:循环条件和循环体,可以直接把循环问題的分析设计转换为语句实现;
  3. while的循环体语句中必须包含能最终改变循环条件真假性的操作;
  4. while语句是在循环前先判断条件,只有条件为“真”才进入循环。
    应用举例:

do-while循环

for语句和while语句都是在循环前先判断条件,只有条件满足才会进人循环,如果一开始条件就不满足,则循环一次都不执行。do-while循环语句与上述两种循环语句略有不同,它先执行循环体,后判断循环条件。所以无论循环条件的值如何,至少会执行一次循环体。
一般形式为:

do
{
      循环体语句;
}while ( 表达式 );

do-while语句的执行流程为:第一次进入循环时,首先执行循环体语句,然后再检查循环控制条件,即计算表达式,若值为“真”,继续循环,直到表达式的值为“假”,循环结束,执行do-while的下一条语句。

do-while循环的特点:

  1. 语句中的表达式可以是任意合法的表达式;
  2. 使用时要另加初始化部分,循环体语句必须包含能最终改变条件真假性的操作;
  3. 该语句先循环、后判断循环条件,一般在循环体的执行过程中明确循环控制条件;
  4. 它每执行一次循环体后,再判断条件,以决定是否进行下一次循环。
    应用举例:

三种循环语句小结

for循环与while循环的区别:

循环的实现一般包括4个部分,即初始化、条件控制、重复的操作以及通过改变循环变量的值最终改变条件的真假性,使循环能正常结束。这4个部分可以直接和for语句中的4个成分(表达式1、表达式2、循环体语句和表达式3)相对应。当使用while语句时,由于它只有2个成分(表达式和循环体语句),这时就需要另加初始化部分,至于第4个部分,while语句的循环体语句可包含for语句的循环体语句和表达式3, 所以while的循环体语句中必须包含能最终改变循环条件真假性的操作。
应用举例:

for循环语句:

while循环语句:

while循环与do-while循环的异同:

  1. while循环是先判断后运行,do-while循环是先执行后判断,因此无论是否符合条件,do-while循环至少执行一次。
    例如:


    图二的代码由于变量i不符合(i <= 10)的条件,无法进入循环,但是图一的代码会先循环一次,再进行判断。
  2. 当循环需要执行两次以上时,两种循环的运行效果相同。
    例如:用代码求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 并驾齐驱
posted @ 2019-10-20 00:05  乌漆WhiteMoon  阅读(3682)  评论(8编辑  收藏  举报