版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程式流程控制
4.1語句4.1.1運算式語句在任意一個運算式後面加上“;”即構成運算式語句,例如:m=3;
//賦值運算式語句a+b;
//算術運算式語句z=x*y,z++;
//逗號運算式語句c=a+b;
//賦值x--;
//自減a=m>n?m:n;
//條件運算式語句a||b&&c;
//邏輯運算式語句F(a,b);
//函數調用cin>>m;
//輸入cout<<n;
//輸出4.1.2空語句空語句只由一個“;”構成,不執行任何操作。通常,空語句作為分支點,位於語法上需要一條語句,但又不執行任何操作的地方。
4.1.3複合語句複合語句又稱為塊語句,即用一對花括弧{}把若干條語句組合成一條語句,{}內可以有多條語句,也可以只有一條語句,也可以沒有任何語句,但複合語句在語法上相當於一條語句,形式如下:{ <語句1> <語句2>//…}注意:複合語句內的各條語句都必須以分號結尾,在“}”外不能不需要加分號。
4.2順序結構順序結構是最簡單、最常見的一種程式控制結構。順序結構中的語句按照書寫的先後次序順序執行,並且每個語句都會被執行到。【例4.1】計算任意兩個整數之和。#include<iostream>usingnamespacestd;intmain(){intjs1,js2; //加數1,加數2intsum;
//和cout<<"請輸入第1個加數:"<<endl;cin>>js1;cout<<"請輸入第2個加數:"<<endl;cin>>js2;sum=js1+js2;
//和=加數1+加數2cout<<js1<<"+"<<js2<<"="<<sum<<endl;
return0;}4.3選擇結構選擇結構支持程式的判斷與選擇,使用選擇語句來實現,選擇語句有兩種:if語句,也稱為分支語句;switch語句,根據條件決定執行哪些分支語句,也稱為多分支語句。
4.3.1if語句單分支if語句的一般形式如下:
if(<運算式>)
<語句>運算式稱為條件運算式(一般為邏輯運算式或關係運算式),求值結果必須是整數類型、字元類型、浮點類型或雙精度類型。
4.3.1if語句執行過程:先對條件運算式進行判斷,若成立(值為非0),就執行語句,然後,順序執行if結構後的下一條語句;若條件運算式不成立(為0),直接執行if結構後的下一條語句。
圖4-1單分支if語句流程圖
4.3.1if語句公交汽車根據到站是否有上下乘客停車或是繼續行駛,可用if語句表示如下:if(有客上下車)停車;當兩個數值相除時,檢查分母是否為0:if(count!=0)
average=sum/count;4.3.1if語句有時,一個條件需要執行幾個動作,如公司到月末,需要給許多職員發放工資,可採用複合語句,使多個語句依賴於相同的條件:
if(月末){給張三發工資;給李四發工資;給王五發工資;
//…}4.3.1if語句採用複合語句計算獲利的程式片段:
if(balance>0){ interest=balance*creditRate; balance+=interest;}4.3.1if語句【例4.2】用戶輸入一字元,用程式判斷是否為小寫字母,如果是,請輸出“您輸入的字元是一個小寫字母”。
#include<iostream>usingnamespacestd;intmain(){chara;cout<<"請輸入一個字元:";cin>>a;
if(a>='a'&&a<='z') cout<<a<<“您輸入的字元是一個小寫字母"<<endl;return0;}4.3.2if-else語句if-else語句構造了一種二路分支選擇結構,一般形式如下:if(<運算式>)
<語句1>else
<語句2>4.3.2if-else語句執行過程:先對運算式進行計算,若結果非0,則條件成立,執行語句1;若值為0,則條件不成立,執行語句2。圖4-2if-else語句流程圖4.3.2if-else語句【例4.3】輸出a,b兩個數中的較大數。#include<iostream>usingnamespacestd;intmain(){inta,b,max;cout<<"pleaseinputa,b:"<<endl;cin>>a>>b;
if(a>b) cout<<"max="<<a<<endl;elsecout<<"max="<<b<<endl;return0;}4.3.2if-else語句【例4.4】從鍵盤輸入一整數,判斷該數的奇偶。#include<iostream>usingnamespacestd;intmain(){intnum;cout<<"請輸入一個整數:";cin>>num;
if((num%2)==0) //模2 cout<<num<<"是一個偶數!"<<endl;else cout<<num<<"是一個奇數!"<<endl;
return0;}4.3.3elseif
語句當有多個分支選擇時,可採用elseif語句,一般形式為:if(<運算式1>) <語句1>elseif(<運算式2>) <語句2> …elseif(<運算式n>)
<語句n>else
<語句n+1>4.3.3elseif
語句執行過程:依次計算if後面運算式的值,當為真時,執行對應的語句,然後,跳到整個if結構之外繼續執行;如果所有的運算式均為假,則執行語句n+1,然後繼續執行後續程式。圖4-3elseif語句流程圖4.3.3elseif
語句根據學生的考試成績,判斷其成績等級:if(score>=90) grade='A';elseif(score>=80) grade='B';elseif(score>=70) grade='C';elseif(score>=60)
grade='D';else grade='E';4.3.3elseif
語句【例4.5】從鍵盤輸入三角形的三條邊,判斷三角形種類(等邊、等腰、直角或其他)。#include<iostream>usingnamespacestd;intmain(){inta,b,c;cout<<"請輸入三條邊長a,b,c:"<<endl;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;}4.3.4嵌套if語句C++支持if語句的嵌套,即一個if語句能夠出現在另一個if語句或if-else語句裏,目的是為了解決多路分支問題,其一般形式為:
形式一:if(<運算式1>)
if(<運算式2>) <語句1>
else<語句2>4.3.4嵌套if語句形式二:if(<運算式1>){
if(<運算式2>)<語句1>}else<語句2>4.3.4嵌套if語句形式三:if(<運算式1>) <語句1>else
if(<運算式2>)<語句2> else<語句3>4.3.4嵌套if語句形式四:if(<運算式1>)
if(<運算式2>) <語句1>
else <語句2>else
if(<運算式3>) <語句3>else<語句4>4.3.4嵌套if語句當程式中存在嵌套的if-else結構時,每個else都與其前面最近的if配對,由內層向外層依次處理;為了提高程式的易讀性,在寫if語句時,最好採用“鋸齒”格式,即把子句往後縮進幾列;嵌套if語句在實際使用中,形式比較靈活,注意如下三點:4.3.4嵌套if語句例如:if(z>y)if(z>x)max=z;
else max=x;elseif(y>x)max=y;無論哪種形式,整個if語句(包括else子句)只算作一條語句。4.3.4嵌套if語句【例4.6】求三個數中最大者。#include<iostream>usingnamespacestd;intmain(){floata,b,c;cout<<"Pleaseinputthreenumbers:"<<endl;cin>>a>>b>>c;if(a>b){
if(a>c) cout<<"Maximumis:"<<a<<endl;
else cout<<"Maximumis:"<<c<<endl; }else{
if(b>c) cout<<"Maximumis:"<<b<<endl;else cout<<"Maximumis:"<<c<<endl; }return0;}【例4.7】求方程ax2+bx+c=0的根。分析:因係數a、b、c的值不確定,所以分情況討論。當a=0,b=0時,方程無解;當a=0,b≠0時,方程只有一個實根-c/b;當a≠0時,需要考慮b2-4ac的情況當b2-4ac≥0,方程有兩個實根;當b2-4ac<0,方程有兩個虛根。4.3.4嵌套if語句4.3.4嵌套if語句#include<iostream>#include<cmath>usingnamespacestd;intmain(){floata,b,c,disc,m,n;cout<<"pleaseinputa,b,c:";cin>>a>>b>>c;disc=b*b-4*a*c;m=-b/2*a;n=sqrt(fabs(disc))/2*a;
if(a==0)
if(b==0) cout<<"noroot!"<<endl; else cout<<"Thesinglerootis:"<<-c/b<<endl;
4.3.4嵌套if語句else{ if(disc>=0){ cout<<"Theroot1is:"<<m+n<<endl; cout<<"Theroot2is:"<<m-n<<endl; } else{ cout<<"Thecomplexroot1is:"<<m<<"+"<<n<<"i"<<endl; cout<<"Thecomplexroot2is:"<<m<<"-"<<n<<"i"<<endl; }}return0;}運行結果:pleaseinputa,b,c:367Thecomplexroot1is:-9+10.3923iThecomplexroot2is:-9-10.3923i4.3.5switch語句C++提供了一條多路選擇語句:switch語句,也稱為開關語句,它能根據某個運算式的值在多個語句中選擇一個語句來執行,一般形式如下:switch(<運算式>){case<常量運算式1>:<語句1>case<常量運算式2>:<語句2>…case<常量運算式n>:<語句n>default:<語句n+1>}4.3.5switch語句switch是關鍵字,case和default是子句關鍵字,語句1,語句2,……語句n+1是由一條或多條語句組成的語句段,也可為空,即無任何語句。switch語句的執行過程:首先計算運算式的值,然後逐個與其後的常量運算式值相比較,當運算式的值與某個常量運算式的值相等時,以此作為入口,執行switch結構中該入口以後的所有語句。當遇到break時,立即結束switch語句的執行,否則,順序執行到本switch結構的最後一條語句,即花括弧中的最後一條語句。當運算式的值與所有case分支的常量運算式均不相同時,則執行default後面的語句。4.3.5switch語句使用switch語句時應注意:switch後面括弧內運算式的值一般是一個整數運算式或字元運算式,與之對應,case後面應是一個整數或字元,也可以是不含變數的常量運算式;switch的執行部分是由一些case分支與一個可省略的default分支組成的複合語句,要用花括弧括起來;常量運算式1~常量運算式n的值必須互不相同;每個case分支允許有多個處理語句,可以不用花括弧括起來;4.3.5switch語句如果每個分支的處理語句中都有break語句,各分支的先後順序可以變動,不會影響程式執行結果;多個case可以共用一組語句,如:…case'A':case'B':case'C':cout<<">60"<<endl;break;…default分支可以省略;switch結構可以嵌套;switch語句便於編譯器進行優化。4.3.5switch語句【例4.8】從鍵盤輸入一個星期的某一天(0:星期天;1:星期一;…),然後輸出其對應的英語單詞。
#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;}4.3.5switch語句【例4.9】依據輸入的兩個整數與操作符運算符,執行運算,並將結果輸出,其中操作符運算符是:+、-、*、%或/之一。#include<iostream>usingnamespacestd;intmain(){intnum1,num2;charop;cout<<"pleaseinputnum1andnum2:"<<endl;cin>>num1>>num2;cout<<"pleaseinputop:"<<endl;
cin>>op;switch(op){
case'+': cout<<num1<<"+"<<num2<<"="<<num1+num2<<endl;break; case'-': cout<<num1<<"-"<<num2<<"="<<num1-num2<<endl;break; case'*': cout<<num1<<"*"<<num2<<"="<<num1*num2<<endl;break;4.3.5switch語句case'/': if(num2!=0) cout<<num1<<"/"<<num2<<"="<<num1/num2<<endl;
else cout<<"num2=0"<<endl; break; case'%': if(num2!=0) cout<<num1<<"%"<<num2<<"="<<num1%num2<<endl;
else cout<<"num2=0"<<endl; break; default: cout<<"unknownop:"<<op<<endl; } return0;}4.3.5switch語句【例4.10】輸入一個字串,統計其中母音字母(不區分大小寫)的個數,以“#”作為輸入結束符。#include<iostream>#include<cctype>usingnamespacestd;intmain(){charch;intaCnt=eCnt=iCnt=oCnt=uCnt=0;cout<<"請輸入字串:"<<endl;while((ch=cin.get())!='#')switch(ch){case'a': case'A': ++aCnt;break;case'e':case'E': ++eCnt;break;4.3.5switch語句
case'i': case'I': ++iCnt;break; case'o': case'O': ++oCnt;break; case'u': case'U': ++uCnt;break;}cout<<"母音字母a(A)的個數為:"<<aCnt<<endl;cout<<"母音字母e(E)的個數為:"<<eCnt<<endl;cout<<"母音字母i(I)的個數為:"<<iCnt<<endl;cout<<"母音字母o(O)的個數為:"<<oCnt<<endl;cout<<"母音字母u(U)的個數為:"<<uCnt<<endl;return0;}4.4迴圈結構
迴圈有兩個基本元素:組成循環體的、要重複執行的語句或語句塊。決定何時停止重複迴圈的迴圈條件。迴圈結構的特點:在給定條件成立時,反復執行某程式段,直到條件不成立為止。4.4迴圈結構迴圈得以進行的條件是:有迴圈控制變數;對控制變數賦予初始值;在每次迴圈過程中存在用來改變控制變數的遞增/遞減值;測試迴圈控制變數的最終條件值(用來判定迴圈是否應該結束)。C++提供三種迴圈語句:while、do-while和for迴圈語句,這三種迴圈語句可以構成多種不同形式的迴圈結構,在許多情況下,這三種語句又可互相代替。4.4.1while語句while語句的一般形式為:while(<運算式>)
<語句>運算式是迴圈條件,語句為循環體,當迴圈條件滿足時執行,語句既可以是單語句,也可以是複合語句,若是單語句,可以省略構成複合語句的花括弧。4.4.1while語句在執行while語句時,首先計算運算式的值,當值為真(非0)時,執行循環體語句,然後重複上述過程,直到迴圈條件運算式的值為假(0)時,迴圈結束,程式控制轉至while迴圈語句的下一語句,while語句的流程如下:圖4-4while語句流程圖4.4.1while語句使用while語句應注意以下幾點:“先判斷,後執行”,如果迴圈條件運算式的值一開始就為假(0),則循環體一次也不執行,但迴圈條件運算式是一定要執行的;while語句中的迴圈條件運算式一般是關係運算式或邏輯運算式,只要運算式的值為真(非0)即可繼續迴圈;循環體可由一條或多條語句組成,由多條語句組成時,須用花括弧括起來,組成複合語句;為使迴圈最終能夠結束,不產生死迴圈,每執行一次循環體,迴圈條件運算式的值應趨於“0”變化。4.4.1while語句【例4.11】求自然數1~100之和。#include<iostream>usingnamespacestd;intmain(){inti,sum;i=1;sum=0;while(i<=100){ sum+=i; i++;}cout<<"1+2+3+…+100="<<sum<<endl;return0;}4.4.1while語句迴圈次數ii<=100sum+=i;第1次111第2次213第3次316第4次4110第5次5115第6次6121…………第100次10015050第101次1010不執行表4-1while迴圈語句的執行過程4.4.1while語句【例4.12】輸入n個數,輸出最大的一個數。#include<iostream>usingnamespacestd;intmain(){intn,i,num,max;i=1;cout<<"pleaseinputn:"<<endl;cin>>n;cout<<"pleaseinput"<<n<<"number:"<<endl;cin>>num;while(i<n){ cin>>num; if(num>max) max=num;
i++; }cout<<"Themaxis:"<<max<<endl;
return0;}4.4.2do-while語句do-while語句的一般形式為:do{ <語句>}while(<運算式>);其中,語句為循環體,同樣,這裏語句既可以是單語句,也可以是複合語句。運算式是迴圈條件。do-while語句首先執行循環體一次,再判別運算式的值,若為真(非0)則繼續迴圈,否則終止迴圈。4.4.2do-while語句do-while語句和while語句的區別在於前者是先執行後判斷,至少要執行一次循環體,而後者是先判斷後執行,如果條件不滿足,則循環體一次也不執行。do-while語句可以組成多重迴圈,也可以和while語句相互嵌套;while語句和do-while語句可以相互替代,相互替換時,要注意修改迴圈控制條件。4.4.2do-while語句do-while語句的流程如下:圖4-5do-while語句流程圖4.4.2do-while語句比較以下兩段代碼,前者使用while語句,後者使用do-while語句,分析變數a的值。代碼段一:inta=0;while(a>0){
a--;}代碼段二:
inta=0;do
{
a--;}while(a>0);4.4.2do-while語句【例4.13】求自然數1~100之和,要求使用do-while語句實現。#include<iostream>usingnamespacestd;intmain(){
inti,sum;i=1;sum=0;do{
sum+=i; i++;}while(i<=100);cout<<"1+2+3+…+100="<<sum<<endl;return0;}4.4.2do-while語句【例4.14】找出1~100之間的整數中,是3的倍數或5的倍數這樣的數的個數。#include<iostream>usingnamespacestd;intmain(){intsum=0,n=1;//sum為統計結果,n為迴圈控制變數do{ if(n%3==0||n%5==0) sum++; n++; }while(n<=100);cout<<"Thetotalnumberis:"<<sum<<endl;return0;}4.4.3for語句for語句是C++所提供的功能更強,使用更為廣泛的一種迴圈語句。其一般形式為:for(<運算式1>;<運算式2>;<運算式3>)
<語句>運算式1:用於設定控制迴圈次數的變數,即迴圈控制變數的初值。運算式2:作為條件,判斷迴圈是否能繼續進行。通常是關係運算式或邏輯運算式。運算式3:用於修改迴圈控制變數的值。多數情況下為自增/自減運算式。4.4.3for語句for語句的執行過程:首先計算運算式1的值,為迴圈控制變數賦初值;再計算運算式2的值,若值為真(非0)則執行循環體一次,否則跳出迴圈,執行for迴圈後的語句;再計算運算式3的值,轉回第2步重複執行,直到運算式2的值為假時,退出迴圈;4.4.3for語句在整個for語句執行過程中,運算式1只計算一次,運算式2和運算式3則可能計算多次,循環體可能多次執行,也可能一次都不執行。for語句的執行流程如下所示:
圖4-6for語句流程圖4.4.3for語句【例4.15】計算某班40名學生的C++課程平均成績。#include<iostream>usingnamespacestd;intmain(){floataverage,sum,score;sum=0;for(inti=0;i<40;i++){ cin>>score; sum+=score; }average=sum/40;cout<<"Theaveragescoreis:"<<average<<endl;
return0;}4.4.3for語句【例4.16】求自然數1~100之和,要求使用for語句實現。#include<iostream>usingnamespacestd;intmain(){intsum;sum=0;for(inti=1;i<=100;i++) sum+=i;cout<<"1+2+3+…+100="<<sum<<endl;return0;}4.4.3for語句程式中,for語句中的運算式3為i++,作用是改變迴圈變數的值。for語句與while語句可以相互替換,for語句可改成如下的while語句:<運算式1>while(<運算式2>){ <語句> <運算式3>}4.4.3for語句for語句在使用時需要注意如下幾點:for語句中的各運算式都可省略,但分號間隔符不能少。如:for(;運算式2;運算式3)省去了運算式1,for(運算式1;;運算式3)省去了運算式2,for(運算式1;運算式2;)省去了運算式3,for(;;)省去了全部運算式。在迴圈變數已賦初值時,可省去運算式1,若省去運算式2或運算式3,將可能造成死迴圈,這時應在循環體內設法結束迴圈。4.4.3for語句例4.16中求1~100自然數之和的程式,可改寫為如下等價形式:形式一:intsum=0;inti=1;for(;i<=100;i++) sum+=i;for語句中省去了運算式1,迴圈變數的初值在for語句之前由i=1;
語句設置。4.4.3for語句形式二:intsum=0;inti=1;for(;i<=100;) sum+=i++;for語句中省去了運算式1和運算式3,迴圈變數的設置在for語句之前完成,迴圈變數的修改在循環體內的sum+=i++;語句中執行。4.4.3for語句形式三:intsum=0;inti=1;for(;;){ sum+=i++;
if(i==101) break;}for語句的運算式全部省去,由循環體中的語句實現迴圈變數的遞增修改和迴圈條件的判斷。4.4.3for語句形式四:intsum=0;for(inti=1;i<=100;sum+=i,i++);循環體是空語句,本應在循環體中執行的累加在運算式3中完成了,注意空語句後分號不可少,否則將把後面的cout語句當成循環體來執行。反之,若循環體非空時,不能在運算式括弧後加分號,這樣,編譯器會認為循環體是空語句。4.4.3for語句for語句可與while、do-while語句相互嵌套,構成多重迴圈,以下都是合法的嵌套。形式一:for(){ …
while() {…} …}4.4.3for語句形式二:do{
…for()
{…}
…}while();形式三:while(){
…
for()
{…}
…}形式四:for(){
…
for() {…}}4.4.3for語句【例4.17】編程求出小於n的所有素數。分析:對小於n的所有數進行測試:for(inti=2;i<n;i++){
//測試i是否為素數; //若i為素數則輸出i;}測試i是否為素數方法是:用2,3,…,i-1這些數逐個去除i,只要被其中一個數整除,則i就不是素數。4.4.3for語句#include<iostream>#include<cmath>usingnamespacestd;intmain(){ intn; cout<<"請輸入一個正整數:"<<endl; cin>>n;
for(inti=2;i<n;i++)
{//判斷2、3、...、n-1是否為素數
intj=2; while(j<i&&i%j!=0)//判斷i是否能被2~i-1整除
j++; if(j==i)
//i是素數
cout<<i<<"";} cout<<endl; return0;}4.4.3for語句【例4.18】列印如下九九乘法表。1*1=11*2=22*2=41*3=32*3=63*3=91*4=42*4=83*4=124*4=161*5=52*5=103*5=154*5=205*5=251*6=62*6=123*6=184*6=245*6=306*6=361*7=72*7=143*7=214*7=285*7=356*7=427*7=491*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=641*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=814.4.3for語句分析:九九乘法表共有九行,第i行上有i個式子,用二重for迴圈完成,外層for迴圈控制共輸出九行;內層for迴圈控制每行的輸出。for(inti=1;i<=9;i++){
for(intj=1;j<=i;j++)
//{列印第i行上的第j個式子;} //換行;}4.4.3for語句#include<iostream>usingnamespacestd;intmain(){ for(inti=1;i<=9;i++){ for(intj=1;j<=i;j++) cout<<j<<"*"<<i<<"="<<i*j<<""; cout<<endl; }
return0;}4.4.3for語句三種迴圈控制語句小結:while、do-while、for迴圈語句,三者語句形式不同,相互之間有一定的區別,但主要結構都是由迴圈控制條件和循環體構成。從表達能力上講,三種迴圈語句是等價的,它們之間可以互相替代;while、do-while迴圈一般採用標誌式迴圈(迴圈次數未知),for迴圈採用的大多數為計數式迴圈(迴圈次數已知)。4.4.3for語句如果迴圈前能確定迴圈的步數(計數控制的迴圈),或者下一次迴圈準備比較明確,則用for語句,即for一般用於迴圈次數可預知的重複控制;如果是由事件控制的迴圈,一般使用while或do-while語句,如果迴圈至少執行一次,則使用do-while語句;for語句直觀地表示出:迴圈初始化、迴圈結束條件以及下一次迴圈準備,而且迴圈控制均在迴圈頂部統一表示,結構性比較好,很多情況下都採用for語句。4.5流程轉向語句4.5.1break語句break語句的格式:break;break語句的作用:結束switch語句的某個分支的執行;退出包含它的最內層迴圈語句(迴圈嵌套的情形),即循環體中只要執行了break語句,就立即結束當前(本層)迴圈,循環體中跟在break語句後面的語句將不再執行,程式繼續執行迴圈之後的語句;在循環體中,break語句一般作為某個if語句的子句,用於實現進一步的迴圈控制。4.5.1break語句【例4.19】商店售貨提供折扣,購貨金額數量越大,折扣越大,標準為(m:購貨金額,d:折扣率):m<250(元) d=0%250≤m<500 d=5%500≤m<1000 d=7.5%1000≤m<2000 d=10%m≥2000 d=15%從鍵盤輸入購貨金額,計算實付金額。4.5.1break語句分析:首先應找出購貨金額與折扣率之間對應關係變化的規律。從題意可知,當購貨金額m每變化250元或250元的倍數時,折扣率就會變化。用m/250來表示折扣率的分檔情況,見下表。mc=m/250dm<25000%250≤m<50015%500≤m<10002,37.5%1000≤m<20004,5,6,710%m≥2000815%商店打折售貨分檔情況表根據購貨金額確定好折扣率後,再計算出實付金額。4.5.1break語句#include<iostream>usingnamespacestd;intmain(){intm,c;floatd,f;cout<<"inputm:";cin>>m;if(m>=2000)c=8;elsec=m/250;switch(c){
4.5.1break語句
case0: d=0;break;
case1: d=5;break; case2:
case3: d=7.5;break;
case4: case5:
case6:
case7: d=10;break; case8: d=15;break; } f=m*(1–d/100); cout<<"f="<<f<<endl;
rerurn0;}4.5.1break語句注意:對於嵌套的迴圈語句,break語句只能跳出當前(本層)迴圈語句,即從內層迴圈跳到外層迴圈,要退出外層迴圈還要在外層迴圈中使用break,例如:
inti=0,sum=0;while(i<5){
for(intj=0;j<5;j++){ sum+=i+j; if(j==i)
break;
}
i++;}4.5.2continue語句continue語句的格式:continue;continue語句只能用在迴圈語句的循環體中,表示立即結束本次迴圈,準備進入下一次迴圈。對於while和do-while語句,continue語句將使控制轉到迴圈條件的判斷;對於for語句,continue語句將使控制轉到:先計算運算式3,然後計算運算式2,並根據運算式2的計算結果來決定是進入下一次迴圈還是結束迴圈。4.5.2continue語句【例4.20】輸入10個整數,統計其中正數的個數及正數的和。#include<iostream>usingnamespacestd;intmain(){inta,num=0,sum=0; cout<<"pleaseinput10integer:";for(inti=1;i<=10;i++){ cin>>a; if(a<=0) continue;//若a為負數則轉向for語句中表達式3執行
num++;//若a為正數則num加1,將a累加到sum中
sum+=a;}cout<<"正數個數:"<<num<<'\t'<<"正數之和:"<<sum<<endl;return0;}注意:continue語句不能在迴圈語句之外單獨使用,用在嵌套迴圈語句中時,只對當前迴圈起作用。4.5.2continue語句continue語句和break語句的區別是:continue語句只結束本次迴圈,而break語句則是結束整個迴圈,不再進行條件判斷。
【例4.21】輸出100~200之間不能被3整除的數。#include<iostream>usingnamespacestd;intmain(){for(intn=100;n<=200;n++){if(n%3==0) continue; cout<<n<<'\t'; }
return0;}運行結果:100101103104…1992004.5.3goto語句goto語句的作用是改變程式的流程,無條件地轉移到指定語句標號的語句處去執行。goto語句的格式:goto<語句標號>;語句標號定義格式為:<語句標號>:<語句>4.5.3goto語句LOOP:sum+=i++;if(i<=100)
goto
LOOP;語句標號標識語句在程式中的位置,常常作為轉移語句(goto語句)的轉移目標,語句標號可用除整數以外的識別字來表示,語句標號可以直接使用,不必先聲明後使用,例如:4.5.3goto語句【例4.22】求sum=1+2+3+4+…+n,n由鍵盤輸入。分析:可用if語句和goto語句構成迴圈結構來完成。#include<iostream>usingnamespacestd;intmain(){inti,n,sum;cout<<"pleaseinputaninteger:";cin>>n;sum=0;i=1;loop:sum=sum+i;
4.5.3goto語句
i++;if(i<=n)gotoloop;cout<<"sum="<<sum<<endl;return0;}運行結果:pleaseinputaninteger:6sum=214.5.3goto語句goto語句的幾點說明:可從條件語句或迴圈語句裏面轉移到條件語句或迴圈語句外面,但不允許從條件語句或迴圈語句外面轉移到條件語句或迴圈語句裏面;不能用goto語句轉移到其他函數中;屬於非結構化的轉向控制語句,非結構化語句的缺點是:使程式的靜態結構和動態結構不一致、程式的可讀性下降、容易出錯(結構化程式中的每一個結構都應是單入口/單出口,goto語句會破壞這個規則),因此,結構化程式設計不提倡用goto語句;4.5.3goto語句一般用來與if語句一起構成迴圈結構;優點是靈活、高效,主要用於跳出多重迴圈。例如:for(intm=1;m<10;m++)
for(intn=1;n<10;n++) if(m*n==50)
gotoEND;//輸出兩個小於10且乘積為50的正整數END:cout<<m<<","<<n<<endl; 4.6編譯預處理【例4.23】輸入兩個整數a和b,調用函數max()求兩數最大值。//filemain.cpp#include<iostream>//包含輸入/輸出頭檔iostream#include"filemax.h"//
包含自定義頭檔filemax.husingnamespacestd;intmain(){ inta,b; cout<<"Inputa,b:"; cin>>a>>b; cout<<"max="<<max(a,b)<<endl; return0;}4.6編譯預處理在C++中,常用的編譯預處理命令有:檔包含命令宏定義命令條件編譯命令所有預處理命令在程式中都以“#”開頭,一般放在根源程式的開頭處,編譯預處理命令單獨占一行,該行上不能再有預處理命令和語句。預處理命令一行寫不下,可以續行,但需要加續行符(\)。預處理命令實際上是編譯命令,它不是語句,一般不需要用(;)結束。上例中,#include<iostream>稱為“編譯預處理命令”。在C++中,程式被正常編譯之前,對根源程式中的預處理命令作處理的過程稱為編譯預處理。4.6.1檔包含命令將另一個頭檔(.h)內容包含到本源檔中稱為檔包含,檔包含命令格式如下:#include<檔案名>
或#include"檔案名"檔包含命令的功能是將“檔案名”所指的檔內容讀入到當前檔中,作為當前檔的一個組成部分,即用檔內容替代該#include命令。在#include命令中,檔案名可以用雙引號或尖括弧括起來,其中,尖括弧指示編譯器到存放C++庫函數頭檔的目錄中查找要包含的檔,用於調用庫函數頭檔。雙引號指示編譯器先在用戶當前目錄中找要包含的檔,若找不到再查找庫函數的頭檔目錄,用於調用自定義頭檔。
4.6.1檔包含命令例如:根源程式檔file1.cpp中有檔包含命令:#include"file2.h",則編譯預處理程式將file2.h檔的全部內容複製並插入到file1.cpp檔中的#include"file2.h"命令處,即file2.h被包含到file1.cpp中,然後將包含file2.h後的file1.cpp檔作為根源程式檔來處理。圖4-7檔包含命令4.6.1檔包含命令現將例4.23補充完整,頭檔filemax.h的內容為:intmax(intx,inty){
return(x>y?x:y);}編譯預處理後,原始檔案filemain.cpp的內容如下:#include<iostream>usingnamespacestd;intmax(intx,inty){return(x>y?x:y);}intmain(){inta,b;cout<<"Inputa,b:";cin>>a>>b;cout<<"max="<<max(a,b)<<endl;return0;}4.6.1檔包含命令說明:#include只能指定一個被包含檔,如果要包含多個檔,則要用多個#include命令;檔包含是可以嵌套的。例如:file1.cpp中有命令:#include"file2.h"file2.h中有命令:#include"file3.h"相當於:file1.cpp中有命令:#include"file2.h"#include"file3.h“根據需要,檔包含命令可出現在根源程式中的任何位置:根源程式的開頭、中間或者末尾,通常,將檔包含命令放在根源程式檔開始部分。
4.6.2宏定義用指定的識別字來代表一個字串稱為宏定義,該識別字被稱為宏名,被定義的字串稱為替換文本。宏定義分為無參數的宏定義和帶參數的宏定義兩種。
無參數的宏定義命令格式:#define<宏名>字串其中,define是關鍵字,<宏名>是一個識別字,字串是任意的字元序列。例如:#definePI3.1415926#defineN20#defineMAXSIZE100#defineEPS1.0e-84.6.2宏定義一個識別字被宏定義後,該識別字就是一個宏名。這時,在程式的代碼中出現的宏名,在編譯時,首先將宏名用被定義的字串替換,這個過程稱為宏替換,替換後才繼續進行編譯。例如:#definePROMPT"Areais"作用是將宏名PROMPT定義為字串“Areais”。若程式中有如下語句:cout<<PROMPT;則用"Areais"代替宏名PROMPT,即變成:cout<<"Areais";4.6.2宏定義【例4.24】求圓的周長、面積及圓球的體積。#include<iostream>usingnamespacestd;#definePI3.14159//無參數宏定義命令將宏名PI定義為實數3.14159intmain(){floatr,l,s,v;cout<<"Inputradious:";cin>>r;l=2.0*PI*r; s=PI*r*r;//宏替換:用3.14159代替PI,s=3.14159*r*rv=4.0/3.0*PI*r*r*r;cout<<"Perimeter="<<l<<endl;cout<<"Area="<<s<<endl;cout<<"Volume="<<v<<endl;
return0;}運行結果:Inputradious:6.5Perimeter=40.8407Area=132.732Volume=1150.354.6.2宏定義一般在使用宏定義時應該注意以下幾點:宏名一般習慣用大寫字母,以便與變數名相區別;宏替換僅作替換不作正確性檢查;宏定義命令不是C++語句,不必在行末加分號;宏定義可出現在程式中的任何位置。通常,將宏定義放在根源程式檔開始部分。宏名的作用域為從宏定義開始到該根源程式檔結束;可用#undef命令終止宏名的作用域,格式為:#undef宏名4.6.2宏定義例如:#defineN100main(){…}#undefNf(){ …}在進行宏定義時,可以引用已定義的宏名,即宏名可以層層替換。4.6.2宏定義【例4.25】求圓的周長、面積及圓球的體積。#include<iostream>usingnamespacestd;#definePI3.14159#defineR10.0#defineL2*PI*R#defineSPI*R*R#defineV4.0/3.0*PI*R*R*Rintmain(){ cout<<"L="<<L<<endl; cout<<"S="<<S<<endl; cout<<"V="<<V<<endl;
return0;}運行結果:L=62.8318S=314.159V=4188.794.6.2宏定義對程式中用雙引號括起的“宏名”不進行替換,雙引號括起的“宏名”其實是字串常量,即不會替換字串常量中的宏名;不支持宏名重定義,在同一個作用域內,同一個宏名不能定義兩次或兩次以上;宏定義與定義變數的含義不同,只作字元替換,不分配記憶體空間。4.6.2宏定義帶參數的宏定義命令格式:#define宏名(<參數表>)字串宏名是識別字,<參數表>中的參數為形參列表,可以有一個或多個參數,參數之間以逗號分隔,這些形參在程式中將被實參替換。字串是被替換用的字元序列。如果有帶實參的宏名,則按#define命令行中指定的字串進行替換,並用實參替換形參,這個過程稱為“宏調用”。例如:#defineADD(x,y)x+y如果在程式中有如下語句:sum=ADD(3,4);則被替換為:sum=3+4;4.6.2宏定義【例4.26】求圓的周長、面積及圓球的體積。#include<iostream>usingnamespacestd;#definePI3.14159#defineL(r)2.0*PI*r//定義帶參數宏名L(r),其中r為形參#defineS(r)PI*r*r#defineV(r)4.0/3.0*PI*r*r*rintmain(){floatradius;cout<<"Inputradius:";cin>>radius;cout<<"L="<<L(radius)<<endl;//宏調用後為cout<<"L="<<2.0*3.14159*radius<<endl;cout<<"S="<<S(radius)<<endl;cout<<"V="<<V(radius)<<endl;
return0;}4.6.2宏定義注意點:若宏調用中的實參為運算式,則在宏定義中應用括弧將形參括起來。例如:使用帶參數的宏定義求圓面積時,宏定義為:#defineS(r)3.14159*r*r若程式中有宏調用語句:area=S(a+b);
//實參為運算式a+b則替換成:area=3.14159*a+b*a+b;
//可能並非程式員原意所以宏定義應改為:#defineS(r)3.14159*(r)*(r)此時形參替換成:area=3.14159*(a+b)*(a+b);
//正確4.6.2宏定義宏名與括弧間不能有空格,否則將空格後的全部字元都作為無參數宏所定義的字串。例如:#defineS(r)3.14159*r*r認為S是不帶參數的宏定義,代表字串“(r)3.14159*r*r”。若程式中有:area=S(a);則替換成:area=(r)3.14159*r*r(a);
//錯誤4.6.2宏定義帶參數的宏和函數的區別:定義形式不一樣。宏定義中只給出形式參數,而不要指明每一個形式參數的類型。在函數定義時,必須指定每一個形式參數的類型。函數調用時,要求實參和形參的類型一致,而宏調用時不存在類型問題;函數調用是在程式運行時進行的,分配臨時的記憶體單元;宏調用則是在程式編譯時進行的,並不分配記憶體單元,不進行值的傳遞處理;函數調用時,先求實參運算式的值,然後將值代入形參;而宏調用時只是用實參文本替換形參;宏展開後根源程式膨脹,相應地,編譯生成的二進位可執行檔體積也會變大;函數調用不存在這個問題。
4.6.3條件編譯一般情況下,根源程式中所有的行都參加編譯。但是有時希望對其中的一部分內容只在滿足一定條件才進行編譯;有時希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時,則編譯另一組語句,即對根源程式的一部分內容指定編譯條件,這就是“條件編譯”。4.6.3條件編譯條件編譯命令有三種格式:格式1:#ifdef<識別字>
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (2026年)护士年度工作计划
- (2026版)抗菌药物使用管理培训考试试卷(附答案)
- 紫胶洗色干燥工岗前基础实操考核试卷含答案
- 地质实验员岗前师带徒考核试卷含答案
- 废塑料加工处理工9S考核试卷含答案
- 化纤聚合工风险评估水平考核试卷含答案
- 插秧机操作工诚信评优考核试卷含答案
- 制浆工安全宣贯水平考核试卷含答案
- 木制家具工安全规程模拟考核试卷含答案
- 风力发电运维值班员班组考核测试考核试卷含答案
- 学校政府采购内控管理制度(2026年修订含表)
- 2026年驾照科目四安全文明驾驶全真试题(含详细答案解析)
- 非煤矿山安全管理的六大制度
- IPC-A-600 标准中文版(详细解读)
- 通风空调系统维护保养方案
- 工业机器人安全操作规程手册
- 2026金红石钛白粉替代技术进展与环保政策合规研究
- 病毒性脑炎诊疗规范
- 特克斯千汇矿业博故图金矿采选980万吨-年改扩建工程环境影响报告书
- GB/T 9535.101-2025地面用光伏组件设计鉴定和定型第1-1部分:晶体硅光伏组件测试的特殊要求
- 2026年语文山东中考试卷及答案
评论
0/150
提交评论