当前位置:嗨网首页>书籍在线阅读

04-回到for循环

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.1.2 回到for循环

下面使用for循环完成更多的工作。程序清单5.4使用循环来计算并存储前16个阶乘。阶乘的计算方式如下:零阶乘写作0!,被定义为1。1!是10!,即1。2!为21!,即2。3!为3*2!,即6,依此类推。每个整数的阶乘都是该整数与前一个阶乘的乘积(钢琴家Victor Borge最著名的独白以其语音标点为特色,其中,惊叹号的发音就像phffft pptz,带有濡湿的口音。然而,刚才提到的“!”读作“阶乘”)。该程序用一个循环来计算连续阶乘的值,并将这些值存储在数组中。然后,用另一个循环来显示结果。另外,该程序还在外部声明了一些值。

程序清单5.4 formore.cpp

// formore.cpp -- more looping with for
#include <iostream>
const int ArSize = 16; // example of external declaration
int main()
{
    long long factorials[ArSize];
    factorials[1] = factorials[0] = 1LL;
    for (int i = 2; i < ArSize; i++)
        factorials[i] = i * factorials[i-1];
    for (int i = 0; i < ArSize; i++)
        std::cout << i << "! = " << factorials[i] << std::endl;
    return 0;
}

下面是该程序的输出:

0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000

阶乘增加得很快!

注意: 这个程序清单使用了类型long long。如果您的系统不支持这种类型,可使用double。然而,整型使得阶乘的增大方式看起来更明显。

程序说明

该程序创建了一个数组来存储阶乘值。元素0存储0!,元素1存储1!,依此类推。由于前两个阶乘都等于1,因此程序将factorials数组的前两个元素设置为1(记住,数组第一个元素的索引值为0)。然后,程序用循环将每个阶乘设置为索引号与前一个阶乘的乘积。该循环表明,可以在循环体中使用循环计数。

该程序演示了for循环如何通过提供一种访问每个数组成员的方便途径来与数组协同工作。另外,formore.cpp还使用const创建了数组长度的符号表示(ArSize)。然后,它在需要数组长度的地方使用ArSize,如定义数组以及限制循环如何处理数组时。现在,如果要将程序扩展成处理20个阶乘,则只需要将ArSize设置为20并重新编译程序即可。通过使用符号常量,就可以避免将所有的16修改为20。

提示: 通常,定义一个const值来表示数组中的元素个数是个好办法。在声明数组和引用数组长度时(如在for循环中),可以使用const值。

表达式i < ArSize反映了这样一个事实,包含ArSize个元素的数组的下标从0到ArSize – 1,因此数组索引应在ArSize减1的位置停止。也可以使用i <= ArSize –1,但它看上去没有前面的表达式好。

该程序在main()的外面声明const int变量ArSize。第4章末尾提到过,这样可以使ArSize成为外部数据。以这种方式声明ArSize的两种后果是,ArSize在整个程序周期内存在、程序文件中所有的函数都可以使用它。在这个例子中,程序只有一个函数,因此在外部声明ArSize几乎没有任何实际用处,但包含多个函数的程序常常会受益于共享外部常量,因此我们现在就开始练习使用外部变量。

另外,这个示例还提醒您,可使用std::而不是编译指令using来让选定的标准名称可用。