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

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論