第4章程序的控制結(jié)構(gòu)_第1頁
第4章程序的控制結(jié)構(gòu)_第2頁
第4章程序的控制結(jié)構(gòu)_第3頁
第4章程序的控制結(jié)構(gòu)_第4頁
第4章程序的控制結(jié)構(gòu)_第5頁
已閱讀5頁,還剩122頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章程序的控制結(jié)構(gòu)C語言大學(xué)實用教程內(nèi)容提要算法的描述方法基本控制結(jié)構(gòu)基本控制語句常用算法,如累加、累乘、統(tǒng)計、遞推、迭代、窮舉等程序的基本版式結(jié)構(gòu)化程序設(shè)計的基本思想算法的概念

數(shù)據(jù)結(jié)構(gòu)+算法=程序算法:為解決一個具體問題而采取的確定的有限的操作步驟,這里僅指計算機能執(zhí)行的算法。算法的分類

數(shù)值運算算法:解決的是求數(shù)值解的問題,例如用輾轉(zhuǎn)相除法求兩個數(shù)的最大公約數(shù)等非數(shù)值運算算法:主要用于解決需要用分析推理、邏輯推理才能解決的問題,例如人工智能中的許多問題,查找、分類等問題算法特性:有窮性確定性

有效性

沒有輸入或有多個輸入

有一個或多個輸出

算法的表示方法自然語言表示傳統(tǒng)的流程圖表示N-S結(jié)構(gòu)化流程圖表示

偽代碼表示

N-S流程圖用以下的流程圖符號:

(1)順序結(jié)構(gòu)(2)選擇結(jié)構(gòu)(3)循環(huán)結(jié)構(gòu)C程序結(jié)構(gòu)C程序源程序文件1源程序文件2源程序文件3編譯預(yù)處理命令全局變量聲明函數(shù)1函數(shù)n…函數(shù)首部函數(shù)體局部變量聲明執(zhí)行語句構(gòu)成程序的三種基本結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)已經(jīng)證明,任何程序均可只用這三種結(jié)構(gòu)綜合描述只用這三種結(jié)構(gòu)編制的程序,叫結(jié)構(gòu)化程序程序必須符合結(jié)構(gòu)化規(guī)則BANS圖傳統(tǒng)流程圖順序結(jié)構(gòu)BABN如果

成績<60

那么

通知補考否則

告知你考試成績AY條件PABNY條件P分支結(jié)構(gòu)(選擇結(jié)構(gòu))條件PA當(dāng)型循環(huán)直到型循環(huán)真假假條件PA假真循環(huán)結(jié)構(gòu)當(dāng)型循環(huán)A真假假條件P循環(huán)結(jié)構(gòu)當(dāng)P為真A當(dāng)P為真A直到型循環(huán)條件PA假真循環(huán)結(jié)構(gòu)直到P為假A直到P為假A結(jié)構(gòu)化程序設(shè)計的核心思想

采用順序、選擇和循環(huán)三種基本結(jié)構(gòu)作為程序設(shè)計的基本單元只有一個入口;只有一個出口;無死語句,即不存在永遠都執(zhí)行不到的語句;無死循環(huán),即不存在永遠都執(zhí)行不完的循環(huán)。采用“自頂向下、逐步求精”和模塊化的方法進行結(jié)構(gòu)化程序設(shè)計“百雞問題”雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、母、雛各幾何?(體會編程步驟)cocks+hens+chicks=1005*cocks+3*hens+chicks/3=1000≤cocks≤19 0≤hens≤33 0≤chicks≤19枚舉法思路:依次取cocks值域中的值,求其余兩個數(shù)(hens、chicks),看是否復(fù)合題意算法描述:cocks=0;當(dāng)cocks<=19時{ 尋找滿足題意的hens、chicks的值;

cocks++;}cocks=0;當(dāng)cocks<=19時{

尋找滿足題意的hens、chicks的值;

cocks++;}cocks=0;當(dāng)cocks<=19時{

hens=0; 當(dāng)hens<=33時 {尋找滿足題意的chicks的值

hens++;}

cocks++;}cocks=0;當(dāng)cocks<=19時{

hens=0; 當(dāng)hens<=33時 {/*尋找滿足題意的chicks的值*/

chicks=100-cocks-hens; 如果(5*cocks+3*hens+chicks/3=100)則輸出;

hens++; }

cocks++;}voidmain(){ intcocks=0,hens,chicks; while(cocks<=19) {hens=0; while(hens<=33) {chicks=100-cocks-hens; if(5.0*cocks+3.0*hens+chicks/3.0==100.0) printf(“%d,%d,%d\n”,cocks,hens,chicks);

hens++;

}

cocks++;

}}經(jīng)過調(diào)試運行,可以得到4組解4.2順序結(jié)構(gòu)最簡單的C程序結(jié)構(gòu)完全按照語句出現(xiàn)的先后順序執(zhí)行程序程序=算法+數(shù)據(jù)結(jié)構(gòu)例1求本利和p80存款利率rate存款年份n本金capital計算n年之后本利和?算法描述:Step1:輸入本金capital和存款年份n;Step2:計算本利和depositdeposit=capital*(1+rate)nStep3:輸出n年后本利和例2求三角形面積例:輸入三角形的三邊長,求三角形面積。假設(shè):三個邊長a,b,c能構(gòu)成三角形。已知面積公式:area=s=(a+b+c)*0.5開始輸入三邊長計算s計算面積結(jié)束例2求三角形面積(p743.5)#include<stdio.h>

#include<math.h>

voidmain()

{floata,b,c,s,area;

scanf(“%f,%f,%f,&a,&b,&c);

s=1.0/2*(a+b+c);

area=sqrt(s*(s-a)*(s-b)*(s-c));

printf(“a=%7.2f,b=%7.2f,c=%7.2f,

s=%7.2f\n”,a,b,c,s);

printf(“area=%7.2f\n”,area);}

數(shù)學(xué)函數(shù)庫因為要用到其中的sqrt函數(shù)運行情況:

3,4,6

a=3.00,b=4.00,c=6.00,s=6.50

area=5.33例3求根p83例4.12求ax2+bx+c=0方程的根。

a,b,c由鍵盤輸入,設(shè)>0。

眾所周知,一元二次方程式的根為

x1=x2=

可以將上面的分式分為兩項:

p=,q=x1=p+q,x2=p-q例3求根#include<stdio.h>

#include<math.h>

voidmain()

{floata,b,c,disc,x1,x2,p,q;

scanf("a=%f,b=%f,c=%f",&a,&b,&c);

disc=b*b-4*a*c;

p=-b/(2*a);

q=sqrt(disc)/(2*a);

x1=p+q;x2=p-q;

printf("x1=%7.4f,x2=%7.4f\n",x1,x2);

}運行情況:

a=1,b=3,c=2↙

x1=-1.0000

x2=-2.0000當(dāng)△>=0,求出實根x1、x2;當(dāng)△<0時,是虛根。。。BNAY條件P選擇結(jié)構(gòu)謝謝!4.3選擇結(jié)構(gòu)條件p。。。條件語句條件運算符邏輯運算符回顧1:關(guān)系運算符和關(guān)系表達式1.關(guān)系運算符及其優(yōu)先次序<(小于)<=(小于或等于)>(大于)>=(大于或等于)==(等于)!=(不等于)優(yōu)先級相同(高)優(yōu)先級相同(低)說明:關(guān)系運算符的優(yōu)先級低于算術(shù)運算符關(guān)系運算符的優(yōu)先級高于賦值運算符回顧2:邏輯運算符和邏輯表達式1.邏輯運算符及其優(yōu)先次序(1)&&(邏輯與)相當(dāng)于其他語言中的AND(2)||(邏輯或)相當(dāng)于其他語言中的OR(3)!(邏輯非)相當(dāng)于其他語言中的NOT例:a&&b若a,b為真,則a&&b為真。

a||b若a,b之一為真,則a||b為真。!a若a為真,則!a為假。優(yōu)先次序:!(非)->&&()->||()邏輯運算符中的“&&”和“||”低于關(guān)系運算符,“!”高于算術(shù)運算符4.3選擇結(jié)構(gòu):條件語句1.If語句的三種基本形式(1)if(表達式)語句例:

if(x>y)printf(“%d”,x);表達式語句真(非0)假(0)單分支選擇結(jié)構(gòu)4.3選擇結(jié)構(gòu):條件語句(2)if(表達式)語句1else語句2例:

if(x>y)printf(“%d”,x);elseprintf(“%d”,y);

條件

語句1

語句2YN雙分支選擇結(jié)構(gòu)4.3選擇結(jié)構(gòu):條件語句(3)if(表達式1)語句1elseif(表達式2)語句2elseif(表達式3)語句3……elseif(表達式m)語句melse語句n多分支選擇結(jié)構(gòu)4.3選擇結(jié)構(gòu):條件語句例:

if(score>=90) range=1;elseif(score>=80) range=2;elseif(score>=70) range=3;elseif(score>=60) range=4;else range=5;4.3選擇結(jié)構(gòu):條件語句說明:(1)3種形式的if語句中在if后面都有表達式,一般為邏輯表達式或關(guān)系表達式。(2)第二,第三種形式的if語句中,在每個

else前面有一個分號,整個語句結(jié)束處有一個分號。(3)在if和else后面可以只含有一個內(nèi)嵌的操作語句,也可以由多個操作語句,此時用花括號將幾個語句括起來成為一個復(fù)合語句?;仡櫍簭?fù)合語句{}括住的若干條語句構(gòu)成一個復(fù)合語句語句塊內(nèi)可以定義變量變量僅在定義它的復(fù)合語句內(nèi)有效變量必須在復(fù)合語句的開頭定義復(fù)合語句可以用在任何可以使用語句的地方。if-else選擇結(jié)構(gòu)的一種最常用形式if(表達式)

語句1;

else

語句2;

語句3表達式值非0時,執(zhí)行語句1,然后語句3;

表達式值為0時,執(zhí)行語句2,然后語句3else部分可以沒有。if(表達式)

語句1;

語句3當(dāng)表達式值為0時,直接執(zhí)行語句3if-else嵌套使用時,注意else和誰配對的問題If語句的嵌套在if語句中又包含一個或多個if語句稱為if語句的嵌套。形式:If()

if()語句1 else語句2Else

if()語句3 else語句4內(nèi)嵌if現(xiàn)場編程完成例4.5體型判斷。按“體指數(shù)”對肥胖程度進行劃分:

體指數(shù)t=體重w/(身高h)2

(w單位為公斤,h單位為米)當(dāng)t<18時,為低體重;當(dāng)t介于18和25之間時,為正常體重;當(dāng)t介于25和27之間時,為超重體重;當(dāng)t>=27時,為肥胖。編程從鍵盤輸入你的身高h和體重w,根據(jù)給定公式計算體指數(shù)t,然后判斷你的體重屬于何種類型。用3種方法編程:算法1:用不帶else子句的if語句編程算法2:用在if子句中嵌入if語句的形式編程算法3:用在else子句中嵌入if語句的形式編程回顧復(fù)習(xí)算法程序=數(shù)據(jù)結(jié)構(gòu)+算法NS圖偽代碼回顧復(fù)習(xí)三種基本結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)BN如果

成績<60

那么

通知補考否則

告知你考試成績AY條件PABNY條件P分支結(jié)構(gòu)(選擇結(jié)構(gòu))回顧復(fù)習(xí)選擇結(jié)構(gòu)條件語句1.if形式if(e)語句1;if(score>=60)printf(“及格!”);表達式語句真(非0)假(0)單分支選擇結(jié)構(gòu)回顧復(fù)習(xí)選擇結(jié)構(gòu)條件語句1.if-else形式if(e)語句1;else語句2;if(score>=60)printf(“及格!”);else printf(“不及格!”);

條件

語句1

語句2YN雙分支選擇結(jié)構(gòu)回顧復(fù)習(xí)(3)if(表達式1)語句1elseif(表達式2)語句2elseif(表達式3)語句3……elseif(表達式m)語句melse語句n多分支選擇結(jié)構(gòu)例:

if(score>=90) range=1;elseif(score>=80) range=2;elseif(score>=70) range=3;elseif(score>=60) range=4;else range=5;練習(xí)1.輸入x,計算y值練習(xí)2.判斷整型數(shù)a的正負值練習(xí)3.判斷閏年yearyear能被4整除但不能被100整除能被400整除練習(xí)4.輸入x,計算y值關(guān)系運算符和邏輯運算符條件p:邏輯表達式真假的判斷非0即為真if(‘a(chǎn)’) printf(“OK!”);x=-5;if(x)printf(“OK!”);y=0;if(y==0)printf(“OK!”);y=0;if(y)printf(“OK!”);例:

if(score>=90) range=1;elseif(score>=80) range=2;elseif(score>=70) range=3;elseif(score>=60) range=4;else range=5;switch多路選擇switch(表達式){

case

常數(shù)1:

語句序列1;

case

常數(shù)2:

語句序列2;

…………

default:

語句序列3;

}default可以沒有,但最好不省略不要忘記break

switch語句例:要求按照考試成績的等級輸出百分制分數(shù)段,用switch語句實現(xiàn):

switch(grade){case′A′∶printf(″85~100\n″);

case′B′∶printf(″70~84\n″);

case′C′∶printf(″60~69\n″);

case′D′∶printf(″<60\n″);

default∶(printf″error\n″);}注意:常量n僅起語句標號作用,不做求值判斷常量n的值必須是惟一的,沒有先后次序多個case語句可以共用一組執(zhí)行結(jié)果現(xiàn)場編程完成計算器程序……例4.8編程設(shè)計一個簡單的計算器程序,要求根據(jù)用戶從鍵盤輸入的表達式:操作數(shù)1運算符op操作數(shù)2然后,計算表達式的值,指定的運算符為加(+)、減(-)、乘(*)、除(/)作業(yè)1p1534.3(1)4.4(1)(2)4.5、4.6、4.7、4.8、4.9回顧選擇結(jié)構(gòu)if語句猜數(shù)游戲switch語句P1594.9讀入一個年份和一個月份,輸出該月有多少天謝謝!4.4循環(huán)結(jié)構(gòu)猜數(shù)游戲計算1+2+3+4+……+n計算n!泰勒級數(shù)4.4循環(huán)結(jié)構(gòu)循環(huán)就是滿足一定條件時,重復(fù)執(zhí)行一段程序。構(gòu)成循環(huán)的語句while 當(dāng)型循環(huán),先判斷后執(zhí)行dowhile 直到型循環(huán),先執(zhí)行后判斷for 功能最強大的循環(huán)語句循環(huán)語句的比較循環(huán)的嵌套循環(huán)——while,forwhile(表達式)

{

語句;}固定?變化?當(dāng)型循環(huán)A真假假條件P循環(huán)結(jié)構(gòu)當(dāng)P為真A當(dāng)P為真Awhilewhile(表達式)

{

語句;}只要表達式的值為非0,就重復(fù)執(zhí)行語句,直到表達式值為0時止。whileintk=1,s=0;while(k<=100){s=s+k;k++;}循環(huán)控制表達式循環(huán)控制變量(k)循環(huán)體注意:循環(huán)體出現(xiàn)多條語句,應(yīng)以復(fù)合語句的形式出現(xiàn)。循環(huán)前必須給循環(huán)控制變量賦初值。循環(huán)體中,必須有改變循環(huán)控制變量值的語句。循環(huán)體可以為空。while((c=getchar())!=‘A’);累加求和累加求和問題:sum=∑n例

求1到100的和。

#include<stdio.h>

voidmain()

{inti,sum=0;

i=1;

while(i<=100)

{sum=sum+i;

i++;

}

printf(″%d\n″,sum);

}說明:(1)循環(huán)體如果包含一個以上的語句,應(yīng)該用花括弧括起來,以復(fù)合語句形式出現(xiàn).(2)在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句。

運行結(jié)果:5050do-whiledo

{

語句;

}while(表達式);首先執(zhí)行語句,然后判斷表達式的值。如果表達式為0,繼續(xù)向下執(zhí)行,否則,再次執(zhí)行語句,再次判斷表達式的值。語句會被至少執(zhí)行一次。最后分號不可省略?。。?!條件PA當(dāng)型循環(huán)直到循環(huán)真假假條件PA假真假條件P條件PA假當(dāng)循環(huán)條件第一次就為假時例

求1到100的和。

#include<stdio.h>

voidmain()

{inti,sum=0;

i=1;

do

{sum=sum+i;

i++;

}

while(i<=100);

printf("%d\n″,sum);

}運行結(jié)果:5050循環(huán)——for表達式2?執(zhí)行語句成立不成立執(zhí)行for循環(huán)之后的語句執(zhí)行表達式3執(zhí)行表達式1循環(huán)初始條件循環(huán)控制條件循環(huán)體for語句等價于下列語句:表達式1;while(表達式2){語句;表達式3;}

forfor(表達式1;表達式2;表達式3)

{

語句;}首先執(zhí)行表達式1。如果表達式2的值為非0,執(zhí)行語句和表達式3,直到表達式2的值為0時停止循環(huán)。相當(dāng)于:表達式1;

while(表達式2){

語句;

表達式3;

}表達式1和表達式3可以沒有或者是用逗號分隔的多個表達式的組合。但最好不要有太多的表達式組合forfor語句最簡單的應(yīng)用形式也就是最易理解的如下形式

for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)例如:

for(i=1;i<=100;i++)sum=sum+i;

它相當(dāng)于以下語句:

i=1;while(i<=100){sum=sum+i;i++;}

顯然,用for語句簡單、方便。

累加求和累加求和問題:sum=∑n注意在for和while語句之后一般沒有分號。有分號表示循環(huán)體,就是分號之前的內(nèi)容(空循環(huán)體)。while(i<100);

i++;for(i=0;i<100;i++);

printf("%d",i);for通常有一個循環(huán)變量控制循環(huán)的次數(shù),不要在循環(huán)體內(nèi)改變這個變量。選擇三種循環(huán)的一般原則如果循環(huán)次數(shù)已知,用for如果循環(huán)次數(shù)未知,用while如果循環(huán)體至少要執(zhí)行一次,用do-while這只是“一般”原則,不是“原則”現(xiàn)場編程完成例4.6,例4.9例4.6:猜數(shù)游戲:先由計算機“想”一個數(shù)請人猜,如果人猜對了,則計算機給出提示:“Right!”,否則提示:“Wrong!”,并告訴人所猜的數(shù)是大還是小。例4.9:先由計算機“想”一個1到100之間的數(shù)請人猜,如果人猜對了,則結(jié)束游戲,否則計算機給出提示,告訴人所猜的數(shù)是太大還是太小,直到人猜對為止。計算機記錄人猜的次數(shù),以此來反映猜數(shù)者“猜”的水平。猜數(shù)游戲用到的庫函數(shù)隨機函數(shù)rand()#include<stdlib.h>RAND_MAX在stdlib.h中定義,不大于雙字節(jié)整數(shù)的最大值32767產(chǎn)生[0,RAND_MAX]之間的隨機數(shù)magic=rand();產(chǎn)生[0,b-1]之間的隨機數(shù)magic=rand()%b;產(chǎn)生[a,a+b-1]之間的隨機數(shù)magic=rand()%b+a;現(xiàn)場編程完成例4.6,發(fā)現(xiàn)問題猜數(shù)游戲用到的庫函數(shù)隨機函數(shù)srand為函數(shù)rand()設(shè)置隨機數(shù)種子來實現(xiàn)對函數(shù)rand所產(chǎn)生的偽隨機數(shù)的“隨機化”通過鍵入隨機數(shù)種子,產(chǎn)生[0,100]之間的隨機數(shù)scanf("%u",&seed);srand(seed);magic=rand()%100+1;猜數(shù)游戲用到的庫函數(shù)隨機函數(shù)srand為函數(shù)rand()設(shè)置隨機數(shù)種子來實現(xiàn)對函數(shù)rand所產(chǎn)生的偽隨機數(shù)的“隨機化”使用計算機讀取其時鐘值并把該值自動設(shè)置為隨機數(shù)種子,產(chǎn)生[0,100]之間的隨機數(shù)函數(shù)time()返回以秒計算的當(dāng)前時間值,該值被轉(zhuǎn)換為無符號整數(shù)并用作隨機數(shù)發(fā)生器的種子#include<time.h>srand(time(NULL));magic=rand()%100+1;死循環(huán)永遠不會退出的循環(huán)為死循環(huán)for(;;){}while(1){}do

{}while(1)一般情況下,要極力避免死循環(huán)絕大多數(shù)程序不需要死循環(huán)。如果出現(xiàn),往往都是bug時間過長的循環(huán)會造成“假死”效果,也要考慮解決計算:n!=1*2*3*……*n數(shù)據(jù)算法現(xiàn)場編程完成例4.11國王的許諾。相傳國際象棋是古印度舍罕王的宰相達依爾發(fā)明的。舍罕王十分喜歡象棋,決定讓宰相自己選擇何種賞賜。這位聰明的宰相指著8×8共64格的象棋盤說:陛下,請您賞給我一些麥子吧,就在棋盤的第一個格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盤上的64個格子,我就感恩不盡了。舍罕王讓人扛來一袋麥子,他要兌現(xiàn)他的許諾。

國王能兌現(xiàn)他的許諾嗎?試編程計算舍罕王共要多少麥子賞賜他的宰相,這些麥子合多少立方米?(已知1立方米麥子約1.42e8粒)

總粒數(shù)為:sum=1+2+22+23+…+263

方法1#defineCONST1.42e8#include<stdio.h>#include<math.h>main(){

intn;

doubleterm,sum=0;/*累加求和變量賦初值*/

for(n=1;n<=64;n++){

term=pow(2,n-1);/*根據(jù)累加項的規(guī)律計算累加項

*/sum=sum+term;/*作累加運算*/}

printf("sum=%e\n",sum);/*打印總麥粒數(shù)*/

printf("volum=%e\n",sum/CONST);/*打印折合的總麥粒體積數(shù)*/}

方法2#defineCONST1.42e8/*定義符號常量CONST值為1.42e8*/#include<stdio.h>main(){

intn;

doubleterm=1,sum=1;/*累乘求積、累加求和變量賦初值*/

for(n=2;n<=64;n++){term=term*2;/*根據(jù)后項總是前項的2倍計算累加項*/sum=sum+term;/*作累加運算*/}

printf("sum=%e\n",sum);/*打印總麥粒數(shù)*/

printf("volum=%e\n",sum/CONST);/*打印折合的總麥粒體積數(shù)*/}

嵌套循環(huán)在一個循環(huán)體內(nèi)包含著另一個完整的循環(huán)結(jié)構(gòu)。內(nèi)嵌的循環(huán)又可以嵌套循環(huán)構(gòu)成多重循環(huán)。三種循環(huán)結(jié)構(gòu)可以互相嵌套。while(){ …… while() {……} ……}do{ …… do { …… }while(); ……}while();for(;;){ …… for(;;) {……} ……}do{ …… while() {……} ……}while();for(;;){ …… while(){……} ……}do{ …… for(;;) {……} ……}while();使用嵌套的循環(huán)體時,應(yīng)注意以下問題

在嵌套的各層循環(huán)體中,使用復(fù)合語句(即用一對大花括號將循環(huán)體語句括起來)保證邏輯上的正確性。內(nèi)層和外層循環(huán)控制變量不應(yīng)同名,以免造成混亂。

嵌套的循環(huán)最好采用右縮進格式書寫,以保證層次的清晰性。循環(huán)嵌套不能交叉,即在一個循環(huán)體內(nèi)必須完整的包含著另一個循環(huán)。合法的嵌套循環(huán)for(i=0;i<3;i++){ printf(“i=%d:”,i); for(j=0;j<4;j++) printf(“j=%-4d”,j); printf(“\n”);}現(xiàn)場編程完成例4.14編程輸出如下形式的乘法九九表

#include<stdio.h>main(){

intm,n;

for(m=1;m<10;m++)

printf("%4d",m);/*打印表頭*/

printf("\n");

for(m=1;m<10;m++)

printf("-");

printf("\n");

for(m=1;m<10;m++) {

for(n=1;n<10;n++) {

printf("%4d",m*n); }

printf("\n"); }}現(xiàn)場編程完成例4.15將上例輸出格式改成如下的下三角格式打印

#include<stdio.h>main(){

intm,n;

for(m=1;m<10;m++)

printf("%4d",m);/*打印表頭*/

printf("\n");

for(m=1;m<10;m++)

printf("-");

printf("\n");

for(m=1;m<10;m++) {

for(n=1;n<=m;n++) {

printf("%4d",m*n); }

printf("\n"); }}現(xiàn)場編程完成例4.16馬克思手稿中有一道趣味數(shù)學(xué)題:有30個人,其中有男人、女人和小孩,在一家飯館里吃飯共花了50先令,每個男人各花3先令,每個女人各花2先令,每個小孩各花1先令,問男人、女人和小孩各有幾人?

解方程組窮舉法方法1:采用三重循環(huán)窮舉x,y,z的全部可能的組合

#include<stdio.h>main(){

intx,y,z;

printf("Man\tWomen\tChildern\n");

for(x=0;x<=30;x++)

for(y=0;y<=30;y++)

for(z=0;z<=30;z++)

if(x+y+z==30&&3*x+2*y+z==50)

printf("%3d\t%5d\t%8d\n",x,y,z);}

方法2:改進算法

#include<stdio.h>

main(){

intx,y,z;

printf("Man\tWomen\tChildern\n");

for(x=0;x<=16;x++)

for(y=0;y<=25;y++){z=30–x-y;

if(3*x+2*y+z==50)printf("%3d\t%5d\t%8d\n",x,y,z);}}

作業(yè)課后練習(xí)4.3、4.4寫在書上4.18、4.19、4.23、4.26、4.27、4.28思考?例題:試找出滿足下列條件的所有三位數(shù)。(1)其百位數(shù)不大于2;(2)將個位與百位對換,得到的三位數(shù)是原三位數(shù)的兩倍多。設(shè)這個三位數(shù)各個位上的數(shù)碼為a,b,c符合的條件:第一:(100a+10c+b)/(100a+10b+c)>=2第二:a<=2流程的轉(zhuǎn)移控制break語句continue語句goto語句return語句標準庫函數(shù)exit()

break和continue對for、while、do-while循環(huán)進行內(nèi)部手術(shù)。break,退出循環(huán)。continue,中斷此次循環(huán)體的執(zhí)行,開始下一次。break和continue少用為妙。break和continue假假真真break表達式1表達式2循環(huán)語句的下一條語句循環(huán)語句的下一條語句假假真真

contiue表達式1表達式2continue標號舉例error:goto舉例gotoerror;一般形式goto語句標號;……

語句標號:……或語句標號:…………goto語句標號;goto與標號(label)exit()函數(shù)exit(0)作用是終止整個程序的執(zhí)行,強制返回操作系統(tǒng)。調(diào)用該函數(shù)需要嵌入頭文件<stdlib.h>。案例:輸入一個整數(shù),判斷它是否是素數(shù)

方法1#include<math.h>main(){

intm,i,k;

printf("Pleaseenteranumber:");

scanf("%d",&m); k=sqrt(m);

for(i=2;i<=k;i++) {

if(m%i==0) {

printf("No!\n");

gotoend; } }

printf("Yes!\n");end:

printf("Programisover!\n");}Pleaseenteranumber:

6

Programisover!No!方法1#include<math.h>main(){

intm,i,k;

printf("Pleaseenteranumber:");

scanf("%d",&m); k=sqrt(m);

for(i=2;i<=k;i++) {

if(m%i==0) {

printf("No!\n");

gotoend; } }

printf("Yes!\n");end:

printf("Programisover!\n");}Pleaseenteranumber:

5

Programisover!Yes!方法2#include<math.h>main(){

intm,i,k;

printf("Pleaseenteranumber:");

scanf("%d",&m); k=sqrt(m);

for(i=2;i<=k;i++){

if(m%i==0)

break; }

if(i>k)

printf("Yes!\n");

else

printf("No!\n");

printf("Programisover!\n");}Pleaseenteranumber:

6

Programisover!No!方法3#include<math.h>main(){intm,i,k,flag=1;/*標志變量flag初值置為1*/

printf("Pleaseenteranumber:");

scanf("%d",&m); k=sqrt(m);

for(i=2;i<=k&&flag;i++) { if(m%i==0)flag=0;}

if(flag)

printf("Yes!\n");

else

printf("No!\n");

printf("Programisover!\n");}這個程序是做什么的?#include<math.h>main(){intm,i,k,flag=1;/*標志變量flag初值置為1*/

printf("Pleaseenteranumber:");

scanf("%d",&m); k=sqrt(m);

for(i=2;i<=m-1;i++) { if(m%i==0)flag=0;

printf("%d\n",i);

}

if(flag)

printf("Nodivisor!Itisaprimenumber.\n");

printf("Programisover!\n");}Dijkstra和

gotoE.W.Dijkstra,生于1930年,卒于2002年8月6日軟件體系結(jié)構(gòu),結(jié)構(gòu)化程序設(shè)計,……Dijkstra和

gotoDijkstra早在1968年就指出:“Gotoconsideredharmful”

,“Ibecameconvincedthatthegotostatement

溫馨提示

  • 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

提交評論