C語言教材配套版第5章課件_第1頁
C語言教材配套版第5章課件_第2頁
C語言教材配套版第5章課件_第3頁
C語言教材配套版第5章課件_第4頁
C語言教材配套版第5章課件_第5頁
已閱讀5頁,還剩145頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

5.1關系運算符和關系表達式5.2邏輯運算符和邏輯表達式5.3if語句5.4switch語句5.5程序舉例習題第5章選擇結構程序設計5.1關系運算符和關系表達式第5章選擇結構程序設計在第3章中已介紹了選擇結構,它是三種基本結構之一。在大多數(shù)程序中都會包含選擇結構。它的作用是,根據(jù)所指定的條件是否滿足,決定從給定的兩組操作選擇其一。在本章中介紹如何用c語言實現(xiàn)選擇結構。在c語言中選擇結構是用if語句實現(xiàn)的。if語句最常用的形式是if(關系表達式)語句1else語句2例如:if(x>0)y=1;elsey=-1;其中x>0是一個關系表達式?!?gt;”是一個關系運算符。在第3章中已介紹了選擇結構,它是三種基本結構之一。在大多數(shù)程5.1關系運算符和關系表達式關系運算是邏輯運算中比較簡單的一種。所謂“關系運算”實際上是“比較運算”。將兩個值進行比較,判斷其比較的結果是否符合給定的條件。例如,a>3是一個關系表達式,大于號(>)是一個關系運算符,如果a的值為5,則滿足給定的“a>3”條件,因此關系表達式的值為“真”(即“條件滿足”);如果a的值為2,不滿足“a>3”條件,則稱關系表達式的值為“假”。5.1關系運算符和關系表達式關系運算是邏輯運算中比較簡單5.1.1關系運算符及其優(yōu)先次序C語言提供6種關系運算符:優(yōu)先級相同(高):①<(小于)②<=(小于或等于)③>(大于)④>=(大于或等于)優(yōu)先級相同(低):⑤==(等于)⑥!=(不等于)關于優(yōu)先次序:(1)前4種關系運算符(<,<=,>,>=)的優(yōu)先級別相同,后兩種也相同。前4種高于后2種。例如,“>”優(yōu)先于“==”。而“>”與“<”優(yōu)先級相同。5.1.1關系運算符及其優(yōu)先次序C語言提供6種關系運算符(2)關系運算符的優(yōu)先級低于算術運算符。(3)關系運算符的優(yōu)先級高于賦值運算符。以上關系見圖5.1。例如:c>a+b等效于c>(a+b)a>b==c等效于(a>b)==ca==b<c等效于a==(b<c)a=b>c等效于a=(b>c)圖5.1(2)關系運算符的優(yōu)先級低于算術運算符。圖5.15.1.2關系表達式用關系運算符將兩個表達式(可以是算術表達式或關系表達式、邏輯表達式、賦值表達式、字符表達式)連接起來的式子,稱關系表達式。例如,下面都是合法的關系表達式:a>b,a+b>b+c,(a=3)>(b=5),'a'<'b',(a>b)>(b<c)關系表達式的值是一個邏輯值,即“真”或“假”。例如,關系表達式“5==3”的值為“假”,“5>=0”的值為“真”。c語言沒有邏輯型數(shù)據(jù)(Pascal語言以True表示“真”,以false表示“假”。PascaL和FORTRAN等語言都有邏輯型變量和邏輯型常5.1.2關系表達式量),以1代表“真”,以“0”代表“假”。例如,a=3,b=2,c=1,則:關系表達式“a>b”的值為“真”,表達式的值為1。關系表達式“(a>b)==c”的值為“真”(因為a>b的值為1,等于c的值),表達式的值為1。關系表達式“b+c<a”的值為“假”,表達式的值為0。如果有以下賦值表達式:d=a>bd的值為1。f=a>b>cf的值為0(因為“>”運算符是自左至右的結合方向,先執(zhí)行“a>b”得值為1,再執(zhí)行關系運算“1>c”,得值0,賦給f)。量),以1代表“真”,以“0”代表“假”。例如,a=3,b用邏輯運算符將關系表達式或邏輯量連接起來的式子就是邏輯表達式。在basic和Pascal語言中有以下形式的邏輯表達式(AND是邏輯運算符):(a>b)AND(x>y)如果a>b且x>y,則上述邏輯表達式的值為“真”。下面介紹c語言中的邏輯運算符和邏輯運算。5.2.1邏輯運算符及其優(yōu)先次序C語言提供三種邏輯運算符:5.2邏輯運算符和邏輯表達式用邏輯運算符將關系表達式或邏輯量連接起來的式子就是邏輯表達式(1)&&邏輯與(相當于其他語言中的aND)(2)||邏輯或(相當于其他語言中的OR)(3)!邏輯非(相當于其他語言中的NOT)“&&”和“||”是“雙目(元)運算符”,它要求有兩個運算量(操作數(shù)),如(a>b)&&(x>y),(a>b)||(x>y)。“!”是“一目(元)運算符”,只要求有一個運算量,如(a>b)。邏輯運算舉例如下:a&&b若a、b為真,則a&&b為真。a||b若a、b之一為真,則a||b為真。!a若a為真,則!a為假。(1)&&邏輯與(相當于其他語言中的aND)在一個邏輯表達式中如果包含多個邏輯運算符,如!a&&b||x>y&&c按以下的優(yōu)先次序:(1)!(非)→&&(與)→(或),即“!”為三者中最高的。(2)邏輯運算符中的“&&”和“||”低于關系運算符,“!”高于算術運算符。見圖5.2。圖5.2在一個邏輯表達式中如果包含多個邏輯運算符,如圖5.2例如:(a>b)&&(x>y)可寫成a>b&&x>y(a==b)||(x==y)可寫成a==b||x==y(!a)||(a>b)可寫成!a||a>b5.2.2邏輯表達式如前所述,邏輯表達式的值應該是一個邏輯量“真”或“假”。c語言編譯系統(tǒng)在給出邏輯運算結果時,以數(shù)值1代表“真”,以0代表“假”,但在判斷一個量是否為“真”時,以0代表“假”,以非0代表“真”。即將一個非零的數(shù)值認作為“真”。例如:例如:(1)若a=4,則!a的值為0。因為a的值為非0,被認作“真”,對它進行“非”運算,得“假”,“假”以0代表。(2)若a=4,b=5,則a&&b的值為1。因為a和b均為非0,被認為是“真”,因此a&&b的值也為“真”,值為1。(3)a、b值同前,a||b的值為1。(4)a、b值同前,!a||b的值為1。(5)4&&0||2的值為1。通過這幾個例子可以看出,由系統(tǒng)給出的邏輯運算結果不是0就是1,不可能是其他數(shù)值。而在邏輯表達式中作為參加邏輯運算的運算對象(操作數(shù))(1)若a=4,則!a的值為0。因為a的值為非0,被認作“可以是0(“假”)或任何非0的數(shù)值(按“真”對待)。如果在一個表達式中不同位置上出現(xiàn)數(shù)值,應區(qū)分哪些是作為數(shù)值運算或關系運算的對象,哪些作為邏輯運算的對象。例如:5>3&&8<4-!0表達式自左至右掃描求解。首先處理“5>3”(因為關系運算符優(yōu)先于&&)。在關系運算符兩側的5和3作為數(shù)值參加關系運算,“5>3”的值為1。再進行“1&&8<4-!0”的運算,8的左側為“&&”,右側為“<”運算符,根據(jù)優(yōu)先規(guī)則,應先進行“<”的運算,即先進行“8<4-!0”的運算?,F(xiàn)在4的左側為“<”,右側為“-”運算符,而“-”優(yōu)先于“<”,因此應先進行“4-!0”的運算,由于“!”的級別最高,因此先進行“!0”的運算,得到結果1。然后進行“4-1”的運算,得結果3,再進行“8<3”的運算,得0,最后進行“1&&0”的運算,得0。可以是0(“假”)或任何非0的數(shù)值(按“真”對待)。如果在實際上,邏輯運算符兩側的運算對象不但可以是0和1,或者是0和非0的整數(shù),也可以是任何類型的數(shù)據(jù)??梢允亲址汀嵭突蛑羔樞偷?。系統(tǒng)最終以0和非0來判定它們屬于“真”或“假”。例如'c'&&'d'的值為1(因為‘c’和‘d’的ascII值都不為0,按“真”處理)。在邏輯表達式的求解中,并不是所有的邏輯運算符都被執(zhí)行,只是在必須執(zhí)行下一個邏輯運算符才能求出表達式的解時,才執(zhí)行該運算符。例如:實際上,邏輯運算符兩側的運算對象不但可以是0和1,或者是0和(1)a&&b&&c只有a為真(非0)時,才需要判別b的值,只有a和b都為真的情況下才需要判別c的值。只要a為假,就不必判別b和c(此時整個表達式已確定為假)。如果a為真,b為假,不判別c。見圖5.3。(2)a||b||c只要a為真(非0),就不必判斷b和c;只有a為假,才判別b;a和b都為假才判別c。見圖5.4。圖5.3圖5.4(1)a&&b&&c只有a為真(非0)時,才需要判也就是說,對&&運算符來說,只有a≠0,才繼續(xù)進行右面的運算。對運算符‖來說,只有a=0,才繼續(xù)進行其右面的運算。因此,如果有下面的邏輯表達式:(m=a>b)&&(n=c>d)當a=1,b=2,c=3,d=4,m和n的原值為1時,由于“a>b”的值為0,因此m=0,而“n=c>d”不被執(zhí)行,因此n的值不是0而仍保持原值1。這點請讀者注意。熟練掌握c語言的關系運算符和邏輯運算符后,可以巧妙地用一個邏輯表達式來表示一個復雜的條件。也就是說,對&&運算符來說,只有a≠0,才繼續(xù)進行右面的運算例如,要判別某一年year是否閏年。閏年的條件是符合下面二者之一:①能被4整除,但不能被100整除。②能被4整除,又能被400整除??梢杂靡粋€邏輯表達式來表示:(year%4==0&&year%100!=0)||year%400==0當year為某一整數(shù)值時,如果上述表達式值為真(1),則year為閏年;否則year為非閏年??梢约右粋€“!”用來判別非閏年:!((year%4==0&&year%100!=0)||year%400==0)例如,要判別某一年year是否閏年。閏年的條件是符合下面二者若表達式值為真(1),year為非閏年。也可以用下面邏輯表達式判別非閏年:(year%4!=0)||(year%100==0&&year%400!=0)若表達式值為真,year為非閏年。請注意表達式中右面的括弧內的不同運算符(%,!,&&0,==)的運算優(yōu)先次序。若表達式值為真(1),year為非閏年。也可以用下面邏輯表達5.3if語句if語句是用來判定所給定的條件是否滿足,根據(jù)判定的結果(真或假)決定執(zhí)行給出的兩種操作之一。5.3.1if語句的三種形式C語言提供了三種形式的if語句:1.if(表達式)語句例如:if(x>y)printf("%d",x);這種if語句的執(zhí)行過程見圖5.5(a)。5.3if語句2.if(表達式)語句1else語句2例如:if(x>y)printf("%d",x);elseprintf("%d",y);見圖5.5(b)。圖5.52.if(表達式)語句1else語句2圖5.53.if(表達式1)語句1elseif(表達式2)語句2elseif(表達式3)語句3…elseif(表達式m)語句melse語句n流程圖見圖5.6。圖5.63.if(表達式1)語句1圖5.6例如:if(number>500)cost=0.15;elseif(number>300)cost=0.10;elseif(number>100)cost=0.075;elseif(number>50)cost=0.05;elsecost=0;說明:(1)三種形式的if語句中在if后面都有“表達式”,一般為邏輯表達式或關系表達式。例如,if(a==b&&x==y)printf(“a=b,x=y”);在執(zhí)行if語句時先對表達式求解,若表達式的值為0,按“假”處理,若表達式的值為非0,按“真”處理,執(zhí)行指定的語句。假如有以下if語句:if(3)printf("O.k.");例如:是合法的,執(zhí)行結果輸出“O.k.”,因為表達式的值為3,按“真”處理。由此可見,表達式的類型不限于邏輯表達式,可以是任意的數(shù)值類型(包括整型、實型、字符型、指針型數(shù)據(jù))。例如,下面的if語句也是合法的:if('a')printf("%d",'a');執(zhí)行結果:輸出‘a’的ASCII碼97。(2)第二、第三種形式的if語句中,在每個else前面有一分號,整個語句結束處有一分號。例如:是合法的,執(zhí)行結果輸出“O.k.”,因為表達式的值為3,按“if(x>0)Print("%f",x);else各有一個分號printf("%f",-x);這是由于分號是c語句中不可缺少的部分,這個分號是if語句中的內嵌語句所要求的。如果無此分號,則出現(xiàn)語法錯誤。但應注意,不要誤認為上面是兩個語句(if語句和else語句)。它們都屬于同一個if語句。else子句不能作為語句單獨使用,它必須是if語句的一部分,與if配對使用。if(x>0)(3)在if和else后面可以只含一個內嵌的操作語句(如上例),也可以有多個操作語句,此時用花括號“{}”將幾個語句括起來成為一個復合語句。如:if(a+b>c&&b+c>a&&c+a>b){s=0.5*(a+b+c);area=sqrt(S*(S-a)*(S-b)*(S-c));printf("area=%6.2f",area);}elseprintf("itisnotatrilateral");注意在第3行的花括號“}”外面不需要再加分號。因為{}內是一個完整的復合語句,不需另附加分號。(3)在if和else后面可以只含一個內嵌的操作語句(如上例5.1輸入兩個實數(shù),按代數(shù)值由小到大的次序輸出這兩個數(shù)。這個問題的算法很簡單,只需要作一次比較即可。對類似這樣簡單的問題可以不必先寫出算法或畫流程圖,而直接編寫程序?;蛘哒f,算法在編程者的腦子里,相當于在算術運算中對簡單的問題可以“心算”而不必在紙上寫出來一樣。程序如下:main(){floata,b,t;scanf("%f,%f",&a,&b);例5.1輸入兩個實數(shù),按代數(shù)值由小到大的次序輸出這兩個數(shù)。if(a>b){t=a;a=b;b=t;}printf("%5.2f,%5.2f",a,b);}運行情況如下:3.6,-3.2-3.20,3.60例5.2輸入3個數(shù)a,b,c,要求按由小到大的順序輸出。解此題的算法比上一題稍復雜一些??梢杂脗未a寫出算法:if(a>b)ifa>b將a和b對換(a是a,b中的小者)ifa>c將a和c對換(a是a,c中的小者,因此a是三者中最小者)ifb>c將b和c對換(b是b,c中的小者,也是三者中次小者)然后順序輸出a,b,c即可。按此算法編寫程序:main(){floata,b,c,t;ifa>b將a和b對換(a是a,scanf("%f,%f,%f",&a,&b,&c);if(a>b)t=a;a=b;b=t;}/*實現(xiàn)a和b的互換*/if(a>c)t=a;a=c;c=t;}/*實現(xiàn)a和c的互換*/if(b>c){t=b;b=c;c=t;}/*實現(xiàn)b和c的互換*/printf("%5.2f,%5.2f,%5.2f",a,b,c);}運行情況如下:scanf("%f,%f,%f",&a,&b,&c);3,7,11.00,3.00,7.005.3.2if語句的嵌套在if語句中又包含一個或多個if語句稱為if語句的嵌套。一般形式如下:if()if()語句1else語句2內嵌ifelseif()語句3else語句4內嵌if3,7,1應當注意if與else的配對關系。else總是與它上面的最近的if配對。假如寫成:if()if()語句1elseif()語句2else語句3內嵌if編程序者把else寫在與第一個if(外層if)同一列上,希望else與第一個if對應,但實際上else是與第二個if配對,因為它們相距最近。因此最好使內嵌if語句也包含else部分(如本節(jié)(5.3.2節(jié))最早列出的形式),這樣if的數(shù)目和else的數(shù)目相同,從內層到外層一一對應,不致出錯。應當注意if與else的配對關系。else總是與它上面的最近如果if與else的數(shù)目不一樣,為實現(xiàn)程序設計者的企圖,可以加花括弧來確定配對關系。例如:if(){if()語句1}else語句2(內嵌if)這時{}限定了內嵌if語句的范圍,因此else與第一個if配對。如果if與else的數(shù)目不一樣,為實現(xiàn)程序設計者的企圖,可以例5.3有一函數(shù):y=-1(x<0)0(x=0)1(x>0)編一程序,輸入一個x值,輸出y值。可以先寫出算法:輸入x若x<0y=-1;若x=0y=0;若x>0y=1輸出y或輸入x若x<0y=-1否則:若x=0y=0;若x>0y=1輸出y。也可以用流程圖表示,見圖5.7。例5.3有一函數(shù):圖5.7圖5.7有以下幾個程序,請讀者判斷哪個是正確的?程序1:main(){intx,y;scanf("%d",&x);if(x<0)y=-1;elseif(x==0)y=0;elsey=1;printf("x=%d,y=%d\n",x,y);}有以下幾個程序,請讀者判斷哪個是正確的?程序2:將上面程序的if語句(第4~6行)改為:if(x>=0)if(x>0)y=1;elsey=0;elsey=-1;程序3:將上述if語句改為:y=-1;if(x!=0)if(x>0)y=1;elsey=0;程序2:將上面程序的if語句(第4~6行)改為:程序4:y=0;if(x>=0)if(x>0)y=1;elsey=-1;圖5.8圖5.8只有程序1和程序2是正確的。程序1體現(xiàn)了圖5.7的流程,顯然它是正確的。程序2的流程圖見圖5.8。它也能實現(xiàn)題目的要求。程序3的流程圖見圖5.9。程序4的流程圖見圖5.10。它們不能實現(xiàn)題目的要求。請注意程序中的else與if的配對關系。例如程序3中的else子句是和它上一行的內嵌的if語句配對,而不與笫2行的if語句配對。為了使邏輯關系清晰,避免出錯,一般把內嵌的if語句放在外層的else子句中(如程序1那樣),這樣由于有外層的else相隔,內嵌的else不會被誤認為和外層的if配對,而只能與內嵌的if配對,這樣就不會搞混,如像程序3和程序4那樣寫就很容易出錯。只有程序1和程序2是正確的。程序1體現(xiàn)了圖5.7的流程,顯然圖5.9圖5.10圖5.9圖5.105.3.3條件運算符若if語句中,在表達式為“真”和“假”時,且都只執(zhí)行一個賦值語句給同一個變量賦值時,可以用簡單的條件運算符來處理。例如,若有以下if語句:if(a>b)max=a;elsemax=b;可以用下面的條件運算符來處理:max=(a>b)?a∶b;其中“(a>b)?a∶b”是一個“條件表達式”。它是這樣執(zhí)行的:如果(a>b)條件為真,則條件表達式取值a,否則取值b。5.3.3條件運算符條件運算符要求有3個操作對象,稱三目(元)運算符,它是c語言中唯一的一個三目運算符。條件表達式的一般形式為圖5.11表達式1?表達式2∶表達式3。它的執(zhí)行過程見圖5.11。圖5.11條件運算符要求有3個操作對象,稱三目(元)運算符,它是c語言說明:(1)條件運算符的執(zhí)行順序:先求解表達式1,若為非0(真)則求解表達式2,此時表達式2的值就作為整個條件表達式的值。若表達式1的值為0(假),則求解表達式3,表達式3的值就是整個條件表達式的值。max=(a>b)?a∶b執(zhí)行結果就是將條件表達式的值賦給max。也就是將a和b二者中大者賦給max。(2)條件運算符優(yōu)先于賦值運算符,因此上面賦值表達式的求解過程是先求解條件表達式,再將它的值賦給max。說明:條件運算符的優(yōu)先級別比關系運算符和算術運算符都低。因此max=(a>b)?a∶b括號可以不要,可寫成max=a>b?a∶b如果有a>b?a∶b+1相當于a>b?a∶(b+1),而不相當于(a>b?a∶b)+1。(3)條件運算符的結合方向為“自右至左”。如果有以下條件表達式:a>b?a∶c>d?c∶d相當于a>b?a∶(c>d?c∶d)條件運算符的優(yōu)先級別比關系運算符和算術運算符都低。因此如果a=1,b=2,c=3,d=4,則條件表達式的值等于4。(4)條件表達式不能取代一般的if語句,只有在if語句中內嵌的語句為賦值語句(且兩個分支都給同一個變量賦值)時才能代替if語句。像下面的if語句就無法用一個條件表達式代替。if(a>b)printf("%d",a);elseprintf("%d",b);但可以用下面語句代替:printf("%d",a>b?a∶b);即將條件表達式的值輸出。如果a=1,b=2,c=3,d=4,則條件表達式的值等于4。(5)條件表達式中,表達式1的類型可以與表達式2和表達式3的類型不同。如x?'a'∶'b'x是整型變量,若x=0,則條件表達式的值為'b'。表達式2和表達式3的類型也可以不同,此時條件表達式的值的類型為二者中較高的類型。如x>y?1∶1.5如果x≤y,則條件表達式的值為1.5,若x>y,值應為1,由于1.5是實型,比整型高(見第3章3.7),因此,將1轉換成實型值1.0。例5.4輸入一個字符,判別它是否大寫字母,如果是,將它轉換成小寫字母;如果不是,不轉換。然后輸出最后得到的字符。(5)條件表達式中,表達式1的類型可以與表達式2和表達式3關于大小寫字母之間的轉換方法,在本書例3.7中已做了介紹,因此可直接編寫程序:main(){charch;scanf("%c",&ch);ch=(ch>='a'&&ch<=’Z')?(ch+32)∶ch;printf("%c",ch)}運行結果如下:aa關于大小寫字母之間的轉換方法,在本書例3.7中已做了介紹,因條件表達式中的(ch+32),其中32是小寫字母和大寫字母ASCII碼的差值。5.4Switch語句Switch語句是多分支選擇語句。用來實現(xiàn)如圖3.6所表示的多分支選擇結構。if語句只有兩個分支可供選擇,而實際問題中常常需要用到多分支的選擇。例如,學生成績分類(90分以上為‘a’等,80~89分為‘b’等,70~79分為‘c’等……);人口統(tǒng)計分類(按年齡分為老、中、青、少、兒童);工資統(tǒng)計分類;銀行存款分類……。條件表達式中的(ch+32),其中32是小寫字母和大寫字母A當然這些都可以用嵌套的if語句來處理,但如果分支較多,則嵌套的if語句層數(shù)多,程序冗長而且可讀性降低。c語言提供Switch語句直接處理多分支選擇,它相當于Pascal語言中的case語句。它的一般形式如下:switch(表達式){case常量表達式1:語句1case常量表達式2:語句2…case常量表達式n:語句ndefault:語句n+1}當然這些都可以用嵌套的if語句來處理,但如果分支較多,則嵌套例如,要求按照考試成績的等級打印出百分制分數(shù)段,可以用Switch語句實現(xiàn):Switch(grade){case'a'∶printf("85~100\n");case'b'∶printf("70~84\n");case'c'∶printf("60~69\n");case'D'∶printf("<60\n");default∶printf("error\n");}例如,要求按照考試成績的等級打印出百分制分數(shù)段,可以用Swi說明:(1)switch后面括弧內的“表達式”,ANSI標準允許它為任何類型。(2)當表達式的值與某一個case后面的常量表達式的值相等時,就執(zhí)行此case后面的語句,若所有的case中的常量表達式的值都沒有與表達式的值匹配的,就執(zhí)行default后面的語句。(3)每一個case的常量表達式的值必須互不相同,否則就會出現(xiàn)互相矛盾的現(xiàn)象(對表達式的同一個值,有兩種或多種執(zhí)行方案)。(4)各個case和default的出現(xiàn)次序不影響執(zhí)行結果。例如,可以先出現(xiàn)“default:…”,再出現(xiàn)“case‘D’:…”,然后是“case‘a’:…”。說明:(5)執(zhí)行完一個case后面的語句后,流程控制轉移到下一個case繼續(xù)執(zhí)行?!癱ase常量表達式”只是起語句標號作用,并不是在該處進行條件判斷。在執(zhí)行Switch語句時,根據(jù)Switch后面表達式的值找到匹配的入口標號,就從此標號開始執(zhí)行下去,不再進行判斷。例如,上面的例子中,若grade的值等于‘a’,則將連續(xù)輸出:85~10070~8460~69<60error(5)執(zhí)行完一個case后面的語句后,流程控制轉移到下一個因此,應該在執(zhí)行一個case分支后,使流程跳出Switch結構,即終止Switch語句的執(zhí)行??梢杂靡粋€break語句來達到此目的。將上面的Switch結構改寫如下:Switch(grade){case'a'∶printf("85~100\n");break;case'b'∶printf("70~84\n");break;case'c'∶printf("60~69\n");break;case'D'∶printf("<60\n");break;default∶printf("error\n");}因此,應該在執(zhí)行一個case分支后,使流程跳出Switch結最后一個分支(default)可以不加break語句。如果grade的值為‘b’,則只輸出“70~84”。流程圖見圖5.12。圖5.12最后一個分支(default)可以不加break語句。如果在case后面中雖然包含一個以上執(zhí)行語句,但可以不必用花括弧括起來,會自動順序執(zhí)行本case后面所有的執(zhí)行語句。當然加上花括弧也可以。(6)多個case可以共用一組執(zhí)行語句,如:…case'a'∶case'b'∶case'c'∶printf(">60\n");break;…grade的值為‘a’、‘b’或‘c’時都執(zhí)行同一組語句。在case后面中雖然包含一個以上執(zhí)行語句,但可以不必用花括弧5.5程序舉例例5.5寫程序,判斷某一年是否閏年。我們用圖5.13來表示判別閏年的算法。以變量leap代表是否閏年的信息。若某年為閏年,則令leap=1;若為非閏年,令leap=0。最后判斷l(xiāng)eap是否為1(真),若是,則輸出“閏年”信息。圖5.135.5程序舉例圖5.13據(jù)此編寫程序如下:main(){intyear,leap;scanf("%d",&year);if(year%4==0){if(year%100==0){if(year%400==0)leap=1;elseleap=0;}else據(jù)此編寫程序如下:leap=1;}elseleap=0;if(leap)printf("%dis",year);elseprintf("%disnot",year);printf("aleapyear.\n");}運行情況如下:leap=1;}①19891989isnotaleapyear.②20002000isaleapyear.也可以將程序中第5~13行改寫成以下的if語句:if(year%4!=0)leap=0;elseif(year%100!=0)leap=1;elseif(year%400!=0)leap=0;elseleap=1;①1989也可以用一個邏輯表達式包含所有的閏年條件,將上述if語句用下面的if語句代替:if((year%4==0&&year%100!=0)||(year%400==0))leap=1;elseleap=0;例5.6求ax2+bx+c=0方程的解。例4.12曾介紹過基本的算法,實際上應該有以下幾種可能:①a=0,不是二次方程。②b2-4ac=0,有兩個相等實根。③b2-4ac>0,有兩個不等實根。④b2-4ac<0,有兩個共軛復根。也可以用一個邏輯表達式包含所有的閏年條件,將上述if語句用下畫出NS流程圖表示算法(圖5.14)。圖5.14畫出NS流程圖表示算法(圖5.14)。圖5.14據(jù)此編寫程序如下:#include<math.h>main(){floata,b,c,d,disc,x1,x2,realpart,imagpart;scanf("%f,%f,%f",&a,&b,&c);printf("Theequation");if(fabs(a)<=le-6)printf("isnotaquadratic");else{disc=b*b-4*a*c;據(jù)此編寫程序如下:if(fabs(disc)<=le-6)printf("hastwoequalroots:%8.4\n",-b/(2*a));elseif(disc>le-6){x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf("hasdistinctrealroots:%8.4fand%8.4f\n",x1,x2);}else{realpart=-b/(2*a);if(fabs(disc)<=le-6)imagpart=sqrt(-disc)/(2*a);printf("hascomPlexroots∶\n");printf("%8.4f+%8.4fi\n",realpart,imagpart);printf("%8.4f-%8.4fi\n",realpart,imagpart);}}}程序中用disc代表b2-4ac,先計算disc的值,以減少以后的重復計算。對于判斷b2-4ac是否等于0時,要注意一個問題:由于disc(即b2-4ac)是imagpart=sqrt(-disc)/(2*a);實數(shù),而實數(shù)在計算和存儲時會有一些微小的誤差,因此不能直接進行如下判斷:if(disc==0)……因為這樣可能會出現(xiàn)本來是零的量,由于上述誤差而被判別為不等于零而導致結果錯誤。所以采取的辦法是判別disc的絕對值(fabs(disc))是否小于一個很小的數(shù)(例如10-6),如果小于此數(shù),就認為disc=0。程序中以realpart代表實部P,以imagpart代表虛部q,以增加可讀性。運行結果如下:①1,2,1Theequationhastwoequalroots∶-1.0000

實數(shù),而實數(shù)在計算和存儲時會有一些微小的誤差,因此不能直接進②1,2,2Theequationhascomplexroots:-1.0000+1.0000i-1.0000-1.0000i③2,6,1Theequationhasdistinctrealroots:-0.1771and=2.8229例5.7運輸公司對用戶計算運費。路程(S)越遠,每公里運費越低。標準如下:②1,2,2s<250km沒有折扣250≤S<5002%折扣500≤S<10005%折扣1000≤S<20008%折扣2000≤S<300010%折扣3000≤S15%折扣設每公里每噸貨物的基本運費為P(Price的縮寫),貨物重為w(weight的縮寫),距離為S,折扣為d(discount的縮寫),則總運費f(freight的縮寫)的計算公式為f=P*w*S*(1-d)分析此問題,折扣的變化是有規(guī)律的:從圖5.15可以看到,折扣的“變化C語言教材配套版第5章課件點”都是250的倍數(shù)(250,500,1000,2000,3000)。利用這一特點,可以在橫軸上加一種坐標c,c的值為S/250。c代表250的倍數(shù)。當c<1時,表示S<250,無折扣;1≤c<2時,表示250≤S<500,折扣d=2%;2≤c<4時,d=5%;4≤c<8時,d=8%;8≤c<12時,d=10%;c≥12時,d=15%。圖5.15點”都是250的倍數(shù)(250,500,1000,2000,據(jù)此寫出程序如下:main(){intc,S;floatP,w,d,f;scanf("%f,%f,%d",&P,&w,&S);if(S>=3000)c=12;elsec=S/250;switch(c){case0∶d=0;break;據(jù)此寫出程序如下:case1∶d=2;break;case2∶case3∶d=5;break;case4∶case5∶case6∶case7∶d=8;break;case8∶case9∶case10∶case11∶d=10;break;case1∶d=2;break;case12∶d=15;break;}f=P*w*S*(1-d/100.0);printf("freight=%15.4f",f);}運行情況如下:100,20,300freight=588000.0000請注意:c、S是整型變量,因此c=S/250為整數(shù)。當S≥3000時,令c=12,而不使c隨S增大,這是為了在Switch語句中便于處理,用一個case可以處理所有S≥3000的情況。case12∶d=15;break;習題5.1什么是算術運算?什么是關系運算?什么是邏輯運算?5.2C語言中如何表示“真”和“假”?系統(tǒng)如何判斷一個量的“真”和“假”?5.3寫出下面各邏輯表達式的值。設a=3,b=4,c=5。(1)a+b>c&&b==c(2)a||b+c&&b-c(3)!(a>b)&&!c||1(4)!(x=a)&&(y=b)&&0(5)!(a+b)+c-1&&b+c/2習題5.4有3個整數(shù)a、b、c,由鍵盤輸入,輸出其中最大的數(shù)。5.5有一函數(shù):x(x<1)y=2x-1(1≤x<10)3x-11(x≥10)寫一程序,輸入x,輸出y值。5.6給一個不多于5位的正整數(shù),要求:①求出它是幾位數(shù);②分別打印出每一位數(shù)字;③按逆序打印出各位數(shù)字,例如原數(shù)為321,應輸出123。5.4有3個整數(shù)a、b、c,由鍵盤輸入,輸出其中最大的數(shù)圖5.16圖5.165.7企業(yè)發(fā)放的獎金根據(jù)利潤提成。利潤I低于或等于10萬元的,獎金可提10%;利潤高于10萬元,低于20萬元(100000<I≤200000)時,低于10萬元的部分按10%提成,高于100000元的部分,可提成7.5%;200000<I≤400000時,低于20萬的部分仍按上述辦法提成(下同)。高于20萬元的部職?%提成;400000<I≤600000時,高于40萬元的部分按3%提成;600000<I≤1000000時,高于60萬的部分按1.5%提成;I>1000000時,超過100萬元的部分按1%提成。從鍵盤輸入當月利潤I,求應發(fā)獎金總數(shù)。要求:(1)用if語句編程序;(2)用Switch語句編程序。5.7企業(yè)發(fā)放的獎金根據(jù)利潤提成。利潤I低于或等于10萬5.8有4個圓塔,圓心分別為(2,2),(-2,2),(-2,-2),(2,-2),圓半徑為1。見圖5.16。這4個塔的高度為10m,塔以外無建筑物。今輸入任一點的坐標,求該點的建筑高度(塔外的高度為零)。5.8有4個圓塔,圓心分別為(2,2),(-2,2),(5.1關系運算符和關系表達式5.2邏輯運算符和邏輯表達式5.3if語句5.4switch語句5.5程序舉例習題第5章選擇結構程序設計5.1關系運算符和關系表達式第5章選擇結構程序設計在第3章中已介紹了選擇結構,它是三種基本結構之一。在大多數(shù)程序中都會包含選擇結構。它的作用是,根據(jù)所指定的條件是否滿足,決定從給定的兩組操作選擇其一。在本章中介紹如何用c語言實現(xiàn)選擇結構。在c語言中選擇結構是用if語句實現(xiàn)的。if語句最常用的形式是if(關系表達式)語句1else語句2例如:if(x>0)y=1;elsey=-1;其中x>0是一個關系表達式?!?gt;”是一個關系運算符。在第3章中已介紹了選擇結構,它是三種基本結構之一。在大多數(shù)程5.1關系運算符和關系表達式關系運算是邏輯運算中比較簡單的一種。所謂“關系運算”實際上是“比較運算”。將兩個值進行比較,判斷其比較的結果是否符合給定的條件。例如,a>3是一個關系表達式,大于號(>)是一個關系運算符,如果a的值為5,則滿足給定的“a>3”條件,因此關系表達式的值為“真”(即“條件滿足”);如果a的值為2,不滿足“a>3”條件,則稱關系表達式的值為“假”。5.1關系運算符和關系表達式關系運算是邏輯運算中比較簡單5.1.1關系運算符及其優(yōu)先次序C語言提供6種關系運算符:優(yōu)先級相同(高):①<(小于)②<=(小于或等于)③>(大于)④>=(大于或等于)優(yōu)先級相同(低):⑤==(等于)⑥!=(不等于)關于優(yōu)先次序:(1)前4種關系運算符(<,<=,>,>=)的優(yōu)先級別相同,后兩種也相同。前4種高于后2種。例如,“>”優(yōu)先于“==”。而“>”與“<”優(yōu)先級相同。5.1.1關系運算符及其優(yōu)先次序C語言提供6種關系運算符(2)關系運算符的優(yōu)先級低于算術運算符。(3)關系運算符的優(yōu)先級高于賦值運算符。以上關系見圖5.1。例如:c>a+b等效于c>(a+b)a>b==c等效于(a>b)==ca==b<c等效于a==(b<c)a=b>c等效于a=(b>c)圖5.1(2)關系運算符的優(yōu)先級低于算術運算符。圖5.15.1.2關系表達式用關系運算符將兩個表達式(可以是算術表達式或關系表達式、邏輯表達式、賦值表達式、字符表達式)連接起來的式子,稱關系表達式。例如,下面都是合法的關系表達式:a>b,a+b>b+c,(a=3)>(b=5),'a'<'b',(a>b)>(b<c)關系表達式的值是一個邏輯值,即“真”或“假”。例如,關系表達式“5==3”的值為“假”,“5>=0”的值為“真”。c語言沒有邏輯型數(shù)據(jù)(Pascal語言以True表示“真”,以false表示“假”。PascaL和FORTRAN等語言都有邏輯型變量和邏輯型常5.1.2關系表達式量),以1代表“真”,以“0”代表“假”。例如,a=3,b=2,c=1,則:關系表達式“a>b”的值為“真”,表達式的值為1。關系表達式“(a>b)==c”的值為“真”(因為a>b的值為1,等于c的值),表達式的值為1。關系表達式“b+c<a”的值為“假”,表達式的值為0。如果有以下賦值表達式:d=a>bd的值為1。f=a>b>cf的值為0(因為“>”運算符是自左至右的結合方向,先執(zhí)行“a>b”得值為1,再執(zhí)行關系運算“1>c”,得值0,賦給f)。量),以1代表“真”,以“0”代表“假”。例如,a=3,b用邏輯運算符將關系表達式或邏輯量連接起來的式子就是邏輯表達式。在basic和Pascal語言中有以下形式的邏輯表達式(AND是邏輯運算符):(a>b)AND(x>y)如果a>b且x>y,則上述邏輯表達式的值為“真”。下面介紹c語言中的邏輯運算符和邏輯運算。5.2.1邏輯運算符及其優(yōu)先次序C語言提供三種邏輯運算符:5.2邏輯運算符和邏輯表達式用邏輯運算符將關系表達式或邏輯量連接起來的式子就是邏輯表達式(1)&&邏輯與(相當于其他語言中的aND)(2)||邏輯或(相當于其他語言中的OR)(3)!邏輯非(相當于其他語言中的NOT)“&&”和“||”是“雙目(元)運算符”,它要求有兩個運算量(操作數(shù)),如(a>b)&&(x>y),(a>b)||(x>y)?!?”是“一目(元)運算符”,只要求有一個運算量,如(a>b)。邏輯運算舉例如下:a&&b若a、b為真,則a&&b為真。a||b若a、b之一為真,則a||b為真。!a若a為真,則!a為假。(1)&&邏輯與(相當于其他語言中的aND)在一個邏輯表達式中如果包含多個邏輯運算符,如!a&&b||x>y&&c按以下的優(yōu)先次序:(1)!(非)→&&(與)→(或),即“!”為三者中最高的。(2)邏輯運算符中的“&&”和“||”低于關系運算符,“!”高于算術運算符。見圖5.2。圖5.2在一個邏輯表達式中如果包含多個邏輯運算符,如圖5.2例如:(a>b)&&(x>y)可寫成a>b&&x>y(a==b)||(x==y)可寫成a==b||x==y(!a)||(a>b)可寫成!a||a>b5.2.2邏輯表達式如前所述,邏輯表達式的值應該是一個邏輯量“真”或“假”。c語言編譯系統(tǒng)在給出邏輯運算結果時,以數(shù)值1代表“真”,以0代表“假”,但在判斷一個量是否為“真”時,以0代表“假”,以非0代表“真”。即將一個非零的數(shù)值認作為“真”。例如:例如:(1)若a=4,則!a的值為0。因為a的值為非0,被認作“真”,對它進行“非”運算,得“假”,“假”以0代表。(2)若a=4,b=5,則a&&b的值為1。因為a和b均為非0,被認為是“真”,因此a&&b的值也為“真”,值為1。(3)a、b值同前,a||b的值為1。(4)a、b值同前,!a||b的值為1。(5)4&&0||2的值為1。通過這幾個例子可以看出,由系統(tǒng)給出的邏輯運算結果不是0就是1,不可能是其他數(shù)值。而在邏輯表達式中作為參加邏輯運算的運算對象(操作數(shù))(1)若a=4,則!a的值為0。因為a的值為非0,被認作“可以是0(“假”)或任何非0的數(shù)值(按“真”對待)。如果在一個表達式中不同位置上出現(xiàn)數(shù)值,應區(qū)分哪些是作為數(shù)值運算或關系運算的對象,哪些作為邏輯運算的對象。例如:5>3&&8<4-!0表達式自左至右掃描求解。首先處理“5>3”(因為關系運算符優(yōu)先于&&)。在關系運算符兩側的5和3作為數(shù)值參加關系運算,“5>3”的值為1。再進行“1&&8<4-!0”的運算,8的左側為“&&”,右側為“<”運算符,根據(jù)優(yōu)先規(guī)則,應先進行“<”的運算,即先進行“8<4-!0”的運算。現(xiàn)在4的左側為“<”,右側為“-”運算符,而“-”優(yōu)先于“<”,因此應先進行“4-!0”的運算,由于“!”的級別最高,因此先進行“!0”的運算,得到結果1。然后進行“4-1”的運算,得結果3,再進行“8<3”的運算,得0,最后進行“1&&0”的運算,得0。可以是0(“假”)或任何非0的數(shù)值(按“真”對待)。如果在實際上,邏輯運算符兩側的運算對象不但可以是0和1,或者是0和非0的整數(shù),也可以是任何類型的數(shù)據(jù)??梢允亲址?、實型或指針型等。系統(tǒng)最終以0和非0來判定它們屬于“真”或“假”。例如'c'&&'d'的值為1(因為‘c’和‘d’的ascII值都不為0,按“真”處理)。在邏輯表達式的求解中,并不是所有的邏輯運算符都被執(zhí)行,只是在必須執(zhí)行下一個邏輯運算符才能求出表達式的解時,才執(zhí)行該運算符。例如:實際上,邏輯運算符兩側的運算對象不但可以是0和1,或者是0和(1)a&&b&&c只有a為真(非0)時,才需要判別b的值,只有a和b都為真的情況下才需要判別c的值。只要a為假,就不必判別b和c(此時整個表達式已確定為假)。如果a為真,b為假,不判別c。見圖5.3。(2)a||b||c只要a為真(非0),就不必判斷b和c;只有a為假,才判別b;a和b都為假才判別c。見圖5.4。圖5.3圖5.4(1)a&&b&&c只有a為真(非0)時,才需要判也就是說,對&&運算符來說,只有a≠0,才繼續(xù)進行右面的運算。對運算符‖來說,只有a=0,才繼續(xù)進行其右面的運算。因此,如果有下面的邏輯表達式:(m=a>b)&&(n=c>d)當a=1,b=2,c=3,d=4,m和n的原值為1時,由于“a>b”的值為0,因此m=0,而“n=c>d”不被執(zhí)行,因此n的值不是0而仍保持原值1。這點請讀者注意。熟練掌握c語言的關系運算符和邏輯運算符后,可以巧妙地用一個邏輯表達式來表示一個復雜的條件。也就是說,對&&運算符來說,只有a≠0,才繼續(xù)進行右面的運算例如,要判別某一年year是否閏年。閏年的條件是符合下面二者之一:①能被4整除,但不能被100整除。②能被4整除,又能被400整除??梢杂靡粋€邏輯表達式來表示:(year%4==0&&year%100!=0)||year%400==0當year為某一整數(shù)值時,如果上述表達式值為真(1),則year為閏年;否則year為非閏年??梢约右粋€“!”用來判別非閏年:!((year%4==0&&year%100!=0)||year%400==0)例如,要判別某一年year是否閏年。閏年的條件是符合下面二者若表達式值為真(1),year為非閏年。也可以用下面邏輯表達式判別非閏年:(year%4!=0)||(year%100==0&&year%400!=0)若表達式值為真,year為非閏年。請注意表達式中右面的括弧內的不同運算符(%,!,&&0,==)的運算優(yōu)先次序。若表達式值為真(1),year為非閏年。也可以用下面邏輯表達5.3if語句if語句是用來判定所給定的條件是否滿足,根據(jù)判定的結果(真或假)決定執(zhí)行給出的兩種操作之一。5.3.1if語句的三種形式C語言提供了三種形式的if語句:1.if(表達式)語句例如:if(x>y)printf("%d",x);這種if語句的執(zhí)行過程見圖5.5(a)。5.3if語句2.if(表達式)語句1else語句2例如:if(x>y)printf("%d",x);elseprintf("%d",y);見圖5.5(b)。圖5.52.if(表達式)語句1else語句2圖5.53.if(表達式1)語句1elseif(表達式2)語句2elseif(表達式3)語句3…elseif(表達式m)語句melse語句n流程圖見圖5.6。圖5.63.if(表達式1)語句1圖5.6例如:if(number>500)cost=0.15;elseif(number>300)cost=0.10;elseif(number>100)cost=0.075;elseif(number>50)cost=0.05;elsecost=0;說明:(1)三種形式的if語句中在if后面都有“表達式”,一般為邏輯表達式或關系表達式。例如,if(a==b&&x==y)printf(“a=b,x=y”);在執(zhí)行if語句時先對表達式求解,若表達式的值為0,按“假”處理,若表達式的值為非0,按“真”處理,執(zhí)行指定的語句。假如有以下if語句:if(3)printf("O.k.");例如:是合法的,執(zhí)行結果輸出“O.k.”,因為表達式的值為3,按“真”處理。由此可見,表達式的類型不限于邏輯表達式,可以是任意的數(shù)值類型(包括整型、實型、字符型、指針型數(shù)據(jù))。例如,下面的if語句也是合法的:if('a')printf("%d",'a');執(zhí)行結果:輸出‘a’的ASCII碼97。(2)第二、第三種形式的if語句中,在每個else前面有一分號,整個語句結束處有一分號。例如:是合法的,執(zhí)行結果輸出“O.k.”,因為表達式的值為3,按“if(x>0)Print("%f",x);else各有一個分號printf("%f",-x);這是由于分號是c語句中不可缺少的部分,這個分號是if語句中的內嵌語句所要求的。如果無此分號,則出現(xiàn)語法錯誤。但應注意,不要誤認為上面是兩個語句(if語句和else語句)。它們都屬于同一個if語句。else子句不能作為語句單獨使用,它必須是if語句的一部分,與if配對使用。if(x>0)(3)在if和else后面可以只含一個內嵌的操作語句(如上例),也可以有多個操作語句,此時用花括號“{}”將幾個語句括起來成為一個復合語句。如:if(a+b>c&&b+c>a&&c+a>b){s=0.5*(a+b+c);area=sqrt(S*(S-a)*(S-b)*(S-c));printf("area=%6.2f",area);}elseprintf("itisnotatrilateral");注意在第3行的花括號“}”外面不需要再加分號。因為{}內是一個完整的復合語句,不需另附加分號。(3)在if和else后面可以只含一個內嵌的操作語句(如上例5.1輸入兩個實數(shù),按代數(shù)值由小到大的次序輸出這兩個數(shù)。這個問題的算法很簡單,只需要作一次比較即可。對類似這樣簡單的問題可以不必先寫出算法或畫流程圖,而直接編寫程序?;蛘哒f,算法在編程者的腦子里,相當于在算術運算中對簡單的問題可以“心算”而不必在紙上寫出來一樣。程序如下:main(){floata,b,t;scanf("%f,%f",&a,&b);例5.1輸入兩個實數(shù),按代數(shù)值由小到大的次序輸出這兩個數(shù)。if(a>b){t=a;a=b;b=t;}printf("%5.2f,%5.2f",a,b);}運行情況如下:3.6,-3.2-3.20,3.60例5.2輸入3個數(shù)a,b,c,要求按由小到大的順序輸出。解此題的算法比上一題稍復雜一些??梢杂脗未a寫出算法:if(a>b)ifa>b將a和b對換(a是a,b中的小者)ifa>c將a和c對換(a是a,c中的小者,因此a是三者中最小者)ifb>c將b和c對換(b是b,c中的小者,也是三者中次小者)然后順序輸出a,b,c即可。按此算法編寫程序:main(){floata,b,c,t;ifa>b將a和b對換(a是a,scanf("%f,%f,%f",&a,&b,&c);if(a>b)t=a;a=b;b=t;}/*實現(xiàn)a和b的互換*/if(a>c)t=a;a=c;c=t;}/*實現(xiàn)a和c的互換*/if(b>c){t=b;b=c;c=t;}/*實現(xiàn)b和c的互換*/printf("%5.2f,%5.2f,%5.2f",a,b,c);}運行情況如下:scanf("%f,%f,%f",&a,&b,&c);3,7,11.00,3.00,7.005.3.2if語句的嵌套在if語句中又包含一個或多個if語句稱為if語句的嵌套。一般形式如下:if()if()語句1else語句2內嵌ifelseif()語句3else語句4內嵌if3,7,1應當注意if與else的配對關系。else總是與它上面的最近的if配對。假如寫成:if()if()語句1elseif()語句2else語句3內嵌if編程序者把else寫在與第一個if(外層if)同一列上,希望else與第一個if對應,但實際上else是與第二個if配對,因為它們相距最近。因此最好使內嵌if語句也包含else部分(如本節(jié)(5.3.2節(jié))最早列出的形式),這樣if的數(shù)目和else的數(shù)目相同,從內層到外層一一對應,不致出錯。應當注意if與else的配對關系。else總是與它上面的最近如果if與else的數(shù)目不一樣,為實現(xiàn)程序設計者的企圖,可以加花括弧來確定配對關系。例如:if(){if()語句1}else語句2(內嵌if)這時{}限定了內嵌if語句的范圍,因此else與第一個if配對。如果if與else的數(shù)目不一樣,為實現(xiàn)程序設計者的企圖,可以例5.3有一函數(shù):y=-1(x<0)0(x=0)1(x>0)編一程序,輸入一個x值,輸出y值。可以先寫出算法:輸入x若x<0y=-1;若x=0y=0;若x>0y=1輸出y或輸入x若x<0y=-1否則:若x=0y=0;若x>0y=1輸出y。也可以用流程圖表示,見圖5.7。例5.3有一函數(shù):圖5.7圖5.7有以下幾個程序,請讀者判斷哪個是正確的?程序1:main(){intx,y;scanf("%d",&x);if(x<0)y=-1;elseif(x==0)y=0;elsey=1;printf("x=%d,y=%d\n",x,y);}有以下幾個程序,請讀者判斷哪個是正確的?程序2:將上面程序的if語句(第4~6行)改為:if(x>=0)if(x>0)y=1;elsey=0;elsey=-1;程序3:將上述if語句改為:y=-1;if(x!=0)if(x>0)y=1;elsey=0;程序2:將上面程序的if語句(第4~6行)改為:程序4:y=0;if(x>=0)if(x>0)y=1;elsey=-1;圖5.8圖5.8只有程序1和程序2是正確的。程序1體現(xiàn)了圖5.7的流程,顯然它是正確的。程序2的流程圖見圖5.8。它也能實現(xiàn)題目的要求。程序3的流程圖見圖5.9。程序4的流程圖見圖5.10。它們不能實現(xiàn)題目的要求。請注意程序中的else與if的配對關系。例如程序3中的else子句是和它上一行的內嵌的if語句配對,而不與笫2行的if語句配對。為了使邏輯關系清晰,避免出錯,一般把內嵌的if語句放在外層的else子句中(如程序1那樣),這樣由于有外層的else相隔,內嵌的else不會被誤認為和外層的if配對,而只能與內嵌的if配對,這樣就不會搞混,如像程序3和程序4那樣寫就很容易出錯。只有程序1和程序2是正確的。程序1體現(xiàn)了圖5.7的流程,顯然圖5.9圖5.10圖5.9圖5.105.3.3條件運算符若if語句中,在表達式為“真”和“假”時,且都只執(zhí)行一個賦值語句給同一個變量賦值時,可以用簡單的條件運算符來處理。例如,若有以下if語句:if(a>b)max=a;elsemax=b;可以用下面的條件運算符來處理:max=(a>b)?a∶b;其中“(a>b)?a∶b”是一個“條件表達式”。它是這樣執(zhí)行的:如果(a>b)條件為真,則條件表達式取值a,否則取值b。5.3.3條件運算符條件運算符要求有3個操作對象,稱三目(元)運算符,它是c語言中唯一的一個三目運算符。條件表達式的一般形式為圖5.11表達式1?表達式2∶表達式3。它的執(zhí)行過程見圖5.11。圖5.11條件運算符要求有3個操作對象,稱三目(元)運算符,它是c語言說明:(1)條件運算符的執(zhí)行順序:先求解表達式1,若為非0(真)則求解表達式2,此時表達式2的值就作為整個條件表達式的值。若表達式1的值為0(假),則求解表達式3,表達式3的值就是整個條件表達式的值。max=(a>b)?a∶b執(zhí)行結果就是將條件表達式的值賦給max。也就是將a和b二者中大者賦給max。(2)條件運算符優(yōu)先于賦值運算符,因此上面賦值表達式的求解過程是先求解條件表達式,再將它的值賦給max。說明:條件運算符的優(yōu)先級別比關系運算符和算術運算符都低。因此max=(a>b)?a∶b括號可以不要,可寫成max=a>b?a∶b如果有a>b?a∶b+1相當于a>b?a∶(b+1),而不相當于(a>b?a∶b)+1。(3)條件運算符的結合方向為“自右至左”。如果有以下條件表達式:a>b?a∶c>d?c∶d相當于a>b?a∶(c>d?c∶d)條件運算符的優(yōu)先級別比關系運算符和算術運算符都低。因此如果a=1,b=2,c=3,d=4,則條件表達式的值等于4。(4)條件表達式不能取代一般的if語句,只有在if語句中內嵌的語句為賦值語句(且兩個分支都給同一個變量賦值)時才能代替if語句。像下面的if語句就無法用一個條件表達式代替。if(a>b)printf("%d",a);elseprintf("%d",b);但可以用下面語句代替:printf("%d",a>b?a∶b);即將條件表達式的值輸出。如果a=1,b=2,c=3,d=4,則條件表達式的值等于4。(5)條件表達式中,表達式1的類型可以與表達式2和表達式3的類型不同。如x?'a'∶'b'x是整型變量,若x=0,則條件表達式的值為'b'。表達式2和表達式3的類型也可以不同,此時條件表達式的值的類型為二者中較高的類型。如x>y?1∶1.5如果x≤y,則條件表達式的值為1.5,若x>y,值應為1,由于1.5是實型,比整型高(見第3章3.7),因此,將1轉換成實型值1.0。例5.4輸入一個字符,判別它是否大寫字母,如果是,將它轉換成小寫字母;如果不是,不轉換。然后輸出最后得到的字符。(5)條件表達式中,表達式1的類型可以與表達式2和表達式3關于大小寫字母之間的轉換方法,在本書例3.7中已做了介紹,因此可直接編寫程序:main(){charch;scanf("%c",&ch);ch=(ch>='a'&&ch<=’Z')?(ch+32)∶ch;printf("%c",ch)}運行結果如下:aa關于大小寫字母之間的轉換方法,在本書例3.7中已做了介紹,因條件表達式中的(ch+32),其中32是小寫字母和大寫字母ASCII碼的差值。5.4Switch語句Switch語句是多分支選擇語句。用來實現(xiàn)如圖3.6所表示的多分支選擇結

溫馨提示

  • 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

提交評論