C++03第三章-基本控制結(jié)構(gòu)_第1頁
C++03第三章-基本控制結(jié)構(gòu)_第2頁
C++03第三章-基本控制結(jié)構(gòu)_第3頁
C++03第三章-基本控制結(jié)構(gòu)_第4頁
C++03第三章-基本控制結(jié)構(gòu)_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第三章 根本控制結(jié)構(gòu)

if語句

switch語句

while語句

do-while語句

for語句循環(huán)不變式§3.1程序的根本控制結(jié)構(gòu)

3.1.1C++語言的簡(jiǎn)單語句單語句:以分號(hào)“;”結(jié)束inta; 變量定義語句a=3*2; 表達(dá)式語句function(“example”); 函數(shù)調(diào)用語句空語句:只有一個(gè)分號(hào)“;”復(fù)合語句(塊語句)用花括號(hào){}括起來的假設(shè)干條語句〔可以是單語句、空語句、其他塊語句〕塊語句在語法上等價(jià)于一個(gè)單語句,所以在單語句可用的地方我們也可以使用塊語句。塊語句中每一個(gè)語句都以分號(hào)“;”結(jié)束,塊語句本身那么以右花括號(hào)“}”結(jié)束if〔a>b〕{

intt=a;

a=b;

b=t;

}3.1.1C++語言的簡(jiǎn)單語句單入口/單出口控制結(jié)構(gòu)

實(shí)現(xiàn)單入口/單出口程序只需三種根本的控制結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)當(dāng)條件p(條件表達(dá)式)成立,那么執(zhí)行一個(gè)分支,否那么執(zhí)行另一個(gè)分支多路分支循環(huán)結(jié)構(gòu)實(shí)現(xiàn)反復(fù)執(zhí)行某一局部的操作循環(huán)結(jié)構(gòu)三要素:循環(huán)條件p循環(huán)體A循環(huán)變量:在每次循環(huán)中都必須有語句修改此變量的值,以使循環(huán)條件表達(dá)式的值可能改變,從而跳出循環(huán)pANY3.1.3結(jié)構(gòu)化程序設(shè)計(jì)工具

程序框圖結(jié)構(gòu)化程序設(shè)計(jì)圖形工具N_S圖PAD圖Jackson結(jié)構(gòu)圖Warnier圖PDL〔ProgramDesignLanguage)§3.2選擇結(jié)構(gòu)

3.2.1if語句 if(條件表達(dá)式)子語句;if語句的有效范圍是單個(gè)語句,如果子語句有多個(gè)語句,那么必須用{}括起來,成為一個(gè)復(fù)合語句 if(條件表達(dá)式) 子語句1;

else 子語句2;[例3.2.1]輸入24小時(shí)制的時(shí)間,轉(zhuǎn)換并輸出12小時(shí)制的時(shí)間并注明是上午還是下午〔上午用A.M表示,下午用P.M表示〕#include<iostream.h>main(){ inthour; charnoon='A'; cout<<"Enterthehourplease:"; cin>>hour;

if(hour>12){ hour=hour-12; noon='P'; } cout<<"Thehouris"<<hour<<noon<<".M.\n";}*如果去掉花括號(hào)if(hour>12)hour=hour-12;noon='P';“noon=‘P’;”不是if的子語句,而是主流程if語句的下一個(gè)順序語句程序2: 程序3:#include<iostream.h>voidmain(){

floatx;

cout<<"Enterthehourplease:";

cin>>x;

if(x>12){

cout<<"P.M:";

x=x-12;

}

else cout<<"A.M:";

cout<<x<<‘\n’;}(改進(jìn))#include<iostream.h>voidmain(){

floatx;

cout<<"Enterthehourplease:";cin>>x;

if〔x<=12〕cout<<"A.M:";

else{ cout<<"P.M:"; x=x-12;}

cout<<x<<‘\n’;}//注意書寫層次結(jié)構(gòu)[例3.2.2]一個(gè)具有輸入合法性檢測(cè)的程序,要求用戶輸入的工齡在0~47之間,如果超出此范圍那么提示輸入錯(cuò)誤,否那么才接受用戶輸入。用戶輸入錯(cuò)誤時(shí),程序用轉(zhuǎn)義字符輸出一聲響鈴main(){ intstanding; //用戶輸入的工齡

floatstanding_salary;//根據(jù)用戶輸入工齡計(jì)算出來的工齡工資

cout<<"Yourstandinginthefactory:"; cin>>standing; if((standing>=0)&&(standing<=47)){ standing_salary=standing*1.5; cout<<"Inputaccepted.Yourstandingsalaryis" <<standing_salary<<"\n"; }else{ standing_salary=0; cout<<"Invalidinput.\x07\n"; }}嵌套if語句if(表達(dá)式1)

if(表達(dá)式2) 子語句1;

else 子語句2; else 子語句3;if(表達(dá)式1) 子語句1;

elseif(表達(dá)式2) 子語句2; …… elseif(表達(dá)式n) 子語句n; else 子語句n+1;[例3.2.3]從鍵盤上輸入3個(gè)數(shù)A,B,C,求出三數(shù)中最大者并輸出。#include<iostream.h>voidmain(){ intA,B,C,max; cout<<"EnterA,B,C,Please:"; cin>>A>>B>>C; max=A; if(B>max)max=B;//求出A、B中的較//大值,記錄在max中,然后再比較C與max if(C>max)max=C; cout<<"MAX(A,B,C):"<<max<<‘\n’;}采用嵌套if語句來實(shí)現(xiàn)if(A>B){ if(A>C) cout<<"Maximumis"<<A;

else cout<<"Maximumis"<<C; }else{ if(B>C) cout<<"Maximumis"<<B;

else cout<<"Maximumis"<<C;}垂懸else問題if(p1)if(p2)a=1;elsea=2;這樣的語句會(huì)引起二義性,else子句不知道應(yīng)該與哪個(gè)if語句配對(duì)。C++語言中是就近配對(duì):

if(p1){ 注意if與else的配

if(p2)a=1; 對(duì)關(guān)系,else總是

elsea=2; 與它上面的最近的

} if配對(duì)注意問題if語句中的表達(dá)式,一般為邏輯表達(dá)式或關(guān)系表達(dá)式else子句不能單獨(dú)使用,必須與if配套使用if以及else語句后面都只含一個(gè)內(nèi)嵌的操作語句,有效范圍都只有一個(gè)語句,假設(shè)需含多個(gè)操作,那么須用{}括起來。例:if(a+b>c){ cout<<“a+b>c”; c=a+b; }elsecout<<“a+b<=c”;程序//程序:AVERAGE.CPP//功能:求數(shù)、理、化三科平均成績(jī)的總評(píng),演示if語句嵌套的縮進(jìn)格式#include<iostream.h>voidmain(){ intmath,phys,chem; intaverage; floatscholarship; cout<<"Enterscoresofmath.,phys.,andchem.:"; cin>>math>>phys>>chem; average=(math+phys+chem)/3.0+0.5;//why? if(average>=90){ cout<<"Excellent.\n"; scholarship=120.00; }elseif(average>=80){ cout<<"Good.\n"; scholarship=85.00; 程序

}elseif(average>=70){ cout<<"Average.\n"; scholarship=55.00;

}elseif(average>=60){ cout<<"Pass.\n"; scholarship=45.50; }else{ cout<<"Fail.\n"; scholarship=0.00; } cout<<"Yourscholarshipis<<scholarship<<".\n";}條件表達(dá)式短路求值if〔〔members!=0)&&(income/members>800.00))…=>if〔members!=0){if(income/members>800.00))…}expression1&&expression2//expression1為0,expression2不做expression1||expression2//expression1非0,expression2不做3.2.2switch語句

多分支選擇語句

switch語句的一般形式如下:

switch(表達(dá)式){ case常量表達(dá)式1: 語句序列1; break; case常量表達(dá)式2: 語句序列2; break; … case常量表達(dá)式n: 語句序列n; break; default: 語句序列n+1; break; }說明表達(dá)式可為任何類型。Switch在入口時(shí)判斷表達(dá)式與哪個(gè)常量表達(dá)式匹配。假設(shè)表達(dá)式的值與某個(gè)case后面的常量相等,那么執(zhí)行與該case后面相應(yīng)的語句;假設(shè)與所有列出的常量都不相等,那么執(zhí)行default后面的語句。case后只能是常量表達(dá)式,不能是變量表達(dá)式,其值只能是整型、字符型、枚舉型,不能是其他類型。每個(gè)常量表達(dá)式的值都不相同。case局部與default局部出現(xiàn)次序不影響執(zhí)行結(jié)果。每局部不限單個(gè)語句,可寫多個(gè)語句,不用加{}。break;語句用于執(zhí)行完一個(gè)分支后跳出此switch語句例3.2.6#include<iostream.h>

main(){ intchoice; //用戶輸入的選擇

cout<<"1.Apple\n";//給出選擇菜單

cout<<"2.Pear\n"; cout<<"3.Banana\n"; cout<<"4.Orange\n"; cout<<"Enteryourchoice(1-4):"; cin>>choice; //用戶輸入選擇

switch(choice){ //對(duì)用戶的選擇分別作處理

case1: cout<<"Yourchoiceisapple.\n";

case2: cout<<"Yourchoiceispear.\n";

case3: cout<<"Yourchoiceisbanana.\n";

case4: cout<<"Yourchoiceisorange.\n";

default:cout<<"Youdidnotmakeachoice.\n";

}}break;

break;

break;

break;

break;例3.2.7//程序:ORDERS.CPP//功能:旅行社訂票折扣率計(jì)算#include<iostream.h>voidmain(){intorders,fragment;floatdiscount;cout<<"Inputticketordersplease:";cin>>orders;fragment=orders/10;switch(fragment){case0:discount=0.10;break;case1:discount=0.15;break;case2:discount=0.30;break;default:discount=0.45;break;}cout<<"Thediscountis"<<discount*100<<"%.\n";}§3.3循環(huán)結(jié)構(gòu)

3.3.1while語句while(循環(huán)條件表達(dá)式)循環(huán)體語句;當(dāng)表達(dá)式的值為T(非零)時(shí),循環(huán)條件成立,執(zhí)行循環(huán)體語句。while語句的作用范圍只到while后第一個(gè)分號(hào)〔單語句〕。假設(shè)循環(huán)體有多個(gè)語句那么需用{}括起來。在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句循環(huán)變量初始化需在while語句前完成例:給定一個(gè)正整數(shù)n,求出平方值不超過n的最大正整數(shù)并輸出。

程序流程圖如右:源程序:#include<iostream.h>

main(){ intn; //用戶給定的正整數(shù)

intmax; //所求的最大整數(shù)

cout<<"Enteranumber:"; //用戶給定一個(gè)自然數(shù)

cin>>n; //判斷用戶輸入是否合法

if(n<=0)cout<<"Inputerror!\n"; else{//利用循環(huán)求出平方大于n的最小整數(shù)

max=1;

while(max*max<=n) max=max+1; //輸出結(jié)果

cout<<"Themaximumintegeris:"<<max-1<<"\n"; }}例#include<iostream.h>Voidmain(){ intchoice=1; //用戶輸入的選擇

while(choice!=0){ cout<<"1.Apple\n";//給出選擇菜單

cout<<"2.Pear\n"; cout<<"3.Banana\n"; cout<<"4.Orange\n"; cout<<"0.Exit\n";cout<<"Enteryourchoice(0-4):"; cin>>choice; //用戶輸入選擇

switch(choice){ //對(duì)用戶的選擇分別作處理

case0:break; case1: cout<<"Yourchoiceisapple.\n";break; case2: cout<<"Yourchoiceispear.\n";break; case3: cout<<"Yourchoiceisbanana.\n";break; case4: cout<<"Yourchoiceisorange.\n";break; default: cout<<"Yourchoiceisinvalid.\n";break; } } cout<<"Thankyouforyourchoice.\n";}3.3.2do-while語句do 循環(huán)體語句;while(循環(huán)條件表達(dá)式p);先執(zhí)行一次循環(huán)體語句,然后判別表達(dá)式,當(dāng)為T時(shí),返回執(zhí)行循環(huán)體語句,直到表達(dá)式為F,結(jié)束循環(huán)while語句和do-while語句根本等價(jià),只有當(dāng)表達(dá)式一開始就為假時(shí),兩種語句結(jié)果不一樣i=20;sum=0; i=20;sum=0;while(i<=10){ do{ sum+=i; sum+=i; i++; i++;} }while(i<=10);結(jié)果sum=0 結(jié)果sum=203.3.2do-while語句//程序:SQRT.CPP//功能:利用牛頓法求一個(gè)正數(shù)的平方根#include<iostream.h>voidmain(){ constfloatEPS=1e-5; floatnum,root,pre; cout<<"Enteranumber:"; cin>>num; if(num<0)cout<<"Inputeroor!\n"; else{ root=1; do{ pre=root; root=(num/root+root)/2; }while((pre-root>EPS)||(root-pre>EPS)); cout<<"Therootof"<<num<<"is"<<root<<endl; }}3.3.3for語句for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 循環(huán)體語句;執(zhí)行過程:求解表達(dá)式1求解表達(dá)式2,

假設(shè)其值為T,執(zhí)行循環(huán)體語句,跳到第3)步;

假設(shè)為F,結(jié)束循環(huán),跳到第4)步求解表達(dá)式3,然后跳到第2)步循環(huán)結(jié)束,執(zhí)行for語句的下一條語句適用于循環(huán)次數(shù)的循環(huán)表達(dá)式1:循環(huán)變量賦初值表達(dá)式2:循環(huán)條件表達(dá)式3:循環(huán)變量增量〔計(jì)數(shù)表達(dá)式〕for語句中的三個(gè)表達(dá)式中任一個(gè)或全部均可省略,但分號(hào)必須保存sum=0;

for(i=1;i<=100;i++)

sum+=i;sum=0;

i=1;

for(;i<=100;i++)

sum+=i;sum=0;

for(i=1;;i++){

if(i>100)break;

sum+=i;

}sum=0;

for(i=1;i<=100;){

sum+=i;

i++;

}sum=0;i=1;

for(;i<=100;)

{ sum+=i;

i++;

}sum=0;

i=1;

for(;;)

{ if(i>100)break;

sum+=i;

i++;

}for(sum=0,i=1;i<=100;i++)

sum+=i;

while(i<=100)

while(1)程序//程序:ALPHABET.CPP//功能:正反向打印字母表。#include<iostream.h>voidmain(){charch;for(ch='A';ch<='Z';ch++)cout<<ch;cout<<endl;for(ch='Z';ch>='A';ch--)cout<<ch;cout<<endl;}程序//程序:TEMPTAB.CPP//功能:打印攝氏溫度與華氏溫度對(duì)照表#include<iostream.h>voidmain(){ constintmax=10; constintmin=-5; intcel; floatfah; //輸出對(duì)照表欄目

cout<<"Celsius"<<"\x09"<<"Fahrenheit"<<endl; for(cel=max;cel>=min;cel--){ fah=cel*1.8+32; cout<<cel<<"\x09"<<fah<<endl; }}3.3.4循環(huán)的嵌套三種循環(huán)可以相互替代一個(gè)循環(huán)體內(nèi)又包含另一個(gè)完整的循環(huán)結(jié)構(gòu)--循環(huán)的嵌套各種循環(huán)可以相互嵌套3.3.4循環(huán)的嵌套//程序:MULTITAB.CPP//功能:打印乘法口訣表#include<iostream.h>voidmain(){ inti,j; for(i=1;i<=9;i++){ for(j=1;j<=i;j++) cout<<i<<'*'<<j<<'='<<i*j<<''; cout<<endl; }}程序3.3.6公雞5元1只,母雞3元1只,小雞1元3只,花了100元錢買100只雞,問公雞、母雞、小雞各多少只?cock公雞的個(gè)數(shù);hen母雞的個(gè)數(shù);chicken小雞的個(gè)數(shù);得方程:

cock+hen+chicken=100 5*cock+3*hen+chicken/3=100#include<iostream.h>voidmain(){ intcock,hen,chicken; for(cock=0;cock<=100/5;cock++) for(hen=0;hen<=100/3;hen++){ chicken=100-cock-hen; if((chicken%3==0)&& ((5*cock+3*hen+chicken/3)==100)) cout<<“cock=”<<cock<< “\then=”<<hen<< “\tchicken=”<<chicken<<endl; }}運(yùn)行結(jié)果:cock=0hen=25chicken=75cock=4hen=18chicken=78cock=8hen=11chicken=81cock=12hen=4chicken=8420333.3.5設(shè)計(jì)正確的循環(huán)循環(huán)不變式一個(gè)或者多個(gè)表達(dá)式用于保證循環(huán)的正確性在循環(huán)前成立

在每次執(zhí)行循環(huán)體后仍成立

在循環(huán)結(jié)束后也成立3.4轉(zhuǎn)向語句轉(zhuǎn)向語句一般形式功能描述例子

break語句

break;1.用于switch語句,使流程跳出switch結(jié)構(gòu),繼續(xù)執(zhí)行下一個(gè)語句2.用于循環(huán)語句(while,do-while,for)3.除此之外,不能用于其他任何語句

for(…){…

if(…)break;…}a=1;continue語句

continue;結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,而接著進(jìn)行下一次循環(huán)的判斷。

for(…){…

if(…)continue;…}a=1;return語句

return表達(dá)式;結(jié)束被調(diào)用函數(shù),轉(zhuǎn)向主調(diào)函數(shù)原處的下一條語句,將表達(dá)式結(jié)果送回主調(diào)函數(shù)[例3.4.1](break的用法)

鍵盤輸入m和n〔10<m<n≤32000〕,求出m~n間所有素?cái)?shù)且按每行8個(gè)數(shù)形式輸出#include<iomanip.h>#include<iostream.h>#include<math.h>voidmain(){ intm,n,x,k,i,j; j=0; //j計(jì)算輸出個(gè)數(shù) do{ cout<<"\nEnterm,n〔10<m<n<320000〕:"; cin>>m>>n; }while((m<=10)||(m>=n)||(n>=32000)); cout<<"\n*******************\n";

for(x=m;x<=n;x++){//對(duì)m~n的數(shù)判別 k=sqrt(x); for(i=2;i<=k;i++) if(x%i==0)break;//余下不必再做 if(i>=k+1){//不是用break跳出的,找到一個(gè)素?cái)?shù) if(j%8==0)cout<<endl;//每行8個(gè)數(shù) cout<<setw(8)<<x; j=j+1; }//以每行8個(gè)數(shù)的形式輸出,每個(gè)數(shù)占8個(gè)字符的位置 } cout<<"\n**********************\n";}

[例3.4.2](continue的用法)

在鍵盤上輸入假設(shè)干個(gè)正數(shù),累加求和,最后輸出累加和以及平均值。問題分析:事先不知道要輸入多少個(gè)數(shù),但知道輸入數(shù)是正數(shù),我們可邊輸入邊統(tǒng)計(jì)其個(gè)數(shù),假設(shè)發(fā)現(xiàn)輸入的是0或負(fù)數(shù)時(shí),輸入結(jié)束。當(dāng)輸入數(shù)是大于0時(shí)那么累加并累計(jì)數(shù)的個(gè)數(shù)。源程序如下:#include<iostream.h>voidmain(){ doublesum,num;intn; sum=0.0;n=0;num=1.0;//設(shè)置初值

while(num>0){ cout<<"\nEnternum(Nega

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論