c語言分支語句精_第1頁
c語言分支語句精_第2頁
c語言分支語句精_第3頁
c語言分支語句精_第4頁
c語言分支語句精_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

03:541/39第四章分支語句

§4.1if結(jié)構(gòu)

§4.2Switch語句

§4.3程序范例

03:542/39§4.1if結(jié)構(gòu)

順序結(jié)構(gòu)的程序只能以順序的方式處理數(shù)據(jù),但實(shí)際問題要求計(jì)算機(jī)能夠?qū)栴}進(jìn)行判斷,根據(jù)判斷的結(jié)果,選擇不同的處理方式,這就要求程序本身具有判斷和選擇能力,分支結(jié)構(gòu)正是為解決這類問題而設(shè)定的。

C語言用于實(shí)現(xiàn)分支有if結(jié)構(gòu)和switch結(jié)構(gòu)。§4.1.1if語句if結(jié)構(gòu)是一種常用的分支結(jié)構(gòu),是最簡單的一種單分支結(jié)構(gòu)

。03:543/39一般形式為:if(<表達(dá)式>)

<語句A><表達(dá)式>:一般為條件表達(dá)式或邏輯表達(dá)式。功能:先判斷<表達(dá)式>的邏輯值,若該邏輯值為“真”,則執(zhí)行<語句A>,否則,什么也不執(zhí)行。注意:if語句中的<語句A>一般情況下都是以復(fù)合語句的形式出現(xiàn),即用一對(duì)花括號(hào)將語句括起來。if結(jié)構(gòu)的流程圖:03:544/39【例4-1】

從鍵盤任意輸入兩個(gè)實(shí)數(shù),然后按其代數(shù)值從小到大輸出這兩個(gè)數(shù)。先制定算法的流程圖,如圖所示,虛線框?yàn)閕f結(jié)構(gòu)。根據(jù)流程圖可以很方便地寫出解決這個(gè)問題的程序03:545/39/*exam4_1.c按升序輸出兩個(gè)數(shù)*/#include<stdio.h>main(){ floata,b,t; scanf("%f,%f",&a,&b); if(a>b) { t=a; a=b; b=t; } printf("%5.2f,%5.2f\n",a,b);}03:546/39【例4-2】:從鍵盤輸入一個(gè)整數(shù),求該數(shù)的絕對(duì)值。

該問題算法的流程圖:03:547/39根據(jù)流程圖寫出的程序如下:/*exam4_2.c求整數(shù)的絕對(duì)值*/#include<stdio.h>main(){ intnum; scanf("%d",&num); if(num<0) num=-num; printf("Theabsolutevalueis:%d\n",num);}

03:548/39§4.1.2if_else語句

if_else語句是一種雙分支結(jié)構(gòu),其一般形式為:if(<表達(dá)式>)

<語句A>else<語句B><表達(dá)式>:一般為條件表達(dá)式或邏輯表達(dá)式。功能是:先判斷<表達(dá)式>的值,若其值為“真”,則執(zhí)行<語句A>,否則執(zhí)行<語句B>。if_else結(jié)構(gòu)的流程圖:03:549/39【例4-3】設(shè)計(jì)一個(gè)猜數(shù)游戲,由計(jì)算機(jī)產(chǎn)生一個(gè)隨機(jī)數(shù)magic,從鍵盤輸入一個(gè)數(shù)guess,若輸入的數(shù)guess的大小等于隨機(jī)數(shù)magic,則輸出“Youareright!”。否則,輸出“Youarewrong!”。03:5410/39根據(jù)流程圖可寫出程序如下:/*exam4_3.c猜數(shù)游戲的程序*/#include<stdio.h>#include<stdlib.h>main(){intguess,magic;magic=rand();scanf("%d",&guess);if(guess==magic) printf("YouAreRight");else printf("YouAreWrong");}03:5411/39§4.1.3if語句的嵌套

if語句的嵌套:是指在if或else的分支下又可以包含另一個(gè)if語句或if_else語句,嵌套的形式有規(guī)則嵌套和任意嵌套兩種。if語句的規(guī)則嵌套形式如下:if(<表達(dá)式1>)

<語句1>elseif(<表達(dá)式2>)

<語句2>elseif(<表達(dá)式3>)

<語句3>…elseif(<表達(dá)式n>)<語句n>else<語句n+1>03:5412/39if_else的規(guī)則嵌套流程圖03:5413/39【例4-4】從鍵盤輸入+、-、*、/中的任一個(gè),輸出對(duì)應(yīng)的英文單詞:plus、minus、mutiply、divide,若輸入的不是這四個(gè)字符中的任一個(gè),則輸出“error”。算法的流程圖如圖所示,虛線框所示為if_else的規(guī)則嵌套:03:5414/39#include<stdio.h>main(){charch;ch=getchar();if(ch=='+')printf("plus\n");elseif(ch=='-')printf("minus\n");elseif(ch=='*') printf("multiply\n");elseif(ch=='/') printf("divide\n"); else printf("error\n");}

03:5415/39注意:if與else的匹配關(guān)系,else總是與離它最近的上一個(gè)if配對(duì)。將每一對(duì)if_else結(jié)構(gòu)采用縮進(jìn)對(duì)齊方式,可以增加程序的可讀性,良好的程序書寫風(fēng)格有助于對(duì)程序的理解?!纠?-5】計(jì)算階躍函數(shù)y的值:03:5416/39算法的流程圖如圖,兩個(gè)虛線框均為if_else結(jié)構(gòu)。03:5417/39根據(jù)流程圖寫出的程序如下:/*exam4_5.c計(jì)算階躍函數(shù)y的值*/#include<stdio.h>main(){ floatx,y; printf("inputx:\n"); scanf("%f",&x); if(x>=0) if(x>0) y=1;

else y=0; else y=-1; printf("y=%-4.0f\n",y);}對(duì)多重if,最容易犯的錯(cuò)誤是if與else配對(duì)錯(cuò)誤,else總是與離它最近的上一個(gè)if配對(duì)。

03:5418/39§

4.2Switch結(jié)構(gòu)

當(dāng)嵌套if分支較多時(shí),程序變得復(fù)雜冗長,可讀性降低。C語言提供了switch開關(guān)語句專門處理多路分支的情形,使程序變得簡潔。§4.2.1switch語句

switch語句的一般形式為:switch(<表達(dá)式>){case<常量表達(dá)式1>:語句序列1;

case<常量表達(dá)式2>:語句序列2;

case<常量表達(dá)式n>:語句序列n;

default:語句序列(n+1);}03:5419/39常量表達(dá)式:值必須是整型、字符型或者枚舉類型語句序列:允許有多條語句<表達(dá)式>:可以為任何表達(dá)式功能:

先計(jì)算<表達(dá)式>的值,再從上到下地判斷與哪一個(gè)<常量表達(dá)式>的值相等,如果<表達(dá)式>的值等于<常量表達(dá)式i>的值,則從語句序列i開始執(zhí)行,直到語句序列(n+1)為止;若<表達(dá)式>的值不等于任何一個(gè)<常量表達(dá)式>的值,是執(zhí)行default后面的語句序列(n+1)。03:5420/39switch語句一般形式的流程圖:?03:5421/39【例4-6】根據(jù)下面表所示的天氣情況,決定活動(dòng)的場所。

分別用整數(shù)0、1、2和3代表下雨、下雪、晴天和有風(fēng)無雨天氣。采用switch語句的一般形式.03:5422/39例4-6switch語句一般形式的流程圖03:5423/39根據(jù)圖所示的流程圖寫出的程序如下所示:/*exam4_6.c根據(jù)天氣情況決定活動(dòng)場所*/#include<stdio.h>main(){intweather;scanf("%d",&weather);switch(weather){ case0:printf("rain----atpalaestra\n");case1:printf("snow----atplayground\n");case2:printf("fine----athill\n");case3:printf("wind----tooutskirt\n");default:printf("other----athome\n");}}03:5424/39程序運(yùn)行結(jié)果:輸入:2輸出:fine----athillwind----tooutskirtother----athome

發(fā)現(xiàn),如果輸入的天氣值為0,即天氣情況為下雨,則活動(dòng)場所為所有地方,顯然這是與題意不相符合的,程序是錯(cuò)誤的。解決這個(gè)問題必須要用到分支語句:break。03:5425/39§4.2.2break語句在switch語句中的作用

如果是一個(gè)條件對(duì)應(yīng)著一組獨(dú)立的操作,那么在switch語句的一般形式中,每一個(gè)<語句序列>完成后都要加上一條分支語句:break;switch條件分支互相獨(dú)立的形式:switch(<表達(dá)式>){case<常量表達(dá)式1>:<語句序列1>;break;case<常量表達(dá)式2>:<語句序列2>;

break;case<常量表達(dá)式i>:<語句序列i>;

break;……case<常量表達(dá)式n>:<語句序列n>;

break;default:<語句序列n+1>;}03:5426/39Switch結(jié)構(gòu)實(shí)現(xiàn)了完全地獨(dú)立分支,功能:

先計(jì)算<表達(dá)式>的值,再從上到下地判斷與哪一個(gè)<常量表達(dá)式>的值相等,如果<表達(dá)式>的值等于<常量表達(dá)式>i的值,則執(zhí)行<語句序列>i,執(zhí)行完后,跳出switch結(jié)構(gòu),執(zhí)行switch結(jié)構(gòu)外的下一條語句.03:5427/39【例4-7】將例4-6改寫成具有獨(dú)立分支的switch結(jié)構(gòu)。#include<stdio.h>main(){intweather;scanf("%d",&weather);switch(weather) { case0:printf("rain----atpalaestra\n"); break; case1:printf("snow----atplayground\n"); break; case2:printf("fine----athill\n"); break; case3:printf("wind----tooutskirt\n"); break; default:printf("other----athome\n"); }

}

程序運(yùn)行時(shí),任何一種天氣情況都只會(huì)對(duì)應(yīng)出現(xiàn)一種運(yùn)動(dòng)場所.03:5428/39【例4-8】從鍵盤輸入一個(gè)字符,判斷其是否為a(可代表abort)或r(可代表retry)或f(可代表fail),并輸出相應(yīng)信息。(輸入時(shí)不區(qū)分大小寫)。采用switch結(jié)構(gòu),其算法流程圖如圖:03:5429/39/*exam4_8.c字符輸入判斷*/#include<stdio.h>main(){charch;printf("Abort,Retry,Fail?\n");ch=getchar();switch(ch){ case'a':

case'A':printf("\nAbort\n"); break; case'r': case'R':printf("\nRetry\n"); break; case'f': case'F':printf("\nFail\n"); break; default:printf("\nerror\n");}}03:5430/39§4.3程序范例

【例4-9】求解任意的一元二次方程ax2+bx+c=0的根,a、b、c的值由鍵盤輸入。分析:對(duì)系數(shù)a、b、c考慮以下情形1)a==0:①b<>0,則x=-c/b;②b=0,則:若c=0,則x無定根;若c<>0,則x無解。2)a<>0;①b2-4ac>0,有兩個(gè)不等的實(shí)根;②b2-4ac=0,有兩個(gè)相等的實(shí)根;③b2-4ac<0,有兩個(gè)共軛復(fù)根。采用嵌套的if結(jié)構(gòu),考慮算法流程圖?03:5431/3903:5432/39/*exam4_9.c求一元二次方程的根*/#include<math.h>#include<stdio.h>main(){floata,b,c,s,x1,x2;doublet;printf("pleaseinputa,b,c:\n");scanf("%f%f%f",&a,&b,&c);if(a==0.0)if(b!=0.0)printf("therootis:%5.2f\n",-c/b);elseif(c==0.0)printf("xisinexactive\n");03:5433/39

elseprintf("noroot!\n");else{s=b*b-4*a*c;if(s>=0.0) if(s>0.0) { t=sqrt(s); x1=-0.5*(b+t)/a; x2=-0.5*(b-t)/a; printf("Therearetwodifferentroots:\n%5.2fand%5.2f\n",x1,x2); }03:5434/39

else printf("Therearetwoequalroots:\n%5.2f\n",-0.5*b/a); else { t=sqrt(-s); x1=-0.5*b/a; x2=abs(0.5*t/a); printf("Therearetwovirtualroots:\n"); printf("%5.2f+%5.2fi\t\t%5.2f-%5.2fi\n",x1,x2,x1,x2); }}}03:5435/39【例4-10】運(yùn)輸費(fèi)用的計(jì)算問題。距離S越遠(yuǎn),每公里的運(yùn)費(fèi)越低。設(shè)每公里每噸貨物的基本運(yùn)費(fèi)為P,貨物重量為W(噸),距離為S,折扣為d,則總運(yùn)輸費(fèi)用f的計(jì)算公式為:f=P*W*S*(1-d)。其中折扣數(shù)d與距離有關(guān),具體標(biāo)準(zhǔn)如下:0<S<250km沒有折扣250

S<500折扣2%500

S<1000折扣5%1000

S<20

溫馨提示

  • 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)論