版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5章循環(huán)結(jié)構(gòu)程序設(shè)計5.1循環(huán)流程控制語句
5.2循環(huán)嵌套
5.3break語句和continue語句
5.4循環(huán)結(jié)構(gòu)程序設(shè)計舉例
習(xí)題
5.1循環(huán)流程控制語句
根據(jù)循環(huán)結(jié)構(gòu)具體形式的差異,C語言中循環(huán)結(jié)構(gòu)常用的三種語句為:while循環(huán)語句、do-while循環(huán)語句和for循環(huán)語句。
5.1.1while語句
while語句是用來實(shí)現(xiàn)“當(dāng)型”循環(huán)控制的語句。
1.一般形式
while(表達(dá)式)
語句;
或
while(表達(dá)式)
{
語句序列;
}
其中:表達(dá)式稱為“循環(huán)條件”,語句(一條語句)或語句序列(復(fù)合語句部分)稱為“循環(huán)體”。
2.執(zhí)行過程
while語句的執(zhí)行過程可以用圖5-1描述。首先計算表達(dá)式的值,如果表達(dá)式的值為“假”(表達(dá)式的值等于0),則退出循環(huán);如果值為“真”(非0),則執(zhí)行循環(huán)體中的語句。執(zhí)行完后,再次計算表達(dá)式的值,然后根據(jù)表達(dá)式值的情況決定是退出循環(huán),還是繼續(xù)執(zhí)行循環(huán)體中的語句。圖5-1while語句執(zhí)行過程
3.特點(diǎn)
先判斷表達(dá)式,后執(zhí)行語句。
下面結(jié)合一個實(shí)例學(xué)習(xí)while語句的使用。
例5-1
求解1+2+3+…+100的值。
分析:在用程序設(shè)計語言求解1+2+3+…+100的值時,問題中隱含了計算中取值的范圍是[1,100],當(dāng)超出這個范圍時,運(yùn)算就結(jié)束。所以在設(shè)置變量時,除了設(shè)置存放計算結(jié)果的變量count外,還要設(shè)置一個循環(huán)變量i,用來存放1~100。
/*源程序5-1*/
#include<stdio.h>
main()
{
inti,count; /*變量定義及初始化*/
i=1;
count=0; /*存放計算結(jié)果的變量初始值為0*/
while(i<=100) /*循環(huán)條件:i<=100*/
{
/*循環(huán)體部分*/
count=count+i;
i++;
}
printf("1+2+3+…+100=%d\n",count);
}
程序運(yùn)行結(jié)果如下:說明:
(1)在while結(jié)構(gòu)中,循環(huán)體包含一條以上的語句時,應(yīng)該用{}括起來,否則while語句只執(zhí)行跟在while后面的第一條語句。
(2)循環(huán)體中必須包含對循環(huán)條件有影響的語句,如果沒有這樣的語句,會形成無限循環(huán)(死循環(huán))。
例如在上述程序中,循環(huán)體中語句i++?就影響著循環(huán)條件i的值,即每執(zhí)行一次循環(huán)體,i的值增加1,這保證了執(zhí)行一定次數(shù)后,i的值就會變?yōu)?01,此時循環(huán)條件中表達(dá)式的值為假,結(jié)束循環(huán),執(zhí)行循環(huán)語句后邊的語句。如果無此語句,則i的值始終保持不變,循環(huán)變成無限循環(huán)。在C語言中,循環(huán)條件一般是關(guān)系表達(dá)式、邏輯表達(dá)式,或者由關(guān)系運(yùn)算符和邏輯運(yùn)算符組成的混合表達(dá)式。循環(huán)條件也可以是1。當(dāng)循環(huán)條件為1時,整個循環(huán)變?yōu)樗姥h(huán),例如:
while(1)
{
語句序列;
}
(3)循環(huán)體中可以是空語句,只有分號,不進(jìn)行任何操作。
(4)程序中的變量i稱為循環(huán)變量。5.1.2do-while語句
do-while循環(huán)又稱為“直到型”循環(huán)結(jié)構(gòu)。
1.一般形式
do
{
語句序列;
}while(表達(dá)式);說明:
(1)?do是C語言的關(guān)鍵字,必須同while聯(lián)系使用。
(2)?do-while循環(huán)由do開始,由while結(jié)束,所以while(表達(dá)式)后邊的“;”不能少,它表示do-while循環(huán)語句的結(jié)束。
(3)同while語句中循環(huán)體一樣,do后面可以是一條語句,也可以是多條語句。當(dāng)為多條語句時,需要用{}括起來,組成復(fù)合語句。
2.執(zhí)行過程
do-while語句的執(zhí)行過程可以用圖5-2描述。首先執(zhí)行循環(huán)體中的語句序列,然后計算while后邊的表達(dá)式。如果表達(dá)式的值為“假”(為0),則退出循環(huán)結(jié)構(gòu);如果表達(dá)式的值為“真”(非0),則繼續(xù)執(zhí)行循環(huán)體,執(zhí)行后繼續(xù)計算表達(dá)式的值。如此反復(fù),直到表達(dá)式的值為假。圖5-2do-while語句的執(zhí)行過程
3.特點(diǎn)
先執(zhí)行語句,后判斷表達(dá)式的值。
下面結(jié)合一個實(shí)例學(xué)習(xí)do-while語句的使用。
例5-2
輸入一行字符,分別統(tǒng)計出其中英文字母、空格、數(shù)字以及其他字符的個數(shù)。
分析:對于任何一個字符,在內(nèi)存中都是以字符的ASCII碼的二進(jìn)制形式存放的,該存放形式與整型數(shù)的存儲形式類似,這使得字符型數(shù)據(jù)和部分整型數(shù)據(jù)之間可以通用。所以要統(tǒng)計英文字母、空格、數(shù)字以及其他字符的個數(shù),可以采用對輸入的每個字符進(jìn)行比較的方法來進(jìn)行統(tǒng)計。/*源程序5-2*/
#include<stdio.h>
main()
{
charc;
/*設(shè)置存放不同字符個數(shù)的變量*/
intletter=0,digit=0,space=0,otherch=0;
printf("\nPleaseInputalinecharacter:\n");
scanf("%c",&c); /*循環(huán)變量c的初始化*/
while(c!='\n') /*結(jié)束統(tǒng)計的條件*/
{ if(c>='a'&&c<='z'||c>='A'&&c<='Z') /*字母*/
letter=letter+1;
elseif(c>='0'&&c<='9') /*數(shù)字*/
digit=digit+1;
elseif(c=='') /*空格*/
space=space+1;
else /*其他字符*/
otherch=otherch+1; scanf("%c",&c); /*對循環(huán)條件影響的語句*/
}
printf("theletter=%d,digit=%d,space=%d,otherch=%d\n",letter,digit,space,otherch);
}程序運(yùn)行結(jié)果如下:
4.while語句和do-while語句的區(qū)別
與while語句需要先判斷表達(dá)式的值是否為真(非0)來決定是否進(jìn)入循環(huán)體不同,do-while循環(huán)語句先執(zhí)行一次循環(huán)體,然后才計算表達(dá)式的值。因此,do-while循環(huán)體中的語句無論表達(dá)式的值是否為真(非0),至少都要執(zhí)行一次;而while循環(huán)體中語句的執(zhí)行要根據(jù)表達(dá)式的值來決定。5.1.3for語句
C語言中的for語句使用最為靈活,也是程序控制結(jié)構(gòu)中使用最為廣泛的一種循環(huán)控制語句。它不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,也適合于循環(huán)次數(shù)不確定而循環(huán)結(jié)束條件已知的情況。
1.一般形式
for語句特別適合解決循環(huán)次數(shù)已知的問題。for語句的一般形式為:
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
循環(huán)體;其中:for是C語言的關(guān)鍵字;表達(dá)式1、表達(dá)式2、表達(dá)式3之間用“;”隔開。
在for語句的一般形式中,將循環(huán)結(jié)構(gòu)需要注意的問題都包含在其中:
(1)變量的初始化:表達(dá)式1;
(2)循環(huán)結(jié)束的條件:表達(dá)式2;
(3)循環(huán)控制變量的更新(使循環(huán)趨向于結(jié)束的語句):表達(dá)式3。
2.執(zhí)行過程
for語句的執(zhí)行過程可以用圖5-3描述。其執(zhí)行過程如下:
(1)先求解表達(dá)式1。
(2)求解表達(dá)式2的值,如果值為真(非0),則執(zhí)行for循環(huán)體中的內(nèi)嵌語句,然后執(zhí)行第(3)步;如果值為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。
(3)如果表達(dá)式2的值為真(非0),則執(zhí)行for循環(huán)體中的內(nèi)嵌語句后,求解表達(dá)式3。
(4)跳轉(zhuǎn)到第(2)步繼續(xù)執(zhí)行。
(5)執(zhí)行for語句下面的一條語句。圖5-3for語句的執(zhí)行過程3.for語句最簡單的應(yīng)用形式
for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增量)
{
語句序列;
}例如:
for(i=0;i<=100;i++)
count=count+i;
該實(shí)例用while語句實(shí)現(xiàn):
i=1;
while(i<=100)
{
count=count+i;
i++;
}由此可見,for循環(huán)結(jié)構(gòu)可以用while語句進(jìn)行改寫,以實(shí)現(xiàn)同樣的功能。改寫后一般格式為:
表達(dá)式1;
while(表達(dá)式2)
{
語句序列;
表達(dá)式3;
}說明:
(1)?for語句中,表達(dá)式1的內(nèi)容可以省略,但是表達(dá)式1后邊的“;”不能省略;表達(dá)式1如果省略,則必須在for語句的前面給變量賦相應(yīng)初值。
例如:
i=1;
for(;i<=100;i++)
count=count+i;
此時,程序的執(zhí)行過程是直接跳過“求解表達(dá)式1”,其他步驟不發(fā)生變化。
(2)表達(dá)式2的內(nèi)容一般情況不能省略,如果省略,則循環(huán)將無終止地進(jìn)行下去,即系統(tǒng)認(rèn)為表達(dá)式2的值始終為“真”(非0)。
例如:
for(i=1;;i++)
count=count+i;
該語句相當(dāng)于:
while(1) /*無限循環(huán)*/
{
count=count+i;
i++;
}當(dāng)表達(dá)式2省略后,如果還想計算出結(jié)果,則需要使用break語句(break語句將在本章5.3節(jié)進(jìn)行介紹)對程序進(jìn)行如下的修改:
for(i=1;;i++)
{
if(i>=100) /*表達(dá)式2的內(nèi)容用if的條件代替*/
break; /*break語句*/
else
count=count+i;
}
(3)表達(dá)式3的內(nèi)容也可省略,但此時必須在其他位置(如循環(huán)體)安排使循環(huán)趨向于結(jié)束的操作。
例如:
for(i=1;i<=100;)
{
count=count+i;
i++; /*該條語句放置在循環(huán)體中*/
}
(4)三個表達(dá)式都可以省略,此時,表達(dá)式1和表達(dá)式2后邊的“;”不能省略。例如:
for(;;)語句;
程序變成如下形式:
i=1; /*循環(huán)變量賦初值*/
for(;;)
{
if(i>=100)
break; /*循環(huán)出口*/
count=count+i;
i++; /*修改循環(huán)變量的值*/
}
(5)表達(dá)式1中可以是設(shè)置循環(huán)變量初始值的賦值表達(dá)式,也可以是與循環(huán)變量無關(guān)的其他表達(dá)式。
例如:
for(i=1,j=2;i<=100;i++)
count=count+i+j;
表達(dá)式1和表達(dá)式3可以是一般的表達(dá)式,也可以是逗號表達(dá)式。
例如:
for(i=1,j=100;i<=j;i++,j--)
m=i*j;
(6)表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式,也可以是數(shù)值表達(dá)式或字符表達(dá)式。事實(shí)上,只要表達(dá)式的值為非0,就執(zhí)行循環(huán)體。
例如:
for(;(c=getchar())!='\n';i+=c)
printf("%c",c);
(7)跟選擇結(jié)構(gòu)的語句一樣,for語句的后邊一般沒有語句結(jié)束符“;”,如果添加分號,則表示該循環(huán)體中只有一條空語句,整個for語句只有完成對循環(huán)變量值的改變操作,后邊的“{}”中的語句就變成緊隨for語句后的一條復(fù)合語句。
例如以下程序:
for(i=1,count=0;i<=100;i++)
{
count=count+i;
}
執(zhí)行結(jié)束后,變量count的值等于5050。而以下程序:
for(i=1,count=0;i<=100;i++);
{
count=count+i;
}
執(zhí)行結(jié)束后,變量count的值等于101。
下面結(jié)合一個實(shí)例學(xué)習(xí)for語句的使用。
例5-3
編寫程序計算n!=1*2*3*…*n的值。
分析:求階乘和求累加的運(yùn)算處理過程類似。在程序中變量i從1增加到n,每次的增量為1。如果設(shè)置變量m來存放連乘的乘積,m=m*i。在此過程中,m的初始值不能設(shè)置為0,必須設(shè)置為1,否則整個運(yùn)算結(jié)果都是0。 /*源程序5-3*/
#include<stdio.h>
main()
{
inti,m,n;
m=1;
printf("\nPleaseinputthenumbern:\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
m=m*i;
printf("%d!=%d\n",n,m);
}程序運(yùn)行結(jié)果如下:
for語句在數(shù)學(xué)計算中的使用相對比較方便,尤其是針對有取值范圍的算式。
例5-4
編寫程序求解:
分析:整個算式由四個求和運(yùn)算的算式組成,而且每個算式取值的范圍已給定,因而選用for語句解決該問題就簡單。對于后兩個算式,因為有除法存在,因此在定義變量時,不能使用整型,否則,后兩個算式的結(jié)果就等于0,失去計算的意義。/*源程序5-4*/
#include<stdio.h>
main()
{
floati;
floats1=0,s2=0,s3=0,s4=0; /*用來存放四個算式的結(jié)果*/
for(i=1;i<=100;i++)
s1=s1+i; /*算式1*/
for(i=1;i<=50;i++)
s2=s2+i*i; /*算式2*/
for(i=1;i<=10;i++)
s3=s3+1/i; /*算式3*/
for(i=1;i<=10;i++)
s4=s4+1/(i*i); /*算式4*/
printf("Total=%6.2f\n",s1+s2+s3+s4);
}
程序運(yùn)行結(jié)果如下:
4.三種循環(huán)的比較
(1)三種循環(huán)都是由循環(huán)變量的初始化、循環(huán)條件(狀態(tài))的檢查、循環(huán)條件(狀態(tài))的修改以及循環(huán)體四部分組成的。
(2)三種循環(huán)語句都可以解決同一問題,它們可以相互代替。
對于源程序5-1,使用for語句實(shí)現(xiàn)的代碼如下:
for(i=1,count=0;i<=100;i++)
count=count+i;使用do-while語句實(shí)現(xiàn)的代碼如下:
i=1;
count=0;
do
{
count=count+i;
i++;
}while(i<=100);
(3)?do-while、while語句多用于循環(huán)次數(shù)不確定的情況;對于循環(huán)次數(shù)確定的情況,使用for語句相對比較方便。
(4)?while和for循環(huán)執(zhí)行過程是先判斷表達(dá)式,后執(zhí)行語句;而do-while循環(huán)是先執(zhí)行語句,后判斷表達(dá)式。
(5)在使用三種循環(huán)實(shí)現(xiàn)同一問題時,循環(huán)變量的初始化位置有所不同,while和do-while語句循環(huán)變量初始化應(yīng)放在while和do-while語句之前;而for語句可以在表達(dá)式1中初始化循環(huán)變量。
5.2循環(huán)嵌套
所謂循環(huán)嵌套,是指在一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu),這與選擇結(jié)構(gòu)的嵌套類似。內(nèi)嵌的循環(huán)體內(nèi)還可以嵌套循環(huán),構(gòu)成多層循環(huán)。而在多層循環(huán)執(zhí)行中,內(nèi)層的優(yōu)先級比外層的高,即只有等內(nèi)層循環(huán)執(zhí)行完后,才能進(jìn)行外層循環(huán)的執(zhí)行。
在C語言中,三種循環(huán)(while循環(huán)、do-while循環(huán)和for循環(huán))都可以互相嵌套。下面是幾種比較常見的循環(huán)嵌套形式。1.while循環(huán)中嵌套while循環(huán)
while(表達(dá)式)
{
語句序列
while(表達(dá)式)
{
語句序列
}
}2.while循環(huán)中嵌套do-while循環(huán)
while(表達(dá)式)
{
語句序列
do
{
語句序列
}while(表達(dá)式);
}3.do-while循環(huán)中嵌套do-while循環(huán)
do
{
語句序列
do
{
語句序列
}while(表達(dá)式);
}while(表達(dá)式);4.for循環(huán)中嵌套for循環(huán)
for(;;)
{
語句序列
for(;;)
{
語句序列
}
}5.for循環(huán)中嵌套while循環(huán)
for(;;)
{
語句序列
do
{
語句序列
}while(表達(dá)式);
}6.do-while循環(huán)中嵌套for循環(huán)
do
{
語句序列
for(;;)
{
語句序列
}
}while(表達(dá)式);例5-5
使用循環(huán)嵌套編寫程序,實(shí)現(xiàn)九九乘法口訣,要求按以下格式輸出:
1*1=1
1*2=22*2=4
1*3=32*3=63*3=9
1*4=42*4=83*4=124*4=16
1*5=52*5=103*5=154*5=205*5=25
1*6=62*6=123*6=184*6=245*6=306*6=36
1*7=72*7=143*7=214*7=285*7=356*7=427*7=49
1*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=64
1*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81
分析:要按照指定的格式輸出,必須通過循環(huán)嵌套來完成。算術(shù)運(yùn)算符“*”是一個雙目運(yùn)算符,所以需要兩個操作數(shù)參與運(yùn)算。在循環(huán)嵌套中,i的取值范圍是1~9,控制被乘數(shù)的取值,同時用于控制輸出的行數(shù);j取值為1~i,控制另一個操作數(shù)的取值范圍以及每行輸出算式的個數(shù)。/*源程序5-5*/
#include<stdio.h>
main()
{
inti,j;
intt;
for(i=1;i<=9;i++) /*被乘數(shù)的取值控制*/
{ for(j=1;j<=i;j++) /*乘數(shù)的取值控制*/
{
t=j*i;
printf("%d*%d=%d",j,i,t); /*按照指定算式格數(shù)輸出*/
}
printf("\n");
}
}程序運(yùn)行結(jié)果如下:
例5-6
編寫程序,求a+aa+aaa+aaaa+…+aaa…a(n個a),其中a是一個數(shù)字。例如:5+55+555+5555+55555+555555(此時n為6)。要求a和n通過鍵盤輸入,輸出格式為:5+55+555+5555+55555+555555=617280
分析:數(shù)學(xué)中許多數(shù)列問題的求解都可以借助于循環(huán)控制結(jié)構(gòu)來完成。在循環(huán)體中,除了計算出整個數(shù)列的結(jié)果外,還要生成數(shù)列中每一個項(例如:aaa、aaaa等),以保證將數(shù)列的所有項都計算。/*源程序5-6*/
#include<stdio.h>
main()
{
longsum,s,j;
inti,a,n;
scanf("%d,%d",&a,&n);
j=1;
for(sum=0,s=0,i=n;i>0;i--)
{ s+=j*a; /*數(shù)列中的項*/
sum+=s;/*對每項求和運(yùn)算*/
j=j*10;
}
printf("sum=%ld\n",sum);
}
程序運(yùn)行結(jié)果如下:
5.3break語句和continue語句
5.3.1break語句
在第4章選擇結(jié)構(gòu)程序設(shè)計的switch語句中已經(jīng)簡單介紹過用break語句跳出switch結(jié)構(gòu)。實(shí)際上,break語句也可以用于從某循環(huán)體內(nèi)跳出,即提前結(jié)束循環(huán)。
break語句的一般格式如下:
if(表達(dá)式)
break;
下面結(jié)合一個應(yīng)用實(shí)例學(xué)習(xí)break語句在循環(huán)結(jié)構(gòu)中的使用。
例5-7
求解n的值,使得1+2+3+…+n=sum。要求sum的最大值為32767。
分析:題目除了要計算1+2+3+…+n的值以外,還要計算結(jié)果sum的值不能超過32767,因此在循環(huán)中,必須對每次的計算結(jié)果進(jìn)行判斷:如果小于32767則循環(huán)繼續(xù)進(jìn)行,否則需要跳出循環(huán),結(jié)束計算。
/*源程序5-7*/
#include<stdio.h>
main()
{
intn,sum;
for(n=1,sum=0;;n++)
{
sum=sum+n; /*計算1+2+3+…+n的值*/
if(sum>32768) /*對計算結(jié)果進(jìn)行判斷*/
break;
}
printf("n=%d\n",n-1);
}程序運(yùn)行結(jié)果如下:
說明:
(1)?break語句的一般格式由關(guān)鍵字break和“;”組成。
(2)?break語句一般只適用于for、while和do-while循環(huán)語句以及switch語句,不能使用于其他語句中。
(3)在循環(huán)嵌套中,如果break語句位于內(nèi)層循環(huán)中,則它僅跳出內(nèi)層循環(huán),而不是跳出所有的循環(huán)。/*源程序5-8*/
#include<stdio.h>
main()
{
inti,j;
for(i=1;i<10;i++)
{
for(j=1;j<10;j++) {
if((i+j)%2==0)
break;
else
printf("i=%d,j=%d",i,j);
}
printf("\n");
}
}程序運(yùn)行結(jié)果如下:
由此可見,當(dāng)i=1,j=1時,(i+j)%2==0成立,跳出內(nèi)層循環(huán),即當(dāng)i=1時,j的值在[2,9]范圍內(nèi)都不執(zhí)行,直接執(zhí)行i=2,j=1的操作。5.3.2continue語句
continue語句只能使用在循環(huán)語句內(nèi)部,其主要功能是跳過本次循環(huán),即跳過循環(huán)體下面尚未執(zhí)行的語句,直接執(zhí)行下一次循環(huán)是否進(jìn)行的條件判斷。
continue語句的一般格式如下:
if(表達(dá)式)
continue;
說明:
(1)?break一樣,continue也是C語言的關(guān)鍵字。
(2)?continue語句通常用于for、do-while和while等循環(huán)體中,常與if條件語句一起使用,用來加快循環(huán)。即滿足if條件就跳出本次循環(huán)剩余語句,強(qiáng)制檢測循環(huán)條件來判定是否執(zhí)行下一次循環(huán)。
(3)在for循環(huán)中,當(dāng)遇到continue后,跳過循環(huán)體中剩余語句,直接計算表達(dá)式3的值,然后進(jìn)行表達(dá)式2的條件判定,決定是否執(zhí)行for循環(huán);在while和do-while循環(huán)中,continue語句使流程直接跳到循環(huán)控制測試判定部分,決定循環(huán)是否繼續(xù)執(zhí)行。
以下結(jié)合一個應(yīng)用實(shí)例學(xué)習(xí)continue語句的使用。
例5-8
編寫程序計算1~100的累加值,要求跳過個位為5的所有整數(shù)。
分析:計算1~100的累加值前面章節(jié)已經(jīng)編程實(shí)現(xiàn)過。本例要求去掉所有個位為5的整數(shù),所以在循環(huán)體中,必須對1~100中每個整數(shù)進(jìn)行判定,判斷條件是:對每個整數(shù)和10進(jìn)行求余運(yùn)算,如果結(jié)果等于5,就表明該數(shù)是個位為5的整數(shù)。/*源程序5-9*/
#include<stdio.h>
main()
{
inti,sum;
for(i=1,sum=0;i<100;i++)
{
if(i%10==5) /*累加值中去掉所有個位為5的整數(shù)*/ continue;
sum=sum+i;
}
printf("sum=%d\n",sum);
}程序運(yùn)行結(jié)果如下:
continue語句與break語句的區(qū)別:break語句的功能是結(jié)束所在的循環(huán),即結(jié)束整個循環(huán),并不對循環(huán)條件做判斷;而continue語句是跳過本次循環(huán),而不是終止整個循環(huán)。
continue語句與break語句的流程圖如圖5-4所示。圖5-4break和continue的流程圖
5.4循環(huán)結(jié)構(gòu)程序設(shè)計舉例
5.4.1窮舉
窮舉是一種重復(fù)型算法,其基本思想是對問題可能的所有狀態(tài)逐一進(jìn)行測試,直到找到問題的解或者將所有狀態(tài)測試完。
在程序設(shè)計中,跟窮舉算法相關(guān)的典型應(yīng)用實(shí)例主要有搬磚問題、求素數(shù)問題以及分組問題等。下面結(jié)合搬磚問題和求素數(shù)問題學(xué)習(xí)窮舉在程序設(shè)計語言中的應(yīng)用。
例5-9【搬磚問題】
100個人搬100塊磚,一個男人一次搬3塊,一個女人一次搬2塊,小孩3人一次搬一塊。請問一次搬完共需男、女以及小孩各幾人?
分析:將100塊磚搬完,全部由女人搬,最多需要50個;全部由男人搬,最多需要34個。所以男人的人數(shù)范圍為0≤men<34,女人的人數(shù)范圍為0≤women≤50;當(dāng)有男人、女人以及小孩共同完成時,滿足的條件是men*3+women*2+
childs/3.0=100。/*源程序5-10*/
#include<stdio.h>
main()
{
intmen,women,childs;
men=0;
printf("Men|Women|children\n");
while(men<34)
{
women=0;
while(women<=50)
{ childs=100-women-men;
if(men*3+women*2+childs/3.0==100)
{
/*不同的組合方式*/
printf("%3d",men);
printf("%10d",women);
printf("%12d\n",childs);
}
women++;
}
??men++;
}
程序運(yùn)行結(jié)果如下:
例5-10【求素數(shù)問題】輸出10~100之間所有的素數(shù)。
分析:所謂素數(shù)(也稱為質(zhì)數(shù)),指的是只能被1和本身整除的正整數(shù)。
求解采用的算法:讓正整數(shù)i被[2,]范圍內(nèi)的整數(shù)除,如果能被該范圍內(nèi)的任何一個整數(shù)整除,則提前結(jié)束循環(huán),此時i的值必然小于或等于;如果不能被該范圍內(nèi)的整數(shù)整除,則繼續(xù)循環(huán)。在循環(huán)結(jié)束后,判斷i的值是否大于或等于+1,如果是,則表明i不能被[2,]范圍內(nèi)的某一整數(shù)整除,則該數(shù)為素數(shù)。/*源程序5-11*/
#include<stdio.h>
#include<math.h>
main()
{
inti,j;
intk;
printf("10~100之間的所有素數(shù)為:\n");
for(i=11;i<100;i+=2)
{
/*求素數(shù)的算法*/
k=sqrt(i);
for(j=2;j<=k;j++)
if(i%j==0)
break; /*結(jié)束循環(huán)*/
if(j>=k+1)
printf("%8d",i);
}
printf("\n");
}程序運(yùn)行結(jié)果如下:5.4.2迭代
迭代法也稱為輾轉(zhuǎn)法,是一種不斷用變量的舊值遞推新值的過程,是用于求方程或方程組根的一種常用的算法。
使用迭代法解決問題需要做的基本工作如下:
(1)確定迭代變量。
(2)建立迭代關(guān)系式,通過該關(guān)系式實(shí)現(xiàn)迭代變量的舊值遞推新值。
(3)對迭代過程進(jìn)行控制,即控制迭代什么時候該結(jié)束。否則迭代過程將無休止地重復(fù)進(jìn)行。
在程序設(shè)計中,跟迭代算法相關(guān)的典型應(yīng)用實(shí)例主要有兔子繁殖問題、數(shù)學(xué)中的牛頓迭代法或者二分法等問題。下面結(jié)合兔子繁殖問題和二分法學(xué)習(xí)迭代在程序設(shè)計語言中的應(yīng)用。
例5-11【兔子繁殖問題】
(Fibonacci數(shù)列)假設(shè)有一對新生兔子,三個月后就發(fā)育成成年兔子,從第三個月開始它們每月生一對兔子(雌雄一對)。依此規(guī)律,假設(shè)兔子沒有死亡,求一年后兔子的總數(shù)。用Fn代表n個月后兔子的對數(shù)。問題是從一對新生兔子開始,所以F1=1,F(xiàn)2=1;這一對兔子在三個月末生出新一對兔子,從而F3=1+1=2;在第四個月末兔子的總數(shù)變?yōu)镕4=1+2=3;依此類推,兔子的總數(shù)分別為
1,1,2,3,5,8,13,21,34,55,…
可用一個表達(dá)式描述上述數(shù)據(jù):
F1=1 (n=1)
F2=1 (n=2)
Fn=Fn-1+Fn-2 (n≥3)
該表達(dá)式就是著名的Fibonacci數(shù)列。/*源程序5-12*/
#include<stdio.h>
main()
{
longintf1,f2;
inti;
/*前兩個月兔子的對數(shù)*/
f1=1;f2=1;
for(i=1;i<=5;i++) /*迭代過程的控制*/ {
/*循環(huán)體中每次計算兩個月兔子的對數(shù),所以循環(huán)條件為i<=5*/
f1=f1+f2; /*迭代關(guān)系式*/
f2=f2+f1; /*迭代關(guān)系式*/
}
printf("一年后兔子的對數(shù)為:%ld\n",f2);
}
程序運(yùn)行結(jié)果如下:
例5-12【二分法】用二分法求解如下方程在1.5附近的根:
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 武漢輕工大學(xué)《語言信息處理》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五版?zhèn)€人與企業(yè)間的商務(wù)汽車租賃及行程安排合同3篇
- 二零二五版旅游產(chǎn)業(yè)反擔(dān)保合同與旅游資產(chǎn)抵押協(xié)議3篇
- 二零二五年建筑玻璃采購合同標(biāo)準(zhǔn)2篇
- 二零二五年度離婚后按揭房產(chǎn)權(quán)屬分割及子女撫養(yǎng)費(fèi)用協(xié)議3篇
- 個人借款擔(dān)保合同書2024年版版B版
- 二零二五年知識產(chǎn)權(quán)保護(hù)保密協(xié)議翻譯服務(wù)協(xié)議3篇
- 二零二五版企業(yè)內(nèi)部無息短期資金互助借款合同3篇
- 天津財經(jīng)大學(xué)《兒童美術(shù)創(chuàng)作與指導(dǎo)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024版股權(quán)合作的協(xié)議書范本
- GB/T 12914-2008紙和紙板抗張強(qiáng)度的測定
- GB/T 1185-2006光學(xué)零件表面疵病
- ps6000自動化系統(tǒng)用戶操作及問題處理培訓(xùn)
- 家庭教養(yǎng)方式問卷(含評分標(biāo)準(zhǔn))
- 城市軌道交通安全管理課件(完整版)
- 線纜包覆擠塑模設(shè)計和原理
- TSG ZF001-2006 安全閥安全技術(shù)監(jiān)察規(guī)程
- 部編版二年級語文下冊《蜘蛛開店》
- 鍋爐升降平臺管理
- 200m3╱h凈化水處理站設(shè)計方案
- 個體化健康教育記錄表格模板1
評論
0/150
提交評論