版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
2023/9/211第五章循環(huán)結(jié)構(gòu)5.1while語句5.2do-while語句5.3for語句5.4break、continue和goto語句5.5循環(huán)的嵌套5.6復(fù)合結(jié)構(gòu)程序舉例2023/8/61第五章循環(huán)結(jié)構(gòu)5.1while語22023/9/21C語言有while、do-while、和for語句三種循環(huán)結(jié)構(gòu)語句。前兩個稱為條件循環(huán),即根據(jù)條件來決定是否繼續(xù)循環(huán);后一個稱為計(jì)數(shù)循環(huán),即根據(jù)設(shè)定的執(zhí)行次數(shù)來執(zhí)行循環(huán)。
在許多問題中需要用到循環(huán)控制。例如,要輸入全校學(xué)生成績;求若干個數(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ì)的最基本的要求。22023/8/6C語言有while、do-while32023/9/215.1while語句1.While語句的一般形式
while
(表達(dá)式)
語句
首先計(jì)算表達(dá)式,當(dāng)表達(dá)式為非0時,執(zhí)行while語句中的內(nèi)嵌語句;然后重新計(jì)算表達(dá)式,如果表達(dá)式的值為0,則跳出循環(huán)。
2.while語句的執(zhí)行流程
表達(dá)式語句非00注意:如果表達(dá)式的值一開始就為0,則語句一次也會被不執(zhí)行。32023/8/65.1while語句1.While語句的42023/9/21特點(diǎn):先判斷表達(dá)式,后執(zhí)行循環(huán)體說明:循環(huán)體有可能一次也不執(zhí)行循環(huán)體可為任意類型語句下列情況,退出while循環(huán)條件表達(dá)式不成立(為零)循環(huán)體內(nèi)遇break,return,goto無限循環(huán):while(1)
循環(huán)體;42023/8/6特點(diǎn):先判斷表達(dá)式,后執(zhí)行循環(huán)體52023/9/21while語句舉例例1:求∑n
100n=1
main(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf(“%d”,sum);}52023/8/6while語句舉例100n=1main62023/9/21例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=10062023/8/6例2:顯示1~10的平方運(yùn)行結(jié)果:72023/9/21注意:(1)循環(huán)體如果包含一個以上的語句,應(yīng)該用花括弧括起來,以復(fù)合語句形式出現(xiàn)。如果不加花括弧,則
while語句的范圍只到
while后面第一個分號處。
(2)在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句。如果無此語句,則i的值始終不改變,循環(huán)永不結(jié)束。72023/8/6注意:(1)循環(huán)體如果包含一個以上的語句,82023/9/215.2do—while語句1.do-while語句的一般形式為:
do
循環(huán)體語句
while
(表達(dá)式);
2.do-while語句的執(zhí)行流程
當(dāng)表達(dá)式值為真循環(huán)體語句(b)循環(huán)體語句表達(dá)式(a)TF82023/8/65.2do—while語句1.do-wh92023/9/21do—while語句執(zhí)行過程首先執(zhí)行語句,再計(jì)算表達(dá)式。如果表達(dá)式的值為非零,繼續(xù)下一次循環(huán),如果表達(dá)式的值為0,則跳出循環(huán)。如果表達(dá)式的值一開始就為0,也會執(zhí)行一次語句。92023/8/6do—while語句執(zhí)行過程首先執(zhí)行語句,102023/9/21例用do~while循環(huán)求
#include<stdio.h>main(){inti,sum=0;i=1;do{sum+=i; i++;}while(i<=100);printf("%d",sum);}102023/8/6例用do~while循環(huán)求#incl112023/9/21例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);}思考:這兩個程序完全一樣嗎?112023/8/6例while和do~while比較#122023/9/21結(jié)論:當(dāng)while后面的表達(dá)式的第一次的值為“真”時,兩種循環(huán)得到的結(jié)果相同,否則兩者結(jié)果不相同(指兩者具有相同的循環(huán)體的情況)。
122023/8/6結(jié)論:當(dāng)while后面的表達(dá)式的第一次的132023/9/21例如:i=1;while(i<=100)putchar(‘*’);i++;
思考:這個程序段有如何的運(yùn)行結(jié)果?132023/8/6例如:142023/9/21注意:循環(huán)控制變量值在循環(huán)體內(nèi)必須有所改變。例如:i=1;while(i<=100)putchar(‘*’);i++;
這個循環(huán)永遠(yuǎn)不會結(jié)束,因?yàn)檠h(huán)控制變量i沒有在循環(huán)體內(nèi)被改變,i++;不屬于循環(huán)語句。i++應(yīng)該在循環(huán)體內(nèi)改變:i=1;while(i<=100){putchar(‘*’);i++;}142023/8/6注意:循環(huán)控制變量值在循環(huán)體內(nèi)必須有所改152023/9/21舉例:#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);}思考:該程序是什么功能?152023/8/6舉例:#include<stdio.h>162023/9/21for循環(huán)語句是C語言中功能最強(qiáng)的循環(huán)語句,它有多個變化形式,并且可以很方便的代替其它的循環(huán)語句。5.3for語句for語句的一般形式
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)循環(huán)體語句162023/8/6for循環(huán)語句是C語言中功能最強(qiáng)的循環(huán)語172023/9/21①先計(jì)算初值表達(dá)式1,它主要用于循環(huán)開始前設(shè)置變量初值;②接著計(jì)算循環(huán)控制邏輯表達(dá)式2,它控制循環(huán)條件,決定循環(huán)次數(shù);③如果表達(dá)式2為真,則執(zhí)行循環(huán)體語句,否則結(jié)束for循環(huán);④求解表達(dá)式3,它主要是對循環(huán)控制變量進(jìn)行修改。⑤轉(zhuǎn)步驟②執(zhí)行。求表達(dá)式1表達(dá)式2語句求表達(dá)式3for語句的下一語句真假for執(zhí)行流程172023/8/6①先計(jì)算初值表達(dá)式1,它主要用于循環(huán)開始182023/9/21求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++例:182023/8/6求1+2+…+99#include(s192023/9/21for語句說明(1)for語句的一般形式中的“表達(dá)式1”可以省略,注意省略表達(dá)式1時,其后的分號不能省略。如for(;i<=100;i++)sum=sum+i;執(zhí)行時,跳過“求解表達(dá)式1”這一步,其他不變。(2)如果表達(dá)式2省略,即不判斷循環(huán)條件,循環(huán)無終止地進(jìn)行下去。也就是認(rèn)為表達(dá)式2始終為真。例如:
for(i=1;;i++)sum=sum+i;它相當(dāng)于:
i=1;while(1){sum=sum+1;i++;}192023/8/6for語句說明(1)for語句的一般形202023/9/21for語句說明2(3)表達(dá)式3也可以省略,但此時程序設(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++;}202023/8/6for語句說明2(3)表達(dá)式3也可以省略212023/9/21for語句說明3(5)3個表達(dá)式都可省略,如:for(;;)語句相當(dāng)于while(1)語句即不設(shè)初值,不判斷條件(認(rèn)為表達(dá)式2為真值),循環(huán)變量不增值。無終止地執(zhí)行循環(huán)體。(6)表達(dá)式1可以是設(shè)置循環(huán)變量初值的賦值表達(dá)式,也可以是與循環(huán)變量無關(guān)的其他表達(dá)式。如:
for(sum=0;i<=100;i++)sum=sum+i;表達(dá)式1和表達(dá)式3可以是一個簡單的表達(dá)式,也可以是逗號表達(dá)式,即包含一個以上的簡單表達(dá)式,中間用逗號間隔。如:
for(sum=0,i=1;i<=100;i++)sum=sum+i;或for(i=0,j=100;i<=j;i++,j--)k=i+j;212023/8/6for語句說明3(5)3個表達(dá)式都可省略222023/9/21for語句說明4(7)表達(dá)式2一般是關(guān)系表達(dá)式(如i<=100)或邏輯表達(dá)式(如a<b&&x<y),但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值為非零,就執(zhí)行循環(huán)體。分析下面兩個例子:②for(;(c=getchar())!=‘\n’;)printf(“%c”,c);①for(i=0;(c=getchar())!=‘\n’;i+=c);此for語句的執(zhí)行過程見圖,它的作用是不斷輸入字符,將它們的ASCII碼相加,直到輸入一個“換行”符為止。i=0取一個字符=>cC≠換行符i=i+cTF222023/8/6for語句說明4(7)表達(dá)式2一般是關(guān)系232023/9/21例:#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);}232023/8/6例:#include<stdio.h>運(yùn)242023/9/21運(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++)
;}242023/8/6運(yùn)行結(jié)果:abcdefghij例:#in252023/9/21舉例問題:求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é)果是多少?為什么?252023/8/6舉例問題:求s=1/99+2/98+262023/9/21舉例問題:求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為什么?262023/8/6舉例問題:求s=1/99+2/98+272023/9/215.4break、continue、goto語句
這一類語句的功能是改變程序的結(jié)構(gòu),使程序從其所在的位置轉(zhuǎn)向另一處。這類語句是非結(jié)構(gòu)化語句272023/8/65.4break、continue、282023/9/21非結(jié)構(gòu)化語句之break
它的作用是把流程轉(zhuǎn)向所在結(jié)構(gòu)之后。在switch分支結(jié)構(gòu)中,使用break語句可以使流程跳出switch分支結(jié)構(gòu)。同樣的,在循環(huán)結(jié)構(gòu)中,使用break語句使流程跳出當(dāng)前的循環(huán)層,轉(zhuǎn)向執(zhí)行該循環(huán)結(jié)構(gòu)后面的語句。
簡單的說就是跳出當(dāng)前所在的結(jié)構(gòu)break語句不能用于循環(huán)語句和switch語句之外的任何其他語句中。break只能終止并跳出最近一層的結(jié)構(gòu)282023/8/6非結(jié)構(gòu)化語句之break292023/9/21expr……break;……假(0)真(非0)whiledo……break;…...expr假(0)真(非0)while292023/8/6expr……假(0)真(非0)while302023/9/21expr2……break;…...假(0)真(非0)forexpr1expr3switchexpr語句組1break;語句組2break;語句組nbreak;語句組break;…...const1const2constndefaultcase302023/8/6expr2……假(0)真(非0)fore312023/9/21main()
{
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時,強(qiáng)行終止for循環(huán),繼續(xù)執(zhí)行for語句下一條語句例如:312023/8/6main()
{
ints=0,322023/9/21例break舉例:輸出圓面積,面積大于100時停止#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);}}322023/8/6例break舉例:輸出圓面積,面積大332023/9/21例break舉例:小寫字母轉(zhuǎn)換成大寫字母,直至輸入非字母字符332023/8/6例break舉例:小寫字母轉(zhuǎn)換成大寫342023/9/21例break舉例:小寫字母轉(zhuǎn)換成大寫字母,直至輸入非字母字符#include<stdio.h>main(){inti,j;charc;while(1){c=getchar(); if(c>='a'&&c<='z') putchar(c-'a'+'A'); else break;}}342023/8/6例break舉例:小寫字母轉(zhuǎn)換成大寫352023/9/21
非結(jié)構(gòu)化語句之continuecontinue語句被稱為繼續(xù)語句。執(zhí)行continue語句,使本次循環(huán)提前結(jié)束,即跳過循環(huán)體中continue語句下面的尚未執(zhí)行的循環(huán)體語句,但不結(jié)束整個循環(huán),繼續(xù)進(jìn)行下一次循環(huán)的條件判別,條件為真,繼續(xù)進(jìn)行執(zhí)行循環(huán)語句。該語句形式為:
continue;352023/8/6 非結(jié)構(gòu)化語句之continuecont362023/9/21continue語句功能:結(jié)束本次循環(huán),跳過循環(huán)體中尚未執(zhí)行的語句,進(jìn)行下一次是否執(zhí)行循環(huán)體的判斷僅用于循環(huán)語句中expr……continue;……假(0)真(非0)while真(非0)do……continue;…...expr假(0)whileexpr2……continue;…...假(0)真(非0)forexpr1expr3362023/8/6continue語句expr……假(0)372023/9/21例:顯示輸入的字符,如果按的是Esc鍵,則退出循環(huán);如果按的是Enter鍵,則不做任何處理,繼續(xù)輸入下一個字符。#include“conio.h”main(){charch;
for(;;){ch=getchar();/*字符輸入函數(shù)*/if(ch==27)/*Esc鍵的ACSII碼為27*/
break;/*退出循環(huán)*/if(ch==13)
continue;/*按的是Enter:鍵,跳過字符輸出語句*/putchar(ch);/*顯示輸入的字符*/}getch();/*讓程序停一下,拍任意鍵繼續(xù)*/}372023/8/6例:顯示輸入的字符,如果按的是Es382023/9/21例求輸入的十個整數(shù)中正數(shù)的個數(shù)及其平均值382023/8/6例求輸入的十個整數(shù)中正數(shù)的個數(shù)及其平392023/9/21例求輸入的十個整數(shù)中正數(shù)的個數(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);}392023/8/6例求輸入的十個整數(shù)中正數(shù)的個數(shù)及其平402023/9/21非結(jié)構(gòu)化語句之gotogoto被稱為無條件轉(zhuǎn)移語句。由兩部分組成goto標(biāo)號;
和標(biāo)號:語句
它最大的好處就是可以一下子跳出多重循環(huán),而break卻不能做到這點(diǎn)。402023/8/6非結(jié)構(gòu)化語句之gotogoto被稱為無條412023/9/21#include“stdio.h”main(){floatscore,average=0;
intn=0;
scanf(“%f”,&score);/*輸入第一個學(xué)生的分?jǐn)?shù)*/if(score<0)gotoend;
/*表達(dá)式為非0,轉(zhuǎn)移到end標(biāo)號處*/loop:average+=score;
n++;
scanf(“%f”,&score);
if(score>=0)/*表達(dá)式為非0,轉(zhuǎn)移到loop標(biāo)號處*/gotoloop;
average=average/n;/*求平均成績average*/
end:printf(“%6.2f”,average);/*輸出平均成績,保留兩位小數(shù)*/}412023/8/6#include“stdio.h”422023/9/21例:用if語句和goto語句構(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é)果如下:5050422023/8/6例:用if語句和goto語句構(gòu)成循環(huán),求432023/9/21程序舉例(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,...432023/8/6程序舉例(P124例6.6)t=1,442023/9/21例求Fibonacci數(shù)列:1,1,2,3,5,8,……的前40個數(shù)f1=1,f2=1fori=1to20輸出f1,f2f1=f1+f2f2=f2+f11534233159710946750255142293524578241578171855377258417711121393832040570288739088169213896104181286571964181346269922746563245986321144987676546368317811217830914930352102334155442023/8/6例求Fibonacci數(shù)列:1,1,452023/9/21程序如下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;}}452023/8/6程序如下462023/9/21例判斷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ù)”462023/8/6例判斷m是否素?cái)?shù)讀入mk=mi=2472023/9/21 5.5循環(huán)的嵌套
在循環(huán)體語句中又有另一個完整的循環(huán)結(jié)構(gòu)的形式,稱為循環(huán)的嵌套。嵌套在循環(huán)體內(nèi)的循環(huán)語句稱為內(nèi)循環(huán),外面的循環(huán)語句稱為外循環(huán)。如果內(nèi)循環(huán)體中又有嵌套的循環(huán)語句,稱為多層循環(huán)。While、do-while、for三種循環(huán)都可以互相嵌套。循環(huán)嵌套的程序中,要求內(nèi)循環(huán)必須被包含在外層循環(huán)的循環(huán)體中,不允許出現(xiàn)內(nèi)外層循環(huán)體交叉的情況。472023/8/6 5.5循環(huán)的嵌套482023/9/21下面幾種情況均為合法的形式while(){…while(){…}}(2)do{…do{…}while();}while();(3)for(;;){for(;;){…}}(4)while(){…do{…}while();….}482023/8/6下面幾種情況均為合法的形式while(492023/9/21(5)for(;;){….while(){…}….}(6)do{…for(;;){…}}while();
注意:在循環(huán)嵌套中,內(nèi)循環(huán)必須在外循環(huán)開始循環(huán)之前結(jié)束。492023/8/6(5)for(;;)(6)do502023/9/21循環(huán)嵌套舉例問題:輸出圖形*********************分析:一共6行,每行的‘*’數(shù)目與行號相同算法:行用i表示,當(dāng)i<=6則輸出i個‘*’換行inti,j;for(i=1;i<7;i++){printf("\n");
for(j=1;j<=i;j++)putchar('*');}502023/8/6循環(huán)嵌套舉例問題:輸出圖形分析:一共512023/9/21輸出結(jié)果:執(zhí)行語句段:for(i=0;i<6;i++)
{
for(j=0;j<6;j++)printf(“%3d%3d”,i,j);
putchar(‘\n’);
}例:512023/8/6輸出結(jié)果:執(zhí)行語句段:例:522023/9/21000102030405101112131415202122232425303132333435404142434445505152535455輸出結(jié)果:執(zhí)行語句段:for(i=0;i<6;i++)
{
for(j=0;j<6;j++)printf(“%3d%3d”,i,j);
putchar(‘\n’);
}例:522023/8/6000102030405輸出結(jié)532023/9/21問題:輸出圖形****************
分析:一共4行,每行*個數(shù)是1,3,5,7,如果考慮第4行輸出不空格,則每行輸出*之前的空格數(shù)為3,2,1,如果用i表示每行輸出*的個數(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個空格*/
for(j=1;j<=i;j++)
putchar(’*’);
/*輸出i個‘*’*/}
}532023/8/6問題:輸出圖形分析:一共4行,每行*個數(shù)2023/9/2154方法二:若將行號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”);}}
2023/8/654方法二:若將行號k看成是1,2,3,4;552023/9/215.6幾種循環(huán)的比較(1)四種循環(huán)都可以用來處理同一問題,一般情況下它們可以互相代替。但一般不提倡用goto型循環(huán)。(2)
while和do-while循環(huán),只在
while后面指定循環(huán)條件,在循環(huán)體中應(yīng)包含使循環(huán)趨于結(jié)束的語句(如i++,或i=i+1等)。
for循環(huán)可以在表達(dá)式3中包含使循環(huán)趨于結(jié)束的操作,甚至可以將循環(huán)體中的操作全部放到表達(dá)式3中。因此for語句的功能更強(qiáng),凡用while循環(huán)能完成的,用for循環(huán)都能實(shí)現(xiàn)。552023/8/65.6幾種循環(huán)的比較(1)四種循環(huán)都可562023/9/21比較(4)
while循型、do-while循環(huán)和
for循環(huán),可以用
break語句跳出循環(huán),用
continue語句結(jié)束本次循環(huán)。而對用goto語句和if語句構(gòu)成的循環(huán),不能用break語句和continue語句進(jìn)行控制。(3)用while和do-while循環(huán)時,循環(huán)變量初始化的操作應(yīng)在while和do-while語句之前完成。而
for語句可以在表達(dá)式1中實(shí)現(xiàn)循環(huán)變量的初始化。562023/8/6比較(4)while循型、do-572023/9/215.7復(fù)合程序結(jié)構(gòu)及舉例
C語言允許循環(huán)語句與分支結(jié)構(gòu)語句聯(lián)用,即在循環(huán)體包含一個完整的分支結(jié)構(gòu),這樣的程序結(jié)構(gòu)被稱為復(fù)合程序結(jié)構(gòu)。復(fù)合程序結(jié)構(gòu)同樣必須做到嵌套層次清楚,決不允許出現(xiàn)嵌套層次之間相互交叉的情況。572023/8/65.7復(fù)合程序結(jié)構(gòu)及舉例C582023/9/21例1用C語言編程打印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");}}582023/8/6例1用C語言編程打印1到10的乘法表。m592023/9/21例2用C語言編程實(shí)現(xiàn)從鍵盤輸入一個數(shù)字串,然后把它變成一個實(shí)數(shù)輸出。分析:★首先要判斷輸入的是否是數(shù)字還是‘.’;使用函數(shù)isdigit()?!锊捎胓etchar()函數(shù)進(jìn)行輸入,輸入的字符常量是ASCII碼的值,怎樣轉(zhuǎn)換成對應(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-3592023/8/6例2用C語言編程實(shí)現(xiàn)從鍵盤輸入一個數(shù)字串602023/9/21例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);}602023/8/6例4解#include<stdio.h612023/9/21例3猴子吃桃子問題。P1296.10
猴子一天摘下若干個桃子,當(dāng)即吃了一半,還不過癮又多吃了一個;第二天又將剩余的桃子吃掉一半,后又多吃了一個;以后每天都吃前天剩余的一半另多吃一個;到第10天想吃時,發(fā)現(xiàn)只剩下一個桃子,求它第一天共摘了多少桃子?分析:第10天1
第9天4
第8天10
第7天22則:第i天桃子數(shù)應(yīng)該是第(i+1)天桃子數(shù)加1后的2倍。即知道第10天可以求出第9天,知道第9天可以求出第8天,這樣迭代下去,可以求出第1天。612023/8/6例3猴子吃桃子問題。P1296.10622023/9/21例5解main(){intday,x1,x2;day=10;x1=1;while(day>0){x2=(x1+1)*2;x1=x2;day--;}printf(“Total=%d\n",x2);}622023/8/6例5解main()632023/9/21例譯密碼ABCDEFGHIJKLMNOPQRSTUVWXYZ例如Hello,world!譯成密碼:Lipps,asvph!632023/8/6例譯密碼ABCDEFGHIJKLMN642023/9/21#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);}}642023/8/6#include<stdio.h>2023/9/2165例:求n!
main(){floatt=1;intj,n;scanf(“%d”,&n);for(j=1;j<=n;j++)t=t*j;printf(“%f”,t);}例:求1!+2!+……+20?。╬1296.4)2023/8/665例:求n!2023/9/2166main(){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/8/666main()2023/9/2167例:因子之和等于本身的數(shù)稱為完數(shù)。如28的因子為1,2,4,7,14,且1+2+4+7+14=28,則28是完數(shù)。判斷用戶輸入的數(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/8/667例:因子之和等于本身的數(shù)稱為完數(shù)。如282023/9/2168main(){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/8/668main()2023/9/2169求解愛因斯坦長階問題:有一長臺階,若每步跨2階則最后剩1階;若每步跨3階則最后剩2階;若每步跨5階則最后剩4階;若每步跨6階則最后剩5階;只有每步跨7階才正
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 英語宏觀課程設(shè)計(jì)
- 二零二五年度智能通信基站場地租用及升級合同3篇
- 辦公室文員崗位的職責(zé)描述模版(2篇)
- 二零二五年度按揭中二手房買賣合同范本:按揭利率風(fēng)險控制版3篇
- 小學(xué)“陽光少年”評選活動方案(3篇)
- 幼兒活動課課程設(shè)計(jì)
- 學(xué)校建設(shè)項(xiàng)目管理制度范文(2篇)
- 二零二五年度安全標(biāo)準(zhǔn)廠房水電消防應(yīng)急預(yù)案合同3篇
- 二零二五年度加油站油品供應(yīng)與行業(yè)規(guī)范執(zhí)行協(xié)議3篇
- 工程項(xiàng)目公共衛(wèi)生突發(fā)事件應(yīng)急預(yù)案模版(2篇)
- 西交大少年班英語考試試題
- 北京語言大學(xué)保衛(wèi)處管理崗位工作人員招考聘用【共500題附答案解析】模擬試卷
- 人教版七年級下冊數(shù)學(xué)全冊完整版課件
- 初中生物人教七年級上冊(2023年更新) 生物圈中的綠色植物18 開花和結(jié)果
- 水電解質(zhì)及酸堿平衡的業(yè)務(wù)學(xué)習(xí)
- CSCEC8XN-SP-安全總監(jiān)項(xiàng)目實(shí)操手冊
- 口腔衛(wèi)生保健知識講座班會全文PPT
- 成都市產(chǎn)業(yè)園區(qū)物業(yè)服務(wù)等級劃分二級標(biāo)準(zhǔn)整理版
- 最新監(jiān)督學(xué)模擬試卷及答案解析
- ASCO7000系列GROUP5控制盤使用手冊
- 污水處理廠關(guān)鍵部位施工監(jiān)理控制要點(diǎn)
評論
0/150
提交評論