版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第5章循環(huán)結(jié)構(gòu)程序設(shè)計循環(huán)結(jié)構(gòu)概述
goto語句及用goto語句構(gòu)成循環(huán)三種循環(huán)while、do-while、for
循環(huán)的嵌套幾種循環(huán)的比較Break語句和continue語句應用舉例5.0
循環(huán)結(jié)構(gòu)導入在程序設(shè)計中含有循環(huán)結(jié)構(gòu)的問題是大量存在的
對輸入的10個整數(shù)求和,怎么編程?
對輸入的100個整數(shù)求和,怎么編程?以上問題可以引出一個概念“循環(huán)”,簡單而言:循環(huán)就是不斷反復地執(zhí)行同一段程序。C語言可實現(xiàn)的循環(huán):用goto
和if構(gòu)成循環(huán)while語句do~while語句for語句不提倡當型循環(huán)——先判斷后執(zhí)行直到型循環(huán)——先執(zhí)行后判斷多功能goto語句及用goto語句構(gòu)成循環(huán)一般形式:語句標號:語句
….…..
goto
語句標號;1.功能是無條件轉(zhuǎn)到語句標號處。2.用途:與if語句一起構(gòu)成循環(huán)結(jié)構(gòu);從循環(huán)體中跳到循環(huán)體外。3.因為濫用goto語句會破壞結(jié)構(gòu)化,所以應限制使用。說明:語句標號:1.用于定義程序中的某個位置。2.用標識符表示,開頭不能是數(shù)字。如:goto3t;錯誤
gotot3;正確3.只能加在可執(zhí)行語句前面。goto語句及用goto語句構(gòu)成循環(huán)用if語句和goto語句構(gòu)成循環(huán)例1
計算#include<stdio.h>main(){inti,sum=0;i=1;loop:if(i<=100){sum+=i; i++;
gotoloop;}
printf("%d",sum);}sum=sum+1=1sum=sum+2=3sum=sum+3=6sum=sum+4=10……sum=sum+100=5050循環(huán)初值循環(huán)終值循環(huán)變量增值循環(huán)條件循環(huán)體分析:這是一個累加求和的問題sum=1+2+3+…+100
用while語句實現(xiàn)當型循環(huán)表達式循環(huán)體當表達式的值為真(非0)時,執(zhí)行其中的內(nèi)嵌語句(循環(huán)體),然后回過頭來再判斷表達式的值,如此重復;當表達式為假(0)時結(jié)束循環(huán)。5.1while語句一般形式:while(表達式)
循環(huán)體語句表達式循環(huán)體假(0)真(非0)執(zhí)行過程:先判斷表達式,后執(zhí)行循環(huán)體。循環(huán)控制表達式循環(huán)控制變量循環(huán)體注意:
循環(huán)體有可能一次也不執(zhí)行。循環(huán)前,必須給循環(huán)控制變量賦初值。若循環(huán)體包含一條以上的語句,應以復合語句形式出現(xiàn)。循環(huán)體中,必須有改變循環(huán)控制變量值的語句(使循環(huán)趨向結(jié)束的語句)。
無限循環(huán):while(1)循環(huán)體;循環(huán)體為空如:
while((c=getchar())!='A');從鍵盤輸入字符直到輸入A為止等價于:c=getchar();while(c!='A')c=getchar();5.1while語句一般形式:while(表達式)
循環(huán)體語句例如:k=1;s=0;while(k<=100){s=s+k;k++;}分析:累加求和的問題
s=1+2+3+…+100s=0s=s+1s=s+2s=s+3……和的新值s=s+k和的當前值求和項當前值例1用while語句計算#include<stdio.h>main(){intk,s;s=0;k=1;while(k<=100){s=s+k;k++;}
printf("s=%d",s);}注意:s、k的初值及位置s=0,k=1當k≤100
s=s+kk=k+1用do-while語句實現(xiàn)直到型循環(huán)執(zhí)行循環(huán)體,當表達式的值為真(非0)時,再次執(zhí)行循環(huán)體,如此重復;當表達式為假(0)時結(jié)束循環(huán)。5.2do-while語句一般形式:do
循環(huán)體語句while(表達式);表達式循環(huán)體假(0)真(非0)執(zhí)行過程:先執(zhí)行循環(huán)體,后判斷表達式。循環(huán)體至少執(zhí)行一次。do-while語句可轉(zhuǎn)化成while語句。表達式循環(huán)體;不可省略!切記??!例1用do-while語句計算#include<stdio.h>main(){intk,s;s=0;k=1;
while(k<=100){s=s+k;k++;}
printf("s=%d",s);}#include<stdio.h>main(){intk,s;s=0;k=1;
do{s=s+k;k++;}while(k<=100);
printf("s=%d",s);}s=0,k=1s=s+kk=k+1
當k<=100先判后做先做后判適合于循環(huán)次數(shù)確定或不定5.3for語句一般形式:執(zhí)行過程:for(表達式1;表達式2;表達式3)
循環(huán)體語句求解表達式1循環(huán)體語句求解表達式3下一語句表達式2真(非0)假(0)說明:表達式1在進入循環(huán)之前求解(循環(huán)變量賦初值)for語句可轉(zhuǎn)化成while語句。5.3for語句最簡單的應用形式:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)
循環(huán)體語句例如:for(i=1;i<=100;i++)sum+=i;一般形式:for(表達式1;表達式2;表達式3)
循環(huán)體語句for(表達式1;表達式2;表達式3)
循環(huán)體語句這個分號不能移走表達式1表達式3可以移到循環(huán)體語句的后邊這個分號不能丟掉表達式2為空,則不判斷循環(huán)條件,成無限循環(huán){
表達式3;}for循環(huán)的其他形式:1.表達式1省略時,應在for前給循環(huán)變量賦初值。如:k=1;
for(;k<=3;k++)s=s+k;2.表達式2省略時,不判斷循環(huán)條件,將成為“死循環(huán)”,需要在循環(huán)體中引入break語句以退出循環(huán)3.表達式3省略時,循環(huán)體內(nèi)應有使循環(huán)條件改變的語句。如:for(k=1;k<=3;)
{s=s+k;
k++;}for循環(huán)的說明:4.同時省略表達式1和表達式3,只有表達式2,此時相當于while語句。如k=1;for(;k<=100;){s=s+k;k++;}k=1;while(k<=100){s=s+k;k++;}for循環(huán)的說明:5.表達式2一般是關(guān)系表達式或邏輯表達式,但也可以是數(shù)值表達式或字符表達式,只要其值不等于0就執(zhí)行循環(huán)體。如:for(k=1;k-4;k++)s=s+k;
僅當k的值等于4時終止循環(huán)。k-4是數(shù)值表達式。例1用for語句計算#include<stdio.h>main(){intk,s;s=0;k=1;
while(k<=100){s=s+k;k++;}
printf("s=%d",s);}#include<stdio.h>main(){intk,s;s=0;k=1;
do{s=s+k;k++;}while(k<=100);
printf("s=%d",s);}先判后做先做后判#include<stdio.h>main(){intk,s;s=0;for(k=1;k<=100;k++)s=s+k;
printf("s=%d",s);}5.43種循環(huán)的比較while(表達式)
循環(huán)體語句do
循環(huán)體語句while(表達式);for(表達式1;表達式2;表達式3;)
循環(huán)體語句循環(huán)控制條件也可在循環(huán)體內(nèi)改變循環(huán)控制變量值關(guān)于循環(huán)的控制:循環(huán)控制變量初始化也可在for前5.43種循環(huán)的比較3.一種循環(huán)可以解決的問題,使用另外兩種同樣可行,只是方便程度不同。4.while循環(huán)一般用于循環(huán)次數(shù)不定的情況,for循環(huán)一般用于循環(huán)次數(shù)確定的情況(也可以用于循環(huán)次數(shù)不定的情況),do-while循環(huán)一般用于至少需要執(zhí)行一次的情況。5.for循環(huán)和while循環(huán)是先判斷條件是否為真,再執(zhí)行循環(huán)體,因此,可出現(xiàn)循環(huán)一次也不執(zhí)行的情況;do-while循環(huán)是先執(zhí)行循環(huán)體,再判斷條件是否為真,因此,循環(huán)體至少執(zhí)行一次。6.while循環(huán)、do-while循環(huán)、for循環(huán),可以用break語句跳出循環(huán),用continue語句結(jié)束本次循環(huán)。5.43種循環(huán)的嵌套1.一個循環(huán)體內(nèi)包含著另一個完整的循環(huán)結(jié)構(gòu),就稱為嵌套循環(huán)。2.內(nèi)嵌的循環(huán)中又可以嵌套循環(huán),從而構(gòu)成多重循環(huán)。3.三種循環(huán)可以相互嵌套。下面幾種都是合法的嵌套形式:(1)while(){……
while(){……}…...}(4)while(){……
do{……}while();…….}(5)for(;;){……
while(){……}…...}(3)for(){……
for(;;){……}…….}(6)do{……
for(;;){……}…...}while();(2)do{……
do{……}while();…...}while();1.嵌套的循環(huán)控制變量不應同名,以免造成混亂。2.內(nèi)循環(huán)變化快,外循環(huán)變化慢。例如:for(i=1;i<=9;i++){for(j=1;j<=i;j++)printf("%1d*%1d=%2d",i,j,i*j);
printf("\n");}3.正確確定循環(huán)體。4.循環(huán)控制變量與求解的問題掛鉤。循環(huán)嵌套的說明:分析:用三重循環(huán)的循環(huán)控制變量分別表示百位數(shù)、十位數(shù)和個位數(shù)百位數(shù)i取值1~2十位數(shù)j取值0~9個位數(shù)k取值2~9n=100*i+10*j+km=100*k+10*j+i若m>2*n并m<3*n則n為滿足條件的三位數(shù)例2
試找出滿足下列條件的所有的三位數(shù)
①其百位數(shù)不大于2;
②若將個位與百位對換,得到的三位數(shù)是原三位數(shù)的兩倍多。main(){inti,j,k,n,m,s=0;for(i=1;i<=2;i++)for(j=0;j<=9;j++)for(k=2;k<=9;k++){n=100*i+10*j+k;m=100*k+10*j+i;
if(m>2*n&&m<3*n) {s++;
printf("%d",n);if(s%10==0)printf("\n");}}}例2
試找出滿足下列條件的所有的三位數(shù)
①其百位數(shù)不大于2;
②若將個位與百位對換,得到的三位數(shù)是原三位數(shù)的兩倍多。分析:用一重循環(huán)的循環(huán)控制變量i表示原來的三位數(shù)i=101~299百位數(shù)n1=i/100十位數(shù)n2=(i-n1*100)/10個位數(shù)n3=i-100*n1-10*n2m=100*n3+10*n2+n1若m>2*i并m<3*i則i為滿足條件的三位數(shù)main(){inti,n1,n2,n3,m,s=0;for(i=101;i<=299;i++){n1=i/100;n2=(i-n1*100)/10;n3=i-100*n1-10*n2;m=100*n3+10*n2+n1;
if(m>2*i&&m<3*i){s++;
printf("%d",i);if(s%10==0)printf("\n");}}}5.5break語句和continue語句break語句:break;功能:跳出switch結(jié)構(gòu);在循環(huán)語句中,終止并跳出循環(huán)體。說明:break只能終止并跳出最近一層的結(jié)構(gòu)。break不能用于循環(huán)語句和switch語句之外的任何其它語句之中。例3
計算r=1到r=10的圓面積,直到面積大于100時停止。#definePI3.1415main(){
intr;floatarea;for(r=1;r<=10;r++){area=PI*r*r;
if(area>100)break;
printf("r=%d,area=%.2f\n",r,area);}}運行結(jié)果:r=1,area=3.14r=2,area=12.57r=3,area=28.27r=4,area=50.26r=5,area=78.545.5break語句和continue語句continue語句:continue;功能:結(jié)束本次循環(huán),跳過循環(huán)體中尚未執(zhí)行的語句,進行下一次是否執(zhí)行循環(huán)體的判斷。說明:continue僅用于循環(huán)語句中。例4
把100~200之間不能被3整除的數(shù)輸出。main(){
intn;for(n=100;n<=200;n++){if(n%3==0)continue;
printf("%d",n);}}結(jié)束本次循環(huán),循環(huán)體的剩余語句被忽略,執(zhí)行表達式3,進入下一循環(huán)。continue總是作if的內(nèi)嵌語句。此法更佳if(n%3)printf("%d",n);5.6應用舉例例5用以下公式計算л的值,直到最后一項的絕對值小于1e-6為止。分析:
分子s:1,-1,1,-1…
分母n:1,3,5,7,...1.每項的分母,等于前一項分母加2,用n=n+2實現(xiàn),n的初值為1。2.每項的符號交替變化,用s=-s實現(xiàn),s的初值為+1(第一項為正)。3.根據(jù)上述,每一項的值t=s/n,第一項的值為1。t=1,pi=0,n=1.0,s=1當|t|1e-6pi=pi+tn=n+2s=-st=s/npi=pi*4輸出pi5.6應用舉例例5用以下公式計算л的值,直到最后一項的絕對值小于1e-6為止。t=1,pi=0,n=1.0,s=1當|t|1e-6pi=pi+tn=n+2s=-st=s/npi=pi*4輸出pi#include<math.h>main(){ints=1;floatn,t,pi;t=1.0;n=1.0;pi=0.0;while(fabs(t)>=1e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;
printf("pi=%10.6f\n",pi);}例6求Fibonacci數(shù)列:1,1,2,3,5,8,…的前40項。遞推公式:分析:1.每次計算并輸出兩項f1,f2
,共進行20次循環(huán);2.輸出f1,f2后,計算得到新的f1,f2:
f1=f1+f2f2=f2+f1--------迭代算法3.此數(shù)列增長很快,輸出宜用長整型(%ld),每行輸出四個數(shù),即每輸出4個數(shù)后輸出一個換行符(\n)。f1=1,f2=1fori=1to20輸出f1,f2f1=f1+f2f2=f2+f1例6求Fibonacci數(shù)列:1,1,2,3,5,8,…的前40項。遞推公式:f1=1,f2=1fori=1to20輸出f1,f2f1=f1+f2f2=f2+f1main(){longintf1,f2;
inti;f1=1;f2=1;for(i=1;i<=20;i++){printf("%12ld%12ld",f1,f2);if(i%2==0)printf("\n");
f1=f1+f2;f2=f2+f1;}}例6求Fibonacci數(shù)列:1,1,2,3,5,8,…的前40項。遞推公式:1534233159710946750255142293524578241578171855377258417711121393832040570288739088169213896104181286571964181346269922746563245986321144987676546368317811217830914930352102334155例7搬磚問題:36塊磚36人搬,男搬4女搬3、小孩兩個抬1磚,要求一次全搬完,問男、女、小孩各若干?分析:設(shè)男人、女人、小孩人數(shù)各為men,women,children,則可得如下方程:
4*men+3*women+children/2=36men+women+children=36下面考慮如何尋找另外的約束條件:按常識,men、women、children都應為正整數(shù),且它們的取值范圍分別應為:
men:0~8(假設(shè)36塊磚全由men搬,最多需8人)
women:0~11(假設(shè)36塊磚全由women搬,最多需11人)
children:0~36(假設(shè)36塊磚全由children搬,最多為36人)窮舉算法例7搬磚問題:36塊磚36人搬,男搬4女搬3、小孩兩個抬1磚,要求一次全搬完,問男、女、小孩各若干?本題的細化過程如下:首先從1開始,列舉men的各個可能值,在每個men值下找滿足兩個方程的一組解。算法如下:for(men=1;men<=8;men++){s1:找滿足兩個方程的解的women,childrens2:輸出一組解}下面進一步用細化法來表現(xiàn)S1:for(women=1;women<=11;women++)
{s1.1找滿足方程的一個childrens1.2輸出一組解}例7搬磚問題:36塊磚36人搬,男搬4女搬3、小孩兩個抬1磚,要求一次全搬完,問男、女、小孩各若干?由于每個men與每個women都可以按下式
children=36-men-women求出一個children。因此,只要該children滿足另一個方程
4*men+3*women+childs/2=36便可以得到一組滿足題意的解men、women、children。故S1.1與S1.2可以寫為:
children=36-men-women;if(4*men+3*women+children/2==36)
printf("%d%d%d\n",men,women,children);例7搬磚問題:36塊磚36人搬,男搬4女搬3、小孩兩個抬1磚,要求一次全搬完,問男、女、小孩各若干?main(){intmen,women,children;
printf("\nmen***women***children\n");
for(men=1;men<=8;men++){for(women=1;women<=11;women++)
{children=36-men-women;if(4*men+3*women+children/2==36){printf("%d******",men);
printf("%d******",women);
printf("%d******\n",children);}}}}例7搬磚問題:36塊磚36人搬,男搬4女搬3、小孩兩個抬1磚,要求一次全搬完,問男、女、小孩各若干?運行結(jié)果men***women***children1******6******29******(這是一組錯誤解)3******3******30******原因:丟失重要條件:children應該能夠被2整除。修改如下:
if(4*men+3*women+children/2.0==36)
或
if(children%2==0&&4*men+3*women+children/2==36)
例7判斷正整數(shù)m是否為素數(shù)。什么是素數(shù)----只能被自身和1整除的自然數(shù)。判斷方法----讓m依次被2,3,4,…,
除,如果m能被其中的任何一個整數(shù)整除,則不是素數(shù)。#include<math.h>main(){intm,i,k;
printf("\nInputm:\n");
scanf("%d",&m);k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>k)printf("%disaprime\n",m);elseprintf("%disnotaprime\n",m);}讀入mk=sqrt(m)for(i=2;i<=k;i++)m被i整除真假用break結(jié)束循環(huán)i>k真假輸出:m是素數(shù)輸出:m不是素數(shù)定義變量m,i,k例8求100~200之間的全部素數(shù)。在上題的基礎(chǔ)上,外層增加一個嵌套的for循環(huán)即可。用n作素數(shù)個數(shù)的計數(shù),以控制每行輸出10個數(shù)。#include<math.h>main(){intm,i,k;
printf("\nInputm:\n");
scanf("%d",&m);k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>k)printf("%disaprime\n",m);elseprintf("%disnotaprime\n",m);}
增加intn=0;
for(m=101;m<=200;m+=2)
刪除此行
刪除此行#include<math.h>main(){intm,i,k,n=0;for(m=101;m<=200;m+=2){k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;
if(i>k){printf("%4d",m);n=n+1;if(n%10==0)printf("\n");}
}}
改最后2行main(){introw;
for(row=1;row<=5;row++)
printf("********\n");}分析:1.圖形每行的起始位置相同。2.每行的字符數(shù)相同。3.用一重循環(huán)控制輸出行數(shù)即可。分析:1.每行的起始位置不同,空格數(shù)遞減1。2.每行的字符數(shù)相同。3.用二重循環(huán)實現(xiàn):
外循環(huán)控制輸出行數(shù);內(nèi)循環(huán)控制輸出的空格數(shù)。introw,col;替換為例9打印圖形。{for(col=1;col<=5-row;col++)
printf("");
printf("********\n");}替換為main(){introw,col;
for(row=1;row<=5;row++)
{for(col=1;col<=5-row;col++)printf("");
printf("********\n");}}分析:1.每行的起始位置不同,空格數(shù):5-row2.每行的字符數(shù)不同,字符數(shù):2*row-13.用二重循環(huán)實現(xiàn):
外循環(huán)控制輸出行數(shù);
兩個并列內(nèi)循環(huán)控制輸出每行的空格數(shù)和字符數(shù)例9打印圖形。請思考:若起始位置為20,程序如何修改?main(){introw,col;
for(row=1;row<=5;row++)
{for(col=1;col<=5-row;col++)printf("");for(col=1;col<=2*row-1;col++)pr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年對外貿(mào)易協(xié)議簽訂流程及注意事項版B版
- 2024年標準代銷業(yè)務協(xié)議示例版B版
- 漯河職業(yè)技術(shù)學院《地籍管理》2023-2024學年第一學期期末試卷
- 2025年吉林道路貨運從業(yè)資格證模擬考試
- 2024年商業(yè)物業(yè)管理與社區(qū)安全防范體系建設(shè)合同3篇
- 2024年模具生產(chǎn)服務協(xié)議標準文本版B版
- 單位人事管理制度展示選集
- 2025出租車半股轉(zhuǎn)讓合同
- 鄉(xiāng)村水廠建設(shè)與運營合作協(xié)議
- 環(huán)保工程總包施工合同
- 多金屬廢料高效綜合回收利用產(chǎn)業(yè)升級項目環(huán)評報告書
- 石方開挖的環(huán)保措施
- 商洛市商州區(qū)金礦煤礦礦山地質(zhì)環(huán)境保護與土地復墾方案
- 中國鐵塔股份有限公司代維交接指南(2017年)
- 常用藥物皮試配制法和藥物過敏反應的急救措施
- 醫(yī)學微生物學知到章節(jié)答案智慧樹2023年山東第一醫(yī)科大學
- 印刷通用質(zhì)量檢驗標準
- 電子測量技術(shù)基礎(chǔ)課后答案
- 大興調(diào)查研究研討發(fā)言材料學習心得體會中心組3篇
- 培訓學?;馂膽鳖A案
- 面試評分表完整版
評論
0/150
提交評論