C++程序設(shè)計(jì)第2章1_第1頁(yè)
C++程序設(shè)計(jì)第2章1_第2頁(yè)
C++程序設(shè)計(jì)第2章1_第3頁(yè)
C++程序設(shè)計(jì)第2章1_第4頁(yè)
C++程序設(shè)計(jì)第2章1_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、習(xí)題:習(xí)題: C+程序設(shè)計(jì)實(shí)踐教程程序設(shè)計(jì)實(shí)踐教程 1. 實(shí)驗(yàn)四實(shí)驗(yàn)四 P15 3(求解約瑟夫問題)(求解約瑟夫問題) 2. 實(shí)驗(yàn)五實(shí)驗(yàn)五 P17 2(求水仙花數(shù))(求水仙花數(shù))周一下午上機(jī)實(shí)驗(yàn)周一下午上機(jī)實(shí)驗(yàn) 習(xí)題上機(jī)調(diào)試并上傳(要求程序事先編寫好寫在本子上,上機(jī)時(shí)習(xí)題上機(jī)調(diào)試并上傳(要求程序事先編寫好寫在本子上,上機(jī)時(shí)輸入調(diào)試,要檢查的)。輸入調(diào)試,要檢查的)。預(yù)習(xí):預(yù)習(xí): 第第3章章3.13.2問題:?jiǎn)栴}:1. 下面程序段,為了使輸出結(jié)果:下面程序段,為了使輸出結(jié)果:n=4,則,則x的輸入值應(yīng)的輸入值應(yīng)該滿足條件是什么?該滿足條件是什么? int m=1,n=1,x,y;cinxy;if

2、(x0)m=m+1;if(xy)n=n+m;else if(x=y) n=5;else n=2*m;coutm 0 ; xy2. 執(zhí)行下面程序段,變量執(zhí)行下面程序段,變量n的值是的值是 int n=10;switch(n) case 9: n-=1; case 10: n+=1; case 11: n-; case 12: n+; default: +n;cout nendl; 123.下面程序段,下面程序段,while循環(huán)執(zhí)行了多少次?循環(huán)執(zhí)行了多少次? int x=10; while(x=0) x=x-1;4. 下面下面for循環(huán)中的輸入語(yǔ)句最少可以執(zhí)行多少次,最多循環(huán)中的輸入語(yǔ)句最少可以

3、執(zhí)行多少次,最多可以執(zhí)行多少次?可以執(zhí)行多少次? int a,b; for(a=0,b=0;b!=10&ab;最少最少1次,最多次,最多5次次2.4 轉(zhuǎn)向語(yǔ)句轉(zhuǎn)向語(yǔ)句break 語(yǔ)句語(yǔ)句continue 語(yǔ)句語(yǔ)句goto 語(yǔ)句語(yǔ)句return 語(yǔ)句語(yǔ)句功能功能: : 使程序執(zhí)行點(diǎn)從一處轉(zhuǎn)移到另一處。使程序執(zhí)行點(diǎn)從一處轉(zhuǎn)移到另一處。 break語(yǔ)句只能用在語(yǔ)句只能用在switch語(yǔ)句語(yǔ)句和和循環(huán)語(yǔ)句循環(huán)語(yǔ)句中,用來(lái)跳出中,用來(lái)跳出switch語(yǔ)句或提前終止循環(huán),轉(zhuǎn)去語(yǔ)句或提前終止循環(huán),轉(zhuǎn)去執(zhí)行執(zhí)行switch語(yǔ)句或循環(huán)語(yǔ)句之后的語(yǔ)句。語(yǔ)句或循環(huán)語(yǔ)句之后的語(yǔ)句。 break語(yǔ)句:語(yǔ)句:在在

4、for循環(huán)中可以用循環(huán)中可以用break結(jié)束循環(huán):結(jié)束循環(huán):for(; ;) if() break; 該程序產(chǎn)生的輸出是該程序產(chǎn)生的輸出是:i=0i=1提前結(jié)束循環(huán)提前結(jié)束循環(huán) coutti= it endl; cout“提前結(jié)束循環(huán)提前結(jié)束循環(huán)”endl; return 0; #include using namespace std;int main( ) for (int i=0; i4; i+)if (i= =2) break; /i為為2時(shí)結(jié)束循環(huán)時(shí)結(jié)束循環(huán) 例例:例:例:#include using namespace std;int main( ) bool test=true;

5、int i=0; while(test) i+; couti=10) break; return 0;程序能否結(jié)束?程序能否結(jié)束? continue語(yǔ)句只能用在語(yǔ)句只能用在循環(huán)語(yǔ)句循環(huán)語(yǔ)句中,用來(lái)中,用來(lái)終止本次循環(huán)終止本次循環(huán)。當(dāng)程序執(zhí)行到。當(dāng)程序執(zhí)行到continue語(yǔ)句語(yǔ)句時(shí),將跳過其后尚未執(zhí)行的循環(huán)體語(yǔ)句,時(shí),將跳過其后尚未執(zhí)行的循環(huán)體語(yǔ)句,開始下一次循環(huán)開始下一次循環(huán)。下一次循環(huán)是否執(zhí)行仍。下一次循環(huán)是否執(zhí)行仍然取決于循環(huán)條件的判斷。然取決于循環(huán)條件的判斷。 continue語(yǔ)句:語(yǔ)句:continue語(yǔ)句與語(yǔ)句與break語(yǔ)句的區(qū)別:語(yǔ)句的區(qū)別:continue語(yǔ)句結(jié)束的只是語(yǔ)句結(jié)

6、束的只是本次循環(huán)本次循環(huán),而而break結(jié)束的是結(jié)束的是整個(gè)循環(huán)整個(gè)循環(huán)。 輸出:輸出: i = 0 1 3 coutti=“it”; coutendl; return 0; #include using namespace std;void main( ) for (int i=0; i4; i+)if (i= =2) continue; 例:例:int main ( ) for (int i = 0; i 3; i+) switch (i) case 0: couti is 0endl; continue; case 1: couti is 1endl; break; case 2: co

7、uti is 2endl; break; coutBBBendl; return 0; 輸出輸出:i is 0 i is 1 BBB/ /跳過當(dāng)前一次循環(huán)跳過當(dāng)前一次循環(huán)/結(jié)束結(jié)束switch語(yǔ)句語(yǔ)句 goto語(yǔ)句和標(biāo)號(hào)語(yǔ)句一起使用,控制程序從語(yǔ)句和標(biāo)號(hào)語(yǔ)句一起使用,控制程序從goto語(yǔ)語(yǔ)句所在的地方轉(zhuǎn)移到標(biāo)號(hào)語(yǔ)句處。句所在的地方轉(zhuǎn)移到標(biāo)號(hào)語(yǔ)句處。goto語(yǔ)句:語(yǔ)句:goto語(yǔ)句格式語(yǔ)句格式: goto label; 標(biāo)號(hào)格式標(biāo)號(hào)格式: label: S(任一任一C+語(yǔ)句)語(yǔ)句)缺點(diǎn):缺點(diǎn):goto語(yǔ)句會(huì)導(dǎo)致程序結(jié)構(gòu)混亂,可讀性降低,其所語(yǔ)句會(huì)導(dǎo)致程序結(jié)構(gòu)混亂,可讀性降低,其所完成的功能完全可

8、以用算法的三種基本結(jié)構(gòu)實(shí)現(xiàn)。完成的功能完全可以用算法的三種基本結(jié)構(gòu)實(shí)現(xiàn)。優(yōu)點(diǎn):優(yōu)點(diǎn):在多層循環(huán)嵌套中,要從深層地方跳出所有循環(huán),在多層循環(huán)嵌套中,要從深層地方跳出所有循環(huán),如果用如果用break語(yǔ)句,不僅要使用多次,而且可讀性較差,語(yǔ)句,不僅要使用多次,而且可讀性較差,這時(shí)這時(shí)goto語(yǔ)句可以發(fā)揮作用。語(yǔ)句可以發(fā)揮作用。 int main ( ) int i = 0; while (true) i+; for (int j = 0; j 10; j+) i += j; if (j = 3) break; goto dl; dl: coutiendl; return 0; 輸出:輸出:1retu

9、rn語(yǔ)句用于結(jié)束函數(shù)的執(zhí)行,返回調(diào)用者,語(yǔ)句用于結(jié)束函數(shù)的執(zhí)行,返回調(diào)用者,如果是主函數(shù),則返回至操作系統(tǒng)。如果是主函數(shù),則返回至操作系統(tǒng)。return語(yǔ)句:語(yǔ)句:2.6 常用算法的應(yīng)用實(shí)例常用算法的應(yīng)用實(shí)例【例例2.20】世界數(shù)學(xué)史上著名的世界數(shù)學(xué)史上著名的“百雞問題百雞問題”【例例2.21】用歐基里德算法(也稱輾轉(zhuǎn)法)用歐基里德算法(也稱輾轉(zhuǎn)法) 求兩個(gè)整數(shù)的最大公約數(shù)求兩個(gè)整數(shù)的最大公約數(shù)【例例2.23】輸入一個(gè)輸入一個(gè)8位二進(jìn)制數(shù),將其轉(zhuǎn)換位二進(jìn)制數(shù),將其轉(zhuǎn)換為十進(jìn)制數(shù)輸出。為十進(jìn)制數(shù)輸出。【例例2.19】 用篩選法求用篩選法求100之內(nèi)的所有素?cái)?shù)之內(nèi)的所有素?cái)?shù)【例例2.22】輸入一個(gè)

10、小于輸入一個(gè)小于1的數(shù)的數(shù)x,求,求sinx的的近似值近似值 基本思想:基本思想:逐個(gè)考察每個(gè)可能的答案,逐個(gè)考察每個(gè)可能的答案, 從而確定問題的解答。從而確定問題的解答。 窮舉法又稱為枚舉法。窮舉法又稱為枚舉法。 適用場(chǎng)合:適用場(chǎng)合:?jiǎn)栴}的可能答案是有限個(gè),問題的可能答案是有限個(gè), 而且這些可而且這些可 能的答案是事先知道的。能的答案是事先知道的。1.直接法直接法直接法是根據(jù)問題給出的條件直接求解。直接法是根據(jù)問題給出的條件直接求解。 【例例2.19】 用篩選法求用篩選法求100之內(nèi)的所有素?cái)?shù),并將這些之內(nèi)的所有素?cái)?shù),并將這些素?cái)?shù)輸出。素?cái)?shù)輸出。算法一算法一 窮舉法:窮舉法:分析:分析: 素

11、數(shù)是除了素?cái)?shù)是除了1和自身外不能被其它正整數(shù)整除的自和自身外不能被其它正整數(shù)整除的自然數(shù),如然數(shù),如2,3,5等等。 for(m=2;m=100;m+)/窮舉法窮舉法 if(m是素?cái)?shù))按要求的格式輸出是素?cái)?shù))按要求的格式輸出m;k= sqrt(m); for(i=2;i=k;i+) / /窮舉法(求某一個(gè)數(shù)是否素?cái)?shù))窮舉法(求某一個(gè)數(shù)是否素?cái)?shù)) if(m%i=0) break; /m/m不是素?cái)?shù)不是素?cái)?shù)if (i=k) m是素?cái)?shù)是素?cái)?shù); /剛才的剛才的for是由是由break結(jié)束的結(jié)束的分析分析 算法二算法二 篩選法:篩選法:1、一個(gè)數(shù)如果是其他數(shù)的倍數(shù),則這個(gè)數(shù)肯定不是素、一個(gè)數(shù)如果是其他數(shù)

12、的倍數(shù),則這個(gè)數(shù)肯定不是素?cái)?shù);數(shù);2、在由、在由 多個(gè)大于多個(gè)大于1的數(shù)的數(shù) 組成的集合中,剔除所有的非組成的集合中,剔除所有的非素?cái)?shù),剩下的就都是素?cái)?shù)了;素?cái)?shù),剩下的就都是素?cái)?shù)了;綜上述,得到算法二(及所需的相應(yīng)數(shù)據(jù)):綜上述,得到算法二(及所需的相應(yīng)數(shù)據(jù)): 1、將、將100之內(nèi)的整數(shù)映射到一個(gè)集合。之內(nèi)的整數(shù)映射到一個(gè)集合。可以采用一個(gè)數(shù)可以采用一個(gè)數(shù) 組組a來(lái)表示,數(shù)組元素值為各個(gè)整數(shù)來(lái)表示,數(shù)組元素值為各個(gè)整數(shù); 2、在數(shù)組、在數(shù)組a中,從素?cái)?shù)中,從素?cái)?shù)2開始剔除掉新找到的素?cái)?shù)的整開始剔除掉新找到的素?cái)?shù)的整 數(shù)倍的元素值(置數(shù)倍的元素值(置0,非素?cái)?shù));,非素?cái)?shù)); 3、輸出數(shù)組、輸

13、出數(shù)組a中數(shù)組元素值非中數(shù)組元素值非0的元素,他們都是素?cái)?shù)。的元素,他們都是素?cái)?shù)。算法二算法二 第第 2步步 的細(xì)化的細(xì)化(篩選法篩選法):):for (i=0; i=99; i+) /數(shù)組下標(biāo)數(shù)組下標(biāo)099,元素值,元素值1100 2.1、 if (ai=0) continue; / ai已被定為非素?cái)?shù),并已被篩掉已被定為非素?cái)?shù),并已被篩掉 2.2、將數(shù)組中所有是、將數(shù)組中所有是ai倍數(shù)的元素置倍數(shù)的元素置0; for( j=i+1;j=99;j+) if(aj%ai=0) aj=0; #include#includeusing namespace std;const int n=100;i

14、nt main() int an; int i,j; for(i=0;in;i+) ai=1+i; / /用數(shù)組保存整數(shù)用數(shù)組保存整數(shù)1-100 a0=0; / /1不是素?cái)?shù),置不是素?cái)?shù),置0 for(i=1;in;i+) if(ai=0) continue; / /該數(shù)已經(jīng)置該數(shù)已經(jīng)置0, ,判斷下一個(gè)判斷下一個(gè) for(j=i+1;jn;j+)if(aj%ai=0) aj=0; / /是是ai倍數(shù)的元素置倍數(shù)的元素置0; 程序:程序:int count=0; / /計(jì)數(shù)器計(jì)數(shù)器cout1 n之間的素?cái)?shù)之間的素?cái)?shù):endl;for(i=0;in;i+) / /輸出所有素?cái)?shù)輸出所有素?cái)?shù)if(a

15、i!=0) coutsetw(6)ai; count+; if(count%10=0) coutendl; / /每行每行1010個(gè)個(gè)coutendl;return 0;運(yùn)行結(jié)果:運(yùn)行結(jié)果:1-100之間的素?cái)?shù):之間的素?cái)?shù):2 3 5 7 11 13 17 19 23 2931 37 41 43 47 53 59 61 67 7173 79 83 89 97除了除了2外外,以后的數(shù)中凡是偶數(shù)不可能是素?cái)?shù)以后的數(shù)中凡是偶數(shù)不可能是素?cái)?shù)【例例2.20】 世界數(shù)學(xué)史上著名的世界數(shù)學(xué)史上著名的“百雞問題百雞問題”:雞翁一,:雞翁一,值錢五,雞母一,值錢三,雞雛三,值錢一。百錢買百值錢五,雞母一,值錢三

16、,雞雛三,值錢一。百錢買百雞,問雞翁、母、雛各幾何?雞,問雞翁、母、雛各幾何?分析:設(shè)雞翁、母、雛分別為分析:設(shè)雞翁、母、雛分別為i,j,k,根據(jù)題意可得:,根據(jù)題意可得: i*5+j*3+k/3*1=100; i+j+k=100;兩個(gè)方程無(wú)法解出三個(gè)變量,只能將各種可能的取值代兩個(gè)方程無(wú)法解出三個(gè)變量,只能將各種可能的取值代入,其中能滿足兩個(gè)方程的就是所需的解。入,其中能滿足兩個(gè)方程的就是所需的解。 i、j、k可能的取值有哪些?分析可知,百錢最多可可能的取值有哪些?分析可知,百錢最多可買雞翁買雞翁20,雞母,雞母33,雞雛,雞雛300。 2. 枚舉法枚舉法也稱窮舉法枚舉法枚舉法也稱窮舉法算法

17、:算法:for (i=0; i=20;i+) / /雞翁雞翁for (j=0; j=33;j+) / /母雞母雞 for (k=0; k=300;k+) / /雛雞雛雞 if (i+j+k=100)&(5*i+3*j+k/3=100) coutijk; 算法使用三重循環(huán),執(zhí)行時(shí)間函數(shù)是立方階,循環(huán)體算法使用三重循環(huán),執(zhí)行時(shí)間函數(shù)是立方階,循環(huán)體將執(zhí)行將執(zhí)行20*33*300=198000次。次。希望:希望:改進(jìn)算法,減少循環(huán),縮短運(yùn)行時(shí)間。改進(jìn)算法,減少循環(huán),縮短運(yùn)行時(shí)間。算法改進(jìn)為:算法改進(jìn)為:for (i=0; i+=20;) for (j=0; j+=33;) if ( 5*i+

18、3*j+(100-i-j)/3=100 ) coutijk;分析:分析: 當(dāng)當(dāng)i、j確定時(shí),確定時(shí),k就可由題目要求確定為就可由題目要求確定為100-i-j,所以,所以只要用只要用i、j去測(cè)試,用錢數(shù)檢測(cè)就可以了。去測(cè)試,用錢數(shù)檢測(cè)就可以了。循環(huán)體將執(zhí)行循環(huán)體將執(zhí)行: 20*33=660次。次。程序:程序:#include #include using namespace std;int main() int i,j,k; cout 公雞公雞 母雞母雞 小雞小雞endl; for(i=0;i=20;i+) for(j=0;j=33;j+) k=100-i-j; if(5*i+3*j+k/3=1

19、00)& (k%3=0) ) / /注意注意(k%3=0)(k%3=0)非常重要,想一想為什么非常重要,想一想為什么 coutsetw(6)isetw(10)jsetw(10)kendl; return 0;程序運(yùn)行結(jié)果:程序運(yùn)行結(jié)果:公雞公雞母雞母雞小雞小雞 0 25 75 4 18 78 8 11 81 12 4 84【例例2.21】 用歐基里德算法(也稱輾轉(zhuǎn)法)求兩用歐基里德算法(也稱輾轉(zhuǎn)法)求兩個(gè)整數(shù)的最大公約數(shù)。個(gè)整數(shù)的最大公約數(shù)。3.遞推法:遞推法:遞推算法是通過問題的一個(gè)或多個(gè)已知解,用遞推算法是通過問題的一個(gè)或多個(gè)已知解,用同樣的方法逐個(gè)推算出其他解,如數(shù)列問題,近似計(jì)

20、算問同樣的方法逐個(gè)推算出其他解,如數(shù)列問題,近似計(jì)算問題等,通常也要借助于循環(huán)結(jié)構(gòu)完成。題等,通常也要借助于循環(huán)結(jié)構(gòu)完成。輾轉(zhuǎn)法:輾轉(zhuǎn)法: 設(shè)有兩個(gè)數(shù)設(shè)有兩個(gè)數(shù)num1和和num2,假設(shè),假設(shè)num1比較大。比較大。令余數(shù)令余數(shù)r = num1 % num2。 若若r = 0,當(dāng)前,當(dāng)前num2就是最大公約數(shù)。就是最大公約數(shù)。 否則若否則若r != 0,令,令num1 = num2(除數(shù)變被除數(shù)),(除數(shù)變被除數(shù)),num2 = r(余數(shù)變除數(shù)),再做(余數(shù)變除數(shù)),再做 r = num1 % num2。遞歸,直到遞歸,直到r = 0為止。為止。 程序:程序:int main( )int nu

21、m1,num2,resd; cout輸入兩個(gè)整數(shù)輸入兩個(gè)整數(shù):num1num2;coutnum1和和num2的最大公約數(shù)為的最大公約數(shù)為:;for(;)resd=num1%num2;if(resd = = 0) break; /num2就是最大公約數(shù)就是最大公約數(shù)num1=num2; num2=resd;coutnum2endl; return 0;【例例2.22】 輸入一個(gè)小于輸入一個(gè)小于1的數(shù)的數(shù)x,求,求sinx的近似值,要的近似值,要求誤差小于求誤差小于0.0001。近似計(jì)算公式如下:。近似計(jì)算公式如下: ! 7x! 5x! 3xx)xsin(753分析:分析:這個(gè)近似計(jì)算可以看作一個(gè)

22、累加過程,關(guān)鍵在于累這個(gè)近似計(jì)算可以看作一個(gè)累加過程,關(guān)鍵在于累加項(xiàng)數(shù)的確定。該求近似值的奇次多項(xiàng)式各項(xiàng)順序改變符加項(xiàng)數(shù)的確定。該求近似值的奇次多項(xiàng)式各項(xiàng)順序改變符號(hào),若取前號(hào),若取前n項(xiàng)累加和作為項(xiàng)累加和作為sin(x)的近似值,則第的近似值,則第n+1項(xiàng)的項(xiàng)的絕對(duì)值就是誤差限。因此可以這樣考慮,若公式中絕對(duì)值就是誤差限。因此可以這樣考慮,若公式中第一項(xiàng)第一項(xiàng)作為累加和的初值作為累加和的初值,則,則第二項(xiàng)就是誤差第二項(xiàng)就是誤差,如果誤差不滿足,如果誤差不滿足要求,則將該項(xiàng)累加到累加和上,進(jìn)而用該項(xiàng)推出第三項(xiàng),要求,則將該項(xiàng)累加到累加和上,進(jìn)而用該項(xiàng)推出第三項(xiàng),第三項(xiàng)又是新的累加和的誤差。經(jīng)過

23、這樣累加、遞推,第三項(xiàng)又是新的累加和的誤差。經(jīng)過這樣累加、遞推,直至滿足要求為止。如果用直至滿足要求為止。如果用item保存第保存第n項(xiàng),則推出第項(xiàng),則推出第n+1項(xiàng)的方法為:項(xiàng)的方法為: itemitem*x*x/(2*n)*(2*n+1)程序:程序:int main()const double epsilon=0.0001; /用用epsilon保存誤差保存誤差double x,sinx,item;int n=2,sign=-1; /sign保存符號(hào)保存符號(hào)coutx;sinx=x; item=x*x*x/6; / /第一項(xiàng)作為初值,第二項(xiàng)為誤差項(xiàng)第一項(xiàng)作為初值,第二項(xiàng)為誤差項(xiàng)while(

24、itemepsilon) sinx=sinx+item*sign; / /將當(dāng)前項(xiàng)累加進(jìn)結(jié)果,注意符號(hào)作為因子將當(dāng)前項(xiàng)累加進(jìn)結(jié)果,注意符號(hào)作為因子 item=item*x*x/(2*n)*(2*n+1); / /推算新的誤差項(xiàng)推算新的誤差項(xiàng) sign=-sign; / /注意符號(hào)的變換注意符號(hào)的變換 n+;coutsin(x)=sinx=0;i-) /系數(shù)從系數(shù)從a n 到到a 0 依次運(yùn)算依次運(yùn)算 dec = dec * x +(bini - 0 ); / (bini - 0 ):數(shù)字字符轉(zhuǎn)換為數(shù)字):數(shù)字字符轉(zhuǎn)換為數(shù)字程序:程序:const int n=8;int main() char

25、binn; int x=2,a,dec,i; cout輸入二進(jìn)制序列:輸入二進(jìn)制序列:=0;i-) cinbini; /先輸入的是高位先輸入的是高位 dec=0; for(i=n-1;i=0;i-)a=bini-0; /數(shù)字字符轉(zhuǎn)換為數(shù)字?jǐn)?shù)字字符轉(zhuǎn)換為數(shù)字dec= dec*x+a; / cout=0;i-) coutbini; cout)的值為的值為:decendl; return 0;nn-1n-2nn-1n-210a xaxaxa xa2.7 枚舉類型枚舉類型 2.7.1 枚舉類型的定義枚舉類型的定義 2.7.2 枚舉變量的使用枚舉變量的使用 枚舉類型枚舉類型(enumerate)(enu

26、merate)是是c+c+中的一種派生數(shù)據(jù)類中的一種派生數(shù)據(jù)類型,它是用戶定義的若干枚舉常量的集合。型,它是用戶定義的若干枚舉常量的集合。枚舉類型的變量,只能取枚舉常量表中所列的值。枚舉類型的變量,只能取枚舉常量表中所列的值。定義枚舉類型的主要目的是增加程序的可讀性。定義枚舉類型的主要目的是增加程序的可讀性。 2.7.1 枚舉類型的定義枚舉類型的定義 枚舉類型定義:枚舉類型定義:enum ;關(guān)鍵字關(guān)鍵字enum指明其后的標(biāo)識(shí)符是一個(gè)類型的名字,枚舉常量指明其后的標(biāo)識(shí)符是一個(gè)類型的名字,枚舉常量表中列出該類型的所有取值,各枚舉常量之間以表中列出該類型的所有取值,各枚舉常量之間以“,”間隔。間隔。

27、例:例:enmu color_set1 RED, BLUE, WHITE, BLACK;enum week Sun, Mon, Tue, Wed, Thu, Fri, Sat;枚舉常量(或稱枚舉成員)是以標(biāo)識(shí)符形式表示的整型量,枚舉常量(或稱枚舉成員)是以標(biāo)識(shí)符形式表示的整型量,非法定義實(shí)例:非法定義實(shí)例:enum letter_set a, d, F, s, T;/枚舉常量只能是標(biāo)識(shí)符枚舉常量只能是標(biāo)識(shí)符enum year_set2000,2001,2002,2003,2004,2005; /改為改為y2000等則正確等則正確2.7.1 枚舉類型的定義枚舉類型的定義 枚舉常量:枚舉常量: 枚

28、舉常量代表該枚舉類型的變量可能取的值,編譯系統(tǒng)為枚舉常量代表該枚舉類型的變量可能取的值,編譯系統(tǒng)為每個(gè)枚舉常量指定一個(gè)整數(shù)值,缺省狀態(tài)下,這個(gè)整數(shù)就是每個(gè)枚舉常量指定一個(gè)整數(shù)值,缺省狀態(tài)下,這個(gè)整數(shù)就是所列舉元素的序號(hào),序號(hào)從所列舉元素的序號(hào),序號(hào)從0開始。如上例中開始。如上例中RED、 BLUE、 WHITE、 BLACK的值分別為的值分別為0、1、2、3。 用戶也可以在類型定義時(shí)為部分或全部枚舉常量指定整數(shù)用戶也可以在類型定義時(shí)為部分或全部枚舉常量指定整數(shù)值,在第一個(gè)指定值之前的枚舉常量仍按缺省方式取值,而值,在第一個(gè)指定值之前的枚舉常量仍按缺省方式取值,而指定值之后的枚舉常量按依次加指定

29、值之后的枚舉常量按依次加1的原則取值。的原則取值。各枚舉常量各枚舉常量的值可以重復(fù),但各枚舉常量標(biāo)識(shí)符必須不同的值可以重復(fù),但各枚舉常量標(biāo)識(shí)符必須不同。例:例:enum fruit_set apple, orange, banana=1, peach, grapeenum week Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat;枚舉常量枚舉常量apple、orange、banana、peach、grape的值分別的值分別為為0、1、1、2、3。枚舉常量枚舉常量Sun, Mon, Tue, Wed, Thu, Fri, Sat的值分別為的值分別為7、1、2、3、4、

30、5、6。2.7.2 枚舉類型的變量的使用枚舉類型的變量的使用 枚舉類型應(yīng)用要點(diǎn):枚舉類型應(yīng)用要點(diǎn):1、定義枚舉類型之后,就可以定義枚舉類型的變量;亦可類、定義枚舉類型之后,就可以定義枚舉類型的變量;亦可類型與變量同時(shí)定義(甚至類型名可?。盒团c變量同時(shí)定義(甚至類型名可?。篶olor_set1 color1, color2;enum Sun, Mon, Tue, Wed, Thu, Fri, Sat weekday1, weekday2;2、枚舉變量的取值范圍就是整型數(shù)的一個(gè)子集。枚舉變量占、枚舉變量的取值范圍就是整型數(shù)的一個(gè)子集。枚舉變量占用內(nèi)存的大小與整型數(shù)相同。用內(nèi)存的大小與整型數(shù)相同

31、。3、枚舉變量允許的操作只有賦值和關(guān)系運(yùn)算;如:、枚舉變量允許的操作只有賦值和關(guān)系運(yùn)算;如: color3=color4=BLUE; if (color3=color4) cout”相等相等”; cout color3color1/非法非法 coutcolor3/合法,輸出的是合法,輸出的是2 從程序的合法性和可讀性出發(fā),枚舉變量的輸入輸出一般從程序的合法性和可讀性出發(fā),枚舉變量的輸入輸出一般都采用都采用switch語(yǔ)句將其轉(zhuǎn)換為字符或字符串。同時(shí),枚舉類語(yǔ)句將其轉(zhuǎn)換為字符或字符串。同時(shí),枚舉類型數(shù)據(jù)的其他處理也往往應(yīng)用型數(shù)據(jù)的其他處理也往往應(yīng)用switch語(yǔ)句。語(yǔ)句。【例例2.24】 口袋中

32、有紅、黃、藍(lán)、白、黑五種顏色口袋中有紅、黃、藍(lán)、白、黑五種顏色的球若干個(gè),每次從口袋中取三個(gè)不同顏色的球,的球若干個(gè),每次從口袋中取三個(gè)不同顏色的球,統(tǒng)計(jì)并輸出所有的取法。統(tǒng)計(jì)并輸出所有的取法。分析:分析: 每個(gè)球的顏色都是這五種顏色之一,可以使用枚舉每個(gè)球的顏色都是這五種顏色之一,可以使用枚舉類型來(lái)定義球的顏色。類型來(lái)定義球的顏色。 假設(shè)所取三個(gè)球的顏色分別為假設(shè)所取三個(gè)球的顏色分別為i, j, k, 每個(gè)量都有每個(gè)量都有5種種取值。(使用嵌套循環(huán))取值。(使用嵌套循環(huán)) 外循環(huán):外循環(huán):i從從(redblack),第一個(gè)球變化,第一個(gè)球變化 中循環(huán):中循環(huán):j從從(redblack) ,第

33、二個(gè)球變化,第二個(gè)球變化 如果(如果(i=j)同色,不可取,只有()同色,不可取,只有(ij)才需要繼續(xù)找才需要繼續(xù)找第第3個(gè)球。第個(gè)球。第3個(gè)球也有個(gè)球也有5種取值,種取值,k從從(redblack) ,但要,但要求第求第3個(gè)球不能與第個(gè)球不能與第1個(gè)球或第個(gè)球或第2 個(gè)球同色,即個(gè)球同色,即k i ,k j滿足此條件,就得到滿足此條件,就得到3種不同色的球。種不同色的球。算法:算法:1、定義枚舉類型及相應(yīng)變量;、定義枚舉類型及相應(yīng)變量; enum color red,yellow,blue,white,black; color i,j,k,col;2、 for(i=red;i=black;

34、i+) for(j=red;j=black;j+) if(i!=j) /前兩個(gè)球顏色不同前兩個(gè)球顏色不同 for(k=red;k=black;k+) /只有前兩個(gè)球的顏色不同,才需檢查第只有前兩個(gè)球的顏色不同,才需檢查第3個(gè)球的顏色個(gè)球的顏色 if(k!=i&k!=j) /3/3個(gè)球顏色都不同個(gè)球顏色都不同 /第三個(gè)球不同于前兩個(gè),滿足要求;找到一種取法第三個(gè)球不同于前兩個(gè),滿足要求;找到一種取法3、輸出該取法:注意枚舉量的輸出方法。、輸出該取法:注意枚舉量的輸出方法。程序:程序:int main()enum color_set red,yellow,blue,white,black;

35、color_set color;int i,j,k,counter=0,loop; /counter是累計(jì)不同顏色的組合數(shù)是累計(jì)不同顏色的組合數(shù)for(i=red;i=black;i+) for(j=red;j=black;j+) if(i!=j) / /前兩個(gè)球顏色不同前兩個(gè)球顏色不同 for(k=red;k=black;k+) /只有前兩個(gè)球的顏色不同,才需檢查第只有前兩個(gè)球的顏色不同,才需檢查第3個(gè)球的顏色個(gè)球的顏色 if(k!=i&k!=j) /3/3個(gè)球顏色都不同個(gè)球顏色都不同 counter+; if(counter)%22=0) cout“請(qǐng)按回車鍵繼續(xù)請(qǐng)按回車鍵繼續(xù)”;

36、 cin.get(); /控制每屏顯示控制每屏顯示22行行 coutsetw(15)counter; /輸出當(dāng)前的輸出當(dāng)前的counter值,字段寬度為值,字段寬度為15/ /下面輸出每種取法,一行為一種取法的三個(gè)顏色下面輸出每種取法,一行為一種取法的三個(gè)顏色 for(loop=1;loop=3;loop+) switch(loop) case 1: color=(color_set) i; break; /第一個(gè)是第一個(gè)是i, (color_set) i是強(qiáng)制類型轉(zhuǎn)換,是強(qiáng)制類型轉(zhuǎn)換, 使使color的值為的值為i case 2: color=(color_set) j; break; /第

37、二個(gè)是第二個(gè)是j,使,使color的值為的值為j case 3: color=(color_set) k; break; /第三個(gè)是第三個(gè)是k,使,使color的值為的值為k switch(color) case red: coutsetw(15)red; break; case yellow:coutsetw(15)yellow;break; case blue: coutsetw(15)blue; break; case white:coutsetw(15)white; break; case black: coutsetw(15)black; break; /for_loop coute

38、ndl; /輸出一種取法后換行輸出一種取法后換行 /for_k /for_j cout共有共有:counter種取法種取法endl; / /輸出符合條件的組合的個(gè)數(shù)輸出符合條件的組合的個(gè)數(shù) return 0;運(yùn)行結(jié)果:運(yùn)行結(jié)果:redyellowblueredyellowwhiteredyellowblackredblueyellow共有共有60種取法種取法2.8 輸入輸出文件簡(jiǎn)介使用文件的步驟如下:使用文件的步驟如下:(1) 說明一個(gè)文件流對(duì)象(內(nèi)部文件)。文件流類型說明一個(gè)文件流對(duì)象(內(nèi)部文件)。文件流類型ifstream支持從輸入文件提取數(shù)據(jù)的操作。而文件流類型支持從輸入文件提取數(shù)據(jù)的操

39、作。而文件流類型ofstream完成數(shù)據(jù)寫入輸出文件的各種操作。完成數(shù)據(jù)寫入輸出文件的各種操作。ifstream ifile; /定義輸入文件,定義輸入文件,ifile為文件名,可用任意標(biāo)識(shí)符為文件名,可用任意標(biāo)識(shí)符ofstream ofile; /定義輸出文件,定義輸出文件,ofile為文件名,可用任意標(biāo)識(shí)符為文件名,可用任意標(biāo)識(shí)符 程序要使用頭文件:程序要使用頭文件:#include (2) 打開文件。打開文件。 ifile.open(“d:my_in_file.txt”); ofile.open(“d:my_out_file.txt”); “d:my_in_file.txt” 和和“ d:my_out_file.txt”為磁盤文為磁盤文件路徑名,在文件流對(duì)象和磁盤文件名之間建立了聯(lián)系。件路徑名,在文件流對(duì)象和磁盤文件名之間

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論