版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第四章
選擇結(jié)構(gòu)程序設(shè)計內(nèi)容提要:1、關(guān)系表達(dá)式與邏輯表達(dá)式2、選擇結(jié)構(gòu)控制語句(if語句、switch語句)數(shù)據(jù)結(jié)構(gòu)+算法=程序描述數(shù)據(jù)的類型、組織形式描述對數(shù)據(jù)的操作步驟1、算法:計算機(jī)求解某一問題而采用的具體方法、步驟2、兩大類計算機(jī)算法:數(shù)值運(yùn)算算法、非數(shù)值運(yùn)算算法(求數(shù)值解、成熟)(事務(wù)管理、廣泛)3、算法的特性:有窮性、確定性、輸入、輸出等4、算法描述:描述算法的方法有多種歸納為二大類:①文字②圖形(符號)4.1算法的概念4.2算法的描述方法常用的算法描述方法:(1)帶序號的自然語言描述易懂卻不直觀,不嚴(yán)格(2)流程圖:靈活、自由、形象、直觀,可表示任何算法輸入/輸出處理判斷起止連接點(diǎn)流程線(3)N-S圖(盒圖):完全去掉了帶箭頭的流程線,算法的所有處理步驟都寫在一個大矩形框(表示簡單、符合結(jié)構(gòu)化思想)(4)偽代碼:用介于自然語言與計算機(jī)語言之間的文字及符號來描述算法(方便、易懂、便于向計算機(jī)語言過渡)例1:計算S=,寫出其算法。自然語言描述:流程圖描述:N-S圖描述:偽代碼描述:引例:計算函數(shù)值:需考慮:1)輸入x2)判斷x的值
3)根據(jù)x的值計算y的值
4)輸出y的值顯然2)3)順序結(jié)構(gòu)程序不能實現(xiàn),須引入選擇結(jié)構(gòu)程序。#include<stdio.h>#include<math.h>intmain(){floatx,y;printf(“Enterx:”);scanf(“%f”,&x);if(x!=0.0)y=sin(x)/x;elsey=1;printf(“\nx=%5.2f\ty=%7.4f\n”,x,y);}Enterx:2x=2.00y=0.45464.1條件判斷---關(guān)系表達(dá)式關(guān)系運(yùn)算:是對兩個量進(jìn)行“比較運(yùn)算”關(guān)系運(yùn)算符:<、<=、>、>=、==、!=優(yōu)先級別算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、賦值運(yùn)算符高低如:c>a+bc>(a+b)a==b<ca==(b<c)a=b<ca=(b<c)注意:”=”與”==”不同高低關(guān)系表達(dá)式:用關(guān)系運(yùn)算符將兩個表達(dá)式(算術(shù)、字符表達(dá)式)連接起來的有意義的式子。如:x!=0‘a(chǎn)’==‘A’a*a+b*b<Y*Y
注意:數(shù)值量比較---數(shù)字的大小字符量比較---ASCII的大小關(guān)系表達(dá)式的值:真(1)假(0)
c>a+bc>(a+b)a==b<ca==(b<c)a=b<ca=(b<c)
問:a=1,b=-5,c=‘a(chǎn)’時上面表達(dá)式的值結(jié)合規(guī)則:左結(jié)合4.1條件判斷---邏輯表達(dá)式邏輯運(yùn)算符:&&(與)、||(或)、!(非)優(yōu)先級別:!&&||
高低!(非)算術(shù)運(yùn)算符關(guān)系運(yùn)算符&&||賦值運(yùn)算符高
低例:
a>b&&b>c(a>b)&&(b>c)a!=b&&c!=0(a!=b)&&(c!=0)!a||a>b(!a)||(a>b)5>3&&2||!8<4-2((5>3)&&2)||((!8)<(4-2))邏輯量:當(dāng)一個量(可以是基本類型的常量或變量)用作判斷時,C編譯系統(tǒng)認(rèn)為:非0-----真、0-----假邏輯表達(dá)式:用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來的有意義的式子(單個邏輯量、關(guān)系表達(dá)式是邏輯表達(dá)式的特例)邏輯表達(dá)式的值:真(1)、假(0)如:若a=4則
!aa&&-54||0011例1:a=3,b=2,c=1a>b&&b>c (a>b)&&(b>c)a!=b&&c!=0 (a!=b)&&(c!=0)!a||a>b (!a)||(a>b)5>3&&2||!8<4-2例2:判斷某年year是否閏年?(閏年:能被4整除,但不能被100整除;或能被400整除)year%4==0&&year%100!=0||year%400==0練習(xí):寫出C語言的表達(dá)式(1)|x|>2(2)x≤1+a并y≤b(3)的定義域abs(x)>2或x>2||x<-2x<=1+a&&y<=b(x>=2||x<=1)&&x!=0或(x-1)*(x-2)>=0&&x!=0寫出表達(dá)式的值:(a=2,b=0,c=-2.5)a*b||c!b&&c0||a1&&!a/c1110說明(1)運(yùn)算對象的數(shù)據(jù)類型:除整型外,也可以是實型、字符型等其它類型數(shù)據(jù)。(2)子表達(dá)式計算:只有在必須計算下一個子表達(dá)式才能求解時,才計算;否則,不再計算。①對于邏輯與運(yùn)算,如果第1個對象被判定為“邏輯假”,系統(tǒng)不再計算第2個對象(因為無論真假,都不影響整個表達(dá)式的結(jié)果)。②對于邏輯或運(yùn)算,如果第1個對象被判定為“邏輯真”,系統(tǒng)不再計算第2個對象。思考:假設(shè)n1=1、n2=2、n3=3、n4=4、x=1、y=1,求解表達(dá)式(x=n1>n2)&&(y=n3>n4)后,x、y的值?答案:x=0,y=14.2if語句一、if語句的三種形式
1)條件執(zhí)行if(e)A-----A可為簡單或復(fù)合語句如:if(a>0)printf(“aispositive.\n”);if(x>y){t=y;y=x;x=t;}2)分支選擇if(e)AelseB
當(dāng)e為真值(非0)時執(zhí)行A,否則執(zhí)行B或后續(xù)語句。
if(a>0)printf(“Aispositive.\n”);elseprintf(“Aisnotpositive.\n”);A或B都可以是單一語句,也可以是復(fù)合語句;
else部分不能獨(dú)立存在,即else前一定有一個“;”,它必定是if語句的一部分。注意:在C語言中,表達(dá)式e的值為非0時,系統(tǒng)均按“真值”處理。如:if(‘a(chǎn)’)printf(“O.K.”);x=-5;if(x)printf(“O.K.”);y=0;if(y==0)printf(“O.K.”);
y=0;if(y)printf(“O.K.”);讀程序,寫出它所完成的功能。#include<stdio.h>intmain(){floatx,y;printf(“Enterx:”);scanf(“%f”,&x);if(x==0)y=1;elsey=(x*5+1)/x;printf(“\nx=%4.1f\ty=%4.1f\n”,x,y);}y=1;if(x!=0)y=(x*5+1)/x;問:若將y=1與if語句調(diào)換位置,程序結(jié)果會相同嗎?例:任給a,b,c三個數(shù),按從大到小的順序輸出。分析:1)對于任意兩個數(shù)a,b:
若a>b,則輸出a,b;否則輸出b,a。2)對于三個數(shù),有6種可能:
a>b>ca>c>bb>a>cb>c>ac>a>bc>b>a3)使用判斷---交換法若a<b,則交換a和b
若a<c,則交換a和c,結(jié)果a最大若b<c,則交換b和c,結(jié)果a>b>cabc567若a<b,則交換a和babc657若a<c,則交換a和c,結(jié)果a最大abc756若b<c,則交換b和c,結(jié)果a>b>cabc765#include<stdio.h>intmain(){inta,b,c,t;printf(“inputa,b,c:”);scanf(“%d,%d,%d”,&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(“%d,%d,%d”,a,b,c);}3)elseif形式
if(P1)S1elseif(P2)S2…..elseif(Pn-1)Sn-1elseSn
系統(tǒng)從上到下的逐個判斷條件P,一旦發(fā)現(xiàn)某條件Pi滿足時,則執(zhí)行與它有關(guān)的語句Si,并跳過其他剩余的階梯。若所有條件均不滿足,執(zhí)行最后一個else語句或后續(xù)語句。下一語句P1S1真假P2S2真假Pn-1Sn-1真假Sn…………注意:else與最近的if相匹配?!纠扛鶕?jù)成績打印出等級。
(0-59:E60-69:D70-79:C80-89:B90-100:A)算法分析:設(shè)成績?yōu)閟core,假設(shè)取值在0-100之間,沒有錯誤的輸入。
60>score≥0E
70>score≥60D80>score≥70C90>score≥80B100≥score≥90A#include"stdio.h"intmain(){intscore;printf("score=");
scanf("%d",&score);if(score>=0&&score<60)printf("gradeisE");if(score>=60&&score<70)printf("gradeisD");if(score>=70&&score<80)printf("gradeisC");if(score>=80&&score<90)printf("gradeisB");if(score>=90)printf("gradeisA");}#include"stdio.h"intmain(){intscore;printf("score=");
scanf("%d",&score);if(score>=0&&score<60)printf("gradeisE");
elseif(score<=69)printf("gradeisD");elseif(score<=79)printf("gradeisC");
elseif(score<=89)printf("gradeisB");elseprintf("gradeisA");}注意條件的表示形式和順序1#include"stdio.h"2intmain()3{/*E:0-59D:60-69C:70-79B:80-89A:90-100*/
4intscore;5printf("score=");6scanf("%d",&score);7if(score>=90&&score<=100)8printf("gradeisA");9elseif(score>=80)10printf("gradeisB");11elseif(score>=70)12printf("gradeisC");13elseif(score>=60)14printf("gradeisD");15else16printf("gradeisE");
}4.2if語句二、if語句的嵌套
if(P1)if(P2)AelseBelseif(P3)CelseD#include<stdio.h>#include<math.h>intmain(){floatx,y;printf(“inputx:”);scanf(“%f”,&x);if(x<-3.0)y=x-1.0;elseif(x>=-3.0&&x<=3.0)y=sqrt(9.0-x*x);elsey=log10(x);printf(“x=%0.1f\ty=%0.1f\n”,x,y);}
例:計算函數(shù)if(x<=3.0)……if(x<-3.0)y=x-1.0;if(x>=-3.0&&x<=3.0)y=sqrt(9.0-x*x);if(x>3)y=log10(x);……例:計算函數(shù)二、if語句的嵌套比較:if(x)if(y)printf(“1”);elseprintf(“2”);if(x){if(y)printf(“1”);}elseprintf(“2”);由此看出:通過加“{}”可改變else的層位,從而改變程序的執(zhí)行流程。二、if語句的嵌套if(x)if(y)printf(“1”);elseprintf(“2”);【練習(xí)1】假定所有變量均已正確說明,下列程序段運(yùn)行后x的值是
。
a=b=c=0; x=35; if(!a)x=-1; elseif(b); if(c)x=3; elsex=4;A)34B)4C)35D)3【練習(xí)2】當(dāng)a=1,b=3,c=5,d=4時,執(zhí)行完下面程序段后x的值為
。
if(a<b) if(c<d)x=1; else if(a<c)if(b<d)x=2;elsex=3;elsex=6; elsex=7;A)1B)2C)3D)6例:判斷某年是否閏年。閏年:年份year能被4整除,但不能被100整除;或能被400整除if((year%4==0&&year%100!=0)||(year%400==0))leap=1;elseleap=0;4.2if語句三、條件運(yùn)算符與條件表達(dá)式1.條件運(yùn)算符:?和:/*唯一的三目運(yùn)算符*/2.條件表達(dá)式:e1?e2:e3
如:a>b?a:bx==0?1:sin(x)/x3.執(zhí)行過程:
1)計算e12)e1值為非0(真),計算并返回e2的值否則計算并返回e3的值4.2if語句三、條件運(yùn)算符與條件表達(dá)式4.運(yùn)算順序:高于賦值運(yùn)算,低于算術(shù)、關(guān)系、邏輯運(yùn)算如:y=x==0?1:sin(x)/x;5.條件運(yùn)算符的結(jié)合方向是“右結(jié)合”如:a>b?a:c>d?c:d等價于:a>b?a:(c>d?c:d)例:讀程序,寫出程序完成的功能。#include<stdio.h>intmain(){inta,b,max;printf(“inputdatatoaandb:”);scanf(“%d,%d”,&a,&b);
max=a>b?a:b;printf(“Themaxis%d\n”,max);}printf(“Themaxis%d\n”,max=a>b?a:b);printf(“Themaxis%d\n”,a>b?a:b);找出a、b兩個數(shù)中的大數(shù)。例:任意輸入一個字符,若是大寫字母,將其轉(zhuǎn)換成小寫字母;如果不是,不轉(zhuǎn)換。分析:判斷一個字符ch是否為大寫字母的方法
ch>=‘A’&&ch<=‘Z’ch>=65&&ch<=90大寫字母轉(zhuǎn)換為小寫字母的方法:ch+32由前面的例子可以看出,對于二分支、并對同一變量賦值時用條件表達(dá)式最方便。ch=(ch>=‘A’&&ch<=‘Z’)?(ch+32):ch;4.3開關(guān)語句
開關(guān)語句又稱為多分支選擇語句,它比用嵌套的if語句實現(xiàn)多分支問題,程序結(jié)構(gòu)清晰、易讀。一、格式
switch(e){casec1:語句1casec2:語句2……casecn:語句n[default:語句n+1]}其中:表達(dá)式e可以是整型、字符型常量表達(dá)式ci必須與表達(dá)式e類型一致(整型與字符型通用)二、執(zhí)行過程1.計算表達(dá)式e的值2.若與常量表達(dá)式ci值一致,則從語句i開始執(zhí)行;直到遇到break語句或switch語句的“}”。3.若與任何常量表達(dá)式值均不一致時,則執(zhí)行default語句或執(zhí)行后續(xù)語句。注意:1)常量表達(dá)式ci僅起語句標(biāo)號作用,不作求值判斷;2)常量表達(dá)式的值必須是唯一的,沒有先后次序;3)多個case語句可共用一組執(zhí)行語句。如:switch(x){case1:printf(“statement1”);break;case2:printf(“statement2”);break;default:printf(“default”);}如果case1、case2中沒有break;結(jié)果是什么?例:用switch語句評價學(xué)生的成績
score>=90優(yōu)秀score>=80良好score>=70中score>=60及格score<60不及格#include<stdio.h>intmain(){intscore;printf(“inputascore:”);scanf(“%d”,&score);switch(score/10){case10:case9:printf(“優(yōu)秀\n”);break;case8:printf(“良好\n”);break;case7:printf(“中\(zhòng)n”);break;case6:printf(“及格\n”);break;default:printf(“不及格\n”);}}關(guān)鍵:如何表示表達(dá)式和常量,常量的取值與表達(dá)式有關(guān)。例運(yùn)輸公司對用戶計算運(yùn)費(fèi)。路程(s)越遠(yuǎn),每公里運(yùn)費(fèi)越低。標(biāo)準(zhǔn)如下:s<250km沒有折扣
250≤s<5002%折扣
500≤s<10005%折扣
1000≤s<20008%折扣
2000≤s<300010%折扣
3000≤s15%折扣設(shè)每公里每噸貨物的基本運(yùn)費(fèi)為p,貨物重為w,距離為s,折扣為d,則總運(yùn)費(fèi)f的計算公式為:f=p*w*s*(1-d)
int(s/250)0:d=01:d=22、3:d=54~7:d=88~11:d=10其他:d=15
#include<stdio.h>
intmain()
{
intc;
floatp,w,d,f,s;
scanf(“%f,%f,%f”,&p,&w,&s);
c=s/250;
switch(c){
case0:d=0;break;
case1:d=2;break;
case2:case3:d=5;break;
case4:case5:case6:case7:d=8;break;
case8:case9:case10:
case11:d=10;break;
default:d=15;}
f=p*w*s*(1-d/100.0);
printf(“freight=%15.4f\n”,f);}#include<stdio.h>intmain(){floatx,y,z;charop; printf("請輸入需要計算的式子,如1+2:\n"); scanf("%f%c%f",&x,&op,&y); switch(op) { case'+':z=x+y;printf("%f+%f=%f\n",x,y,z);break;case'-':z=x-y;printf("%f-%f=%f\n",x,y,z);break;case'*':z=x*y;printf("%f*%f=%f\n",x,y,z);break; case'/':if(y!=0){z=x/y;printf("%f/%f=%f\n",x,y,z);} elseprintf("你輸入的除數(shù)為零,非法!\n"); break; default:printf("你輸入的式子有誤!\n"); }}1.若從鍵盤上輸入5,則程序的輸出結(jié)果是
。#include<stdio.h>intmain(){intx;scanf("%d",&x);if(x++>5)printf("%d\n",x);elseprintf("%d\n",x--);}A.7 B.6 C.5 D.42.下列程序的輸出結(jié)果是
。#include“stdio.h”intmain(){intx=1,a=0,b=0;switch(x){case0:b++;case1:a++;case2:a++;b++;}printf(“a=%d,b=%d\n”,a,b);}A)a=2,b=1B)a=1,b=1C)a=1,b=0D)a=2,b=23.若從鍵盤上輸入3和4,則程序的輸出結(jié)果是
。#include<stdio.h>intmain(){inta,b,s
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【大學(xué)課件】單片機(jī)原理與應(yīng)用設(shè)計 子程序結(jié)構(gòu)
- DB14T-日光溫室草莓固碳生產(chǎn)技術(shù)規(guī)程編制說明
- 《PCT在細(xì)菌感染診》課件
- 《母嬰護(hù)理員》課件
- 《電子郵件課件》課件
- 單位管理制度展示選集【職員管理】十篇
- 醫(yī)藥高新區(qū)排水防澇設(shè)施項目可行性研究報告模板-立項拿地
- 單位管理制度收錄大合集人員管理篇十篇
- 《頭暈的健康教育》課件
- 2025房屋裝修合同范本版
- 辦理落戶新生兒委托書模板
- 施工現(xiàn)場環(huán)境因素識別、評價及環(huán)境因素清單、控制措施
- 【9道期末】安徽省宣城市2023-2024學(xué)年九年級上學(xué)期期末道德與法治試題(含解析)
- 2024年醫(yī)藥行業(yè)年終總結(jié).政策篇 易聯(lián)招采2024
- 《工程造價專業(yè)應(yīng)用型本科畢業(yè)設(shè)計指導(dǎo)標(biāo)準(zhǔn)》
- 倉庫主管2025年終總結(jié)及2025工作計劃
- 兒科護(hù)士述職報告2024
- 2024年01月11396藥事管理與法規(guī)(本)期末試題答案
- 股權(quán)投資協(xié)議的風(fēng)險控制
- 酒店微笑服務(wù)培訓(xùn)
- 浙江省嘉興市2023-2024學(xué)年七年級上學(xué)期語文期末試卷(含答案)
評論
0/150
提交評論