C語言6-循環(huán)結(jié)構(gòu)程序設(shè)計(jì)(update)課件_第1頁
C語言6-循環(huán)結(jié)構(gòu)程序設(shè)計(jì)(update)課件_第2頁
C語言6-循環(huán)結(jié)構(gòu)程序設(shè)計(jì)(update)課件_第3頁
C語言6-循環(huán)結(jié)構(gòu)程序設(shè)計(jì)(update)課件_第4頁
C語言6-循環(huán)結(jié)構(gòu)程序設(shè)計(jì)(update)課件_第5頁
已閱讀5頁,還剩63頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C語言程序設(shè)計(jì)

計(jì)算機(jī)學(xué)院1第六章循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)6.1循環(huán)的基本概念6.2用while語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序6.3用do_while語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序6.4用for語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序6.5Break語句及continue語句6.6幾種循環(huán)語句的比較6.7循環(huán)的嵌套26.1循環(huán)的基本概念求S=1+2+3+......+100S=0;S=S+1;S=S+2;......S=S+100;S=0S=S+i(i=1,2,...,100)s=0i=1i≤100s=s+ii=i+1

yn36.1循環(huán)的基本概念重復(fù)作某件事的現(xiàn)象稱為“循環(huán)”;循環(huán)結(jié)構(gòu)就是在滿足循環(huán)條件時(shí),重復(fù)執(zhí)行某程序段,直到循環(huán)條件不滿足為止,重復(fù)執(zhí)行的程序稱為循環(huán)體;循環(huán)結(jié)構(gòu)有“當(dāng)型”和“直到型”兩種形式;46.2用while語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序while語句:形式:while(表達(dá)式K){循環(huán)體S(由若干語句組成)}功能:先判斷條件,當(dāng)條件為真時(shí)反復(fù)執(zhí)行循環(huán)體,條件為假則退出循環(huán)。KS

Y

N56.2用while語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序while語句說明:while語句構(gòu)成的循環(huán)屬于“當(dāng)型”循環(huán);表達(dá)式是控制循環(huán)的條件,可以是任何類型的表達(dá)式;while語句的特點(diǎn)是:先判斷,后執(zhí)行,有可能循環(huán)一次也不執(zhí)行;66.2用while語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序求和:1+2+3+…..+100=?main(){inti,s;i=1;s=0;while(i<=100){s=s+i;i++;}printf(“s=%d\n”,s);}問題:是否可以1、去掉while語句的{}2、去掉i++;3、將i++;移到s=s+i;之前7while語句-實(shí)例例1:從鍵盤輸入10個(gè)整數(shù),求這10個(gè)整數(shù)之和。count≤10?count=count+1成立不成立輸出結(jié)果total計(jì)數(shù)器count=0累加器total=0輸入numtotal+=num開始結(jié)束while(count<=10){}count=count+1;scanf("%d",&num);total=total+num;程序主體8while語句-實(shí)例

#include<stdio.h>main(){intcount,num,total;/*count:計(jì)數(shù)器,num:輸入的整數(shù)*/

count=total=0;/*total:存放累加和*/

while(count<=10)/*循環(huán)控制條件*/

{

count=count+1;/*循環(huán)體*/

printf("EntertheNo.%d=",count);scanf("%d",&num);total=total+num;/*計(jì)算累加和*/

}

printf("Total=%d\n",total);}9while語句-實(shí)例例2:求1到10的階乘n!。i<=10?n=n*i成立不成立計(jì)數(shù)器i=1累積器n=1輸入結(jié)果i=i+1開始結(jié)束while(i<=10){}n=n*i;printf("%d",n);i=i+1;程序主體遞推公式:f(n)=1 當(dāng)n=1時(shí)f(n)=f(n-1)*n當(dāng)n>1時(shí)10while語句-實(shí)例3循環(huán)嵌套:在循環(huán)體中,又包含有循環(huán)語句。

例3:輸出下三角形乘法九九表。123456789---------------------------------------12436948121651015202561218243036714212835424981624324048566491827364554637281假設(shè):行號(hào)為i,列號(hào)為ji=6j=5i*j(1<=i<=9)(1<=j<=i)

則:第i行中一共要輸出i個(gè)乘積。11while語句-實(shí)例

#include<stdio.h>main(){inti=1,j;/*i:行計(jì)數(shù)器j:列計(jì)數(shù)器*/

while(i<=9)/*控制打印表頭*/

printf("%4d",i++);

printf("\n------------------------------------\n");i=1;while(i<=9){j=1;/*列計(jì)數(shù)器置1*/

while(j<=i)/*嵌套的二重循環(huán)。輸出第i行*/ {printf("%4d",i*j);j++;/*列計(jì)數(shù)器+1*/}

printf("\n");/*一行輸出結(jié)束后,輸出\n*/i++;/*行計(jì)數(shù)器+1*/}}外層循環(huán)體每執(zhí)行1次,內(nèi)層循環(huán)要完成由內(nèi)循環(huán)條件所決定的次數(shù)12while語句使用注意1.while(0){....}由于循環(huán)的條件表達(dá)式恒等于0,循環(huán)體永遠(yuǎn)也不會(huì)執(zhí)行,是編程者的錯(cuò)誤。2.while(1){....}由于循環(huán)的條件表達(dá)式恒等于1,所以不可能通過循環(huán)控制條件來結(jié)束循環(huán)體的執(zhí)行,稱為“死循環(huán)”。3.為了保證循環(huán)正常運(yùn)行,應(yīng)該特別注意:循環(huán)控制條件

控制條件的初始狀態(tài)(初始值)循環(huán)體內(nèi)部對(duì)控制條件的影響136.3用do_while語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序do_while語句形式:

do{循環(huán)體S}while(K);先執(zhí)行循環(huán)體,當(dāng)條件為真時(shí)反復(fù)執(zhí)行循環(huán)體,條件為假則退出循環(huán)。KS

N146.3用do_while語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序do_while語句說明:do_while語句構(gòu)成“直到型”循環(huán)結(jié)構(gòu);do_while語句的特點(diǎn)是先執(zhí)行后判斷,循環(huán)體至少執(zhí)行一次;重復(fù)執(zhí)行循環(huán)體,直到表達(dá)式為假時(shí)退出循環(huán);156.3用do_while語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序求積:n!=1*2*3*….*nmain()/*求n!*/{inti,n,s;scanf(“%d”,&n);i=1;s=1;do{s=s*i;i++;}while(i<=n);printf(“%d!=%d\n”,n,s);};doubles;%f16用do_while語句設(shè)計(jì)循環(huán)結(jié)構(gòu)

main(){ints=0,x;scanf("%d",&x);

while(x<=10)

{s=s+x;x++;}

printf("s=%d\n",s);}

main(){ints=0,x;scanf("%d",&x);do

{s=s+x;x++;}

while(x<=10);

printf("s=%d\n",s);}輸入:12輸出:s=12循環(huán)至少執(zhí)行一次循環(huán)沒有被執(zhí)行輸入:12輸出:s=0while及dowhile的比較176.4用for語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序

for語句:形式:for(k1;k2;k3){S(循環(huán)體)}功能:ki--表達(dá)式

k1--用來確定循環(huán)變量的初值

k2--確定循環(huán)控制條件

k3--確定循環(huán)變量的增量先計(jì)算k1,當(dāng)k2為真時(shí)執(zhí)行循環(huán)體并計(jì)算k3,然后再判斷k2,直到k2為假時(shí)退出循環(huán)。k2S

Y

N計(jì)算K1計(jì)算k3186.4用for語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序計(jì)算1*2*…*100=?main(){inti;doubles=1;for(i=1;i<=100;i++)s=s*i;printf(“s=%f\n”,s);}循環(huán)變量初值循環(huán)條件循環(huán)變量步長循環(huán)體中,如有多條語句要用{}括起來。19for語句中的三個(gè)表達(dá)式(表達(dá)式1,表達(dá)式2和表達(dá)式3)中的任意一個(gè)都可省略,但是分號(hào)不能省略。for(n=0;;n++)

缺表達(dá)式2,

造成死循環(huán),不可使用!

(除非循環(huán)體中有使循環(huán)退出的條件)for(n=0;n<100;)

缺表達(dá)式3,n增量應(yīng)在循環(huán)體內(nèi)進(jìn)行for(;;)

三個(gè)表達(dá)式都缺省,死循環(huán)(同2)for(;n<100;)缺表達(dá)式1和表達(dá)式3不要用

for語句的其它幾種變化形式for(;n<100;n++)

缺表達(dá)式1,n應(yīng)在循環(huán)之前賦初值分號(hào)始終不能缺!20for語句-實(shí)例輸出圖形*****使用嵌套循環(huán)完成main(){inti,j,n;scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n+i-1;j++)printf("%s",j==n-i+1||j==n+i-1?"*":"");printf("\n");}}外循環(huán)對(duì)行內(nèi)循環(huán)對(duì)列216.5Break語句及continue語句break語句:形式:break;(用于循環(huán)或switch語句中)功能:終止執(zhí)行所在的循環(huán)(或switch)語句continue語句:形式:continue;(只能用于循環(huán)體中)功能:結(jié)束本次循環(huán).(不是結(jié)束整個(gè)循環(huán))226.5Break語句及continue語句

main()/*求1--13中不能被3整除的數(shù)*/{inti;for(i=1;i<=13;i++){if(i%3==0)continue;printf(“%d,”,i);}}

輸出?1,2,4,5,7,8,10,11,13,1,2,若把continue;換成break;則輸出

break;236.6幾種循環(huán)語句的比較三種循環(huán)語句可以處理同一問題;for和while循環(huán)語句:先判斷,后執(zhí)行(可能不執(zhí)行循環(huán))。do_while循環(huán)語句:先執(zhí)行,后判斷(至少執(zhí)行一次循環(huán))for語句用于循環(huán)次數(shù)確定的情況,while、do_while用于循環(huán)次數(shù)不確定的情況;do_while語句更適合首次循環(huán)肯定執(zhí)行的情況;24while、do_while語句只能表達(dá)循環(huán)控制條件,而for語句有3個(gè)表達(dá)式,不僅能控制循環(huán),而且能控制循環(huán)變量的初值及其變化,功能更強(qiáng)。其中for語句中的三個(gè)表達(dá)式都可省掉(不采用)或部分省掉。通常表達(dá)式2不可少,否則循環(huán)中必須有使循環(huán)退出的條件如果省掉第一、二表達(dá)式,分號(hào)不可少6.6幾種循環(huán)語句的比較25循環(huán)體可放入表達(dá)式3for(i=1;i<=10;printf(“%5d”,i),i++);因?yàn)檠h(huán)體在表達(dá)式2之后,表達(dá)式3之前執(zhí)行,如果將循環(huán)體語句放入表達(dá)式3,循環(huán)體語句及原來的表達(dá)式3構(gòu)成逗號(hào)表達(dá)式,作為循環(huán)語句新的表達(dá)式3,而for語句就無循環(huán)體語句了。語法上循環(huán)結(jié)構(gòu)必須要有循環(huán)體語句,否則會(huì)出現(xiàn)語法錯(cuò)誤。

為解決這個(gè)問題,在for語句后加一空語句,作為循環(huán)體語句用以解決語法的要求。空語句6.6幾種循環(huán)語句的比較266.7循環(huán)的嵌套循環(huán)嵌套:循環(huán)語句的循環(huán)體中又出現(xiàn)循環(huán)語句。

main()/*2重循環(huán)*/{inti;for(i=1;i<=2;i++)/*外循環(huán)*/{printf(“i=%d,j=”,i);for(j=1;j<=3;j++)/*內(nèi)循環(huán)*/printf(“%d,”,j);printf(“\n”);}}輸出?外循環(huán)的每一次循環(huán)(i),均對(duì)應(yīng)整個(gè)內(nèi)循環(huán)(j=1,2,3)i=1,j=1,i=2,j=1,2,3,2,3,27嵌套結(jié)構(gòu)規(guī)則外循環(huán)內(nèi)循環(huán)交叉循環(huán)外循環(huán)入口內(nèi)循環(huán)出口內(nèi)循環(huán)出口外循環(huán)出口外循環(huán)出口1.在嵌套的循環(huán)中外循環(huán)及內(nèi)循環(huán)變量不可同名。2.外循環(huán)及內(nèi)循環(huán)不可交叉。286.8應(yīng)用實(shí)例main()/*求10到12中的素?cái)?shù)*/{inti,j,k;scanf(“%d”,&k);j=1;/*標(biāo)志,j=1素?cái)?shù),j=0非素?cái)?shù)*/for(i=2;i<k;i++)/*檢測k是否素?cái)?shù)*/if(k%i==0){j=0;break;}if(j==1)printf(“%dyes\n”,k);elseprintf(“%dno\n”,k);}

輸入10輸出輸入11輸出輸入12輸出for(k=10;k<13;k++)/*外循環(huán)提供要檢測的數(shù)k*/{}內(nèi)循環(huán)10no11yes12no輸出:10no11yes12no296.8應(yīng)用實(shí)例求Fibonacci數(shù)列{1,1,2,3,5,8......}的前20項(xiàng)遞推公式:f1=1,f2=1fi=fi-1+fi-2(i=3,4,…20)main(){longf1,f2,f;inti;f1=f2=1;printf("%12ld%12ld\n",f1,f2);for(i=3;i<=20;i++){f=f1+f2;f1=f2;f2=f;/*為下一項(xiàng)做準(zhǔn)備*/printf("%12ld",f);if(i%2==0)printf(“\n”);/*每行2個(gè)數(shù)*/}}306.8應(yīng)用實(shí)例f1,f2f1f2f1.....

main(){longf1,f2;inti;f1=f2=1;for(i=1;i<=10;i++){printf("%12ld%12ld\n",f1,f2);f1=f1+f2;f2=f2+f1;/*一次產(chǎn)生兩個(gè)數(shù)*/}}316.8應(yīng)用實(shí)例main(){inti,j,k,a,t=0;for(i=1;i<=9;i++)for(j=1;j<=9;j++)for(k=1;k<=9;k++)for(a=1;a<=9;a++){if(i==j||i==k||i==a)continue;if(j==k||j==a||k==a)continue;if(i+j+k+a!=12)continue;printf(“%d,%d,%d,%d”,i,j,k,a);t++;if(t%6==0)printf(“\n”);/*每行6個(gè)排列*/}}從1到9中選出4個(gè)互不相同的數(shù)構(gòu)成排列,并使它們的和等于12,輸出所有這樣的排列.如1,2,3,6循環(huán)94次判斷8*94=52488次326.8應(yīng)用實(shí)例main(){inti,j,k,a,t=0;for(i=1;i<=6;i++)for(j=1;j<=6;j++)for(k=1;k<=6;k++)for(a=1;a<=6;a++){if(i==j||i==k||i==a)continue;if(j==k||j==a||k==a)continue;if(i+j+k+a!=12)continue;printf(“%d,%d,%d,%d”,i,j,k,a);if(t%6==0)printf(“\n”);}}

4個(gè)數(shù)中任意3個(gè)數(shù)的和最小值為6,所以4個(gè)數(shù)均不超過6循環(huán)64次判斷8*64=10368次336.8應(yīng)用實(shí)例main(){inti,j,k,a,t=0;for(i=1;i<=6;i++)for(j=1;j<=6;j++){if(i==j)continue;for(k=1;k<=6;k++){a=12-i-j-k;if(a<=0||a>6||i==k||i==a)continue;if(j==k||j==a||k==a)continue;printf(“%d,%d,%d,%d”,i,j,k,a);t++;if(t%6==0)printf(“\n”);}}}

循環(huán)63次,判斷8*63+62=1764次若i,j,k確定,則a=12-i-j-k.取消a循環(huán)。另外,i==j?判斷及k循環(huán)無關(guān),應(yīng)放在j循環(huán)中346.8應(yīng)用實(shí)例main(){inti=1;

floats=0,t=1;while(t>=1e-6){s+=t;i++;t=1/i;/*下一個(gè)累加項(xiàng)*/}printf(”s=%f\n",s);}float1.0/i輸出:1計(jì)算s=1+1/2+1/3+...1/n(1/i≥10-6i=1,2,...n)35*****************************************打印如右圖所示的圖形6.8應(yīng)用實(shí)例36main(){inti,j,n;scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n-i;j++)printf("");for(j=1;j<=2*i-1;j++)printf("*");printf("\n");}

打印上半三角for(i=n-1;i>=1;i--){for(j=1;j<=n-i;j++)printf("");for(j=1;j<=2*i-1;j++)printf("*");printf("\n");}打印下半三角}*****************************************37小結(jié)用while語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序用do_while語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序用for語句設(shè)計(jì)循環(huán)結(jié)構(gòu)程序break語句和continue語句循環(huán)的嵌套38TheEnd39典型數(shù)值問題-例1例1:怎樣存錢利最大假設(shè)銀行整存整取存款不同期限的月息利率分別為:0.63%期限=一年0.66%期限=二年0.69%期限=三年0.75%期限=五年0.84%期限=八年利息=本金×月息利率×12×存款年限 現(xiàn)在某人手中有2000元,請(qǐng)通過計(jì)算選擇一種存錢方案,使得錢存入銀行20年后得到的利息最多(假定銀行對(duì)超過存款期限的那部分時(shí)間不付利息)。40典型數(shù)值問題-例1問題分析及算法設(shè)計(jì)為了得到最多的利息,存入銀行的錢應(yīng)在到期時(shí)馬上轉(zhuǎn)存。由于存款的利率不同,所以不同的存款方法(年限組合)得到的利息也是不一樣的。設(shè)2000元存20年,其中1年存i1次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,則到期時(shí)應(yīng)得的本利合計(jì):2000*(1+r1)i1*(1+r2)i2*(1+r3)i3*(1+r5)i5*(1+r8)i8根據(jù)題意還可得到以下限制條件:0<=i8<=20<=i5<=(20-8*i8)/50<=i3<=(20-8*i8-5*i5)/30<=i2<=(20-8*i8-5*i5-3*i3)/20<=i1=20-8*i8-5*i5-3*i3-2*i2可用窮舉所有的i8、i5、i3、i2和i1的組合。41典型數(shù)值問題-例1#include<math.h>main(){inti8,i5,i3,i2,i1,n8,n5,n3,n2,n1;floatmax=0,term;for(i8=0;i8<3;i8++)/*窮舉全部可能的存款方式*/

for(i5=0;i5<=(20-8*i8)/5;i5++) for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++) for(i2=0;i2<=(20-8*i8-5*i5-3*i3)/2;i2++){i1=20-8*i8-5*i5-3*i3-2*i2; term=2000.0*pow(1+0.0063*12,(double)i1) *pow(1+0.0066*12,(double)i2) *pow(1+0.0069*12,(double)i3) *pow(1+0.0075*12,(double)i5) *pow(1+0.0084*12,(double)i8);

if(term>max){/*記錄可能的年限組合*/

max=term;n1=i1;n2=i2;n3=i3;n5=i5;n8=i8; } }printf("%d,%d,%d,%d,%d\n",n8,n5,n3,n2,n1);printf("Total:%.2f\n",max);}42典型數(shù)值問題-例2例1:從鍵盤上任意輸入一個(gè)正整數(shù),要求判斷該正整數(shù)是否是另一個(gè)整數(shù)的平方。問題分析及算法設(shè)計(jì)設(shè):輸入的正整數(shù)為i,若i滿足:i==m*m(整數(shù)m>0)則i為整數(shù)的平方。 可以采用試探的方法: 令m從1開始逐步增加進(jìn)行試探。m*m<i?m=m+1成立不成立輸入一個(gè)整數(shù)i輸出m和i開始結(jié)束設(shè)試探初值m=1m*m==i?成立不成立43典型數(shù)值問題-例2scanf(”%d”,&i);m=1;while(m*m<i){

m++;}if(m*m==i)

printf(”%d%d”,m,i);m*m<i?m=m+1成立不成立輸入一個(gè)整數(shù)i輸出m和i開始結(jié)束設(shè)試探初值m=1m*m==i?成立不成立{inti,m;}44典型數(shù)值問題-例2#include”stdio.h”intmain(){

inti,m;

scanf(”%d”,&i); m=1; while(m*m<i) m++; if(m*m==i)

printf(“%d*%d=%d\n”,m,m,i);

return0;}for(m=1;m*m<i;m++);如果采用for語句該如何修改?

for語句的循環(huán)體是什么?循環(huán)體為空語句45典型數(shù)值問題-例3一輛卡車違犯交通規(guī)則,撞人后逃跑?,F(xiàn)場有三人目擊事件,但都沒有記住車號(hào),只記下車號(hào)的一些特征。甲說:牌照的前兩位數(shù)字是相同的;乙說:牌照的后兩位數(shù)字是相同的,但及前兩位不同;丙是位數(shù)學(xué)家,他說:四位的車號(hào)剛好是一個(gè)整數(shù)的平方。請(qǐng)根據(jù)以上線索求出車號(hào)。問題分析及算法設(shè)計(jì)按照題目的要求造出一個(gè)前兩位數(shù)(i)相同、后兩位數(shù)(j)相同且相互間又不同的整數(shù)。 0

<

i<=9 0<=j<=9 i!=j 1100*i+11*j=m*m(m為整數(shù)>=31)46典型數(shù)值問題-例30

<

i<=90<=j<=9i!=j1100*i+11*j=m*m(m為整數(shù)>=31)i<=9?j=0成立不成立i=1k=1100*i+11*ji!=j?成立不成立k是平方?成立不成立輸出:k,i,jj++j<=9?成立不成立i++結(jié)束for(i=1;i<=9;i++){}for(j=0;j<=9;j++){}if(i!=j){}k=1100*i+11*j;判斷k是否平方;47典型數(shù)值問題-例3

#include”stdio.h"voidmain(){inti,j,k,m;for(i=1;i<=9;i++)/*i:車號(hào)前二位的取值*/

for(j=0;j<=9;j++)/*j:車號(hào)后二位的取值*/

if(i!=j){/*判斷兩位數(shù)字是否相異*/

k=i*1100+j*11;

for(m=31;m*m<k;m++)

; /*判斷是否為整數(shù)的平方*/

if(m*m==k)printf("Lorry_No.is%d.\n",k); }}運(yùn)行結(jié)果:Lorry_No.is7744.48典型數(shù)值問題-例4設(shè)有一個(gè)數(shù)X,當(dāng)X加上100后得到的數(shù)Y是一個(gè)正整數(shù)的平方,然后用Y再加上68,又是另外一個(gè)正整數(shù)的平方,你能算出X為多少嗎?問題分析及算法設(shè)計(jì)根據(jù)題目直接列方程: y=x+100 y=m*m ① y+68=n*n ②

取值范圍:x>0;n>m>10的整數(shù)采用窮舉法求解。49voidmain(

){intx,y,m,flag;

/*flag:標(biāo)志變量*/for(x=0,flag=1;flag;x++)

/*窮舉x*/{y=100+x;

/*計(jì)算y*/for(m=1;m*m<y;m++);if(m*m==y)

/*判斷y是否為一個(gè)數(shù)的平方*/{for(;m*m<y+68;m++);if(m*m==y+68)

/*判斷y+68*/{printf("%d\n",x);flag=0;

/*flag置0,結(jié)束循環(huán)*/}}}}典型數(shù)值問題-例450例:百錢百雞問題中國古代數(shù)學(xué)家張丘建在他的《算經(jīng)》中提出了著名的“百錢百雞問題”:雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一;百錢買百雞,翁、母、雛各幾何?

設(shè):要買x只公雞,y只母雞,z只小雞,可得到方程: x+y+z=100① 5x+3y+z/3=100②

取值范圍:0<=x,y,z<=100

可以采用窮舉法求解。將變量x、y、z的所有取值可能代入方程進(jìn)行計(jì)算典型數(shù)值問題-例551窮舉法基本思路 當(dāng)x=0,y=0,z=0時(shí):是否滿足方程

z=1時(shí):是否滿足方程

z=2時(shí):是否滿足方程

......

z=100時(shí):是否滿足方程 當(dāng)x=0,y=1,z=0時(shí):是否滿足方程

z=1時(shí):是否滿足方程

......

z=100時(shí):是否滿足方程 當(dāng)x=0,y=2,z=0時(shí):是否滿足方程

...... 當(dāng)x=100,y=100,z=100時(shí):......z<=100滿足方程?YN輸出z++z=0y<=100y++y=0x<=100x++x=0開始結(jié)束典型數(shù)值問題-例552程序z<=100滿足方程?YN輸出z++z=0y<=100y++y=0x<=100x++x=0開始結(jié)束#include<stdio.h>voidmain(){intx,y,z,j=0;for(x=0;x<=100;x++)for(y=0;y<=100;y++)for(z=0;z<=100;z++)if(x+y+z==100&&5*x+3*y+z/3==100) printf("..",++j,x,y,z);}典型數(shù)值問題-例553丟失重要條件:z應(yīng)該能夠被3整除。 #include<stdio.h>voidmain(){intx,y,z,j=0;for(x=0;x<=20;x++)for(y=0;y<=33;y++)for(z=0;z<=100;z++) if(z%3==0&&x+y+z==100&&5*x+3*y+z/3==100) printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);}運(yùn)行程序,正確的結(jié)果:1:cock=0hen=25chicken=752:cock=4hen=18chicken=783:cock=8hen=11chicken=814:cock=12hen=4chicken=84z+=3)型數(shù)值問題-例554優(yōu)化程序:for(x=0;x<=20;x++)for(y=0;y<=33;y++)for(z=0;z<=100;z++)if(z%3==0&&x+y+z==100&&5*x+3*y+z/3==100)printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);再優(yōu)化:for(x=0;x<=20;x++)for(y=0;y<=(100-5*x)/3;y++){z=100-x-y;if(z%3==0&&5*x+3*y+z/3==100)printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);}型數(shù)值問題-例555趣味程序:新娘和新郎問題 三對(duì)情侶參加婚禮,三個(gè)新郎為A、B、C,三個(gè)新娘為X、Y、Z。有人不知道誰和誰結(jié)婚,于是詢問了六位新人中的三位,但聽到的回答是這樣的:A說他將和X結(jié)婚;X說她的未婚夫是C;C說他將和Z結(jié)婚。這人聽后知道他們?cè)陂_玩笑,全是假話。請(qǐng)編程找出誰將和誰結(jié)婚。問題分析及算法設(shè)計(jì) 設(shè):a、b、c三人用1、2、3表示,將x和a結(jié)婚表示為x=1,將y不及a結(jié)婚表示為y!=1。則:

x!=1A不及X結(jié)婚

x!=3X的未婚夫不是C

z!=3C不及Z結(jié)婚 題意還隱含:x!=y且x!=z且y!=z56趣味程序:新娘和新郎程序及說明voidmain(){intx,y,z;for(x=1;x<=3;x++)/*窮舉X的全部可能配偶*/

for(y=1;y<=3;y++)/*窮舉Y的全部可能配偶*/

for(z=1;z<=3;z++)/*窮舉Z的全部可能配偶*/

if(x!=1&&x!=3&&z!=3&&x!=y&&x!=z&&y!=z){

printf("Xwillmarryto%c.\n",'A'+x-1);

printf("Ywillmarryto%c.\n",'A'+y-1);printf("Zwillmarryto%c.\n",'A'+z-1);}}57典型數(shù)值問題-窮舉法的關(guān)鍵數(shù)學(xué)模型適宜進(jìn)行窮舉的數(shù)學(xué)模型決定程序是否正確窮舉的范圍明確的窮舉終止條件決定窮舉的效率,范圍過大,則效率太低。58例4:打印數(shù)字魔方。 例如,輸入m=5,輸出的圖形如下:

12345 23451 34512 45123 51234

基本算法:重復(fù)打印m行。第i

行的第一個(gè)數(shù)字為i,之后依次遞增,但以m為模:aij=(i+j-2)%m+1

輸出項(xiàng)aij與行i、列j的關(guān)系典型非數(shù)值(圖型)問題-例459main(){inti,j,m;printf("EnterM:");scanf("%d",&m);for(i=1;i<=m;i++)/*

控制打印m行*/

{for(j=1;j<=m;j++)/*打印行中的數(shù)字*/

printf("%d",(i+j-2)%m+1);printf("\n");}}典型非數(shù)值(圖型)問題-例460例5:輸出數(shù)字陣列:

1234 5678 9

溫馨提示

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