




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
5第五章循環(huán)程序設(shè)計(jì)
1/30/20241
在C語(yǔ)言中可用以下語(yǔ)句構(gòu)成循環(huán):
if…gotowhiledo…whilefor其中if…goto是通過編程技巧(if語(yǔ)句和goto語(yǔ)句組合)構(gòu)成循環(huán)功能。而且goto語(yǔ)句將影響程序流程的模塊化,使程序可讀性變差,所以結(jié)構(gòu)化程序設(shè)計(jì)主張限制goto語(yǔ)句的使用。其他三種語(yǔ)句是C語(yǔ)言提供的循環(huán)結(jié)構(gòu)專用語(yǔ)句。1/30/20242重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室循環(huán)結(jié)構(gòu)兩大要素:循環(huán)條件p結(jié)束循環(huán)的條件表達(dá)式循環(huán)體
A
循環(huán)執(zhí)行的語(yǔ)句或語(yǔ)句組設(shè)置循環(huán)條件要特別注意確定:循環(huán)變量的初值循環(huán)變量的終值循環(huán)變量的變化規(guī)律名詞解釋無限循環(huán)死循環(huán)名詞解釋空循環(huán)1/30/20243重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例二】main(){intn=0,sum=0;loop:if(sum>=10000)
gotoend;sum+=n;++n;
gotoloop;end:printf(“n=%d\n”,n);}直到型當(dāng)型1、if…goto語(yǔ)句循環(huán)結(jié)構(gòu)【例一】main(){intn=0,sum=0;loop:sum+=n;++n;if(sum<=10000)
gotoloop;printf(“n=%d\n”,n);}1/30/20244重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室2、while語(yǔ)句循環(huán)結(jié)構(gòu)【例三】main(){intn=0,sum=0;while
(sum<=10000)
{
sum+=n;++n;}printf(“n=%d\n”,n);}當(dāng)型一般形式
while(條件表達(dá)式)
循環(huán)體;用于構(gòu)成當(dāng)型循環(huán):先判斷后執(zhí)行/條件為真繼續(xù)循環(huán),直到條件為假時(shí)結(jié)束循環(huán)?!咀⒁狻織l件表達(dá)式或循環(huán)體內(nèi)應(yīng)有改變條件使循環(huán)結(jié)束的語(yǔ)句,否則可能陷入“死循環(huán)”。1/30/20245重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室3、do…while語(yǔ)句循環(huán)結(jié)構(gòu)
【例四】main(){intn=0,sum=0;do{
sum+=n;++n;}while
(sum<=10000)
printf(“n=%d\n”,n);}一般形式
do{
循環(huán)語(yǔ)句(組)
}while(條件表達(dá)式);
用于構(gòu)成直到型循環(huán):先執(zhí)行后判斷/條件為真繼續(xù)循環(huán),直到條件為假時(shí)結(jié)束循環(huán)?!咀⒁狻織l件表達(dá)式或循環(huán)體內(nèi)同樣應(yīng)有改變條件使循環(huán)結(jié)束的語(yǔ)句,否則可能陷入“死循環(huán)”。直到型直到sum超過10000為止1/30/20246重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例五】從鍵盤輸入一個(gè)整數(shù)12456,分析以下程序運(yùn)行結(jié)果。main(){intnum,c;
printf(“請(qǐng)輸入一個(gè)整數(shù):“);scanf(“%d”,&num);
do{c=num%10;printf(“%d”,c);}while((num/=10)>0);
printf(“\n”);}
/*取得num的個(gè)位數(shù)*/
/*輸出num的個(gè)位數(shù)*/
/*直到num/10為0*/
結(jié)果:
65421將各位數(shù)字反序顯示出來3、do…while語(yǔ)句循環(huán)結(jié)構(gòu)
示例
1/30/20247重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室4、for語(yǔ)句循環(huán)結(jié)構(gòu)一般形式for(表達(dá)式1;條件表達(dá)式;表達(dá)式3)循環(huán)語(yǔ)句(組);用于構(gòu)成計(jì)數(shù)型當(dāng)型循環(huán):先判斷后執(zhí)行/條件為真繼續(xù)循環(huán),直到條件為假時(shí)結(jié)束循環(huán)。表達(dá)式1:整個(gè)循環(huán)中只執(zhí)行1次,常用來對(duì)循環(huán)變量設(shè)置初值條件表達(dá)式(表達(dá)式2):其值為真(非0)時(shí)繼續(xù)執(zhí)行循環(huán)語(yǔ)句(組),否則結(jié)束循環(huán)表達(dá)式3:常用于循環(huán)變量值的更新(循環(huán)體的一部分每次循環(huán)語(yǔ)句組執(zhí)行完后執(zhí)行一次)【例六】求∑i=1+2+3+4…+99+100(i=1~100)main(){inti,s=0;
for(i=1;i<=100;i++)
s=s+i;printf(“Sum=%d\n”,s);}1/30/20248重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室5、其他循環(huán)控制結(jié)構(gòu)main(){inta,y;a=10,y=0;
do{
a+=2;y+=a;if(y>50)break;
}while(a=14);printf("a=%d,y=%d\n",a,y);}結(jié)果:a=16,y=60
變量跟蹤ay10012 1214+212+16=2814+216+28=4414+216+44=60變量跟蹤分析法break結(jié)束循環(huán)在switch中退出switch結(jié)構(gòu);在循環(huán)中結(jié)束循環(huán)。continue結(jié)束本次循環(huán)循環(huán)“短路”(跳過循環(huán)體后面的語(yǔ)句,開始下一輪循環(huán))。goto跳轉(zhuǎn)跳到循環(huán)體外指定標(biāo)號(hào)處?!咀⒁狻縢oto語(yǔ)句只能從循環(huán)內(nèi)向外跳轉(zhuǎn),反之不可!基礎(chǔ)系1/30/20249重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室5、其他循環(huán)控制結(jié)構(gòu)break結(jié)束循環(huán)在switch中退出switch結(jié)構(gòu);在循環(huán)中結(jié)束循環(huán)。continue結(jié)束本次循環(huán)循環(huán)“短路”(跳過循環(huán)體后面的語(yǔ)句,開始下一輪循環(huán))。goto跳轉(zhuǎn)跳到循環(huán)體外指定標(biāo)號(hào)處?!咀⒁狻縢oto語(yǔ)句只能從循環(huán)內(nèi)向外跳轉(zhuǎn),反之不可!基礎(chǔ)系求以下程序段執(zhí)行后x和i的值。inti,x;for(i=1,x=1;i<=50;i++){if(x>=10)break;if(x%2==1){x+=5;
continue;}x-=3;}結(jié)果:x的值為10,i的值為6
變量跟蹤ix
11→626→333→848→555→1061/30/202410重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室5、其他循環(huán)控制結(jié)構(gòu)break結(jié)束循環(huán)
在switch中退出switch結(jié)構(gòu);在循環(huán)中結(jié)束循環(huán)。continue結(jié)束本次循環(huán)循環(huán)“短路”(跳過循環(huán)體后面的語(yǔ)句,開始下一輪循環(huán))。goto跳轉(zhuǎn)跳到循環(huán)體外指定標(biāo)號(hào)處?!咀⒁狻縢oto語(yǔ)句只能從循環(huán)內(nèi)向外跳轉(zhuǎn),反之不可!main(){inti=1;
while(i<=15)if(++i%3!=2)
continue;elseprintf("%d",i);printf("\n");}結(jié)果:2581114
變量跟蹤
i++i%3輸出i
1→2222→303→414→5255→60……1/30/202411重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室5、其他循環(huán)控制結(jié)構(gòu)break結(jié)束循環(huán)
在switch中退出switch結(jié)構(gòu);在循環(huán)中結(jié)束循環(huán)。
continue結(jié)束本次循環(huán)循環(huán)“短路”(跳過循環(huán)體后面的語(yǔ)句,開始下一輪循環(huán))。goto跳轉(zhuǎn)跳到循環(huán)體外指定標(biāo)號(hào)處?!咀⒁狻縢oto語(yǔ)句只能從循環(huán)內(nèi)向外跳轉(zhuǎn),反之不可!main(){inti,k=0;for(i=1;;i++){k++;
while(k<i*i){k++;if(k%3==0)
goto
loop;
}}
loop:printf("%d,%d",i,k);}結(jié)果:2,3
1/30/202412重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室循環(huán)常用算法1、枚舉法(窮舉法)
“笨人之法”:
把所有可能的情況一一測(cè)試,篩選出符合條件的各種結(jié)果進(jìn)行輸出。
【例一】百元買百雞:用一百元錢買一百只雞。已知公雞5元/只,母雞3元/只,小雞1元/3只。分析:這是個(gè)不定方程——三元一次方程組問題(三個(gè)變量,兩個(gè)方程)
x+y+z=100
5x+3y+z/3=100設(shè)公雞為x只,母雞為y只,小雞為z只。1/30/202413重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室百元買百雞問題分析1/30/202414重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室main(){intx,y,z;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.0==100)
printf("cocks=%d,hens=%d,chickens=%d\n",x,y,z);}}結(jié)果:x=0,y=25,z=75x=4,y=18,z=78x=8,y=11,z=81x=12,y=4,z=84【討論
此為“最笨”之法——要進(jìn)行101×101×101=1030301次(100多萬次)運(yùn)算。百元買百雞問題分析1/30/202415重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室百元買百雞問題分析main(){intx,y,z;for(x=0;x<=100;x++)for(y=0;y<=100;y++){
z=100-x-y;if(5*x+3*y+z/3.0==100)printf(“cocks=%d,hens=%d,chickens=%d\n",x,y,z);}}【討論】
令z=100-x-y只進(jìn)行101×101=10201次運(yùn)算(前者的1%)
取x<=19,y<=33只進(jìn)行20×34=680次運(yùn)算(第1種運(yùn)算的6.7%)
1/30/202416重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例二】雨水淋濕了算術(shù)書的一道題,8個(gè)數(shù)字只能看清3個(gè),第一個(gè)數(shù)字雖然看不清,但可看出不是1。編程求其余數(shù)字是什么?
[□×(□3+□)]2=8□□9分析設(shè)分別用A、B、C、D、E五個(gè)變量表示自左到右五個(gè)未知的數(shù)字。其中A的取值范圍為2~9,其余取值范圍為0~9。條件表達(dá)式即為給定算式。1/30/202417重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室main(){intA,B,C,D,E;for(A=2;A<=9;A++)for(B=0;B<=9;B++)for(C=0;C<=9;C++)for(D=0;D<=9;D++)for(E=0;E<=9;E++)if(A*(B*10+3+C)*A*(B*10+3+C)==8009+D*100+E*10)printf(“%2d%2d%2d%2d%2d\n”,A,B,C,D,E);}結(jié)果:32864
【例二】雨水淋濕了算術(shù)書的一道題,8個(gè)數(shù)字只能看清3個(gè),第一個(gè)數(shù)字雖然看不清,但可看出不是1。編程求其余數(shù)字是什么?
[□×(□3+□)]2=8□□91/30/202418重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例三】
求100~200之間不能被3整除也不能被7整除的數(shù)。
分析:求某區(qū)間內(nèi)符合某一要求的數(shù),可用一個(gè)變量“窮舉”。所以可用一個(gè)獨(dú)立變量x,取值范圍100~200。for(x=100;x<=200;x++) if(x%3!=0&&x%7!=0)printf(“x=%d\n”,x);如果是求指定條件的奇數(shù)呢?
如果是求指定條件的偶數(shù)呢?
x=101;x<=200;x=x+2
x=100;x<=200;x=x+2
1/30/202419重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室2、歸納法(遞推法)
“智人之法”
:通過分析歸納,找出從變量舊值出發(fā)求新值的規(guī)律?!纠弧烤幊糖蟆苅=1+2+3+4…+99+100(i=0~100)分析
i=0
S0=0(初值)
i=1
S1=0+1=S0+1i=2
S2=1+2=S1+2i=3
S3=1+2+3=S2+3i=4
S4=1+2+3+4=S3+4
………i=nSn=1+2+3+4+…+n=Sn-1+n1/30/202420重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例一】編程求∑i=1+2+3+4…+n(n≤100)程序:main(){inti,n,s=0;printf("n=");scanf("%d",&n);for(i=1;i<=n;i++)s=s+i;printf("Sum=%d\n",s);}運(yùn)行結(jié)果:n=100Sum=5050如果是∑i=1+1/2+1/3+…+1/n
呢?1/30/202421重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室算法類型小結(jié):累加型【累加型】類型諸如
□+□+□+□+……+□+□求其前n項(xiàng)之和的編程題。累加型算法若設(shè)i為循環(huán)變量,s為前n項(xiàng)累加之和,則程序的基本結(jié)構(gòu)為:
s=0;for(i=1;i<=n;i++)s=s+□;1/30/202422重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例二】
編程求1-1/2+1/3-1/4+1/5-…+1/99-1/100分母為奇數(shù)時(shí),相加分母為偶數(shù)時(shí),相減法1:從變化規(guī)律分析……程序:main(){inti;floats=0;for(i=1;i<=100;i++)if(i%2)s=s+1/i;elses=s-1/i;printf("Sum=%f\n",s);}運(yùn)行結(jié)果:Sum=1.000000錯(cuò)在哪里?1/30/202423重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例二】
編程求1-1/2+1/3-1/4+1/5-…+1/99-1/100法2:這是個(gè)累加型算法的編程題……程序:#include<math.h>main();{inti;floats=0;for(i=1;i<=100;i++)s=s+pow(-1,i+1)/i;printf("Sum=%f\n",s);}
程序:#include<math.h>main(){inti,k=1;floats=0;for(i=1;i<=100;i++){s=s+
k/i;k=-k;}printf("Sum=%f\n",s);}累加型算法程序基本結(jié)構(gòu)為:
s=0;for(i=1;i<=n;i++)s=s+□;錯(cuò)在哪里?(如何檢查程序錯(cuò)誤?)運(yùn)行結(jié)果:Sum=0.688172運(yùn)行結(jié)果:Sum=1.0000001/30/202424重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例三】編程求n!(n由鍵盤輸入)
分析
i=0
S0=
1=S0(初值)
i=1
S1=0×1=S0×1i=2
S2=1×2=S1×2i=3
S3=1×2×3=S2×3i=4
S4=1×2×3×4=S3×4
………i=nSn=1×2×3×4×…×n=Sn-1×n1/30/202425重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例三】編程求n!(n由鍵盤輸入)
程序:main(){inti,n,s=1;printf("n=");scanf("%d",&n);for(i=1;i<=n;i++)s=s*i;printf("Sum=%d\n",s);}運(yùn)行結(jié)果:n=5Sum=120運(yùn)行結(jié)果:n=8Sum=-25216Why?1/30/202426重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室算法類型小結(jié):階乘型【階乘型】類型諸如
□×□×□×□×……×□×□求其前n項(xiàng)之積的編程題。階乘型算法若設(shè)i為循環(huán)變量,s為前n項(xiàng)相乘之積,則程序的基本結(jié)構(gòu)為:
s=1;for(i=1;i<=n;i++)s=s*□;1/30/202427重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例四】
編程求∑i!=1!+2!+3!…+n!(n由鍵盤輸入)外循環(huán)為累加型內(nèi)循環(huán)為階乘型法1:從變化規(guī)律分析……程序:main(){inti,j,n;floats,s1;
printf("請(qǐng)輸入n=");scanf("%d",&n);
s=0;for(i=1;i<=n;i++){
s1=1;
for(j=1;j<=i;j++)s1=s1*j;s=s+s1;}
printf("Sum=%.0f\n",s);}運(yùn)行結(jié)果:n=5Sum=153/*如果n值較大,可改為printf(“Sum=%e\n”,s);*/
1/30/202428重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例四】
編程求∑n!=1!+2!+3!…+n!(n由鍵盤輸入)在同一個(gè)循環(huán)中先階乘,后累加法2:通過單循環(huán)實(shí)現(xiàn)……程序:main(){inti,n;floats,s1;
printf("請(qǐng)輸入n=");scanf("%d",&n);s=0,s1=1;for(i=1;i<=n;i++){s1=s1*i;s=s+s1;}printf("Sum=%.0f\n",s);}運(yùn)行結(jié)果:n=5Sum=1531/30/202429重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例五】
兔子繁殖問題(斐波那契數(shù)列問題)
著名意大利數(shù)學(xué)家斐波那契(Fibonacci)1202年提出一個(gè)有趣的問題。某人想知道一年內(nèi)一對(duì)兔子可以生幾對(duì)兔子。他筑了一道圍墻,把一對(duì)大兔關(guān)在其中。已知每對(duì)大兔每個(gè)月可以生一對(duì)小兔,而每對(duì)小兔出生后第三個(gè)月即可成為“大兔”再生小兔。問一對(duì)小兔一年能繁殖幾對(duì)小兔?分析:▲表示大兔,△表示小兔由分析可以推出,每月新增兔子數(shù)Fn={1,1,2,3,5,8,13,21,34,…}(斐波那契數(shù)列)月份n兔子數(shù)Fn1F1=12F2=13F3=2=F1+F24F4=3=F2+F35F5=5=F3+F4…nFn=Fn-1+Fn-21/30/202430重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例五】
例5.12
兔子繁殖問題(斐波那契數(shù)列問題)main(){intf1=1,f2=1,f,i,s,n;clrscr();printf("請(qǐng)輸入月數(shù):");scanf("%d",&n);for(s=2,i=3;i<=n;i++){f=f1+f2;s=s+f;f1=f2;f2=f;}printf("%d個(gè)月的兔子數(shù)是%d\n",n,s);}1/30/202431重慶理工大學(xué)計(jì)算機(jī)學(xué)院基礎(chǔ)教研室【例六】編程顯示以下圖形(共N行,N由鍵盤輸入)。
*************************此類題目分析的要點(diǎn)是:通過分析,找出每行空格、*與行號(hào)i、列號(hào)j及總行數(shù)N的關(guān)系。其循環(huán)結(jié)構(gòu)可用右圖表示。分析:(設(shè)N=5)第1行4個(gè)空格=5-11個(gè)“*”=2*行號(hào)-1第2行3個(gè)空格=5-23個(gè)“*”=2*行號(hào)-1第3行2個(gè)空格=5-35個(gè)“*”=2*行號(hào)-1第4行1個(gè)空格=5-47個(gè)“*”=2*行號(hào)-1第5行0個(gè)空格=5-59個(gè)“*”=2*行號(hào)-1由此歸納出:第i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鎮(zhèn)江資格證模擬考試
- 公司合作養(yǎng)豬合同范本
- 冷鐓模具合同范本
- 冰箱售后服務(wù)合同范本
- 農(nóng)村水田改造合同范本
- 代理交易合同范本
- 兄妹贈(zèng)予房產(chǎn)合同范本
- 北京出租車司機(jī)合同范本
- 農(nóng)村承包經(jīng)營(yíng)戶合同范本
- 臨時(shí)店面員工合同范本
- DB11 938-2022 綠色建筑設(shè)計(jì)標(biāo)準(zhǔn)
- 部編版語(yǔ)文八年級(jí)下冊(cè)第六單元名著導(dǎo)讀《鋼鐵是怎樣煉成的》問答題 (含答案)
- 2022譯林版新教材高一英語(yǔ)必修二單詞表及默寫表
- 全國(guó)青少年機(jī)器人技術(shù)等級(jí)考試:二級(jí)培訓(xùn)全套課件
- 九種中醫(yī)體質(zhì)辨識(shí)概述課件
- (外研版)英語(yǔ)四年級(jí)下冊(cè)配套同步練習(xí) (全書完整版)
- 小學(xué)數(shù)學(xué)計(jì)算能力大賽實(shí)施方案
- 古詩(shī)詞誦讀《虞美人》課件-統(tǒng)編版高中語(yǔ)文必修上冊(cè)
- 文物學(xué)概論-中國(guó)古代青銅器(上)
- 制作拉線課件
- 某物業(yè)公司能力素質(zhì)模型庫(kù)(參考)
評(píng)論
0/150
提交評(píng)論