《C語言程序設(shè)計 》課件第4章_第1頁
《C語言程序設(shè)計 》課件第4章_第2頁
《C語言程序設(shè)計 》課件第4章_第3頁
《C語言程序設(shè)計 》課件第4章_第4頁
《C語言程序設(shè)計 》課件第4章_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第4章選擇結(jié)構(gòu)程序設(shè)計4.1if語句4.2switch語句4.3條件運算符和條件表達式4.4選擇結(jié)構(gòu)程序?qū)嵗菊滦〗Y(jié) 4.1

if語句

用if語句可以構(gòu)成選擇結(jié)構(gòu)。它根據(jù)給定的條件進行判斷,以決定執(zhí)行某個分支程序段。C語言的if語句有三種形式。

4.1.1if語句的三種形式

1.基本形式

if(表達式)語句

其語義是:如果表達式的值為真,則執(zhí)行其后的語句,否則不執(zhí)行該語句。其過程可表示為圖4-1。圖4-1

if語句執(zhí)行過程

【例4.1】

比較兩個整數(shù)的大小。

程序如下:

main()

{

inta,b,max;

printf(“\ninputtwonumbers:”);

scanf(“%d%d”,&a,&b);

max=a;

if(max<b)max=b;

printf("max=%d",max);

}

說明

本例程序中,輸入兩個數(shù)a、b。把a先賦予變量max,再用if語句判別max和b的大小,如max小于b,則把b賦予max。因此max中總是大數(shù),最后輸出max的值。

2.if-else形式

if(表達式)

語句1;

else

語句2;

其語義是:如果表達式的值為真,則執(zhí)行語句1,否則執(zhí)行語句2。

其執(zhí)行過程可表示為圖4-2。圖4-2

if-else語句執(zhí)行過程

【例4.2】

輸入兩個整數(shù),輸出其中的大數(shù)。

程序如下:

main()

{

inta,b;

printf(“inputtwonumbers:”);

scanf(“%d%d”,&a,&b);

if(a>b)

printf(“max=%d\n”,a);

else

printf("max=%d\n",b);

}

說明

改用if-else語句判別a、b的大小,若a大,則輸出a,否則輸出b。

3.if-else-if形式

前兩種形式的if語句一般都用于兩個分支的情況。當(dāng)有多個分支選擇時,可采用if-else-if語句,其一般形式為

if(表達式1)

語句1;

elseif(表達式2)

語句2;

elseif(表達式3)

語句3;

elseif(表達式m)

語句m;

else

語句n;其語義是:依次判斷表達式的值,當(dāng)出現(xiàn)某個值為真時,則執(zhí)行其對應(yīng)的語句。然后跳到整個if語句之外繼續(xù)執(zhí)行程序。如果所有的表達式均為假,則執(zhí)行語句n。然后繼續(xù)執(zhí)行后續(xù)程序。

if-else-if語句的執(zhí)行過程如圖4-3所示。圖4-3

if-else-if語句執(zhí)行過程

【例4.3】

判別鍵盤輸入字符的類別。

程序如下:

#include“stdio.h”

main()

{

charc;

printf(“inputacharacter:”);

c=getchar();

if(c<32)

printf(“Thisisacontrolcharacter\n”);

elseif(c>=‘0’&&c<=‘9’)

printf(“Thisisadigit\n”);

elseif(c>=‘A’&&c<=‘Z’)

printf(“Thisisacapitalletter\n”);

elseif(c>=‘a(chǎn)’&&c<=‘z’)

printf(“Thisisasmallletter\n”);

else

printf(“Thisisanothercharacter\n”);

}

說明

鍵盤輸入字符的類別可以根據(jù)輸入字符的ASCII碼來判別。由ASCII碼表可知,ASCII值小于32的為控制字符,在“0”和“9”之間的為數(shù)字,在“A”和“Z”之間的為大寫字母,在“a”和“z”之間的為小寫字母,其余則為其他字符。這是一個多分支選擇的問題,用if-else-if語句編程,判斷輸入字符ASCII碼所在的范圍,分別給出不同的輸出。例如輸入為“g”,輸出顯示它為小寫字符。在使用if語句時應(yīng)注意以下問題:

(1)在if語句的三種形式中,在if關(guān)鍵字之后均為表達式。該表達式通常是邏輯表達式或關(guān)系表達式,但也可以是其他表達式,如賦值表達式等,甚至可以是一個變量。

例如:

if(a=5)語句;

if(b)語句;

都是允許的。只要表達式的值為非0,即為“真”。

又如:

if(a=5)…;

其中表達式的值永遠為非0,所以其后的語句總是要執(zhí)行的。當(dāng)然這種情況在程序中不一定會出現(xiàn),但在語法上是合法的。再如,有程序段:

if(a=b)

printf(“%d”,a);

else

printf("a=0");

本語句的語義是,把b值賦予a,如為非0則輸出該值,否則輸出“a=0”字符串。這種用法在程序中是經(jīng)常出現(xiàn)的。

(2)在if語句中,條件判斷表達式必須用括號括起來,在語句之后必須加分號。

(3)在if語句的三種形式中,所有的語句應(yīng)為單個語句,如果要在滿足條件時執(zhí)行一組(多個)語句,則必須把這一組語句用?{}?括起來組成一個復(fù)合語句。但要注意的是,在?}?之后不能再加分號。

例如:

if(a>b)

{a++;

b++;}

else

{a=0;

b=10;}4.1.2

if語句的嵌套

當(dāng)if語句中的執(zhí)行語句又是if語句時,則構(gòu)成了if語句嵌套的情形。

其一般形式可表示如下:

if(表達式)

if語句;

或者為

if(表達式)

if語句;

else

if語句;在嵌套內(nèi)的if語句可能又是if-else型的,這將會出現(xiàn)多個if和多個else重疊的情況,這時要特別注意if和else的配對問題。

例如:

if(表達式1)

if(表達式2)

語句1;

else

語句2;其中的else究竟與哪一個if配對呢?能否理解為

if(表達式1)

if(表達式2)

語句1;

else

語句2;

為了避免這種二義性,C語言規(guī)定,else總是與它前面最近的if配對,因此對上述例子應(yīng)按前一種情況理解。

【例4.4】

比較兩個數(shù)的大小關(guān)系。

程序如下:

main()

{

inta,b;

printf(“pleaseinputA,B:”);

scanf(“%d%d”,&a,&b); /*輸入兩個整數(shù)a,b*/

if(a!=b)

if(a>b) printf(“A>B\n”); /*a>b*/

else printf("A<B\n"); /*a<b*/

elseprintf("A=B\n"); /*a==b*/

}

說明

本例中用了if語句的嵌套結(jié)構(gòu)。采用嵌套結(jié)構(gòu)實質(zhì)上是為了進行多分支選擇,實際上有三種選擇,即A?>?B、A?<?B或A?=?B。這種問題用if-else-if語句也可以完成,而且程序更加清晰。因此,在一般情況下較少使用if語句的嵌套結(jié)構(gòu),以使程序更便于閱讀和理解。

【例4.5】

用if-else-if語句實現(xiàn)比較兩個數(shù)的大小關(guān)系。

程序如下:

main()

{

inta,b;

printf(“pleaseinputA,B:”);

scanf(“%d%d”,&a,&b);

/*輸入兩個整數(shù)a,b*/

if(a==b)printf(“A=B\n”); /*a==b*/

elseif(a>b)printf(“A>B\n”); /*a>b*/

elseprintf("A<B\n"); /*a<b*/

}

說明

用if-else-if語句判別a、b的大小,若a大,則輸出a,否則輸出b。 4.2

switch語句

C語言還提供了另一種用于多分支選擇的switch語句,其一般形式為

switch(表達式){

case常量表達式1:語句1;

case常量表達式2:語句2;

case常量表達式n:語句n;

default:語句n+1;

}…其語義是:計算表達式的值,并逐個與其后的常量表達式值相比較,當(dāng)表達式的值與某個常量表達式的值相等時,執(zhí)行其后的語句,然后不再進行判斷,繼續(xù)執(zhí)行后面所有case后的語句,當(dāng)表達式的值與所有case后的常量表達式的值均不相等時,則執(zhí)行default后的語句。

【例4.6】輸入一個1~7的整數(shù),然后轉(zhuǎn)換成星期輸出。

程序如下:

main()

{

inta;

printf(“inputintegernumber:”);

scanf(“%d”,&a);

switch(a){

case1:printf(“Monday\n”);

case2:printf(“Tuesday\n”);

case3:printf(“Wednesday\n”);

case4:printf(“Thursday\n”);

case5:printf(“Friday\n”);

case6:printf(“Saturday\n”);

case7:printf(“Sunday\n”);

default:printf(“error\n”);

}

}

說明

本程序要求輸入一個數(shù)字,輸出一個英文單詞,但是當(dāng)輸入3之后,卻執(zhí)行了case3以及以后的所有語句,輸出了Wednesday及以后的所有單詞。這當(dāng)然是不希望的。為什么會出現(xiàn)這種情況呢?這恰恰反映了switch語句的一個特點。在switch語句中,“case常量表達式”只相當(dāng)于一個語句標(biāo)號,表達式的值和某標(biāo)號相等則轉(zhuǎn)向該標(biāo)號執(zhí)行,但不能在執(zhí)行完該標(biāo)號的語句后自動跳出整個switch語句,所以出現(xiàn)了繼續(xù)執(zhí)行所有后面case語句的情況。這是與前面介紹的if語句完全不同的,應(yīng)特別注意。為了避免上述情況,C語言還提供了一種break語句,專用于跳出switch語句,break語句只有關(guān)鍵字break,沒有參數(shù),在后面將詳細介紹。修改本例的程序,在每一case語句之后增加break語句,使每一次執(zhí)行之后均可跳出switch語句,即可避免輸出不應(yīng)有的結(jié)果。

【例4.7】對例4.6進行修改。

程序如下:

main()

{

inta;

printf(“inputintegernumber:”);

scanf(“%d”,&a);

switch(a){

case1:printf(“Monday\n”);break;

case2:printf(“Tuesday\n”);break;

case3:printf(“Wednesday\n”);break;

case4:printf(“Thursday\n”);break;

case5:printf(“Friday\n”);break;

case6:printf(“Saturday\n”);break;

case7:printf(“Sunday\n”);break;

default:printf(“error\n”);

}

}

說明

在使用switch語句時還應(yīng)注意以下幾點:

(1)在case后的各常量表達式的值不能相同,否則會出現(xiàn)錯誤。

(2)在case后,允許有多個語句,可以不用“{}”括起來。

(3)各case和default子句的先后順序可以變動,而不會影響程序執(zhí)行結(jié)果。

(4)default子句可以省略不用。

4.3條件運算符和條件表達式

如果在條件語句中只執(zhí)行單個賦值語句,則可使用條件表達式來實現(xiàn)。這樣不但使程序簡潔,也提高了運行效率。

條件運算符為“???”和“?:?”,它是一個三目運算符,即有三個參與運算的量。

由條件運算符組成條件表達式的一般形式為

表達式1?表達式2:表達式3

其求值規(guī)則為:如果表達式1的值為真,則以表達式2的值作為條件表達式的值,否則以表達式3的值作為整個條件表達式的值。條件表達式通常用于賦值語句之中。

例如條件語句:

if(a>b)max=a;

elsemax=b;

可用條件表達式寫為

max=(a>b)?a:b;

執(zhí)行該語句的語義是:如a>b為真,則把a賦予max,否則把b賦予max。使用條件表達式時,還應(yīng)注意以下幾點:

(1)條件運算符的運算優(yōu)先級低于關(guān)系運算符和算術(shù)運算符,但高于賦值符。因此

max=(a>b)?a:b

可以去掉括號而寫為

max=a>b?a:b

(2)條件運算符“???”和“?:?”是一對運算符,不能分開單獨使用。

(3)條件運算符的結(jié)合方向是自右至左。

例如:

a>b?a:c>d?c:d

應(yīng)理解為

a>b?a:(c>d?c:d)

這也就是條件表達式嵌套的情形,即其中的表達式3又是一個條件表達式。

【例4.8】

用條件表達式對例4.2重新編程,輸出兩個數(shù)中的大數(shù)。

程序如下:

main()

{

inta,b,max;

printf(“\ninputtwonumbers:”);

scanf(“%d%d”,&a,&b);

printf("max=%d",a>b?a:b);/*條件表達式求兩個數(shù)中的大數(shù)*/

} 4.4選擇結(jié)構(gòu)程序?qū)嵗?/p>

【例4.9】輸入三個整數(shù),輸出最大數(shù)和最小數(shù)。

程序如下:

main()

{

inta,b,c,max,min;

printf(“inputthreenumbers:”);

scanf(“%d%d%d”,&a,&b,&c);

if(a>b)

{max=a;min=b;}

else

{max=b;min=a;}

if(max<c)

max=c;

else

if(min>c)

min=c;

printf("max=%d\nmin=%d",max,min);

}

說明

本程序中,首先比較輸入的a、b的大小,并把大數(shù)裝入max,小數(shù)裝入min中,然后再與c比較,若max小于c,則把c賦予max,如果c小于min,則把c賦予min,因此max內(nèi)總是最大數(shù),而min內(nèi)總是最小數(shù),最后輸出max和min的值。

【例4.10】

求一元二次方程ax2+bx+c=0的根。

分析:

例3.16介紹過基本的算法,當(dāng)時只考慮實根的情況,事實上應(yīng)該有以下幾種可能:

(1)a=0,不是二次方程。

(2)b2-4ac=0,有兩個相等的實根。

(3)b2-4ac>0,有兩個不等的實根。

(4)b2-4ac<0,有兩個共軛復(fù)數(shù)根。

根據(jù)以上分析,N-S圖如圖4-4所示。圖4-4流程圖程序如下:

#include<math.h>

#defineFLOATZERO1e-6

main()

{

floata,b,c,d,disc,x1,x2,realpart,imagpart;

scanf(&a,&b,&c);

printf(“Theequation”);

if(fabs(a)<=FLOATZERO) /*a?=?0*/

printf(“isnotaquadratic”);

else

{

disc=b*b-4*a*c; /*計算disc*/

if(fabs(disc)<=FLOATZERO) /*disc?=?0*/

printf(“hastwoequalroot:%f\n”,-b/(2*a));

elseif(disc>FLOATZERO) /*disc?>?0*/

{

x1=(-b+sqrt(disc))/(2*a);

x2=(-b-sqrt(disc))/(2*a);

printf("hasdistinctrealroots:%f,%f\n",x1,x2);

}

else

/*disc<0*/

{

realpart=-b/(2*a);

imagpart=sqrt(-disc)/(2*a);

printf(“hascomplexroots:\n”);

printf(“%f+%fi\n”,realpart,imagpart);

printf(“%f-%fi\n”,realpart,imagpart);

}

}

}

說明

判斷disc是否為0,不能直接用disc==0。

disc是實數(shù),實數(shù)在計算機中的存儲和計算有微小的誤差?!?=”(等于運算符)是精確按位比較的。如果使用disc==0比較,則可能導(dǎo)致原來為0的量由于上述誤差而被判別為不等于0,導(dǎo)致程序錯誤。

可以判斷disc的絕對值是否小于一個很小的實數(shù),小于此數(shù)可以認為等于0。同理,如果需要判斷兩個浮點數(shù)相等也不能使用“==”運算符,而是采用判斷兩數(shù)之差的絕對值小于一個很小的數(shù)。

【例4.11】計算器程序。用戶輸入運算數(shù)和四則運算符,輸出計算結(jié)果。

程序如下:

main()

{

floata,b;

charc;

printf(“inputexpression: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(“inputerror\n”);

}

}

【例4.12】運輸公司對用戶計算運費。路程s越遠,每公里運費越低。具體標(biāo)準如表4-1所示。

分析:

設(shè)每公里每噸貨物的基本運費為p,貨物重量為w,距離為s,折扣為d,則總運費f的計算公式為

f?=?p*w*s*(1?-?d)程序如下:

main()

{

intc,s;

floatp,w,d,f;

scanf("%f,%f,%f",&p,&w,&s);

c=s/250; /*c為整數(shù)*/

switch(c)

{

case0:d=0;break;

case1:d=2;break;

case2:

case3:d=5;break;

case4:

case5:

case6:

case7:d=8;break;

case8:

case9:【例4.13】已知函數(shù):編寫程序,輸入x,輸出y。算法一:分析:

N-S圖如圖4-5所示。圖4-5N-S圖1程序如下:

main()

{

intx,y;

scanf(&x);

if(x<0)y=-1;

if(x=0)y=0;

if(x>0)y=1;

printf(x,y);

}

算法二:

分析:

N-S圖如圖4-6所示。圖4-6N-S圖2程序如下:

main()

{

intx,y;

scanf("%d",&x);

if(x<0)y=-1;

elseif(x=0)y=0;

elsey=1;

printf("%d%d",x,y);

}

【例4.14】

輸入某學(xué)生的成績,經(jīng)處理后給出學(xué)生的等級,等級分類如下:

90分以上(包括90): A

80至90分(包括80): B

70至80分(包括70): C

60至70分(包括60): D

60分以下: E

算法一:(用if嵌套)

分析:

由題意知,如果某學(xué)生成績在90分以上,等級為A;否則,如果成績大于80分,等級為B;否則,如果成績大于70分,等級為C;否則,如果成績大于60分,等級為D;否則,如果成績小于60分,等級為E。但當(dāng)我們輸入成績時也可能輸錯,出現(xiàn)小于0或大于100,這時也要做處理,輸出出錯信息。因此,在用if嵌套前,應(yīng)先判斷輸入的成績是否在0~100之間。程序如下:

#include“stdio.h”

main()

{

intscore;

chargrade;

printf(“\npleaseinputastudentscore:”);

scanf(“%f”,&score);

if(score>100||score<0)

printf(“\ninputerror!”);

else

{

if(score>=90)

grade=‘A’;

else

{

if(score>=80)

grade=‘B’;

else

{if(score>=70)

grade=‘C’;

else

{if(score>=60)

grade=‘D’;

elseg

溫馨提示

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

評論

0/150

提交評論