版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第三章
順序和選擇結(jié)構(gòu)程序設(shè)計
了解C語言程序的特點C程序的三種基本結(jié)構(gòu)能編寫簡單的順序結(jié)構(gòu)程序。熟練掌握if語句的三種形式,掌握if語句的基本結(jié)構(gòu)以及if語句的嵌套,并能將條件運算符給出的語句轉(zhuǎn)化成if語句的形式。掌握switch語句的一般形式,并能把復(fù)雜的分支選擇性結(jié)構(gòu)化成switch語句來解決問題。本章重點3.1程序設(shè)計概述程序設(shè)計的最終目的是能在計算機上計算出正確的結(jié)果來。1969年,Dijkstra首先提出了結(jié)構(gòu)程序設(shè)計的概念,強調(diào)從程序的結(jié)構(gòu)和風(fēng)格上來研究和設(shè)計程序。首先應(yīng)從全局上把握系統(tǒng)所具備的功能是什么,并將系統(tǒng)劃分成幾個相對獨立的子系統(tǒng),而每個子系統(tǒng)只涉及局部的環(huán)境和條件。然后,進入第二步的實現(xiàn)階段,即進行編碼。在第一階段,只要知道“做什么”,而在實現(xiàn)階段,才考慮“如何做”。3.流程控制語句
結(jié)構(gòu)化程序設(shè)計的基本思想是任何程序都可以用三種基本結(jié)構(gòu)來實現(xiàn),即順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)的程序流程是按語句書寫的順序依次執(zhí)行。選擇結(jié)構(gòu)是根據(jù)給定條件進行判斷,由判斷的結(jié)果決定執(zhí)行兩條或多條路徑中的一條。循環(huán)結(jié)構(gòu)是在給定條件成立的情況下反復(fù)執(zhí)行某個程序段,該程序段稱為”循環(huán)體”。實現(xiàn)上述各種程序流程的語句稱為流程控制語句。順序結(jié)構(gòu):其按語句書寫的先后順序依次執(zhí)行。例:輸入兩個變量,交換兩者的值后輸出。#include<stdio.h>voidmain(){ intx,y,z;printf("pleaseinputxandy:\n");scanf("%d,%d",&x,&y);printf("x=%d,y=%d\n",x,y);z=x;x=y;y=z;printf("x=%d,y=%d\n",x,y);}選擇結(jié)構(gòu):程序的執(zhí)行流程根據(jù)給定條件進行判斷,由判斷的結(jié)果決定在兩支或多支程序段中選擇一條分支執(zhí)行,程序執(zhí)行流程見圖3-3。
圖3-3選擇結(jié)構(gòu)流程圖
循環(huán)結(jié)構(gòu):在給定條件成立的情況下程序的執(zhí)行流程反復(fù)執(zhí)行某個程序段,這種程序結(jié)構(gòu)稱為循環(huán)結(jié)構(gòu),其有兩種實現(xiàn)形式:①“當型”循環(huán)結(jié)構(gòu)。即當條件成立就執(zhí)行循環(huán)。②“直到型”循環(huán)結(jié)構(gòu)。即執(zhí)行循環(huán)直到條件不成立時才停止循環(huán)?!爱斝汀毖h(huán)流程圖“直到型”循環(huán)流程圖C語言有9種控制語句①if-else(條件語句)②for()(循環(huán)語句)③while()(循環(huán)語句)④do-while()(循環(huán)語句)⑤continue(結(jié)束本次循環(huán)語句)⑥break(中止執(zhí)行switch或循環(huán)語句)⑦switch(多分支選擇語句)⑧goto(轉(zhuǎn)向語句)⑨return(從函數(shù)返回語句)1.表達式語句任何一個表達式加上一個分號就可以組成一條語句。例如:
表達式表達式語句
a=b+c*(d+3)a=b+c*(d+3);
a+b+ca+b+c;
i++i++;3.3C語句函數(shù)調(diào)用也是表達式,在其后加一個分號,就變成了函數(shù)調(diào)用語句。
eg:printf函數(shù)調(diào)用語句和scanf函數(shù)調(diào)用語句小結(jié):在表達式之后加一個分號,從而構(gòu)成一個語句,這是C語言的一個特色。它使C語言的程序設(shè)計的表達能力更強。2.復(fù)合語句
定義:將多個相關(guān)聯(lián)的簡單語句用一對大括號括起來就構(gòu)成了復(fù)合語句,在程序中當作一個語句看待。例如:{a=1.0;b=2.0;i++;}3.4if條件語句
1.if結(jié)構(gòu)2.if-else結(jié)構(gòu)3.if-else-if結(jié)構(gòu)3.4.1if結(jié)構(gòu)if結(jié)構(gòu)的一般格式為:if(表達式)語句功能:首先計算表達式的值,若其值為非0(即“真”),則執(zhí)行表達式后的語句;若其值為0(即“假”),則跳過這個語句去執(zhí)行if語句的后繼語句。注:if(表達式)后面的語句只能是一個語句或一個復(fù)合語句。流程圖假(0)表達式為真嗎?執(zhí)行語句真(非0)入口表達式為真嗎?執(zhí)行語句真(非0)假(0)入口#include<stdio.h>voidmain(){floatr;printf(“Inputtheradius:”);scanf(“%f”,&r);
if(r>0)printf(“area=%f\n”,3.14159*r*r);}例:從鍵盤輸入圓的半徑,若半徑小于等于0,則不進行計算;否則,計算圓面積。例:從鍵盤輸入圓的半徑,若為10,則計算圓的面積,若為20,則計算圓的周長。若既不等于10又不等于20,則不進行計算。
#include<stdio.h>voidmain(){floatr;printf("Inputtheradiut:");scanf("%f",&r);
if(r==10)printf("Area=%f\n",3.14159*r*r);
if(r==20)printf("Cycle=%f\n",2.0*3.14159*r);}例:輸入兩個實數(shù),按由大到小的順序輸出這兩個數(shù)。
#include<stdio.h>voidmain(){floata,b;scanf("%f,%f",&a,&b);
if(a>b)printf("%f,%f",a,b);
if(a<b)printf("%f,%f",b,a);}分析:輸入兩個實數(shù)時,這兩個實數(shù)的大小順序是任意的。但是題中要求輸出的順序是由大到小。若a>b,則先a后b;若a<b,則先b后a。用交換變量值的方法按順序輸出這兩個數(shù)交換變量值的思想:不改變變量名,但變量值可改變的性質(zhì)。若a的值大于b的值,則a與b的值不交換;若a的值小于b的值,則兩者互相交換值。從而使得無論何時,變量a的值始終大于變量b的值。最后,按先a后b的順序輸出,即可實現(xiàn)按由大到小的順序輸出的功能。實現(xiàn)方法:為了能夠進行相互交換,必須引進一個臨時變量t。用以下三個賦值語句可實現(xiàn)交換。
t=a;a=b;b=t;/*t=a,a=b,b=t;*/程序如下:#include<stdio.h>voidmain(){floata,b,t;printf("Pleaseinputtwonumbers:\n");scanf("%f%f",&a,&b);
if(a<b){t=a;a=b;/*復(fù)合語句*/b=t;}printf("%f,%f",a,b);}3.4.2if-else結(jié)構(gòu)if-else結(jié)構(gòu)的一般格式為:if(表達式)語句1else語句2功能:首先計算表達式的值,若其值為非0,則執(zhí)行語句1,然后跳過語句2,往下執(zhí)行if結(jié)構(gòu)的后繼語句;若其值為0,則跳過語句1,執(zhí)行語句2,然后往下執(zhí)行if結(jié)構(gòu)的后繼語句。注意:語句1和語句2分別都是一個語句或一個復(fù)合語句。流程圖假(0)表達式為真嗎?執(zhí)行語句1真(非0)入口執(zhí)行語句2例:求a、b中的最大值。#include<stdio.h>voidmain(){inta,b,max;scanf(“%d%d”,&a,&b);
if(a>b)max=a;
elsemax=b;printf(“Maxumis%d”,max);}例:輸入一個正整數(shù),判斷這個數(shù)是奇數(shù)還是偶數(shù)。#include<stdio.h>voidmain(){intnumber;printf("Inputanumberfortesting:");scanf("%d",&number);
if(number%2==1)printf("%disodd.\n",number);
else
printf("%diseven.\n",number);}分析:因為對一個正整數(shù),不是奇數(shù)就是偶數(shù),只有兩種選擇,故使用if-else結(jié)構(gòu)語句。3.4.3if-else-if結(jié)構(gòu)if-else-if結(jié)構(gòu)的一般格式為:if(表達式1)語句1elseif(表達式2)語句2elseif(表達式3)語句3…else語句n注:每當選擇其中一個語句執(zhí)行完以后,整個if-else-if語句就結(jié)束了,然后執(zhí)行if-else-if語句的后繼語句流程圖例:輸入一個x值,求下列相應(yīng)的y值#include<stdio.h>voidmain(){floatx,y;scanf(“%f”,&x);
if(x>0)y=1.0;
elseif(x<0)y=-1.0;
elsey=0;printf(“y=%f\n”,y);}-1.0(x<0)0(x=0)1.0(x>0)y=運行結(jié)果:-88y=-1.0000003.4.4if語句的嵌套
條件語句的嵌套就是在if語句中包含另一個if語句。
從語法上講,if語句中所包含的語句是一個語句或一個復(fù)合語句,這個語句當然也可以是另一個if語句,即內(nèi)嵌if語句。例:輸入一個任意整數(shù)i,試判斷這個數(shù)是奇數(shù)還是偶數(shù)?分析:先判斷這個數(shù)是否為正數(shù),在正數(shù)(i>0)的前提下,再判斷:若i能被2整除,則i為偶數(shù);若i不能被2整除,則i為奇數(shù)??蓪懗鋈缦耰f語句:if(i>0)
if(i%2==0)/*i>0&&(i%2==0)*/printf("positiveandeven\n");/*正數(shù)且偶數(shù)*/else
/*否則,i>0&&(i%2!=0)*/printf(“postiveandodd\n”);/*正數(shù)且奇數(shù)*/elseprintf(“notpositive\n”);
else與前面最近(未曾配對)的if配對。如果要改變上頁中所確定的配對關(guān)系,即else要與外層的if配對,則第二個if語句必須用花括號括起來。例如:if(i>0){
if(i%2==0)printf(“positiveandeven\n”);}elseprintf(“notpositive\n”);C語言規(guī)定的配對關(guān)系花括號將內(nèi)嵌的if語句孤立,形成一個獨立的復(fù)合語句,使內(nèi)嵌的if不與后面的else配對,從而else必定與外一層的if配對
#include<stdio.h>voidmain(){floata,b,c,max;scanf(“%f%f%f”,&a,&b,&c);if(a>b){if(a>c)max=a;elsemax=c;}else{if(b>c)max=b;elsemax=c;}printf(“Max=%f\n”,max);}說明:(1)程序引進了一個中間變量max,用以存放最大數(shù)。(2)嵌套在內(nèi)層的if語句可以不用花括號括起來。但為了使結(jié)構(gòu)更清晰,添加花括號也決不是多余的。例:從鍵盤輸入三個實數(shù),求其最大者。修改后的程序:
#include<stdio.h>voidmain(){floata,b,c,max;scanf("%f%f%f",&a,&b,&c);if(a>b)max=(a>c)?a:c;elsemax=(b>c)?b:c;printf("Max=%f\n",max);}3.4.1if結(jié)構(gòu)if結(jié)構(gòu)的一般格式為:if(表達式)語句注:if(表達式)后面的語句只能是一個語句或一個復(fù)合語句。3.4.2if-else結(jié)構(gòu)if-else結(jié)構(gòu)的一般格式為:if(表達式)語句1else語句2注意:語句1和語句2分別都是一個語句或一個復(fù)合語句。3.4.3if-else-if結(jié)構(gòu)if-else-if結(jié)構(gòu)的一般格式為:if(表達式1)語句1elseif(表達式2)語句2elseif(表達式3)語句3…else語句n注:每當選擇其中一個語句執(zhí)行完以后,整個if-else-if語句就結(jié)束了,然后執(zhí)行if-else-if語句的后繼語句3.5switch語句在if語句中,用if-else-if結(jié)構(gòu)可以解決多分支的選擇問題。但是,如果判斷條件太多,程序冗長,邏輯關(guān)系就變得不夠清晰。C語言中提供的switch語句可用于解決過多分支的問題。switch語句的一般格式為:switch(表達式){case常量表達式1:語句塊1break;case常量表達式2:語句塊2break;…case常量表達式n:語句塊nbreak;default:語句塊n+1break;}功能:
(1)執(zhí)行switch語句時,首先計算表達式的值,然后將此值與case后面的常量表達式的值相比較,如果某個常量表達式的值與它相等,則執(zhí)行該case后的語句塊;如果表達式的值與所有常量表達式的值都不相等,則執(zhí)行default后的語句塊。當執(zhí)行完某一個case語句塊后遇到break或執(zhí)行完default語句塊時,就跳出switch語句。case結(jié)構(gòu)與else-if結(jié)構(gòu)的對比if(a==1)printf("A");elseif(a==2)printf("B");elseif(a==3)printf("C");elseprintf("D");switch(a){case1:printf("A");break;case2:printf("B");break;case3:printf("C");break;default:printf("D");}(2)如果執(zhí)行完某一個case的語句塊后沒有遇到break語句,就進入到下一個case的語句塊或進入到default后的語句塊去執(zhí)行。switch(a){case1:printf(“A”);case2:printf("B");break;case3:printf("C");break;default:printf("D");}
if(a==1){printf("A");printf("B");}elseif(a==2)printf("B");elseif(a==3)printf("C");elseprintf("D");(3)多個case可以共用一個語句塊switch(a){case1:case2:case3:printf("A");break;…}
if(a==1||a==2||a==3)printf("A");elseif…幾點說明:(1)switch后的表達式的值一般是整型或字符型(2)case后的表達式是可以求得整型量或字符型量的常量表達式。常量表達式中不允許包含有變量和函數(shù)調(diào)用。(3)default通常出現(xiàn)在switch的最后部分。但這不是它的唯一位置。default可以出現(xiàn)在case之間,甚至出現(xiàn)在所有的case之前,但等效于出現(xiàn)在switch的最后部分。switch語句例:寫出下面程序的輸出結(jié)果.#include<stdio.h>voidmain(){ intx; scanf(“%d”,&x); switch(x) { case5:printf(“excellent”); case4:printf(“Good”); break; case3:printf(“Pass”);case2:printf(“Fail”);/*break;*/ default:printf(“Poor”); }}若從鍵盤輸入3輸出為:PassFailPoor程序設(shè)計舉例
例:輸入三個整數(shù)x,y,z,請把這三個數(shù)由小到大輸出#include<stdio.h>voidmain(){
intx,y,z,t;
scanf("%d,%d,%d",&x,&y,&z);
if(x>y){t=x;x=y;y=t;}/*交換x,y的值*/
if(x>z){t=z;z=x;x=t;}/*交換x,z的值*/
if(y>z){t=y;y=z;z=t;}/*交換z,y的值*/
printf("smalltobig:%d%d%d\n",x,y,z);}分析:若想辦法把最小的數(shù)放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,然后再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小。本題是采用依次比較的方法排出大小順序。例:某產(chǎn)品的國內(nèi)銷售價,80箱以下,每箱350元,超過80箱,超過部分每箱優(yōu)惠20元;國外銷售價,1000箱以下,每箱900元,超過1000箱,超過部分每箱優(yōu)惠15元。試編寫計算銷售額的程序。分析:題中產(chǎn)品分國內(nèi)、國外兩種銷售價格,適宜使用if-else結(jié)構(gòu)語句處理。在每一種銷售價格中,又根據(jù)銷售量的不同而計算的方法也不同。因此,可用嵌套if語句實現(xiàn)。使用整型標志變量national表示國內(nèi)、國外兩種銷售。#include<stdio.h>void
main(){floatmoney;intnational,count;printf("Inputnationalorexternal:");scanf("%d",&national);printf("Inputcountofproduct:");scanf("%d",&count);
if
(national)
if(count<=80)money=count*350.0;
elsemoney=count*350.0-(count-80)*20.0;else
if
(count<=1000)money=count*900.0;elsemoney=count*900.0-(count-1000)*15.0;printf("tatal=%f",money);}程序的清晰易讀性越來越被人們所強調(diào)。scanf()函數(shù)、字符輸入函數(shù)getchar()函數(shù),可以實現(xiàn)數(shù)據(jù)的輸入。putchar()是字符輸出函數(shù)。在任何表達式的后面加上一個分號,都可以構(gòu)成一個表達式語句。復(fù)合語句在語法上等同于一個語句,它可以出現(xiàn)在一個語句所允許出現(xiàn)的地方。if語句具有三種結(jié)構(gòu):if結(jié)構(gòu)、if-else結(jié)構(gòu)和if-else-if結(jié)構(gòu)。在if語句中可以嵌套另一個if語句,這種形式可以使if語句嵌套到任意深度。switch語句用于多路分支結(jié)構(gòu),它使得程序更加簡明清晰.但是必須注意switch語句中,與break語句的配合使用。本章小結(jié)scanf()函數(shù)
getchar()函數(shù)
putchar()函數(shù)例:在同一行中輸入三個數(shù)據(jù)#include<stdio.h>voidmain(){inta1,a2;floata3;printf("Pleaseentervalueofa1,a2,a3:");scanf("%d%d%f",&a1,&a2,&a3);printf("a1=%d,a2=%d,a3=%f\n",a1,a2,a3);}數(shù)據(jù)輸入方式:(c)123回車(a)1234567.89456回車(b)123TAB456TAB7.897.89回車3.2
getchar()函數(shù)字符輸入函數(shù)getchar()是專門用于輸入一個字符常量的函數(shù)它沒有參數(shù),函數(shù)的值就是從鍵盤輸入的一個字符使用getchar()函數(shù)之前,必須用#include包含“stdio.h”。程序中使用getchar()從鍵盤的輸入中得到一個字符常量并賦給字符變量c,然后輸出該字符例:顯示從鍵盤輸入的一個字符。
#include<stdio.h>
voidmain()
{
ch
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 46807-2025冷凍飲品術(shù)語
- 2026年醫(yī)療行業(yè)失信懲戒合同
- 2026年節(jié)能改造合同
- 2025年上饒市廣信區(qū)人民法院公開招聘勞務(wù)派遣工作人員14人備考題庫及答案詳解一套
- 2026年海峽兩岸國際象棋合作委員會合作協(xié)議
- 2026年教育會展活動展位銷售合同
- 快遞公司春節(jié)放假通知
- 2025年涼山彝族自治州普格縣公安局公開招聘警務(wù)輔助人員的備考題庫帶答案詳解
- 2025年上杭輔警招聘真題及答案
- 黑龍江公安警官職業(yè)學(xué)院《英語詞匯學(xué)》2025 學(xué)年第二學(xué)期期末試卷
- 2025年山西大地環(huán)境投資控股有限公司社會招聘116人備考題庫有答案詳解
- 2026元旦主題晚會倒計時快閃
- 物理試卷答案浙江省9+1高中聯(lián)盟2025學(xué)年第一學(xué)期高三年級期中考試(11.19-11.21)
- 2025年交管12123學(xué)法減分考試題附含答案
- 2025至2030中國3D生物印刷行業(yè)調(diào)研及市場前景預(yù)測評估報告
- 口腔解剖生理學(xué)牙的一般知識-醫(yī)學(xué)課件
- 2026年1月遼寧省普通高中學(xué)業(yè)水平合格性考試地理仿真模擬卷01(考試版)
- 酒店股權(quán)轉(zhuǎn)讓合同范本
- 關(guān)于某某腦機接口數(shù)據(jù)采集與使用知情同意書
- 綠盟科技安全培訓(xùn)內(nèi)容課件
- 安生生產(chǎn)法規(guī)定
評論
0/150
提交評論