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

下載本文檔

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

文檔簡介

循環(huán)結(jié)構(gòu)程序設(shè)計第一次第一頁,共三十八頁,2022年,8月28日5.1 程序中需要用循環(huán)結(jié)構(gòu)5.2 用while語句和do-while語句實現(xiàn)循環(huán)5.3 用for語句實現(xiàn)循環(huán)5.4 循環(huán)的嵌套5.5 用break語句和continue語句改變循環(huán)狀態(tài)5.6 幾種循環(huán)的比較5.7 程序舉例主要內(nèi)容第二頁,共三十八頁,2022年,8月28日

5.1程序中需要用循環(huán)結(jié)構(gòu)什么是循環(huán)?為什么要使用循環(huán)?問題1:問題2:求學(xué)生平均成績

分?jǐn)?shù)相加后除以學(xué)生數(shù)在許多問題中需要用到循環(huán)控制。循環(huán)結(jié)構(gòu)就是用來處理需要重復(fù)處理的問題的,所以又稱重復(fù)結(jié)構(gòu)。它和順序結(jié)構(gòu)、選擇結(jié)構(gòu)共同作為各種復(fù)雜程序的基本構(gòu)造單元。循環(huán)分為兩種:無休止循環(huán)和有終止循環(huán)構(gòu)成有效循環(huán)的條件:循環(huán)體和循環(huán)結(jié)束條件第三頁,共三十八頁,2022年,8月28日5.2用while語句和do-while語句實現(xiàn)循環(huán)

用while語句實現(xiàn)循環(huán)while語句用來實現(xiàn)“當(dāng)型”循環(huán)結(jié)構(gòu)一般形式:

while(表達式)

語句當(dāng)表達式為非0值時,執(zhí)行while語句中的內(nèi)嵌語句。其特點是:先判斷表達式,后執(zhí)行循環(huán)體。第四頁,共三十八頁,2022年,8月28日例題5.1求1+2+3+…+100的和解題思路(1)開始時使sum的值為0,被加數(shù)i第一次取值為1。開始進入循環(huán)結(jié)構(gòu)。(2)判別“i≤100”條件是否滿足,由于i小于100,因此“i≤100”的值為真。所以應(yīng)當(dāng)執(zhí)行其下面矩形框中的操作。(3)執(zhí)行sum=sum+i,此時sum的值變?yōu)?了,然后使i的值加1,i的值變?yōu)?了,這是為下一次加2作準(zhǔn)備。流程返回菱形框。(4)再次檢查“i≤100”條件是否滿足,由于i的值為2,小于100,因此“i≤100”的值仍為真,所以應(yīng)執(zhí)行其下面矩形框中的操作。(5)執(zhí)行sum=sum+i,由于sum的值已變?yōu)?,i的值已變?yōu)?,因此執(zhí)行sum=sum+i后sum的值變?yōu)?。再使i的值加1,i的值變?yōu)?。流程再返回菱形框。(6)再次檢查“i≤100”條件是否滿足……,如此反復(fù)執(zhí)行矩形框中的操作,直到i的值變成了100,把i加到sum中,然后i又加1變成101了。當(dāng)再次返回菱形框檢查“i≤100”條件時,由于I已是101,大于100,“i≤100”

的值為假,不再執(zhí)行矩形框中的操作,循環(huán)結(jié)構(gòu)結(jié)束。5.2.1用while語句實現(xiàn)循環(huán)第五頁,共三十八頁,2022年,8月28日#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é)果:

5050

用while語句實現(xiàn)循環(huán)第六頁,共三十八頁,2022年,8月28日

用do-while語句實現(xiàn)循環(huán)

do-while語句的特點:先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。執(zhí)行過程:先執(zhí)行一次指定的循環(huán)體語句,然后判別“表達式”,當(dāng)表達式的值為非0(“真”)時,返回重新執(zhí)行循環(huán)體語句,如此反復(fù),直到表達式的值等于0(“假”)為止,此時循環(huán)結(jié)束。while語句和do-while語句的關(guān)系:同一個問題既可以用while循環(huán)處理,也可以用do-while循環(huán)來處理。二者是可以互相轉(zhuǎn)換的。一般形式:

do

循環(huán)體語句

while(表達式);第七頁,共三十八頁,2022年,8月28日

用do-while語句實現(xiàn)循環(huán)一般形式:

do

循環(huán)體語句

while(表達式);第八頁,共三十八頁,2022年,8月28日#include<stdio.h>

voidmain()

{inti,sum=0;

i=1;

while(i<=100)

{sum=sum+i;

i++;

}

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

}

用while語句實現(xiàn)第九頁,共三十八頁,2022年,8月28日

例題5.2

求1+2+3+…+100的和。

#include<stdio.h>

voidmain()

{inti,sum=0;

i=1;

do

{sum=sum+i;

i++;

}

while(i<=100);

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

}運行結(jié)果:

5050說明:可以看到,結(jié)果和例5.1完全相同。

用do-while語句實現(xiàn)循環(huán)第十頁,共三十八頁,2022年,8月28日補充例題:求1+3+5+…+99的和。

#include<stdio.h>

voidmain()

{inti,sum=0;

i=1;

do

{sum=sum+i;

i=i+2;

}

while(i<=100);

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

}思考題:求2+6+8+…+100的和。第十一頁,共三十八頁,2022年,8月28日討論題:編寫程序求100以內(nèi)5的倍數(shù)的和。第十二頁,共三十八頁,2022年,8月28日

例題5.11程序2

#include<stdio.h>

voidmain()

{intsum=0,i;

scanf(“%d”,&i)do

{sum=sum+i;

i++;

}

while(i<=10);

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

}while和do-while循環(huán)的比較

例題5.11程序1

#include<stdio.h>

voidmain()

{intsum=0,i;

scanf(“%d”,&i)while(i<=10);

{sum=sum+i;

i++;

}

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

}第十三頁,共三十八頁,2022年,8月28日運行結(jié)果:1↙sum=55再運行一次:11↙sum=0運行結(jié)果:1↙sum=55再運行一次:11↙sum=11說明:當(dāng)while后面的表達式的第一次的值為“真”時,兩種循環(huán)得到的結(jié)果相同。否則,二者結(jié)果不相同。while和do-while循環(huán)的比較第十四頁,共三十八頁,2022年,8月28日例題5.3

募集慈善基金10000元,有若干人捐款,每輸入一個人的捐款數(shù)后,計算機就輸出當(dāng)時的捐款總和。當(dāng)某一次輸入捐款數(shù)后,總和達到或超過10000元時,即宣告結(jié)束,輸出最后的累加值。解題思路解此題的思路是設(shè)計一個循環(huán)結(jié)構(gòu),在其中輸入捐款數(shù),求出累加值,然后檢查此時的累加值是否達到或超過預(yù)定值,如果達到了,就結(jié)束循環(huán)操作。5.2

用while語句和do-while語句實現(xiàn)循環(huán)

第十五頁,共三十八頁,2022年,8月28日#include<stdio.h>

voidmain()

{floatamount,sum=0;

do

{scanf("%f",&amount);

sum=sum+amount;

}while(sum<10000);

printf("sum=%9.2f\n",sum);

}運行結(jié)果:1000↙(輸入捐款額)1850↙1500↙2600↙2500↙1200↙sun=10650.00說明:設(shè)計循環(huán)結(jié)構(gòu),要考慮兩個問題:一是循環(huán)體,二是循環(huán)結(jié)束條件。注意while循環(huán)中判斷的條件是循環(huán)繼續(xù)的條件,而不是結(jié)束條件。

5.2用while語句和do-while語句實現(xiàn)循環(huán)

第十六頁,共三十八頁,2022年,8月28日

5.3用for語句實現(xiàn)循環(huán)

5.3.1for語句的一般形式和執(zhí)行過程

C語言中的for語句使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況。一般形式:

for(表達式1;表達式2;表達式3)語句第十七頁,共三十八頁,2022年,8月28日5.3.1for語句的一般形式和執(zhí)行過程for語句的執(zhí)行過程:

(1)先求解表達式1。

(2)求解表達式2,若其值為真(值為非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第(3)步。若為假(值為0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。

(3)求解表達式3。

(4)轉(zhuǎn)回上面第(2)步驟繼續(xù)執(zhí)行。

(5)循環(huán)結(jié)束,執(zhí)行for語句下面的一個語句。第十八頁,共三十八頁,2022年,8月28日#include<stdio.h>

voidmain()

{inti,sum=0;

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

sum=sum+i;

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

}

用FOR語句實現(xiàn)S=1+2+3+4+‥‥‥100相當(dāng)于:i=1;while(i<=100){sum=sum+i; i++;}第十九頁,共三十八頁,2022年,8月28日

for循環(huán)程序舉例

國王的小麥。相傳古代印度國王舍罕要褒賞他的聰明能干的宰相達依爾(國際象棋的發(fā)明者),國王問他要什么?達依爾回答說:“國王只要在國際象棋的棋盤第1個格子中放1粒麥子,第2個格子中放2粒麥子,第3個格子中放4粒麥子,以后按此比例每一格加一倍,一直放到第64格(國際象棋的棋盤8*8=64格),我感恩不盡,其他什么都不要了?!眹跸耄@有多少!還不容易!讓人扛來一袋小麥,但不到一會兒全用沒了,再來一袋很快又用完了。結(jié)果全印度的糧食全部用完還不夠。國王納悶,怎樣也算不清這筆賬?,F(xiàn)在我們用計算機來算一下。例題5.4第二十頁,共三十八頁,2022年,8月28日解題思路麥子的總粒數(shù)是:分別計算出每一格的麥子粒數(shù),把它們加起來,就得到總粒數(shù)。據(jù)估算,1小麥約有1.42粒,可以計算出小麥的體積??梢杂胒or語句實現(xiàn)循環(huán)。

for循環(huán)程序舉例第二十一頁,共三十八頁,2022年,8月28日

#include<stdio.h>

voidmain()

{

doublep=1,t=1,v;

inti;

for(i=1;i<64;i++)

{

p=p*2;

t=t+p;

}

v=t/1.42e8;

printf(“麥子總粒數(shù)=%e\n”,t);

printf(“麥子總體積=%e\n",v);

}運行結(jié)果:麥子總粒數(shù)=1.844674e+019麥子總體積=1.299066e+011

for循環(huán)程序舉例1立方米小麥約有1.42*108第二十二頁,共三十八頁,2022年,8月28日for循環(huán)程序舉例例題5.4說明:

變量i用來控制循環(huán)的次數(shù),開始時i=1,在完成第1次循環(huán)后,i的值加1變?yōu)?,由于2<64,所以執(zhí)行第2次循環(huán),依此類推,當(dāng)i變到63時,執(zhí)行最后一次循環(huán),i再變?yōu)?4,由于i不再小于64了,不再執(zhí)行循環(huán)。接著計算體積,輸出結(jié)果。第二十三頁,共三十八頁,2022年,8月28日for循環(huán)程序舉例

人口增長預(yù)測。據(jù)2005年末統(tǒng)計,我國人口為130756萬人,如果人口的年增長率為1%,請計算到哪一年中國總?cè)丝诔^15億。例題5.5解題思路

計算人口增長和計算存款利息的公式是相同的。假設(shè)原來人口為p0

,則一年后的人口:其中r是年增長率。用此公式依次計算出每年的人口,每算出一年的人口后就檢查一下是否達到或超過15億?如果未達到或超過15億,就再計算下一年的人口,直到某一年的人口達到或超過15億為止。第二十四頁,共三十八頁,2022年,8月28日5.3.2for循環(huán)程序舉例

#include<stdio.h>

voidmain()

{

doublep=1.30756e9,r=0.01;

inty;

for(y=2006;p<1.5e9;y++)

p=p*(1+r);

printf(“年份=%d,人口總數(shù)=%e\n",y-1,p);

}運行結(jié)果:年份=2019,人口總數(shù)=1.503007e+009由于在結(jié)束循環(huán)前y又加了1,因此在輸出年份時應(yīng)輸出y-1的值。第二十五頁,共三十八頁,2022年,8月28日5.3.2for循環(huán)程序舉例例題5.5說明:

注意區(qū)分變量p在不同階段中的不同含義。

y代表年份。循環(huán)體中只有一個語句,用來計算從2006年開始的各年的人口數(shù)。在for語句中設(shè)定的循環(huán)條件是p<15億,當(dāng)某一年的p達到或超過15億,就停止循環(huán),輸出年份和當(dāng)年的人口數(shù)。由于在最后結(jié)束循環(huán)前y又加了1,因此在輸出年份時應(yīng)輸出y-1的值而不是y的值。第二十六頁,共三十八頁,2022年,8月28日5.3.2for循環(huán)程序舉例總結(jié):

一個變量開始時有一初值,通過一定的運算,可以推算出一個新的值,再從這個新值又推出下一個新值,即不斷用計算出的新值去取代原有的值,這種方法稱為迭代。上面的計算公式p*(1+r)稱為迭代公式。迭代算法一般是用循環(huán)來實現(xiàn)的。迭代是一種常用的算法,用人工實現(xiàn)很麻煩,而用計算機實現(xiàn)卻十分方便。第二十七頁,共三十八頁,2022年,8月28日5.5

提前結(jié)束循環(huán)

用break語句提前退出循環(huán)

break語句可以用來從循環(huán)體內(nèi)跳出循環(huán)體,即提前結(jié)束循環(huán),接著執(zhí)行循環(huán)下面的語句。一般形式:

break;說明:

break語句不能用于循環(huán)語句和switch語句之外的任何其他語句中。

第二十八頁,共三十八頁,2022年,8月28日

統(tǒng)計各班級的學(xué)生的平均成績。已知各班人數(shù)不等,但都不超過30人。編一個程序能處理人數(shù)不等的各班學(xué)生的平均成績。例題5.6解題思路

如果各班人數(shù)相同,問題比較簡單,只需用一個for語句控制即可:

for(i=1;i<31;i++)

但是現(xiàn)在有的班不足30人,應(yīng)當(dāng)設(shè)法告訴計算機本班的人數(shù),使程序也能統(tǒng)計出該班的平均成績??梢约s定,當(dāng)輸入的成績是負(fù)數(shù)時,就表示本班數(shù)據(jù)已結(jié)束(一般情況下成績不會是負(fù)數(shù))。在程序接收到一個負(fù)的分?jǐn)?shù)時就提前結(jié)束循環(huán),計算出本班平均成績。

break語句可以用來實現(xiàn)提前結(jié)束循環(huán)。

用break語句提前退出循環(huán)第二十九頁,共三十八頁,2022年,8月28日

用break語句提前退出循環(huán)

#include<stdio.h>

voidmain()

{floatscore,sum=0,average;

inti,n;

for(i=1;i<31;i++)

{scanf("%f",&score)

if(score<0)break;

sum=sum+score;

}

n=i-1;

average=sum/n;

printf("n=%d,average=%7.2f\n",n,average);

}運行結(jié)果:100↙(輸入一個學(xué)生成績)80↙70↙-1↙(輸入負(fù)數(shù),表示本班數(shù)據(jù)結(jié)束)n=3,average=83.33第三十頁,共三十八頁,2022年,8月28日

用break語句提前退出循環(huán)說明:

如果一個班有30人,則輸入完30人的成績后累計總分后自動結(jié)束循環(huán),不必再輸入負(fù)數(shù)作為結(jié)束標(biāo)志。在結(jié)束循環(huán)后i的值等于31(因為執(zhí)行完30次循環(huán)后,i再加1,變成31,此時才終止循環(huán)),因此學(xué)生數(shù)n應(yīng)該等于i-1。如果一個班人數(shù)少于30人,則在輸入完全班學(xué)生的成績后,輸入一個負(fù)數(shù),此時程序就跳過循環(huán)體其余的語句,也不再繼續(xù)執(zhí)行其余的幾次循環(huán)。直接跳到循環(huán)下面的語句(n=i-1;)繼續(xù)執(zhí)行。剛輸入的數(shù)不進行累加(不執(zhí)行sum=sum+score;)。注意此時i的值,假如已輸入了25個有效分?jǐn)?shù),在第26次循環(huán)時輸入一個負(fù)數(shù),此時i的值是26,而學(xué)生數(shù)n應(yīng)是i-1。第三十一頁,共三十八頁,2022年,8月28日5.5

提前結(jié)束循環(huán)

用continue語句提前結(jié)束本次循環(huán)continue語句作用為結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進行下一次是否執(zhí)行循環(huán)的判定.一般形式:

continue;第三十二頁,共三十八頁,2022年,8月28日continue語句和break語句的區(qū)別:

continue語句只結(jié)束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行。

break語句則是結(jié)束整個循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立。while(表達式1)

{…

if(表達式2)continue;

…}

while(表達式1)

{…if(表達式2)break;…}第三十三頁,共三十八頁,2022年,8月28日continue語句break語句第三十四頁,共三十八頁,2022年,8月28日

輸入一個班全體學(xué)生的成績,把不及格的學(xué)生成績輸出,并求及格學(xué)生的平均成績。例題5.7解題思路

在進行循環(huán)中,檢查學(xué)生的成績,把其中不及格的成績輸出,然后跳過后面總成績的累加和求平均成績的語句。用continue語句即可處理此問題。5.5提前結(jié)束循環(huán)第三十五頁,共三十八頁,2022年,8月28日

#

溫馨提示

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

評論

0/150

提交評論