【时时三省】(C语言基础)改变循环执行的状态
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
以上介绍的都是根据事先指定的循环条件正常执行和终止的循环。但有时在某种情况下需要提早结束正在执行的循环操作。例如,慈善募捐,收到10万元就结束。可以用循环来处理此问题,每次输入一个捐款人的捐款数,不断累加。但是,事先并不能确定循环的次数,需要每次输入捐款数后进行累加,并检查总数是否达到10万,如果未达到,就继续执行循环,输入下一个捐款数,如果达到10万元,就终止循环。可以用break语句和continue语句来实现提前结束循环。
用break语句提前终止循环
如前所述,用break语句可以使流程跳出switch结构,继续执行switch语句下面的、个语句。实际上,break语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。例如上面统计捐款的例子,可以用以下的程序处理。
例题:
在全系1000名学生中举行慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数以及平均每人捐款的数目。
编程思路:
显然应该用循环来处理。实际循环的次数事先不能确定,可以设为最大值即1000(最多会有1000人捐款),在循环体中累计捐款总数,并用if语句检查是否达到10万元,如果达到就不再继续执行循环,终止累加,并计算人均捐款数。在程序中定义变量amount,用来存放捐款数,变量total,用来存放累加后的总捐款数,变量aver,用来存放人地捐款数,以上3个变量均为单精度浮点型。定义整型变量i作为循环变量。定义符号常量SUM代表100 000。
编写程序:
运行结果:
程序分析:
for语句本来指定执行循环体1000次。在每一次循环中,输入一个捐款人的捐款数,然后把它累加到total中,如果没有if语句,则执行循环体1000次。现在设置一个if语句,在每一次累加了捐款数amount后,立即检查累加和total是否达到或超过SUM(即100000),当total > = 100000时,就执行break语句,流程跳转到循环体的花括号外,即不再继续执行剩余的几次循环,提前结束循环。
请思考此时变量i的值是什么。
结论是:
已经输入捐款数的人数因此用捐款总数total除以捐款人数,得到的就是人均捐款额aver。
break语句的一般形式为
break ;
其作用是使流程跳到循环体之外,接着执行循环体下面的语句。
注意:break语句只能用于循环语句和switch语句之中,而不能单独使用。
用continue语句提前结束本次循环
有时并不希望终止整个循环的操作,而只希望提前结束本次循环,而接着执行下次循环。这时可以用continue语句。
例题:
要求输出100 ~ 200的不能被3整除的数。
编程思路:
显然需要对100 ~ 200的每一个整数进行检查,如果不能被3整除,就将此数输出,若能被3整除,就不输出此数。无论是否输出此数,都要接着检查下一个数(直到200为止)。
不论n能否被3整除,循环的次数总是101次,不会改变。
编写程序:
运行结果:
程序分析:当n能被3整除时,执行continue语句,流程跳转到表示循环体结束的右花括号的前面(注意不是右花括号的后面)。
当然,例中循环体中也可以不用continue语句,而改用一个if语句处理,
if ( n% 3 ! = 0 ) printf ( " % d " , n );
效果也一样。在本例中用continue语句无非为了说明continue语句的作用。
continue语句的一般形式为
continue ;
其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,转到循环体结束点之前,接着执行for语句中的“表达式3”(在本例中是i++),然后进行下一次是否执行循环的判定。