⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 02章 控制结构.txt

📁 C++大学教程txt版中文版 C++大学教程txt版中文版
💻 TXT
📖 第 1 页 / 共 5 页
字号:
    counter=1;
声明不是可执行语句,但赋值是可执行语句。我们用两种方法将变量初始化。
    下列语句:
    ++counter;
在每次循环时将循环计数器的值加1。while结构中的循环条件测试控制变量的值是否小于或等于10
(条件为true的终值)。注意,即使控制变量是10时,这个while结构体仍然执行。控制变量超过10
时(即counter变成11时),循环终止。
    图2.16的程序也可以更加简化,将counter初始化为。并将while结构换成:
    while (++counter <= lO)
    cout << counter << endl;
这段代码减少了语句,直接在while条件中先增加计数器的值再测试条件。这段代码还消除了while
结构体的花括号,因为这时while只包含一条语句。

    常见编程错误2.12
    由于浮点值可能是近似值,用浮点变量控制计数循环可能导致不精确的计数器值,使测试的结果不准确。
    编程技巧2.15
    用整数值杜制计数循环。
    编程技巧2.16
    缩排每个控制结构体中的语句。
    编程技巧2.17
    在每个控制结构前后加上空行,使其在程序中一目了然。
    编程技巧2.18
    嵌套太多会使程序难以理解。一般来说,缩排不宜超过三层。
    编程技巧2.19
    在每个控制结构前后加上空行,并缩排每个控制结构体中的语句使程序产生二维效果,大大增加可读性。

2.14  for重复结构
    for重复结构处理计数器控制循环的所有细节。要演示for的功能,可以改写图2.16的程序,结果如图2.17。
    执行for重复结构时,声明控制变量counter并将其初始化为1。然后检查循环条件counter<=10。由于counter的初始值为1,因此条件满足,打印Counter的值(1)。然后在表达式Counter++中递增控制变量counter,再次进行循环和测试循环条件。由于这时控制变量等于2,没有超过最后值,因此程序再次执行语句体。这个过程一直继续,直到控制变量counter递增到11,使循环条件的测试失败,重复终止。程序继续执行for结构后面的第一条语句(这里是程序末尾的return浯句)。

1 // Fig. 2.17:fig02 17.cpp
2 // Counter-controlled repetition with the for structure
3 #include <iostream.h>
4
5 int main()
6 {
7    // Initialization, repetition condition, and incrementing
8    // are all included in the for structure header.
9
10   for ( iht counter = 1; counter <= 10; counter++ )
11     cout << counter << endl;
12
13   return O;
14 }

                              图 2.17 用for结构的计数器控制重复

图2.18更进一步研究了图2.17中的for结构。注意for结构指定计数器控制重复所需的每个项目。如果for结构体中有多条语句,则应把语句体放在花括号中。
    注意图2.17用循环条件counter<=10。如果循环条件变为counter<lO,则循环只执行9次,这种常见的逻辑错误称为差1错误。
    
                for
               关键字   控制变量名           控制变量终值
                 ↓         ↓                     ↓
                for ( int counter = 1; counter <= 10; counter++)
                                       -------------
                                    ↑          ↑           ↑
                            控制变量初始化   循环条件     控制变量递增

                                   图 2.18 典型for首部的组件

    常见编程错误2.13
    while或for条件中使用不正确的关系运算符和不正确的循环计数器终值会导致差1的错误。

 编程技巧2.20
    在while或for条件中使用终值和用关系运算符<=可以避免差1的错误。例如,对打印1到10的循环,循
环条件应为counter<=10而不是counter<10(导致差1错误)或counter(虽然正确)。许多程序员喜欢基
于O的计数,在循环中重复10次.courter初姑化为O,循环条件测试为counter<10。
    for结构的一般格式如下:
    for(expression1;expression2;expression3)
        statement
其中expression1初始化循环控制变量的值,expression2是循环条件,expression3递增控制变量。大
多数情况下,for结构可以表示为等价的while结构:
    expression1
    while(expression2){
        statement
        expression3;
    }
惟一的例外将在2.18节介绍。
    如果for结构首部中的expression1(初始化部分)定义控制变量(即控制变量类型在变量名前
面指定).则该控制变量只能在for结构体中使用,即控制变量值是for结构之外所未知的。这种限
制控制变量名的用法称为变量的作用域(scope)。变量的作用域定义其在程序中的使用范围。作用
域将在第3章“函数”中介绍。

    常见编程错误2.14
    如果for结构首部中的初始化部分定义控制变量,则在该结构体之后使用这个控制变量是个语法错误。
    可移植性提示2.1
    在新的C++草案标准中,for结构初始化部分声明的控制变量范围与旧式的C++编译器中不同。旧式的c++编译器产生的C++代码在支持新的C++草案标准妁编译器中编译时可能遭到破坏。可以用两个编工程策略防止这个问题:在每个for结构中定义不同名称的控制变量或者在多个for结构中定义相同名称的控制变量,并在第一个for循环之外和之前定义控制变量。
    有时,exprossion1和expression3是由逗号分开的表达式列表。这里用逗号作为逗号运算符(comma operator),保证从左向右求值表达式列表。逗号运算符在所有C++运算符中的优先级量低。逗号分隔表达式列表的值和类型是列表中最右边表达式的值和类型。逗号运算符最常用于for结构,其主要用途是让程序员使用多个初始化表达式或多个递增表达式。例如,一个for结构中可能有多个控制变量需要初始化和递增。
    
    编程技巧2.21
    只把涉及控制变量的表达式放在for结构的初始化和递增部分。其他变量的操作应放在循环之前(如果像初初化语句一样只执行一次)或循环体中(如果对每个循环环执行一次,如递增和递减语句)。
    for结构中的三个表达式是可选的。如果省略expression2,则C++假设循环条件为真,从而生成无限循环。如果程序其他地方初始化控制变量,则可以省略expression1。如果for语句体中的语句计算增量或不需要增量,则可以省略expression3。for结构中的增量表达式就像是for语句体末尾的独立语句。因此,下列表达式:
    counter = counter + 1;
    counter += 1;
    ++counter;
    counter++;
在for结构的递增部分都是等价的。许多程序员喜欢counter++,因为递增在执行循环体之后发生,因此,后置自增形式似乎更自然。由于这里递增的变量没有出现在表达式中,因此前置自增与后置自增的效果相同。for结构首部中的两个分号是必需的。

    常见编程错误2.15
    for结构首部中的两个分号改成逗号会造成语法错误。
    常见编程错误2.16
    将分号放在for结构首部的右括号后面令使该for结构体变为空语句.通常是个逻辑错误。
    软件工程视点2.9
    将分号放在紧接着for结构首部的后面有时可以生成所谓的延迟循环。这种for的循环体是空语句,表示计算空循环的次数。例如,可以用空循环减慢程序速度,以避免其在屏幕上输出太快,无法阅读。
  
    for结构的初始化、循环条件和递增部分可以用算术表达式。例如,假设x=2和y=10,如果x和y的值在循环体中不被修改,则下列语句:
    for (int j= x; j <= 4* x* y; j += y/ x )
等于下列语句:
    for(int j=2;j<=80;j+=5)
    for结构的增量也可能是负数(实际上是递减,循环向下计数)。
    如果循环条件最初为false,则for结构体不执行,执行for后面的语句。
    for结构中经常打印控制变量或用控制变量进行计算,控制变量常用于控制重复而不在for结构
体中提及这些控制变量。
    
    编程技巧2.22
    尽管控制变量值可以在for循环体中改变,但最好不要这样做,固为这样可能造成一定的逻辑错误。
    for结构的流程图与while结构相似。例如,图2.19显示了下列for语句的流程图:
    for(int counter=l;counter>=10;counter++)
    cout<< counter<< endl;
从这个流程图可以看出初始化发生一次,井在每次执行结构体语句之后递增。注意,流程图(除了小圆框和流程之外)也只能包含表示操作的矩形框和表示判断的菱形框。这是我们强调的操作/判断编程模型。程序员的任务就是根据算法使用堆栈和嵌套两种方法组合其他几种控制结构,然后在这些框中填入算法所要的操作和判断,从而生成程序。






2.15 for结构使用举例
    下面的例子显示for结构中改变控制变量的方法。在每个例子中.我们都编写相应的for结构首部。注意循环中递减控制变量的关系运算符的改变。
    a)将控制变量从1变到100,增量为1。
      for(int i=l;i<=100;i++)
    b)将控制变量从100变到1,增量为-1。
      for(int i=100;i>=1; i--)
    
    常见编程错误2.17
    循环向下计数时如果循环条件中不使用正确的关系运算符(如在向下计算到1的循环中使用i<=1)通常是个逻辑错误,会在程序运行时产生错误结果。
   
    c)控制变量的变化范围为7到77。
      for(int i= 7;i <= 77; i+= 7)
    d)控制变量的变化范围为20到2。
      for(int i=20;i>=2;i-=2)
    c)按所示数列改变控制变量值:2、‘、8、11、14、17、20。
      for(int j=2;j<=20;j+=3)
    f)按所示数列改变控制变量值:99、88、77、66、55、44、33、22、ll、O。
     for(int j=99; j>=O;  j-=11)
    下面两个例子提供for结构的简单应用。图2.20所示的程序用for结构求2到100的所有整数的总和。
注意图2.20中for结构体可以用下列逗号运算符合并成for首部的右边部分:
for(int number = 2;                   // initialization
        number <= 100;                   // continuation condition
        sum += number, number += 2)         // total and increment
初始化sum=0也可以合并到for的初始化部分。

1 // Fig. 2.20: figO2_20.cpp
2 // Summation with for
3 #include <iostream.h>
4
5 int main()
6 {
7    int sum = O;
8
9    for (int number = 2; number <= 100; number += 2 )
10   sum += number;
11
12   cout << "Sum is "<< sum << endl;
13
14   return O;
15 }

  输出结果:
    sum  is 2550
                                  图2.20  用for语句求和
    
    编程技巧2.23
    尽管for前面的语句和for结构体的语句通常可以合并到for的首部中,但最好不要这么做,因为这样会使程序更难阅读。
    编程技巧1.24
    尽可能将控制结构首部的长度限制为一行。
    下列用for结构计算复利。考虑下列问题:
    一个人在银行存款1000.00美元,每利率为5%。假设所有利息留在账号中,则计算10年间每年年末的金额并打印出来。用下列公式求出金额:
    a=P(1+r)n
其中:
    P是原存款(本金)
    r是年利率
    n是年数
    a是年未本息
    这个问题要用一个循环对10年的存款进行计算。解答如图2.21
for结构执行循环体10次,将控制变量从1变到10,增量为1。C++中没有指数运算符,因此要用标准库函数pow。函数pow(x,y)计算x的y次方值。函数pow取两个类型为double的参数并返回double值。类型double与float相似,但double类型的变量能存放比float精度更大的数值。C++把常量(如图2.21中的1000.0和.05)当作double类型处理。
1 // Fig. 2.21: fig02_21.cpp
2 // Calculating compound interest
3 #include <iostream.h>
4 #include <iomanip.h>
5 #include <math.h>
6
7 int main()
8 {
9    double amount,           // amount on deposit
10         principal = 1000.0,  // starting principal
11         rate = .05;        // interest rate
12
13   cout << 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -