三、循环结构

循环类语句包括for循环语句、while循环语句和do...while循环语句三种,用它们来解决实际应用中需要重复处理的问题。如当统计全班同学总分时,就需要重复地做加法,依次把每个人的分数累加起来。

1. for语句

  • 格式

    for (控制变量初始化; 条件表达式; 增量表达式) {
        语句1;
        语句2;
        ...
    }

    说明:花括号中的内容为循环体部分,如果循环体中只有一条语句花括号可以省略;如果循环体中应该有多条语句,但是忘了加花括号,则编译器会把离for最近的一条语句当做循环体

  • for语句的执行过程可由以下4步来描述:

    1. 执行“控制变量初始化”语句,使控制变量获得一个初值。
    2. 判断控制变量是否满足“条件表达式”,若满足条件则执行一遍循环体后,继续第3步;否则结束整个for语句,继续执行for循环下面的句子。
    3. 根据增量表达式,计算出控制变量所得到的新值。
    4. 自动转到第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 
      int main() {
          int sum = 0;
          for (int i = 1; i <= 100; ++i) {
              sum += i;
          }
          printf("%d\n", sum);
          return 0;
      }

2. while语句

  • 格式

    while (条件表达式) {
        语句1;
        语句2;
        ...
    }

    说明:while语句循环体部分与for语句的规则相同

  • 语句执行过程

    1. 计算作为循环控制条件表达式的值,得到逻辑真或假,假定用M表示。
    2. 若M为真,则执行了一遍循环体,否则离开循环,结束整个while语句的执行。
    3. 循环体中的所有语句执行结束后,自动转向第1步执行。
  • 格式举例

    1. 当i的值小于10,重复执行++i语句

      i=0;
      while (i < 10)
          ++i;
    2. 当输入的数据小于0时,重复读数据。

      scanf("%d", &x);
      while (x < 0)
          scanf("%d", &x);
  • 例题:求\(s=1+2 +3……+n\),当加到第几项时,\(s\)的值会超过\(1000\)

    #include 
    int main() {
      int n = 0, sum = 0;
      while (sum <= 1000) {
          ++n;
          sum += n;
      }
      printf("加到第%d项时,s会超过1000\n", n);
      return 0;
    }

3. do...while语句

  • 格式

    do {
        语句1;
        语句2;
        ...
    } while (条件表达式);

    说明:循环体部分的规则与上面的两种相同

  • 语句执行过程

    1. 执行一遍循环体。
    2. 求出作为循环条件的“条件表达式”的值,若为逻辑值真则自动转向第1步,否则结束do循环的执行过程,继续执行其后面的语句。
  • 例题:对于求两个正整数m, n的最大公约数可以用do—while实现。

    #include 
    int main() {
        int m, n, r;
        scanf("%d%d", &m, &n);
        do {
            r = m % n;
            m = n;
            n = r;
        } while (r != 0);
        printf("最大公约数为:%d\n", m);
        return 0;
    }

4. 循环的嵌套

  • 类似于选择结构,循环结构同样可以嵌套执行。
  • 例题:给定正整数\(n\),请计算出\(1!+2!+\cdots +n!\)的结果,其中\(n!\)表示阶乘,即\(n!=1\times 2\times \cdots \times n\)
#include 
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\n", sum);
}

问题:

  1. 请同学们计算一下,当n = 5时,该程序总共循环了多少次?
  2. \(\star\)\(\star\)\(\star\)怎样修改代码可以让程序的循环次数减少?

你可能感兴趣的:(三、循环结构)