《《C語言程序設(shè)計》第4章控制結(jié)構(gòu).ppt》由會員分享,可在線閱讀,更多相關(guān)《《C語言程序設(shè)計》第4章控制結(jié)構(gòu).ppt(63頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第4章 控制結(jié)構(gòu),,本章要求:,掌握選擇控制語句if語句、switch語句以及他們的嵌套應(yīng)用; 掌握循環(huán)控制語句for語句、while語句、dowhile語句以及他們的嵌套應(yīng)用; 掌握break語句、continue語句的應(yīng)用; 能夠運(yùn)用3種結(jié)構(gòu)進(jìn)行綜合程序設(shè)計。,4.1 關(guān)系運(yùn)算與邏輯運(yùn)算,例子: 三個數(shù)中找最大 判斷是否是閏年 判斷密碼的正確與否 關(guān)鍵點(diǎn):判斷的條件如何確立?,選擇結(jié)構(gòu),4.1.1 關(guān)系運(yùn)算符與關(guān)系表達(dá)式,比較兩個量的運(yùn)算符稱為關(guān)系運(yùn)算符: ,= , == ,!= 關(guān)系運(yùn)算符的優(yōu)先級: “、=、 關(guān)系運(yùn)算符 賦值運(yùn)算符 一般形式為:表達(dá)式 關(guān)系運(yùn)算符 表達(dá)式其值: 關(guān)系成
2、立為“真”,不成立則為“假” C語言中用 “1” 表示 “真” ; “0” 表示 “假”,如 56 x=3 xc)a!=(c==b) (a=3)(b=5),又如:當(dāng) a=5, b=4 時 a+=3
3、行多個語句,可以使用 ,例:輸入任意兩個整數(shù)x , y,比較后,確保x要大于等于y,再輸出。 void main() int x, y, t; printf(Enter x and y:n); scanf(%d%d, ,2雙分支結(jié)構(gòu)ifelse.語句 使用格式: if (表達(dá)式) ; else ; 語句的執(zhí)行過程: 當(dāng)表達(dá)式的值為非0(條件成立)時執(zhí)行, 否則執(zhí)行else后面。,例:輸入三個數(shù),然后輸出其中最大的數(shù)。 void main() int a, b, c, max; scanf(“%d%d%d”, ,3ifelse if語句(多分支結(jié)構(gòu)) 語句形式: if (表達(dá)式1) 語
4、句1; else if (表達(dá)式2) 語句2; .. else if (表達(dá)式n) 語句n; else 語句塊n+1;,例:簡單計算器,,例:已知百分制成績x,顯示對應(yīng)的五級制成績,下列哪些正確。,4. 使用if語句中應(yīng)注意以下問題,if(a=5) 語句; if(b) 語句; 都是允許的。,if(x
5、else 語句2; else if (表達(dá)式3) 語句3;,,,要特別注意if和else的配對問題。例如: 其中的else究竟是與哪一個if配對呢? if(表達(dá)式1) if(表達(dá)式1) if(表達(dá)式2) if(表達(dá)式2) 語句1; 語句1; else else 語句2; 語句2;,,,語言規(guī)定:else 總是與它前面最近的if配對,4.2.2 條件運(yùn)算符和條件表達(dá)式,條件運(yùn)算符為 ? : 它是一個三目運(yùn)算符。 條件表達(dá)式的一般形式為: 表達(dá)式1 ? 表達(dá)式2 :表達(dá)式3 其求值規(guī)則為:如果表達(dá)式1的值為真,則以表
6、達(dá)式2 的值作為條件表達(dá)式的值,否則以表達(dá)式3的值作為整個條件表達(dá)式的值。 條件表達(dá)式通常用于賦值語句之中。例如:,if(ab) max=a; else max=b;,max=(ab)?a:b;,,條件運(yùn)算符的說明:,運(yùn)算優(yōu)先級:低于關(guān)系運(yùn)算符和算術(shù)運(yùn)算符,高于賦值符。如:max=ab?a:b 條件運(yùn)算符? :是一對運(yùn)算符,不能分開單獨(dú)使用。 結(jié)合方向:自右至左。例如:,ab?a:cd?c:d,cd?c:d,例:若輸入的大寫字母轉(zhuǎn)換成相應(yīng)的小寫字母,否則原樣輸出。,void main() char ch; scanf(%c, ,if (ch=A ,,,4.2.3 switch語句(開關(guān)語句
7、),switch語句使用的一般形式為: switch(表達(dá)式) case 常量表達(dá)式1: 語句1; case 常量表達(dá)式2: 語句2; case 常量表達(dá)式n: 語句n; default : 語句n+1; ,計算表達(dá)式的值k,若k等于常量表達(dá)式的值,則執(zhí)行對應(yīng)語句,,若k與上訴常量均不相同,執(zhí)行該語句,例:使用switch語句實現(xiàn)百分制成績化五級制成績。,switch(x/10) case 10: case 9: printf(A); case 8: printf(B); case 7: printf(C); case 6: printf(D); default
8、:printf(E); ,,break; break; break; break;,使用switch語句的通常形式為:,switch(表達(dá)式) case 常量表達(dá)式1: 語句1; break; case 常量表達(dá)式2: 語句2; break; case 常量表達(dá)式n: 語句n; break; default : 語句n+1; ,添加break;后:,例:輸入17(分別代表星期一到星期天),輸出相應(yīng)的內(nèi)容。,void main() int a; printf(input integer number: ); scanf(%d, ,說明:,在case后
9、的各常量表達(dá)式的值不能相同,否則會出現(xiàn)錯誤。 在case后,允許有多個語句,可以不用括起來。 各case和default子句的先后順序可以變動,而不會影響程序執(zhí)行結(jié)果。但需要配合“break;”使用。 default子句可以省略不用。,4.2.3 選擇結(jié)構(gòu)的嵌套,if (表達(dá)式1) 語句1; else if (表達(dá)式2) 語句2; .. else if (表達(dá)式n) 語句n; else 語句n+1;,switch(表達(dá)式) case 常量表達(dá)式1: 語句1; break; case 常量表達(dá)式2: 語句2; break; case 常量表達(dá)式n: 語句n;
10、break; default : 語句n+1; ,這些語句部分,都可以包含另一個完整的if語句或switch語句,例:輸入三個數(shù),從小到大排列,if(ab) t=a; a=b; b=t; if(bc) t=b; b=c; c=t; if(ab) t=a; a=b; b=t; ,,,,說明:,嵌套只能在一個分支內(nèi)嵌套,不出現(xiàn)交叉。其嵌套的形式將有很多種,嵌套層次也可以任意多。 在swicth結(jié)構(gòu)中,每一個case分支可以完整包含另一個ifelse結(jié)構(gòu),也可完整包含另一個swicth結(jié)構(gòu)。 提示:為了便于閱讀和維護(hù),建議在寫含有多層嵌套的程序時,使用縮進(jìn)對齊方式。,4.2.5 選擇結(jié)構(gòu)程序
11、舉例,例:小學(xué)數(shù)學(xué)題,要求: 隨機(jī)產(chǎn)生兩道數(shù)學(xué)題(參加運(yùn)算的數(shù)在110之間),一道加法,一道減法。 產(chǎn)生一道題后,讓用戶輸入答案;判斷答案的正確性,并給出提示。 記錄用戶答對的題數(shù),并對最終的成績作出評價。 可以使用if語句,或switch語句。,,4.3 循環(huán)結(jié)構(gòu),循環(huán)結(jié)構(gòu)的特點(diǎn): 在給定條件成立時,反復(fù)執(zhí)行某程序段, 直到條件不成立為止。 注意兩個概念: 給定的條件稱為循環(huán)條件 反復(fù)執(zhí)行的程序段稱為循環(huán)體 在C語言中,實現(xiàn)循環(huán)結(jié)構(gòu)的語句主要有3種: while doWhile for語句,4.3.1 while語句,while語句的一般形式為: while(表達(dá)式) 語句;表達(dá)式是循
12、環(huán)條件,語句為循環(huán)體 執(zhí)行過程:計算表達(dá)式的值,當(dāng)值為真(非0)時, 執(zhí)行循環(huán)體語句。否則,退出,例:在屏幕上打印110,,說明:,計算的值,若表達(dá)式的值為真(非0)時,則執(zhí)行循環(huán)體語句;不斷反復(fù),直到表達(dá)式的值為假(0),則不執(zhí)行循環(huán)體語句,而直接轉(zhuǎn)向循環(huán)體外的第一條語句。 是循環(huán)反復(fù)執(zhí)行的程序,稱為“循環(huán)體”,當(dāng)需要執(zhí)行多條語句時,應(yīng)使用“ ”括起來組成一個復(fù)合語句。 while語句是先判斷條件,后執(zhí)行循環(huán)體,為“當(dāng)型”循環(huán),因此若條件不成立,有可能一次也不執(zhí)行循環(huán)體。,例: 編程序求:s=1+2+3++100,main() int s=0,n=1; while (n<=100)
13、s=s+n; n++; printf(S=%d,s); ,,4.3.2 do...while語句,一般形式為: do 語句; while (表達(dá)式); 執(zhí)行過程:先執(zhí)行循環(huán)體語句一次,再判別表達(dá)式的值,若為真(非0)則繼續(xù)循環(huán),否則終止循環(huán)。,例: 編程序求:s=1+2+3++100,void main() int s=0,n=1; do s=s+n; n++; while (n<=100); printf(S=%d,s); ,while (n<=100) s=s+n; n++; ,用輾轉(zhuǎn)相除法求兩自然數(shù)m,n的最大公約數(shù)和最小公倍數(shù)。 例 求 m=28
14、 ,n=20 的最大公約數(shù). if (m
15、達(dá)式1;表達(dá)式2;表達(dá)式3) 語句; 表達(dá)式1(控制變量的初始化):用來給循環(huán)變量賦初值,也允許在for語句外給循環(huán)變量賦初值,此時可以省略該表達(dá)式。 表達(dá)式2(循環(huán)的條件):循環(huán)條件,一般為關(guān)系表達(dá)式或邏輯表達(dá)式。 表達(dá)式3(循環(huán)控制變量的更新 ):用來修改循環(huán)變量的值,一般是賦值語句。,當(dāng)循環(huán)體由多個語句組成時,也必須用 ,for語句的執(zhí)行過程:,注意:在整個for循環(huán)過程中,表達(dá)式1只計算一次,表達(dá)式2和表達(dá)式3則可能計算多次。,例: 編程序求:s=1+2+3++100,void main() int n,s=0; for(n=1;n<=100;n++) s=s+n; p
16、rintf(s=%dn,s); getch(); ,void main() int s=0,n=1; while (n<=100) s=s+n; n++; printf(“s=%d,s); ,,例:打印20個1020的隨機(jī)數(shù)在屏幕上。,for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語句;,表達(dá)式1; while(表達(dá)式2) 語句; 表達(dá)式3; ,,,有關(guān)for語句的幾點(diǎn)說明:,for語句中的“表達(dá)式1”、“表達(dá)式2”和“表達(dá)式3”都可以省略,但兩個分號不能省略。 若 “表達(dá)式2”省略了,則判定循環(huán)控制條件為真(非0) “表達(dá)式1”和 “表達(dá)式3”,可以是一個簡單的表達(dá)式,也可以是逗號表
17、達(dá)式。 注意:三個表達(dá)式都可以是任何表達(dá)式。,4.3.4 循環(huán)的嵌套多重循環(huán)結(jié)構(gòu),一個循環(huán)內(nèi)完整地包含另一個循環(huán)結(jié)構(gòu),則稱為多重循環(huán) 嵌套一層稱為二重循環(huán),嵌套二層稱為三重循環(huán) 例子: 打印九九乘法表 打印由數(shù)字組成的如下所示金字塔圖案,,4.3.5 三種循環(huán)語句比較,4.4 其它控制語句,4.4.1 break語句 作用范圍:switch 語句或循環(huán)語句 功能:跳出switch語句或跳出本層循環(huán), 轉(zhuǎn)去執(zhí)行后面的程序。 break語句的一般形式為: break; 注意:break語句用于循環(huán)體中,一般與if語句聯(lián)合使用,例:車牌抽取程序,要求,用戶可以有5次機(jī)會選擇。 若選到中意的號
18、碼,可以使用鍵盤中的Y鍵來確定 若已確定選中號碼,則無需再繼續(xù)選擇了。 若5次都沒有選中,進(jìn)行提示,表示選中失敗。,,4.4.2 continue語句,作用范圍:只能用在循環(huán)體中 功能:結(jié)束本次循環(huán),轉(zhuǎn)入下一次循環(huán)條件的判斷與執(zhí)行。 其一般格式是: continue; 注意:本語句只結(jié)束本層本次的循環(huán),并不跳出循環(huán)。,例,計算半徑為1到15的圓的面積,僅打印出超過50的圓面積。,void main() int r; float area; for(r=1;r<=15;r++) area=3.141593*r*r; if(area<50.0) continue; printf( squar
19、e=%fn,area); ,,break與continue的區(qū)別,continue:結(jié)束本次循環(huán),即不再執(zhí)行循環(huán)體中continue 語句之后的語句,轉(zhuǎn)入下一次循環(huán)條件的判斷與執(zhí)行。應(yīng)注意的是, 本語句只結(jié)束本層本次的循環(huán),并不跳出循環(huán)。,break:語句只能用在switch 語句或循環(huán)語句中, 其作用是跳出switch語句或跳出本層循環(huán),轉(zhuǎn)去執(zhí)行后面的程序。,4.4.3 goto語句(無條件轉(zhuǎn)移語句),一般格式: goto 語句標(biāo)號; 如: label: i++; goto label1; 注意:語言不限制程序中使用標(biāo)號的次數(shù),但不得重名。 注意:在結(jié)構(gòu)化程序設(shè)計中一般不主
20、張使用goto語句, 以免造成程序流程的混亂,使理解和調(diào)試程序都產(chǎn)生困難。,,,4.5 應(yīng)用程序舉例 4.5.1 素數(shù)與哥德巴赫猜想,例:判斷一個給定的整數(shù)是否為素數(shù) 基本思想: 把m作為被除數(shù),將2Int(Sqrt(m))作為除數(shù),如果都除不盡,m就是素數(shù),否則就不是。可用以下程序段實現(xiàn),k=sqrt(m); for(i=2;i=k) printf(Yesn); else printf(Non);,例:編一程序驗證哥德巴赫猜想,,,,,for(n1=3;n1k) printf(%d=%d+%dn,n,n1,n2); ,,,發(fā)現(xiàn)n1不是素數(shù)后無需判斷n2了,執(zhí)行continue;后,當(dāng)
21、前次循環(huán)的后半部分無需執(zhí)行,4.5.2 窮舉法,基本思想:一一列舉各種可能的情況,并判斷哪一種可能是符合要求 例:將一張面值為100元的人民幣等值換成100張5元、1元和0.5元的零鈔,要求每種零鈔不少于1張,問有哪幾種組合? 分析:5元的最少1張,最多100張 1元的最少1張,最多100張 0.5元的最少1張,最多100張列出所有的情況,把真正符合要求的情況打印出來。,void main() int x, y, z, n; printf( 5yuan 1yuan 0.5yuann); n=0; for(x=1; x<=100;x++) for(y=1;y<=100;y++) for(
22、z=1;z<=100;z++) if(x+y+z==100 ,,,,,,4.5.3 迭代法,遞推法:有一只猴子,撿到了一框桃子。它每天吃現(xiàn)存桃子的一半再多一個。到了第7天,它只有一個桃子了,問它第一天撿到了幾個桃子? 解:注意后一天和前一天的桃子數(shù)的關(guān)系。 x=(x+1)*2;,,例,用迭代法求平方根,已知迭代公式為: 編程分析: 可假定一個初值x0=a/2(估計值), 根據(jù)迭代公式得到一個新的值x1,這個新值x1比初值x0更接近要求的值x; 再以新值作為初值,即:x1x0,重新按原來的方法求x1, 重復(fù)這一過程直到|x1-x0|<(某一給定的精度)。此時可將x1作為問題的解。,,x0 = a / 2; /* 取迭代初值 */ x1 = 0.5 * (x0 + a / x0); while (fabs(x1 - x0) 0.00001) x0 = x1; /* 為下一次迭代作準(zhǔn)備 */ x1 = 0.5 * (x0 + a / x0); printf(%f s sqrt is:%fn, a, x1);,迭代法求平方根部分代碼,,