吉林大學《C語言程序設計基礎》課程選擇程序結構設計_第1頁
吉林大學《C語言程序設計基礎》課程選擇程序結構設計_第2頁
吉林大學《C語言程序設計基礎》課程選擇程序結構設計_第3頁
吉林大學《C語言程序設計基礎》課程選擇程序結構設計_第4頁
吉林大學《C語言程序設計基礎》課程選擇程序結構設計_第5頁
已閱讀5頁,還剩46頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、C程序設計第5章 選擇結構程序設計本章要點關系運算符和關系表達式邏輯運算符和邏輯表達式if語句switch語句程序舉例5.1 關系運算符和關系表達式所謂“關系運算實際上是“比較運算。將兩個值進行比較,判斷比較的結果是否符合給定的條件。例如,a3是一個關系表達式。如果a的值為5,那么關系表達式的值為“真;如果a的值為2,不滿足“a3條件,那么稱關系表達式的值為“假。5.1.1 關系運算符及其優先次序 C語言提供6種關系運算符: (1) 小于 (2) 大于 (4) = 大于或等于 (5) = = 等于 (6) != 不等于優先級相同高優先級相同低優先次序:1前4種關系運算符的優先級別高于后兩種。2

2、關系運算符的優先級低于算術運算符。3關系運算符的優先級高于賦值運算符。以上關系如圖5-1所示。算術運算符關系運算符賦值運算符(高)(低)圖5-1例如:ca+b 等效于c(a+b)a=bc等效于a=bc 等效于a=(bc)5.1.2 關系表達式用關系運算符將兩個表達式可以是算術、關系、邏輯、賦值、字符表達式連接起來的式子,稱關系表達式。關系表達式的值是一個邏輯值,即“真或“假。 例如: ab, a+bb+c, a(b=5), (ab)(by) 可寫成ab&xy ( !a)|(ab) 可寫成!a|ab5.2.2 邏輯表達式 用邏輯運算符將關系表達式或邏輯量連接起來的式子就是邏輯表達式。邏輯表達式的

3、值應該是一個邏輯量“真或“假。 邏輯值及其判斷 C語言編譯系統在給出邏輯運算結果時,以數值1代表“真,以0代表“假,但在判斷一個量是否為“真時,以0代表“假,以非0代表“真。 例如:假設a=4,b=5。 !a 的值為0。 a&b 的值為1。 a|b 的值為1。 !a|b 的值為1。 4&0|2 的值為1。 說明:由系統給出的邏輯運算結果不是0就是1,不可能是其它數值。而在邏輯表達式中作為參加邏輯運算的運算對象操作數可以是0假或任何非0的數值真。 分析:53&2|84-!0注意: 在邏輯表達式的求解中,并不是所有的邏輯運算符都被執行,只是在必須執行下一個邏輯運算符才能求出表達式的解時,才執行該運

4、算符。 1a&b&c 只有a為真時,才需要判別b的值,只有a和b都為真的情況下才需要判別c的值,見圖5.3。圖5-3(2)a|b|c 只要a為真,就不必判斷b和c;只有a假,才判別b;a和b都為假才判別c,見圖 如果有下面的邏輯表達式:(m=ab)&(n=cd) 當a=1,b=2,c=3,d=4,m和n的原值為1時,執行之后m=0,n=1。 圖5-4 例:要判別某一年year是否閏年。閏年的條件是符合下面二者之一: 能被4整除,但不能被100整除。能被4整除,又能被400整除。 可以用一個邏輯表達式來表示:(year%4=0 & year%100!=0) | year%400=0 可以加一個“

5、!用來判別非閏年:!(year%4=0 & year%100!=0) | year%400=05.3 if語句 5.3.1 if語句的三種形式1.單分支形式 if(表達式) 語句 例如: if(xy) printf(“%d,x); 這種if語句的執行 過程見圖5-5(a)。 0 表達式 語句1圖5-5a 2雙分支形式 if表達式) 語句1else 語句2 例如: if(xy) printf“d,x; else printf“d,y; 見圖5-5b。語句1語句2真假圖5-5b表達式3多分支形式 if(表達式1)語句1 else if(表達式2) 語句2 else if(表達式3) 語句3 : :

6、 else if表達式m語句m else 語句n 流程圖如圖5-6。表達式1FT表達式3FT表達式2FT表達式4FT語句4語句5語句3語句2語句1圖5-6例如: ifnumber500 cost=0.15; else ifnumber300 cost=0.10: else ifnumber100 cost=0.075; else ifnumber50 cost=0.05; else cost=0;說明: (1)假設表達式的值為0,按“假處理,假設表達式的值為非0,按“真處理。(2)在if和else后面可以有多個操作語句,此時用花括號“將幾個語句括起來成為一個復合語句。例5.1 輸入兩個實數,按

7、代數值由小到大次序輸出這兩個數。void 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); abt運行情況如下:3.6,-3.2-3.20,3.60例5.2 輸入3個數a,b,c,要求按由小到大的順序輸出。 void 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; if(bc) t=b;b=c;c=t; printf(“%5.2f,%5.2f,%5.2f,

8、a,b,c);運行情況如下: 3.7,11.00,3.00,7.00 5.3.2 if 語句的嵌套一般形式如下: if( )if( )語句1else 語句2elseif( )語句3else 語句4應當注意if與else的配對關系。else總是與它上面的最近的if配對。 例 5.3 有一函數 -1 (x0) 編一程序,輸入一個x值,輸出y值。 有以下幾種寫法,請判斷哪些是正確的? 程序1: main() int x,y;scanf(“%d,&x);if(x0) y=-1;else if(x=0) y=0;else y=1;printf(“x=%d,y=%dn, x,y);可以用流程圖5-7來表示

9、。圖5-7輸入x開始x=0) if(x0)y=1; elsey=0; elsey=-1;見流程圖5-8。 x0 x0y=0y=1y=-1YNYN圖5-8程序3:將上述if語句改為:y=-1;if(x!=0)if(x0) y=1;else y=0;見流程圖5-9可看出是錯誤的。 x0 x0y=0y=1YNYN圖5-9y=-1 程序4:將上述if語句改為: y=0; if(x=0) if(x0) y=1; else y=-1;見流程圖5-10可看出是錯 誤的。 x0 x0y=-1y=1y=0YNYN圖5-105.3.3 條件運算符 假設有以下if語句 if(ab) max=a; else max=

10、b;可以用下面的條件運算符來處理: max=(ab)?a:b; 其中 ? 和 : 為條件運算符,有三個操作對象,稱三目運算符。條件表達式的一般形式為:表達式1?表達式2:表達式3它的執行過程見圖5-11。 圖5-11表達式1條件表達式取表達式2的值真(1)條件表達式取表達式3的值假(0) 說明: 1條件運算符優于賦值運算符。低于關系和算術運算符。 例如: int a=5,b=6; max=(ab)?a:b 等價于max=ab?a:b 執行結果是將 a 和 b 兩者中大的賦給 max。 ab?a:b+1 相當于 ab?a:(b+1) 2條件運算符的結合方向為“自右自左。 例如: ab?a:cd?

11、c:d 相當于 ab?a:(cd?c:d) 假設: a=1,b=2,c=3,d=4,那么表達式的值等于4。3條件表達式中,表達式2和表達式3不僅可以是數值表達式,還可以是賦值表達式或函數表達式。例如: ab?(a=100):(b=100) ab? printf(“%d,a):printf(“%d,b) 4表達式1,表達式2和表達式3的類型不同。 例如: xy?1:1.5 如果xy,值應為1,由于1.5是實型,比整型高,因此,將1轉換成實型值1.0。例5.4 輸入一個字符,判別它是否大寫字母,如果是,將它轉換成小寫字母;如果不是,不轉換,然后輸出最后得到的字符。 main() char ch;

12、scanf(“%c,&ch); ch=(ch=A& ch=Z)?(ch+32):ch; printf(“%c,ch); 運行結果如下: A a5.4 switch語句 一般形式:switch(表達式) case 常量表達式1: 語句1 case 常量表達式2: 語句2 . . . case 常量表達式n: 語句ndefault : 語句n+1 例如: 根據考試成績的等級打印出百分制分數段。switch(grade) caseA:printf(“85-100n);caseB:printf(“70-84n); caseC:printf(“60-69n); caseD:printf(“60n); d

13、efault:printf(“errorn); 說明:(1) switch后面括弧內的“表達式可以為任何類型。(2根據case后面的常量表達式來尋找入口。(3每一個case的常量表達式的值必須互不相同,否那么就會出現互相矛盾的現象。(4各個case和default的出現次序不影響執行結果。 (5執行完一個case后面的語句后,流程控制轉移到下一個case繼續執行?!癱ase常量表達式只是起語句標號作用,并不是在該處進行條件判斷。 應該在執行一個case分支后,使流程跳出switch結構,即終止switch語句的執行。將上面的switch結構改寫如下: switch(grade) case A:

14、printf(“85-100n);break; case B:printf(“70-84n); break; case C:printf(“60-69n); break; case D:printf(“60n); break; default:printf(“errorn); 流程圖見圖5.12所示。 輸出7084輸出6069輸出60n); break;. 5.5 程序舉例 例5.5 寫程序,判斷某一年是否閏年。 閏年的條件是符合下面二者之一: 能被4整除,但不能被100整除。 能被4整除,又能被400整除。 year40&year100 !=0|year400=0 用圖5-13來表示判別閏年

15、的算法。圖5-13 year被4整除真假year被100整除真假year被400整除真真假假leap=1leap=0leap=0leap=1leap輸出“閏年”輸出“非閏年” void main() int year,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);運行

16、情況:19891989 is not a leap year20002000 is a leap year也可以將程序中第411行改寫成以下的if語句: if(year%4!=0) leap=0;else if(year%100!=0) leap=1;else if(year%400!=0) leap=0;else leap=1;也可以用一個邏輯表達式包含所有的閏年條件,將上述if語句用下面的if語句代替:if(year%4=0 & year%100!=0)|(year%400=0) leap=1;else leap=0; 例 5.6 求ax2+bx+c=0方程的解。 求解時,應該有以下幾種可

17、能: a=0,不是二次方程。 b2-4ac=0,有兩個相等實根。 b2-4ac0,有兩個不等實根。 b2-4ac0 輸出“非二次” 方程輸出兩個相等實根:-b/2a輸出兩個實根 x1,x2輸出兩個復根: p+qi,p-qi計算復根的實部和虛部:實部 p=-b/2a圖5-14虛部 #include “math.hmain()float a,b,c,disc,x1,x2,realpart,imagpart;scanf(“%f,%f,%f,&a,&b,&c);printf(“The equation);if(fabs(a)=1e-6)printf(“is not quadratic);elsedis

18、c=b*b-4*a*c;if(fabs(disc)1e-6) x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf(“has distinct real roots:%8.4f and %8.4fn,x1,x2); else realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf(“has complex roots:n); printf(“%8.4f+%8.4fin,realpart,imagpart); printf(“%8.4f-%8.4fin,realpart,imagpart); 運行結果如下:1,2,1The equation has two equalroots:-1.00001,2,2The equation has complex roots:-1.0000+1.0000i-1.0000-1.0000i2,6,1The equation has distinct real roots:-0.1771 and -2.8229 例5.7 運輸公司對用戶計算運費。距離(s)越遠,每公里運費越低。標準如下: s250km 沒有折扣 250 =s500 %2折扣 500 =s1000 %5折扣 1000=s2000

溫馨提示

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

評論

0/150

提交評論