




已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章最簡單的C程序設計,(時間:4次課,8學時),第四章 選擇結構程序設計,學習目的與要求: 通過前面章節(jié)的學習,已經看到了,語句的執(zhí)行是按照書寫的順序執(zhí)行的,這種結構稱為“順序結構”。但程序的執(zhí)行并不一定是按照語句序列的書寫順序執(zhí)行的。結構化程序設計方法規(guī)定程序的基本結構有三種,即順序結構、選擇結構和循環(huán)結構。在大多數的程序中都會遇到根據給定的條件來決定是否執(zhí)行、如何執(zhí)行等情況,這就涉及到使用選擇結構設計程序。 本章主要介紹關系運算符和關系表達式、邏輯運算符和邏輯表達式、if語句、switch語句。要求掌握關系運算符和關系表達式的定義和使用;掌握邏輯運算符和邏輯表達式的定義和使用;掌握if語句和switch語句的定義和使用。,第四章 選擇結構程序設計,4.1 關系運算符和關系表達式 4.2邏輯運算符和邏輯表達式 4.3 if語句 4.4 switch語句 4.5 程序舉例 4.6上機實訓,4.1 關系運算符和關系表達式,所謂“關系運算”實際上就是“比較運算”,即將兩個數據進行比較,判定兩個數據是否符合給定的關系。 例如,“a b”中的“”表示一個大于關系運算。如果a的值是5,b的值是3,則大于關系運算“”的結果為“真”,即條件成立;如果a的值是2,b的值是3,則大于關系運算“”的結果為“假”,即條件不成立。,4.1.1 關系運算符,在程序中經常需要比較兩個量的大小關系,以決定程序下一步的工作。比較兩個量的運算符稱為關系運算符。在C語言中有以下關系運算符: 大于 = 大于或等于 = = 等于 != 不等于 關系運算符都是雙目運算符,其結合性均為左結合。關系運算符的優(yōu)先級低于算術運算符,高于賦值運算符。在六個關系運算符中,=的優(yōu)先級相同,高于= =和!=,= =和!=的優(yōu)先級相同。 注意 在語言中,“等于”關系運算符是雙等號“= =”,而不是單等 號“=”(賦值運算符)。,4.1.2 關系表達式,關系表達式的一般形式為: 表達式 關系運算符 表達式 例如:a+bc-d,x3/2,a+1(bc),a!=(c= =d)等。 由于語言沒有邏輯型數據,所以用整數“”表示“邏輯真”,用整數“”表示“邏輯假”。如:50的值為“真”,即為1。(a=3)(b=5)由于35不成立,故其值為假,即為0。 例如,假設num1=3,num2=4,num3=5,則: (1)num1num2的值=0。 (2)(num1num2)!=num3的值=1。 (3)num1num2num3的值=1。 (4)(num1num2)+num3的值=6,因為num1num2的值=1,1+5=6。,4.1.2 關系表達式,【例4.1】 main( ) char c=k; int i=1,j=2,k=3;float x=3e+5,y=0.85; printf(“%d,%dn“,a+5=k+1); printf(“%d,%dn“,1j5,x-5.25=x+y); printf(“%d,%dn“,i+j+k= =-2*j,k= =j= =i+5); 運行結果: 1,0 1,1 0,0 在本例中求出了各種關系運算符的值。字符變量是以它對應的ASCII碼參與運算的。對于含多個關系運算符的表達式,如k= =j= =i+5,根據運算符的左結合性,先計算k= =j,該式不成立,其值為0,再計算0= =i+5,也不成立,故表達式值為0。,4.2邏輯運算符和邏輯表達式,關系表達式只能描述單一條件,例如“x=0”。如果需要描述“x=0”、同時“x10”,就要借助于邏輯表達式了。,4.2.1 邏輯運算符,C語言提供三種邏輯運算符: & 邏輯與(相當于“同時”) | 邏輯或(相當于“或者”) ! 邏輯非(相當于“否定”) 例如,下面的表達式都是邏輯表達式: (x=0) & (x5), ! (x= =0),(year%4= =0)&(year%100!=0)|(year%400= =0) 與運算符&和或運算符|均為雙目運算符。具有左結合性。非運算符!為單目運算符,具有右結合性。邏輯運算符和其它運算符優(yōu)先級的關系可表示如下: !(非) &(與) |(或) ! 算術運算 關系運算 & | 賦值運算 按照運算符的優(yōu)先順序可以得出: ab & cd等價于(ab) & (cd) !b= =c|dc & x+yc) & (x+y)b) 邏輯運算的值也為“真”和“假”兩種,用“1”和“0”來表示。其求值規(guī)則如下:,4.2.1 邏輯運算符,(1)與運算& 參與運算的兩個量都為真時,結果才為真,否則為假。例如,50 & 42,由于50為真,42也為真,相與的結果也為真。 (2)或運算| 參與運算的兩個量只要有一個為真,結果就為真。兩個量都為假時,結果為假。例如:50|58,由于50為真,相或的結果也就為真。 (3)非運算! 參與運算量為真時,結果為假;參與運算量為假時,結果為真。例如:!(50)的結果為假。 雖然C編譯在給出邏輯運算值時,以“1”代表“真”,“0 ”代表“假”。但反過來在判斷一個量是為“真”還是為“假”時,以“0”代表“假”,以非“0”的數值作為“真”。例如:由于5和3均為非“0”,因此5&3的值為“真”,即為1。又如:5|0的值為“真”,即為1。,4.2.2 邏輯表達式,邏輯表達式的一般形式為:表達式 邏輯運算符 表達式 其中的表達式可以又是邏輯表達式,從而組成了嵌套的情形。例如:(a&b)&c根據邏輯運算符的左結合性,上式也可寫為:a&b&c 邏輯表達式的值是式中各種邏輯運算的最后值,以“1”和“0”分別代表“真”和“假”。 例如,(year%4=0)&(year%100!=0)|(year%400=0)就是一個判斷一個年份是否是閏年的邏輯表達式。 在計算邏輯表達式時,只有在必須執(zhí)行下一個表達式才能求解時,才求解該表達式(即并不是所有的表達式都被求解)。換句話說: (1)對于邏輯”與”運算,如果第一個操作數被判定為“假”,系統(tǒng)不再判定或求解第二操作數。 (2)對于邏輯”或”運算,如果第一個操作數被判定為“真”,系統(tǒng)不再判定或求解第二操作數。 例如,假設n1、n2、n3、n4、x、y的值分別為1、2、3、4、1、1,則求解表達式“(x=n1n2)&(y=n3n4)”后,x的值變?yōu)?,而y的值不變,仍等于1。,4.2.2 邏輯表達式,【例4.2】 main( ) char c=k; int i=1,j=2,k=3; float x=3e+5,y=0.85; printf(“%d,%dn“,!x*!y,!x); printf(“%d,%dn“,x|i 運行結果: 0,0 1,0 0,1,4.2.2 邏輯表達式,本例中!x和!y分別為0,!x*!y也為0,故其輸出值為0。由于x為非0,故!x的邏輯值為0。對x| i & j-3式,先計算j-3的值為非0,再求i & j-3的邏輯值為1,故x|i&j-3的邏輯值為 1。對ij&xy式,由于ij的值為1,而xy為0故表達式的值為1,0相與,最后為0,對i= =5&c&(j=8)式,由于i= =5為假,即值為0,該表達式由兩個與運算組成,所以整個表達式的值為0。對于式x+y|i+j+k,由于x+y的值為非0,故整個或表達式的值為1。,4.3 if語句,4.3.1 if語句的三種形式 用if語句可以構成分支結構。它根據給定的條件進行判斷,以決定執(zhí)行某個分支程序段。語言的if語句有三種基本形式。 1if語句 格式:if (條件表達式) 語句 功能:先計算條件表達式的值,如果條件表達式的值為真(非0),執(zhí)行語句(選擇體),否則執(zhí)行if語句的下一條語句。 例如: (1)if(x0) printf(x=%f, x); 如果x0,輸出x。 (2)if(a=b) printf(%s,a=b);如果a等于b, 輸出a=b。 說明: (1)條件表達式必須用小括號括起,同時注意區(qū)分作為條件的表達式與作為數值的表達式。 (2)if語句中要選擇執(zhí)行的語句稱為選擇體,選擇體從語法上只能是一條語句,如果選擇體需多條語句描述,必須采用復合語句。,4.3 if語句,【例4.3】輸入兩個整數,輸出其中的大數。 main( ) int a,b,max; printf(“n input two numbers: “); scanf(“%d%d“, ,4.3 if語句,2if-else語句 格式:if (條件表達式) 語句1 else 語句2 功能:先計算條件表達式的值,如果條件表達式的值為真 (非0),執(zhí)行語句1(選擇體1),否則執(zhí)行語句2(選 擇體2),if語句執(zhí)行完后執(zhí)行if語句的下條語句。 例如: (1)如果x0,輸出x大于0,否則輸出x小于等于0。 if(x0) printf(x大于0); else printf(x小于等于0);,4.3 if語句,(2)如果a等于b, 輸出a等于b, 否則輸出a不等于b。 if(a= =b) printf(a等于b); else printf(“a不等于b); (3)求兩個數x、y的最大值max。 if(xy) max=x; else max=y; (4)判斷整數i的奇偶性。 if(i%2= =0) printf(偶數n); else printf(奇數n);,4.3 if語句,說明: (1)if-else語句形式上相當于if語句擴展else分支而來,else分支稱為else子句,else子句不能單獨存在。 (2)在其它高級語言中特別強調else子句前不能有分號,C語言中else子句前必有分號。 (3)選擇體如為多條語句同樣必須采用復合語句。 (4)if語句可認為是if-else語句缺省else子句的特殊情況,一條if-else語句可用兩條單分支if語句實現(xiàn)。 例如,前例中三條if-else語句改用if語句實現(xiàn): if (x0) printf(x大于0); if (xy) max=x; if(x=y) max=y;,4.3 if語句,3if-else-if語句 格式:if(表達式1) 語句1; else if(表達式2) 語句2; else if(表達式3) 語句3; else if(表達式m) 語句m; else 語句n; 功能:依次判斷表達式的值,當出現(xiàn)某個值為真時,則執(zhí)行其對應的語句。然后跳到整個if語句之外繼續(xù)執(zhí)行程序。如果所有的表達式均為假,則執(zhí)行語句n。然后繼續(xù)執(zhí)行后續(xù)程序。,【例4.5】判斷輸入字符ASCII碼所在的范圍,分別給出不同的輸出。例如輸入為“g”,輸出顯示它為小寫字符。 可以根據輸入字符的ASCII碼來判別類型。由ASCII碼表可知ASCII值小于32的為控制字符。在“0”和“9”之間的為數字,在“A”和“Z”之間為大寫字母,在“a”和“z”之間為小寫字母,其余則為其它字符。 #include“stdio.h“ main( ) char c; printf(“input a character: “); c=getchar(); if(c=0 ,3在使用if語句中還應注意以下問題: (1)在三種形式的if語句中,在if關鍵字之后均為表達式。該表達式通常是邏輯表達式或關系表達式,但也可以是其它表達式,如賦值表達式等,甚至也可以是一個變量。例如: if(a=5) 語句;if(b) 語句;都是允許的。只要表達式的值為非0,即為“真”。如在if(a=5);中表達式的值永遠為非0,所以其后的語句總是要執(zhí)行的,當然這種情況在程序中不一定會出現(xiàn),但在語法上是合法的。 又如,有程序段: if(a=b) printf(“%d“,a); else printf(“a=0“); 本語句的語義是,把b值賦予a,如為非0則輸出該值,否則輸出“a=0”字符串。這種用法在程序中是經常出現(xiàn)的。 (2)在if語句中,條件判斷表達式必須用括號括起來,在語句之后必須加分號。,(3)在if語句的三種形式中,所有的語句應為單個語句,如果要想在滿足條件時執(zhí)行一組(多個)語句,則必須把這一組語句用括起來組成一個復合語句。但要注意的是在之后不能再加分號。4.3.2 if語句的嵌套 當if語句中的執(zhí)行語句又是if語句時,則構成了if 語句嵌套的情形。其一般形式可表示如下: if(表達式) if語句; 或者為 if(表達式) if語句; else if語句;,4.3.2 if語句的嵌套,例如:將百分制成績轉成五級記分(A、 B、 C、 D、E)。 if (cj=90) ch=A; else if (cj=80) ch=B; else if (cj=70) ch=C; else if (cj=60) ch=D; else ch=E; 說明: (1)在嵌套內的if語句可能又是if-else型的,這將會出現(xiàn)多個if和多個else重疊的情況,這時要特別注意if和else的配對問題,4.3.2 if語句的嵌套,(2)通過加花括號、加注釋來明確 else與if的配套關系。 (3)if語句的嵌套可用多條if、if-else語句等價實現(xiàn)。 如上例: if (cj=90) ch=A; if (cj=80,4.3.2 if語句的嵌套,【例4.6】 求 main( ) float x; float y; printf(Input x: ); scanf(%f, ,4.3.2 if語句的嵌套,上述if語句的嵌套也可以用以下if語句代替: if(x0) y=1; 因此,在一般情況下較少使用if語句的嵌套結構。以使程序更便于閱讀理解。,4.3.3 條件運算符和條件表達式,如果在條件語句中,只執(zhí)行單個的賦值語句時,??墒褂脳l件表達式來實現(xiàn)。不但使程序簡潔,也提高了運行效率。 條件運算符為?和:,它是一個三目運算符,即有三個參與運算的量。由條件運算符組成條件表達式的一般形式為: 表達式1? 表達式2: 表達式3 其求值規(guī)則為:如果表達式1的值為真,則以表達式2 的值作為條件表達式的值,否則以表達式2的值作為整個條件表達式的值。條件表達式通常用于賦值語句之中。,4.3.3 條件運算符和條件表達式,例如條件語句: if(ab) max=a; else max=b; 可用條件表達式寫為 max=(ab)?a:b; 執(zhí)行該語句的語義是:如ab為真,則把a賦予max,否則把b 賦予max。 使用條件表達式時,還應注意以下幾點: (1)條件運算符的運算優(yōu)先級低于關系運算符和算術運算符,但高于賦值符。因此max=(ab)?a:b可以去掉括號而寫為 max=ab?a:b (2)條件運算符?和:是一對運算符,不能分開單獨使用。 (3)條件運算符的結合方向是自右至左。,4.3.3 條件運算符和條件表達式,例如: ab?a:cd?c:d應理解為ab?a:(cd?c:d),這也就是條件表達式嵌套的情形,即其中的表達式3又是一個條件表達式。 【例4.7】用條件表達式輸出兩個數中的大數。 main( ) int a,b,max; printf(“n input two numbers: “); scanf(“%d%d“, ,4.4 switch語句,switch語句稱為開關語句,用于多分支選擇的一種特殊情況的處理,即每個分支、每種情況通過一個表達式取不同的值(選擇常量、情況常量)來描述,相當于PASCAL語言中的CASE語句。 格式: switch (選擇表達式) case 常量1: 語句1; case 常量2: 語句2; case 常量n: 語句n; default: 語句n+1; ,4.4 switch語句,功能:計算選擇表達式的值,當表達式的值與某一 個case后面的常量相等、相匹配時,就執(zhí)行此 case后面的處理語句。執(zhí)行完一個case后面的 語句后,流程控制轉移到下一個case處繼續(xù)執(zhí) 行。若所有case中的常量都不與選擇表達式的 值相匹配,就執(zhí)行default后面的語句。,4.4 switch語句,【例4.8】輸入一個數字,輸出相應星期的英文單詞。 main( ) int a; printf(“input integer number: “); scanf(“%d“, ,4.4 switch語句,但是當輸入3之后,卻執(zhí)行了case3以及以后的所有語句,輸出了Wednesday及以后的所有單詞。這當然是不希望的。為什么會出現(xiàn)這種情況呢?這恰恰反應了switch語句的一個特點。在switch語句中,“case 常量表達式”只相當于一個語句標號,表達式的值和某標號相等則轉向該標號執(zhí)行,但不能在執(zhí)行完該標號的語句后自動跳出整個switch 語句,所以出現(xiàn)了繼續(xù)執(zhí)行所有后面case語句的情況。這是與前面介紹的if語句完全不同的,應特別注意。為了避免上述情況,語言還提供了一種break語句,專用于跳出switch語句,break語句只有關鍵字break,沒有參數。修改例題的程序,在每一case語句之后增加break 語句,使每一次執(zhí)行之后均可跳出switch語句,從而避免輸出不應有的結果。,4.4 switch語句,說明: (1)選擇表達式可以是任何表達式,一般為整型、字符型、枚舉型表達式. (2)選擇表達式必須用小括號括起。 (3)case后可以是常量表達式,每一個case后的值必須互不相同,否則會出現(xiàn)二義性。 (4)一種情況處理完后,一般應使程序的執(zhí)行流程跳出switch結構,終止switch語句的執(zhí)行,這可借助break語句完成。 一般使用的switch語句形式為: switch(選擇表達式) case 常量1: 語句1break; case 常量2: 語句2break; case 常量n: 語句nbreak; default: 語句n+1 ,4.4 switch語句,(5)在上述switch語句的一般使用形式下,case出現(xiàn)的次序不影 響執(zhí)行結果。 (6)當多個常量代表一種情況時,出現(xiàn)在前面case中的情況處 理無語句,這實際上也是多個case共用一組執(zhí)行語句。 (7)可以沒有default子句。 (8)switch語句描述的是多分支選擇的一種特殊情況,可用if 語句等價實現(xiàn),4.5 程序舉例,【例4.9】求三個數的最大值。 程序一: main( ) float x, y, z; float max; clrscr( ); printf(Please Input x, y, z: ); scanf(%f, %f, %f, ,4.5 程序舉例,程序二: m
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論