第5章選擇分支結(jié)構(gòu)-C語言程序設(shè)計(譚浩強第三版)_第1頁
第5章選擇分支結(jié)構(gòu)-C語言程序設(shè)計(譚浩強第三版)_第2頁
第5章選擇分支結(jié)構(gòu)-C語言程序設(shè)計(譚浩強第三版)_第3頁
第5章選擇分支結(jié)構(gòu)-C語言程序設(shè)計(譚浩強第三版)_第4頁
第5章選擇分支結(jié)構(gòu)-C語言程序設(shè)計(譚浩強第三版)_第5頁
已閱讀5頁,還剩45頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章選擇結(jié)構(gòu)程序設(shè)計

關(guān)系運算符和關(guān)系表達(dá)式邏輯運算符和邏輯表達(dá)式

if語句

switch語句程序舉例引例:1/x當(dāng)x≠0時

10000當(dāng)x=0時y=

選擇結(jié)構(gòu)是3種基本結(jié)構(gòu)之一,經(jīng)常牽涉到:根據(jù)所指定的條件是否相同,從兩組(或多組)操作中選擇其一。

要考慮兩個方面的問題:1、C語言中如何表示條件?一般用關(guān)系表達(dá)式或邏輯表達(dá)式2、C語言中實現(xiàn)選擇結(jié)構(gòu)用什么語句?用if語句或switch語句。if(x!=0)y=1/x;elsey=10000;此處:用if語句來表示選擇結(jié)構(gòu)用一個關(guān)系表達(dá)式x!=0來表示條件5.1關(guān)系運算符和表達(dá)式1、關(guān)系運算:實質(zhì)是兩個量“比較運算”。2、關(guān)系運算符:種類:6種<<===>=>!=結(jié)合方向:自左向右優(yōu)先級別:前4種優(yōu)先級相同,高于后2種由高到低:算術(shù)運算-關(guān)系運算-賦值運算<<=>>===!=優(yōu)先級6(高)優(yōu)先級7(低)例c>a+bc>(a+b)a>b!=c(a>b)!=ca==b<ca==(b<c)a=b>ca=(b>c)算術(shù)運算符賦值運算符關(guān)系運算符高低//表達(dá)式值1//表達(dá)式值1//表達(dá)式值0//a>b值為1,所以d=1//a>b為1,a>b>c為0,所以f=0例inta=3,b=2,c=1,d,f;

a>b(a>b)==cb+c<ad=a>bf=a>b>c3、關(guān)系表達(dá)式:用關(guān)系運算符將兩個表達(dá)式連接起來式子。4、關(guān)系表達(dá)式的值:是邏輯值“真”或“假”,用1和0表示1

––

結(jié)果為真

(關(guān)系成立)0

––

結(jié)果為假

(關(guān)系不成立)注意:其中“==”表示相等,而“=”表示賦值(1)關(guān)系運算符左右兩邊類型不一致,自動進(jìn)行類型轉(zhuǎn)換,轉(zhuǎn)換成兩邊的類型相同,然后進(jìn)行比較。

例如:若a=0,b=0.5,轉(zhuǎn)換成a=0.0,則a<=b的值為1

(2)應(yīng)避免對實數(shù)作相等或不等的判斷,而只能使用“<”和“>”,原因在于舍入誤差可能造成兩個邏輯上應(yīng)該相等的數(shù)不相等。

例如:如果x、y均為實數(shù),要避免使用x==y

應(yīng)使用fabs(x-y)<1e-6(3)關(guān)系運算符“>=、<=、==、!=”在書寫時,不要用空格將其分開,否則會產(chǎn)生語法錯誤。5、關(guān)系運算注意的問題5.2邏輯運算符和邏輯表達(dá)式有時,只用一個簡單的關(guān)系表達(dá)式不能完整地表達(dá)一個條件,如:

y=其中的條件需要用邏輯表達(dá)式來表達(dá):

x!=0&&a!=0&&就是一種邏輯運算符。1/x+1/a當(dāng)x≠0,a≠0時

10000其它

1、邏輯運算符(1)種類:三種邏輯運算符

&&邏輯與(相當(dāng)日常生活中:而且,并且,只在兩

條件同時成立時為“真”)

||邏輯或(相當(dāng)日常生活中:或,兩個條件只要有

一個成立時即為“真”)

!邏輯非(條件為真,運算后為假,條件為假,運

算后為真)

“&&”,“||”是雙目運算符,“!”是單目運算符。

例:a&&b若a,b為真,則a&&b為真。

a||b若a,b之一為真,則a||b為真。

!a若a為真,則!a為假。5.2邏輯運算符和邏輯表達(dá)式C語言中,運算量:0表示“假”,非0表示“真”,

運算結(jié)果:0表示“假”,1表示“真”,ab!a!ba&&ba||b真假真假假假真真真假假假假假真真假假真真真假真真(2)邏輯運算真值表!(2)&&(11)||(12)高低(3)優(yōu)先級:(4)結(jié)合方向:!:從右向左&&:從左向右||:從左向右?。ǚ牵┧阈g(shù)運算符關(guān)系運算符&&||賦值運算符=高低如:x=!a>b&&b>c+3x=(((!a)>b)&&(b>(c+3)))2、邏輯表達(dá)式和邏輯表達(dá)式的值(1)邏輯表達(dá)式:用邏輯運算符將關(guān)系表達(dá)式、邏輯量連接起來的式子。

例如:

!a&&b||x>y&&c(2)邏輯表達(dá)式的值:1或0,表示邏輯值“真”或“假”例a=4;b=5;!aa&&ba||b!a||b4&&0||25>3&&8<4-!0‘c’&&‘d’值為1值為0值為1

值為1值為1值為1(5>3)&&(8<(4-(!0)))值為0在邏輯運算中,非0值參加邏輯運算時被看成1處理.(3)短路現(xiàn)象:一個邏輯表達(dá)式中的邏輯運算符并不一定全部執(zhí)行.例如:a=1,b=2,c=3,d=4,m=1,n=1(m=a>b)&&(n=c>d)

判斷m,n的值:結(jié)果m=0,n=1,表達(dá)式為0例如:a&&b&&c當(dāng)a=0(假)時,

b,c不需判斷。

當(dāng)a=1,b=0,c不需判斷。例如:a||b||c當(dāng)a=1時,b,c均不必判別。1&&0邏輯值為08<3邏輯值為04-1值為3!0邏輯值為15>3邏輯值為1(5>3)&&(8<(4-(!0)))值為0滿足下列2個條件中之一的為閏年:

年號能被4整除,但不能被100整除。

年號能被400整除。例寫出判斷年號是否為閏年的邏輯表達(dá)式用變量year表示年號,則邏輯表達(dá)式:(year%4==0&&year%100!=0)||year%400==0

值為1,則year為閏年;否則為非閏年。!((year%4==0&&year%100!=0)||(year%400==0))執(zhí)行過程:當(dāng)表達(dá)式值非0時,執(zhí)行語句,

否則,不執(zhí)行語句。例如:

if(x>y)printf("%d",x);形式1:

if(表達(dá)式)

語句5.3if語句(三種形式)表達(dá)式語句非0=01.if語句的三種基本形式表達(dá)式的值:1

––

結(jié)果為真

(條件成立)0

––

結(jié)果為假

(條件不成立)例2輸入兩個實數(shù),按其值由小到大次序輸出這兩個數(shù)。表達(dá)式語句非0=0

main(){floata,b,t;scanf("%f,%f",&a,&b);if(a>b){t=a;a=b;b=t;}printf("%5.2f,%5.2f",a,b);}形式1:

if(表達(dá)式)

語句1.if語句的三種基本形式例3輸入三個數(shù),按從小到大的順序輸出。表達(dá)式語句非0=0main()

{floata,b,c,t;

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

if(a>b)

{t=a;a=b;b=t;}

if(a>c)

{t=a;a=c;c=t;}

if(b>c)

{t=b;b=c;c=t;}

printf("%5.2f,%5.2f,%5.2f",a,b,c);

}形式1:

if(表達(dá)式)

語句1.if語句的三種基本形式例如:

if(x>y) printf("%d",x); elseprintf("%d",y);表達(dá)式語句1語句2非0=0執(zhí)行過程:

當(dāng)表達(dá)式值為非0,

執(zhí)行語句1;當(dāng)表達(dá)式值為0,

執(zhí)行語句2。形式2:

if(表達(dá)式)

語句1else語句21.if語句的三種基本形式表達(dá)式語句1語句2非0=0例4輸入一個數(shù),判斷它是否能被3整除。若能,則打印“YES”,否則,打印“NO”。形式2:

if(表達(dá)式)

語句1else語句2

main(){intn;printf(“inputn:”);scanf(“%d”,&n);

if(n%3==0)printf(“YES\n”);elseprintf(“NO\n”);}1.if語句的三種基本形式執(zhí)行過程:從上向下逐一對if后面的表達(dá)式進(jìn)行檢測。當(dāng)某一個表達(dá)式的值為非0時,就執(zhí)行與此有關(guān)的子句中的語句,其余部分就被越過去。如果所有表達(dá)式的值都是0,則執(zhí)行最后的else子句;如果沒有最后的那個else子句,那么,將不進(jìn)行任何操作。形式3:if(表達(dá)式1)

語句1elseif(表達(dá)式2)

語句2elseif(表達(dá)式3)

語句3

……elseif(表達(dá)式n)語句nelse語句n+11.if語句的三種基本形式0表達(dá)式1

表達(dá)式2

表達(dá)式n語句n+100語句n

語句2

語句1

非0

非0

非0…

形式3:if(表達(dá)式1)

語句1elseif(表達(dá)式2)

語句2elseif(表達(dá)式3)

語句3

……elseif(表達(dá)式n)語句nelse語句n+1例如: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;0表達(dá)式1

表達(dá)式2

表達(dá)式n語句n+100語句n

語句2

語句1

非0

非0

非0…

1.if語句的三種基本形式形式3:if(表達(dá)式1)

語句1elseif(表達(dá)式2)

語句2elseif(表達(dá)式3)

語句3

……elseif(表達(dá)式n)語句nelse語句n+1例5:輸入一個學(xué)生成績,當(dāng)成績≥90時,輸出

verygood,當(dāng)80≤成績<90時,輸出

good,當(dāng)60≤成績<80時,輸出pass,當(dāng)成績<60時,輸出fail。main(){intscore;printf("Inputscore:");scanf("%d",&score);if(score>=90)printf(“verygood");elseif(score>=80)printf(“good");elseif(score>=60)printf(“pass");elseprintf(“fail");}1.if語句的三種基本形式0表達(dá)式1

表達(dá)式2

表達(dá)式n語句n+100語句n

語句2

語句1

非0

非0

非0…

例6:輸入一個字符,請判斷是字母、數(shù)字還是特殊字符。#include<stdio.h>main(){charch;

printf("Pleaseinputacharacter:\n");

ch=getchar();

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))printf("\n%cisaletter\n",ch);

elseif(ch>='0'&&ch<='9')printf("\n%cisanumber!\n",ch);

elseprintf("\n%cisaspecialcharacter!\n",ch);

}形式3:if(表達(dá)式1)

語句1elseif(表達(dá)式2)

語句2elseif(表達(dá)式3)

語句3

……elseif(表達(dá)式n)語句nelse語句n+1例如:if(a&&b)prinf("o.k");if(a>b)…if(3)…if('a‘+88)…

1.表達(dá)式可以是邏輯表達(dá)式、關(guān)系表達(dá)式、算術(shù)表達(dá)式。

2.語句必須以分號結(jié)束。

3.若語句不止一條,則必須用{}括起來。在{}外不加分號。注意的問題5.3if語句2、if語句的嵌套:

在if語句中,又包含一個或多個if語句。if(表達(dá)式1)if(表達(dá)式2)語句1else語句2elseif(表達(dá)式3)語句3else語句4內(nèi)嵌if內(nèi)嵌ifif(表達(dá)式1)if(表達(dá)式2)

語句1else

語句2內(nèi)嵌ifif(表達(dá)式1)

{if(表達(dá)式2)

語句1}else

語句3

內(nèi)嵌ifif(表達(dá)式1)

語句1elseif(表達(dá)式3)

語句3else

語句4內(nèi)嵌if5.3if語句(三種形式)2、if語句的嵌套if(表達(dá)式1)

{if(表達(dá)式2)

語句1}else

語句3

內(nèi)嵌ifif~else配對原則:缺省{}時,else總是和它上面離它最近的未配對的if配對。if(……)if(……)if(……)else…...else…...else…...if(表達(dá)式1)if(表達(dá)式2)

語句1else

語句3

內(nèi)嵌if如果沒有{}時的配對2、if語句的嵌套if~else配對原則修改:

if(a==b){if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);實現(xiàn)if~else正確配對方法:必要時,加{}例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);例7有一函數(shù):y=–1(x<0)0(x=0)1(x>0)編一程序,輸入一個x值,輸出y值。有以下幾種寫法,請判斷哪些是正確的?2、if語句的嵌套程序2:將程序1的if語句改為:

main()

{intx,y;

scanf("%d",&x);

if(x>=0)

if(x>0)

y=1;

else

y=0;

else

y=-1;

printf("x=%d,y=%d\n",x,y);

}程序1:

main()

{intx,y;

scanf("%d",&x);

if(x<0)

y=–1;

elseif(x==0)

y=0;

else

y=1;

printf("x=%d,y=%d\n",x,y);

}2、if語句的嵌套程序4:將程序1的if語句改為main(){intx,y;scanf("%d",&x);

y=0;if(x>=0)if(x>0)y=1;elsey=-1;printf("x=%d,y=%d\n",x,y);}

程序3:將程序1的if語句改為main(){intx,y;scanf("%d",&x);

y=-1;if(x!=0)if(x>0)y=1;elsey=0;printf("x=%d,y=%d\n",x,y);}2、if語句的嵌套y=0(x<0)–1(x=0)1(x>0)1.

程序1和程序2是正確的。

它們代表的函數(shù)為:2.

程序3和程序4是錯誤的。

它們代表的函數(shù)為:y=0(x<0)–1(x=0)1(x>0)y=–1(x<0)0(x=0)1(x>0)結(jié)論:5.3if語句

C語言提供了一個簡單的條件賦值語句或條件表達(dá)式。問題:

當(dāng)判斷條件不論是“真”是“假”,均給同一變量賦值時簡化條件語句

運算符書寫方式:?:

屬三目運算符。3、條件運算符5.3if語句執(zhí)行過程:

先求解表達(dá)式1,若非0(真),則值為表達(dá)式2的值,否則,為表達(dá)式3的值。一般形式:表達(dá)式1

?

表達(dá)式2

:表達(dá)式3例如:max=a>b?a:b;當(dāng)a>b,maxa;

否則,maxb3、條件運算符表達(dá)式1取表達(dá)式2值取表達(dá)式3值非0=05.3if語句注意:條件運算符優(yōu)先于賦值運算符。

例如:max=(a>b?a:b)可去掉()條件運算符低于關(guān)系運算符和算術(shù)運算符。

例如:max=a>b?a:b+1max=a>b?a:(b+1)

而不是

max=(a>b?a:b)+1條件運算符結(jié)合性為從右至左。

例如:a>b?a:c>d?c:d

相當(dāng)于

a>b?a:(c>d?c:d)條件表達(dá)式不能取代一般的if語句,只有當(dāng)if的兩個分支為給同一變量賦值時才可替代if.

例如:求y=a+|b|

printf(“y=%d\n”,b>0?a+b:a-b);表達(dá)式1、表達(dá)式2、表達(dá)式3的類型可以不同。

例如:x>y?1:1.53、條件運算符5.3if語句3、條件運算符例8輸入一個字符,判別它是否大寫字母。

如果是,將它轉(zhuǎn)換成小寫字母;

如果不是,不轉(zhuǎn)換。

然后輸出最后得到的字符。main()

{charch;

scanf("%c",&ch);

ch=(ch>='A'&&ch<='Z'?(ch+32):ch;

printf("%c",ch)

}5.3if語句switch語句是多分支選擇語句,也叫開關(guān)語句一般形式:

switch(表達(dá)式){case常量表達(dá)式1:語句1[break;]case常量表達(dá)式2:語句2[break;]…case常量表達(dá)式n:語句n[break;]default:語句n+1}

5.4switch語句switch表達(dá)式語句1語句2語句n語句n+1…式1式2式ndefaultcase

執(zhí)行過程:當(dāng)表達(dá)式的值與某一個case后面的常量表達(dá)式的值相等時,就執(zhí)行此case后面的語句。若所有的case中的常量表達(dá)式的值都沒有與表達(dá)式的值匹配,則執(zhí)行default后面的語句。

例9根據(jù)成績等級,打印出成績范圍。5.4switch語句main(){chargrade;printf("Enteryourgrade\n");scanf("%c",&grade);

switch(grade){case'A':printf(“90~100\n");break;case'B':printf(“80~89\n");break;case'C':printf(“70~79\n");break;case'D':printf("60~69\n");break;case‘E':printf("<60\n");break;default:printf("error\n");}}沒有break將是錯誤的。例如輸入B,打印出:80~8970~7960~69<60error注意:case常量表達(dá)式只起語句標(biāo)號作用;必須用break語句終止多個case連續(xù)執(zhí)行,否則只要有一個case滿足后,以下的語句全部無條件執(zhí)行。除非遇到“}”或break語句來終止switch語句的執(zhí)行。

例10根據(jù)成績范圍,打印出成績等級。5.4switch語句main(){intscore,num;chargrade;scanf("%d",&score);num=score/10;

switch(num)

{case10:case9:grade='A';break;case8:grade='B‘;break;case7:grade='C';break;case6:grade='D';break;default:grade='E';}

printf("%d%c",score,grade);}鑒于上述原因,2個或多個case可以共用一組執(zhí)行語句1.表達(dá)式的類型和常量表達(dá)式的類型必須一致;switch后面的表達(dá)式一般情況下是整型或字符型。2.每一個case的常量表達(dá)式的值必須互不相同。3.多個case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。4.case常量表達(dá)式只起語句標(biāo)號作用;

必須用break語句終止多個case連續(xù)執(zhí)行,

否則只要有一個case滿足后,以下的語句全部無條件執(zhí)行。

說明:5.4switch語句

main(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;

case1:b++;break;

}case2:a++;b++;break;

case3:a++;b++;

}printf("\na=%d,b=%d",a,b);

}

switch的嵌套5.4switch語句①能夠被4整除,但不能被100整除的年份;②能夠被400整除的年份。

5.5程序舉例例寫程序,判斷某一年是否閏年。閏年的算法。用一個標(biāo)志leap代表閏年與否。leap=1,代表閏年,leap=0,代表非閏年。#include<stdio.h>

voidmain()

{

intyear,leap;

scanf("%d",&year);

if(year%4==0)

{if(year%100==0)

{if(year%400==0)leap=1;

elseleap=0;

}

elseleap=1;

}

elseleap=0;

if(leap)printf("%disaleapyear.\n",year);

elseprintf("%disnotaleapyear.\n",year);

}if(year%4?。剑埃欤澹幔穑剑?;elseif(year%100?。剑埃欤澹幔穑剑?;elseif(year%400?。剑埃欤澹幔穑剑埃唬澹欤螅澹欤澹幔穑剑?;

運行情況:1989↙1989isnotaleapyear.2000↙2000isaleapyear.

if((year%4==0&&year%100!=0)||year%400==0)

leap=1;elseleap=0;例求ax2+bx+c=0方程的解?;镜乃惴ǎ孩伲幔剑埃皇嵌畏匠?。②b2-4ac=0,有兩個相等實根。③b2

-4ac>0,有兩個不等實根。④b2

-4ac<0,有兩個共軛復(fù)根。#include<stdio.h>

#include<math.h>

voidmain()

{

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

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

printf(“theequation”);

if(fabs(a)<=1e-6)

printf(“isnotaquadratic\\n”);

else

{disc=b*b-4*a*c;

if(fabs(disc)<=1e-6)

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

else

if(disc>1e-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);

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

printf(″hascomplexroots∶\n″);

printf(″%8.4f+%8.4fi\n″,realpart,imagpart);

printf(″%8.4f-%8.4fi\n″,realpart,imagpart);

}

}

}

例運輸公司對用戶計算運費。路程(s)越遠(yuǎn),每公里運費越低。標(biāo)準(zhǔn)如下:

s<250km沒有折扣250≤s<5002%折扣500≤s<10005%折扣1000≤s<20008%折扣2000≤s<300010%折扣3000≤s15%折扣設(shè)每公里每噸貨物的基本運費為p,貨物重為w,距離為s,折扣為d,則總運費f的計算公式為:f=p*w*s*(1-d)

分析:用ifelse分支方法,可以完成,但區(qū)間太多。用switch,尋找合適的表達(dá)式以及對應(yīng)的常量

分析折扣變化的規(guī)律性:折扣的“變化點”都是250的倍數(shù),在橫軸上加一種坐標(biāo)c,c的值為s/250。c代表250的倍數(shù)。c<1,

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論