武漢理工大學(xué)C語言課件c5第五章循環(huán)結(jié)構(gòu)_第1頁
武漢理工大學(xué)C語言課件c5第五章循環(huán)結(jié)構(gòu)_第2頁
武漢理工大學(xué)C語言課件c5第五章循環(huán)結(jié)構(gòu)_第3頁
武漢理工大學(xué)C語言課件c5第五章循環(huán)結(jié)構(gòu)_第4頁
武漢理工大學(xué)C語言課件c5第五章循環(huán)結(jié)構(gòu)_第5頁
已閱讀5頁,還剩86頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

循環(huán)結(jié)構(gòu)程序設(shè)計(jì)C

語言程序設(shè)計(jì)

Lecture51循環(huán)結(jié)構(gòu)

循環(huán):就是在給定的條件成立時(shí)反復(fù)執(zhí)行某一程序段,被反復(fù)執(zhí)行的程序段稱為循環(huán)體。在C語言中可以用以下語句來實(shí)現(xiàn)循環(huán):1、用while語句;(“當(dāng)”循環(huán))2、用do--while語句;(“直到”循環(huán))3、用for語句;(計(jì)數(shù)循環(huán))4、用goto語句和if語句構(gòu)成循環(huán)。25.1while語句

1、while語句常稱為“當(dāng)型”循環(huán)語句。

循環(huán)體非零零表達(dá)式3

2、while語句的形式:

while(表達(dá)式)

循環(huán)體;特點(diǎn):先判斷表達(dá)式,后執(zhí)行語句。說明:循環(huán)體有可能一次也不執(zhí)行循環(huán)體可為任意類型語句下列情況,退出while循環(huán)條件表達(dá)式不成立(為零)循環(huán)體內(nèi)遇break,return,goto無限循環(huán):

while(1)

循環(huán)體;4例(ch5_01.c)求1+2+3+4+5+···+100。#include<stdio.h>main(){inti=1,sum=0;while(i<=100){sum+=i;i++;}printf("%d",sum);}循環(huán)初值循環(huán)終值循環(huán)變量增值

循環(huán)條件循環(huán)體5例(ch5_02.c)顯示1~10的平方

#include<stdio.h>main(){inti=1;while(i<=10){ printf("%d*%d=%d\n",i,i,i*i); i++;}}(total.c;totalb.c;total5w.c;fib.c;calc3.c)運(yùn)行結(jié)果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=10065.2do--while語句1、do--while語句常稱為“直到型”循環(huán)語句。

循環(huán)體非00表達(dá)式72、do--while的形式:

do

循環(huán)體;

while(表達(dá)式);特點(diǎn):先執(zhí)行,后判斷。說明:至少執(zhí)行一次循環(huán)體do~while可轉(zhuǎn)化成while結(jié)構(gòu)例:用do~while求1+2+3+4+5+···+100。

(ch5_03.c)

#include<stdio.h>main(){ inti,sum=0; i=1; do {sum+=i;i++;}

while(i<=100); printf("%d",sum);}8

1.循環(huán)體如果包含一個(gè)以上的語句,應(yīng)該用花括號(hào)括起來,以復(fù)合語句形式出現(xiàn)。

2.循環(huán)體中應(yīng)有使循環(huán)趨于結(jié)束的語句。例:分析下列三個(gè)程序段

使用循環(huán)結(jié)構(gòu)要注意:i=1;while(i<=100){putchar(‘*’);i++;}

i=1;putchar(‘*’);

i++;i=1;while(i<=100);putchar(‘*’);i++;9

當(dāng)循環(huán)結(jié)構(gòu):main(){ inti,sum=0;

i=1; while(i<=100)

{ sum=sum+i;

i++;

}

printf(“%d\n”,sum);}

直到循環(huán)結(jié)構(gòu):main(){ inti,sum=0; i=1; do

{ sum=sum+i; i++;

}while(i<=100);

printf(“%d\n”,sum);}105.3for語句1、C語言中最靈活、最復(fù)雜的循環(huán)語句;表達(dá)式1表達(dá)式2循環(huán)體語句表達(dá)式3

可以用于循環(huán)次數(shù)確定的情況;可以用于循環(huán)次數(shù)不確定的情況;可實(shí)現(xiàn)while和

do--while語句所有功能。非00112、for的形式: for(表達(dá)式1;表達(dá)式2;表達(dá)式3)循環(huán)體

說明:for語句中expr1,expr2,expr3類型任意,都可省略,但分號(hào)不可省.無限循環(huán):for(;;)for語句可以轉(zhuǎn)換成while結(jié)構(gòu)

循環(huán)變量賦初值循環(huán)終止條件循環(huán)變量控制12sum=0;

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

它相當(dāng)于以下語句:

i=1;

while(i<=100)

{sum=sum+i;

i++;

}表達(dá)式1;while(表達(dá)式2){語句;表達(dá)式3;}13

3、for語句中表達(dá)式的省略(1)for語句一般形式中的“表達(dá)式1”可以省略; 如: sum=0;i=1; for(;i<=100;i++)sum=sum+i;(2)表達(dá)式2省略,即不判斷循環(huán)條件,循環(huán)無終止地進(jìn)行下去; 如: for(sum=0,i=1;;i++){ sum=sum+i; }if(i>100)break;14(3)表達(dá)式3也可以省略,但此時(shí)保證循環(huán)能正常結(jié)束。 如:for(sum=0,i=1;i<=100;){sum=sum+i;i++;

}(4)可以省略表達(dá)式1和表達(dá)式3,只有表達(dá)式2。 如:i=1;sum=0; i=1;sum=0; for(;i<=100;) while(i<=100){sum=sum+i; {sum=sum+i;i++;i++;

}}15(5)三個(gè)表達(dá)式都可省略,

如: for(;;)循環(huán)體;

相當(dāng)于

while(1)循環(huán)體;

即不設(shè)初值,不判斷條件,循環(huán)變量不增值。無終止地執(zhí)行循環(huán)體。 如: sum=0,i=1; for(;;) {if(i>100)break;sum=sum+i;i++;

}16(6)循環(huán)體為空語句對(duì)for語句,循環(huán)體為空語句的一般形式為:

for(表達(dá)式1;表達(dá)式2;表達(dá)式3);

如:for(sum=0,i=1;i<=100;sum+=i,i++); 又如:要在顯示器上復(fù)制輸入的字符,輸入的字符為‘.’時(shí),結(jié)束循環(huán)。while(putchar(getchar())!=’.’); 輸入abcdefg.輸出abcdefg.17例:#include<stdio.h>main(){inti=0;for(;i<10;putchar(‘a(chǎn)’+i),i++);

}例:#include<stdio.h>main(){inti=0;

for(;i<10;)putchar(‘a(chǎn)’+(i++));}例:#include<stdio.h>main(){inti;for(i=0;i<10;i++)putchar(‘a(chǎn)’+i);}運(yùn)行結(jié)果:abcdefghij例:#include<stdio.h>main(){inti=0;

for(;i<10;i++)

putchar(‘a(chǎn)’+i);}18#include<stdio.h>main(){charc;for(;(c=getchar())!='\n';)printf("%c",c);}main(){inti,j,k;

for(i=1,j=100;i<=j;i++,j--)

{k=i+j; printf("%d+%d=%d\n",i,j,k);}}19循環(huán)終止條件的種類:1.關(guān)系表達(dá)式:

如前幾例2.邏輯表達(dá)式:for(;a>b&&x<y;)3.字符表達(dá)式: for(;(c=getchar())!=‘\n’;) printf(“%c”,c);20[例]

輸入30個(gè)0~9的字符數(shù)字,計(jì)算數(shù)字串中有多少個(gè)奇數(shù),偶數(shù)和零? 思路:▲輸入30個(gè)字符數(shù)字charnum,而不是整數(shù)▲30個(gè)字符的輸入和30個(gè)數(shù)字的輸入的區(qū)別▲字符可以連續(xù)輸入30個(gè)009764146589…...▲

數(shù)字輸入必須是用空格,Tab鍵或回車隔開

009764146589……▲將字符變成數(shù)字后判斷奇偶i=num-’0’;▲字符數(shù)字的ASCII碼:

4849505152535455565721步驟:計(jì)數(shù)變量n1,n2,n3初始值設(shè)為零;輸入1個(gè)字符num;循環(huán)變量初值為1;若i<=30,重復(fù)字符變成數(shù)字,num=num-’0’判斷num是否為0判斷num%2的值循環(huán)變量i++再輸入1個(gè)字符num輸出n1,n2,n3的值。輸入num

n1=0,n2=0,n3=0i=1i<=30num=num-’0’num%2n1++n2++n3++輸出n1,n2,n3的值num==0YNi++輸入num

YN22259718528637908300264710031993

thereare9evens,5zeros,16odds.main(){inti,n1=0,n2=0,n3=0;charnum;scanf(“%c”,&num);for(i=1;i<=30;i++){num=num-’0’;

if(num==0)n1++;if(num%2)n2++;elsen3++;scanf(“%c”,&num);}printf(‘Thereare%2devens,%2dodds,%2dzeros”,n1,n2,n3,);}23解題思路每當(dāng)我們讀入一張選票,只有6種情況,將它們加到相應(yīng)的人選上。-1結(jié)束循環(huán)case語句作為開關(guān)。[例]統(tǒng)計(jì)選票?,F(xiàn)有選票如下 3,1,2,1,1,3,3,2,1,2,3,3,2,1,1,3,2,0,1,4,-1. -1是結(jié)束標(biāo)志。設(shè)1選李,2選張,3選王,0和4為廢票,誰會(huì)當(dāng)選?24main(){intvote,l_vote,z_vote,w_vote,invalidvote;l_vote=0;z_vote=0;w_vote=0;invalidvote=0;scanf(“%d”,&vote);while(vote!=-1){switch(vote){case1:l_vote++;break;case2:z_vote++;break;case3:w_vote++;break;case0:case4:invalidvote++;break;}scanf(“%d”,&vote);}printf('Li%2d,zhang%d2d,wang%2d,invalid%2d”,l_vote,z_vote,w_vote,invalidvote);}25[例]輸入一個(gè)整數(shù),計(jì)算它的位數(shù).并反向輸出.分析:設(shè)一個(gè)數(shù)13579,一位一位地切下末位循環(huán)結(jié)束條件:num==0;同時(shí)計(jì)數(shù)count=count+1;1351357135797bitbit95bit13bit1bitbit=num%10num=num/10135791357135count=0;輸入numnum!=0輸出num%10count++num=num/10輸出count31326main(){longintnum;intcount=0;printf(“Pleaseenteraninteger:\n”);scanf(“%ld”,&num);do{ printf(“%d”,num%10); num=num/10; count++;}while(num!=0);printf(“%ddigits.”,count);}

Pleaseenteraninteger:382992834digits.275.4goto語句1、無條件轉(zhuǎn)移語句;形式:goto標(biāo)號(hào);2、有標(biāo)號(hào)的語句稱為標(biāo)號(hào)語句;形式:標(biāo)號(hào):語句;3、goto語句在使用時(shí)只能轉(zhuǎn)移到goto所在的函數(shù)內(nèi)的標(biāo)號(hào)處,不能轉(zhuǎn)移到該函數(shù)外;4、可以從多重循環(huán)的內(nèi)層轉(zhuǎn)移到最外層,而break只能跳出一層循環(huán)。滿足標(biāo)識(shí)符的規(guī)定28

main(){inti=1,sum=0;loop:if(i<101){sum=sum+i;i++;gotoloop;}printf(“SUM=%f\n”,sum);}loop:

sum=sum+i;

i++;

if(i<101)goto

loop;295.5break語句和continue語句break語句一般形式:break;功能:跳出所在的多分支switch語句跳出所在的while、do-while、for循環(huán)語句(提前結(jié)束循環(huán))。continue語句一般形式:continue;功能:提前結(jié)束本次(本輪)循環(huán)體的執(zhí)行,接著進(jìn)行下一次循環(huán)條件的判別。30break語句main(){inti;for(i=1;i<=5;i++){printf("\n%5d",i);printf("%5d",i);}}main(){inti;for(i=1;i<=5;i++){printf("\n%5d",i);if(i==3)break;printf("\n%d",i);}}

1122334455

11223當(dāng)i=3時(shí),結(jié)束循環(huán)31continue語句main(){inti;for(i=1;i<=5;i++){printf("\n%5d",i);printf("%5d",i);}}main(){inti;for(i=1;i<=5;i++){ printf("\n%5d",i);

if(i==3) continue; printf("\n%d",i);}}

1122334455

112234455當(dāng)i=3時(shí),結(jié)束本次循環(huán)體的執(zhí)行32for(e1;e2;e3){…if(e)continue;…}break與continue的區(qū)別for(e1;e2;e3){…if(e)break;…}計(jì)算e1e2語句…非00e非0語句…計(jì)算e30break語句0計(jì)算e1e2語句…非00e非0語句…計(jì)算e3continue語句循環(huán)體33[例](ch5_05.c)輸出1~10中不是3的倍數(shù)的數(shù)。

main(){ intn; for(n=1;n<=10;n++) {if(n%3==0)break;printf(“%d,”,n);} }輸出:1,2,continue;輸出:1,2,4,5,7,8,10,

不輸出3的倍數(shù)的數(shù)字34main(){inti,num=0,a;floatsum=0;for(i=1;i<=10;i++){ scanf("%d",&a); if(a<=0) continue; num++; sum+=a;}printf(“num=%d,aver=%6.2f\n“,\num,sum/num);}[例]求輸入的十個(gè)整數(shù)中正數(shù)個(gè)數(shù)及其平均值(ch5_06.c)num=0,sum=0輸入整數(shù)ai<=10a<=0YNnum++sum+=ai++i=135(1)while(){……while(){……}…...}(2)do{……do{……}while();…...}while();(3)while(){……do{……}while();…….}5.6循環(huán)的嵌套三種循環(huán)可互相嵌套,層數(shù)不限外層循環(huán)可包含兩個(gè)以上內(nèi)循環(huán)嵌套循環(huán)的執(zhí)行流程嵌套循環(huán)的跳轉(zhuǎn)

禁止:從外層跳入內(nèi)層跳入同層的另一循環(huán)(4)for(;;){……do{……}while();……while(){……}…...}內(nèi)循環(huán)外循環(huán)內(nèi)循環(huán)36(1)當(dāng)外層循環(huán)結(jié)構(gòu)每執(zhí)行一次循環(huán)時(shí),內(nèi)層循環(huán)結(jié)構(gòu)在一般情況下要從循環(huán)的開始到循環(huán)的正常結(jié)束從頭到尾執(zhí)行一遍。

例1(2)在內(nèi)層循環(huán)結(jié)構(gòu)中使用break語句可以提前結(jié)束本次內(nèi)層循環(huán)結(jié)構(gòu)的執(zhí)行,而不影響外層循環(huán)結(jié)構(gòu)的繼續(xù)執(zhí)行。 例2(3)如果程序因某種原因需要從內(nèi)層循環(huán)體跳出整個(gè)循環(huán)結(jié)構(gòu),此時(shí)才可考慮使用goto語句。

例3(4)對(duì)于并列的循環(huán)結(jié)構(gòu),控制循環(huán)執(zhí)行的變量名字可以相同。在嵌套循環(huán)結(jié)構(gòu)中,內(nèi)、外層控制循環(huán)執(zhí)行的變量名字不能相同。

例4

對(duì)于嵌套循環(huán)結(jié)構(gòu)的幾點(diǎn)說明:37例1:main(){inti,j;for(i=0;i<3;i++){for(j=1;j<=4;j++)printf("%d",j);printf("\n");}}運(yùn)行后輸出:

123412341234例2:main(){inti,j;for(i=0;i<3;i++){for(j=1;j<=4;j++){printf("%d",j);if(!(j%3))break;}printf("\n");}}運(yùn)行后輸出:

123123123

38例4:

main(){inti,j;for(i=0;i<3;i++)printf("%d",i);

printf("\n");

for(i=1;i<=4;i++)printf("%d",i);

}運(yùn)行后輸出:例3:main(){inti,j;for(i=0;i<3;i++){for(j=1;j<=4;j++){printf("%d",j);if(!(j%3))gotoK;}printf("\n");}K:;

}運(yùn)行后輸出:

123

012123439分析:求累加和ss=0for(k=1;k<=n;k++){求累乘積tks=s+tk}求累乘積tk=k!tk=1for(i=1;i<=k;i++)

tk=tk*imain(){ inti,k; longs,t; printf("\nInputn:"); scanf("%d",&n); s=0;

for(k=1;k<=n;k++) {t=1;for(i=1;i<=k;i++)t=t*i;

s=s+t; } printf("\ns=%ld",s);}Inputn:5↙s=153[例]

求1!+2!+…+n!(ch5_07.c)

內(nèi)外層循環(huán)控制變量不要同名。40main(){inti,k;longs,t;printf("\nInputn:");scanf("%d",&n);s=0;

for(k=1;k<=n;k++){t=1;for(i=1;i<=k;i++)t=t*i;s=s+t;}printf("\ns=%ld",s);}n=3skk≤3外循tii≤k內(nèi)循Inputn:3↙s=9

12012121111

1212

23033131111

1212

2313

640940

011111114112345678912436991827364554637281……………....例(ch5_08.c)循環(huán)嵌套,輸出九九表。ij42i<=9輸出i*j假(0)真(非0)i=1j++j=1j<=i真(非0)假(0)i++外循環(huán)內(nèi)循環(huán)43#include<stdio.h>main(){inti,j;for(i=1;i<=9;i++)printf("%4d",i);printf("\n---------------------------------------\n");for(i=1;i<=9;i++){ for(j=1;j<=i;j++) printf("%4d",i*j); printf("\n");}}44for(i=1;i<=5;i++)for(j=1;j<=i;j++)printf("");printf("\n“);*for(i=1;i<=5;i++)for(j=1;j<=5-i+1;j++)printf("");printf("\n“);*for(i=1;i<=5;i++)for(j=1;j<5-i+1;j++)printf("");for(j=1;j<=i;j++)printf("");printf("\n");*for(i=1;i<=5;i++)for(j=1;j<i;j++)printf("");for(j=1;j<=5-i+1;j++)printf("");printf("\n“);**************************************************************************************1432for(i=1;i<=5;i++)for(j=1;j<=5;j++)printf("");printf("\n“);*45分析:

行的控制i:1~9‘*’的個(gè)數(shù)j與當(dāng)前行的關(guān)系:

j=2*i-1‘*’前面的空格k與行的關(guān)系:

開始時(shí),第一行有8個(gè)空格每多一行,少一個(gè)空格k=9-iwhile(i<=9){ for(k=1;k<=9-i;k++)

輸出空格; for(j=1;j<=2*i-1;j++)

輸出*;}*********************************************************************************46main(){inti,j,k;i=1;while(i<=9){for(k=1;k<=9-i;k++)printf(“”);for(j=1;j<=2*i-1;j++)printf(“*”);printf(“\n”);i++;}}

i=1

i<=9k=1k<=9-i輸出空格k=k+1j=1j<=2*i-1輸出*j=j+1換行,i=i+147例(ch5_04.c)求fibonacci數(shù)列0,1,1,2,3,5,8,…的前20項(xiàng)。fibonacci數(shù)列滿足下面遞歸關(guān)系:F1=1 (n=1)F2=1 (n=2)Fn=Fn-1+Fn-2 (n≥3)

a=1,b=1fori=1to10輸出a,ba=a+bb=b+a分析:

11235813‥

a+bab+ab

a+bab+

ab‥‥48 main() { inti,a,b,k=0; a=b=1; for(i=1;i<=10;i++) { printf("%10d%10d",a,b); a=a+b;b=a+b; k+=2; if(k%4==0)printf("\n"); } }112358132134558914423337761098749

1

i控制行:

i1~9空格數(shù):9-i121 j控制列:第i行左邊:

1~i12321 右邊:i-1~1.…..12345678987654321[例]編程輸出楊輝三角形(1到9)。50

(ch5_09.c)main(){ inti,j,k,m;for(i=1;i<=9;i++){for(j=1;j<=9-i;j++)/*輸出9-i個(gè)空格*/ putchar(‘’);

for(j=1;j<=i;j++)/*輸出1到i*/ printf(“%d”,j);for(j=i-1;j>0;j--)/*輸出i-1到1*/ printf(“%d”,j);printf(“\n”);}}515.7循環(huán)程序設(shè)計(jì)的問題 寫循環(huán),先要發(fā)現(xiàn)循環(huán)。注意計(jì)算中的重復(fù)性動(dòng)作,引進(jìn)循環(huán)可能統(tǒng)一描述和處理。

重復(fù)動(dòng)作的常見例子:累積一批可按規(guī)律算出的數(shù)據(jù)(如累加等);

反復(fù)從一個(gè)結(jié)果算出下一結(jié)果(遞推等);

對(duì)一批數(shù)據(jù)做同樣的加工處理;等。52寫循環(huán)結(jié)構(gòu)時(shí)要考慮和解決的問題:循環(huán)涉及哪些變量,引進(jìn)什么臨時(shí)性變量?這些變量在循環(huán)正式開始前應(yīng)給什么初值?循環(huán)如何開始?每次循環(huán)中變量的值應(yīng)如何改變?什么情況下繼續(xù)循環(huán)(什么情況下終止)?循環(huán)終止后如何得到所需結(jié)果?53循環(huán)中的幾種變量

循環(huán)中常出現(xiàn)幾類變量,了解這些有助于思考和分析。這也是寫循環(huán)程序的經(jīng)驗(yàn)總結(jié)。

1)循環(huán)控制變量(循環(huán)變量):循環(huán)前設(shè)初值,循環(huán)遞增/遞減,達(dá)到/超過界限時(shí)循環(huán)結(jié)束??刂蒲h(huán)的進(jìn)行/結(jié)束。for中常有這類變量。

for(n=0;n<10;n++)...... for(n=2;n<52;n+=4)......542)累積變量:循環(huán)中常用+=或*=等更新。初值常用運(yùn)算的單位元(加用0;乘用1為初值)。循環(huán)結(jié)束時(shí)變量終值被作為循環(huán)計(jì)算結(jié)果。3)遞推變量:前兩類變量的推廣形式。復(fù)雜循環(huán)常用幾個(gè)協(xié)同的變量,每次由一個(gè)/幾個(gè)變量推出一個(gè)新值,其余依次更新。對(duì)變量x1、x2、x3,循環(huán)體可能有序列:x1=x0...;x2=x1...;x3=...x1...x2...;55本章重點(diǎn)三種循環(huán)語句while,do---while和for建立循環(huán)通常有以下情況:1.給定次數(shù),for比較適用for(i=1;i<100;i++)2.給定條件,while比較適用while((x+y)<z)3.字符的情況通常以回車做結(jié)束符

while((c=getchar())!=‘\n’)4.小經(jīng)驗(yàn):將字符變成數(shù)字i=num-’0’;5.判斷字符范圍

(c>‘a(chǎn)’&&c<‘z’)||(c>‘A’&&c<‘Z’)56本章作業(yè)求23+24+…+210之和。輸入兩個(gè)正整數(shù)a和b,其中a<b,輸出a和b組成的閉區(qū)間中的所有偶數(shù)。從1開始做自然數(shù)的累加,當(dāng)其累加和超過1000時(shí),共計(jì)累加了多少數(shù)?當(dāng)時(shí)的累加和是多少?(break語句)。請(qǐng)編寫程序,其功能是:求出1到1000之內(nèi)能被7或11整除、但不能同時(shí)被7和11整除的所有整數(shù)并將它們輸出。57編寫程序,其功能是:求出能整除x且不是偶數(shù)的各整數(shù)(x由鍵盤輸入),并將它們輸出。

例如,若x中的值為:30,則有4個(gè)數(shù)符合要求,它們是1,3,5,15。有一個(gè)數(shù),用3除余2,用5除余3,用7除2,請(qǐng)找出滿足條件的最小數(shù)。編程打印出如下矩陣:(51~510) 5 25 125 0625 03125 ………….. 0009765625提示581.main(){ intk,i,s=0,t=4; for(k=3;k<=10;k++) { t=t*2;s+=t;} printf("s=%d\n",s);}

#include"math.h"main(){ intk,i,s=0,t=4; for(k=3;k<=10;k++) { t=pow(2,k);s+=t;} printf("s=%d\n",s);}方法一方法二592.main(){ inta,b,t,x; scanf("%d%d",&a,&b); if(a>b) { t=a; a=b; b=t; } for(x=a;x<=b;x+=2) if(x%2) printf("%4d",x+1); else printf("%4d",x);}603.main(){ inta,n,s; s=0,n=0; for(a=1;;a++) { n++; s+=a; if(s>1000) break; }

printf("s=%d,n=%d",s,n);}方法一方法二main(){inta,n,s;s=0,n=0;for(a=1;s<=1000;a++) { n++; s+=a; }printf("s=%d,n=%d",s,n);}615.main(){ inti,n=0; floatscore[30],aver=0.0; for(i=0;i<30;i++) { aa: scanf("%f",&score[i]); if(score[i]>100||score[i]<0) { printf("Error!"); gotoaa; } aver+=score[i]; } aver=aver/30; for(i=0;i<30;i++) if(score[i]>aver) n++; printf("aver=%f,n=%d\n",aver,n); }求全班30名同學(xué)的某門功課在平均成績以上的人數(shù)。627.main(){ inti; longn=1; for(i=1;i<=10;i++) { n=n*5; printf(“%0d\n”,n); }} 635.8程序舉例[例]用/41-1/3+1/5-1/7+…的公式求的近似值,直到最后一項(xiàng)的絕對(duì)值小于10—6為止t=1,pi=0,n=1,s=1當(dāng)|t|10-6pi=pi+tn=n+2s=-s;t=s/npi=pi*4輸出pi#include“math.h”main(){ints;floatn,t,pi;t=1;pi=0;n=1.0;s=1;while((fabs(t))>=1.0e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;printf(“pi=%10.6f\n”,pi);}64方法一:數(shù)列是正、負(fù)相間的,在這里可用一個(gè)“開關(guān)”變量t

來解決符號(hào)的問題。main(){floats=0;intt=1,i;for(i=1;i<101;i++){s+=1.*t/i;t=-t;}printf("s=%f\n",s);}在處理循環(huán)時(shí)應(yīng)注意初、終值的設(shè)定![例]求s=1-1/2+1/3-1/4+…+1/99-1/100。65方法二:分別求出正項(xiàng)和s1(奇數(shù)倒數(shù))與負(fù)項(xiàng)和s2(偶數(shù)倒數(shù)),則s=s1-s2.

main(){

floats,s1=0,s2=0;inti;for(i=1;i<101;i+=2){ s1+=1.0/i;

s2+=1.0/(i+1);}s=s1-s2;printf("s=%f\n",s);}66[例]梯形法求數(shù)值積分。0yxaa+ha+iha+(i+1)hbf(x)f(x)=(4-x2)dxba

∫67main(){ floata,b,h,n1,n2,s=0; inti; printf(“請(qǐng)輸入積分限a和b:”); scanf(“%f%f”,&a,&b); h=(b-a)/1000; for(i=0;i<1000;i++) { n1=4-(a+i*h)*(a+i*h); n2=4-(a+(i+1)*h)*(a+(i+1)*h); s+=(n1+n2)*h/2; } printf(“s=%10.2f\n”,s);}68#include<stdio.h>#defineGOAL39main(){ inti; printf(“Pleaseinputaintegernumber:\n"); do { scanf("%d",&i); if(i>GOAL)printf("%distoobig,inputagain.\n",i); else if(i<GOAL)printf("%distoosamll,inputagain.\n",i); elseprintf("OK!\n");}while(i!=GOAL);}[例]猜數(shù)游戲的最簡(jiǎn)化版。69#include<stdio.h>#include<stdlib.h>main(){inti;intGOAL,num=0;printf("Pleaseinputanumberfrom0to99,or-1toexit:\n");GOAL=random(100);/*產(chǎn)生0到99的隨機(jī)數(shù)*/do{scanf("%d",&i); if(i==-1) {printf("\nExitgame!"); break;}

70num++;if(i>GOAL)printf("%distoobig,inputagain.\n",i);else if(i<GOAL)printf("%distoosamll,inputagain.\n",i); else { printf("OK!\n"); printf("Youtake%dtimestopass!",num); } }while(i!=GOAL);}71[例]枚舉問題或稱為窮舉法。一般用于不定方程求非負(fù)整數(shù)解的問題。它將方程中未知數(shù)可以取的到的非負(fù)整數(shù)逐個(gè)進(jìn)行驗(yàn)證找出所有滿足方程的解。例如:一元人民幣兌換成1分、2分、5分共有多少種方法?若5分、2分、1分的個(gè)數(shù)分別為x個(gè)、y個(gè)、z個(gè),則x的取值為0~20,y的取值為0~50,z的取值為0~100。于是有不定方程:5x+2y+z=100。72main(){inti,j,k,m=0;for(i=0;i<21;i++) for(j=0;j<51;j++) for(k=0;k<101;k++) if(5*i+2*j+k==100) m+=1;printf("m=%d\n",m);}運(yùn)行結(jié)果:m=54130考慮程序的優(yōu)化問題?73

上面程序的循環(huán)次數(shù)超過10萬次,且大量的循環(huán)都不滿足方程。可對(duì)程序進(jìn)行優(yōu)化,由于隨著5分個(gè)數(shù)的增加,2分個(gè)數(shù)就會(huì)減少,因此循環(huán)變量j可控制在(100-5i)/2以內(nèi),這樣使得5i+2j<=100。若不足100則補(bǔ)充1分,將問題轉(zhuǎn)換成為求循環(huán)次數(shù)的問題了。main(){inti,j,m=0;for(i=0;i<21;i++)for(j=0;j<=(100-5*i)/2;j++) m+=1;printf("m=%d\n",m);}因?yàn)樵摬欢ǚ匠讨?,如果有兩個(gè)未知數(shù)確定后,第三個(gè)未知數(shù)也隨之確定。即確定了一種分法。例如:i=20時(shí),j=0i=19時(shí),j=0,1,2i=18時(shí),j=0,1,2,3,4,574[例]輸入若干字母,將它們變成其后的第四個(gè)字母, A-->E,W-->A。非字母字符忽略。思路:1.建立循環(huán),循環(huán)結(jié)束以輸入回車符為準(zhǔn)while(c=getchar()!=’\n’)2.判斷輸入是否是字符,否則忽略

if((c>=’a’&&c<=’z’)||(c>=’A’&&c<=’Z’))3.變成其后的第四個(gè)字母c=c+4;4.若變換后超出z時(shí),要輪回.If((c>’Z’&&c<‘a(chǎn)’)||(c>’z’))c=c-26…A…Z….a….z…..75#include“stdio.h”main(){charc;while(c=getchar()!=’\n’){if((c>=’a’&&c<=’z’)||(c>=’A’&&c<=’Z’)){c=c+4;if((c>’Z’&&c<=’a’)||(c>’z’))c=c-26;}printf(“%c”,c);}}abdEgWefhIkA76[例]

輸入若干數(shù)字,-1為輸入結(jié)束標(biāo)志,計(jì)算它們的平均數(shù)。main(){floatvalue,total,average;intcounter;total=0;counter=0;average=0;

scanf(“%d”,&value);while(value!=-1)

{total=total+value;counter++;

scanf(“%f”,&value);}if(counter==0)printf(“Nodataentered.\n”);else{average=total/counter;printf(‘Theaverageof%dvaluesis%f”,counter,average)}}23.985.68227E020.008637593.447114.7E-0566-1Theaverageof9valuesis2568.33641277*************

本例還是要考慮每行的空格數(shù)、和星號(hào)數(shù)問題,但要關(guān)注空格數(shù)與星號(hào)數(shù)在增加到一定的時(shí)候又要減少的規(guī)律。[例]用循環(huán)語句顯示下面的圖案。78for(i=0;i<4;i++){for(j=0;j<20-i;j++)printf(“”);/*空格遞減*/for(k=0;k<2*i+1;k++)printf(“*”);/*星號(hào)遞增*/}

#include<math.h>main(){inti,j,k;for(i=-2;i<=2;i++){ for(j=1;j<=18+fabs(i);j++) printf("");

for(k=1;k<=5-2*fabs(i);k++) printf("*"); printf("\n");}}fabs(i)變化規(guī)律是:2,1,0,1,2。

每行的空格數(shù)是:20,19,18,19,20。每行的星號(hào)數(shù)是:1,2,3,2,1。注意初終值從-2到2的目的。79[例]汽車?yán)锍瘫砩系淖x數(shù)是95859,7小時(shí)之后里程表的讀數(shù)是一個(gè)對(duì)稱數(shù)(最大是5位數(shù)),問汽車的速度(是一個(gè)整數(shù))。解題思路:檢查所有的在95859到99999之間的對(duì)稱數(shù),如果它與95859的差能被7整除,則商是速度。80/*第一種算法*/

main(){longi=95859,a,b,c,e,d;flaotf,g;while(i<=99999)

{a=i/10000;

b=(i-a*10000)/1000;

c=(i-a*10000-b*1000)/100;

d=(i-a*10000-b*1000-c*100)/10;

e=i-a*10000-b*1000-c*100-d*10;

if((a==e)&&(b==d))

if((i-95859)%7)==0)

printf(“Thespeedis%d”,(i-95859)/7);

i++;

}}

該程序需要執(zhí)行循環(huán)99999-95859次!81/*第二種算法*/main(){longi,distance,a,b,c,d;(fori=1;i<=200;i++){distance=95859+i*7;a=distance/10000b=(distance-a*10000)/1000;c=(distance-a*10000-b*1000)/100;d=(distance-a*10000-b*1000-c*100)/10;e=distance-a*10000-b*1000-c*

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論