C語言三種程序結(jié)構(gòu).ppt
2020年4月25日星期六,游志宇,電子科技大學(xué)成都學(xué)院微電子系,第四講,4.1順序結(jié)構(gòu),什么是順序結(jié)構(gòu)?,程序按語句的先后順序依次執(zhí)行的程序,例子:輸入三角形的三邊長(zhǎng),求三角形面積。,假設(shè)三個(gè)邊長(zhǎng)a,b,c能構(gòu)成三角形。則面積公式為:area=s=(a+b+c)*0.5,#include#includevoidmain()floata,b,c,s,area;scanf(“%f,%f,%f,數(shù)學(xué)函數(shù)庫因?yàn)橐玫狡渲械膕qrt函數(shù),4.1順序結(jié)構(gòu),例從鍵盤輸入一個(gè)大寫字母,要求改用小寫字母輸出。includevoidmain()char,;getchar();printf(,);printf(,);,運(yùn)行情況:,,4.1順序結(jié)構(gòu),例求x2方程的根。a,b,c由鍵盤輸入,且設(shè)。眾所周知,一元二次方程式的根為x1=x2=可以將上面的分式分為兩項(xiàng):p=,q=x1=p+q,x2=p-q,4.1順序結(jié)構(gòu),#include#includevoidmain()floata,b,c,disc,x1,x2,p,q;scanf("a=%f,b=%f,c=%f",運(yùn)行情況:,,4.1順序結(jié)構(gòu),4.2選擇結(jié)構(gòu),選擇結(jié)構(gòu)是3種基本結(jié)構(gòu)之一。,選擇結(jié)構(gòu)的作用:根據(jù)所指定的條件是否滿足,決定從給定的操作中選擇其一執(zhí)行;在C語言中選擇結(jié)構(gòu)是由if語句和switch語句實(shí)現(xiàn)的。正確使用選擇結(jié)構(gòu),需要充分理解關(guān)系表達(dá)式和邏輯表達(dá)式。,4.2選擇結(jié)構(gòu),一、if語句,if語句是用來判斷所給條件是否滿足,然后根據(jù)結(jié)果決定執(zhí)行給出的操作。,if語句最常用的有三種基本形式,(1)if(表達(dá)式)語句例:if(x>y)printf(“%d”,x);,4.2選擇結(jié)構(gòu),#includevoidmain()floata,b,t;scanf(“%f,%f”,4.2選擇結(jié)構(gòu),例輸入兩個(gè)實(shí)數(shù),按代數(shù)值由小到大的順序輸出這兩個(gè)數(shù)。,例輸入三個(gè)數(shù)a,b,c,要求按由小到大的順序輸出。,用偽代碼寫的算法為:ifa>b將a和b對(duì)換,a中保存a、b中的小者;ifa>c將a和c對(duì)換,a中保存a、c中的小者;ifb>c將b和c對(duì)換,b中保存b、c中的小者;,4.2選擇結(jié)構(gòu),#includevoidmain()floata,b,c,t;scanf(“%f,%f,%f”,4.2選擇結(jié)構(gòu),(2)if(表達(dá)式)語句1else語句2例:if(x>y)printf(“%d”,x);elseprintf(“%d”,y);,4.2選擇結(jié)構(gòu),if(表達(dá)式1)語句1elseif(表達(dá)式2)語句2elseif(表達(dá)式3)語句3elseif(表達(dá)式m)語句melse語句n,4.2選擇結(jié)構(gòu),例:if(number>500)cost=0.15;elseif(number>300)cost=0.10;elseif(number>100)cost=0.075;elseif(number>50)cost=0.05;elsecost=0;,4.2選擇結(jié)構(gòu),說明:(1).3種形式的if語句中,在if后面都有表達(dá)式,一般為邏輯表達(dá)式或關(guān)系表達(dá)式。注:在執(zhí)行if語句時(shí),先對(duì)表達(dá)式求解,然后根據(jù)表達(dá)式的值,執(zhí)行指定的語句。(2).第二,第三種形式的if語句中,在每個(gè)else前面有一個(gè)分號(hào),整個(gè)語句結(jié)束處有一個(gè)分號(hào)。(3).在if和else后面可以只含有一個(gè)內(nèi)嵌的操作語句,也可以由多個(gè)操作語句,此時(shí)用花括號(hào)將幾個(gè)語句括起來成為一個(gè)復(fù)合語句。,4.2選擇結(jié)構(gòu),二.if語句的嵌套在if語句中又包含一個(gè)或多個(gè)if語句稱為if語句的嵌套。形式:if()if()語句1else語句2elseif()語句3else語句4,內(nèi)嵌if,4.2選擇結(jié)構(gòu),-1(x0)算法1:算法2:輸入x輸入x若x0,則y=1若x=0,則y=0輸出y若x>0,則y=1輸出y,4.2選擇結(jié)構(gòu),#includevoidmain()intx,y;scanf(“%d”,4.2選擇結(jié)構(gòu),上例中的程序段有四個(gè),請(qǐng)判斷哪個(gè)是正確的?程序1:程序2:if(x=0)y=-1;if(x>0)elsey=1;if(x=0)elsey=0;y=0;elseelsey=1;y=-1;程序3:程序4:y=-1;y=0;if(x!=0)if(x>=0)if(x>0)if(x>0)y=1;y=1;elseelsey=0;y=-1;,正確,正確,錯(cuò)誤,錯(cuò)誤,4.2選擇結(jié)構(gòu),例寫程序,判斷某一年是否閏年。用下圖來表示判斷閏年的算法。,能被4整除,但不能被100整除。能被4整除,又能被400整除,#includevoidmain()intyear,leap;scanf("%d",if(year?。﹍eap;elseif(year!)leap;elseif(year!)leap;elseleap;,/也可以用一個(gè)邏輯表達(dá)式包含所有的閏年條件,/將上述if語句用下面的if語句代替:if(year%4=0elseleap=0;,if(leap)printf("%dis",year);elseprintf("%disnot",year);printf("aleapyear.n");,運(yùn)行情況:.,三.Switch語句,4.2選擇結(jié)構(gòu),switch語句是多分支語句,用來實(shí)現(xiàn)多分支選擇結(jié)構(gòu)。if語句只有兩個(gè)分支可共選擇。在實(shí)際問題中,我們經(jīng)常會(huì)遇到多分支選擇的問題,因此引入多分支語句switch。例如:學(xué)生成績(jī)分類(90分以上為a等,8089分為b等,7079分為c等);人口統(tǒng)計(jì)分類(按年齡分為老、中、青、少、兒童);工資統(tǒng)計(jì)分類;銀行存款分類。當(dāng)然多分支選擇也可以用if語句嵌套來解決,但如果分支過多,則嵌套的if語句層數(shù)就多,程序冗長(zhǎng)而可讀性降低。,4.2選擇結(jié)構(gòu),switch語句的格式:switch(表達(dá)式)case常量表達(dá)式:語句case常量表達(dá)式:語句case常量表達(dá)式:語句default:語句,說明:switch后面括弧內(nèi)的“表達(dá)式”,允許它為任何類型。(2)當(dāng)表達(dá)式的值與某一個(gè)case后面的常量表達(dá)式的值相等時(shí),就執(zhí)行此case后面的語句,若所有的case中的常量表達(dá)式的值都沒有與表達(dá)式的值匹配的,就執(zhí)行default后面的語句。(3)每一個(gè)case的常量表達(dá)式的值必須互不相同,否則就會(huì)出現(xiàn)互相矛盾的現(xiàn)象(對(duì)表達(dá)式的同一個(gè)值,有兩種或多種執(zhí)行方案)。,4.2選擇結(jié)構(gòu),4.2選擇結(jié)構(gòu),(4)各個(gè)case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。例如,可以先出現(xiàn)“default:”,再出現(xiàn)“caseXX:”,然后是“caseAA:”。(5)執(zhí)行完一個(gè)case后面的語句后,流程控制轉(zhuǎn)移到下一個(gè)case繼續(xù)執(zhí)行?!癱ase常量表達(dá)式”只是起語句標(biāo)號(hào)作用,并不是在該處進(jìn)行條件判斷。在執(zhí)行switch語句時(shí),根據(jù)switch后面表達(dá)式的值找到匹配的入口標(biāo)號(hào),就從此標(biāo)號(hào)開始執(zhí)行下去,不再進(jìn)行判斷。,例運(yùn)輸公司對(duì)用戶計(jì)算運(yùn)費(fèi)。設(shè)每公里每噸貨物的基本運(yùn)費(fèi)為,貨物重為,距離為,折扣為,則總運(yùn)費(fèi)的計(jì)算公式為:*()路程()越遠(yuǎn),每公里運(yùn)費(fèi)越低。假設(shè)標(biāo)準(zhǔn)如下:沒有折扣折扣折扣折扣折扣折扣,4.2選擇結(jié)構(gòu),分析折扣變化的規(guī)律性:折扣的“變化點(diǎn)”都是250的倍數(shù)(250,500,1000,2000,3000)利用這一特點(diǎn),可以在橫軸上加一種坐標(biāo)c,c的值為S/250,c代表250的倍數(shù)。當(dāng):c<1時(shí),表示S<250,無折d=0;1c2時(shí),表示250S<500,折扣d=2;2c4時(shí),表示500S<1000,折扣d=5;4c8時(shí),表示1000S<2000,折扣d=8;8c12時(shí),表示2000S<3000,折扣d=10;c12時(shí),表示3000S,折扣d=15。,4.2選擇結(jié)構(gòu),4.2選擇結(jié)構(gòu),據(jù)此寫出程序如下:#includevoidmain()intc,S;floatp,w,d,f;printf(“請(qǐng)輸入基本運(yùn)費(fèi)P、貨物重量W及運(yùn)輸距離S:n”)scanf("f,f,d",i=1;loop:if(i<=100)sum=sum+i;i+;gotoloop;printf("%dn,sum);,4.3.2用while語句實(shí)現(xiàn)循環(huán),while語句用來實(shí)現(xiàn)“當(dāng)型”循環(huán)結(jié)構(gòu)。其一般形式:while(表達(dá)式)語句當(dāng)表達(dá)式為非0值時(shí),執(zhí)行while語句中的內(nèi)嵌語句。其特點(diǎn)是:先判斷表達(dá)式,后執(zhí)行語句。,流程圖,例求1到100的和#includevoidmain()inti,sum=0;i=1;while(i<=100)sum=sum+i;i+;printf(%dn,sum);,說明:(1)循環(huán)體如果包含一個(gè)以上的語句,應(yīng)該用花括弧括起來,以復(fù)合語句形式出現(xiàn).(2)在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句。,運(yùn)行結(jié)果:5050,注意:循環(huán)體如果包含一個(gè)以上的語句,應(yīng)該用花括號(hào)括起來,以復(fù)合語句形式出現(xiàn)。如果不加花括號(hào),則while語句的范圍只到while后面的第一個(gè)分號(hào)處。在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句。如果無此語句,則i的值始終不改變,循環(huán)永不結(jié)束。(成為無限循環(huán)),4.3.3用do-while語句實(shí)現(xiàn)循環(huán),do-while語句的特點(diǎn):先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。其一般形式:do循環(huán)體語句while(表達(dá)式);,執(zhí)行過程:先執(zhí)行一次指定的循環(huán)體語句,然后判別表達(dá)式,當(dāng)表達(dá)式的值為非零(“真”)時(shí),返回重新執(zhí)行循環(huán)體語句,如此反復(fù),直到表達(dá)式的值等于0為止,此時(shí)循環(huán)結(jié)束。,流程圖,#includevoidmain()inti,sum=0;i=1;dosum=sum+i;i+;while(i<=100);printf("%dn,sum);,運(yùn)行結(jié)果:5050,例求1到100的和,從上面例題可以看到:對(duì)同一個(gè)問題可以用while語句處理,也可以用do-while語句處理。在一般情況下,用while語句和用do-while語句處理同一問題時(shí),若二者的循環(huán)體部分是一樣的,它們的結(jié)果也一樣。但是如果while后面的表達(dá)式一開始就為假(0值)時(shí),兩種循環(huán)的結(jié)果是不同的。,例while和do-while循環(huán)的比較(1)#include(2)#includevoidmain()voidmain()intsum=0,i;intsum=0,i;scanf(“%d,,運(yùn)行結(jié)果:1sum=55再運(yùn)行一次:11sum=0,運(yùn)行結(jié)果:1sum=55再運(yùn)行一次:11sum=11,說明:當(dāng)while后面的表達(dá)式的第一次的值為“真”時(shí),兩種循環(huán)得到的結(jié)果相同。否則,二者結(jié)果不相同。,4.4用for語句實(shí)現(xiàn)循環(huán),C語言中的for語句使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以代替while語句。其一般形式:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句,4.4用for語句實(shí)現(xiàn)循環(huán),For循環(huán)的執(zhí)行過程:(1)先求解表達(dá)式1。(2)求解表達(dá)式2,若其值為真(值為非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第(3)步。若為假(值為0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。(3)求解表達(dá)式3。(4)轉(zhuǎn)回上面第(2)步驟繼續(xù)執(zhí)行。(5)循環(huán)結(jié)束,執(zhí)行for語句下面的一個(gè)語句,for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句,4.4用for語句實(shí)現(xiàn)循環(huán),循環(huán)初始條件,循環(huán)控制條件,循環(huán)體,for語句等價(jià)于下列語句:表達(dá)式1;while(表達(dá)式2)語句;表達(dá)式3;,for語句最簡(jiǎn)單的應(yīng)用形式也就是最易理解的如下形式:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)循環(huán)體;,例如:求1到100的和,它相當(dāng)于以下語句:i=1;while(i<=100)sum=sum+i;i+;,顯然,用for語句簡(jiǎn)單、方便。,for(i=1;i<=100;i+)sum=sum+i;,例:求(即求1!+2!+3!+.+20!),#includevoidmain()floats=0,t=1;intn;for(n=1;n100時(shí),執(zhí)行break語句,提前結(jié)束循環(huán),即不再繼續(xù)執(zhí)行其余的幾次循環(huán)。,4.5break語句和continue語句,4.5.2continue語句作用為結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定.一般形式:continue;,4.5break語句和continue語句,continue語句和break語句的區(qū)別:continue語句只結(jié)束本次循環(huán),而不是終止整個(gè)循環(huán)的執(zhí)行。,while(表達(dá)式1)if(表達(dá)式2)continue;,流程圖,4.5break語句和continue語句,continue語句和break語句的區(qū)別:break語句則是結(jié)束整個(gè)循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立。,while(表達(dá)式1)if(表達(dá)式2)break;,流程圖,例把100200之間的不能被3整除的數(shù)輸出。#includevoidmain()intn;for(n=100;n<=200;n+)if(n%3=0)continue;printf("%d,n);,說明:當(dāng)n能被3整除時(shí),執(zhí)行continue語句,結(jié)束本次循環(huán)(即跳過printf函數(shù)語句),只有n不能被3整除時(shí)才執(zhí)行printf函數(shù)。,說明:例中循環(huán)體也可以改用一個(gè)if語句處理:if(n%3!=0)printf(“%d”,n);,題目:打印出所有的“水仙花數(shù)”,所謂“水仙花數(shù)”是指一個(gè)3位數(shù),其各位數(shù)字立方和等于該數(shù)本身。例如,153是一水仙花數(shù),因?yàn)椋?53=13+53+33。,程序分析:利用for循環(huán)控制100-999之間的數(shù),每個(gè)數(shù)分解出個(gè)位,十位,百位,#includevoidmain()inti,j,k,n;printf(“waterflowernumberis:n");for(n=100;n<1000;n+)i=n/100;/*分解出百位*/j=n/10%10;/*分解出十位*/k=n%10;/*分解出個(gè)位*/if(i*100+j*10+k=i*i*i+j*j*j+k*k*k)printf("%-5d",n);printf(“n");,題目:有1、2、3、4共四個(gè)數(shù)字,能組成多少個(gè)互不相同且無重復(fù)數(shù)字的三位數(shù)?都是多少?,程序分析:可填在百位、十位、個(gè)位的數(shù)字都是1、2、3、4。組成所有的排列后再去掉不滿足條件的排列。,#includevoidmain()inti,j,k;printf("n");for(i=1;i<5;i+)/以下為三重循環(huán)for(j=1;j<5;j+)for(k=1;k<5;k+)/*確保i、j、k三位互不相同*/if(i!=k,題目:猜數(shù)游戲(掌握程序結(jié)構(gòu)及隨機(jī)函數(shù)應(yīng)用)程序說明:游戲的開始由機(jī)器產(chǎn)生一個(gè)隨機(jī)數(shù)(1100之間,用庫函數(shù)srand(),rand()),然后游戲者在程序的提示下猜數(shù),若輸入的數(shù)比這個(gè)數(shù)大,程序提示:YouranswerisHIGH,tryagain.,否則,程序提示:YouranswerisLOW,tryagain.,直到猜對(duì)為止。程序可實(shí)現(xiàn)連續(xù)猜數(shù),直到游戲者退出。voidsrand(unsignedseed)初始化隨機(jī)數(shù)發(fā)生器intrand()產(chǎn)生一個(gè)隨機(jī)數(shù)并返回這個(gè)數(shù)system("cls");/清屏DOS命令fflush(stdin);/清除內(nèi)存getch();/從控制臺(tái)獲取一個(gè)字符,不顯示在屏幕上,題目:百錢百雞(窮舉算法)我國(guó)古代數(shù)學(xué)家張丘鍵在算經(jīng)中出了一道題“雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一。百錢買百雞,問雞翁、雞母、雞雛各幾何?注:窮舉法是最簡(jiǎn)單、最常見的一種程序設(shè)計(jì)方法。它充分利用了計(jì)算機(jī)處理的高速特性。使用窮舉法的關(guān)鍵是確定正確的窮舉范圍,即不能過分?jǐn)U大、也不能過分縮小窮舉的范圍。,題目:簡(jiǎn)單計(jì)算器請(qǐng)編寫一個(gè)程序計(jì)算表達(dá)式:data1opdata2的值。其中,op為運(yùn)算符、*、/。,TheEnd,Thanks!,