第7講 循環(huán)結(jié)構(gòu)程序設(shè)計_第1頁
第7講 循環(huán)結(jié)構(gòu)程序設(shè)計_第2頁
第7講 循環(huán)結(jié)構(gòu)程序設(shè)計_第3頁
第7講 循環(huán)結(jié)構(gòu)程序設(shè)計_第4頁
第7講 循環(huán)結(jié)構(gòu)程序設(shè)計_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7講循環(huán)結(jié)構(gòu)程序設(shè)計結(jié)構(gòu)化程序設(shè)計之三7.1循環(huán)結(jié)構(gòu)當(dāng)型循環(huán)結(jié)構(gòu)直到型循環(huán)結(jié)構(gòu)PA假真當(dāng)P為真AAP假真A直到P為真注:A可以是一個簡單語句,也可以是一個復(fù)合語句。在C語言中可以用以下語句來實現(xiàn)循環(huán):1.用while語句;2.用do--while語句;用for語句;用goto語句和if語句構(gòu)成循環(huán)。要求:輸入5個數(shù),并求出其和startsum<--n1+n2+n3+n4+n5Inputn1Inputn2Inputn3Inputn4Inputn5outputsumend#include<stdio.h>

intmain()

{

intn1,n2,n3,n4,n5,sum=0;

scanf("%d",&n1);

scanf("%d",&n2);

scanf("%d",&n3);

scanf("%d",&n4);

scanf("%d",&n5);

sum=n1+n2+n3+n4+n5;

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

return0;

}要求:輸入5個數(shù),并求出其和startsum=sum+nInputnOutputsumendcount<6count=1,sum=0count++TF7.2while語句1、while語句的形式:

while(表達(dá)式)

循環(huán)體;

}其他語句while語句常稱為“當(dāng)型”循環(huán)語句。真(非零)表達(dá)式

循環(huán)體假(零)intmain(){ intn,count=1,sum=0;

while(count<6) { scanf("%d",&n); sum=sum+n; count++;

} printf("sumis%d\n",sum); return0;}startsum=sum+nInputnOutputsumendcount<6count=1,sum=0count++TFintmain(){ intn,count=1,sum=0;

while(count<6) { scanf("%d",&n); sum=sum+n; count++;

} printf("sumis%d\n",sum); return0;}循環(huán)變量初值循環(huán)條件,while語句后沒有“;”循環(huán)變量增值例用while循環(huán)求

#include<stdio.h>intmain(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf("%d",sum);return0;}循環(huán)結(jié)構(gòu)程序示例假i<=100sum=sum+ii=i+1真i=17.3do--while語句1、do--while的形式:

do{

循環(huán)體;

}while(表達(dá)式);真(非零)表達(dá)式

循環(huán)體假(零)

do--while語句常稱為“直到型”循環(huán)語句。循環(huán)結(jié)構(gòu)程序示例要求:用do…while循環(huán)求#include<stdio.h>voidmain(){inti,sum=0;i=1;do{sum+=i; i++;}while(i<=100);printf("%d",sum);}while和do~while比較#include<stdio.h>voidmain(){inti,sum=0;scanf(“%d”,&i);do{sum+=i; i++;}while(i<=5);printf("%d",sum);}#include<stdio.h>voidmain(){inti,sum=0;

scanf(“%d”,&i);while(i<=5){sum+=i; i++;}printf("%d",sum);}注意:在if、while語句中,表達(dá)式后面都沒有分號,而在do-while語句的表達(dá)式后面則必須加分號。do-while和while語句相互替換時,要注意修改循環(huán)控制條件。7.4for語句1、for的形式:for(初始表達(dá)式1;條件表達(dá)式2;循環(huán)表達(dá)式3)

{

循環(huán)體;}表達(dá)式1:用于循環(huán)開始前為循環(huán)變量設(shè)置初始值。表達(dá)式2:控制循環(huán)執(zhí)行的條件,決定循環(huán)次數(shù)。表達(dá)式3:循環(huán)控制變量修改表達(dá)式。循環(huán)體語句:被重復(fù)執(zhí)行的語句。2、for語句執(zhí)行過程表達(dá)式3計算表達(dá)式1循環(huán)體判斷表達(dá)式2零非零for的下一條語句循環(huán)結(jié)構(gòu)程序示例用for循環(huán)求#include<stdio.h>voidmain(){inti,sum=0;for(i=1;i<=100;i++)sum+=i;printf("%d",sum);}for語句一般應(yīng)用形式:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值){

循環(huán)體語句;}說明:for語句可以轉(zhuǎn)換成while結(jié)構(gòu)expr1;while(expr2){

循環(huán)體語句;

expr3;}for語句的省略形式for語句中expr1,expr2,expr3類型任意,都可省略,但分號;不可省無限循環(huán):for(;;)例:#include<stdio.h>voidmain(){inti=0;for(i=0;i<10;i++)putchar(‘a(chǎn)’+i);}運行結(jié)果:abcdefghij例:#include<stdio.h>voidmain(){inti=0;for(;i<10;i++)putchar(‘a(chǎn)’+i);}例:#include<stdio.h>main(){inti=0;for(;i<10;)putchar(‘a(chǎn)’+(i++));}例:#include<stdio.h>voidmain(){inti=0;for(;i<10;putchar(‘a(chǎn)’+i),i++);}思考:1.循環(huán)結(jié)構(gòu)可以用哪些語句實現(xiàn)?2.這些語句適用于哪些應(yīng)用場合?P101一般原則:如果循環(huán)次數(shù)已知,用for如果循環(huán)次數(shù)未知,用while如果循環(huán)體至少要執(zhí)行一次,用do-while這只是“一般”原則,不是“原則”7.5循環(huán)的嵌套在嵌套的各層循環(huán)體中,使用復(fù)合語句(即用{}將循環(huán)體語句括起來)保證邏輯上的正確性

內(nèi)層和外層循環(huán)控制變量不應(yīng)同名,以免造成混亂

嵌套的循環(huán)最好采用進(jìn)格式書寫,以保證層次的清晰性循環(huán)嵌套不能交叉,即在一個循環(huán)體內(nèi)必須完整的包含著另一個循環(huán)問題:編寫程序,打印九九表1234567891234567892468101214161836912151821242791827364554637281……………..ij#include<stdio.h>main(){inti,j;for(i=1;i<10;i++)printf("%4d",i);/*打印表頭*/printf("\n---------------------------------------\n");for(i=1;i<10;i++)for(j=1;j<10;j++)printf(“%4d”,i*j);printf(“\n”);}printfj++j=1j<10真(非0)假(0)for(i=1;i<10;i++)

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

printf((j==9)?"%4d\n":"%4d",i*j);外循環(huán):共打印9行i<10假(0)真(非0)i=1i++內(nèi)循環(huán):打印一行7.6break語句和continue語句1.break語句

(1)語句形式:break;(2)作用:

結(jié)束break所在的switch語句。結(jié)束當(dāng)前循環(huán),跳出break所在的 循環(huán)結(jié)構(gòu)。例:求300以內(nèi)能被17整除的最大的數(shù)。#include"stdio.h"voidmain(){intx,k;for(x=300;x>=1;x--)

if(x%17=

=0)break;printf("x=%d\n",x);}找到滿足條件的最大數(shù),結(jié)束循環(huán)2、continue語句(1)語句形式:continue;(2)語句作用:

結(jié)束本次循環(huán)。(3)語句執(zhí)行流程:

continue語句可以結(jié)束本次循環(huán),即不再執(zhí)行循環(huán)體中continue語句之后的語句,轉(zhuǎn)入下一次循環(huán)條件的判斷與執(zhí)行。求300以內(nèi)能被17整除的所有整數(shù)。#include"stdio.h"voidmain(){intx,k;

for(x=1;x<=300;x++)

{

if(x%17!=0)

continue;

printf("%d\t",x);

}}此數(shù)不滿足條件,結(jié)束本次循環(huán),開始下一次循環(huán)例求輸入的十個整數(shù)中正數(shù)的個數(shù)及其平均值#include<stdio.h>voidmain(){inti,num=0,a;floatsum=0;for(i=0;i<10;i++){scanf("%d",&a); if(a<=0)continue; num++; sum+=a;}printf("%dplusinteger'ssum:%6.0f\n",num,sum);printf("Meanvalue:%6.2f\n",sum/num);}例判斷m是否素數(shù)。⑴素數(shù):指除了1和該數(shù)本身之外,不能被其它任何整數(shù)整除的數(shù)。例如:13。⑵判斷一個數(shù)n是否素數(shù)的方法:

將n作為被除數(shù),將2到n-1之間的各個整數(shù)輪流作為除數(shù),如果都不能被整除,則n為素數(shù),否則為非素數(shù)。n例判斷m是否素數(shù)讀入mk=m-1i=2當(dāng)ikm被i整除真假

結(jié)束循環(huán)i=i+1i>k真假輸出:m是素數(shù)

輸出:m不是素數(shù)用breakk=mk=m/2#include<stdio.h>#include<math.h>voidmain(){ intn,i,k; printf("pleaseinputanumber:"); scanf("%d",&n); k=sqrt(n); for(i=2;i<=k;i++) { if(n%i==0)break; } if(i>k) printf("Yes\n"); else printf("No\n"); }標(biāo)號舉例(標(biāo)號起名符合標(biāo)識符命名規(guī)則)error:goto舉例gotoerror;一般形式

goto語句標(biāo)號;……

語句標(biāo)號:……或語句標(biāo)號:…………goto語句標(biāo)號;goto與標(biāo)號(label)是goto的過錯?還是程序員的過錯?破壞了結(jié)構(gòu)化設(shè)計風(fēng)格容易帶來錯誤隱患

gotonext;intsum=0;/*被goto跳過*/…next:現(xiàn)代觀點認(rèn)為:混亂根源不在goto,而在標(biāo)號任何程序都可以不用goto就實現(xiàn)其功能但在某些情況下,使用goto可以讓程序更清晰兩種適合使用goto的情況與if語句一起構(gòu)成循環(huán)結(jié)構(gòu)跳出多重循環(huán)的一條捷徑{…{…{…gotoerror;}}}

使用goto的原則主張少用、慎用,而不是禁用不要使用一個以上的標(biāo)號不要用goto往循環(huán)內(nèi)跳,要向外跳不要讓goto制造出永遠(yuǎn)不會被執(zhí)行的代碼例子參看教材:P104#include<stdio.h>#include<math.h>voidmain(){ intn,i,k; printf("pleaseinputanumber:"); scanf("%d",&n); k=sqrt(n); for(i=2;i<=k;i++) { if(n%i==0)gotoend; } if(i>k) printf("Yes\n"); else printf("No\n");end:printf("Theprogramisover\n"); }7.7循環(huán)結(jié)構(gòu)程序設(shè)計常用算法迭代法:不斷用新值代替舊值的操作過程,稱為迭代。用迭代法完成的加法操作,稱為累加。用迭代法完成的乘法操作,稱為累乘。解題要點:1)定義變量作累加器,累加器初始化為02)按下式循環(huán)計算:累加器當(dāng)前值=累加器原來的值+新的要加的數(shù)據(jù)3)根據(jù)累加數(shù)的變化規(guī)律,修改循環(huán)控制變量,確定循環(huán)次數(shù)?!纠?】用for循環(huán)計算12+22+32+42+…+1002參考程序#include"stdio.h"voidmain(){intk; longresult=0; for(k=1;k<=100;k++)

result+=k*k;printf("result=%ld\n",result);}迭代初始值迭代終止條件迭代式思考:如何用循環(huán)結(jié)構(gòu)實現(xiàn)求n!2.“枚舉法”(窮舉法,列舉法)按問題本身的性質(zhì),一一列舉出該問題所有可能的解,并在逐一列舉的過程中,檢驗每個可能解是否是問題的真正解,若是,我們采納這個解,否則拋棄它。對于所列舉的值,既不能遺漏也不能重復(fù)。(教材P106,例5-32)“笨人之法”:把所有可能的情況一一測試,篩選出符合條件的各種結(jié)果進(jìn)行輸出。3.遞推法所謂遞推法就是從初值出發(fā),歸納出新值與舊值間的關(guān)系,直到求出所需值為止。新值的求出依賴于舊值,不知道舊值,無法推導(dǎo)出新值。數(shù)學(xué)上遞推公式正是這一類問題。“智人之法”:通過分析歸納,找出從變量舊值出發(fā)求新值的規(guī)律。Fibonacci數(shù)列Fibonacci是中世紀(jì)意大利的一位極有才華的數(shù)學(xué)家。他的代表作是1202年出版的《算盤的書》。在這本書中,F(xiàn)ibonacci提出一個問題:假定一對新出生的兔子一個月后成熟,并且再過一個月開始生出一對小兔子。按此規(guī)律,在沒有兔子死亡的情形下,一對初生的兔子,到一年頭上,可以繁殖成多少對兔子?Fibonacci數(shù)列1123581321345589144……

問題分析問題分析顯然,各月的兔子數(shù)組成數(shù)列:1,1,2,3,5,8,13,21,34,55,89,…進(jìn)一步歸納分析,可以知道從第三個月開始,該月的兔子數(shù)由兩部分組成:上月的兔子數(shù)和本月新增的兔子數(shù)。因為每對兔子只有隔一個月才有生育能力,所以本月新增兔子數(shù)為上上個月的兔子數(shù)。因此有關(guān)系:

Fn-1+Fn-2=Fn(n>=3)問題分析從第2個月開始,下月的兔子數(shù)為本月的兔子數(shù)加上上月的兔子數(shù),即

Fnext3=Flast1+Fthis2下一個Fibonacci數(shù),則可以遞推求得:

Flast=Fthis2

,

Fthis=Fnext3

,

Fnext4=Flast2+Fthis3下標(biāo)的數(shù)字表示月份問題分析如果要求出一個Fibonacci數(shù)列,就應(yīng)當(dāng)用一個循環(huán)遞推過程:初始值:Flast=1,Fthis=1求遞推數(shù)列的下一個數(shù)Fnext

for(n=3;n<=12;n++){Fnext=Flast+Fthis;

Flast=Fthis;

Fthis=Fnext;

}參考程序#include<stdio.h>voidmain(){intn,Fnext,Flast=1,Fthis=1;for(n=3;n<=12;n++){Fnext=Flast+Fthis;Flast=Fthis;Fthis=Fnext;

}printf(“\nF(%d)=%d”,n,Fnext);}猴子吃桃子問題:一天一只小猴子摘下一堆桃子,當(dāng)即吃去一半,還覺得不過癮,又多吃了一個。第二天接著吃了前一天剩下的一半,饞不忍罷又多吃了一個。以后每天如此。到第十天小猴子去吃時,只剩下一個桃子了。問小猴子共摘了多少桃子。問題分析:

第1天:X1

第2天:X2=X1-(X1/2+1)=X1/2–1 X1=(X2+1)*2

第3天:X3=X2-(X2/2+1)=X2/2–1 X2=(X3+1)*2

……

第10天:1若某天為X2,則前一天X1=(X2+1)*2

已知第10天的桃子數(shù)為1,就可倒推出第9天的;

……倒推法!參考程序main()

{

intday,x1,x2;

溫馨提示

  • 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

提交評論