版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第4章選擇結(jié)構(gòu)程序設(shè)計
C
語言程序設(shè)計北京航空航天大學(xué)
交通科學(xué)與工程學(xué)院徐國艷2024/9/262本章主要內(nèi)容4.1關(guān)系運算符和關(guān)系表達式4.2邏輯運算符和邏輯表達式4.3if語句4.1.1if語句的一般形式4.1.2if語句的嵌套4.4switch語句4.2.1switch語句的一般形式4.2.2break語句4.5選擇結(jié)構(gòu)程序設(shè)計舉例2024/9/2634.1關(guān)系運算符和關(guān)系表達式一、關(guān)系運算符及其優(yōu)先順序1.關(guān)系運算符:<、<=、>、>=、==、!=、
優(yōu)先順序相同(低)優(yōu)先順序相同(高)關(guān)系運算符的優(yōu)先級高于賦值運算符,但低于算術(shù)運算符2.優(yōu)先順序例如:c>a+b等價于c>(a+b)a>b=c等價于(a>b)=c錯誤表達式2024/9/264二、關(guān)系表達式
用關(guān)系運算符將兩個表達式連接起來的式子稱為關(guān)系表達式
關(guān)系表達式的值是一個邏輯值,即“真”或“假”,用“1”或“0”表示例如:當(dāng)a=1,b=2,c=3時,
a>b值為0,若有d=a>b,則d的值為0
b<c值為1,若有d=b<c,則d的值為12024/9/2654.2邏輯運算符和邏輯表達式一、邏輯運算符及其優(yōu)先順序1.邏輯運算符:邏輯非:“!”邏輯與:“&&”邏輯或:“||”2.優(yōu)先順序:參見P365附錄C()!算術(shù)關(guān)系位邏輯條件賦值
高低高低2024/9/2663.邏輯運算的真值表2024/9/267二、邏輯表達式1.用邏輯運算符將關(guān)系表達式或邏輯量連接起來的式子,稱為邏輯表達式。2.邏輯表達式的運算結(jié)果
用“1”代表“真”、“0”代表“假”2024/9/268簡單分支語句語句一般格式if(表達式)
語句功能:計算表達式的值,如果是一個非0值(即邏輯真),就執(zhí)行內(nèi)嵌語句,否則(即邏輯假)跳過內(nèi)嵌語句,順序執(zhí)行后續(xù)語句。內(nèi)嵌語句,可為:賦值語句函數(shù)調(diào)用語句控制語句復(fù)合語句空語句可為算術(shù)、關(guān)系、邏輯、賦值等表達式4.3if語句2024/9/269簡單分支語句的算法:例如:⑴if(x>0)m++;⑵if(a>b){c=a;a=b;b=c;}
表達式非0
TF
語句N-S結(jié)構(gòu)圖語句流程圖NY表達式非0?2024/9/2610雙重分支語句語句一般格式if(表達式)
語句1
else
語句2功能:計算表達式的值,如果它的值是一個非0值(邏輯真),就執(zhí)行內(nèi)嵌語句1,之后跳過內(nèi)嵌語句2,執(zhí)行后續(xù)語句;否則跳過內(nèi)嵌語句1,執(zhí)行內(nèi)嵌語句2,之后執(zhí)行后續(xù)語句。
2024/9/2611雙重分支語句的算法:例如:⑴if(x>0)m++;elsem--;⑵if(ch>='a'&&ch<='z')
{ch=ch-32;
printf("%c\n",ch);}elseprintf("%c\n",ch);
表達式非0
TF
語句1語句2N-S結(jié)構(gòu)圖語句1
語句2流程圖NY表達式非0?2024/9/2612多重分支語句語句一般格式if(表達式1)
語句1
elseif(表達式2)
語句2
……
elseif(表達式m)
語句m
else語句
n語句n+1功能:依次計算并判斷表達式i,為非0時執(zhí)行它后面的語句,都為0時,執(zhí)行語句n無論執(zhí)行完那個語句分支,都轉(zhuǎn)到后續(xù)語句n+12024/9/2613多重分支語句的算法流程圖表達式2?表達式1?語句n語句1
語句2
語句m…YNYNNY表達式m?語句n+12024/9/2614多重分支語句的算法N-S結(jié)構(gòu)圖表達式1?
TF
表達式2?語句1TF
語句2…
表達式m?TF
語句m語句n例如:if(a<0)x=-1;elseif(a==0)x=0;elsex=1;2024/9/2615if語句的簡單應(yīng)用【例4.1】輸入一個字符,如果是大寫字母,則將其轉(zhuǎn)換為小寫字母輸出,否則直接輸出。輸入:用getchar或scanf函數(shù)ch是否為大寫字母:ch>='A'&&ch<='Z'(或ch>=65&&ch<=90)大寫字母轉(zhuǎn)換為小寫字母:ch=ch+32輸出:用putchar或printf函數(shù)思路:2024/9/2616程序:#include"stdio.h"voidmain(){charch;ch=getchar();if(ch>='A'&&ch<='Z')ch=ch+32;printf("%c\n",ch);}程序運行情況如下:G
g
可使用條件表達式代替putchar(ch>='A'&&ch<='Z'?ch+32:ch);putchar('\n');條件運算符和條件表達式有一種if語句,當(dāng)被判別的表達式的值為“真”或“假”時,都執(zhí)行一個賦值語句且向同一個變量賦值如:if(a>b)max=a;elsemax=b;max=(a>b)?a
:b;條件運算符max=(a>b)?a
:b;條件表達式條件運算符和條件表達式有一種if語句,當(dāng)被判別的表達式的值為“真”或“假”時,都執(zhí)行一個賦值語句且向同一個變量賦值如:if(a>b)max=a;elsemax=b;條件表達式的一般形式為表達式1?表達式2:
表達式3條件運算符和條件表達式條件運算符的執(zhí)行順序:求解表達式1;若為非0(真)則求解表達式2,此時表達式2的值就作為整個條件表達式的值;若表達式1的值為0(假),則求解表達式3,表達式3的值就是整個條件表達式的值;條件運算符和條件表達式條件運算符優(yōu)先于賦值運算符條件運算符的結(jié)合方向為“自右至左”以下為合法的使用方法:a>b?(max=a):(max=b);a>b?printf(“%d”,a):printf(“%d”,b);條件運算符和條件表達式
例4.1輸入一個字符,判別它是否大寫字母,如果是,將它轉(zhuǎn)換成小寫字母;如果不是,不轉(zhuǎn)換。然后輸出最后得到的字符。(用條件表達式)條件運算符和條件表達式#include<stdio.h>intmain(){charch;scanf("%c",&ch);ch=(ch>='A'&&ch<='Z‘)?(ch+32):ch;printf("%c\n",ch);return0;}條件運算符和條件表達式2024/9/26244.3.2if語句的嵌套如果if的內(nèi)嵌語句中又使用了一個if語句,則構(gòu)成if語句的嵌套。
【例4.2】比較兩個整數(shù)的關(guān)系。#include<stdio.h>voidmain(){intx,y;printf("EnterintegerXandY:");scanf("%d%d",&x,&y);
if(x!=y)
if(x>y)printf("X>Y\n");
elseprintf("X<Y\n");
elseprintf("X=Y\n");}應(yīng)該正確判斷:if的內(nèi)嵌語句if和else的配對提倡鋸齒形縮格書寫有利于閱讀程序2024/9/2625
if語句嵌套的形式簡單if語句的嵌套形式if(表達式)if語句雙重(或多重)分支if語句的嵌套形式if(表達式)if語句else
if語句可以是各種形式的if語句可以是各種形式的if語句如果是簡單if語句,必須用“{}”括起2024/9/2626例如:⑴if(c<=100)
if(c>=50)printf("50<=c<=100\n");⑵if(c<=100)if(c>=50)printf("50<=c<=100\n");elseprintf("c<50\n");else
if(c<=150)printf("100<c<=150\n");elseprintf("c>150\n");⑶if(c<=100)if(c>=50)printf("50<=c<=100\n");elseprintf("c<50\n")與哪個if配對?2024/9/2627再例如:if(a>b) if(a>c) if(a>d)m=1;elsem=2;elsem=3; 問題:哪一個else和哪一個if相匹配?規(guī)則:在嵌套的if~else語句中,else總是與上面的離它最近的尚未配對的if
配對。2024/9/2628舉例【例4.3】輸入一個數(shù),判斷它是奇數(shù)還是偶數(shù),如果是奇數(shù)則進一步判斷它是否為5的倍數(shù)。
定義變量x輸入x的值
x是奇數(shù)
TF
輸出“odd”x是5的倍數(shù)輸出“even”TF是5的倍數(shù)2024/9/2629程序:#include<stdio.h>voidmain(){intx;scanf("%d",&x);
if(x%2!=0)
{printf("%disanodd\n",x);
if(x%5==0)printf("%disthetimesof5\n",x);
}
else
printf("%disaneven\n",x);}思考:如果沒有,算法和輸出如何?(假定輸入x=15或11)2024/9/2630學(xué)習(xí)if語句的難點if~else語句的配對正確用表達式描述條件例如:當(dāng)x大于5小于10時令x自增if(5<x<10)x++;正確判斷內(nèi)嵌語句例如:if(x<y)x=x+3;y=y-2;elsex=x-3;y=y+2;if(x>5&&x<10)x++;{}{}2024/9/2631熟悉常用的if表達式形式例如有定義:inta=3,b=0;下面哪個表達式執(zhí)行語句“b=2;”?1:if(a==0)b=2;2:if(a==1)b=2;3:if(a!=0)b=2;4:if(a=1)b=2;5:if(a=0)b=2;6:if(a)b=2;7:if(!a)b=2;等價于等價于2024/9/26324.4switch語句switch語句的一般形式
switch(表達式){case常量表達式1:語句序列1case常量表達式2:語句序列2
……case常量表達式n:語句序列ndefault:語句序列n+1
}功能:計算表達式的值,與常量表達式的值比較,等于第i個值時,順序執(zhí)行語句序列i、i+1、…、n+1若與所有常量表達式值都不相等,執(zhí)行語句序列n+1。
2024/9/2633switch語句的算法描述N-S結(jié)構(gòu)圖計算表達式常量表達式1語句序列1常量表達式2語句序列2
……
……常量表達式n語句序列ndefault語句序列n+1例如:switch(a){case5:printf("&");case2:printf("#");default:printf("$");}當(dāng)a等于5,輸出:$當(dāng)a等于2,輸出:#$當(dāng)a是其他值,輸出:$2024/9/2634說明:“case常量表達式i:”等價于語句標號,計算出的表達式值等于哪個語句標號,就從哪個位置開始順序向下執(zhí)行語句序列。∴語句位置影響運行結(jié)果例如:switch(a){case2:printf("#");default:printf("$");case5:printf("&");}switch與break語句結(jié)合才能實現(xiàn)程序的分支break;break;break;2024/9/2635switch語句的簡單應(yīng)用【例4.4】已知x=100,y=15,要求輸入一個算術(shù)運算符(+、-、*或/),并對x和y進行指定的算術(shù)運算。
思路:設(shè)x和y為float型變量并賦初值;輸入的運算符op為char型變量;根據(jù)op的值(為'+'、'-'、'*'、'/')進行x和y的相加、相減、相乘、相除運算(選擇分支);還要考慮到輸入字符不是+、-、*或/時的情況。2024/9/2636程序:#include"stdio.h"#include"math.h"voidmain(){floatx=100,y=15,z;charop;op=getchar();switch(op){case'+':z=x+y;break;case'-':z=x-y;break;case'*':z=x*y;break;case'/':z=x/y;break;default:z=0;}if((fabs(z))>1e-6)printf("%f%c%f=%f\n",x,op,y,z);elseprintf("%cisnotanoperator\n",op);}實型數(shù)通常不使用z==0或z!=0的比較可用fabs(z)>ε
代替2024/9/2637注意:switch語句的書寫格式:語句體本身必須用花括號括起;case和default后面如果有多條語句,可以不必使用花括號;case和常量表達式之間必須有空格;default可以寫在語句體的任何位置,也可以省略不寫;break語句可以改變case的語句標號作用,終止后續(xù)case語句序列的執(zhí)行。
switch語句和break語句結(jié)合,可以實現(xiàn)程序的選擇控制(break語句還可以在循環(huán)語句中使用);
允許switch嵌套使用,但同一個switch語句中,任意兩個case的常量表達式值不能相同。
2024/9/26384.4選擇結(jié)構(gòu)程序設(shè)計舉例【例4.5】求一元二次方程ax2+bx+c=0的根。
思路:一元二次方程的根取決于系數(shù)a,b,c求根公式:
判別式d=b2-4ac
當(dāng)
d=0時,方程有兩個相等的實根:x1=x2=-b/(2*a)當(dāng)d>0時,方程有兩個不相等的實根:x1=(-b+sqrt(d))/(2*a)x2=(-b-sqrt(d))/(2*a)
當(dāng)d<0時,方程有兩個虛根:x1=jp+ipix2=jp-ipi實部
jp=-b/(2*a)
虛部
ip=sqrt(-d)/(2*a)2024/9/2639算法:定義變量a、b、c、d、x1、x2、jp、ip輸入系數(shù)a、b、ca==0TF
計算d=b*b-4*a*c
不是二d==0
次方程TFd>0
計算重根TF
輸出重根計算實根計算虛根輸出實根輸出虛根2024/9/2640程序:#include“stdio.h"#include"math.h"voidmain(){floata,b,c,d,x1,x2,lp,ip;
scanf("%f%f%f",&a,&b,&c);
printf("theequation");
if(fabs(a)<1e-6)printf("isnotquadratic");
else
{d=b*b-4*a*c;
if(fabs(d)<=1e-6)
/*相等的實根*/
{printf("hastwoequalroots:\n");
printf("x1=x2=%8.4f\n",-b/(2*a));
}2024/9/2641程序(續(xù)):
elseif(d>1e-6)
/*不相等的實根*/
{x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
printf("hastworealroots:\n");
printf("x1=%8.4f,x2=%8.4f\n",x1,x2);
}
else
/*虛根*/
{
lp=-b/(2*a);ip=sqrt(-d)/(2*a);
printf("hastwocomplexroots:\n");
printf("x1=%8.4f+%8.4fi\n",lp,ip);
printf("x2=%8.4f-%8.4fi\n",lp,ip);
}
}
}2024/9/2642舉例(續(xù)):【例4.6】輸入年份,判別該年是否為閏年。思路:年份year為閏年的條件為:①
能夠被4整除,但不能被100整除的年份;②
能夠被400整除的年份。只要滿足任意一個就可以確定它是閏年。例如:1996年、2000年是閏年1998年、1900年不是閏年設(shè)定標志變量leap,只要符合其中一個條件的就是閏年,令leap=1;否則令leap=0
2024/9/2643算法:定義變量year、leap
輸入年份year
能被4整除且不能被100整除?
TF
能被400整除?
leap=1
TFleap=1leap=0leap=1?TF
是閏年不是閏年year%400==0year%4==0&&year%100!=02024/9/2644程序:#include"stdio.h"voidmain(){intyear,leap;scanf("%d",&year);if(year%4==0&&year%100!=0)leap=1;elseif(year%400==0)leap=1;elseleap=0;if(leap==1)printf("%disaleapyear\n",year);elseprintf("%disnotaleapyear\n",year);}
例4.7要求按照考試成績的等級輸出百分制分數(shù)段,A等為85分以上,B等為70~84分,C等為60~69分,D等為60分以下。成績的等級由鍵盤輸入。解題思路:判斷出這是一個多分支選擇問題根據(jù)百分制分數(shù)將學(xué)生成績分為4個等級如果用if語句,至少要用3層嵌套的if,進行3次檢查判斷用switch語句進行一次檢查即可得到結(jié)果#include<stdio.h>intmain(){chargrade;scanf("%c",&grade);printf("Yourscore:");switch(grade){case'A':printf("85~100\n");break;case'B':printf("70~84\n");break;case'C':printf("60~69\n");break;case'D':printf("<60\n");break; default:printf("enterdataerror!\n");}return0;}值為A#include<stdio.h>intmain(){chargrade;scanf("%c",&grade);printf("Yourscore:");switch(grade){case'A':printf("85~100\n");break;case'B':printf("70~84\n");break;case'C':printf("60~69\n");break;case'D':printf("<60\n");break; default:printf("enterdataerror!\n");}return0;}不能少#include<stdio.h>intmain(){chargrade;scanf("%c",&grade);printf("Yourscore:");switch(grade){case'A':printf("85~100\n");break;case'B':printf("70~84\n");break;case'C':printf("60~69\n");break;case'D':printf("<60\n");break; default:printf("enterdataerror!\n");}return0;}值為C#include<stdio.h>intmain(){chargrade;scanf("%c",&grade);printf("Yourscore:");switch(grade){case'A':printf("85~100\n");break;case'B':printf("70~84\n");break;case'C':printf("60~69\n");break;case'D':print
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國重型汽車行業(yè)市場發(fā)展運行及發(fā)展趨勢與投資前景研究報告
- 2024-2030年中國酵素行業(yè)競爭態(tài)勢與消費趨勢預(yù)測報告
- 2024-2030年中國酒精行業(yè)市場發(fā)展分析及發(fā)展趨勢與投資前景研究報告
- 2024-2030年中國速食連鎖行業(yè)經(jīng)營效益及競爭格局分析報告
- 2024-2030年中國連帽衫行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 2024-2030年中國過濾棉行業(yè)營銷態(tài)勢及供需趨勢預(yù)測報告
- 2024-2030年中國辣味香腸食品行業(yè)經(jīng)營效益及銷售前景趨勢報告
- 2024-2030年中國軸承穩(wěn)定環(huán)行業(yè)供需銷售格局與未來前景展望報告版
- 2024-2030年中國軋輥磨床行業(yè)產(chǎn)銷狀況與投資盈利預(yù)測報告
- 2024-2030年中國車載廣告行業(yè)深度發(fā)展研究與“十四五”企業(yè)投資戰(zhàn)略規(guī)劃報告
- 2024年上海市文物保護研究中心招聘歷年【重點基礎(chǔ)提升】模擬試題(共500題)附帶答案詳解
- 2024高溫二次電池第1部分:要求
- 水平螺旋輸送機設(shè)計計算及參數(shù)表
- 中班故事《小刺猬和大菠蘿》課件
- 公文寫作:報告
- 醫(yī)學(xué)科普脫口秀康復(fù)醫(yī)學(xué)科
- 新漢語水平考試HSK一級真題(含聽力材料和答案)
- MOOC 大數(shù)據(jù)與法律檢索-湖南師范大學(xué) 中國大學(xué)慕課答案
- 播音主持之即興評述
- GB/T 19964-2024光伏發(fā)電站接入電力系統(tǒng)技術(shù)規(guī)定
- 全國初中數(shù)學(xué)優(yōu)質(zhì)課一等獎《圖形的旋轉(zhuǎn)》教學(xué)設(shè)計
評論
0/150
提交評論