第五章循环结构
三大基本结构:顺序结构,分支结构,循环结构
C语言用一定的方式控制重复,提供了3中循环控制语句。即 for 语句, while 语句, do···while 语句,前两者是“先判断后操作”的模式,后一个是“先操作后判断”的模式。
5.1 for 语句控制的循环
通常用于控制与计数有关的循环。
5.1.1 for 语句的基本格式:
for(表达式1;表达式2;表达式3)
{
循环体;
}
执行流程如下:
首先把“表达式1”执行一次,然后进入先判断后操作模式的循环,反复进行如下处理:计算“表达式2”的值,计算结果是true(在C语言可能出现“非0即真”的判断方式)则依次把“操作序列”和“表达式3”执行一遍。一旦某次计算“表达式2”的值是false,循环终止,转到for后面的语句继续执行。
5.1.2 用 for 语句控制计数:
for(计数变量=初值;计数变量<=终值;计数变量)
{
循环体;
}
循环次数=终值-初值+1;
5.1.3 for 语句的几种特殊用法:
- 表达式1为空
表达式1
for(;表达式2;表达式3)
{
循环体;
}
上下两种写法效果完全相等
for(表达式1;表达式2;表达式3)
{
循环体;
}
-
表达式2为空
如果表达式2的为空,编译程序会以表达式2的值恒为“真”处理,程序会陷入死循环,除非有其他方法终止循环。 -
表达式3为空
如果表达式3的为空,循环控制变量始终保持不变,程序可能会陷入死循环。但是允许将表达式3写在循环体内。
for(表达式1;表达式2;)
{
循环体;
表达式3;
}
- 循环体为空
for(表达式1;表达式2;表达式3)
;
5.2 while 语句控制的循环
通常用于控制循环条件明显,且知道循环终止条件而循环次数不明确时。
5.2.1 while 语句的基本格式:
while(表达式)
{
循环体;
}
执行流程如下:
while语句中的“条件”是计算结果是逻辑的表达式,“需要重复的操作”是循环体,控制的是先判断后操作模式的循环:先计算“条件”,计算结果是true(在C语言可能出现“非0即真”的判断方式)则执行一次循环体。如此反复,一旦某次计算“条件”的值是false,则循环终止,转到while后面的语句继续执行。用 while 语句控制计数时需要注意,它只提供一个循环控制的条件。因此在进入while循环之前需要把计数变量赋初值,计数变量的变化规律通常写在循环体的最后。功能上 for 语句和 while 语句可以相互代替。
5.3 do···while 语句控制的循环
do···while 语句的基本格式:
do
{
循环体;
}
while(表达式);
执行流程如下:
其中的“条件”就是格式中的“逻辑表达式”,“需要重复的操作”是循环体,控制的是先操作后判断模式的循环:先把循环体执行一次,然后计算“条件”,计算结果是true(在C语言可能出现“非0即真”的判断方式)则再执行一次循环体,再次计算“条件”。如此反复,一旦某次计算“条件”的值是false,则循环终止,转到do…while后面的语句继续执行。
5.4 break 和 continue
break:提前终止循环,转到循环语句的后续语句
基本格式:
break;
如果存在循环嵌套,则终止其所在的最内层循环。
continue:用于跳过本轮循环体中尚未执行的语句,转而执行下一次的条件判断。
基本格式:
continue;
5.5 循环等典型应用
5.1.1 有关数列计算的问题
- 已知通项公式的计算问题
eg:“已知数列的通项公式,求该数列的前n项和”是这一类问题的典型代表。数列求和都可以用如下模式解决。
(1)准备一个计数变量 i 和一个求和变量 s
(2)for(i=1,s=0;i<=n;i++)
{
由通项公式计算数列第 i 项;
把第 i 项的值累加到变量 s 中;
}
若干项不符合通项公式或者不易求出,这时可以把前面这几项的和作为求和变量s的初值,让变量 i 从符合通项公式的那一项开始计数。
更复杂一点的情况是数列的通项公式中含有不能直接运用计算符或者数学函数计算的成分,这时就需要在设计程序时使用一点小技巧。
- 已知递推公式的计算问题
eg:已知数列的递推公式求有关数据,如指定求指定项的值是多少,求数列从第几项开始满足某条件等,求前n项和当然也是问题之一。这一类问题应用十分广泛,有些表面看来与数列无关的问题实际上都可以归为这一类。解决这类问题的方法是递归(后面章节会讲到)和循环。求解递推类问题经常推广到求解第n项 - 其他计算问题
求解近似值 - 完全性问题
指对给定范围内的所有数据,检验它们是否满足指定的条件。 - 存在性问题
对于给定范围内的所有数据,检查是否至少存在一个数满足指定条件。
求解存在性问题的一般做法:先设置一个逻辑变量,初值为“否”,然后以循环方式逐个检查给定范的每一个数,一旦找到一个满足条件的,就把逻辑变量置为“是”并终止循环。如果始终找不到满足条件的数,则循环结束后逻辑变量保持原值“否”。
5.6 循环嵌套
循环嵌套:在一个循环的循环体内再次使用循环。
编写带有嵌套的循环通常采用框架结构,由粗到细进行细化。
对于有循环嵌套的程序,即使程序代码很短,也可能需要耗费很长的时间。比如k层嵌套的循环,每一层循环需要执行ni(k=1,2,…,k)次,则最里层循环的循环体中的语句将执行n1×n2×…×nk次。