?? 02章 控制結(jié)構(gòu).txt
字號(hào):
counter=1;
聲明不是可執(zhí)行語(yǔ)句,但賦值是可執(zhí)行語(yǔ)句。我們用兩種方法將變量初始化。
下列語(yǔ)句:
++counter;
在每次循環(huán)時(shí)將循環(huán)計(jì)數(shù)器的值加1。while結(jié)構(gòu)中的循環(huán)條件測(cè)試控制變量的值是否小于或等于10
(條件為true的終值)。注意,即使控制變量是10時(shí),這個(gè)while結(jié)構(gòu)體仍然執(zhí)行??刂谱兞砍^(guò)10
時(shí)(即counter變成11時(shí)),循環(huán)終止。
圖2.16的程序也可以更加簡(jiǎn)化,將counter初始化為。并將while結(jié)構(gòu)換成:
while (++counter <= lO)
cout << counter << endl;
這段代碼減少了語(yǔ)句,直接在while條件中先增加計(jì)數(shù)器的值再測(cè)試條件。這段代碼還消除了while
結(jié)構(gòu)體的花括號(hào),因?yàn)檫@時(shí)while只包含一條語(yǔ)句。
常見(jiàn)編程錯(cuò)誤2.12
由于浮點(diǎn)值可能是近似值,用浮點(diǎn)變量控制計(jì)數(shù)循環(huán)可能導(dǎo)致不精確的計(jì)數(shù)器值,使測(cè)試的結(jié)果不準(zhǔn)確。
編程技巧2.15
編程技巧2.16
縮排每個(gè)控制結(jié)構(gòu)體中的語(yǔ)句。
編程技巧2.17
在每個(gè)控制結(jié)構(gòu)前后加上空行,使其在程序中一目了然。
編程技巧2.18
嵌套太多會(huì)使程序難以理解。一般來(lái)說(shuō),縮排不宜超過(guò)三層。
編程技巧2.19
在每個(gè)控制結(jié)構(gòu)前后加上空行,并縮排每個(gè)控制結(jié)構(gòu)體中的語(yǔ)句使程序產(chǎn)生二維效果,大大增加可讀性。
2.14 for重復(fù)結(jié)構(gòu)
for重復(fù)結(jié)構(gòu)處理計(jì)數(shù)器控制循環(huán)的所有細(xì)節(jié)。要演示for的功能,可以改寫(xiě)圖2.16的程序,結(jié)果如圖2.17。
執(zhí)行for重復(fù)結(jié)構(gòu)時(shí),聲明控制變量counter并將其初始化為1。然后檢查循環(huán)條件counter<=10。由于counter的初始值為1,因此條件滿足,打印Counter的值(1)。然后在表達(dá)式Counter++中遞增控制變量counter,再次進(jìn)行循環(huán)和測(cè)試循環(huán)條件。由于這時(shí)控制變量等于2,沒(méi)有超過(guò)最后值,因此程序再次執(zhí)行語(yǔ)句體。這個(gè)過(guò)程一直繼續(xù),直到控制變量counter遞增到11,使循環(huán)條件的測(cè)試失敗,重復(fù)終止。程序繼續(xù)執(zhí)行for結(jié)構(gòu)后面的第一條語(yǔ)句(這里是程序末尾的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結(jié)構(gòu)的計(jì)數(shù)器控制重復(fù)
圖2.18更進(jìn)一步研究了圖2.17中的for結(jié)構(gòu)。注意for結(jié)構(gòu)指定計(jì)數(shù)器控制重復(fù)所需的每個(gè)項(xiàng)目。如果for結(jié)構(gòu)體中有多條語(yǔ)句,則應(yīng)把語(yǔ)句體放在花括號(hào)中。
注意圖2.17用循環(huán)條件counter<=10。如果循環(huán)條件變?yōu)閏ounter<lO,則循環(huán)只執(zhí)行9次,這種常見(jiàn)的邏輯錯(cuò)誤稱(chēng)為差1錯(cuò)誤。
for
關(guān)鍵字 控制變量名 控制變量終值
↓ ↓ ↓
for ( int counter = 1; counter <= 10; counter++)
-------------
↑ ↑ ↑
控制變量初始化 循環(huán)條件 控制變量遞增
圖 2.18 典型for首部的組件
常見(jiàn)編程錯(cuò)誤2.13
while或for條件中使用不正確的關(guān)系運(yùn)算符和不正確的循環(huán)計(jì)數(shù)器終值會(huì)導(dǎo)致差1的錯(cuò)誤。
編程技巧2.20
在while或for條件中使用終值和用關(guān)系運(yùn)算符<=可以避免差1的錯(cuò)誤。例如,對(duì)打印1到10的循環(huán),循
環(huán)條件應(yīng)為counter<=10而不是counter<10(導(dǎo)致差1錯(cuò)誤)或counter(雖然正確)。許多程序員喜歡基
于O的計(jì)數(shù),在循環(huán)中重復(fù)10次.courter初姑化為O,循環(huán)條件測(cè)試為counter<10。
for結(jié)構(gòu)的一般格式如下:
for(expression1;expression2;expression3)
statement
其中expression1初始化循環(huán)控制變量的值,expression2是循環(huán)條件,expression3遞增控制變量。大
多數(shù)情況下,for結(jié)構(gòu)可以表示為等價(jià)的while結(jié)構(gòu):
expression1
while(expression2){
statement
expression3;
}
惟一的例外將在2.18節(jié)介紹。
如果for結(jié)構(gòu)首部中的expression1(初始化部分)定義控制變量(即控制變量類(lèi)型在變量名前
面指定).則該控制變量只能在for結(jié)構(gòu)體中使用,即控制變量值是for結(jié)構(gòu)之外所未知的。這種限
制控制變量名的用法稱(chēng)為變量的作用域(scope)。變量的作用域定義其在程序中的使用范圍。作用
域?qū)⒃诘?章“函數(shù)”中介紹。
常見(jiàn)編程錯(cuò)誤2.14
如果for結(jié)構(gòu)首部中的初始化部分定義控制變量,則在該結(jié)構(gòu)體之后使用這個(gè)控制變量是個(gè)語(yǔ)法錯(cuò)誤。
可移植性提示2.1
在新的C++草案標(biāo)準(zhǔn)中,for結(jié)構(gòu)初始化部分聲明的控制變量范圍與舊式的C++編譯器中不同。舊式的c++編譯器產(chǎn)生的C++代碼在支持新的C++草案標(biāo)準(zhǔn)妁編譯器中編譯時(shí)可能遭到破壞。可以用兩個(gè)編工程策略防止這個(gè)問(wèn)題:在每個(gè)for結(jié)構(gòu)中定義不同名稱(chēng)的控制變量或者在多個(gè)for結(jié)構(gòu)中定義相同名稱(chēng)的控制變量,并在第一個(gè)for循環(huán)之外和之前定義控制變量。
有時(shí),exprossion1和expression3是由逗號(hào)分開(kāi)的表達(dá)式列表。這里用逗號(hào)作為逗號(hào)運(yùn)算符(comma operator),保證從左向右求值表達(dá)式列表。逗號(hào)運(yùn)算符在所有C++運(yùn)算符中的優(yōu)先級(jí)量低。逗號(hào)分隔表達(dá)式列表的值和類(lèi)型是列表中最右邊表達(dá)式的值和類(lèi)型。逗號(hào)運(yùn)算符最常用于for結(jié)構(gòu),其主要用途是讓程序員使用多個(gè)初始化表達(dá)式或多個(gè)遞增表達(dá)式。例如,一個(gè)for結(jié)構(gòu)中可能有多個(gè)控制變量需要初始化和遞增。
編程技巧2.21
只把涉及控制變量的表達(dá)式放在for結(jié)構(gòu)的初始化和遞增部分。其他變量的操作應(yīng)放在循環(huán)之前(如果像初初化語(yǔ)句一樣只執(zhí)行一次)或循環(huán)體中(如果對(duì)每個(gè)循環(huán)環(huán)執(zhí)行一次,如遞增和遞減語(yǔ)句)。
for結(jié)構(gòu)中的三個(gè)表達(dá)式是可選的。如果省略expression2,則C++假設(shè)循環(huán)條件為真,從而生成無(wú)限循環(huán)。如果程序其他地方初始化控制變量,則可以省略expression1。如果for語(yǔ)句體中的語(yǔ)句計(jì)算增量或不需要增量,則可以省略expression3。for結(jié)構(gòu)中的增量表達(dá)式就像是for語(yǔ)句體末尾的獨(dú)立語(yǔ)句。因此,下列表達(dá)式:
counter = counter + 1;
counter += 1;
++counter;
counter++;
在for結(jié)構(gòu)的遞增部分都是等價(jià)的。許多程序員喜歡counter++,因?yàn)檫f增在執(zhí)行循環(huán)體之后發(fā)生,因此,后置自增形式似乎更自然。由于這里遞增的變量沒(méi)有出現(xiàn)在表達(dá)式中,因此前置自增與后置自增的效果相同。for結(jié)構(gòu)首部中的兩個(gè)分號(hào)是必需的。
常見(jiàn)編程錯(cuò)誤2.15
for結(jié)構(gòu)首部中的兩個(gè)分號(hào)改成逗號(hào)會(huì)造成語(yǔ)法錯(cuò)誤。
常見(jiàn)編程錯(cuò)誤2.16
將分號(hào)放在for結(jié)構(gòu)首部的右括號(hào)后面令使該for結(jié)構(gòu)體變?yōu)榭照Z(yǔ)句.通常是個(gè)邏輯錯(cuò)誤。
軟件工程視點(diǎn)2.9
將分號(hào)放在緊接著for結(jié)構(gòu)首部的后面有時(shí)可以生成所謂的延遲循環(huán)。這種for的循環(huán)體是空語(yǔ)句,表示計(jì)算空循環(huán)的次數(shù)。例如,可以用空循環(huán)減慢程序速度,以避免其在屏幕上輸出太快,無(wú)法閱讀。
for結(jié)構(gòu)的初始化、循環(huán)條件和遞增部分可以用算術(shù)表達(dá)式。例如,假設(shè)x=2和y=10,如果x和y的值在循環(huán)體中不被修改,則下列語(yǔ)句:
for (int j= x; j <= 4* x* y; j += y/ x )
等于下列語(yǔ)句:
for(int j=2;j<=80;j+=5)
for結(jié)構(gòu)的增量也可能是負(fù)數(shù)(實(shí)際上是遞減,循環(huán)向下計(jì)數(shù))。
如果循環(huán)條件最初為false,則for結(jié)構(gòu)體不執(zhí)行,執(zhí)行for后面的語(yǔ)句。
for結(jié)構(gòu)中經(jīng)常打印控制變量或用控制變量進(jìn)行計(jì)算,控制變量常用于控制重復(fù)而不在for結(jié)構(gòu)
體中提及這些控制變量。
編程技巧2.22
盡管控制變量值可以在for循環(huán)體中改變,但最好不要這樣做,固為這樣可能造成一定的邏輯錯(cuò)誤。
for結(jié)構(gòu)的流程圖與while結(jié)構(gòu)相似。例如,圖2.19顯示了下列for語(yǔ)句的流程圖:
for(int counter=l;counter>=10;counter++)
cout<< counter<< endl;
從這個(gè)流程圖可以看出初始化發(fā)生一次,井在每次執(zhí)行結(jié)構(gòu)體語(yǔ)句之后遞增。注意,流程圖(除了小圓框和流程之外)也只能包含表示操作的矩形框和表示判斷的菱形框。這是我們強(qiáng)調(diào)的操作/判斷編程模型。程序員的任務(wù)就是根據(jù)算法使用堆棧和嵌套兩種方法組合其他幾種控制結(jié)構(gòu),然后在這些框中填入算法所要的操作和判斷,從而生成程序。
2.15 for結(jié)構(gòu)使用舉例
下面的例子顯示for結(jié)構(gòu)中改變控制變量的方法。在每個(gè)例子中.我們都編寫(xiě)相應(yīng)的for結(jié)構(gòu)首部。注意循環(huán)中遞減控制變量的關(guān)系運(yùn)算符的改變。
a)將控制變量從1變到100,增量為1。
for(int i=l;i<=100;i++)
b)將控制變量從100變到1,增量為-1。
for(int i=100;i>=1; i--)
常見(jiàn)編程錯(cuò)誤2.17
循環(huán)向下計(jì)數(shù)時(shí)如果循環(huán)條件中不使用正確的關(guān)系運(yùn)算符(如在向下計(jì)算到1的循環(huán)中使用i<=1)通常是個(gè)邏輯錯(cuò)誤,會(huì)在程序運(yùn)行時(shí)產(chǎn)生錯(cuò)誤結(jié)果。
c)控制變量的變化范圍為7到77。
for(int i= 7;i <= 77; i+= 7)
d)控制變量的變化范圍為20到2。
for(int i=20;i>=2;i-=2)
c)按所示數(shù)列改變控制變量值:2、‘、8、11、14、17、20。
for(int j=2;j<=20;j+=3)
f)按所示數(shù)列改變控制變量值:99、88、77、66、55、44、33、22、ll、O。
for(int j=99; j>=O; j-=11)
下面兩個(gè)例子提供for結(jié)構(gòu)的簡(jiǎn)單應(yīng)用。圖2.20所示的程序用for結(jié)構(gòu)求2到100的所有整數(shù)的總和。
注意圖2.20中for結(jié)構(gòu)體可以用下列逗號(hào)運(yùn)算符合并成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 }
輸出結(jié)果:
sum is 2550
圖2.20 用for語(yǔ)句求和
編程技巧2.23
盡管for前面的語(yǔ)句和for結(jié)構(gòu)體的語(yǔ)句通??梢院喜⒌絝or的首部中,但最好不要這么做,因?yàn)檫@樣會(huì)使程序更難閱讀。
編程技巧1.24
盡可能將控制結(jié)構(gòu)首部的長(zhǎng)度限制為一行。
下列用for結(jié)構(gòu)計(jì)算復(fù)利。考慮下列問(wèn)題:
一個(gè)人在銀行存款1000.00美元,每利率為5%。假設(shè)所有利息留在賬號(hào)中,則計(jì)算10年間每年年末的金額并打印出來(lái)。用下列公式求出金額:
a=P(1+r)n
其中:
P是原存款(本金)
r是年利率
n是年數(shù)
a是年未本息
這個(gè)問(wèn)題要用一個(gè)循環(huán)對(duì)10年的存款進(jìn)行計(jì)算。解答如圖2.21
for結(jié)構(gòu)執(zhí)行循環(huán)體10次,將控制變量從1變到10,增量為1。C++中沒(méi)有指數(shù)運(yùn)算符,因此要用標(biāo)準(zhǔn)庫(kù)函數(shù)pow。函數(shù)pow(x,y)計(jì)算x的y次方值。函數(shù)pow取兩個(gè)類(lèi)型為double的參數(shù)并返回double值。類(lèi)型double與float相似,但double類(lèi)型的變量能存放比f(wàn)loat精度更大的數(shù)值。C++把常量(如圖2.21中的1000.0和.05)當(dāng)作double類(lèi)型處理。
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 <<
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -