循环类语句包括for循环语句、while循环语句和do...while循环语句三种,用它们来解决实际应用中需要重复处理的问题。如当统计全班同学总分时,就需要重复地做加法,依次把每个人的分数累加起来。
1. for语句
-
格式
for (控制变量初始化; 条件表达式; 增量表达式) { 语句1; 语句2; ... }
说明:花括号中的内容为循环体部分,如果循环体中只有一条语句,花括号可以省略;如果循环体中应该有多条语句,但是忘了加花括号,则编译器会把离for最近的一条语句当做循环体。
-
for语句的执行过程可由以下4步来描述:
- 执行“控制变量初始化”语句,使控制变量获得一个初值。
- 判断控制变量是否满足“条件表达式”,若满足条件则执行一遍循环体后,继续第3步;否则结束整个for语句,继续执行for循环下面的句子。
- 根据增量表达式,计算出控制变量所得到的新值。
- 自动转到第2步。
-
格式举例
-
for(i = 1; i <= 100; ++i) //将控制变量从1变到100,增量为1 for(i = 100; i >= 1; --i) //将控制变量从100变到1,增量为-1 for(i = 7; i <= 77; i += 7)//控制变量从7变到77,增量为7 for(int i = 20; i >= 2; i -= 2)//控制变量从20变到2,增量为-2 for(int j = 99; j >= 0; j -= 11)//按所示数列改变控制变量值:99、88、77、66、55、44、33、22、11、0,增量为-11 for (int i = 1, j = 2; i <= 99 && j <= 100;i += 2,j += 2)//控制变量i和j共同进行循环控制,i从1变到99,j从2变到100,增量均为2。
-
需要说明的是:可以在for循环“ 控制变量初始化语句”中声明变量(如上面最后3个例子),这些变量只在for循环结构中有效,离开了该for结构,变量就无效了。
-
例题:利用for循环,计算输出(1+2+…+100)的和。
-
#include <cstdio> int main() { int sum = 0; for (int i = 1; i <= 100; ++i) { sum += i; } printf("%d ", sum); return 0; }
-
2. while语句
-
格式
while (条件表达式) { 语句1; 语句2; ... }
说明:while语句循环体部分与for语句的规则相同
-
语句执行过程
- 计算作为循环控制条件表达式的值,得到逻辑真或假,假定用M表示。
- 若M为真,则执行了一遍循环体,否则离开循环,结束整个while语句的执行。
- 循环体中的所有语句执行结束后,自动转向第1步执行。
-
格式举例
-
当i的值小于10,重复执行++i语句
i=0; while (i < 10) ++i;
-
当输入的数据小于0时,重复读数据。
scanf("%d", &x); while (x < 0) scanf("%d", &x);
-
-
例题:求(s=1+2 +3……+n),当加到第几项时,(s)的值会超过(1000)?
#include <cstdio> int main() { int n = 0, sum = 0; while (sum <= 1000) { ++n; sum += n; } printf("加到第%d项时,s会超过1000 ", n); return 0; }
3. do...while语句
-
格式
do { 语句1; 语句2; ... } while (条件表达式);
说明:循环体部分的规则与上面的两种相同
-
语句执行过程
- 执行一遍循环体。
- 求出作为循环条件的“条件表达式”的值,若为逻辑值真则自动转向第1步,否则结束do循环的执行过程,继续执行其后面的语句。
-
例题:对于求两个正整数m, n的最大公约数可以用do—while实现。
#include <cstdio> int main() { int m, n, r; scanf("%d%d", &m, &n); do { r = m % n; m = n; n = r; } while (r != 0); printf("最大公约数为:%d ", m); return 0; }
4. 循环的嵌套
- 类似于选择结构,循环结构同样可以嵌套执行。
- 例题:给定正整数(n),请计算出(1!+2!+cdots +n!)的结果,其中(n!)表示阶乘,即(n!=1 imes 2 imes cdots imes n)。
#include <cstdio>
int main() {
int n = 0, t = 1, sum = 0;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
t = 1;
for (int j = 1; j <= i; ++j) {
t *= j;
}
sum += t;
}
printf("%d
", sum);
}
问题:
- 请同学们计算一下,当n = 5时,该程序总共循环了多少次?
- (star)(star)(star)怎样修改代码可以让程序的循环次数减少?