版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2023/11/271第五章循環(huán)結(jié)構(gòu)5.1while語(yǔ)句5.2do-while語(yǔ)句5.3for語(yǔ)句5.4break、continue和goto語(yǔ)句5.5循環(huán)的嵌套5.6復(fù)合結(jié)構(gòu)程序舉例22023/11/27C語(yǔ)言有while、do-while、和for語(yǔ)句三種循環(huán)結(jié)構(gòu)語(yǔ)句。前兩個(gè)稱(chēng)為條件循環(huán),即根據(jù)條件來(lái)決定是否繼續(xù)循環(huán);后一個(gè)稱(chēng)為計(jì)數(shù)循環(huán),即根據(jù)設(shè)定的執(zhí)行次數(shù)來(lái)執(zhí)行循環(huán)。
在許多問(wèn)題中需要用到循環(huán)控制。例如,要輸入全校學(xué)生成績(jī);求若干個(gè)數(shù)之和;迭代求根等。幾乎所有實(shí)用的程序都包含循環(huán)。循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計(jì)的基本結(jié)構(gòu)之一,它和順序結(jié)構(gòu)、選擇結(jié)構(gòu)共同作為各種復(fù)雜程序的基本構(gòu)造單元。因此熟練掌握選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的概念及使用是程序設(shè)計(jì)的最基本的要求。32023/11/275.1while語(yǔ)句1.While語(yǔ)句的一般形式
while
(表達(dá)式)
語(yǔ)句
首先計(jì)算表達(dá)式,當(dāng)表達(dá)式為非0時(shí),執(zhí)行while語(yǔ)句中的內(nèi)嵌語(yǔ)句;然后重新計(jì)算表達(dá)式,如果表達(dá)式的值為0,則跳出循環(huán)。
2.while語(yǔ)句的執(zhí)行流程
表達(dá)式語(yǔ)句非00注意:如果表達(dá)式的值一開(kāi)始就為0,則語(yǔ)句一次也會(huì)被不執(zhí)行。42023/11/27特點(diǎn):先判斷表達(dá)式,后執(zhí)行循環(huán)體說(shuō)明:循環(huán)體有可能一次也不執(zhí)行循環(huán)體可為任意類(lèi)型語(yǔ)句下列情況,退出while循環(huán)條件表達(dá)式不成立(為零)循環(huán)體內(nèi)遇break,return,goto無(wú)限循環(huán):while(1)
循環(huán)體;52023/11/27while語(yǔ)句舉例例1:求∑n
100n=1
main(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf(“%d”,sum);}62023/11/27例2:顯示1~10的平方#include<stdio.h>main(){inti=1;while(i<=10){printf("%d*%d=%d\n",i,i,i*i);i++;}}運(yùn)行結(jié)果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=10072023/11/27注意:(1)循環(huán)體如果包含一個(gè)以上的語(yǔ)句,應(yīng)該用花括弧括起來(lái),以復(fù)合語(yǔ)句形式出現(xiàn)。如果不加花括弧,則
while語(yǔ)句的范圍只到
while后面第一個(gè)分號(hào)處。
(2)在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語(yǔ)句。如果無(wú)此語(yǔ)句,則i的值始終不改變,循環(huán)永不結(jié)束。82023/11/275.2do—while語(yǔ)句1.do-while語(yǔ)句的一般形式為:
do
循環(huán)體語(yǔ)句
while
(表達(dá)式);
2.do-while語(yǔ)句的執(zhí)行流程
當(dāng)表達(dá)式值為真循環(huán)體語(yǔ)句(b)循環(huán)體語(yǔ)句表達(dá)式(a)TF92023/11/27do—while語(yǔ)句執(zhí)行過(guò)程首先執(zhí)行語(yǔ)句,再計(jì)算表達(dá)式。如果表達(dá)式的值為非零,繼續(xù)下一次循環(huán),如果表達(dá)式的值為0,則跳出循環(huán)。如果表達(dá)式的值一開(kāi)始就為0,也會(huì)執(zhí)行一次語(yǔ)句。102023/11/27例用do~while循環(huán)求
#include<stdio.h>main(){inti,sum=0;i=1;do{sum+=i; i++;}while(i<=100);printf("%d",sum);}112023/11/27例while和do~while比較#include<stdio.h>main(){inti,sum=0;scanf("%d",&i);do{sum+=i; i++;}while(i<=10);printf("%d",sum);}#include<stdio.h>main(){inti,sum=0;scanf("%d",&i);while(i<=10){sum+=i; i++;}printf("%d",sum);}思考:這兩個(gè)程序完全一樣嗎?122023/11/27結(jié)論:當(dāng)while后面的表達(dá)式的第一次的值為“真”時(shí),兩種循環(huán)得到的結(jié)果相同,否則兩者結(jié)果不相同(指兩者具有相同的循環(huán)體的情況)。
132023/11/27例如:i=1;while(i<=100)putchar(‘*’);i++;
思考:這個(gè)程序段有如何的運(yùn)行結(jié)果?142023/11/27注意:循環(huán)控制變量值在循環(huán)體內(nèi)必須有所改變。例如:i=1;while(i<=100)putchar(‘*’);i++;
這個(gè)循環(huán)永遠(yuǎn)不會(huì)結(jié)束,因?yàn)檠h(huán)控制變量i沒(méi)有在循環(huán)體內(nèi)被改變,i++;不屬于循環(huán)語(yǔ)句。i++應(yīng)該在循環(huán)體內(nèi)改變:i=1;while(i<=100){putchar(‘*’);i++;}152023/11/27舉例:#include<stdio.h>
main(){floatscore,average=0;intn=0;do{scanf(“%f”,&score);if(score>=0){average+=score;n++;}}while(score>=0);if(n!=0)average=average/n;printf(“%6.2f”,average);}思考:該程序是什么功能?162023/11/27for循環(huán)語(yǔ)句是C語(yǔ)言中功能最強(qiáng)的循環(huán)語(yǔ)句,它有多個(gè)變化形式,并且可以很方便的代替其它的循環(huán)語(yǔ)句。5.3for語(yǔ)句for語(yǔ)句的一般形式
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)循環(huán)體語(yǔ)句172023/11/27①先計(jì)算初值表達(dá)式1,它主要用于循環(huán)開(kāi)始前設(shè)置變量初值;②接著計(jì)算循環(huán)控制邏輯表達(dá)式2,它控制循環(huán)條件,決定循環(huán)次數(shù);③如果表達(dá)式2為真,則執(zhí)行循環(huán)體語(yǔ)句,否則結(jié)束for循環(huán);④求解表達(dá)式3,它主要是對(duì)循環(huán)控制變量進(jìn)行修改。⑤轉(zhuǎn)步驟②執(zhí)行。求表達(dá)式1表達(dá)式2語(yǔ)句求表達(dá)式3for語(yǔ)句的下一語(yǔ)句真假for執(zhí)行流程182023/11/27求1+2+…+99#include(stdio.h)
main()
{inti,s=0;/*s清0*/
for(i=1;i<100;i++)
s=s+i;
printf(“s=%d”,i;)
}i=0i<100s=s+ii++例:192023/11/27for語(yǔ)句說(shuō)明(1)for語(yǔ)句的一般形式中的“表達(dá)式1”可以省略,注意省略表達(dá)式1時(shí),其后的分號(hào)不能省略。如for(;i<=100;i++)sum=sum+i;執(zhí)行時(shí),跳過(guò)“求解表達(dá)式1”這一步,其他不變。(2)如果表達(dá)式2省略,即不判斷循環(huán)條件,循環(huán)無(wú)終止地進(jìn)行下去。也就是認(rèn)為表達(dá)式2始終為真。例如:
for(i=1;;i++)sum=sum+i;它相當(dāng)于:
i=1;while(1){sum=sum+1;i++;}202023/11/27for語(yǔ)句說(shuō)明2(3)表達(dá)式3也可以省略,但此時(shí)程序設(shè)計(jì)者應(yīng)另外設(shè)法保證循環(huán)能正常結(jié)束。如:
for(i=l;i<=100;)
{sum=sum+l;
i++;}(4)可以省略表達(dá)式1和表達(dá)式3,只有表達(dá)式2,即只給循環(huán)條件。如:
for(;i<=100)while(i<=100){sum=sum+l;相當(dāng)于{sum=sum+l;
i++;}i++;}212023/11/27for語(yǔ)句說(shuō)明3(5)3個(gè)表達(dá)式都可省略,如:for(;;)語(yǔ)句相當(dāng)于while(1)語(yǔ)句即不設(shè)初值,不判斷條件(認(rèn)為表達(dá)式2為真值),循環(huán)變量不增值。無(wú)終止地執(zhí)行循環(huán)體。(6)表達(dá)式1可以是設(shè)置循環(huán)變量初值的賦值表達(dá)式,也可以是與循環(huán)變量無(wú)關(guān)的其他表達(dá)式。如:
for(sum=0;i<=100;i++)sum=sum+i;表達(dá)式1和表達(dá)式3可以是一個(gè)簡(jiǎn)單的表達(dá)式,也可以是逗號(hào)表達(dá)式,即包含一個(gè)以上的簡(jiǎn)單表達(dá)式,中間用逗號(hào)間隔。如:
for(sum=0,i=1;i<=100;i++)sum=sum+i;或for(i=0,j=100;i<=j;i++,j--)k=i+j;222023/11/27for語(yǔ)句說(shuō)明4(7)表達(dá)式2一般是關(guān)系表達(dá)式(如i<=100)或邏輯表達(dá)式(如a<b&&x<y),但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值為非零,就執(zhí)行循環(huán)體。分析下面兩個(gè)例子:②for(;(c=getchar())!=‘\n’;)printf(“%c”,c);①for(i=0;(c=getchar())!=‘\n’;i+=c);此for語(yǔ)句的執(zhí)行過(guò)程見(jiàn)圖,它的作用是不斷輸入字符,將它們的ASCII碼相加,直到輸入一個(gè)“換行”符為止。i=0取一個(gè)字符=>cC≠換行符i=i+cTF232023/11/27例:#include<stdio.h>main(){inti=0;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);}242023/11/27運(yùn)行結(jié)果:abcdefghij例:#include<stdio.h>main(){inti=0;
for(;i<10;)putchar(‘a(chǎn)’+(i++));}例:#include<stdio.h>main(){inti=0;
for(;i<10;putchar(‘a(chǎn)’+i),i++)
;}252023/11/27舉例問(wèn)題:求s=1/99+2/98+…+1
#include<stdio.h>main(){inti,j;floats=0.0;for(i=1,j=99;i<=j;i++,j--)s=s+i/j;printf(“s=1/99+2/98+…+1=%f”,s);}思考:上面程序的運(yùn)行結(jié)果是多少?為什么?262023/11/27舉例問(wèn)題:求s=1/99+2/98+…+1
#include<stdio.h>main(){inti,j;floats=0.0;for(i=1,j=99;i<=j;i++,j--)s=s+i/j;printf(“s=1/99+2/98+…+1=%f”,s);}思考:上面程序的運(yùn)行結(jié)果是多少?程序的運(yùn)行結(jié)果是:
s=1/99+2/98+…+1=1.000000為什么?272023/11/275.4break、continue、goto語(yǔ)句
這一類(lèi)語(yǔ)句的功能是改變程序的結(jié)構(gòu),使程序從其所在的位置轉(zhuǎn)向另一處。這類(lèi)語(yǔ)句是非結(jié)構(gòu)化語(yǔ)句282023/11/27非結(jié)構(gòu)化語(yǔ)句之break
它的作用是把流程轉(zhuǎn)向所在結(jié)構(gòu)之后。在switch分支結(jié)構(gòu)中,使用break語(yǔ)句可以使流程跳出switch分支結(jié)構(gòu)。同樣的,在循環(huán)結(jié)構(gòu)中,使用break語(yǔ)句使流程跳出當(dāng)前的循環(huán)層,轉(zhuǎn)向執(zhí)行該循環(huán)結(jié)構(gòu)后面的語(yǔ)句。
簡(jiǎn)單的說(shuō)就是跳出當(dāng)前所在的結(jié)構(gòu)break語(yǔ)句不能用于循環(huán)語(yǔ)句和switch語(yǔ)句之外的任何其他語(yǔ)句中。break只能終止并跳出最近一層的結(jié)構(gòu)292023/11/27expr……break;……假(0)真(非0)whiledo……break;…...expr假(0)真(非0)while302023/11/27expr2……break;…...假(0)真(非0)forexpr1expr3switchexpr語(yǔ)句組1break;語(yǔ)句組2break;語(yǔ)句組nbreak;語(yǔ)句組break;…...const1const2constndefaultcase312023/11/27main()
{
ints=0,i=1:
for(;;)
{s=s+i;i++;
if(i>100)break;
/*如果i>100,則退出循環(huán)*/
}
printf(“s=%d”,s);
}
本程序中,當(dāng)i>100時(shí),強(qiáng)行終止for循環(huán),繼續(xù)執(zhí)行for語(yǔ)句下一條語(yǔ)句例如:322023/11/27例break舉例:輸出圓面積,面積大于100時(shí)停止#definePI3.14159main(){intr;floatarea;for(r=1;r<=10;r++){area=PI*r*r;if(area>100) break;printf("r=%d,area=%.2f\n",r,area);}}332023/11/27例break舉例:小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字母,直至輸入非字母字符342023/11/27例break舉例:小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字母,直至輸入非字母字符#include<stdio.h>main(){inti,j;charc;while(1){c=getchar(); if(c>='a'&&c<='z') putchar(c-'a'+'A'); else break;}}352023/11/27
非結(jié)構(gòu)化語(yǔ)句之continuecontinue語(yǔ)句被稱(chēng)為繼續(xù)語(yǔ)句。執(zhí)行continue語(yǔ)句,使本次循環(huán)提前結(jié)束,即跳過(guò)循環(huán)體中continue語(yǔ)句下面的尚未執(zhí)行的循環(huán)體語(yǔ)句,但不結(jié)束整個(gè)循環(huán),繼續(xù)進(jìn)行下一次循環(huán)的條件判別,條件為真,繼續(xù)進(jìn)行執(zhí)行循環(huán)語(yǔ)句。該語(yǔ)句形式為:
continue;362023/11/27continue語(yǔ)句功能:結(jié)束本次循環(huán),跳過(guò)循環(huán)體中尚未執(zhí)行的語(yǔ)句,進(jìn)行下一次是否執(zhí)行循環(huán)體的判斷僅用于循環(huán)語(yǔ)句中expr……continue;……假(0)真(非0)while真(非0)do……continue;…...expr假(0)whileexpr2……continue;…...假(0)真(非0)forexpr1expr3372023/11/27例:顯示輸入的字符,如果按的是Esc鍵,則退出循環(huán);如果按的是Enter鍵,則不做任何處理,繼續(xù)輸入下一個(gè)字符。#include“conio.h”main(){charch;
for(;;){ch=getchar();/*字符輸入函數(shù)*/if(ch==27)/*Esc鍵的ACSII碼為27*/
break;/*退出循環(huán)*/if(ch==13)
continue;/*按的是Enter:鍵,跳過(guò)字符輸出語(yǔ)句*/putchar(ch);/*顯示輸入的字符*/}getch();/*讓程序停一下,拍任意鍵繼續(xù)*/}382023/11/27例求輸入的十個(gè)整數(shù)中正數(shù)的個(gè)數(shù)及其平均值392023/11/27例求輸入的十個(gè)整數(shù)中正數(shù)的個(gè)數(shù)及其平均值/*ch5_12.c*/#include<stdio.h>main(){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);}402023/11/27非結(jié)構(gòu)化語(yǔ)句之gotogoto被稱(chēng)為無(wú)條件轉(zhuǎn)移語(yǔ)句。由兩部分組成goto標(biāo)號(hào);
和標(biāo)號(hào):語(yǔ)句
它最大的好處就是可以一下子跳出多重循環(huán),而break卻不能做到這點(diǎn)。412023/11/27#include“stdio.h”main(){floatscore,average=0;
intn=0;
scanf(“%f”,&score);/*輸入第一個(gè)學(xué)生的分?jǐn)?shù)*/if(score<0)gotoend;
/*表達(dá)式為非0,轉(zhuǎn)移到end標(biāo)號(hào)處*/loop:average+=score;
n++;
scanf(“%f”,&score);
if(score>=0)/*表達(dá)式為非0,轉(zhuǎn)移到loop標(biāo)號(hào)處*/gotoloop;
average=average/n;/*求平均成績(jī)average*/
end:printf(“%6.2f”,average);/*輸出平均成績(jī),保留兩位小數(shù)*/}422023/11/27例:用if語(yǔ)句和goto語(yǔ)句構(gòu)成循環(huán),求
∑n100n=1
main(){inti,sum=0;i=1;loop:if(i<=100){sum=sum+i;i++;
gotoloop;}printf(“%d”,sum);}運(yùn)行結(jié)果如下:5050432023/11/27程序舉例(P124例6.6)t=1,pi=0,n=1.0,s=1當(dāng)|t|1e-6pi=pi+tn=n+2s=-st=s/npi=pi*4輸出pi分子:1,-1,1,-1…分母:1,3,5,7,...442023/11/27例求Fibonacci數(shù)列:1,1,2,3,5,8,……的前40個(gè)數(shù)f1=1,f2=1fori=1to20輸出f1,f2f1=f1+f2f2=f2+f11534233159710946750255142293524578241578171855377258417711121393832040570288739088169213896104181286571964181346269922746563245986321144987676546368317811217830914930352102334155452023/11/27程序如下main(){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;}}462023/11/27例判斷m是否素?cái)?shù)讀入mk=mi=2當(dāng)i
km被i整除真假用break結(jié)束循環(huán)i=i+1i
k+1真假輸出:m”是素?cái)?shù)”輸出:m”不是素?cái)?shù)”472023/11/27 5.5循環(huán)的嵌套
在循環(huán)體語(yǔ)句中又有另一個(gè)完整的循環(huán)結(jié)構(gòu)的形式,稱(chēng)為循環(huán)的嵌套。嵌套在循環(huán)體內(nèi)的循環(huán)語(yǔ)句稱(chēng)為內(nèi)循環(huán),外面的循環(huán)語(yǔ)句稱(chēng)為外循環(huán)。如果內(nèi)循環(huán)體中又有嵌套的循環(huán)語(yǔ)句,稱(chēng)為多層循環(huán)。While、do-while、for三種循環(huán)都可以互相嵌套。循環(huán)嵌套的程序中,要求內(nèi)循環(huán)必須被包含在外層循環(huán)的循環(huán)體中,不允許出現(xiàn)內(nèi)外層循環(huán)體交叉的情況。482023/11/27下面幾種情況均為合法的形式while(){…while(){…}}(2)do{…do{…}while();}while();(3)for(;;){for(;;){…}}(4)while(){…do{…}while();….}492023/11/27(5)for(;;){….while(){…}….}(6)do{…for(;;){…}}while();
注意:在循環(huán)嵌套中,內(nèi)循環(huán)必須在外循環(huán)開(kāi)始循環(huán)之前結(jié)束。502023/11/27循環(huán)嵌套舉例問(wèn)題:輸出圖形*********************分析:一共6行,每行的‘*’數(shù)目與行號(hào)相同算法:行用i表示,當(dāng)i<=6則輸出i個(gè)‘*’換行inti,j;for(i=1;i<7;i++){printf("\n");
for(j=1;j<=i;j++)putchar('*');}512023/11/27輸出結(jié)果:執(zhí)行語(yǔ)句段:for(i=0;i<6;i++)
{
for(j=0;j<6;j++)printf(“%3d%3d”,i,j);
putchar(‘\n’);
}例:522023/11/27000102030405101112131415202122232425303132333435404142434445505152535455輸出結(jié)果:執(zhí)行語(yǔ)句段:for(i=0;i<6;i++)
{
for(j=0;j<6;j++)printf(“%3d%3d”,i,j);
putchar(‘\n’);
}例:532023/11/27問(wèn)題:輸出圖形****************
分析:一共4行,每行*個(gè)數(shù)是1,3,5,7,如果考慮第4行輸出不空格,則每行輸出*之前的空格數(shù)為3,2,1,如果用i表示每行輸出*的個(gè)數(shù),則輸出空格數(shù)與i的關(guān)系為(7-i)/2,所以:#include<stdio.h>main()
{inti,j;
for(i=1;i<=7;i+=2)
{printf(“\n”);
for(j=1;j<=(7-i)/2;j++)
putchar(‘’);
/*輸出(7-i)/2個(gè)空格*/
for(j=1;j<=i;j++)
putchar(’*’);
/*輸出i個(gè)‘*’*/}
}2023/11/2754方法二:若將行號(hào)k看成是1,2,3,4;那么可以發(fā)現(xiàn)每行的空格數(shù)3,2,1,0即為4-k;每行的*數(shù)目1,3,5,7即為2*k-1;所以可以編程如下:Main(){intk,j;printf(“\n”);for(k=1;k<=4;k++){for(j=4-k;j>0;j--)printf(““);for(j=1;j<=2*k-1;j++)printf(“*”);printf(“\n”);}}
552023/11/275.6幾種循環(huán)的比較(1)四種循環(huán)都可以用來(lái)處理同一問(wèn)題,一般情況下它們可以互相代替。但一般不提倡用goto型循環(huán)。(2)
while和do-while循環(huán),只在
while后面指定循環(huán)條件,在循環(huán)體中應(yīng)包含使循環(huán)趨于結(jié)束的語(yǔ)句(如i++,或i=i+1等)。
for循環(huán)可以在表達(dá)式3中包含使循環(huán)趨于結(jié)束的操作,甚至可以將循環(huán)體中的操作全部放到表達(dá)式3中。因此for語(yǔ)句的功能更強(qiáng),凡用while循環(huán)能完成的,用for循環(huán)都能實(shí)現(xiàn)。562023/11/27比較(4)
while循型、do-while循環(huán)和
for循環(huán),可以用
break語(yǔ)句跳出循環(huán),用
continue語(yǔ)句結(jié)束本次循環(huán)。而對(duì)用goto語(yǔ)句和if語(yǔ)句構(gòu)成的循環(huán),不能用break語(yǔ)句和continue語(yǔ)句進(jìn)行控制。(3)用while和do-while循環(huán)時(shí),循環(huán)變量初始化的操作應(yīng)在while和do-while語(yǔ)句之前完成。而
for語(yǔ)句可以在表達(dá)式1中實(shí)現(xiàn)循環(huán)變量的初始化。572023/11/275.7復(fù)合程序結(jié)構(gòu)及舉例
C語(yǔ)言允許循環(huán)語(yǔ)句與分支結(jié)構(gòu)語(yǔ)句聯(lián)用,即在循環(huán)體包含一個(gè)完整的分支結(jié)構(gòu),這樣的程序結(jié)構(gòu)被稱(chēng)為復(fù)合程序結(jié)構(gòu)。復(fù)合程序結(jié)構(gòu)同樣必須做到嵌套層次清楚,決不允許出現(xiàn)嵌套層次之間相互交叉的情況。582023/11/27例1用C語(yǔ)言編程打印1到10的乘法表。main(){intj,k;printf("12345678910\n");printf("--------------------------------\n");for(j=1;j<=10;j++){printf("%4d|",j);for(k=1;k<=10;k++)printf("%4d|",j*k);printf("\n");}}592023/11/27例2用C語(yǔ)言編程實(shí)現(xiàn)從鍵盤(pán)輸入一個(gè)數(shù)字串,然后把它變成一個(gè)實(shí)數(shù)輸出。分析:★首先要判斷輸入的是否是數(shù)字還是‘.’;使用函數(shù)isdigit()?!锊捎胓etchar()函數(shù)進(jìn)行輸入,輸入的字符常量是ASCII碼的值,怎樣轉(zhuǎn)換成對(duì)應(yīng)的十進(jìn)制數(shù)字?★先輸入的是高位數(shù)字,后輸入的是低位數(shù)字,怎樣處理?★整數(shù)與小數(shù)的不同處理方式:123=1*102+2*10+3,0.456=4*10-1+5*10-2+6*10-3602023/11/27例4解#include<stdio.h>#include<string.h>#definePOINT‘.’/*注意不能是“.”*/main(){intc,j,digitcount=0;doublevalue=0,fracdigit;while(isdigit(c=getchar())){value=value*10;value=value+(c-'0');}if(c==POINT)while(isdigit(c=getchar())){digitcount++;fracdigit=c-'0';for(j=0;j<digitcount;j++) fracdigit=fracdigit/10;value=value+fracdigit;}printf("\n%f\n",value);}612023/11/27例3猴子吃桃子問(wèn)題。P1296.10
猴子一天摘下若干個(gè)桃子,當(dāng)即吃了一半,還不過(guò)癮又多吃了一個(gè);第二天又將剩余的桃子吃掉一半,后又多吃了一個(gè);以后每天都吃前天剩余的一半另多吃一個(gè);到第10天想吃時(shí),發(fā)現(xiàn)只剩下一個(gè)桃子,求它第一天共摘了多少桃子?分析:第10天1
第9天4
第8天10
第7天22則:第i天桃子數(shù)應(yīng)該是第(i+1)天桃子數(shù)加1后的2倍。即知道第10天可以求出第9天,知道第9天可以求出第8天,這樣迭代下去,可以求出第1天。622023/11/27例5解main(){intday,x1,x2;day=10;x1=1;while(day>0){x2=(x1+1)*2;x1=x2;day--;}printf(“Total=%d\n",x2);}632023/11/27例譯密碼ABCDEFGHIJKLMNOPQRSTUVWXYZ例如Hello,world!譯成密碼:Lipps,asvph!642023/11/27#include<stdio.h>main(){charc;while((c=getchar())!=‘\n’){if((c>=‘a(chǎn)’&&c<=‘z’)||(c>=‘A’&&c<=‘Z’)){c=c+4;if(c>’Z’&&c<=‘Z’+4||c>’z’)c=c-26;}printf(“%c”,c);}}2023/11/2765例:求n!
main(){floatt=1;intj,n;scanf(“%d”,&n);for(j=1;j<=n;j++)t=t*j;printf(“%f”,t);}例:求1!+2!+……+20!(p1296.4)2023/11/2766main(){floatt=1,s=0;intk,j;for(j=1;j<=20;j++){t=1;for(k=1;k<=j;j++)t=t*k;s=s+t;}printf(“resultis%f”,s);}2023/11/2767例:因子之和等于本身的數(shù)稱(chēng)為完數(shù)。如28的因子為1,2,4,7,14,且1+2+4+7+14=28,則28是完數(shù)。判斷用戶(hù)輸入的數(shù)是否為完數(shù)。/求[2,1000]中的完數(shù)。main(){intx,j,sum=0;scanf(“%d”,&x);for(j=1;j<x;j++)if(x%j==0)sum=sum+j;if(sum==x)printf(“%disawanshu\n”,x);elseprintf(“%disnotawanshu\n”,x);}2023/11/2768main(){intk,j,sum=0;For(k=2;k<=1000;k++){sum=0;for(j=1;j<k;j++)if(k%j==0)sum=sum+j;if(sum==k)printf(“%disawanshu\n”,k);elseprintf(“%disnotawanshu\n”,k);}2023/11/2769求解愛(ài)因斯坦長(zhǎng)階問(wèn)題:有一長(zhǎng)臺(tái)階,若每步跨2階則最后剩1階;若每步跨3階則最后剩2階;若每步跨5階則最后剩4階;若每步跨6階則最后剩5階;只有每步跨7階才正好走完,問(wèn)這個(gè)臺(tái)階最少有多少階?思路:可以從臺(tái)階數(shù)為1開(kāi)始依次反復(fù)測(cè)試,直到找到一個(gè)數(shù)可以滿(mǎn)足上面的要求。for(j=1;;j++
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)活動(dòng)融資行業(yè)營(yíng)銷(xiāo)策略方案
- 掃描探針顯微鏡產(chǎn)業(yè)鏈招商引資的調(diào)研報(bào)告
- 去中心化身份認(rèn)證服務(wù)行業(yè)市場(chǎng)調(diào)研分析報(bào)告
- 園藝學(xué)行業(yè)營(yíng)銷(xiāo)策略方案
- 家用空間降溫裝置出租行業(yè)營(yíng)銷(xiāo)策略方案
- 裝釣魚(yú)假餌用盒市場(chǎng)發(fā)展前景分析及供需格局研究預(yù)測(cè)報(bào)告
- 離心壓縮機(jī)產(chǎn)品供應(yīng)鏈分析
- 機(jī)械式起重葫蘆產(chǎn)品供應(yīng)鏈分析
- 動(dòng)物清潔行業(yè)經(jīng)營(yíng)分析報(bào)告
- 美容霜市場(chǎng)分析及投資價(jià)值研究報(bào)告
- 酒店流水單模版
- 圖示儀使用說(shuō)明書(shū)
- 開(kāi)盤(pán)八法概述
- 強(qiáng)制醫(yī)療三道待解難題
- K-90B聯(lián)機(jī)熱泵控制板規(guī)格書(shū)
- 汽車(chē)四輪定位的探討
- 弟子規(guī)正版全文-帶拼音-直接打印版
- 江蘇省電力公司員工獎(jiǎng)懲辦法(試行)
- 中國(guó)法律思想史
- 中國(guó)建設(shè)銀行網(wǎng)上銀行電子回單
- (完整版)百萬(wàn)英鎊課文
評(píng)論
0/150
提交評(píng)論