選擇結構程序設計1.ppt_第1頁
選擇結構程序設計1.ppt_第2頁
選擇結構程序設計1.ppt_第3頁
選擇結構程序設計1.ppt_第4頁
選擇結構程序設計1.ppt_第5頁
已閱讀5頁,還剩36頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章:選擇結構程序設計,學習的意義,在編制程序時,有時并不能保證程序一定執行某些指令,而是要根據一定的外部條件來判斷哪些指令要執行。如菜譜中要加工西紅柿,可能有這樣的步驟:如果是用鮮西紅柿,則去皮、切碎,開始放入,如果是用西紅柿醬,就在最后放入。這里,我們并不知道具體操作時執行哪段指令,但菜譜給出了不同條件下的處理方式,計算機程序也是如此,可以根據不同的條件執行不同的代碼,這就是選擇結構。程序總是為解決某個實際問題而設計的,而問題往往包含多個方面,不同的情況需要有不同的處理,所以選擇結構在我們的實際應用程序中可以說是無處不在,離開了選擇結構很多情況將無法處理,因此,正確掌握選擇結構程序設計方法對于我們編寫實際應用程序尤為重要。,c程序中語句的分類 關系運算符、邏輯運算符、條件運算符 選擇結構的程序設計(if語句、switch語句) 選擇結構程序設計舉例 本章小結,學習目標,理解選擇結構的含義; 掌握c語言語句的分類; 掌握關系運算符、邏輯運算符和條件運算符的用法; 記住關系運算符、邏輯運算符和條件運算符與其它運算符的優先級關系和結合性; 掌握if、switch語句的使用方法。,學習內容,5.1 c程序中語句的分類,語言程序的執行部分是由語句組成的。程序的功能也是由執行語句實現的。c語言中的語句可以分為以下5類:,表達式語句 由表達式加上分號“;”組成。其一般形式為:表達式;,函數調用語句 由函數名、實際參數加上分號“;”組成。其一般形式為:函數名(實際參數表);,a = 10 賦值表達式 a = 10; 賦值語句 k+ 表達式 k+; 表達式語句,while (getchar( ) != n ) ; 本語句的功能是,只要從鍵盤輸入的字符不是回車則重新輸入。這里的循環體為空語句。,空語句 只有分號“;”組成的語句稱為空語句。空語句是什么也不執行的語句。在程序中空語句可用來作空循環體。,printf (“c program“) 函數調用; printf (“c program”); 函數調用語句 其功能是輸出字符串“c program“。,說明: (1) “”后不加分號 (2) 語法上和單一語句相同 (3) 復合語句可嵌套 (4) 復合語句內定義的變量只能在復合語句內使用。,復合語句 用 括起來的一組語句。, int a = 2, b = 3, c; c = a + b; printf (“c = %dn“, c); ,一般形式為: 數據說明部分; 執行語句部分; ,#include void main ( ) int x = 10, y = 20, z; z = x + y; int z; z = x * y; printf (“z = %dn“, z); /輸出復合語句中z的值 printf (“z = %dn“, z); /輸出復合語句外z的值 ,輸出結果: z = 200 z = 30,控制語句 用來實現一定的控制功能的語句稱為控制語句 。c語言用控制語句來實現選擇結構和循環結構。語言有九種控制語句。可分成以下三類:,5.2 關系運算符、邏輯運算符、條件運算符,1. 關系運算符和關系表達式,關系運算符,關系表達式,用關系運算符連接起來的式子稱為關系表達式。 關系表達式的一般形式為:表達式 關系運算符 表達式,例:a + b c d x 3 / 2 a + 1 c i 5 * j = k + 1,注意: c語言用0表示假,非0表示真。 一個關系表達式的值不是0就是1,0表示假,1表示真。,關系運算符的優先級,例如: c a + b 等價于: a b != c 等價于: a = b c 等價于: a 2 b | c 等價于:,c (a + b),(a b) != c,a = (b c),a = (b c),(a 2) (c + d),(a & (4 b) | c,已知:a = 1; b = 2; c = 3; 問:d = a != c = a b c;的值?,答:d 的值為1。 等價于:d = (a != c) = (a b) c);,例:int a = 3, b = 2, c = 1, d, f; a b (a b) = c b + c b f = a b c,/表達式值1,/表達式值1,/表達式值0,/d = 1,/f = 0,關系運算注意:,例 若a = 0; b = 0.5; x = 0.3; 則 a = x = b的值為,0,例 5 2 7 8在c中是 允許的,值為,0,例 int i = 1, j = 7, a; a = i + (j % 4 != 0); 則a =,2,例 a0 結果為 a100 結果為,1,0,例 應避免對實數作相等或不等的判斷 如 1.0/3.0*3.0=1.0 結果為 可改寫為:fabs(1.0/3.0*3.0-1.0)1e-6,0,2. 邏輯運算符和邏輯表達式,邏輯運算符,邏輯運算真值表,例如: a b & x y 等價于: a = b | x = y 等價于: !a | a b 等價于: !a b 等價于: c = a | b 等價于: a | 7 & b & 8 等價于: a 2 & b 1 等價于:,2. 邏輯運算符和邏輯表達式,邏輯表達式,用邏輯運算符連接起來的式子稱為邏輯表達式。 邏輯表達式的一般形式為:表達式 邏輯運算符 表達式,例:a 10 | x -10、!x & !y,邏輯運算符的優先級,(a = x) & (x = b),(a b) & (x y),(a = b) | (x = y),(!a) | (a b),(!a) b,c = (a | b),(a | 7) & (b & 8),(a 2) & (b 1),已知:a = 4; b = 5; 問:c = b 3 的值?,答:c 的值為1。 等價于:c = (b 3) ,例: a = 4; b = 5; !a a & b a | b !a | b 4 & 0 | 2 5 3 & 2 | 8 4 - !0 c & d,/值為0,/值為1,/值為1,/值為1,/值為1,/值為1,/值為1,邏輯運算注意:,邏輯表達式求解時,并非所有的邏輯運算符都被執行,只是在必須執行下一個邏輯運算符才能求出表達式的解時,才執行該運算符。,例 a (m = a b) & (n = c d),/結果:m = 0, n = 1,條件運算符可嵌套 如 x 0 ? 1 : (x 0 ? -1 : 0) 優先級: 13,3. 條件運算符與表達式 一般形式: expr1 ? expr2 : expr3 執行過程 功能:相當于條件語句,但不能取代一般if語句,例 求 a+|b| printf(“a+|b|=%dn”,b0?a+b:a-b);,例 (a=b)?y:n (x%2=1)?1:0 (x=0)?x:-x (c=a & c=z)?c-a+a:c,結合方向:自右向左 如 a b ? a : c d ? c : d a b ? a : (c d ? c : d) expr1、expr2、expr3類型可不同,表達式值取較高的類型,例 x?a:b /x=0,表達式值為b; x0,表達式值為a xy?1:1.5 /xy ,值為1.0; xy ,值為1.5,例:小寫字母轉盤。 #include #include void main ( ) char ch, ch1, ch2; /變量定義 ch = getche ( ); /讀取一字符 putchar (n); /換行 ch1 = ch = a ? z : ch - 1; /求前驅字符 ch2 = ch = z ? a : ch + 1; /求后繼字符 printf (“ch1 = %c, ch2 = %cn“, ch1, ch2); /顯示結果 ,輸出結果(假設輸入為w) : ch1 = v, ch2 = x,運算符總結:,總體上講,單目運算符都是同等優先級的,具有右結合性,并且優先級比雙目運算符和三目運算符都高。 三目運算符的優先級比雙目運算符要低,但高于賦值運算符和逗號運算符。 逗號運算符的優先級最低,其次是賦值運算符。 只有單目運算符、賦值運算符和條件運算符具有右結合性,其它運算符都是左結合性。 雙目運算符中,算術運算符的優先級最高,邏輯運算符的優先級最低。,到現在為止,我們已經學習了30多個運算符。掌握它們的優先級關系特別重要。優先級的記憶規則:,5.3 選擇結構的程序設計,1. if語句,簡單if語句形式,if (表達式) 語句;,格式:,執行流程:,例如:下面的程序段是輸入兩個整數,輸出其中的大數。 int a, b, max; printf (“input two numbers: “); scanf (“%d%d“, ,if_else形式,if (表達式) 語句1; else 語句2;,格式:,執行流程:,例如:下面的程序段同樣是輸出兩個整數中的最大數。 int a, b; printf (“input two numbers: “); scanf (“%d%d“, ,1. if語句,if_else_if形式,if(表達式1) 語句1; else if (表達式2) 語句2; else if (表達式3) 語句3; else 語句n;,格式:,執行流程:,例如:下面的程序段是判斷輸入字符的種類。 char c; printf (“enter a character: “); c = getchar ( ); if (c = 0 ,if語句注意事項,(1) if語句后面的表達式必須用括號括起來 。 (2) 表達式通常是邏輯表達式或關系表達式,但也可以是其它任何表達式,如賦值表達式等,甚至也可以是一個變量。只要表達式非零時,表達式的值就為真,否則就是假。 (3) 在if語句的三種形式中,所有的語句應為單個語句,如果要想在滿足條件時執行一組(多個)語句,則必須把這一組語句用 括起來組成一個復合語句。但要注意的是在之后不能再加分號。 (4) 在if語句中,如果表達式是一個判斷兩個數是否相等的關系表達式,要當心不要將=寫成了賦值運算符=。,if (a = 5) 語句; /表達式的值永遠為非0, 所以其后的語句總是要執行的 if (b) 語句; /等價于if (b != 0) 語句;,運行結果:x = 0,運行結果:x != 0,if語句嵌套: 一般形式:,例 輸入兩數并判斷其大小關系,#include void main ( ) int x, y; printf (“enter integer x, y: “); scanf (“%d, %d“, ,運行結果: enter integer x, y: 12, 23 xy enter integer x, y: 12, 12 x=y,語言規定,在缺省 時,else總是和它上面離它最近的未配對的if配對,運行結果:a = 0,運行結果:a = 1,if_else 配對原則,例: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);,修改: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);,實現if else 正確配對方法:加 ,例:考慮下面程序輸出結果: void main( ) int x = 100, a = 10, b = 20; int v1 = 5, v2 = 0; if (a b) if (b != 15) if (!v1) x=1; else if (v2) x = 10; x = -1; printf (“%d”, x); ,結果:-1,2. switch語句(開關分支語句) 一般形式:,switch ( 表達式) case e1: 語句組 1; break; case e2: 語句組 2; break; . case en: 語句組 n; break; default: 語句組 ; break; ,執行過程:,使用switch語句注意事項,(1) switch后面的“表達式”,可以是int、char和枚舉型中的一種,但不可為浮點型。,float a, b = 4.0; scanf (“%f“, ,int a, b = 4; scanf (“%d“, ,使用switch語句注意事項,(2) case后面語句(組)可加 也可以不加 ,但一般不加 。 (3) 每個case后面“常量表達式”的值,必須各不相同,否則會出現相互矛盾的現象。,switch ( i ) case 1: b = b + 1; break; / 可加可不加 case 2: b = b - 1; break; ,使用switch語句注意事項,(4) 每個case后面必須是“常量表達式”,表達式中不能包含變量。,例:按成績分成a、b、c、d、e、f幾個等級。 char score; printf (“enter score: “); scanf (“%d“, ,使用switch語句注意事項,(5) case后面的“常量表達式”僅起語句標號作用,并不進行條件判斷。系統一旦找到入口標號,就從此標號開始執行,不再進行標號判斷,所以必須加上break語句,以便結束switch語句。,#include void main ( ) char ch; ch = getch ( ); switch ( ch ) case y : printf (“yesn“); break; case n : printf (“non“); break; case a : printf (“alln“); break; default : printf (“yes,no or alln“); ,運行結果: no,/假設輸入為:n,#include void main ( ) char ch; ch = getch ( ); switch ( ch ) case y : printf (“yesn“); break; case n : printf (“non“); case a : printf (“alln“); break; default : printf (“yes,no or alln“); ,/假設輸入為:n,運行結果: no all,使用switch語句注意事項,(6)多個case子句,可共用同一語句(組)。,例:當a的值是1、2、3時,將b的值加2,當a的值是4、5、6時,將b的值減2。 int a, b = 4; scanf (“%d“, ,使用switch語句注意事項,(7) case子句和default子句如果都帶有break子句,那么它們之間順序的變化不會影響switch語句的功能。,#include void main ( ) char ch; ch = getch ( ); switch ( ch ) case y : printf (“yesn“); break; case n : printf (“non“); break; case a : printf (“alln“); break; default : printf (“yes,no or alln“); break; ,#include void main ( ) char ch; ch = getch ( ); switch ( ch ) case y : printf (“yesn“); break; default : printf (“yes,no or alln“); break; case n : printf (“non“); break; case a : printf (“alln“); break; ,使用switch語句注意事項,(8) case子句和default子句如果有的帶有break子句,而有的沒有帶break子句,那么它們之間順序的變化可能會影響輸出的結果。,#include void main ( ) char ch; ch = getch ( ); switch ( ch ) case y : printf (“yesn“); break; case n : printf (“non“); break; case a : printf (“alln“); break; default : printf (“yes,no or alln“); ,#include void main ( ) char ch; ch = getch ( ); switch ( ch ) case y : printf (“yesn“); break; default : printf (“yes,no or alln“); case n : printf (“non“); break; case a : printf (“alln“); break; ,/假設輸入為:b,運行結果: yes,no or all,運行結果: yes,no or all no,/假設輸入為:b,使用switch語句注意事項,(9) switch語句可以嵌套。,void main ( ) int x = 1, y = 0, a = 0, b = 0; switch ( x ) case 1: switch ( y ) case 0: a+; break; case 1: b+; break; case 2: a+; b+; break; case 3: a+; b+; printf (“na = %d, b = %d“, a, b); ,運行結果: a = 2,b = 1,5.4 選擇結構程序設計舉例,【例1】已知某公司員工的保底薪水為500,某月所接工程的利潤profit(整數)與利潤提成的關系如下所示(計量單位:元)。計算員工的當月薪水。,程序應該這樣來設計: 首先要定義一個變量用來存放員工所接工程的利潤; 其次提示用戶輸入員工所接工程的利潤,并調用scanf函數接受用戶輸入員工所接工程的利潤; 然后根據上表的規則,計算該員工當月的提成比率。 最后計算該員工當月的薪水(保底薪水+所接工程的利潤*提成比率),并輸出結果。,#include void main ( ) long profit; /所接工程的利潤 float ratio; /提成比率 float salary = 500; /薪水,初始值為保底薪水500 printf (“input profit: “); /提示輸入所接工程的利潤 scanf (“%ld“, /輸出結果 ,運行結果: input profit: 4000 salary = 1100.00,方法一:使用if_else if語句,#include void main ( ) long profit; /所接工程的利潤 float ratio; /提成比率 float salary = 500; /薪水,初始值為保底薪水500 printf (“input profit: “); /提示輸入所接工程的利潤 scanf (“%ld“, /輸出結果 ,運行結果: input profit: 4000 salary = 1100.00,方法二:使用if語句,0.1默認為double型,不進行強制類型轉換將產生警告信息!,方法三:使用switch語句,算法設計要點: 為使用switch語句,必須將利潤profit與提成的關系轉換成某些整數與提成的關系。分析本題可知,提成的變化點都是1000的整數倍(1000、2000、5000、),如果將利潤profit整除1000,則當: profit 1000 對應0、1 1000 profit 2000 對應1、2 2000 profit 5000 對應2、3、4、5 5000 profit 10000 對應5、6、7、8、9、10 10000 profit 對應10、11、12、 為解決相鄰兩個區間的重疊問題,最簡單的方法就是:利潤profit先減1(最小增量),然后再整除1000即可: profit 1000 對應0 1000 profit 2000 對應1 2000 profit 5000 對應2、3、4 5000 profit 10000 對應5、6、7、8、9 10000 profit 對應10、11、12、,#include void main ( ) long profit; /所接工程的利潤 int grade; float ratio; /提成比率 float salary = 500; /薪水,初始值為保底薪水500 printf (“input profit: “); /提示輸入所接工程的利潤 scanf (“%ld“, /輸入所接工程的利潤,方法三:使用switch語句,/將利潤-1、再整除1000,轉化成switch語句中的case標號 grade = (profit - 1) / 1000; switch ( grade ) /計算提成比率 case 0: ratio = 0; break; / profit1000 case 1: ratio = (float)0.10; break; / 1000profit2000 case 2: case 3: case 4: ratio = (float)0.15; break; / 2000profit5000 case 5: case 6: case 7: case 8: case 9: ratio = (float)0.20; break; / 5000profit10000 default: ratio = (float)0.25; / 10000profit salary += profit * ratio; /計算當月薪水 printf (“salary = %.2fn“, salary); /輸出結果 ,運行結果: input profit: 4000 salary = 1100.00,【例2】寫一程序,從鍵盤上輸入1年份year(4位十進制數),判斷其是否閏年。閏年的條件是:能被4整除、但不能被100整除,或者能被400整除。,程序應該這樣來設計: 如果能被整除,則余數為,即如果的值等于,則表示能被整除! 首先將是否閏年的標志leap預置為0(非閏年),這樣僅當year為閏年時,將leap置為1即可。這種處理兩種狀態值的方法,對優化算法和提高程序可讀性非常有效,請讀者仔細體會。,#include void main ( ) int year, leap = 0; / leap=0:預置為非閏年 printf (“please input the year: “); /提示輸入年份 scanf (“%d”, ,運行結果: please input the year: 2008 2008 is a leap year.,判斷是否為閏年,if ( ( year % 4 = 0 ,【例3】寫寫一程序,從鍵盤上輸入任意兩個數和一運算符(+:加,-:減,*:乘,/:除),計算其運算的結果并輸出 。,程序應該這樣來設計: 首先輸入兩個數和一運算符號,然后根據運算符號來做相應的運算,但是在做除

溫馨提示

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

評論

0/150

提交評論