3.2.6 嵌套的循环(1)
可以在一个循环内部嵌套另一个循环。在第4章,嵌套循环的常见用途将更加明显-- 通常用来重复不同等级的动作。例如,首先计算某班学生的总分,然后对全校各班重复该过程。
试一试:嵌套的循环
通过计算一个简单公式的值,可以看出嵌套循环的作用。某个整数的阶乘是从1到该整数所有整数的乘积,因此3的阶乘是1×2×3,结果是6。下面的程序计算所输入的整数的阶乘(直到不再输入新的整数为止):
- // Ex3_13.cpp
- // Demonstrating nested loops to compute factorials
- #include <iostream>
- using std::cin;
- using std::cout;
- using std::endl;
- int main()
- {
- char indicator('n');
- long value(0L), factorial(0L);
- do
- {
- cout << endl << "Enter an integer value: ";
- cin >> value;
- factorial = 1L;
- for(long i = 2L; i <= value; i++)
- factorial *= i;
- cout << "Factorial " << value << " is " << factorial;
- cout << endl << "Do you want to enter another value (y or n) ";
- cin >> indicator;
- } while(('y' == indicator) || ('Y' == indicator));
- return 0;
- }
如果编译并执行该示例,则产生的典型输出如下:
- Enter an integer value: 5
- Factorial 5 is 120
- Do you want to enter another value (y or n) y
-
- Enter an integer value: 10
- Factorial 10 is 3628800
- Do you want to enter another value (y or n) y
-
- Enter an integer value: 13
- Factorial 13 is 1932053504
- Do you want to enter another value (y or n) y
-
- Enter an integer value: 22
- Factorial 22 is -522715136
- Do you want to enter another value (y or n) n
示例说明
阶乘值以非常快的速度增长。事实上,12是能够使该示例产生正确结果的最大输入值。13的阶乘实际上是6 227 020 800,不是该程序算出的1 932 053 504。如果使用更大的输入值运行该程序,则变量factorial所存储的结果将丢失前导数字,也可能得到负的阶乘值,就像前面计算22的阶乘时所发生的情形一样。
这种情况不会引起任何错误消息,因此最重要的是确保程序中所处理的值不超出其数据类型限定的范围。我们还需要考虑不正确输入的影响。这种悄悄发生的错误可能非常难以发现。
两个嵌套循环的外部是do-while循环,它控制着程序结束的时间。只要在提示时继续输入y或Y,该程序就继续计算阶乘值。输入整数的阶乘是在内部for循环中计算的。该循环执行value-1次,将变量factorial(初始值为1)乘以从2到value的连续整数。