C語言程序設(shè)計(jì)選擇結(jié)構(gòu)程序設(shè)計(jì)_第1頁
C語言程序設(shè)計(jì)選擇結(jié)構(gòu)程序設(shè)計(jì)_第2頁
C語言程序設(shè)計(jì)選擇結(jié)構(gòu)程序設(shè)計(jì)_第3頁
C語言程序設(shè)計(jì)選擇結(jié)構(gòu)程序設(shè)計(jì)_第4頁
C語言程序設(shè)計(jì)選擇結(jié)構(gòu)程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

C

語言程序設(shè)計(jì)北京航空航天大學(xué)

交通科學(xué)與工程學(xué)院徐國艷2024/9/262本章主要內(nèi)容4.1關(guān)系運(yùn)算符和關(guān)系表達(dá)式4.2邏輯運(yùn)算符和邏輯表達(dá)式4.3if語句4.1.1if語句的一般形式4.1.2if語句的嵌套4.4switch語句4.2.1switch語句的一般形式4.2.2break語句4.5選擇結(jié)構(gòu)程序設(shè)計(jì)舉例2024/9/2634.1關(guān)系運(yùn)算符和關(guān)系表達(dá)式一、關(guān)系運(yùn)算符及其優(yōu)先順序1.關(guān)系運(yùn)算符:<、<=、>、>=、==、!=、

優(yōu)先順序相同(低)優(yōu)先順序相同(高)關(guān)系運(yùn)算符的優(yōu)先級(jí)高于賦值運(yùn)算符,但低于算術(shù)運(yùn)算符2.優(yōu)先順序例如:c>a+b等價(jià)于c>(a+b)a>b=c等價(jià)于(a>b)=c錯(cuò)誤表達(dá)式2024/9/264二、關(guān)系表達(dá)式

用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式連接起來的式子稱為關(guān)系表達(dá)式

關(guān)系表達(dá)式的值是一個(gè)邏輯值,即“真”或“假”,用“1”或“0”表示例如:當(dāng)a=1,b=2,c=3時(shí),

a>b值為0,若有d=a>b,則d的值為0

b<c值為1,若有d=b<c,則d的值為12024/9/2654.2邏輯運(yùn)算符和邏輯表達(dá)式一、邏輯運(yùn)算符及其優(yōu)先順序1.邏輯運(yùn)算符:邏輯非:“!”邏輯與:“&&”邏輯或:“||”2.優(yōu)先順序:參見P365附錄C()!算術(shù)關(guān)系位邏輯條件賦值

高低高低2024/9/2663.邏輯運(yùn)算的真值表2024/9/267二、邏輯表達(dá)式1.用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來的式子,稱為邏輯表達(dá)式。2.邏輯表達(dá)式的運(yùn)算結(jié)果

用“1”代表“真”、“0”代表“假”2024/9/268簡單分支語句語句一般格式if(表達(dá)式)

語句功能:計(jì)算表達(dá)式的值,如果是一個(gè)非0值(即邏輯真),就執(zhí)行內(nèi)嵌語句,否則(即邏輯假)跳過內(nèi)嵌語句,順序執(zhí)行后續(xù)語句。內(nèi)嵌語句,可為:賦值語句函數(shù)調(diào)用語句控制語句復(fù)合語句空語句可為算術(shù)、關(guān)系、邏輯、賦值等表達(dá)式4.3if語句2024/9/269簡單分支語句的算法:例如:⑴if(x>0)m++;⑵if(a>b){c=a;a=b;b=c;}

表達(dá)式非0

TF

語句N-S結(jié)構(gòu)圖語句流程圖NY表達(dá)式非0?2024/9/2610雙重分支語句語句一般格式if(表達(dá)式)

語句1

else

語句2功能:計(jì)算表達(dá)式的值,如果它的值是一個(gè)非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);

表達(dá)式非0

TF

語句1語句2N-S結(jié)構(gòu)圖語句1

語句2流程圖NY表達(dá)式非0?2024/9/2612多重分支語句語句一般格式if(表達(dá)式1)

語句1

elseif(表達(dá)式2)

語句2

……

elseif(表達(dá)式m)

語句m

else語句

n語句n+1功能:依次計(jì)算并判斷表達(dá)式i,為非0時(shí)執(zhí)行它后面的語句,都為0時(shí),執(zhí)行語句n無論執(zhí)行完那個(gè)語句分支,都轉(zhuǎn)到后續(xù)語句n+12024/9/2613多重分支語句的算法流程圖表達(dá)式2?表達(dá)式1?語句n語句1

語句2

語句m…YNYNNY表達(dá)式m?語句n+12024/9/2614多重分支語句的算法N-S結(jié)構(gòu)圖表達(dá)式1?

TF

表達(dá)式2?語句1TF

語句2…

表達(dá)式m?TF

語句m語句n例如:if(a<0)x=-1;elseif(a==0)x=0;elsex=1;2024/9/2615if語句的簡單應(yīng)用【例4.1】輸入一個(gè)字符,如果是大寫字母,則將其轉(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);}程序運(yùn)行情況如下:G

g

可使用條件表達(dá)式代替putchar(ch>='A'&&ch<='Z'?ch+32:ch);putchar('\n');條件運(yùn)算符和條件表達(dá)式有一種if語句,當(dāng)被判別的表達(dá)式的值為“真”或“假”時(shí),都執(zhí)行一個(gè)賦值語句且向同一個(gè)變量賦值如:if(a>b)max=a;elsemax=b;max=(a>b)?a

:b;條件運(yùn)算符max=(a>b)?a

:b;條件表達(dá)式條件運(yùn)算符和條件表達(dá)式有一種if語句,當(dāng)被判別的表達(dá)式的值為“真”或“假”時(shí),都執(zhí)行一個(gè)賦值語句且向同一個(gè)變量賦值如:if(a>b)max=a;elsemax=b;條件表達(dá)式的一般形式為表達(dá)式1?表達(dá)式2:

表達(dá)式3條件運(yùn)算符和條件表達(dá)式條件運(yùn)算符的執(zhí)行順序:求解表達(dá)式1;若為非0(真)則求解表達(dá)式2,此時(shí)表達(dá)式2的值就作為整個(gè)條件表達(dá)式的值;若表達(dá)式1的值為0(假),則求解表達(dá)式3,表達(dá)式3的值就是整個(gè)條件表達(dá)式的值;條件運(yùn)算符和條件表達(dá)式條件運(yùn)算符優(yōu)先于賦值運(yùn)算符條件運(yùn)算符的結(jié)合方向?yàn)椤白杂抑磷蟆币韵聻楹戏ǖ氖褂梅椒ǎ篴>b?(max=a):(max=b);a>b?printf(“%d”,a):printf(“%d”,b);條件運(yùn)算符和條件表達(dá)式

例4.1輸入一個(gè)字符,判別它是否大寫字母,如果是,將它轉(zhuǎn)換成小寫字母;如果不是,不轉(zhuǎn)換。然后輸出最后得到的字符。(用條件表達(dá)式)條件運(yùn)算符和條件表達(dá)式#include<stdio.h>intmain(){charch;scanf("%c",&ch);ch=(ch>='A'&&ch<='Z‘)?(ch+32):ch;printf("%c\n",ch);return0;}條件運(yùn)算符和條件表達(dá)式2024/9/26244.3.2if語句的嵌套如果if的內(nèi)嵌語句中又使用了一個(gè)if語句,則構(gòu)成if語句的嵌套。

【例4.2】比較兩個(gè)整數(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的配對(duì)提倡鋸齒形縮格書寫有利于閱讀程序2024/9/2625

if語句嵌套的形式簡單if語句的嵌套形式if(表達(dá)式)if語句雙重(或多重)分支if語句的嵌套形式if(表達(dá)式)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")與哪個(gè)if配對(duì)?2024/9/2627再例如:if(a>b) if(a>c) if(a>d)m=1;elsem=2;elsem=3; 問題:哪一個(gè)else和哪一個(gè)if相匹配?規(guī)則:在嵌套的if~else語句中,else總是與上面的離它最近的尚未配對(duì)的if

配對(duì)。2024/9/2628舉例【例4.3】輸入一個(gè)數(shù),判斷它是奇數(shù)還是偶數(shù),如果是奇數(shù)則進(jìn)一步判斷它是否為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語句的難點(diǎn)if~else語句的配對(duì)正確用表達(dá)式描述條件例如:當(dāng)x大于5小于10時(shí)令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表達(dá)式形式例如有定義:inta=3,b=0;下面哪個(gè)表達(dá)式執(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;等價(jià)于等價(jià)于2024/9/26324.4switch語句switch語句的一般形式

switch(表達(dá)式){case常量表達(dá)式1:語句序列1case常量表達(dá)式2:語句序列2

……case常量表達(dá)式n:語句序列ndefault:語句序列n+1

}功能:計(jì)算表達(dá)式的值,與常量表達(dá)式的值比較,等于第i個(gè)值時(shí),順序執(zhí)行語句序列i、i+1、…、n+1若與所有常量表達(dá)式值都不相等,執(zhí)行語句序列n+1。

2024/9/2633switch語句的算法描述N-S結(jié)構(gòu)圖計(jì)算表達(dá)式常量表達(dá)式1語句序列1常量表達(dá)式2語句序列2

……

……常量表達(dá)式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常量表達(dá)式i:”等價(jià)于語句標(biāo)號(hào),計(jì)算出的表達(dá)式值等于哪個(gè)語句標(biāo)號(hào),就從哪個(gè)位置開始順序向下執(zhí)行語句序列?!嗾Z句位置影響運(yùn)行結(jié)果例如:switch(a){case2:printf("#");default:printf("$");case5:printf("&");}switch與break語句結(jié)合才能實(shí)現(xiàn)程序的分支break;break;break;2024/9/2635switch語句的簡單應(yīng)用【例4.4】已知x=100,y=15,要求輸入一個(gè)算術(shù)運(yùn)算符(+、-、*或/),并對(duì)x和y進(jìn)行指定的算術(shù)運(yùn)算。

思路:設(shè)x和y為float型變量并賦初值;輸入的運(yùn)算符op為char型變量;根據(jù)op的值(為'+'、'-'、'*'、'/')進(jìn)行x和y的相加、相減、相乘、相除運(yùn)算(選擇分支);還要考慮到輸入字符不是+、-、*或/時(shí)的情況。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í)型數(shù)通常不使用z==0或z!=0的比較可用fabs(z)>ε

代替2024/9/2637注意:switch語句的書寫格式:語句體本身必須用花括號(hào)括起;case和default后面如果有多條語句,可以不必使用花括號(hào);case和常量表達(dá)式之間必須有空格;default可以寫在語句體的任何位置,也可以省略不寫;break語句可以改變case的語句標(biāo)號(hào)作用,終止后續(xù)case語句序列的執(zhí)行。

switch語句和break語句結(jié)合,可以實(shí)現(xiàn)程序的選擇控制(break語句還可以在循環(huán)語句中使用);

允許switch嵌套使用,但同一個(gè)switch語句中,任意兩個(gè)case的常量表達(dá)式值不能相同。

2024/9/26384.4選擇結(jié)構(gòu)程序設(shè)計(jì)舉例【例4.5】求一元二次方程ax2+bx+c=0的根。

思路:一元二次方程的根取決于系數(shù)a,b,c求根公式:

判別式d=b2-4ac

當(dāng)

d=0時(shí),方程有兩個(gè)相等的實(shí)根:x1=x2=-b/(2*a)當(dāng)d>0時(shí),方程有兩個(gè)不相等的實(shí)根:x1=(-b+sqrt(d))/(2*a)x2=(-b-sqrt(d))/(2*a)

當(dāng)d<0時(shí),方程有兩個(gè)虛根:x1=jp+ipix2=jp-ipi實(shí)部

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

計(jì)算d=b*b-4*a*c

不是二d==0

次方程TFd>0

計(jì)算重根TF

輸出重根計(jì)算實(shí)根計(jì)算虛根輸出實(shí)根輸出虛根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)

/*相等的實(shí)根*/

{printf("hastwoequalroots:\n");

printf("x1=x2=%8.4f\n",-b/(2*a));

}2024/9/2641程序(續(xù)):

elseif(d>1e-6)

/*不相等的實(shí)根*/

{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整除的年份。只要滿足任意一個(gè)就可以確定它是閏年。例如:1996年、2000年是閏年1998年、1900年不是閏年設(shè)定標(biāo)志變量leap,只要符合其中一個(gè)條件的就是閏年,令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要求按照考試成績的等級(jí)輸出百分制分?jǐn)?shù)段,A等為85分以上,B等為70~84分,C等為60~69分,D等為60分以下。成績的等級(jí)由鍵盤輸入。解題思路:判斷出這是一個(gè)多分支選擇問題根據(jù)百分制分?jǐn)?shù)將學(xué)生成績分為4個(gè)等級(jí)如果用if語句,至少要用3層嵌套的if,進(jìn)行3次檢查判斷用switch語句進(jìn)行一次檢查即可得到結(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等.壓縮文件請(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論