計算機(jī)程序設(shè)計基礎(chǔ)(C)第05章_第1頁
計算機(jī)程序設(shè)計基礎(chǔ)(C)第05章_第2頁
計算機(jī)程序設(shè)計基礎(chǔ)(C)第05章_第3頁
計算機(jī)程序設(shè)計基礎(chǔ)(C)第05章_第4頁
計算機(jī)程序設(shè)計基礎(chǔ)(C)第05章_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

計算機(jī)程序設(shè)計基礎(chǔ)(C)王虎C語言結(jié)構(gòu)化程序設(shè)計基礎(chǔ)程序的控制結(jié)構(gòu)(黑箱)單入口單出口的控制結(jié)構(gòu)易于理解三種基本控制結(jié)構(gòu):順序、分支、循環(huán)控制結(jié)構(gòu)可以嵌套,以構(gòu)成更復(fù)雜的控制結(jié)構(gòu)程序的結(jié)構(gòu)化三種基本控制結(jié)構(gòu)可以構(gòu)造任何復(fù)雜的結(jié)構(gòu)化算法結(jié)構(gòu)化程序設(shè)計原則:自頂向下,逐步求精結(jié)構(gòu)化程序設(shè)計過程:首先對任務(wù)進(jìn)行功能分解,然后使用結(jié)構(gòu)化程序設(shè)計思想逐一解決各個子問題,最后構(gòu)造原始問題的解好處:邏輯性強(qiáng),可讀性好,維護(hù)方便順序結(jié)構(gòu)順序結(jié)構(gòu)的含義由一組順序執(zhí)行的處理塊組成,每個處理塊可能包含一條或一組語句,完成一項任務(wù)順序結(jié)構(gòu)是最基本的算法結(jié)構(gòu)語句與復(fù)合語句(語句塊)三種語句結(jié)構(gòu):單語句(表達(dá)式;)、空語句(;)、復(fù)合語句({語句序列})AB入口出口順序結(jié)構(gòu)順序結(jié)構(gòu)程序示例#include<stdio.h>例5.1main(){floatC,F;

printf("請輸入攝氏溫度:");

scanf("%f",&C);F=1.8*C+32;//攝氏轉(zhuǎn)華氏

printf("對應(yīng)的華氏溫度是:%6.2f\n",F);}順序結(jié)構(gòu)程序示例例5.2設(shè)圓半徑r=1.5,圓柱高h(yuǎn)=3,編寫程序,求圓周長、圓面積、圓柱體積。要求從鍵盤輸入數(shù)據(jù),并輸出計算結(jié)果,輸出結(jié)果要帶有文字說明,保留兩位小數(shù)數(shù)學(xué)公式

L=2πr,S=πr2,V=πr2h順序結(jié)構(gòu)程序示例#include<stdio.h>例5.2#definePI3.1415926intmain(){doubler,h,l,s,v;

printf("請輸入圓半徑r=");

scanf("%f",&r);//輸入圓半徑

printf("請輸入圓柱高h(yuǎn)=");

scanf("%f",&h);//輸入圓柱高

l=2*PI*r;s=PI*r*r;v=PI*r*r*h;

printf("圓周長l=%6.2f\n",l);

printf("圓面積s=%6.2f\n",s);

printf("圓柱體積v=%6.2f\n",v);}順序結(jié)構(gòu)程序示例例5.3求一元二次方程2x2+x-3=0的根在正式寫程序時,應(yīng)該先構(gòu)思出一個大概的算法對程序的執(zhí)行流程做出簡單描述自然語言偽代碼流程圖N-S圖順序結(jié)構(gòu)程序示例#include<stdio.h>例5.3#include<math.h>intmain(){floata,b,c,x1,x2,m;

printf("請輸入方程系數(shù)a,b,c:");

scanf("%f,%f,%f",&a,&b,&c);m=sqrt(b*b-4*a*c);x1=(-b+m)/(2*a);x2=(-b-m)/(2*a);printf("x1=%f\n",x1);printf("x2=%f\n",x2);}分支結(jié)構(gòu)分支結(jié)構(gòu)(選擇結(jié)構(gòu))的含義根據(jù)某一條件的判斷結(jié)果,確定程序的流程,即選擇哪一個程序分支中的處理塊去執(zhí)行最基本的分支結(jié)構(gòu)是二路分支結(jié)構(gòu)以條件判斷為起點(diǎn),如果判斷結(jié)果為真,則執(zhí)行A處理塊的操作,否則執(zhí)行B處理塊的操作入口分支結(jié)構(gòu)真假出口AB條件if-else語句語句格式:

if(表達(dá)式)

語句1

else

語句2語句1與語句2可以為復(fù)合語句語句1與語句2只能有一個被執(zhí)行表達(dá)式必須位于括號內(nèi),一般為關(guān)系或邏輯表達(dá)式先計算表達(dá)式值,若為真則執(zhí)行語句1,否則執(zhí)行語句2if-else語句如果僅僅用于確定某條語句是否執(zhí)行,else分支可以省略入口單分支結(jié)構(gòu)真假出口A條件if-else語句示例例5.4輸入一個整數(shù),輸出其絕對值#include<stdio.h>int

main(){

intx;

printf("請輸入一個整數(shù)x:");

scanf("%d",&x);

if(x<0) x=-x;

printf(“|x|=%d\n”,x);}if-else語句示例例5.4-1輸入一個整數(shù),若為負(fù)數(shù)則取絕對值,并+10,輸出該數(shù)。#include<stdio.h>int

main(){

intx;

printf("請輸入一個整數(shù)x:");

scanf("%d",&x);

if(x<0) x=-x;x=x+10;

printf(“|x|=%d\n”,x);}if-else語句示例例5.5輸入三個整數(shù),分別存放到變量x、y、z中,要求對三個變量的值按從大到小的順序排序存放,然后輸出。算法1、比較x和y,若x<y,則x←→y2、比較x和z,若x<z,則x←→z3、比較y和z,若y<z,則y←→zif-else語句示例#include<stdio.h>例5.5voidmain(){int

x,y,z,t;

printf("輸入三個整數(shù):");

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("從大到小排序為:%d%d%d\n",x,y,z);}if-else語句示例例5.6輸入一個字符,判斷是否為英文字母#include<stdio.h>voidmain(){charch;

printf(“Inputacharacter:”);

ch=getchar();

if(ch>='a'&&

ch<='z'||

ch>='A'&&

ch<='Z')

printf(“Itisaletter.\n”);else

printf(“No,itisnotaletter.\n”);}if-elseif-else

語句語句格式if(表達(dá)式1)語句1elseif(表達(dá)式2)語句2…else語句n入口復(fù)雜分支結(jié)構(gòu)真假出口真假假語句1表達(dá)式1表達(dá)式2語句2...語句nif-elseif-else

示例例5.7根據(jù)百分制成績給出優(yōu)秀、通過或不通過成績#include<stdio.h>int

main(){floatscore;

printf(“Inputscore:“);

scanf(“%f“,&score);

if(score>=85&&score<=100)printf(“Excellent.\n“);elseif(score>=60&&score<85)printf(“Pass.\n“);elseif(score>=0&&score<60)printf(“Nopass.\n“);else

printf(“Errorscore.\n“);return0;}條件分支的嵌套條件語句的嵌套格式當(dāng)年齡大于50歲時,若工資小于500,則加300,否則加200if(age>50)

if(sal<500)

sal+=300;else

sal+=200;若年齡大于50歲且工資小于500,加300;若年齡不大于50歲,則加200if(age>50)

if(sal<500)

sal+=300;else

sal+=200;if(age>50){

if(sal<500)

sal+=300;}else

sal+=200;條件分支的嵌套語法規(guī)定:else與離它最近的未配對的if配對嵌套的條件語句可以實(shí)現(xiàn)復(fù)雜的邏輯判斷提倡按照層次縮進(jìn)格式書寫,但書寫格式不會改變程序的結(jié)構(gòu)條件分支嵌套示例求方程ax2+bx+c=0的根算法1、若a=0且b=0且c=0

,任意值2、若a=0且b≠0

,x=-c/b

3、若b2-4ac=0

,x1=x2=-b/2a

4、若b2-4ac≥05、若b2-4ac﹤0條件分支嵌套示例#include<stdio.h>例5.8#include<math.h>//由于用到平方根函數(shù),要用此頭文件int

main(){floata,b,c,x1,x2,p,q,m;//定義實(shí)型變量

printf(“Enter3coefficients:“);

scanf(“%f,%f,%f“,&a,&b,&c);//從鍵盤讀入方程的三個系數(shù)

if(a==0&&b==0&&c==0)//分支1:三個系數(shù)全為0

printf(“anyvalue\n“);

elseif(a==0&&b!=0)//分支2:系數(shù)a為0,解一元一次方程

printf(“x1=x2=%f\n",–c/b);

else

//分支3:解一元二次方程的兩個根

{

m=b*b–4.0*a*c;…條件分支嵌套示例

if(m>=0){//解實(shí)根

x1=(–b+sqrt(m))/(2.0*a);

x2=(–b–sqrt(m))/(2.0*a);

printf(“x1=%f\n“,x1);//輸出兩個實(shí)根

printf(“x2=%f\n“,x2);}

else{//解虛根

p=–b/(2.0*a);

q=sqrt(–m)/(2.0*a);

printf(“x1=%f+%fi\n“,p,q);

printf(“x2=%f–%fi\n“,p,q);}}return0;}switch分支語法計算過程先計算表達(dá)式的值依次與一組常量比較若相同則執(zhí)行該分支否則轉(zhuǎn)向default分支退出switch語句說明switch后面的表達(dá)式必須為整型、字符型或枚舉型case后面必須為常量表達(dá)式,且各個case值必須不同如果沒有default子句,且沒有case子句匹配,則不執(zhí)行case分支中的語句可以有多條,不需要花括號switch(表達(dá)式){case常量表達(dá)式1:語句組1case常量表達(dá)式2:語句組2┇case常量表達(dá)式n:語句組ndefault:語句組}switch分支流程圖入口switch分支結(jié)構(gòu)case出口語句組1語句組2...switch表達(dá)式case值2值1語句組ncase值n語句組defaultswitch分支示例根據(jù)輸入的成績等級,打印相應(yīng)分?jǐn)?shù)段#include<stdio.h> int

main(){chargrade;printf(“Inputthegrade(A,B,C,D,E):“);scanf(“%c“,&grade);

switch(grade){

case‘A‘:printf(“90-100\n“);break;

case‘B‘:printf(“80-89\n“); break;

case‘C‘:printf(“70-79\n“); break;

case‘D‘:printf(“60-69\n“); break;

case‘E‘:printf(“0-59\n“); break;

default:printf(“Error\n“);}return0;}switch_gradeswitch分支示例-break的用途break的作用是退出當(dāng)前的switch如同default,從語法角度來說,break不是必需的參考switch_grade_noBreakswitch分支示例根據(jù)輸入的成績等級,打印是否通過信息#include<stdio.h>int

main(){chargrade;printf(“Inputthegrade(A,B,C,D,E):“);scanf(“%c“,&grade);switch(grade){case‘A‘:case‘B‘:case‘C‘:case‘D‘:printf(“Pass\n“);break;case‘E‘:printf(“Fail\n“);break;default:printf(“Error\n“);}return0;}如果邏輯上確實(shí)如此,則不同的case分支可以使用同一個語句組,這也許是特意不在某些case分支中使用break的唯一正當(dāng)理由switch分支示例例5.9

編寫程序,輸入一百分制成績,要求輸出成績等級‘A’、‘B’、‘C’、‘D’、‘E’。90分以上為‘A’,80--89分為‘B’,70--79分為‘C’,60--69為‘D’,60分以下為‘E’。若輸入超出范圍,輸出錯誤信息。仿照例5.7if(score>=90&&score<=100)printf("A\n");elseif(score>=80&&score<90)printf("B\n");elseif(score>=70&&score<80)printf("C\n");elseif(score>=60&&score<70)printf("D\n");elseif(score>=0&&score<60)printf("B\n");elseprintf("error!\n");switch分支示例#include<stdio.h>int

main(){

intscore;printf("Pleaseenterscore:");

scanf("%d",&score);

switch(score

){

case

(score>=90&&score<=100)

:printf(“A\n“);break;

case

(score>=80&&score<90):printf(“B\n“);break;

default:printf(“Error\n“);}}switch分支示例int

main(){

intscore;printf("Pleaseenterscore:");

scanf("%d",&score);

switch(score

){case100:

case

99

:

case

98

:…

printf(“A\n“);break;

case

89

:case

88

:…

printf(“B\n“);break;…..}}switch分支示例#include<stdio.h>例5.9

main(){intscore;printf("Pleaseenterscore:");scanf("%d",&score);switch(score/10){case10:case9:printf("%d——A\n",score);break;case8:printf("%d——B\n",score);break;case7:printf("%d——C\n",score);break;case6:printf("%d——D\n",score);break;case5:case4:case3:case2:case1:case0:printf("%d——E\n",score);break;default:printf("Inputerror!\n");}}循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)的含義根據(jù)某一條件的判斷結(jié)果,反復(fù)執(zhí)行某一處理塊的過程最基本的循環(huán)結(jié)構(gòu)是當(dāng)循環(huán)進(jìn)入循環(huán)結(jié)構(gòu),判斷循環(huán)條件,如果循環(huán)條件的結(jié)果為真,則執(zhí)行A處理塊的操作,即循環(huán)一次,然后再次判斷循環(huán)條件,當(dāng)循環(huán)條件為假時,循環(huán)結(jié)束入口循環(huán)結(jié)構(gòu)真假出口A條件while循環(huán)while循環(huán)格式:while(表達(dá)式)循環(huán)體while循環(huán)流程先判斷后執(zhí)行:表達(dá)式為真時,執(zhí)行一遍循環(huán)體(一次迭代),返回重新計算表達(dá)式的值以確定是否重復(fù)執(zhí)行循環(huán)體;若表達(dá)式為假,則終止循環(huán)為保證循環(huán)終止,循環(huán)體內(nèi)應(yīng)有能改變表達(dá)式值的語句入口while循環(huán)真假出口循環(huán)體表達(dá)式while循環(huán)例5.10

輸入n,計算s=1+2+3+…+n之和,要求用while語句實(shí)現(xiàn)分析:

s=s+1

s=s+2…

s=s+nwhile循環(huán)例5.11從鍵盤輸入一行字符,以回車結(jié)束,統(tǒng)計字符的個數(shù)并輸出結(jié)果分析:step1、利用循環(huán)不斷輸入字符,并檢查該字符step2、如果不是回車,則字符個數(shù)計數(shù),并返回step1step3、如果是回車,執(zhí)行step4step4、輸出結(jié)果while循環(huán)#include<stdio.h>例5.11

main(){charc;

intnum=0;

printf("請輸入一行字符:");while(

){

}

printf("字符個數(shù)=%d\n",num);}do-while循環(huán)do-while循環(huán)格式:do{

循環(huán)體

}while(表達(dá)式);do-while循環(huán)流程先執(zhí)行后判斷:先執(zhí)行一遍循環(huán)體(一次迭代),計算表達(dá)式的值,表達(dá)式為真時重復(fù)執(zhí)行循環(huán)體,否則終止循環(huán)(循環(huán)體至少執(zhí)行一次,這與while循環(huán)不同)為保證循環(huán)終止,循環(huán)體內(nèi)應(yīng)有能改變表達(dá)式值的語句入口do-while循環(huán)真假出口循環(huán)體表達(dá)式do-while循環(huán)例5.12

計算s=1+2+3+…+n之和,do-while實(shí)現(xiàn)#include<stdio.h>main(){int

i,n,s;

printf("Pleaseentern:");

scanf("%d",&n);s=0;i=1;//設(shè)置初值

do{s=s+i;//累加一個整數(shù)ii++;//準(zhǔn)備下一個數(shù)

}while(i<=n);//條件滿足,執(zhí)行循環(huán)體

printf("1+2+3+…+%d=%d\n",n,s);}for循環(huán)for循環(huán)格式for(表達(dá)式1;

表達(dá)式2;

表達(dá)式3)循環(huán)體for循環(huán)流程先判斷后執(zhí)行:先執(zhí)行表達(dá)式1(循環(huán)初始化),再計算表達(dá)式2以根據(jù)其結(jié)果決定是否執(zhí)行一遍循環(huán)體(為真時執(zhí)行),計算表達(dá)式3的值(循環(huán)再次“初始化”),返回重新計算表達(dá)式2的值以確定循環(huán)是否終止入口for循環(huán)真假出口循環(huán)體表達(dá)式2表達(dá)式3表達(dá)式1for循環(huán)例5.13

計算s=1+2+3+…+n之和,for實(shí)現(xiàn)#include<stdio.h>main(){

int

i,n,s;

printf("Pleaseentern:");

scanf("%d",&n);

for(i=1,s=0;i<=n;i++){s=s+i;}printf("1+2+3+…+%d=%d\n",n,s);}for循環(huán)示例#include<stdio.h>main(){int

i,n,s;

printf("Pleaseentern:");

scanf("%d",&n);

for(i=1,s=1;i<=n;i++)s=s*i;

printf("%d!=1*2*…*%d=%d\n",n,n,s);}例5.14

輸入n,計算n!三種循環(huán)結(jié)構(gòu)的比較三種循環(huán)結(jié)構(gòu)可以互換使用for循環(huán)與while循環(huán)常見,do-while循環(huán)少見While,do-while循環(huán)常用于循環(huán)次數(shù)不定的場合for循環(huán)常用于需要簡單初始化和通過遞增遞減運(yùn)算控制循環(huán)體執(zhí)行的場合for循環(huán)將所有循環(huán)控制因素都放在循環(huán)頭部,循環(huán)結(jié)構(gòu)最清晰循環(huán)嵌套例5.16打印九九乘法表#include<stdio.h>int

main(){

int

i,j,k;

for(i=1;i<=9;i++){

for(j=1;j<=9;j++){

k=i*j;

printf(“%d×%d

=%2d“,i,j,k);}

printf(“\n“);}return0;}如果一個循環(huán)體內(nèi)包含另一個循環(huán)則稱循環(huán)嵌套或多重循環(huán)三種循環(huán)都可以嵌套,但嵌套時內(nèi)外層循環(huán)不能發(fā)生交叉發(fā)生嵌套時,內(nèi)層循環(huán)經(jīng)常需要使用外層循環(huán)的某些值作為控制條件循環(huán)控制轉(zhuǎn)移:break語句通常用于循環(huán)語句和switch語句功能是提前結(jié)束它所在的循環(huán)或switch,轉(zhuǎn)而去執(zhí)行后面的語句循環(huán)和switch只能一級一級的退出循環(huán)控制轉(zhuǎn)移:break語句例5.17從鍵盤輸入10個正整數(shù)進(jìn)行求和,如果錯誤地輸入了負(fù)數(shù),則求和結(jié)束#include<stdio.h>main(){

intsum=0,x,i;

printf("輸入10個正整數(shù):\n");

for(i=1;i<=10;i++)//i>10,正常結(jié)束循環(huán)

{scanf("%d",&x);//輸入x

if(x<0)break;//若x<0,則跳轉(zhuǎn)結(jié)束循環(huán)

sum=sum+x;//正數(shù)累加求和

}

printf("sum=%d\n",sum);}循環(huán)控制轉(zhuǎn)移:continue語句只用于循環(huán)語句功能是提前結(jié)束本次循環(huán),開始下一輪循環(huán)對于while和do-while循環(huán),立即去執(zhí)行循環(huán)條件測試;對于for循環(huán),立即計算表達(dá)式3循環(huán)控制轉(zhuǎn)移:continue語句輸入一串字符,以回車結(jié)束輸入,程序統(tǒng)計并輸出其中小寫字母的個數(shù)參看例5.11continue.c#include<stdio.h>int

main(){charc;

int

num=0;

printf(“Enterastring:\n“);

while((c=getchar())!=‘\n‘){

if(c

<97||c>122)continue;

//非小寫字母,本次循環(huán)結(jié)束

num++;}

printf(“%d\n“,num);return0;}continue終止的是當(dāng)前循環(huán)的當(dāng)前一次迭代,而不是整個循環(huán),當(dāng)前循環(huán)的下一次迭代仍會執(zhí)行結(jié)構(gòu)化程序設(shè)計注意事項要保證結(jié)構(gòu)的完整性不允許結(jié)構(gòu)層次間的交叉!要保證操作的完整性一個基本結(jié)構(gòu)就是一個完整的操作單元,程序只能從入口進(jìn)出口出程序最好不要有多入口多出口,尤其不能從外部進(jìn)入循環(huán)或條件分支內(nèi)部正確的結(jié)構(gòu)嵌套錯誤的結(jié)構(gòu)交叉結(jié)構(gòu)化程序設(shè)計應(yīng)用示例例5.21找出100以內(nèi)的全部素數(shù),并按照每行10個素數(shù)輸出分析:什么是素數(shù)只能被1和其本身整除的自然數(shù)如何編程求一個數(shù)是否為素數(shù)

primeNumber.c結(jié)構(gòu)化程序設(shè)計應(yīng)用示例例5.23輸出裴波那契數(shù)列前12項值(遞推)()11nFnF(n-1)+F(n-2)n>2=ì?=í??1n=2#include<stdio.h>int

main(){

int

f1,f2,f,i;

f1=1;f2=1;

printf(“%10d%10d“,f1,f2);

for(i

=3;i<=12;i++){

f=f1+f2;

printf(“%10d“,f);

if(i

%4==0)printf(“\n“);//控制每行輸出4個數(shù)

f1=f2;f2=f;}

printf(“\

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論