C++第三章-結(jié)構(gòu)化程序設(shè)計.ppt_第1頁
C++第三章-結(jié)構(gòu)化程序設(shè)計.ppt_第2頁
C++第三章-結(jié)構(gòu)化程序設(shè)計.ppt_第3頁
C++第三章-結(jié)構(gòu)化程序設(shè)計.ppt_第4頁
C++第三章-結(jié)構(gòu)化程序設(shè)計.ppt_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第三章 結(jié)構(gòu)化程序設(shè)計,3.1 順序結(jié)構(gòu) 3.2 選擇結(jié)構(gòu) 3.3 循環(huán)結(jié)構(gòu) 3.4 其它控制語句 3.5 應用舉例,3.1 順序結(jié)構(gòu),順序結(jié)構(gòu):按照語句出現(xiàn)的先后順序依次執(zhí)行。 3.1.1 表達式語句 形式: 表達式; 例如:,i+; sum=a+b; coutabendl;,3.1.2 空語句,形式: ; 作用: 當程序中某個位置在語法上需要一條語句,而在語義上又不 要求執(zhí)行任何動作時,可放上一條空語句。 一般適用于在循環(huán)語句中做空循環(huán)體; 如:,for (m = 0; m1000; m+) ;,3.1.3 復合語句,形式: 變量定義 語句組 作用:當程序中某個位置在語法上只允許一條語句,

2、 而在語義上要執(zhí)行多條語句才能完成某個操作時,需要使用復合語句。,例如:,if(x=0) couta; coutb;,引例:已知三角形的三邊,求其面積。,#include iostream.h #include math.h void main() float a,b,c,p,s; cinabc; p=(a+b+c)/2; s=sqrt(fabs(p*(p-a)*(p-b)*(p-c); cout三角形面積為:sendl; ,3.2 選擇結(jié)構(gòu),選擇結(jié)構(gòu):根據(jù)條件的值來判斷程序的流向。 C/C+中,提供兩類選擇控制語句: if語句,實現(xiàn)n分支,要求n個表達式; switch語句,實現(xiàn)多分支;只用

3、1個表達式。,3.2.1 if 語句,if語句的三種形式: 形式1: if (表達式) 語句 作用:當表達式為真(非0)時,執(zhí)行表達式后面的語句, 否則繞過該語句,而執(zhí)行其后面的語句。 【例3.1】已知兩個數(shù)x和y,比較它們的大小,使得x大于y。,if(xy;,#include iostream.h void main() int x,y,t; coutxy; if (xyendl; ,程序:,形式2: if (表達式) 語句1 else 語句2 作用:當表達式為真(非0)時,執(zhí)行語句1,否則執(zhí)行語句2。 【例3.2】計算分段函數(shù):,要使max存放x、y中大者, min存放小者,分析下面程序段

4、正確否?,if (x) y=sin(x)+sqrt(x*x+1); else y=cos(x)x*x+3*x;,if (xy) max = x; min = y; else max = y; min = x;,error C2181: illegal else without matching if,形式3: if (表達式1) 語句1 else if (表達式2) 語句2 else if (表達式n) 語句n else 語句n+1 作用:當表達式1的值為true時,執(zhí)行語句1;否則判斷當表達式2的值為true時執(zhí)行語句2;依此類推,若表達式的值都為false,則執(zhí)行語句n+1。,【例3.3】

5、已知成績mark,要求顯示對應五級制的評定,評定條件:,if (mark = 90) cout 優(yōu); else if (80 = mark ,if (mark = 60) cout= 70) cout= 80) cout=90) cout 優(yōu); else cout 不及格;,分析下面兩程序段:,注意: 不管有幾個分支,程序執(zhí)行一個分支后,其余分支不再執(zhí)行。 else if不能寫成elseif。 當多分支中有多個表達式同時滿足,則只執(zhí)行第一個與之匹配的語句。,if (mark = 90) cout=80) cout=70) cout=60) cout 及格; else cout 不及格;,if語

6、句的嵌套形式,if語句的嵌套是指if或else后面的語句本身又是一個if語句。 如: if(表達式1) if(表達式11) 語句11 else 語句12 else 語句2,if (表達式1) if (表達式2) 語句1 else 語句2,注意: 為了增強程序的可讀性,建議采用鋸齒型的書寫形式。 else始終與它上面的最近的if語句配對,而這個if語句又沒有 其它的else與之匹配 。,如何使之與第一個if配對?,【例3.4】已知x,y,z三個數(shù),使得xyz。 可用一個IF語句和一個嵌套的IF語句實現(xiàn)。,if (xy) t=x ; x=y ; y=t; if (yz) t=y ; y=z ; z

7、=t ; if (xy) t=x ; x=y ; y=t ; ,if (xy) t = x, x = y, y = t; if (xz) t = x, x = z, z = t; if (yz) t = y, y = z, z = t;,3.2.2 switch語句,形式: switch(表達式) case 常量表達式1:語句組1; break; case 常量表達式2:語句組2; break; case 常量表達式n:語句組n; break; default: 語句組n+1 ,執(zhí)行順序:當表達式的值與某個常量表達式的值相等時,則執(zhí)行該常量表達式后面相應的語句,若使用了break, 則執(zhí)行完該

8、語句后便退出switch語句;否則,還要依次執(zhí)行其后面的各條語句。若找不到相匹配的常量表達式,則執(zhí)行default后面的語句。,必須為整型或字符型,2a+1 (1=a2) 【例3.5】用switch結(jié)構(gòu)求分段函數(shù)b= a2-3 (2=a4) a 其它,正確: switch(int)a) case 1: b=2*a+1;break; case 2: case 3: b=a*a-3;break; default: b=a; ,錯誤: switch(int)a) case a=1 ,共用同一個語句組,思考:若省去break語句,情況會怎樣?,【例3.4】百分制以5級制顯示:,switch (int(

9、mark/10) case 10: case 9: cout 優(yōu); break; case 8: cout 良; break; case 7: cout 中; break; case 6: cout 及格; break; default: cout 不及格; ,思考:若省去break語句,情況會怎樣?,if (mark = 90) cout=80) cout=70) cout=60) cout 及格; else cout 不及格;,綜合應用: 自測四則運算 要求:自動產(chǎn)生1-10的操作數(shù)和運算符代碼,用戶輸入答案,計算機顯示正確與否。 分析:利用rand函數(shù)產(chǎn)生操作數(shù)和運算符代碼; 利用swi

10、tch語句進行運算符代碼轉(zhuǎn)換和運算 用戶輸入答案后進行判卷,進一步分析: 要產(chǎn)生若干道題?,#include iostream.h #include stdlib.h void main() int num1,num2,nop; char op,c; float result,an; num1=rand() % 11; num2=rand() % 11; nop =rand() % 4; switch (nop) case 0: op=+;result=num1+num2;break; case 1: op=-;result=num1-num2;break; case 2: op=*;resu

11、lt=num1*num2; break; case 3: op=/;result=num1/num2; coutan; if (result=an) cout okendl; else cout errorendl; ,3.3 循環(huán)結(jié)構(gòu),C+語言提供了三種循環(huán)語句:,流程圖如下: while do-while for,while (表達式) 語句,do 語句 while (表達式);,for(表達式1;表達式2;表達式3) 語句,#include iostream.h #include stdlib.h void main() int num1,num2,nop; char op; float

12、 result,an; /do num1=rand() % 11; num2=rand() % 11; nop =rand() % 4; switch (nop) case 0: op=+;result=num1+num2;break; case 1: op=-;result=num1-num2;break; case 2: op=*;result=num1*num2; break; case 3: op=/;result=num1/num2; coutan; if (result=an) coutc; / while (c=y); ,【例3.6】用上述三種循環(huán)語句求,while語句:,n =

13、 1;s = 0; while (n=100) s=s+n; n=n+1; ,n = 1; s = 0; do s = s+n; n = n+1; while(n=100);,do-while語句:,for (n = 1,s = 0;n=100;n+) s=s+n;,for語句:,【例3.7】求下列級數(shù)的前m項和,要求其誤差小于0.00001。,分析: 級數(shù)的通項為 xm/m!, 第i項ti與第i-1項 ti-1之間存在如下關(guān)系: ti=t i-1*x/i,int i(1);float t(1),e(0); while(t1e-5) e+=t; t*=x/i; i+;,int i(1);flo

14、at t(1),e(0); for( ;t1e-5; ) e+=t; t *=x/i; i+;,for(i=1,t=1,e=0;t1e-5; e+=t, t *=x/i,i+);,分號不能省略,空語句,3.3.3 循環(huán)的嵌套,循環(huán)的嵌套:循環(huán)體內(nèi)包含另一個完整的循環(huán)結(jié)構(gòu)。 三種循環(huán)語句皆可以相互嵌套 。 【例3.8】打印九九乘法表,#include iostream.h void main() coutt 九九乘法表endl; coutt -endl; for(int i=1;i=9;i+) for(int j=1;j=9;j+) coutij=i*jt; coutendl; ,程序:,思考:

15、打印上三角或下三角程序如何改動?,3.4 其它控制語句,break語句和 continue語句 break語句有兩個作用: 用于switch語句中,保證多分支情況的正確執(zhí)行; 用于循環(huán)語句中,強制終止本層循環(huán)(跳出本層循環(huán))。 Continue語句的作用: 繞過本次循環(huán),強行進入下一次循環(huán)。 即它只能跳過循環(huán)體中continue后面的語句。 注意: continue只能用于循環(huán)語句,3.4 其它控制語句,【例3.9】 break 和 continue 語句的區(qū)別,for(m=20;m0;m-) if(m % 6=0) break; coutm ; ,for(m=20;m0;m-) if(m %

16、 6=0) continue; coutm ; ,3.5 應用舉例,1. 求最大值(或最小值) 【例3.10】從鍵盤輸入一組數(shù),求這組數(shù)中的最大值。,cinm; max=m; /第一個數(shù)假設(shè)為最大數(shù) while (cinm,m!=0) if (mmax) max=m;,max=0; /設(shè)一個較小的數(shù)為最大值的初值 for(int i=0;im; if (mmax) max=m; ,以輸入0作為結(jié)束,輸入數(shù)的個數(shù)未知,輸入數(shù)的個數(shù)已知,for(k=n;k0;k-) if(m%k= =0,2.最大公約數(shù),假設(shè)m、n是兩個整數(shù),且mn,【例3.11】用輾轉(zhuǎn)相除法求兩自然數(shù)的最大公約數(shù)。 算法思想:

17、(1) 對于已知兩數(shù)m,n,使得mn (2) m除以n得余數(shù)r (3) 若r=0,則n為最大公約數(shù),結(jié)束;否則執(zhí)行(4) (4) mn,nr,再重復執(zhí)行(2),輾轉(zhuǎn)相除法 while (r=m % n)!=0) m=n;n=r; coutn;,輾轉(zhuǎn)相減法 m=m-n mn n=n-m nm m、n為公約數(shù) m=n while (m!=n) if(mn)m-=n;else n-=m;,#include iostream.h void main( ) int m, n, t, r; coutmn; if(mn) t=m; m=n; n=t; while (r=m % n)!=0) m=n;n=r;

18、 cout最大公約數(shù)為 nendl; ,程序:,3.質(zhì)數(shù) 【例3.12】求2100之間的素數(shù),并以每行顯示8個質(zhì)數(shù)。 質(zhì)數(shù):除1和它本身外,不能被其他任何一個整數(shù)整除的自然數(shù)。 分析: (1) 判別某數(shù)m是否為素數(shù)最簡單的方法是:用i=2,3,m-1逐個判別m能否被j整除,只要有一個能整除,m不是素數(shù),退出循環(huán);若都不能整除,則m是素數(shù)??蛇M一步證明:若m不能被 中任一整數(shù)整除,則m為質(zhì)數(shù)。 (2) 每行顯示8個,只要對求得的質(zhì)數(shù)計數(shù),滿8個換行。,. for(i=2;m%i!=0;i+); if(i=m) .,. k= sqrt(m); for(i=2;ik) .,程序: #include

19、iostream.h void main() int m,i,countm(0); for(m = 2;mm-1) coutmt; countm+; if (countm % 8 =0) coutendl; ,4. 求部分級數(shù)和 【例3.13】計算sin(x)的值,公式為: 當?shù)趎項的絕對值小于10-5時結(jié)束。 分析:關(guān)鍵是找部分級數(shù)和的通項,如下表示: ti+2= -1*ti*x*x/(i+1)*(i+2) i=1,3,5,7,t=x;i=1; sinx=0; while(fabs(t)=1e-5) sinx+=t; t=-t*x*x/(i+1)*(i+2); i=i+2; ,5. 窮舉法

20、【例3.14】百元買百雞問題。假定小雞每只5角,公雞每只2元,母雞每只3元。現(xiàn)有100元錢要買100只雞,列出所有可能的購雞方案。 分析: (1) 設(shè)母雞、公雞、小雞各為x、y、z只,列出方程為: x+y+z = 100 3x+2y+0.5z = 100 三個未知數(shù),兩個方程,此題有若干個整數(shù)解。 (2) 采用試湊法(也稱為窮舉法或枚舉法)來實現(xiàn),即將可能出現(xiàn)的各種情況一一羅列測試,判斷是否滿足條件,采用循環(huán)結(jié)構(gòu)來實現(xiàn)。,用三重循環(huán)來實現(xiàn): for(x=0;x=33;x+) for(y=0;y=50;y+) for(z=0;z=100;z+) if(3*x+2*y+0.5*z)=100) ,用

21、二重循環(huán)來實現(xiàn): for(x=0;x=33;x+) for(y=0;y=50;y+) z=100-x-y; if(3*x+2*y+0.5*z)=100) coutsetw(9)xsetw(9)ysetw(9)zendl; ,猴子吃桃子。小猴在某天摘桃若干個,當天吃掉一半多一個;第二天吃了剩下的桃子的一半多一個;以后每天都吃尚存桃子的一半多一個,到第7天要吃時只剩下一個,問小猴共摘下了多少個桃子? 分析:這是一個“遞推”問題,先從最后一天推出倒數(shù)第二天的桃子,再從倒數(shù)第二天的桃子推出倒數(shù)第三天的桃子。設(shè)第n天的桃子為xn,那么它是前一天的桃子數(shù)的xn-1 的一半減1,即xn-1 =( xn +1

22、)2,5.遞推法 “遞推法”也稱為 “迭代法”,其基本思想是把一個復雜的計算過程轉(zhuǎn)化為簡單過程的多次重復,每次重復都從舊值的基礎(chǔ)上遞推出新值,并由新值代替舊值。,#include iostream.h void main() int i,x=1; /第7天的桃子 cout=1;i-) cout 第i 天的桃子數(shù)為:x只endl; ,x = (x + 1) * 2;,5.遞推法,【例3.15】利用牛頓迭代法求方程 在x0附近的根的近似值。 牛頓迭代公式為: 輸入x0值,由公式求出x1,再由x1從公式求出x2,.,直到 時可視x n+1為方程f(x)=0在X0附近的一個近似根 ,設(shè)為10-5 。,x1=1; do x0=x1; x1=x0 - (3*x0*x0*x0-4*x0*x0-5*x0+13)/(9*x0*x0-8*x0-5) while(fabs(x1-x0)1e-5);,思考: 若迭代最高次數(shù)M后,即使達不到精度也要輸出結(jié)果, 程序該如何修改?,#include iostream.h #include math.h void main( ) double x0,x1,f1x,fx; x0=1; do fx=3*x0*x0*x0-4*x0*x0-5*x0+13; f1x=9*x0*x0-8*x0-5; /f(x0)的導數(shù) x1=x0-fx/f1x

溫馨提示

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

評論

0/150

提交評論