21天学通C++(第5版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.3 循环结构

循环结构是用来在指定的条件下多次重复执行同一组语句。在C++中,常用的循环语句形式主要有如下三种:

●for语句

●while语句

●do…while语句

4.3.1 for语句

for语句是C++中最常见的、功能最强的循环语句,它既可用于循环次数确定的情况,也可用于循环次数不确定而只给出循环结束条件的情况,其说明语句的一般形式为:

其中,表达式1是对循环控制变量进行初始化,表达式2是循环条件,表达式3是对循环控制变量进行递增或递减。这3个表达式都可以缺省,但分号不能省略。for语句可以是单条语句,也可以是块语句,它是要被循环重复执行的程序段,故又称为循环体。其执行流程如图4-18所示。

图4-18 for语句执行流程

【范例4-13】for语句的应用。该范例求自然数100内的所有偶数之和,即计算2+4+6+…+100的算术和。该范例与求1~100内所有自然数和相似,不同的是其只要求偶数,这就需要在赋初值时预先设置,并在控制循环变量时递增2即可,程序如代码清单4-13所示。

代码清单4-13

【运行结果】在Visual C++中编译上述程序代码,若编译无误使用快捷键【Ctrl+F5】执行该代码,其返回结果如图4-19所示。

图4-19 使用for语句执行程序的结果

【范例解析】范例4-13代码中,for语句中的变量初始值为2,这是第一个偶数,表达式3中的循环变量每次递增2,保证i中的值都为偶数,循环条件为小于或等于100。

警告

for语句中包含3个语句,这是必不可少的,即使其中某一个语句为空,“;”符号是不能省略的,否则编译系统将给出错误提示。

4.3.2 while语句

while语句是最简单的循环语句,它实际上是for语句的表达式1和表达式3为空的特殊情形,其说明语句的一般形式为:

其中,表达式用来判定循环是否继续,当表达式条件成立时,执行循环体。while语句要求能够在循环体内含改变物质循环条件表达式的值,以使表达式条件不成立时退出循环体。因此,其执行流程如图4-20所示。

图4-20 while语句执行流程

使用while语句也同样可以实现类似for语句的循环。例如,范例4-14可以用while语句实现前面for语句实现的功能。

【范例4-14】while语句的应用。该范例将上述求100以内所有偶数和的示例通过while语句来实现,代码如代码清单4-14所示。

代码清单4-14

【运行结果】上述程序代码清单的执行结果与图4-19相同。

【范例解析】读者可以对比for语句和while语句,其不同就在于for语句将赋初值和循环变量的改变均集成在for语句中,并用“;”隔开,而while语句则写在语句块中作为更直观的语句,相对来说,while语句的可读性更强,但for语句更为精练简洁。

警告

在while语句的循环体中,一定要包含如i++之类的循环变量递加或递减的语句,以使其经过若干次循环后可不满足循环条件,从而跳出循环。否则,程序将陷入死循环中。

4.3.3 do…while语句

do…while语句是while语句的一种变化形式,其说明语句的一般形式为:

do…while语句与while语句的主要区别是:do…while语句的循环体至少被执行一次,而while语句先判断条件,有可能一次也不执行。其执行流程如图4-21所示。

图4-21 do…while语句执行流程

【范例4-15】do…while语句的应用。该范例将上述求100以内偶数之和的示例采用do…while语句来实现,程序如代码清单4-15所示。

代码清单4-15

【运行结果】执行上述程序,其执行结果与图4-19相同。

【范例解析】该代码与代码清单4-14的区别就在于do…while语句先执行循环体内的语句,后判断是否符合循环条件,而其他语句都类似。

总的来说,for语句、while语句和do…while语句都能够实现循环结构。但是在C++中,最常用的还是for语句,这是因为它集成了三个语句在其中,写法精练。当然,读者可以根据不同的具体情况选择使用不同的语句。

4.3.4 多重循环

在实际的应用中,还有一种循环方式使用很广泛,这就是多重循环,也称为循环嵌套,其是指循环语句的循环体内又包含另一个循环语句。

注意

在多重循环中,循环嵌套的执行顺序是先执行最里层的循环语句,然后依次往外执行,最后执行最外层的循环。

例如,打印一个九九乘法表。读者可以理解,九九乘法表需要用两个数值进行运算,即乘数和被乘数,而这两个数在九九乘法表中是需要从1~9变化的,这时就需要使用多重循环了,其实现代码如代码清单4-16所示。

【范例4-16】多重循环的实现,打印一个九九乘法表。

代码清单4-16

【运行结果】在Visual C++中执行上述代码,其执行结果如图4-22所示。

图4-22 多重循环

【范例解析】范例4-16代码中,在for循环中又嵌套了一个for语句,作为其子循环。执行该程序时,先执行里层的子循环,再执行外层循环。

多重循环在具体的应用中使用非常广泛,为了让读者更好地理解多重循环,这里给出范例4-16的程序流程图,如图4-23所示。

图4-23 执行流程

提示

在循环嵌套中,并非一定要同种结构的循环才能进行嵌套。for循环里面可以嵌套while/do…while循环,while循环里也可也嵌套for/do…while循环。循环体里可以嵌套多个内循环,内循环里还可以嵌套内循环。

4.3.5 应用示例

4.3.1~4.3.4节的内容详细介绍了三个实现循环结构的语句,以及多重循环的实现。下面通过一个具体示例回顾循环结构的实现。下列程序求1000内的所有水仙花数。所谓水仙花数,是指一个位数,其各位数字立方和等于该数字本身。

【范例4-17】循环结构应用示例。在该范例中,需要分开一个数的百位、十位和个位,然后求出其立方和是否与该数字本身相等,如相等则输出,否则继续寻找下一个数,其实现程序如代码清单4-17所示。

代码清单4-17

【运行结果】范例4-17的代码在Visual C++中的执行,结果如图4-24所示。

图4-24 求解水仙花数

【范例解析】范例4-17的代码中,使用了一个三重循环,分别取一个数的百位、十位和个位,n为这个数本身,m为该数各位的立方和,如n==m成立,则n位水仙花数,将其输出,并找下一个数,直至百位数大于9即结束整个循环。