版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第五章循環(huán)結(jié)構(gòu)程序設(shè)計(jì)第一節(jié)為什么使用循環(huán)如何解決求?==1001nnsum算法1:直接寫出算式sum=1+2+3+4+5+…+100算法2:考慮到1+2+3+…+100可以改寫為:(((1+2)+3)+…+100),則有
S1:p1=0+1S2:p2=p1+2S3:p3=p2+3…S99:p99=p98+99S100:p100=p99+100,結(jié)果在p100里。算法3:考慮用變量i存放加數(shù),變量p存放上一步的和。那么每一步都可以寫成:p+i,然后讓p+i的和存入p,即每步都是p=p+i。
S0:p=0,i=1S1:p=p+i,i=i+1S2:p=p+i,i=i+1S3:p=p+i,i=i+1…S100:p=p+i,i=i+1如何解決求?==1001nnsum算法4:在上面的算法基礎(chǔ)上采用循環(huán)功能實(shí)現(xiàn)。
S0:p=0,i=1(循環(huán)初值)
S1:p=p+i,i=i+1(循環(huán)體)
S2:如果i小于或等于100,重復(fù)執(zhí)行步驟S1及S2;否則,算法結(jié)束(循環(huán)控制)。p中的值就是1+2+…+100的值。如何解決求?==1001nnsum?==1001nnsum求解問題的N-S圖打印p的值當(dāng)i≤100p=p+ii=i+1
p=0,i=1用Excel進(jìn)行過程分析!
while語句
1.形式:
while(表達(dá)式)語句
2.作用:
實(shí)現(xiàn)“當(dāng)型”循環(huán),當(dāng)條件滿足時(shí),執(zhí)行語句3.特點(diǎn):
先判斷表達(dá)式,后執(zhí)行語句
條件表達(dá)式循環(huán)體語句真假第二節(jié)while語句與dowhile語句題目分析:sum=1+2+3+……+100變量設(shè)定:
sum
存放計(jì)算的中間結(jié)果和最后結(jié)果,
i
存放被加數(shù);算法分析:
1.開始:sum=0,i=12.如果滿足條件i<=100,則執(zhí)行3,否則轉(zhuǎn)5;3.反復(fù)累加,迭代式子:sum=sum+i; 被加數(shù)i的變化規(guī)律:
i=i+1;
4.轉(zhuǎn)2繼續(xù);5.結(jié)束循環(huán),輸出結(jié)果。例5.1用while語句求#include<stdio.h>main(){inti,sum;
sum=0;i=1;
while(i<=100)
{sum=sum+i; i=i+1; }printf(“sum=%d",sum);}循環(huán)初值循環(huán)條件循環(huán)體{累加迭代式子}例5.1用while語句求舉一反三:1、sum=1+2+3+……+n,其中n由用戶指定。2、sum=1+2+3+……+98+993、sum=2+3+4+……+99+1004、sum=2+4+6+8+……+98+100訓(xùn)練:在上例基礎(chǔ)上思考:如何求提示:凡是此類的求疊加和,而且每個(gè)加數(shù)有規(guī)律的都可用循環(huán)語句完成!訓(xùn)練:同類型的題目:拓展:求1~20之間的奇數(shù)之和及偶數(shù)之積。
2.作用:實(shí)現(xiàn)“直到型”循環(huán)3.特點(diǎn):先執(zhí)行語句,后判斷條件,直到條件不滿足為止。
do—while語句1.形式: do
語句
while(表達(dá)式); 說明:1、2、do-while語句有兩個(gè)保留字,do和while必須成對出現(xiàn)
do語句在執(zhí)行循環(huán)體后才檢查表達(dá)式,所以循環(huán)體至少執(zhí)行一次。循環(huán)體語句條件表達(dá)式循環(huán)體語句條件表達(dá)式do_while語句的圖形表達(dá)真假main(){inti,sum=0;i=1;
do {sum=sum+i; i++; }while(i<=100);
printf(“sum=%d”,sum); }例5.2用do_while語句實(shí)現(xiàn)1+2+3+···+100循環(huán)初值循環(huán)條件循環(huán)體{累加迭代式子}兩種循環(huán)語句形式的比較用while語句實(shí)現(xiàn)main(){inti,sum=0;i=1;
while(i<=100) {sum=sum+i;i++; }printf("sum=%d",sum);}運(yùn)行結(jié)果:sum=5050用do-while語句實(shí)現(xiàn)main(){inti,sum=0;i=1;do{sum=sum+i;i++; }while(i<=100);printf("sum=%d",sum);}運(yùn)行結(jié)果:sum=5050該題目既可以用while語句實(shí)現(xiàn),也可以用do…while語句實(shí)現(xiàn),而且結(jié)果相同!二者在什么時(shí)候有區(qū)別呢?當(dāng)while條件一開始就為假時(shí),二者結(jié)果有區(qū)別??!請上機(jī)體會(huì)dowhile循環(huán)和while循環(huán)的區(qū)別1、dowhile循環(huán),總是先執(zhí)行一次循環(huán)體,然后再判斷表達(dá)式的值。因此,無論表達(dá)式是否為“真”,循環(huán)體至少執(zhí)行一次。2、while循環(huán)先判斷循環(huán)條件再執(zhí)行循環(huán)體,循環(huán)體可能一次也不執(zhí)行。3、在if語句、while語句中,表達(dá)式后面都不能加分號,而在dowhile語句的條件表達(dá)式后面則必須加分號。main(){inti,sum=0;for(i=1;i<=100;i++) sum=sum+i;printf(“sum=%d”,sum);}循環(huán)初值循環(huán)條件循環(huán)體{累加迭代式子}例5.3用for語句實(shí)現(xiàn)1+2+3+···+100第三節(jié)for語句實(shí)現(xiàn)循環(huán)for(表達(dá)式1;表達(dá)式2;表達(dá)式3)循環(huán)體;表達(dá)式1;while(表達(dá)式2){循環(huán)體;表達(dá)式3;}等價(jià)形式for語句一般形式for語句執(zhí)行過程:1)計(jì)算表達(dá)式1;2)計(jì)算表達(dá)式2,若其值為非0(循環(huán)條件成立),則轉(zhuǎn)3)執(zhí)行循環(huán)體;若其值為0(循環(huán)條件不成立),則轉(zhuǎn)5)結(jié)束循環(huán);3)執(zhí)行循環(huán)體;4)計(jì)算表達(dá)式3,然后轉(zhuǎn)2);5)結(jié)束循環(huán),執(zhí)行for循環(huán)之后的語句。for語句的的靈活使用1、i=1;for(;i<=100;i++)for(i=1;i<=100;i++)一般寫法:表達(dá)式1一般是設(shè)置循環(huán)變量初值,但也可以是與循環(huán)變量無關(guān)的其他表達(dá)式,可以是零個(gè)、一個(gè)或多個(gè)表達(dá)式,多個(gè)以逗號分隔。for語句的的靈活使用2、for(i=1;;i++)相當(dāng)于
i=1;while(1){i++;}for(i=1;i<=100;i++)一般寫法:表達(dá)式2是設(shè)置循環(huán)的條件。若省略了表達(dá)式2,編譯可以通過,但循環(huán)條件永遠(yuǎn)為真,即無限循環(huán)。應(yīng)避免此種情況??!for語句的的靈活使用3、for(i=1;i<=100;){i++;}for(i=1;i<=100;i++)一般寫法:表達(dá)式3是使循環(huán)趨于結(jié)束的語句,可以看作是循環(huán)體的一部分。表達(dá)式3可省略,但應(yīng)設(shè)法保證循環(huán)正常結(jié)束,也就是可以把表達(dá)式3放在循環(huán)體中。for語句的的靈活使用4、sum=0;i=1;
for(;i<=100;)i++;或
for(sum=0,i=1;i<=100;i++)sum=0;for(i=1;i<=100;i++)一般寫法:5、for(;;)
三個(gè)表達(dá)式都可以省略,編譯可以通過,但系統(tǒng)在此無限循環(huán)下去??!舉一反三:1、for(s=0,i=10;i>=1;i--)s=s+i;2、for(s=0,i=1;i<=10;i+=2)s=s+i;3、for(s=0,i=2;i<=10;i+=2)s=s+i;完成1~10的自然數(shù)的和。完成1~10的奇數(shù)和。完成1~10的偶數(shù)和。【技能訓(xùn)練二】求正整數(shù)n的階乘n!,其中n由用戶輸入。程序如下:main(){floatfact=1.0;inti,n;scanf("%d",&n);for(i=1;i<=n;i++)fact=fact*i;printf("fac=%f",fact);}main(){floatr,s;inti;floatPi=3.14159;for(i=1,r=0.5;i<=6;i++,r++){s=Pi*r*r;printf("\nr=%4.1f,s=%f",r,s);}}運(yùn)行結(jié)果:r=0.5,s=0.785398r=1.5,s=7.068578r=2.5,s=19.634937r=3.5,s=38.484578r=4.5,s=63.617199r=5.5,s=95.033104【例5.5】寫一個(gè)程序,計(jì)算半徑分別為0.5mm,1.5mm,2.5mm,3.5mm,4.5mm,5.5mm時(shí)圓的面積。main(){floatr,s;for(r=0.5;r<=5.5;r++){s=3.14159*r*r;printf("\nr=%4.1f,s=%f",r,s);}}運(yùn)行結(jié)果:
r=0.5,s=0.785398r=1.5,s=7.068578r=2.5,s=19.634937r=3.5,s=38.484578r=4.5,s=63.617199r=5.5,s=95.033104goto語句實(shí)現(xiàn)循環(huán):
main(){inti=1,sum=0;loop:if(i<=100)//loop為標(biāo)識符,可自行命名{sum=sum+i;i++;
gotoloop;}printf(“sum=%d”,sum);}說明:goto語句是轉(zhuǎn)向語句,可以和if語句構(gòu)成循環(huán),也可以通過它從循環(huán)體中跳出來。但goto語句的程序可讀性差,建議不使用該語句,而盡量使用前面介紹的幾種循環(huán)語句。第四節(jié)幾種循環(huán)的比較例如:求1到100之間不能被3整除的數(shù),用三種循環(huán)均可實(shí)現(xiàn)。/*用while語句實(shí)現(xiàn)*/main(){inti=1;while(i<=100){if(i%3!=0)printf("%4d",i);i++;}}/*用for語句實(shí)現(xiàn)*/main(){inti;for(i=1;i<=100;i++)if(i%3!=0)printf("%4d",i);}/*用do-while語句實(shí)現(xiàn)*/main(){inti=1;do{if(i%3!=0)printf("%4d",i);i++;}while(i<=100);}(6)三種基本循環(huán)結(jié)構(gòu)一般可以相互替代,不能說哪種更加優(yōu)越。具體使用哪一種結(jié)構(gòu)依賴于程序的可讀性和程序設(shè)計(jì)者個(gè)人程序設(shè)計(jì)的風(fēng)格。(1)循環(huán)變量初始化:while和do-while的循環(huán)變量初始化在while和do-while語句之前完成;而for循環(huán)變量初始化可以在表達(dá)式1中完成。(2)循環(huán)條件:while和do-while循環(huán)只在while后面指定循環(huán)條件;而for循環(huán)在表達(dá)式2中指定。(3)循環(huán)變量修改使循環(huán)趨向結(jié)束:while和do-while
循環(huán)要在循環(huán)體內(nèi)包含使循環(huán)趨于結(jié)束的操作;
for循環(huán)可以在表達(dá)式3中完成。(4)for循環(huán)可以省略循環(huán)體,將部分操作放到表達(dá)式2,表達(dá)式3中,for語句功能強(qiáng)大。(5)while和for循環(huán)先測試表達(dá)式,后執(zhí)行循環(huán)體,而do-while是先執(zhí)行循環(huán)體,再判斷表達(dá)式。第五節(jié)多重循環(huán)(嵌套循環(huán))一個(gè)循環(huán)體內(nèi)又包含另一個(gè)完整的循環(huán)結(jié)構(gòu),即循環(huán)套循環(huán)——叫多重循環(huán)(“嵌套循環(huán)”)。按照循環(huán)的嵌套次數(shù),分別稱為二重循環(huán)、三重循環(huán)。一般將處于內(nèi)部的循環(huán)稱為內(nèi)循環(huán),處于外部的循環(huán)稱為外循環(huán)。一般單重循環(huán)只有一個(gè)循環(huán)變量,雙重循環(huán)具有兩個(gè)循環(huán)變量,多重循環(huán)有多個(gè)循環(huán)變量?!纠?.5】打印九九乘法表1×1=11×2=2……1×9=92×1=22×2=4……2×9=183×1=33×2=6……3×9=27………………9×1=99×2=18……9×9=81分析:
第一行為1*i=i;第二行為2*i=2i;第三行為3*i=3i;……;第九行為9*i=9i。行號i從1~9,每次遞增1;列號j從1~9,也是每次遞增1。程序如下:main(){inti,j;for(i=1;i<=9;i++){for(j=1;j<=9;j++)printf("%3d*%d=%2d",i,j,i*j);printf("\n");
}}i為行號,從1-9循環(huán)1×1=11×2=2……1×9=92×1=22×2=4……2×9=183×1=33×2=6……3×9=27………………9×1=99×2=18……9×9=81j為列號,從1-9循環(huán)舉一反三:輸出下三角形的九九表!【例5.6】用循環(huán)語句打印下列圖案:
***************
i=1i<=5j=1j<=20
輸出空格字符j++j=1j<=i輸出“*”字符j++換行i++程序如下:main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=i;j++)printf("*");printf("\n");}}控制行數(shù)為5行,從i=1即第1行開始??刂?數(shù)為i個(gè),i為當(dāng)前行數(shù)。舉一反三:參考上述程序,分別用循環(huán)語句打印下列兩個(gè)圖案:122333444455555
112123123412345【例5.7】用循環(huán)語句打印下列圖案:
*************************
程序如下:main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=20-i;j++)printf(““);for(j=1;j<=2*i-1;j++)printf("*");printf("\n");}}舉一反三:參考上述程序,打印下列圖案:
1123123451234567能力拓展:百錢百雞問題。用100元錢買100只雞,每只公雞5元,每只母雞3元,每3只小雞1元,要求每種雞至少買一只,且必須是整只的,問各種雞各買多少只?提示:(1)這是一個(gè)組合問題;(2)設(shè)i,j,k分別表示公雞、母雞和小雞的只數(shù)。為了確定
i,j,k的取值范圍,可以有不同方法;方法一:i:1~20;j:1~33;k:1~100;依據(jù)價(jià)錢確定出公雞、母雞和小雞的只數(shù):i,j,k的取值范圍。方法二:i:1~20;j:1~33;k:100-i-j;假定每種雞至少有一只。第六節(jié)break和continue語句一、break語句一般形式為:
break;break語句的執(zhí)行過程:終止對switch語句或循環(huán)語句的執(zhí)行(跳出這兩種語句),而轉(zhuǎn)移到其后的語句處執(zhí)行?!纠?.8】從鍵盤上連續(xù)輸入字符,并統(tǒng)計(jì)其中大寫字母的個(gè)數(shù),直到輸入“換行”字符時(shí)結(jié)束。程序如下:#include"stdio.h"main(){
charch;intsum=0;while(1){ch=getchar();if(ch=='\n')break;if(ch>='A'&&ch<='Z')sum++;}printf("sum=%d\n",sum);}
相當(dāng)于循環(huán)條件永遠(yuǎn)為真。如果ch的值為換行符則跳出循環(huán)如果是大寫字母,計(jì)數(shù)器加1參考此例,完成程序設(shè)計(jì)題5,p105關(guān)于break語句的說明
break語句只用于循環(huán)語句或switch語句中。在循環(huán)語句中,break常常和if語句一起使用,表示當(dāng)條件滿足時(shí),立即終止循環(huán)。注意break不是跳出if語句,而是跳出循環(huán)結(jié)構(gòu)。(2)循環(huán)語句可以嵌套使用,break語句只能跳出(終止)其所在的本層循環(huán),而不能完全跳出多層循環(huán)。要實(shí)現(xiàn)逐層跳出多層循環(huán)可以設(shè)置一個(gè)標(biāo)志變量,控制跳出循環(huán)。二、continue語句一般形式:
continue;
continue語句的功能是結(jié)束本次循環(huán)。即跳過本層循環(huán)體中余下尚未執(zhí)行的語句,接著進(jìn)行下一次循環(huán)條件的判定。注意:執(zhí)行continue語句并沒有使整個(gè)循環(huán)終止?!纠?.9】將1~100之間能同時(shí)被3和7整除的數(shù)輸出。程序如下:#include"stdio.h"main(){intn;for(n=1;n<=100;n++){if((n%3!=0)||(n%7!=0))continue;printf(“%5d”,n);
}}輸出:21426384if(n%3==0&&n%7==0)printf(“%5d”,n);改成下面的語句是一樣的結(jié)果!第七節(jié)循環(huán)結(jié)構(gòu)程序設(shè)計(jì)舉例【例5.10】讀入10個(gè)數(shù),編寫程序求其中的最大值。設(shè)變量x表示存放讀入數(shù)據(jù)的變量,變量max存放最大值,i表示循環(huán)次數(shù)。1、首先讀入第一個(gè)數(shù),存入x中,將它設(shè)為最大值:max=x。2、依次讀入其他的數(shù),與最大值max進(jìn)行比較,若比最大值max大,則用當(dāng)前值代替max的值,如此循環(huán)9次。3、打印最大值。該算法比喻成“擂臺賽”!程序如下:main(){inti=0;floatx,max;printf("\nPleaseinputdata:");scanf("%f",&x);max=x;for(i=1;i<10;i++){scanf("%f",&x);if(max<x)max=x;}printf("TheMaxdatais:%f\n",max);}讀入第一個(gè)數(shù)存為最大的數(shù)循環(huán)次數(shù)為9次思考:1、將0作為初值依次跟10個(gè)數(shù)進(jìn)行比較可以嗎?2、求10個(gè)數(shù)中的最小值,應(yīng)怎么修改程序?程序如下:main(){floatx,sum=0,ave;inti=0;printf("Pleaseinputdata:");scanf("%f",&x);while(x>=0){sum=sum+x;i++;scanf("%f",&x);}printf("\ni=%d,ave=%f\n",i,sum/i);}【例5.11】求一批數(shù)據(jù)的平均值。若程序只用一個(gè)scanf語句,該如何修改程序?【例5.12】求階乘的和s=1!+2!+3!+...+20!main(){doubles=0,t=1;inti;for(i=1;i<=20;i++) {t=t*i; s=s+t;}printf("s=%e\n",s);}更新每一個(gè)階乘疊加跟求s=1+21+22+23+…220類似!【能力拓展】編程求S=1/1!+1/2!+1/3!+…+1/20!方法一:用兩重循環(huán)完成,外重循環(huán)控制累加,循環(huán)變量從1~20。內(nèi)重循環(huán)求階乘。方法二:用一重循環(huán)完成,利用公式n!=(n-1)!*n。課后練習(xí):求e=S=1/1!+1/2!+1/3!+…+1/n!,直到最后一項(xiàng)(1/n!)小于10-9為止?!炯寄苡?xùn)練】一個(gè)百萬富翁遇見一個(gè)陌生人,達(dá)成換錢的協(xié)議。陌生人說:第一天我給你10萬元,你只需給我一分錢;第二天我依然給你10萬元,你只需給我二分錢;第三天我給你10萬元,你給我四分錢……以后你每天給我的錢是前一天的二倍,直到滿30天,富翁很高興,欣然同意了。請編程計(jì)算一下,30天后每人各得多少錢?分析:設(shè)fu:富翁得到的錢的總數(shù)
mo:陌生人得到的錢的總數(shù)
t:陌生人每天得到的錢數(shù)第一天:fu=100000.0t=0.01,mo=0.01元循環(huán):2~30天
t=2*t;mo=mo+t;
fu=fu+100000.0;程序如下:#include"stdio.h"main(){intn,i;floatfu,mo,t;fu=0;mo=0;t=0.01;for(i=1;i<=30;i++){mo=mo+t;
t=2*t;fu=fu+100000.0;}printf("richman'smoney=%f",fu);printf("\nstranger'smoney=%f",mo);}運(yùn)行結(jié)果:Therichman'smon
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 撥叉頭加工課程設(shè)計(jì)
- 環(huán)保行業(yè)工程師工作總結(jié)
- IT行業(yè)客戶服務(wù)心得
- 門診部醫(yī)生的工作總結(jié)
- 2024年蘇教版九年級語文上冊教學(xué)工作總結(jié)(共16篇)
- 2024年稅務(wù)師題庫(原創(chuàng)題)
- 《期貨市場投資分析》課件
- 2024年規(guī)章制度會(huì)議記錄(16篇)
- 【人教版九上歷史】知識清單
- 2025關(guān)于房地產(chǎn)銷售代理合同模板
- 骨科疼痛的評估及護(hù)理
- 【MOOC】概率論與數(shù)理統(tǒng)計(jì)-南京郵電大學(xué) 中國大學(xué)慕課MOOC答案
- 2024年度軟件開發(fā)分包合同技術(shù)要求與交底2篇
- 居家養(yǎng)老人員培訓(xùn)管理制度
- 抗菌藥物的合理應(yīng)用培訓(xùn)
- 初三數(shù)學(xué)老師家長會(huì)發(fā)言稿
- 湖北第二師范學(xué)院《操作系統(tǒng)》2023-2024學(xué)年期末試卷
- 2021-2022學(xué)年河北省唐山市高一上學(xué)期期末語文試題
- 舒適化醫(yī)療麻醉
- 南寧二中、柳州高中2025屆高一上數(shù)學(xué)期末聯(lián)考試題含解析
- 吃動(dòng)平衡健康體重 課件 2024-2025學(xué)年人教版(2024)初中體育與健康七年級全一冊
評論
0/150
提交評論