資源簡介 (共41張PPT)《C程序設計》第四章 分支程序設計——最常用的C程序設計關系運算符:在程序中經常需要比較兩個量的大小關系,以決定程序下一步的工作。比較兩個量的運算符稱為關系運算符。復習運算符的優先次序……關系運算符和表達式在C語言中有以下關系運算符:1) < 小于2) <= 小于或等于3) > 大于4) >= 大于或等于5) == 等于6) != 不等于關系運算符都是雙目運算符,其結合性均為左結合。關系運算符的優先級低于算術運算符,高于賦值運算符。在六個關系運算符中,前四個<,<=,>,>=的優先級相同,高于==和!=,==和!=的優先級相同。關系運算符及其優先次序關系表達式的一般形式為:表達式 關系運算符 表達式例如:a+b > c-dx > 3/2‘a’+1 < c-i-5*j == k+1都是合法的關系表達式。由于表達式也可以又是關系表達式。因此也允許出現嵌套的情況。例如:a > (b>c)a != (c==d)等。關系表達式關系表達式的值是真”和“假”,用“1”和“0”表示。如:5 > 0的值為“真”,即為1。(a=3) > (b=5)由于3 > 5不成立,故其值為假,即為0。【例5.1】void main(){char c='k';int i=1,j=2,k=3;float x=3e+5,y=0.85;printf("%d,%d\n",’a’+5=k+1);printf("%d,%d\n",1printf("%d,%d\n",i+j+k==-2*j,k==j==i+5);}在本例中求出了各種關系運算符的值。字符變量是以它對應的ASCII碼參與運算的。對于含多個關系運算符的表達式,如k==j==i+5,根據運算符的左結合性,先計算k==j,該式不成立,其值為0,再計算0==i+5,也不成立,故表達式值為0。關系表達式邏輯運算符極其優先次序C語言中提供了三種邏輯運算符:1) && 與運算2) || 或運算3) ! 非運算與運算符&&和或運算符||均為雙目運算符。具有左結合性。非運算符!為單目運算符,具有右結合性。邏輯運算符和其它運算符優先級的關系可表示如下:!(非)→&&(與)→||(或)“&&”和“||”低于關系運算符,“!”高于算術運算符。邏輯運算符和表達式按照運算符的優先順序可以得出:a>b && c>d 等價于 (a>b) && (c>d)!b==c || da+b>c && x+yc) && ((x+y)邏輯運算符極其優先次序邏輯運算的值也為“真”和“假”兩種,用“1”和“0 ”來表示。其求值規則如下:1. 與運算 &&:參與運算的兩個量都為真時,結果才為真,否則為假。例如:5>0 && 4>2由于5>0為真,4>2也為真,相與的結果也為真。2. 或運算||:參與運算的兩個量只要有一個為真,結果就為真。兩個量都為假時,結果為假。例如:5>0 || 5>8由于5>0為真,相或的結果也就為真。邏輯運算的值3. 非運算!:參與運算量為真時,結果為假;參與運算量為假時,結果為真。例如:!(5>0)的結果為假。雖然C編譯在給出邏輯運算值時,以“1”代表“真”,“0 ”代表“假”。但反過來在判斷一個量是為“真”還是為“假”時,以“0”代表“假”,以非“0”的數值作為“真”。例如:由于5和3均為非“0”因此5&&3的值為“真”,即為1。又如:5||0的值為“真”,即為1。邏輯運算的值邏輯表達式的一般形式為:表達式 邏輯運算符 表達式其中的表達式可以又是邏輯表達式,從而組成了嵌套的情形。例如:(a&&b) && c根據邏輯運算符的左結合性,上式也可寫為:a && b && c邏輯表達式的值是式中各種邏輯運算的最后值,以“1”和“0”分別代表“真”和“假”。邏輯表達式【例5.2】void main(){char c='k';int i=1,j=2,k=3;float x=3e+5,y=0.85;printf("%d,%d\n",!x*!y,!!!x);printf("%d,%d\n",x||i&&j-3,iprintf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);}邏輯表達式用if語句可以構成分支結構。它根據給定的條件進行判斷,以決定執行某個分支程序段。C語言的if語句有三種基本形式。if語句的三種形式……if語句第一種形式為基本形式:if(表達式) 語句其語義是:如果表達式的值為真,則執行其后的語句,否則不執行該語句。其過程可表示為下圖。if語句的三種形式【例5.3】void main(){int a,b,max;printf("\n input two numbers: ");scanf("%d%d",&a,&b);max=a;if (maxprintf("max=%d",max);}if語句的三種形式第二種形式為: if-elseif(表達式)語句1;else語句2;if語句的三種形式【例5.4】void main(){int a, b;printf("input two numbers: ");scanf("%d%d",&a,&b);if( a>b )printf("max=%d\n",a);elseprintf("max=%d\n",b);}if語句的三種形式第三種形式為if-else-if形式前二種形式的if語句一般都用于兩個分支的情況。當有多個分支選擇時,可采用if-else-if語句,其一般形式為:if語句的三種形式【例5.5】#include"stdio.h"void main(){char c;printf("input a character: ");c=getchar();if(c<32) printf("This is a control character\n");else if(c>='0'&&c<='9' printf("This is a digit\n");else if(c>='A'&&c<='Z') printf("This is a capital letter\n");else if(c>='a'&&c<='z') printf("This is a small letter\n");else printf("This is an other character\n");}if語句的三種形式1) 在三種形式的if語句中,在if關鍵字之后均為表達式。該表達式通常是邏輯表達式或關系表達式,但也可以是其它表達式,如賦值表達式等,甚至也可以是一個變量。例如:if(a=5) 語句;if(b) 語句;都是允許的。只要表達式的值為非0,即為“真”。在使用if語句中還應注意以下問題:比較如下程序段:void main(){if( a = b ){printf("%d\n", a);}}void main(){if( a == b ){printf("%d\n", a);}}在使用if語句中還應注意以下問題:2) 在if語句中,條件判斷表達式必須用括號括起來,在語句之后必須加分號。3) 在if語句的三種形式中,所有的語句應為單個語句,如果要想在滿足條件時執行一組(多個)語句,則必須把這一組語句用{}括起來組成一個復合語句。但要注意的是在}之后不能再加分號。例如:if(a>b){a++;b++;}else{a=0;b=10;}在使用if語句中還應注意以下問題:補充例題:寫一個程序完成下列功能:1 、輸入一個分數score2 、score<60 輸出 E3 、60 <=score <70 輸出 D4 、75 <=score <80 輸出 C5 、80 <=score <90 輸出 B5 、90 <=score 輸出 Aif語句的三種形式補充例題2:輸入三個數a,b,c,要求按由小到大的順序輸出。提示:If a>b 將a和b對換If a>c 將a和c對換If b>c 將b和c對換if語句的三種形式當if語句中的執行語句又是if語句時,則構成了if 語句嵌套的情形。其一般形式可表示如下:if(表達式)if語句;或者為if(表達式)if語句;elseif語句;if( ){if( )……;}if()if() 語句1else 語句2elseif() 語句3else 語句4if語句的嵌套在嵌套內的if語句可能又是if-else型的,這將會出現多個if和多個else重疊的情況,這時要特別注意if和else的配對問題。例如:其中的else究竟是與哪一個if配對呢 if語句的嵌套為了避免這種二義性,C語言規定,else 總是與它前面最近的if配對,因此對上述例子應按前一種情況理解。if語句的嵌套比較以下兩題目:哪一個是運用嵌套方法 【例5.6】void main(){int a,b;printf("please input A,B: ");scanf("%d%d",&a,&b);if(a!=b)if(a>b) printf("A>B\n");else printf("Aelse printf("A=B\n");}if語句的嵌套【例5.7】void main(){int a,b;printf("please input A,B: ");scanf("%d%d",&a,&b);if(a==b) printf("A=B\n");else if(a>b) printf("A>B\n");else printf("A}采用嵌套結構實質上是為了進行多分支選擇,實際上有三種選擇即A>B、Aif語句的嵌套條件運算符為“ 和:”,它是一個三目運算符,即有三個參與運算的量。由條件運算符組成條件表達式的一般形式為:表達式1 表達式2: 表達式3其求值規則為:如果表達式1的值為真,則以表達式2 的值作為條件表達式的值,否則以表達式2的值作為整個條件表達式的值。條件運算符和條件表達式條件表達式通常用于賦值語句之中。例如條件語句:if(a>b) max=a;else max=b;可用條件表達式寫為max=(a>b) a:b;執行該語句的語義是:如a>b為真,則把a賦予max,否則把b 賦予max。條件運算符和條件表達式使用條件表達式時,還應注意以下幾點:1) 條件運算符的運算優先級低于關系運算符和算術運算符,但高于賦值符。因此max=(a>b) a:b可以去掉括號而寫為max=a>b a:b2) 條件運算符 和:是一對運算符,不能分開單獨使用。3) 條件運算符的結合方向是自右至左。例如:a>b a:c>d c:d應理解為a>b a:(c>d c:d)這也就是條件表達式嵌套的情形,即其中的表達式3又是一個條件表達式。條件運算符和條件表達式【例5.8】void main(){int a,b,max;printf("\n input two numbers: ");scanf("%d%d",&a,&b);printf("max=%d",a>b a:b);}條件運算符和條件表達式補充:輸入一個字符,判別它是否大寫字母,如果是,將它轉換成小寫字母;如果不是,不轉換。然后輸出最后得到的字符。#include void main ( ) {char ch; scanf("%c", &ch); ch=(ch>='A'&& ch<='Z') (ch+32) : ch; printf("%c\n", ch); }條件運算符和條件表達式C語言還提供了另一種用于多分支選擇的switch語句, 其一般形式為:其語義是:計算表達式的值。并逐個與其后的常量表達式值相比較,當表達式的值與某個常量表達式的值相等時,即執行其后的語句,然后不再進行判斷,繼續執行后面所有case后的語句。如表達式的值與所有case后的常量表達式均不相同時,則執行default后的語句。switch語句【例4.9】void main(){int a;printf("input integer number: ");scanf("%d",&a);switch (a){case 1:printf("Monday\n");case 2:printf("Tuesday\n");case 3:printf("Wednesday\n");case 4:printf("Thursday\n");case 5:printf("Friday\n");case 6:printf("Saturday\n");case 7:printf("Sunday\n");default:printf("error\n");}}為了避免上述情況,C語言還提供了一種break語句,專用于跳出switch語句,break 語句只有關鍵字break,沒有參數。請看后邊例子……switch語句【例4.10】void main(){int a;printf("input integer number: ");scanf("%d", &a);switch (a){case 1:printf("Monday\n"); break;case 2:printf("Tuesday\n"); break;case 3:printf("Wednesday\n"); break;case 4:printf("Thursday\n"); break;case 5:printf("Friday\n"); break;case 6:printf("Saturday\n"); break;case 7:printf("Sunday\n"); break;default:printf("error\n");}}switch語句在使用switch語句時還應注意以下幾點:1) 在case后的各常量表達式的值不能相同,否則會出現錯誤。2) 在case后,允許有多個語句,可以不用{}括起來。3) 各case和default子句的先后順序可以變動,而不會影響程序執行結果。4) default子句可以省略不用。switch語句【例4.11】輸入三個整數,輸出最大數和最小數。答案與解析:void main(){int a,b,c,max,min;printf("input three numbers: ");scanf("%d%d%d",&a,&b,&c);if(a>b){max=a;min=b;}else{max=b;min=a;}if(maxmax=c;elseif(min>c)min=c;printf("max=%d\nmin=%d",max,min);}switch語句【例4.12】計算器程序。用戶輸入運算數和四則運算符,輸出計算結果。答案與解析:void main(){float a,b;char c;printf("input expression: a+(-,*,/)b \n");scanf("%f%c%f",&a,&c,&b);switch(c){case '+': printf("%f\n",a+b);break;case '-': printf("%f\n",a-b);break;case '*': printf("%f\n",a*b);break;case '/': printf("%f\n",a/b);break;default: printf("input error\n");}}switch語句作業:關于公歷閏年是這樣規定的:地球繞太陽公轉一周叫做一回歸年,一回歸年長365日5時48分46秒。因此,公歷規定有平年和閏年,平年一年有365日,比回歸年短0.2422日,四年共短0.9688日,故每四年增加一日,這一年有366日,就是閏年。但四年增加一日比四個回歸年又多0.0312日,400年后將多3.12日,故在400年中少設3個閏年,也就是在400年中只設97個閏年,這樣公歷年的平均長度與回歸年就相近似了。由此規定:年份是整百數的必須是400的倍數才是閏年,例如1900年、2100年就不是閏年。輸入一個年份,并判斷是否為閏年?switch語句路程(s)越遠,每公里運費越低。標準如下:s<250km 沒有折扣250≤s<500 2%折扣500≤s<1000 5%折扣1000≤s<2000 8%折扣2000≤s<3000 10%折扣3000≤s 15%折扣設每公里每噸貨物的基本運費為p,貨物重為w,距離為s,折扣為d,則總運費f的計算公式為:f=p*w*s*(1-d)運輸公司對用戶計算運費。作業2:switch語句 展開更多...... 收起↑ 資源預覽 縮略圖、資源來源于二一教育資源庫