《第4章 分支程序設(shè)計(jì)》由會員分享,可在線閱讀,更多相關(guān)《第4章 分支程序設(shè)計(jì)(49頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、 在C程序的三種結(jié)構(gòu)中,分支結(jié)構(gòu)是一重要結(jié)構(gòu),其中的P為條件問題:條件如何表達(dá)?邏輯運(yùn)算、關(guān)系運(yùn)算第4章 分支結(jié)構(gòu)程序設(shè)計(jì) 關(guān)系運(yùn)算關(guān)系運(yùn)算比較運(yùn)算比較運(yùn)算例如:a3為一比較運(yùn)算,當(dāng)a=5,a3成立。結(jié)果稱為“真”,否則,如:a=1,a3不成立,為假。上述表達(dá)式a3稱為關(guān)系表達(dá)式。4.1 關(guān)系運(yùn)算關(guān)系運(yùn)算1.,=為同一優(yōu)先級,=,!=等為同一優(yōu)先級,但前者高于后者。2.關(guān)系運(yùn)算符優(yōu)先級低于算術(shù)運(yùn)算符。C語言提供了六種關(guān)系運(yùn)算符 =!=優(yōu)先次序:優(yōu)先次序:4.1.1 關(guān)系運(yùn)算符關(guān)系運(yùn)算符3.關(guān)系運(yùn)算符優(yōu)先級高于賦值運(yùn)算符。如下圖:算術(shù)運(yùn)算符賦值運(yùn)算符關(guān)系運(yùn)算符高低舉例:ca+b c(a+b)ab
2、!=c (ab)!=ca=bc a=(bc a=(bc)關(guān)系表達(dá)式的結(jié)果值規(guī)定為1或0.如:ab,a+bb+c,(a=3)(b=5),a b,(ab)(bb)=c 成立 1b+cb 則ab值為1,所以d=1.f=abc ab為1,abc為0,所以f=0.用邏輯運(yùn)算符將關(guān)系表達(dá)式、邏輯表達(dá)式連接起來的式子邏輯表達(dá)式。例如:a&b ab (與運(yùn)算)a|b ab (或運(yùn)算)4.2 邏輯運(yùn)算邏輯運(yùn)算 a b !a !b a&b a b 真 真 假 假 真 真 真 假 假 真 假 真 假 真 真 假 假 真 假 假 真 真 假 假三種:&(與),(或)!(非)其意義見真值表4.2.1 邏輯運(yùn)算符a&b
3、當(dāng)a,b均為1時(shí),才為1a b 當(dāng)a,b中有一個(gè)為1時(shí),才為1!a 當(dāng)a為1,!a為0,反之為1.由此看到:和&為雙目運(yùn)算符.!為單目運(yùn)算符。2.&和低于關(guān)系運(yùn)算符。!高于算術(shù)運(yùn)算符1.!(非)優(yōu)先于&(與).&優(yōu)先于即:!&例:!a&b xy&c (!a)&b)(xy)&c)優(yōu)先次序優(yōu)先次序 1.邏輯表達(dá)式的值與關(guān)系表達(dá)式值一樣,真為1,假為0。例:a=4 則!a 值為0.此處只要a 0,為真.則!a值為0.a=4,b=5 a&b為1 前面已定義了邏輯表達(dá)式,以下看一看邏輯表達(dá)式的值及具體的運(yùn)算。4.2.2 邏輯表達(dá)式 4&0 2 為1.總之,在邏輯運(yùn)算中,非0值參加邏輯運(yùn)算時(shí)被看成1處理.
4、a=4,b=5 a b為1 a=4,b=5!a b為12.一個(gè)邏輯表達(dá)式中的邏輯運(yùn)算符并不是一定全部執(zhí)行.一個(gè)實(shí)際的例子:判斷年號是否為潤年。如:a&b&c.則當(dāng)a=0(假)時(shí),b,c不需判斷。當(dāng)a=1,b=0,則不需判c.又如:a b c.當(dāng)a=1時(shí),b,c均不必判別。潤年的定義:能被4整除且又能被400整除。年號能被4整除但不能被100整除。當(dāng)(year%4!=0)(year%100=0&year%400!=0)為1時(shí),year為非潤年。設(shè)用變量year表示年號 當(dāng)(year%4=0&year%100!=0)year%400=0)為1時(shí),year為潤年,否則為非潤年。如果要判別非潤年可在上
5、述表達(dá)式前加非(!)運(yùn)算符.當(dāng)!(year%4=0&year%100!=0)year%400=0)為1時(shí),year為非潤年?;蛘?即:則:4.3.1 ifif的三種形式 功能:當(dāng)表達(dá)式值非0時(shí),執(zhí)行語句A,否則不執(zhí)行語句A.表達(dá)式語句A00例如:if(xy)printf(%d,x);形式1 if(表達(dá)式)語句A其流程圖:4.3 if 語句語句形式2 if(表達(dá)式)語句A else 語句B功能:表達(dá)式為非0,執(zhí)行語句A 表達(dá)式為0,執(zhí)行語句B表達(dá)式語句A語句B 0=0例:if(xy)printf(%d,x);else printf(%d,y);if(表達(dá)式1)語句1 else if(表達(dá)式2)語
6、句2else if(表達(dá)式3)語句3 else if(表達(dá)式n)語句nelse 語句nif 語句的形式3流程:表達(dá)1表達(dá)2表達(dá)3表達(dá)n語句1語句2語句3語句n語句n語句1 0=0=0 0 0 0如:if(3)prinft(o.k);if(a)1.表達(dá)式可以是邏輯、關(guān)系,甚至是算術(shù)表達(dá)式。2.上述形式中的語句必須以分號結(jié)束 3.上述形式中的語句可以是由 括起來的復(fù)合語句。此時(shí),在 外可以不用分號.應(yīng)該注意的問題:main()float a,b,t;scanf(%f,%f,&a,&b);if(ab)t=a;a=b;b=t;printf(%5.2f,%5.2f,a,b);例4.1 輸入兩個(gè)實(shí)數(shù),按代
7、數(shù)值由小到大次序輸出這兩個(gè)數(shù)。例4.1 3.6,3.2 3.20,3.60運(yùn)行情況如下:例4.2 輸入三個(gè)數(shù),按由小大順序輸出。main()float a,b,c,t;scanf(%f,%f,%f,&a,&b,&c);if(ab)t=a;a=b;b=t;if(ac)t=a;a=c;c=t;例4.2 if(bc)t=b;b=c;c=t;printf(%5.2f,%5.2f,%5.2f,a,b,c);運(yùn)行情況如下:3,7,1 1.00,3.00,7.00if(表達(dá)式1)內(nèi)嵌ifelse內(nèi)嵌注意:else與最近的if 配對.一般形式 在上述形式的if語句中,又可以是if語句稱為嵌套。if(表達(dá)式2)
8、語句1if(表達(dá)式3)語句3else 語句2else 語句44.3.2.if語句的嵌套例:if()if()語句2else 語句3if ()if()語句1 else 所以:必要時(shí)加.if()語句1else例4.3 有一函數(shù)y=1 (x0)編一程序,輸入一個(gè)x值,輸出y值。有以下幾種寫法,請判斷哪些是正確的?程序1:main()int x,y;scanf(d,&x);例4.3 if(x=0)if(x0)y=1;else y=0;else y=1;程序3:將上述if語句改為:y=1;if(x!=0)if(x0)y=1;else y=0;程序4:y=0;if(x=0)if(x0)y=1;else y=
9、1;C語言提供了一個(gè)簡單的條件賦值語句或條件表達(dá)式。問題:當(dāng)判斷條件不論是“真”是“假”,均給同一變量賦值時(shí),能否簡化語句書寫?條件運(yùn)算符為?:三目運(yùn)算符。4.4 條件運(yùn)算符與條件表達(dá)式條件運(yùn)算符與條件表達(dá)式功能:先判表達(dá)式1,若非0,則值為表達(dá)式2的值,否則為表達(dá)式3的值。表達(dá)式1?表達(dá)式2:表達(dá)式3 max=ab?a:b;當(dāng)ab.max a.否則maxb條件表達(dá)式的條件表達(dá)式的一般形式注:1.條件運(yùn)算符優(yōu)先于賦值運(yùn)算符.例:max=(ab?a:b)可去掉()2.條件運(yùn)算符低于關(guān)系運(yùn)算符和算術(shù)運(yùn)算符。例:max=ab?a:b+1 max=ab?a:(b+1)并不是 max=(ab?a:b)+
10、1 3.條件運(yùn)算符結(jié)合性為從右至左.如:ab?a:cd?c:d 相當(dāng)于 ab?a:(cd?c:d)4.條件表達(dá)式不能取代一般的if語句,只有當(dāng)if 的兩 個(gè)分支為給同一變量賦值時(shí)才可替代if.if(ab)printf(%d,a);else printf(%d,b)由于printf.不是表達(dá)式,故不可用條件表達(dá)式,但可為:printf(%d,ab?a:b);5.表達(dá)式1、表達(dá)式2、表達(dá)式3可類型不同。main()char ch;scanf(%c,&ch);ch=(ch=A&ch=Z?(ch+32):ch;printf(%c,ch)例4.4 輸入一個(gè)字符,判別它是否大寫字母,如果是,將它轉(zhuǎn)換成小寫
11、字母;如果不是,不轉(zhuǎn)換。然后輸出最后得到的字符。例4.4運(yùn)行結(jié)果如下:A a 問題:當(dāng)某一表達(dá)式有n個(gè)取值,每一取值執(zhí)行一語句,則如果用內(nèi)嵌if十分繁鎖,而用switch簡單.一般形式:switch(表達(dá)式)case 常量表達(dá)式1:語句1 case 常量表達(dá)式2:語句2 case 常量表達(dá)式n:語句n default :語句n+1 4.5 switch 語句語句開關(guān)語開關(guān)語句句例:根據(jù)成績等級打印百分?jǐn)?shù)段.switch(grade)case A:printf(85100n);case B:printf(7084n);case C:printf(6069n);case D:printf(60n)
12、;break;case D:printf(60n);break;例1 寫一程序,輸入年號,判斷是否為閏年。1.算法:根據(jù)閏年的判斷條件 當(dāng)年號能被4整除但不能被100整除時(shí),它為閏年。當(dāng)年號能被100整除又能被400整除時(shí),它為閏年。4.6 分支程序舉例分支程序舉例 設(shè)用變量year表示年號,leap為待置值變量,當(dāng)year為閏年:leap1,否則leap0.輸入yearyear%4=0year%100=0leap0leap1yesANoNoyes 2.流程圖leap%400=0leap1leap=0打印非閏年打印是閏年結(jié)束leap0yesNoyesNoA3.程序:main()int year
13、,leap;scanf(%d,&year);if(year%4=0)if(year%100=0)if(year%400=0)leap=1;else leap=0;else leap=1;else leap=0;if(leap)printf(%d is,year);else printf(%d is not,year);printf(a leap yearn);運(yùn)行情況如下:2000 2000 is a leap year1989 1989 is not a leap year 上述條件也可用一個(gè)邏輯表達(dá)式表示:if(year%4=0)&year%100!=0)(year%400=0)leap=1;else leap=0;例4.13:求ax2+b x+c=0方程的解例4.14:P62 請同學(xué)們閱讀