版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第四章選擇結(jié)構(gòu)4.1關(guān)系運(yùn)算符及其表達(dá)式4.2邏輯運(yùn)算符及其表達(dá)式4.3if語句4.4switch語句4.5程序舉例4.6C語言趣味程序?qū)嵗?4.7本章小結(jié)關(guān)鍵字:if語句if語句嵌套switch語句
選擇結(jié)構(gòu)是一種應(yīng)用非常廣泛的程序控制結(jié)構(gòu),是計(jì)算機(jī)科學(xué)用來描述自然界和社會(huì)生活中分支現(xiàn)象的手段。其特點(diǎn)是:根據(jù)所給定選擇條件為真(即分支條件成立)與否,決定從各實(shí)際可能的不同操作分支中執(zhí)行某一分支的相應(yīng)操作,并且任何情況下恒有“無論分支多寡,必?fù)衿湟唬豢v然分支眾多,僅選其一”的特性。注意:在C語言中,“等于”關(guān)系運(yùn)算符是雙等號(hào)“==”,而不是單等號(hào)“=”(賦值運(yùn)算符)。4.1關(guān)系運(yùn)算符及其表達(dá)式
關(guān)系運(yùn)算是對(duì)兩個(gè)運(yùn)算對(duì)象進(jìn)行大小關(guān)系的比較運(yùn)算。C語言的關(guān)系運(yùn)算符共有6個(gè),>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、==(等于)、!=(不等于)。
關(guān)系運(yùn)算符中>,>=,<,<=優(yōu)先級(jí)相同,高于相同級(jí)別的==,!=。運(yùn)算方向自左向右。由關(guān)系運(yùn)算符組成的表達(dá)式稱為關(guān)系表達(dá)式。關(guān)系表達(dá)式的一般形式為:表達(dá)式關(guān)系運(yùn)算符表達(dá)式例如:a>4
a+b<c-dx==y
關(guān)系表達(dá)式的值有“真”和“假”兩種,由于C語言中沒有邏輯型數(shù)據(jù),因此用“1”和“0”分別表示邏輯真和邏輯假。例如:
3>2的值為“真”,即為1。
5>4==2的值為“假”,即為0。
【程序文本4.1】關(guān)系表達(dá)式示例。#include“stdio.h”main(){
int
a,b,c,d,e;c=2;d=4;e=6;a=c>d;b=d<e;printf(“a=%d,b=%d”,a,b);}程序運(yùn)行結(jié)果:a=0,b=1
C語言中提供了三種邏輯運(yùn)算符,!(邏輯非)、&&(邏輯與)、||(邏輯或)。邏輯非的優(yōu)先級(jí)別最高,邏輯與次之,邏輯或最低。運(yùn)算方向自左向右。邏輯運(yùn)算符與其他運(yùn)算符的優(yōu)先級(jí)從高到低依次是:邏輯非(?。?、算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯與(&&)、邏輯或(||)、賦值運(yùn)算符。由邏輯運(yùn)算符組成的表達(dá)式稱為邏輯表達(dá)式。例如:!a
b&&c2||d邏輯表達(dá)式的值為1(結(jié)果為“真”時(shí))和0(結(jié)果為“假”時(shí))。
4.2邏輯運(yùn)算符及其表達(dá)式
注意:1.對(duì)于運(yùn)算對(duì)象,C語言規(guī)定,當(dāng)運(yùn)算對(duì)象為0時(shí),即判定其為假,當(dāng)運(yùn)算對(duì)象為非0的任何值時(shí),即判定其為真。例如:m=0,n=3,則m&&n等于0,m||n等于1。2.C語言規(guī)定:在由&&和||運(yùn)算符組成的邏輯表達(dá)式中,只對(duì)能夠確定整個(gè)表達(dá)式值所需要的最少數(shù)目的子表達(dá)式進(jìn)行計(jì)算。也就是說,當(dāng)計(jì)算出一個(gè)子表達(dá)式的值之后便可確定整個(gè)邏輯表達(dá)式的值時(shí),后面的子表達(dá)式就不需要再計(jì)算了,整個(gè)表達(dá)式的值就是該子表達(dá)式的值。例如:a=3,b=4,c=3,d=3則表達(dá)式(c=a>b)&&(d=b>a)是一個(gè)由&&組成的邏輯表達(dá)式,從左至右計(jì)算兩個(gè)子表達(dá)式,只要有一個(gè)為0,就不再計(jì)算其他子表達(dá)式。當(dāng)計(jì)算c的值為0時(shí),便可確定整個(gè)表達(dá)式的值為0,因此后面的子表達(dá)式就不再計(jì)算了。所以,結(jié)果c的值為0,d的值3。
【程序文本4.2】邏輯表達(dá)式示例。#include“stdio.h”main(){int
x,y,m,n;x=3;y=7;m=9;printf(“%d\n”,x+y>m&&x==y);printf(“%d\n”,x||y+m&&y-m);printf(“%d\n”,!(x+y)||m-1&&y+m/2);}
程序運(yùn)行結(jié)果:011
4.3if語句實(shí)現(xiàn)選擇結(jié)構(gòu)最常用的方法是采用if語句。它根據(jù)給定的條件進(jìn)行判斷(真或假),以決定執(zhí)行某個(gè)分支程序段。C語言提供了3種基本的if語句形式。4.3.1if語句的三種形式1.單分支結(jié)構(gòu)這是一種最簡單的if形式,格式為:
if(表達(dá)式){
語句序列;
}執(zhí)行過程:如果表達(dá)式的值為真,則執(zhí)行其后的語句,否則跳過該if的語句,直接執(zhí)行下一條語句。
【程序文本4.1】輸入兩個(gè)實(shí)數(shù),按從小到大的順序輸出這兩個(gè)數(shù)。#include“stdio.h”main(){floatx,y,t;
printf(“請(qǐng)輸入兩個(gè)實(shí)數(shù)(x,y):”);scanf(“%f,%f”,&x,&y);if(x>y){t=x;x=y;y=t;}printf(“%5.2f,%5.2f”,x,y);}程序運(yùn)行結(jié)果:(運(yùn)行2次):請(qǐng)輸入兩個(gè)實(shí)數(shù)(x,y):32,45↙32.00,45.00請(qǐng)輸入兩個(gè)實(shí)數(shù)(x,y):45,32↙32.00,45.00從運(yùn)行結(jié)果可以看出,只有“x>y”為真時(shí)才執(zhí)行復(fù)合語句“{t=x;x=y;y=t;}”,當(dāng)程序只需實(shí)現(xiàn)單分支選擇時(shí),就可以使用這種形式的if語句來完成。
2.雙分支if…else語句這是一種使用比較頻繁的條件語句,格式為:if(表達(dá)式){語句序列1;
}else{語句序列2;
}執(zhí)行過程:如果表達(dá)式的值為“真”,則執(zhí)行語句1,否則執(zhí)行語句2。
【程序文本4.2】輸入一名學(xué)生的C語言成績,判斷是否及格。#include“stdio.h”main(){intx;
printf(“請(qǐng)輸入一名學(xué)生的C語言成績:\n”);
scanf(“%d”,&x);if(x>=60)printf(“及格\n”);
elseprintf(“不及格\n”);}
程序運(yùn)行結(jié)果:(運(yùn)行2次):請(qǐng)輸入一名學(xué)生的C語言成績:89↙及格請(qǐng)輸入一名學(xué)生的C語言成績:58↙不及格執(zhí)行本程序時(shí),當(dāng)輸入的成績大于等于60時(shí),執(zhí)行if后面的語句,輸出“及格”;當(dāng)輸入的成績小于60時(shí),執(zhí)行else后面的語句,輸出“不及格”。對(duì)于選擇結(jié)構(gòu)程序只能執(zhí)行if后面的語句或者else后面的語句,絕對(duì)不可能同時(shí)執(zhí)行兩個(gè)分支。3.多分支if…else…if語句這種多分支語句其實(shí)是固定在else分支下嵌套著另一個(gè)if…else語句,格式為:if(表達(dá)式1)
語句序列1;elseif(表達(dá)式2)語句序列2;
elseif(表達(dá)式3)語句序列3;
…elseif(表達(dá)式n)語句序列n;
else語句序列n+1;執(zhí)行過程:程序先判斷表達(dá)式1的值,當(dāng)其結(jié)果為“真”時(shí),則執(zhí)行語句1;否則判斷表達(dá)式2的值,當(dāng)其值為“真”時(shí),則執(zhí)行語句2;否則判斷表達(dá)式3的值,當(dāng)其值為“真”時(shí),則執(zhí)行語句3;否則接著進(jìn)行判斷,依此類推,直到找到結(jié)果為“真”的表達(dá)式,并執(zhí)行與之相關(guān)的語句。如果經(jīng)過判斷,所有的表達(dá)式都為“假”,那么就執(zhí)行最后一個(gè)else之后的語句。
【程序文本4.3】現(xiàn)有一分段函數(shù),輸入任意一個(gè)x值,輸出對(duì)應(yīng)的y值。y=x+3(x>3)x(x=3)x-3(x<3)#include“stdio.h”main(){int
x,y;
printf(“\n請(qǐng)輸入x的值:”);
scanf(“%d”,&x);if(x<3)y=x+3;elseif(x==3)y=x;elsey=x-3;printf(“x=%d,y=%d”,x,y);}
程序運(yùn)行情況如下(運(yùn)行3次):請(qǐng)輸入x的值:2↙x=2,y=5請(qǐng)輸入x的值:3↙x=3,y=3請(qǐng)輸入x的值:4↙x=4,y=1在應(yīng)用if-else-if多分支結(jié)構(gòu)時(shí),應(yīng)注意每個(gè)else是和其前面最近的if配對(duì)使用的。一般來講,中間的各個(gè)else不能省略,但最后一個(gè)else可以省略,這時(shí)表示當(dāng)所有的表達(dá)式的值都為假時(shí),執(zhí)行該選擇結(jié)構(gòu)下面的語句。
4.3.2if語句的嵌套if語句的嵌套是指在if語句中又含有了if語句的形式。可以嵌套在if子句中,也可以嵌套在else子句中,可以多層嵌套。其一般形式為:
if(表達(dá)式1)if(表達(dá)式2)語句序列1;
else語句序列2;
elseif(表達(dá)式3)語句序列3;
else語句序列4;
在if語句的嵌套結(jié)構(gòu)中并不需要對(duì)稱,可以根據(jù)實(shí)際情況上面格式中的一部分,并且可以進(jìn)行if語句的多重嵌套?!境绦蛭谋?.4】從鍵盤輸入3個(gè)數(shù),如果這3個(gè)數(shù)能構(gòu)成一個(gè)三角形,則輸入該三角形的形狀信息(等邊、等腰、任意三種情況)。#include“stdio.h”main(){floata,b,c;
printf(“\n請(qǐng)輸入a,b,c的值:”);
scanf(“%f,%f,%f”,&a,&b,&c);if(a>0&&b>0&&c>0&&a+b>c&&b+c>a&&a+c>b)
if(a==b&&b==c)
printf(“等邊三角形!\n”);else
if(a==b||b==c||a==c)
printf(“等腰三角形!\n”);elseprintf(“任意三角形!\n”);else
printf(“不能構(gòu)成三角形!\n”);}
程序運(yùn)行情況如下(運(yùn)行4次)請(qǐng)輸入a,b,c的值:6,6,6↙
等邊三角形!請(qǐng)輸入a,b,c的值:6,6,8↙
等腰三角形!請(qǐng)輸入a,b,c的值:6,7,8↙
任意三角形!請(qǐng)輸入a,b,c的值:2,3,6↙
不能構(gòu)成三角形!4.3.3條件運(yùn)算符條件運(yùn)算符“?:”是C語言中唯一的一個(gè)三目運(yùn)算符,要求3個(gè)運(yùn)算對(duì)象同時(shí)參加運(yùn)算。條件表達(dá)式的語法格式為:表達(dá)式1?表達(dá)式2:表達(dá)式3其運(yùn)算規(guī)則為:如果表達(dá)式1為“真”,則求解表達(dá)式2的值,并將其作為整個(gè)條件表達(dá)式的值;否則就求解表達(dá)式3的值,并將其作為整個(gè)條件表達(dá)式的值。例如:int
a,b,max;a=3;b=4;a>b?max=a:max=b;執(zhí)行時(shí)先判斷a和b的大小,a的值是3,b的值是4,“a>b”的值為“假”,執(zhí)行表達(dá)式“max=b”,所以最后max的值為4。通??梢杂们懊娼榻B的if語句來改寫,上例中的條件表達(dá)式可改寫為:
if(a>b)max=a;elsemax=b;注意:條件運(yùn)算符的結(jié)合方向?yàn)樽杂抑磷?,?yōu)先級(jí)僅高于賦值運(yùn)算符,低于邏輯運(yùn)算符、關(guān)系運(yùn)算符、算術(shù)運(yùn)算符。
4.4switch語句
我們?cè)诮鉀Q實(shí)際問題時(shí),經(jīng)常要用到多分支的選擇。雖然用if語句的嵌套格式可以實(shí)現(xiàn),但有時(shí)不太方便簡潔,C語言提供了一個(gè)用于多分支的switch語句,用它來解決多分支問題更加方便有效。其一般形式為:
switch(表達(dá)式){case常量表達(dá)式1:語句組1;case常量表達(dá)式2:語句組2;
case常量表達(dá)式n:語句組n;default:語句組n+1;}其執(zhí)行過程為:將“表達(dá)式”的值與“常量表達(dá)式”的值依次進(jìn)行比較,當(dāng)發(fā)現(xiàn)了某個(gè)匹配的值時(shí),就執(zhí)行該case后面的語句,直到遇到break語句或switch語句結(jié)束的“}”為止。如果沒有匹配的值,則執(zhí)行default后面的語句。注意:(1)switch后面的表達(dá)式,可以為任何類型,但必須與常量表達(dá)式類型匹配。(2)每一個(gè)case的常量表達(dá)式的值必須互不相同,否則就會(huì)出現(xiàn)互相矛盾的現(xiàn)象。(3)各個(gè)case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。(4)case后面的語句塊可以不要花括號(hào)。(5)在switch分支結(jié)構(gòu)中,如果對(duì)表達(dá)式的多個(gè)取值都執(zhí)行相同的語句組,則對(duì)應(yīng)的多個(gè)case語句可以共同使用同一個(gè)語句組。(6)如果在相匹配的case的語句塊中沒有break語句,那么程序?qū)拇碎_始,一直執(zhí)行到switch語句結(jié)束,或者直到遇到case子句中的break語句,才跳出switch結(jié)構(gòu)?!境绦蛭谋?.5】為某運(yùn)輸公司編制計(jì)算運(yùn)費(fèi)的程序。運(yùn)行程序時(shí),由用戶輸入運(yùn)輸距離s和運(yùn)量w,程序輸入單價(jià)p和總金額t。運(yùn)費(fèi)標(biāo)準(zhǔn)為:當(dāng)s<1000km時(shí),沒有優(yōu)惠,單價(jià)為6元/(噸·公里);當(dāng)1000km≤s<2000km時(shí),優(yōu)惠5%;當(dāng)2000km≤s<3000km時(shí),優(yōu)惠8%;當(dāng)3000km≤s<5000km時(shí),優(yōu)惠10%;當(dāng)s≥5000km時(shí),優(yōu)惠12%;
#include“stdio.h”main(){int
s,w,g;floatp,t;
printf(“請(qǐng)輸入距離s和運(yùn)量w的值:”);
scanf(“%d,%d”,&s,&w);g=s/1000;switch(g){case0:p=6;break;case1:p=6*0.95;break;case2:p=6*0.92;break;case3:case4:p=6*0.90;break;defalt:p=6*0.88;break;}t=p*s*w;
printf(“單價(jià)p是%.3f\n總價(jià)t是%.3f\n”,p,t);}程序運(yùn)行結(jié)果:請(qǐng)輸入距離s和運(yùn)量w的值:900,100↙單價(jià)p是6.000總價(jià)t是540000.000請(qǐng)輸入距離s和運(yùn)量w的值:3500,100↙單價(jià)p是5.400總價(jià)t是1890000.0004.5程序舉例【例1】輸入年份,判斷是否為潤年。分析:能被4整除,不能被100整除或能被400整除的年份為潤年。#include“stdio.h”main(){intyear;
printf(“\n請(qǐng)輸入年份:”);
scanf(“%d”,&year);if((year%4==0&&year%100!=0)||year%400==0)
printf(“%d年是閏年。\n”,year);else
printf(“%d年不是閏年。\n”,year);}程序運(yùn)行結(jié)果:(運(yùn)行2次)請(qǐng)輸入年份:1996↙1996年是閏年。請(qǐng)輸入年份:2014↙2014年不是閏年。
【例2】實(shí)現(xiàn)英寸與厘米的換算。分析:設(shè)置一個(gè)變量flag,用于選擇換算的方向,flag的值為1表示英寸換算成厘米,flag的值為2表示厘米換算成英寸。#include“stdio.h”main(){floaty,r=2.54;
intflag;
printf(“請(qǐng)輸入要換算的數(shù)據(jù)和換算的方式(1.英寸→厘米,2.厘米→英寸):\n”);
scanf(“%f,%d”,&y,&flag);if(flag==2||flag==1)
if(flag==1)printf(“%8.2f英寸=%8.2f厘米”,y,y*r);elseprintf(“%8.2f厘米=%8.2f英寸”,y,y/r);elseprintf(“數(shù)據(jù)錯(cuò)誤!\n”);}程序運(yùn)行結(jié)果:(運(yùn)行2次)請(qǐng)輸入要換算的數(shù)據(jù)和換算的方式(1.英寸→厘米,2.厘米→英寸):2,1↙2.00英寸=5.08厘米請(qǐng)輸入要換算的數(shù)據(jù)和換算的方式(1.英寸→厘米,2.厘米→英寸):4,2↙4.00厘米=1.57英寸
【例3】某企業(yè)利潤提成的規(guī)則如下:(1)利潤低于或等于10萬元的,可提成獎(jiǎng)金10%;
(2)利潤高于10萬元,低于20萬元時(shí),低于10萬元的部分按10%提成,另外10萬元可以提成7.5%;(3)利潤高于20萬元,低于40萬元時(shí),其中20萬按前面的方法發(fā)放,另外20萬元可以提成5%;(4)利潤高于40萬元,40萬按前面的方法提成,高于部分按3%提成。請(qǐng)從鍵盤輸入利潤,輸出應(yīng)發(fā)的提成。
用if語句編寫程序如下:#include“stdio.h”main(){
intpf;floatpr;
printf(“\n請(qǐng)輸入利潤總數(shù)(單位:萬元):”);
scanf(“%d”,&pf);
if(pf<=10)pr=pf*0.10;elseif(pf<20)pr=10*0.10+(pf-10)*0.075;
elseif(pf<40)pr=10*0.10+10*0.075+(pf-20)*0.05;
elsepr=10*0.10+10*0.075+20*0.05+(pf-40)*0.03;printf(“\n應(yīng)發(fā)的獎(jiǎng)金是:%f萬元。”,pr);}
程序運(yùn)行結(jié)果:(運(yùn)行4次)請(qǐng)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026北京市大興區(qū)清源街道社區(qū)衛(wèi)生服務(wù)中心招聘臨時(shí)輔助用工28人考試參考題庫及答案解析
- 樂山市五通橋區(qū)實(shí)驗(yàn)幼兒園招聘事宜(5人)考試備考題庫及答案解析
- 2026北方人才集團(tuán)內(nèi)蒙古區(qū)域招聘考試備考題庫及答案解析
- 2026湖南中創(chuàng)空天八類崗位招聘筆試參考題庫及答案解析
- 2026年浙江大陳島開發(fā)建設(shè)集團(tuán)有限公司招聘工作人員及特殊人才考試參考題庫及答案解析
- 2026國家匯添富基金招聘考試參考試題及答案解析
- 2026年1月浙江至誠人力資源開發(fā)有限公司招聘勞務(wù)派遣制森林消防護(hù)林員2人筆試備考試題及答案解析
- 2026云南玉溪市華寧縣公共就業(yè)和人才服務(wù)中心招聘公益性崗位人員3人考試備考試題及答案解析
- 2026云南曲靖市宣威市發(fā)展和改革局招聘編制外工作人員5人考試參考題庫及答案解析
- 2026天津中醫(yī)藥大學(xué)2026年第二批招聘4人考試備考題庫及答案解析
- 2025年國家開放大學(xué)《公共經(jīng)濟(jì)學(xué)》期末考試備考試題及答案解析
- 2023-2024學(xué)年廣東省廣州市小學(xué)數(shù)學(xué)二年級(jí)上冊(cè)期末自我評(píng)估試題
- 【藍(lán)光】藍(lán)光電梯的調(diào)試資料
- YS/T 971-2014鈦鎳形狀記憶合金絲材
- NY/T 682-2003畜禽場場區(qū)設(shè)計(jì)技術(shù)規(guī)范
- GB/T 33725-2017表殼體及其附件耐磨損、劃傷和沖擊試驗(yàn)
- FZ/T 01057.1-2007紡織纖維鑒別試驗(yàn)方法 第1部分:通用說明
- 實(shí)習(xí)協(xié)議模板(最新版)
- 不同GMP法規(guī)間的區(qū)別
- 方小丹建筑地基基礎(chǔ)設(shè)計(jì)的若干問題課件
- 巾幗標(biāo)兵登記表
評(píng)論
0/150
提交評(píng)論