版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三章程序的流程控制
——語(yǔ)句主講人:侯海良通信與控制工程系第三章程序的流程控制
——語(yǔ)本章內(nèi)容流程控制概述順序控制選擇控制循環(huán)控制無(wú)條件轉(zhuǎn)移控制程序設(shè)計(jì)風(fēng)格本章內(nèi)容流程控制概述流程控制概述表達(dá)式構(gòu)成了數(shù)據(jù)處理的基本單位。當(dāng)程序中有多個(gè)表達(dá)式時(shí),就會(huì)面臨:先計(jì)算哪一個(gè)表達(dá)式根據(jù)不同的情況計(jì)算不同的表達(dá)式一個(gè)或幾個(gè)表達(dá)式需要重復(fù)計(jì)算多次語(yǔ)句實(shí)現(xiàn)對(duì)程序執(zhí)行流程的控制,包括:順序控制:按書寫次序執(zhí)行。選擇控制:根據(jù)條件選擇執(zhí)行。循環(huán)控制:重復(fù)執(zhí)行。流程控制概述表達(dá)式構(gòu)成了數(shù)據(jù)處理的基本單位。C++語(yǔ)句的分類C++語(yǔ)句的分類順序控制按書寫次序,從左到右、從上到下順序執(zhí)行。實(shí)現(xiàn)順序控制的C++語(yǔ)句有:表達(dá)式語(yǔ)句復(fù)合語(yǔ)句空語(yǔ)句順序控制按書寫次序,從左到右、從上到下順序執(zhí)行。表達(dá)式語(yǔ)句在C++表達(dá)式的后面加上一個(gè)分號(hào)“;”就可以構(gòu)成表達(dá)式語(yǔ)句,其格式為:<表達(dá)式>;例如:a+b*c;a>b?a:b;a++;x=a|b&c;
連續(xù)的多個(gè)表達(dá)式語(yǔ)句按它們的書寫次序依次執(zhí)行。表達(dá)式語(yǔ)句在C++表達(dá)式的后面加上一個(gè)分號(hào)“;”就可以構(gòu)成較常使用的表達(dá)式語(yǔ)句賦值自增/自減函數(shù)調(diào)用輸入/輸出例如x=a+b;//賦值x++;//自增f(a);//函數(shù)調(diào)用cin>>a;//輸入cout<<b;//輸出表達(dá)式語(yǔ)句程序例1表達(dá)式語(yǔ)句程序例2例1:編寫一個(gè)程序,從鍵盤輸入一個(gè)數(shù),計(jì)算該數(shù)的平方、立方及平方根并輸出例2:編寫一個(gè)程序計(jì)算a+2a+3a+…的前n項(xiàng)的和較常使用的表達(dá)式語(yǔ)句賦值表達(dá)式語(yǔ)句程序例1表達(dá)式語(yǔ)句程序例復(fù)合語(yǔ)句復(fù)合語(yǔ)句是由一對(duì)花括號(hào)括起來(lái)的一條或多條語(yǔ)句,又稱為塊(block)。語(yǔ)法上,復(fù)合語(yǔ)句可看作是一個(gè)語(yǔ)句。其格式為:{<語(yǔ)句序列>}<語(yǔ)句序列>中的語(yǔ)句可以是任何的C++語(yǔ)句,其中包括數(shù)據(jù)定義和聲明語(yǔ)句。復(fù)合語(yǔ)句中的語(yǔ)句序列一般按照書寫次序執(zhí)行。復(fù)合語(yǔ)句一般作為函數(shù)體和結(jié)構(gòu)語(yǔ)句的成分語(yǔ)句。復(fù)合語(yǔ)句復(fù)合語(yǔ)句是由一對(duì)花括號(hào)括起來(lái)的一條或多條語(yǔ)句,又稱為復(fù)合語(yǔ)句舉例{ inta,b; cin>>a>>b; intmax; if(a>=b)//選擇語(yǔ)句 max=a; else max=b; cout<<max<<endl;}{inta,b;cin>>a>>b;intmax;max=a>b?a:b;cout<<max<<endl;}將選擇語(yǔ)句用一個(gè)語(yǔ)句完成復(fù)合語(yǔ)句舉例{ {將選擇語(yǔ)句用一個(gè)語(yǔ)句完成空語(yǔ)句根據(jù)程序設(shè)計(jì)的需要,在程序中的某些地方有時(shí)需要加上一些空操作,以方便其它流程控制的實(shí)現(xiàn)??照Z(yǔ)句的格式為: ;空語(yǔ)句不做任何事情,其作用是用于語(yǔ)法上需要一條語(yǔ)句的地方,而該地方又不需做任何事情??照Z(yǔ)句常常作為結(jié)構(gòu)語(yǔ)句的子句。
空語(yǔ)句根據(jù)程序設(shè)計(jì)的需要,在程序中的某些地方有時(shí)需要加上一例如:{ ...... ...gotoend;//轉(zhuǎn)向下面由語(yǔ)句標(biāo)號(hào)end標(biāo)識(shí)的空語(yǔ)句 ...... end:;//空語(yǔ)句}其中,在“end:;”中,end是一個(gè)語(yǔ)句標(biāo)號(hào),“;”是一個(gè)空語(yǔ)句。再例如:inti,sum;for(sum=0,i=1;i<=100;sum+=i,i++);
其中,循環(huán)體為一條空語(yǔ)句例如:選擇控制在程序中,常常需要根據(jù)不同的情況來(lái)從一組語(yǔ)句中選擇一個(gè)來(lái)執(zhí)行(分支),這是通過(guò)選擇語(yǔ)句來(lái)完成的。選擇語(yǔ)句包括:if語(yǔ)句switch語(yǔ)句選擇控制在程序中,常常需要根據(jù)不同的情況來(lái)從一組語(yǔ)句中選擇一if語(yǔ)句if語(yǔ)句(又稱條件語(yǔ)句)是根據(jù)一個(gè)條件滿足與否來(lái)決定是否執(zhí)行某個(gè)語(yǔ)句或從兩個(gè)語(yǔ)句中選擇一個(gè)語(yǔ)句執(zhí)行。
if語(yǔ)句有兩種格式:if(<表達(dá)式>)<語(yǔ)句>if(<表達(dá)式>)<語(yǔ)句1>else<語(yǔ)句2>其中的<語(yǔ)句>、<語(yǔ)句1>、<語(yǔ)句2>必須是一個(gè)語(yǔ)句?。◤?fù)合語(yǔ)句算一個(gè)語(yǔ)句。)if語(yǔ)句if語(yǔ)句(又稱條件語(yǔ)句)是根據(jù)一個(gè)條件滿足與否if語(yǔ)句的含義第一種格式第二種格式if語(yǔ)句的含義第一種格式第二種格式例3.3:從鍵盤輸入三個(gè)整數(shù),計(jì)算其中的最大值并將其輸出#include<iostream>usingnamespacestd;intmain(){ inta,b,c,max; cout<<"請(qǐng)輸入三個(gè)整數(shù):"<<endl; cin>>a>>b>>c;
if(a>b) max=a; else max=b; if(c>max)max=c; cout<<"最大者為:"<<max<<endl; return0;}max=a>b?a:b;max=max>c?max:c;將選擇語(yǔ)句其它語(yǔ)句替換例3.3:從鍵盤輸入三個(gè)整數(shù),計(jì)算其中的最大值并將其輸出#i例3.4:求一元二次方程ax2+bx+c=0的實(shí)解分析:寫程序不等同于做數(shù)學(xué)題目,一定要考慮清楚各種可能的情況,這樣才能保證程序的健壯性。在寫該程序時(shí),由于a、b、c是由鍵盤輸入,應(yīng)該考慮情況有:(1)a=0,一元二次方程變成線性方程(2)▽<0,方程無(wú)實(shí)數(shù)解(3)▽=0,方程只有一個(gè)實(shí)數(shù)解(4)▽>0,方程有兩個(gè)實(shí)數(shù)解具體程序如下:程序一求出方程所有解的程序如下:程序二例3.4:求一元二次方程ax2+bx+c=0的實(shí)解分析:寫程if語(yǔ)句的鋸齒格式為了提高程序的易讀性,在寫if語(yǔ)句時(shí),最好采用“鋸齒”格式。如格式一如果if語(yǔ)句嵌套層次很深,“鋸齒”格式將會(huì)使得程序正文嚴(yán)重偏向右邊,給查看程序帶來(lái)困難??梢园裪f語(yǔ)句寫成格式二:
格式二:if(...)...elseif(...)...elseif(...)...else...格式一:鋸齒形if(...)...elseif(...)...elseif(...)...else...注意:If…else嵌套時(shí),else與最近的if保持匹配if語(yǔ)句的鋸齒格式為了提高程序的易讀性,在寫if語(yǔ)句時(shí),最好例5:從鍵盤輸入一個(gè)三角形的三條邊,判斷其為何種三角形
#include<iostream>usingnamespacestd;intmain(){ inta,b,c; cin>>a>>b>>c; if(a+b<=c||b+c<=a||c+a<=b) cout<<"不是三角形"; elseif(a==b&&b==c) cout<<"等邊三角形"; elseif(a==b||b==c||c==a) cout<<"等腰三角形";
elseif(a*a+b*b==c*c||b*b+c*c==a*a||c*c+a*a==b*b) cout<<"直角三角形(非等腰)"; else cout<<"其它三角形"; cout<<endl; return0;}思考:如何在程序中增加判斷等腰直角三角形的語(yǔ)句?例5:從鍵盤輸入一個(gè)三角形的三條邊,判斷其為何種三角形#i方法一:
elseif(a*a+b*b==c*c||b*b+c*c==a*a||c*c+a*a==b*b){if(a==b||b==c||c==a)cout<<"等腰直角三角形";elsecout<<"直角三角形(非等腰)";}方法二:elseif(((a*a+b*b==c*c)&&(a==b))||((b*b+c*c==a*a)&&(b==c))||((c*c+a*a==b*b)&&(c==a)))
cout<<"等腰直角三角形";方法三:elseif((a*a+b*b==c*c||b*b+c*c==a*a||c*c+a*a==b*b)&&(a==b||b==c||c==a)) cout<<"等腰直角三角形";方法一:例6:從鍵盤輸入兩個(gè)表示時(shí)間的數(shù)據(jù)(時(shí)、分、秒),比較兩個(gè)時(shí)間的先后次序。
時(shí)間比較存在以下可能:(1)h1>h2,時(shí)間2在前;時(shí)h1<h2,時(shí)間1在前(2)否則,m1>m2,時(shí)間2在前;m1<m2,時(shí)間1在前(3)否則,s1>s2,時(shí)間2在前;s1<s2,時(shí)間1在前(4)否則,兩個(gè)時(shí)間相等。具體程序如下:程序一思考:如何在只比較一次就得出上述結(jié)果?程序二例6:從鍵盤輸入兩個(gè)表示時(shí)間的數(shù)據(jù)(時(shí)、分、秒),比較兩個(gè)時(shí)多個(gè)if和if……else的選擇:if……else能避免不必要的測(cè)試
例:如果score=95.if(score>=90) cout<<"優(yōu)";if(score>=80&&score<90) cout<<"良";if(score>=70&&score<80) cout<<"中";if(score>=60&&score<70) cout<<"及格";if(score<60) cout<<"不及格";說(shuō)明:每條語(yǔ)句都會(huì)運(yùn)行if(score>=90) cout<<"優(yōu)";elseif(score>=80&&score<90) cout<<"良";elseif(score>=70&&score<80) cout<<"中";elseif(score>=60&&score<70) cout<<"及格";else cout<<"不及格";說(shuō)明:只會(huì)運(yùn)行第一條if語(yǔ)句多個(gè)if和if……else的選擇:if……else能避免不if語(yǔ)句的歧義問(wèn)題if(<表達(dá)式1>)if(<表達(dá)式2>)<語(yǔ)句1>else<語(yǔ)句2>的含義
if(表達(dá)式1)if(表達(dá)式2)<語(yǔ)句1>else<語(yǔ)句2>
if(表達(dá)式1)if(表達(dá)式>)<語(yǔ)句1>else<語(yǔ)句2>C++規(guī)定:else子句與它前面最近的、沒(méi)有else子句的if配對(duì)。因此,上面的if語(yǔ)句解釋為:
if(表達(dá)式1)if(表達(dá)式2)<語(yǔ)句1>else<語(yǔ)句2>
若要按2來(lái)解釋,則需要加上花括號(hào)(復(fù)合語(yǔ)句):if(表達(dá)式1){if(表達(dá)式2)<語(yǔ)句1>}else<語(yǔ)句2>if語(yǔ)句的歧義問(wèn)題if(<表達(dá)式1>)if(<表達(dá)式switch語(yǔ)句程序中有時(shí)需要從兩個(gè)(組)以上的語(yǔ)句中選擇一個(gè)(組)來(lái)執(zhí)行。C++提供了一條多路選擇語(yǔ)句:switch語(yǔ)句(又稱開關(guān)語(yǔ)句),它能根據(jù)某個(gè)表達(dá)式的值在多組語(yǔ)句中選擇一組語(yǔ)句來(lái)執(zhí)行。每一組語(yǔ)句的最后一個(gè)語(yǔ)句往往是break語(yǔ)句。switch語(yǔ)句程序中有時(shí)需要從兩個(gè)(組)以上的語(yǔ)句中選擇例7、從鍵盤輸入一個(gè)星期的某一天(0:星期天;1:星期一;...),輸出對(duì)應(yīng)的英語(yǔ)單詞(if語(yǔ)句實(shí)現(xiàn))采用if語(yǔ)句實(shí)現(xiàn):程序缺陷:多次對(duì)day的值進(jìn)行比較書寫麻煩,可讀性差解決:采用switch語(yǔ)句實(shí)現(xiàn),具體格式如下:switch(<整型表達(dá)式>){ case<整型常量表達(dá)式1>:<語(yǔ)句序列1>: case<整型常量表達(dá)式n>:<語(yǔ)句序列n> [default:<語(yǔ)句序列n+1>]}注意:switch中的整型表達(dá)式可以是整型、字符型和枚舉型,case語(yǔ)句中的常量表達(dá)式也必須相比配例7、從鍵盤輸入一個(gè)星期的某一天(0:星期天;1:星期一;.例8、從鍵盤輸入一個(gè)星期的某一天(0:星期天;1:星期一;...),然后輸出其對(duì)應(yīng)的英語(yǔ)單詞#include<iostream>usingnamespacestd;intmain(){ intday; cin>>day; switch(day) { case0:cout<<"Sunday";break; case1:cout<<"Monday";break; case2:cout<<"Tuesday";break; case3:cout<<"Wednesday";break; case4:cout<<"Thursday";break; case5:cout<<"Friday";break; case6:cout<<"Saturday";break; default:cout<<"Inputerror"; } cout<<endl; return0;}思考:如何用字符串實(shí)現(xiàn)上述結(jié)果?程序例8、從鍵盤輸入一個(gè)星期的某一天(0:星期天;1:星期一;.switch語(yǔ)句中使用break語(yǔ)句在執(zhí)行switch語(yǔ)句的某個(gè)分支時(shí),需要用break語(yǔ)句結(jié)束該分支的執(zhí)行。在switch語(yǔ)句的一個(gè)分支的執(zhí)行中,如果沒(méi)有break語(yǔ)句(最后一個(gè)分支除外),則該分支執(zhí)行完后,將繼續(xù)執(zhí)行緊接著的下一個(gè)分支中的語(yǔ)句序列。C++中的switch語(yǔ)句比其它一些語(yǔ)言中的多路選擇語(yǔ)句更具有靈活性。當(dāng)若干個(gè)分支具有部分重復(fù)功能時(shí),C++的switch語(yǔ)句可以節(jié)省代碼量。switch語(yǔ)句中使用break語(yǔ)句在執(zhí)行switch語(yǔ)句的switch(...){ ... case<整型常量表達(dá)式1>:A case<整型常量表達(dá)式2>:B case<整型常量表達(dá)式3>:C;break; ...}上面的語(yǔ)句假設(shè)A、B中沒(méi)有break語(yǔ)句,則分支1執(zhí)行A、B和C;分支2執(zhí)行B和C;分支3執(zhí)行C。例9:計(jì)算某年某月的天數(shù)分析:每年的1、3、5、7、8、10、12各有31天,4、6、9、11各有30天,2月閏年29天,其它年尾為28天。閏年判斷:年份能被4整除不能被100整除程序switch(...)例9:計(jì)算某年某月的天數(shù)程序循環(huán)控制如何編程計(jì)算n!(n是變量)?n!=n*(n-1)*(n-2)*...*2*1表達(dá)式中不允許有“...”上面的問(wèn)題需要用重復(fù)操作控制來(lái)解決:對(duì)相同的操作重復(fù)執(zhí)行多次,每一次操作的數(shù)據(jù)有所不同。f=1,對(duì)i=2~n,重復(fù)執(zhí)行:f=f*i;循環(huán)語(yǔ)句為解決重復(fù)操作提供了一種途徑。循環(huán)一般由四個(gè)部分組成:循環(huán)初始化循環(huán)條件循環(huán)體下一次循環(huán)準(zhǔn)備。循環(huán)控制如何編程計(jì)算n!(n是變量)?C++提供了三種實(shí)現(xiàn)重復(fù)操作的循環(huán)語(yǔ)句:while語(yǔ)句do-while語(yǔ)句for語(yǔ)句C++提供了三種實(shí)現(xiàn)重復(fù)操作的循環(huán)語(yǔ)句:while語(yǔ)句while語(yǔ)句具有如下的格式: while(<表達(dá)式>)<語(yǔ)句>while語(yǔ)句while語(yǔ)句具有如下的格式:用while語(yǔ)句求n!#include<iostream>usingnamespacestd;intmain(){ intn; cin>>n; inti=2,f=1;//循環(huán)初始化 while(i<=n)//循環(huán)條件 { f*=i; i++;//下一次循環(huán)準(zhǔn)備 }//循環(huán)體 cout<<"factorialof"<<n<<"="<<f<<endl; return0;}用while語(yǔ)句求n!#include<iostream>do-while語(yǔ)句do-while語(yǔ)句的格式如下: do<語(yǔ)句>while(<表達(dá)式>);do-while語(yǔ)句do-while語(yǔ)句的格式如下:用do-while語(yǔ)句求n!#include<iostream>usingnamespacestd;intmain(){ intn; cin>>n; inti=1,f=1;//循環(huán)初始化 do//循環(huán)體 { f*=i; i++;//下一次循環(huán)的準(zhǔn)備 }while(i<=n);//循環(huán)條件 cout<<"factorialof"<<n<<"="<<f<<endl; return0;}用do-while語(yǔ)句求n!#include<iostrefor語(yǔ)句for語(yǔ)句的格式如下:for(<表達(dá)式1>;<表達(dá)式2>;<表達(dá)式3>)<語(yǔ)句>for語(yǔ)句for語(yǔ)句的格式如下:#include<iostream>usingnamespacestd;intmain(){ intn,i,f; cin>>n; for(i=2,f=1//循環(huán)初始化 ; i<=n//循環(huán)條件 ; i++)//下一次循環(huán)準(zhǔn)備 f*=i;//循環(huán)體 cout<<"factorialof"<<n<<"="<<f<<endl; return0;}用for語(yǔ)句求n!#include<iostream>用for語(yǔ)句求n!循環(huán)的種類計(jì)數(shù)控制的循環(huán)循環(huán)前就知道循環(huán)的次數(shù),循環(huán)時(shí)重復(fù)執(zhí)行循環(huán)體直到指定的次數(shù)事件控制的循環(huán)循環(huán)前不知道循環(huán)的次數(shù),循環(huán)的終止是由循環(huán)體的某次執(zhí)行導(dǎo)致循環(huán)的結(jié)束條件得到滿足而引起的循環(huán)的種類計(jì)數(shù)控制的循環(huán)三種循環(huán)語(yǔ)句的使用原則三種循環(huán)語(yǔ)句在表達(dá)能力上是等價(jià)的,在解決某個(gè)具體問(wèn)題時(shí),用其中的一種可能會(huì)比其它兩種更加自然。一般來(lái)說(shuō),計(jì)數(shù)控制的循環(huán)一般用for語(yǔ)句;事件控制的循環(huán)一般用while或do-while語(yǔ)句,其中,如果循環(huán)體至少要執(zhí)行一次,則用do-while語(yǔ)句。由于for語(yǔ)句能清晰地表示“循環(huán)初始化”、“循環(huán)條件”以及“下一次循環(huán)準(zhǔn)備”,因此,一些非計(jì)數(shù)控制的循環(huán)也用for語(yǔ)句實(shí)現(xiàn)。三種循環(huán)語(yǔ)句的使用原則三種循環(huán)語(yǔ)句在表達(dá)能力上是等價(jià)的,在例13:計(jì)算從鍵盤輸入的一系列整數(shù)的和,要求首先輸入整數(shù)的個(gè)數(shù)。(計(jì)數(shù)控制的循環(huán))
#include<iostream>usingnamespacestd;intmain(){ intn; cout<<"請(qǐng)輸入整數(shù)的個(gè)數(shù):"; cin>>n; cout<<"請(qǐng)輸入"<<n<<"個(gè)整數(shù):"; intsum=0; for(inti=1;i<=n;i++) { inta; cin>>a; sum+=a; } cout<<"輸入的"<<n<<"個(gè)整數(shù)的和是:"<<sum<<endl; return0;}i的作用域例13:計(jì)算從鍵盤輸入的一系列整數(shù)的和,要求首先輸入整數(shù)的個(gè)例14:計(jì)算從鍵盤輸入的一系列整數(shù)的和,要求輸入以-1結(jié)束。(事件控制的循環(huán))#include<iostream>usingnamespacestd;intmain(){inta,sum=0; cout<<"請(qǐng)輸入若干個(gè)整數(shù)(以-1結(jié)束):"; cin>>a; while(a!=-1) { sum+=a; cin>>a; } cout<<"輸入的整數(shù)的和是:"<<sum<<endl; return0;}思考:可以用for循環(huán)實(shí)現(xiàn)嗎?例14:計(jì)算從鍵盤輸入的一系列整數(shù)的和,要求輸入以-1結(jié)束。思考:for循環(huán)實(shí)現(xiàn)計(jì)算從鍵盤輸入的一系列整數(shù)的和,要求輸入以-1結(jié)束。(事件控制的循環(huán))#include<iostream>usingnamespacestd;intmain(){inta,sum=0; cout<<"請(qǐng)輸入若干個(gè)整數(shù)(以-1結(jié)束):"; for(cin>>a;a!=-1;cin>>a)sum+=a; cout<<"輸入的整數(shù)的和是:"<<sum<<endl; return0;}思考:for循環(huán)實(shí)現(xiàn)計(jì)算從鍵盤輸入的一系列整數(shù)的和,要求輸入例15:從鍵盤接收字符,一直到輸入了字符y(Y)或n(N)為止。(事件控制的循環(huán))#include<iostream>#include<cstdlib>usingnamespacestd;intmain(){ charch;cout<<"請(qǐng)輸入字符:"; do { cin>>ch; ch=tolower(ch); }while(ch!='y'&&ch!='n'); if(ch=='y') cout<<"Yes!\n"; else cout<<"No!\n"; return0;}例15:從鍵盤接收字符,一直到輸入了字符y(Y)或n(N)為例16:判斷鍵盤輸入的數(shù)是否為素?cái)?shù)方法一:用鍵盤輸入的數(shù)n分別除以2、3…n-1,有一個(gè)數(shù)能整除,則n不是素?cái)?shù),否則n為素?cái)?shù)。
程序一方法二:用鍵盤輸入的數(shù)n分別除以2、3…sqrt(n),有一個(gè)數(shù)能整除,則n不是素?cái)?shù),否則n為素?cái)?shù)。
程序二方法三:在方法二的基礎(chǔ)上,被不能被2整除就不能被4、6、8…等整除,減少除法計(jì)算次數(shù)。
程序三例16:判斷鍵盤輸入的數(shù)是否為素?cái)?shù)方法一:用鍵盤輸入的數(shù)n分例17:求第n個(gè)費(fèi)波那契(Fibonacci)數(shù)#include<iostream>usingnamespacestd;intmain(){ intn; cin>>n; intfib_1=0;//第一個(gè)Fibonacci數(shù)
intfib_2=1;//第二個(gè)Fibonacci數(shù)
for(inti=3;i<=n;i++) { inttemp=fib_1+fib_2;//計(jì)算新的Fibonacci數(shù)
fib_1=fib_2;//記住新的前一個(gè)Fibonacci數(shù)
fib_2=temp;//記住新的Fibonacci數(shù) }
cout<<"第"<<n<<"個(gè)費(fèi)波那契數(shù)是:"<<fib_2<<endl; return0;}例17:求第n個(gè)費(fèi)波那契(Fibonacci)數(shù)#inclu循環(huán)優(yōu)化問(wèn)題算法的優(yōu)化:減少循環(huán)次數(shù)避免在循環(huán)中重復(fù)計(jì)算不變的表達(dá)式循環(huán)優(yōu)化問(wèn)題算法的優(yōu)化:減少循環(huán)次數(shù)#include<iostream>usingnamespacestd;intmain(){ intn; cout<<"請(qǐng)輸入一個(gè)正整數(shù):" cin>>n;//從鍵盤輸入一個(gè)正整數(shù) for(inti=2;i<n;i++)//循環(huán):分別判斷2、3、...、n-1是否為素?cái)?shù) { intj=2; while(j<i&&i%j!=0)//循環(huán):分別判斷i是否能被2~i-1整除 j++; if(j==i)//i是素?cái)?shù) cout<<i<<""; } cout<<endl; return0;}注意:1、上面的for循環(huán)中,偶數(shù)沒(méi)有必要再判斷它們是否為素?cái)?shù); 2、上面的while循環(huán)沒(méi)有必要到i-1,只需要到:sqrt(i)例19:編程求出小于n的所有素?cái)?shù)(質(zhì)數(shù))#include<iostream>例19:編程求出小于n#include<iostream>#include<cmath>usingnamespacestd;intmain(){ intn; cin>>n;//從鍵盤輸入一個(gè)數(shù) if(n<2)return-1; cout<<2<<",";//輸出第一個(gè)素?cái)?shù) for(inti=3;i<n;i+=2)//循環(huán):分別判斷3、5、...、是否為素?cái)?shù) { intj=2; while(j<=sqrt(i)&&i%j!=0)//循環(huán):分別判斷i是否為素?cái)?shù) j++; if(j>sqrt(i))//i是素?cái)?shù) cout<<i<<","; } cout<<endl; return0;}注意:上面程序中的sqrt(i)被重復(fù)計(jì)算!例19:編程求出小于n的所有素?cái)?shù)(質(zhì)數(shù))(續(xù))#include<iostream>例19:編程求出小于j=2,k=sqrt(i);while(j<=k&&i%j!=0) j++;if(j>k)//i是素?cái)?shù)。......注意:對(duì)有些循環(huán)優(yōu)化,編譯器能實(shí)現(xiàn)!......轉(zhuǎn)移控制除了有條件的選擇語(yǔ)句(if和switch)外,C++還提供了轉(zhuǎn)移語(yǔ)句:breakcontinuegotoreturn:轉(zhuǎn)移控制除了有條件的選擇語(yǔ)句(if和switch)外,C+break語(yǔ)句break語(yǔ)句的格式: break;break語(yǔ)句的含義有兩個(gè):結(jié)束switch語(yǔ)句的某個(gè)分支的執(zhí)行退出包含它的最內(nèi)層循環(huán)語(yǔ)句(由于循環(huán)可以嵌套)在循環(huán)體中只要執(zhí)行了break語(yǔ)句,就立即跳出(結(jié)束)循環(huán),循環(huán)體中跟在break語(yǔ)句后面的語(yǔ)句將不再執(zhí)行,程序繼續(xù)執(zhí)行循環(huán)之后的語(yǔ)句。在循環(huán)體中,break語(yǔ)句一般作為某個(gè)if語(yǔ)句的子句,用于實(shí)現(xiàn)進(jìn)一步的循環(huán)控制。break語(yǔ)句break語(yǔ)句的格式:例如,判斷i是否為素?cái)?shù)的循環(huán)也可寫成:j=2;k=sqrt(i);while(j<=k){ if(i%j==0)break;//退出循環(huán) j++;}或for(j=2,k=sqrt(i);j<=k;j++) if(i%j==0)break;例如,判斷i是否為素?cái)?shù)的循環(huán)也可寫成:continue語(yǔ)句continue語(yǔ)句的格式如下:continue;continue語(yǔ)句用在循環(huán)語(yǔ)句的循環(huán)體中,作用是:立即結(jié)束當(dāng)前循環(huán),進(jìn)入下輪循環(huán)。對(duì)于while和do-while語(yǔ)句,continue語(yǔ)句將使控制轉(zhuǎn)到循環(huán)條件的判斷;對(duì)于for語(yǔ)句,continue語(yǔ)句將使控制轉(zhuǎn)到:先計(jì)算<表達(dá)式3>,然后計(jì)算<表達(dá)式2>,并根據(jù)<表達(dá)式2>的結(jié)果決定是進(jìn)入下一次循環(huán)還是結(jié)束循環(huán)。continue語(yǔ)句continue語(yǔ)句的格式如下:例21:從鍵盤輸入一些非零整數(shù),然后輸出其中所有正數(shù)的平方根。#include<iostream>#include<cmath>usingnamespacestd;intmain(){ intn; doublesquare_root; cout<<"請(qǐng)輸入若干整數(shù)(以0結(jié)束):"; for(cin>>n;n!=0;cin>>n) { if(n<0)continue;//準(zhǔn)備進(jìn)入下一次循環(huán) square_root=sqrt(n); cout<<n<<"的平方根是:"<<square_root<<endl; } return0;}continue語(yǔ)句結(jié)束本次循環(huán)break是結(jié)束整個(gè)循環(huán)思考:continue能否用break替代例21:從鍵盤輸入一些非零整數(shù),然后輸出其中所有正數(shù)的平方根goto語(yǔ)句goto語(yǔ)句的格式如下: goto<語(yǔ)句標(biāo)號(hào)>;<語(yǔ)句標(biāo)號(hào)>為標(biāo)識(shí)符,其定義格式為:
<語(yǔ)句標(biāo)號(hào)>:<語(yǔ)句>goto的含義是:程序轉(zhuǎn)移到帶有<語(yǔ)句標(biāo)號(hào)>的語(yǔ)句goto語(yǔ)句goto語(yǔ)句的格式如下:用goto語(yǔ)句求n!#include<iostream>usingnamespacestd;intmain(){ intn; cin>>n; inti=1,f=1;loop: f*=i; i++; if(i<=n)gotoloop; cout<<"factorialof"<<n<<"="<<f<<endl; return0;}用goto語(yǔ)句求n!#include<iostream>在使用goto語(yǔ)句時(shí),應(yīng)該注意:不能用goto語(yǔ)句從一個(gè)函數(shù)外部轉(zhuǎn)入該函數(shù)的內(nèi)部(函數(shù)體),也不能用goto語(yǔ)句從一個(gè)函數(shù)的內(nèi)部轉(zhuǎn)到該函數(shù)的外部。允許用goto語(yǔ)句從內(nèi)層復(fù)合語(yǔ)句轉(zhuǎn)到外層復(fù)合語(yǔ)句或從外層復(fù)合語(yǔ)句轉(zhuǎn)入內(nèi)層復(fù)合語(yǔ)句。goto語(yǔ)句不能掠過(guò)帶有初始化的變量定義。在使用goto語(yǔ)句時(shí),應(yīng)該注意:voidf(){ ...... gotoL1;//Error ...... while(...) { intx=0; L1:... ...... gotoL2;//Error ...... } ..... inty=10; L2:...... ......}voidf()用goto語(yǔ)句實(shí)現(xiàn)break語(yǔ)句的功能while(...){ ...... ...break; ......}上述程序等價(jià)于:while(...){ ...... ...gotoL; ......}L:...用goto語(yǔ)句實(shí)現(xiàn)break語(yǔ)句的功能while(...)while(...){ ...... ...gotoend; ...... end:;}while(...){ ...... ...continue; ......}格式:;作用:程序中需要一條不做任何事情的語(yǔ)句。例:intI,sum;for(sum=0,i=1;i<=100;sum+=i,i++);用空語(yǔ)句和goto語(yǔ)句實(shí)現(xiàn)continue語(yǔ)句的功能while(...)while(...)格式
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東理工職業(yè)學(xué)院《JavaWEB開發(fā)技術(shù)課程綜合實(shí)踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東科貿(mào)職業(yè)學(xué)院《大學(xué)職業(yè)發(fā)展與就業(yè)指導(dǎo)4》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東江門中醫(yī)藥職業(yè)學(xué)院《高等數(shù)學(xué)II》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東機(jī)電職業(yè)技術(shù)學(xué)院《中學(xué)英語(yǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東環(huán)境保護(hù)工程職業(yè)學(xué)院《工程荷載與可靠度設(shè)計(jì)方法》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東財(cái)貿(mào)職業(yè)學(xué)院《經(jīng)貿(mào)應(yīng)用文寫作》2023-2024學(xué)年第一學(xué)期期末試卷
- 共青科技職業(yè)學(xué)院《電力電子與變頻技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 中考物理基礎(chǔ)復(fù)習(xí)課件
- 貿(mào)促會(huì)法律培訓(xùn)課件
- 贛南衛(wèi)生健康職業(yè)學(xué)院《能源轉(zhuǎn)換原理B》2023-2024學(xué)年第一學(xué)期期末試卷
- 兒科護(hù)理安全警示課件
- 2024-2025學(xué)年新疆省克孜勒蘇柯爾克孜自治州三年級(jí)數(shù)學(xué)第一學(xué)期期末統(tǒng)考試題含解析
- 2025版國(guó)家開放大學(xué)法學(xué)本科《國(guó)際私法》歷年期末紙質(zhì)考試總題庫(kù)
- 機(jī)器人機(jī)構(gòu)學(xué)基礎(chǔ) 部分習(xí)題及答案(于靖軍 )
- 教科版2022-2023學(xué)年度上學(xué)期三年級(jí)科學(xué)上冊(cè)期末測(cè)試卷及答案(含八套題)
- 借條的正規(guī)模板(2024版)
- DZ/T 0430-2023 固體礦產(chǎn)資源儲(chǔ)量核實(shí)報(bào)告編寫規(guī)范(正式版)
- 銅排載流量表
- 拒絕轉(zhuǎn)院知情告知書.doc
- 草原上升起不落的太陽(yáng)(五線譜)
- 文丘里式氣氣混合器計(jì)算表[共2頁(yè)]
評(píng)論
0/150
提交評(píng)論