C語言選擇結(jié)構(gòu)程序設(shè)計(jì)課件_第1頁
C語言選擇結(jié)構(gòu)程序設(shè)計(jì)課件_第2頁
C語言選擇結(jié)構(gòu)程序設(shè)計(jì)課件_第3頁
C語言選擇結(jié)構(gòu)程序設(shè)計(jì)課件_第4頁
C語言選擇結(jié)構(gòu)程序設(shè)計(jì)課件_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章選擇結(jié)構(gòu)程序設(shè)計(jì)C語言選擇結(jié)構(gòu)程序設(shè)計(jì)三種基本結(jié)構(gòu)順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)已經(jīng)證明,任何程序均可只用這三種結(jié)構(gòu)實(shí)現(xiàn)B?hm,Corrado,andJacopiniGuiseppe.

"Flowdiagrams,Turingmachinesandlanguageswithonlytwoformationrules."

CommunicationofACM,9(5):366-371,May1966.只用這三種結(jié)構(gòu)的程序,叫結(jié)構(gòu)化程序程序“必須”符合結(jié)構(gòu)化規(guī)則C語言選擇結(jié)構(gòu)程序設(shè)計(jì)結(jié)構(gòu)化程序設(shè)計(jì)的核心思想

采用順序、選擇和循環(huán)三種基本結(jié)構(gòu)作為程序設(shè)計(jì)的基本單元只有一個(gè)入口;只有一個(gè)出口;無死語句,即不存在永遠(yuǎn)都執(zhí)行不到的語句;無死循環(huán),即不存在永遠(yuǎn)都執(zhí)行不完的循環(huán)。采用“自頂向下、逐步求精”和模塊化的方法進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)C語言選擇結(jié)構(gòu)程序設(shè)計(jì)流程圖順序結(jié)構(gòu)選擇結(jié)構(gòu)truefalsetruefalse循環(huán)結(jié)構(gòu)C語言選擇結(jié)構(gòu)程序設(shè)計(jì)語句塊(Block){}括住的若干條語句構(gòu)成一個(gè)語句塊語句塊內(nèi)可以定義變量變量必須在語句塊的開頭定義變量僅在定義它的語句塊內(nèi)(包括下層語句塊)有效同一個(gè)語句塊內(nèi)的變量不可同名,不同語句塊可以同名(homonym.c)各司其職、下層優(yōu)先盡量不要在下層語句塊內(nèi)定義變量,也盡量不要定義同名變量語句塊可以用在任何可以使用語句的地方,但沒有道理要亂加語句塊C語言選擇結(jié)構(gòu)程序設(shè)計(jì)if-else選擇結(jié)構(gòu)的一種最常用形式if(表達(dá)式)

語句塊1;

else

語句塊2;

語句塊3表達(dá)式值非0時(shí),執(zhí)行語句塊1,然后語句塊3;

表達(dá)式值為0時(shí),執(zhí)行語句塊2,然后語句塊3else部分可以沒有。當(dāng)表達(dá)式值為0時(shí),直接執(zhí)行語句3if-else嵌套使用時(shí),注意else和誰配套的問題if.c表達(dá)式!=0?YN語句塊1語句塊2語句塊3C語言選擇結(jié)構(gòu)程序設(shè)計(jì)if-else語句NS圖if語句的基本形式:雙選擇結(jié)構(gòu):if(條件)真子句else假子句單選擇結(jié)構(gòu):if(條件)真子句條件真假真子句

假子句條件真假真子句

C語言選擇結(jié)構(gòu)程序設(shè)計(jì)if語句的嵌套根據(jù)單/雙選擇結(jié)構(gòu),有五種嵌套形式:1)if(條件1)2)if(條件1)

if(條件2){

子句1if(條件2)

else

子句1

子句2

}

else

else

子句3子句23)if(條件1)4)if(條件1)5)if(條件1)

子句1子句1 if(條件2)

elseif(條件2)

else

if(條件2)子句1

子句2子句2else

else

子句2

子句3else

if(條件3)

子句3

else

子句4提問:為什么1)可以不用括號(hào),而2)必須要有括號(hào)?就是多分支選擇結(jié)構(gòu)C語言選擇結(jié)構(gòu)程序設(shè)計(jì)if-else編程舉例pp70例4-1例4-2例4-3if.cC語言選擇結(jié)構(gòu)程序設(shè)計(jì)if-else編程舉例從錯(cuò)誤中學(xué)習(xí)分號(hào)的位置else的寫法語句塊未加{}多個(gè)條件的表達(dá)if.cC語言選擇結(jié)構(gòu)程序設(shè)計(jì)else-ifif的一種擴(kuò)展if(表達(dá)式1)

語句塊1;

elseif(表達(dá)式2)

語句塊2;

elseif(表達(dá)式3)

語句塊3;

…………

else

語句塊4;

語句塊5;else部分可以沒有表達(dá)式1!=0?YN語句塊1語句塊2語句塊5表達(dá)式2!=0?表達(dá)式3!=0?語句塊3N語句塊4NYYC語言選擇結(jié)構(gòu)程序設(shè)計(jì)else-if編程舉例分段函數(shù)的計(jì)算C語言選擇結(jié)構(gòu)程序設(shè)計(jì)switch開關(guān)語句switch(表達(dá)式){

case

整型常數(shù)1:

語句1;

case

整型常數(shù)2:

語句2;

…………

default:

語句3;

}default可以沒有理解“開關(guān)”的意思C語言選擇結(jié)構(gòu)程序設(shè)計(jì)表達(dá)式語句1語句2..………..語句n語句n+1out常量表達(dá)式1常量表

達(dá)式2常量表達(dá)式ndefaultswitch(表達(dá)式)

{casecons1:語句1

casecons2:語句2

……

casecons3:語句n

default:語句n+1

}C語言選擇結(jié)構(gòu)程序設(shè)計(jì)輸入年(year)、月(month)、日(day),計(jì)算從1月1日算起的總天數(shù)當(dāng)閏年,2月份是29天,否則2月份是28天。閏年的判斷見p73例4-3。s=day;switch(month-1){ case12:s=s+31; case11:s=s+30; case10:s=s+31; case9:s=s+30; case8:s=s+31; case7:s=s+31; case6:s=s+30; case5:s=s+31; case4:s=s+30; case3:s=s+31; case2:if(flag) s=s+29; else s=s+28; case1:s=s+31;} 開關(guān)語句編程舉例其實(shí)現(xiàn)在還沒有實(shí)現(xiàn)多分支的作用C語言選擇結(jié)構(gòu)程序設(shè)計(jì)switch多路選擇switch(表達(dá)式){

case

整型常數(shù)1:

語句1;

case

整型常數(shù)2:

語句2;

…………

default:

語句3;

}default可以沒有現(xiàn)場(chǎng)編程完成計(jì)算器……不要忘記breakC語言選擇結(jié)構(gòu)程序設(shè)計(jì)switch和else-if的比較else-if比switch的條件控制更強(qiáng)大一些else-if可以依照各種邏輯運(yùn)算的結(jié)果進(jìn)行流程控制switch只能進(jìn)行==判斷,并且只能是整數(shù)判斷(閱讀pp例4-4)switch比else-if更清晰兩者都要盡量避免用得過多、過長,尤其不要嵌套得太多它們大大增加程序的分支,使邏輯關(guān)系顯得混亂,不易維護(hù),易出錯(cuò)C語言選擇結(jié)構(gòu)程序設(shè)計(jì)作業(yè)4.64.7補(bǔ)充:體型判斷你出生那天是星期幾呢?C語言選擇結(jié)構(gòu)程序設(shè)計(jì)作業(yè)體型判斷。按“體指數(shù)”對(duì)肥胖程度進(jìn)行劃分:體指數(shù)t=體重w/(身高h(yuǎn))2(w單位為公斤,h單位為米)當(dāng)t<18時(shí),為低體重;當(dāng)t介于18和25之間時(shí),為正常體重;當(dāng)t介于25和27之間時(shí),為超重體重;當(dāng)t>=27時(shí),為肥胖。編程從鍵盤輸入你的身高h(yuǎn)和體重w,根據(jù)給定公式計(jì)算體指數(shù)t,然后判斷你的體重屬于何種類型。用3種方法編程:算法1:用不帶else子句的if語句編程算法2:用在if子句中嵌入if語句的形式編程算法3:用在else子句中嵌入if語句的形式編程C語言選擇結(jié)構(gòu)程序設(shè)計(jì)想知道你出生那天是星期幾嗎?year表示年份,days表示從1月1日算起的總天數(shù)。用“那一天的數(shù)”%7,等于幾,就是星期幾;沒有余數(shù),就是星期日/求的是整數(shù)結(jié)果作業(yè)C語言選擇結(jié)構(gòu)程序設(shè)計(jì)循環(huán)——while,forwhile(表達(dá)式)

語句塊;for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

語句塊;C語言選擇結(jié)構(gòu)程序設(shè)計(jì)whilewhile(表達(dá)式)

語句塊1;

語句塊2;只要表達(dá)式的值為非0,就重復(fù)執(zhí)行語句塊1,直到表達(dá)式值為0時(shí)止,開始執(zhí)行語句塊2表達(dá)式!=0?YN語句塊1語句塊2C語言選擇結(jié)構(gòu)程序設(shè)計(jì)forfor(表達(dá)式1;表達(dá)式2;表達(dá)式3)

語句塊;首先執(zhí)行表達(dá)式1。如果表達(dá)式2的值為非0,就重復(fù)執(zhí)行語句塊和表達(dá)式3,直到表達(dá)式2的值為0時(shí)止相當(dāng)于:

表達(dá)式1;

while(表達(dá)式2){

語句塊;

表達(dá)式3;

}for的所有表達(dá)式均可省略表達(dá)式2!=0?YN語句塊表達(dá)式3表達(dá)式1C語言選擇結(jié)構(gòu)程序設(shè)計(jì)注意在for和while語句之后一般沒有分號(hào)有分號(hào)表示循環(huán)體就是分號(hào)之前的內(nèi)容,即循環(huán)體不存在while(i<100);

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

printf("%d",i);for通常有一個(gè)循環(huán)變量控制循環(huán)的次數(shù),不要在循環(huán)體內(nèi)改變這個(gè)變量C語言選擇結(jié)構(gòu)程序設(shè)計(jì)循環(huán)——do-whiledo

語句塊1;

while(表達(dá)式);

語句塊2;首先執(zhí)行語句,然后判斷表達(dá)式的值。如果表達(dá)式為0,繼續(xù)向下執(zhí)行,否則,再次執(zhí)行語句,再次判斷表達(dá)式的值語句塊1會(huì)被執(zhí)行至少一次表達(dá)式!=0?YN語句塊1語句塊2C語言選擇結(jié)構(gòu)程序設(shè)計(jì)選擇三種循環(huán)的一般思路如果循環(huán)次數(shù)已知,用for如果循環(huán)次數(shù)未知,用while如果循環(huán)體至少要執(zhí)行一次,用do-while只是思路,不是定律C語言選擇結(jié)構(gòu)程序設(shè)計(jì)死循環(huán)永遠(yuǎn)不會(huì)退出的循環(huán)為死循環(huán)for(;;){}while(1){}do{}while(1)除非確實(shí)需要死循環(huán),否則不要使用這樣的形式。它們使循環(huán)的中止條件變得不明朗一般情況下,要極力避免死循環(huán)絕大多數(shù)程序不需要死循環(huán)。如果出現(xiàn),往往都是bug時(shí)間過長的循環(huán)會(huì)造成“假死”現(xiàn)象,也要考慮解決C語言選擇結(jié)構(gòu)程序設(shè)計(jì)break和continue對(duì)for、while、do-while循環(huán)進(jìn)行內(nèi)部手術(shù)break,退出循環(huán)continue,中斷此次循環(huán)的執(zhí)行,開始下一次break和continue少用為妙它們?cè)黾恿搜h(huán)執(zhí)行的分支,break更增加了循環(huán)的出口它們可以用來處理程序異常,而盡量不要用來處理正常流程C語言選擇結(jié)構(gòu)程序設(shè)計(jì)標(biāo)號(hào)舉例Error:同變量、函數(shù)的命名規(guī)則一樣,后面加上一個(gè)冒號(hào),一般頂格書寫goto舉例gotoError;goto與標(biāo)號(hào)(label)C語言選擇結(jié)構(gòu)程序設(shè)計(jì)Dijkstra與gotoEdsgerW.Dijkstra,生于1930年,卒于2002年8月6日軟件體系結(jié)構(gòu),最短路徑算法,PV原語,結(jié)構(gòu)化程序設(shè)計(jì),向量,堆?!髱熧n予我們?cè)S多深邃的簡單C語言選擇結(jié)構(gòu)程序設(shè)計(jì)Dijkstra與gotoEdsgerW.Dijkstra.

"Letterstotheeditor:Gotostatementconsideredharmful."

CommunicationofACM,11(3):147–148,March1968“Gotoconsideredharmful”

,Dijkstra在1968年就告訴了我們“Ibecameconvincedthatthegotostatementshouldbeabolishedfromall"higherlevel"programminglanguages.”“Thegotostatement…istoomuchaninvitationtomakeamessofone'sprogram.”現(xiàn)代觀點(diǎn)認(rèn)為,混亂根源不在goto,而在標(biāo)號(hào)任何程序都可以不用goto就實(shí)現(xiàn)其功能但在某些情況下,使用goto可以讓程序更清晰C語言選擇結(jié)構(gòu)程序設(shè)計(jì)糟糕的gotoSTART_LOOP:if(fStatusOk){

if(fDataAvaiable){i=10;

gotoMID_LOOP;}else{

gotoEND_LOOP;}}else{

for(i=0;i<100;i++){MID_LOOP://lotsofcodehere……}

gotoSTART_LOOP;}END_LOOP:C語言選擇結(jié)構(gòu)程序設(shè)計(jì)糟糕的gotoSTART_LOOP:if(fStatusOk){

if(fDataAvaiable){i=10;

gotoMID_LOOP;}else{

gotoEND_LOOP;}}else{

for(i=0;i<100;i++){MID_LOOP://lotsofcodehere……}

gotoSTART_LOOP;}END_LOOP:C語言選擇結(jié)構(gòu)程序設(shè)計(jì)這個(gè)代碼怎么樣?HRESULTInit(){pszMyName=(CHAR*)malloc(256);

if(pszMyName==NULL){

returnhr;}pszHerName=(CHAR*)malloc(256);

if(pszHerName==NULL){free(pszMyName);

returnhr;}

pszHisName=(CHAR*)malloc(256);

if(pszHisName==NULL){free(pszMyName);free(pszHerName);

returnhr;}

…………free(pszMyName);free(pszHerNa

溫馨提示

  • 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)論