




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第5章循環(huán)結(jié)構(gòu)程序設(shè)計(jì)5.1循環(huán)的基本概念5.2while語句和do-while語句5.3for語句5.4循環(huán)的嵌套5.5幾種循環(huán)的比較5.6循環(huán)中的跳轉(zhuǎn)5.7基本的循環(huán)算法設(shè)計(jì)技術(shù)5.8循環(huán)程序設(shè)計(jì)實(shí)例 5.1循環(huán)的基本概念
循環(huán)結(jié)構(gòu)是程序設(shè)計(jì)中一種很重要的結(jié)構(gòu)。其特點(diǎn)是:在給定條件成立時(shí),反復(fù)執(zhí)行某程序段,直到條件不成立為止。給定的條件稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。
循環(huán)結(jié)構(gòu)有兩種形式:“當(dāng)型”循環(huán)和“直到型”循環(huán)。
1.“當(dāng)型”循環(huán)
判斷循環(huán)控制表達(dá)式是否為“真”,如為“真”,則反復(fù)執(zhí)行循環(huán)體,如為“假”,則結(jié)束循環(huán),即“先判斷,后執(zhí)行”。
2.“直到型”循環(huán)
首先執(zhí)行循環(huán)體,然后判斷循環(huán)控制表達(dá)式,如為“假”,則反復(fù)執(zhí)行循環(huán)體,直到循環(huán)控制表達(dá)式為“真”時(shí)結(jié)束循環(huán),即“先執(zhí)行,后判斷”。
C語言提供了多種循環(huán)語句,可以組成各種不同形式的循環(huán)結(jié)構(gòu)。
(1)while語句;
(2)do-while語句;
(3)for語句;
(4)break語句、continue語句和goto語句。 5.2while語句和do-while語句
5.2.1while語句
while語句的一般形式為
while(表達(dá)式)語句
其中:“表達(dá)式”為循環(huán)條件;“語句”為循環(huán)體。
while語句的語義是:計(jì)算表達(dá)式的值,當(dāng)值為真(非0)時(shí),執(zhí)行循環(huán)體語句。while語句的執(zhí)行過程可用圖5-1表示。圖5-1
while語句的執(zhí)行過程可用
【例5.1】
用while語句計(jì)算整數(shù)1~100的和。
用傳統(tǒng)流程圖和N-S結(jié)構(gòu)流程圖表示算法,見圖5-2。圖5-2用while語句計(jì)算1~100的和的流程圖程序如下:
main()
{
inti;
/*循環(huán)變量*/
intsum=0;
/*累加和清0*/
i=1;
/*循環(huán)變量i賦初值*/
while(i<=100){
sum=sum+i; /*循環(huán)變量累加到sum中*/
i=i+1; /*改變循環(huán)變量i的值*/
}
printf("%d\n",sum);
}
【例5.2】統(tǒng)計(jì)從鍵盤輸入一行字符的個(gè)數(shù)。
程序如下:
#include<stdio.h>
main()
{
intn=0;
printf(“inputastring:\n”);
while(getchar()!=‘\n’)n++;
printf("%d",n);
}說明
本例程序中的循環(huán)條件為getchar()!='\n',其意義是,只要從鍵盤輸入的字符不是回車就繼續(xù)循環(huán)。循環(huán)體n++完成對(duì)輸入字符個(gè)數(shù)計(jì)數(shù),因而程序?qū)崿F(xiàn)了對(duì)輸入一行字符的字符個(gè)數(shù)計(jì)數(shù)。
使用while語句應(yīng)注意以下幾點(diǎn):
(1)while語句中的表達(dá)式一般是關(guān)系表達(dá)式或邏輯表達(dá)式,只要表達(dá)式的值為真(非0)就可繼續(xù)循環(huán)。
【例5.3】while語句中的表達(dá)式的形式。
程序如下:
main()
{
inta=0,n;
printf(“\ninputn:”);
scanf(“%d”,&n);
while(n--)
printf(“%d”,a++*2);
}
說明
本例程序?qū)?zhí)行n次循環(huán),每執(zhí)行一次,n值減1。循環(huán)體輸出表達(dá)式a++*2的值,該表達(dá)式等效于(a*2;a++)。
(2)循環(huán)體如包括一個(gè)以上的語句,則必須用“{}”括起來,組成復(fù)合語句。5.2.2
do-while語句
do-while語句的一般形式為
do
語句
while(表達(dá)式);
這個(gè)循環(huán)與while循環(huán)的不同之處在于:先執(zhí)行循環(huán)中的語句,然后再判斷表達(dá)式是否為真,如果為真,則繼續(xù)循環(huán),如果為假,則終止循環(huán)。因此,do-while循環(huán)至少要執(zhí)行一次循環(huán)語句。
do_while語句的執(zhí)行過程可用圖5-3表示。圖5-3
do-while語句的執(zhí)行過程
【例5.4】用do-while語句實(shí)現(xiàn)整數(shù)1~100的和。
用傳統(tǒng)流程圖和N-S結(jié)構(gòu)流程圖表示算法,見圖5-4。圖5-4用do-while語句實(shí)現(xiàn)1~100的和的流程圖程序如下:
main()
{
inti; /*循環(huán)變量*/
intsum=0; /*累加和清0*/
i=1; /*循環(huán)變量i賦初值*/
do{
sum=sum+i;
/*循環(huán)變量累加到sum中*/
i=i+1; /*改變循環(huán)變量i的值*/
}while(i<=100); /*注意最后的分號(hào)*/
printf("%d\n",sum);
}
說明
當(dāng)有許多語句參加循環(huán)時(shí),要用“{?}”把它們括起來。
【例5.5】while和do-while循環(huán)比較。
(1)while循環(huán)
main()
{
intsum=0,i;
scanf(“%d”,&i);
while(i<=10)
{
sum=sum+i;
i++;
}
printf("sum=%d",sum);
}
(2)do_while循環(huán)
main()
{
intsum=0,i;
scanf(“%d”,&i);
do
{
sum=sum+i;
i++;
}while(i<=10);
printf("sum=%d",sum);
}
說明
while循環(huán)和do-while循環(huán)可以用來處理同一個(gè)問題,一般可以互相代替,只不過要注意形式上的區(qū)別。 5.3
for語句
在C語言中,for語句的使用最為靈活,它完全可以取代while語句。for語句的一般形式為
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句
for語句的執(zhí)行過程如下:
(1)求解表達(dá)式1。
(2)求解表達(dá)式2。若其值為真(非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行第(3)步;若其值為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。圖5-5
for語句的執(zhí)行過程
(3)求解表達(dá)式3。
(4)轉(zhuǎn)回第(2)步繼續(xù)執(zhí)行。
(5)循環(huán)結(jié)束,執(zhí)行for語句下面的一個(gè)語句。
for語句的執(zhí)行過程可用圖5-5表示。
for語句最簡單的應(yīng)用形式也是最容易理解的形式如下:
for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增量)語句
其中:“循環(huán)變量賦初值”總是一個(gè)賦值語句,它用來給循環(huán)控制變量賦初值;“循環(huán)條件”是一個(gè)關(guān)系表達(dá)式,它決定什么時(shí)候退出循環(huán);“循環(huán)變量增量”定義循環(huán)控制變量每循環(huán)一次后按什么方式變化。這三個(gè)部分之間用“;”分開。例如:
for(i=1;i<=100;i++)sum=sum+i;
先給i賦初值1,判斷i是否小于等于100,若是則執(zhí)行語句,之后值增加1;再重新判斷,直到條件為假,即i>100時(shí),結(jié)束循環(huán)。相當(dāng)于:
i=1;
while(i<=100)
{
sum=sum+i;
i++;
}
for循環(huán)中語句的一般形式相當(dāng)于如下的while循環(huán)形式:
表達(dá)式1;
while(表達(dá)式2)
{
語句;
表達(dá)式3;
}
注意
(1)for循環(huán)中的“表達(dá)式1(循環(huán)變量賦初值)”、“表達(dá)式2(循環(huán)條件)”和“表達(dá)式3(循環(huán)變量增量)”都是選擇項(xiàng),即可以缺省,但“;”不能缺省。
(2)省略了“表達(dá)式1(循環(huán)變量賦初值)”,表示不對(duì)循環(huán)控制變量賦初值。
(3)省略了“表達(dá)式2(循環(huán)條件)”,則不做其他處理時(shí)便成為死循環(huán)。例如:
for(i=1;;i++)sum=sum+i;
相當(dāng)于:
i=1;
while(1)
{sum=sum+i;
i++;}
(4)省略了“表達(dá)式3(循環(huán)變量增量)”,則不對(duì)循環(huán)控制變量進(jìn)行操作,這時(shí)可在語句體中加入修改循環(huán)控制變量的語句。例如:
for(i=1;i<=100;)
{sum=sum+i;
i++;}
(5)省略了“表達(dá)式1(循環(huán)變量賦初值)”和“表達(dá)式3(循環(huán)變量增量)”。例如:
for(;i<=100;)
{sum=sum+i;
i++;}
相當(dāng)于:
while(i<=100)
{sum=sum+i;
i++;}
(6)3個(gè)表達(dá)式都可以省略。例如:
for(;;)語句
相當(dāng)于:
while(1)語句
(7)表達(dá)式1可以是設(shè)置循環(huán)變量的初值的賦值表達(dá)式,也可以是其他表達(dá)式。例如:
for(sum=0;i<=100;i++)sum=sum+i;
(8)表達(dá)式1和表達(dá)式3可以是一個(gè)簡單表達(dá)式,也可以是逗號(hào)表達(dá)式。例如:
for(sum=0,i=1;i<=100;i++)sum=sum+i;
或
for(i=0,j=100;i<=100;i++,j--)k=i+j;
(9)表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值非零,就執(zhí)行循環(huán)體。例如:
for(i=0;(c=getchar())!=‘\n’;i+=c);
又如:
for(;(c=getchar())!=‘\n’;)
printf("%c",c);
【例5.6】用for語句實(shí)現(xiàn)整數(shù)1~100的和。
程序如下:
main()
{
inti;
/*循環(huán)變量*/
intsum=0;
/*累加和清0*/
for(i=1;i<=100;i++){
/*第一個(gè)表達(dá)式完成循環(huán)變量i賦初值;第三個(gè)表達(dá)式實(shí)現(xiàn)改變循環(huán)變量i的值*/
sum=sum+i;
/*循環(huán)變量累加到sum中*/
}
printf("%d\n",sum);
} 5.4循?環(huán)?的?嵌?套
循環(huán)嵌套是指一個(gè)循環(huán)(稱為“外循環(huán)”)的循環(huán)體內(nèi)包含另一個(gè)循環(huán)(稱為“內(nèi)循環(huán)”)。內(nèi)循環(huán)中還可以包含循環(huán),形成多層循環(huán)。循環(huán)嵌套的層數(shù)理論上無限制。
三種循環(huán)(while循環(huán)、do-while循環(huán)、for循環(huán))可以互相嵌套。例如:注:可將循環(huán)結(jié)構(gòu)整個(gè)當(dāng)成一條語句來看待,那就很容易理解循環(huán)的嵌套了。
【例5.7】
打印九九乘法表。
分析:
先畫出乘法表結(jié)構(gòu),然后i?×?j,i從1到9變化,j從1到n變化,所以是兩層循環(huán)結(jié)構(gòu)。
程序如下:
#include<stdio.h>
main()
{
inti,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
printf(“%4d”,i*j);
printf(“\n”);
}
}程序運(yùn)行結(jié)果:
1
2
4
3
6 9
4
8 12 16
5
10 15 20 25
6
12 18 24 30 36
7
14 21 28 35 42 49
8
16 24 32 40 48 56 64
9
18 27 36 45 54 63 72 815.5幾種循環(huán)的比較
下面對(duì)while、do_while、for三種循環(huán)作一比較。
(1)三種循環(huán)(while、do-while、for)都可以用來處理同一個(gè)問題,一般可以互相代替。while循環(huán)
do-while循環(huán)
for循環(huán)表達(dá)式1; 表達(dá)式1; for(表達(dá)式1;表達(dá)式2;表達(dá)式3){while(表達(dá)式2){ do{ 循環(huán)體;循環(huán)體; 循環(huán)體; }表達(dá)式3; 表達(dá)式3;
} }while(表達(dá)式2);
(2)循環(huán)條件:while、do-while在while后面指定;for循環(huán)在“表達(dá)式3”中指定。
(3)循環(huán)初始條件:while、do-while在循環(huán)前指定;for循環(huán)在“表達(dá)式1”中指定。
(4)判斷循環(huán)條件的時(shí)機(jī):while、for循環(huán)先判斷循環(huán)條件,后執(zhí)行;do-while循環(huán)先執(zhí)行,后判斷循環(huán)條件。
(5)while、do-while、for循環(huán)均可用break語句跳出循環(huán)(結(jié)束循環(huán)),用continue語句提前結(jié)束本次循環(huán)體的執(zhí)行。 5.6循環(huán)中的跳轉(zhuǎn)
5.6.1break語句
break語句通常用在循環(huán)語句和開關(guān)語句中。當(dāng)break用于開關(guān)語句switch中時(shí),可使程序跳出switch而執(zhí)行switch以后的語句;如果沒有break語句,則將成為一個(gè)死循環(huán)而無法退出。break在switch中的用法已在前面介紹開關(guān)語句的例子中碰到,這里不再舉例。
當(dāng)break語句用于do-while、for、while循環(huán)語句中時(shí),可使程序終止循環(huán)而執(zhí)行循環(huán)后面的語句。通常break語句總是與if語句連在一起,即滿足條件時(shí)便跳出循環(huán)。break語句的執(zhí)行過程可用圖5-6表示。
while(表達(dá)式1)
{…
if(表達(dá)式2)break;
…
}圖5-6
break語句的執(zhí)行過程
【例5.8】輸出鍵盤字符,直到按回車換行,按Esc鍵退出。
程序如下:
main()
{
inti=0;
charc;
while(1) /*設(shè)置循環(huán)*/
{
c=‘\0’; /*變量賦初值*/
while(c!=13&&c!=27) /*鍵盤接收字符直到按回車或Esc鍵*/
{
c=getch();
printf("%c\n",c);
}
if(c==27)
break; /*判斷是否按Esc鍵,若按則退出循環(huán)*/
i++;
printf(“TheNo.is%d\n”,i);
}
printf("Theend");
}
注意
(1)break語句對(duì)if-else的條件語句不起作用。
(2)在多層循環(huán)中,一個(gè)break語句只向外跳一層。5.6.2
continue語句
continue語句的作用是跳過循環(huán)體中剩余的語句而強(qiáng)行執(zhí)行下一次循環(huán)。continue語句只用在for、while、do-while等循環(huán)體中,常與if條件語句一起使用,用來加速循環(huán)。continue語句的執(zhí)行過程可用圖5-7表示。
while(表達(dá)式1)
{…
if(表達(dá)式2)continue;
…
}圖5-7
continue語句的執(zhí)行過程
【例5.9】
輸出鍵盤字符,直到按回車退出,忽略Esc鍵。
程序如下:
main()
{
charc;
while(c!=13) /*不是回車符則循環(huán)*/
{
c=getch();
if(c==0X1B)
continue; /*若按Esc鍵不輸出便進(jìn)行下次循環(huán)*/
printf(“%c\n”,c);
}
}
break語句和continue語句的區(qū)別在于:break語句的功能是跳出循環(huán),而continue語句的功能是結(jié)束本次循環(huán)體的執(zhí)行,進(jìn)入下一次循環(huán)。5.6.3
goto語句
goto語句是一種無條件轉(zhuǎn)移語句,與BASIC中的goto語句相似。goto語句的使用格式為
goto語句標(biāo)號(hào);
其中,“語句標(biāo)號(hào)”是一個(gè)有效的標(biāo)識(shí)符,這個(gè)標(biāo)識(shí)符加上一個(gè)“?:?”一起出現(xiàn)在函數(shù)內(nèi)某處,執(zhí)行g(shù)oto語句后,程序?qū)⑻D(zhuǎn)到該標(biāo)號(hào)處并執(zhí)行其后的語句。另外,語句標(biāo)號(hào)必須與goto語句同處于一個(gè)函數(shù)中,但可以不在一個(gè)循環(huán)層中。通常goto語句與if條件語句連用,當(dāng)滿足某一條件時(shí),程序跳到語句標(biāo)號(hào)處運(yùn)行。
通常不使用goto語句,主要因?yàn)樗鼤?huì)使程序?qū)哟尾磺?,且不易讀,但在多層嵌套退出時(shí),用goto語句則比較合理。
【例5.10】
用goto語句和if語句構(gòu)成循環(huán),計(jì)算1~100的和。
程序如下:
main()
{
inti,sum=0;
i=1;
loop:if(i<=100)
{
sum=sum+i;
i++;
gotoloop;
}
printf("%d\n",sum);
}
5.7基本的循環(huán)算法設(shè)計(jì)技術(shù)
5.7.1窮舉法
設(shè)計(jì)思想:對(duì)問題的所有可能狀態(tài)一一測(cè)試,直到找到解或?qū)⑷靠赡軤顟B(tài)測(cè)試為止。
【例5.11】編寫程序求2~10000以內(nèi)的完全數(shù)。(完全數(shù)是指一個(gè)數(shù)的因子(除了這個(gè)數(shù)本身)之和等于該數(shù)本身。例如,6的因子是1、2、3,1?+?2?+?3?=?6,則6是完全數(shù)。)
分析:
(1)設(shè)定i從2變到10000,對(duì)每個(gè)i找到其因子和s;
(2)判定i?=?s是否成立,若相等,則i為完全數(shù),否則i不為完全數(shù)。
N-S流程圖如圖5-8所示。
程序如下:
#include<stdio.h>
voidmain()
{
inti,j,s;
for(i=2;i<=10000;i++)
{
s=0;
for(j=1;j<i;j++)
{
if(i%j==0)
s=s+j;
}
if(i==s)
printf(“%6d\n”,s);
}
}圖5-8
N-S流程圖
【例5.12】
有30個(gè)人,每個(gè)男人吃飯花3元,每個(gè)女人花2元,每個(gè)小孩花1元,一共花了50元,男人、女人、小孩一共有幾個(gè)人?(“百雞問題”)
分析:
該問題同以下問題類似:每次可走5級(jí)、3級(jí)、2級(jí)樓梯,樓梯一共有50級(jí),有多少種走法?每次走7級(jí)剩5級(jí),每次走5級(jí)剩3級(jí),每次走3級(jí)剩2級(jí)樓梯,樓梯一共有多少級(jí)?一百元兌換10元、5元、2元零錢,可以有多少種兌換方法?程序如下:
#include<stdio.h>
main()
{
intx,y,z;
for(x=0;x<=30;x++)
for(y=0;y<=30;y++)
for(z=0;z<=30;z++)
{
if((3*x+2*y+z==50)&&(x+y+z==30))
printf(“man=%d,woman=%d,children=%d\n”,x,y,z);
}
}該如何修改程序以提高效率呢?男人最多16人,女人最多25人,程序可改為
for(x=0;x<=16;x++)
for(y=0;y<=25;y++)
{
z=30-x-y;
if(3*x+2*y+z==50)
printf("man=%d,woman=%d,children=%d\n",x,y,z);
}分析:
f1為第一個(gè)數(shù),f2為第二個(gè)數(shù),f3為第三個(gè)數(shù)。遞推公式為:f1=1,f2=1,f3=f1+f2。5.7.2遞推法遞推法也稱為迭代法,其設(shè)計(jì)思想是:迭代是一個(gè)不斷用新值取代變量的舊值,或由舊值遞推出變量的新值的過程。
【例5.13】按每行輸出5個(gè)數(shù)的形式輸出Fibonacci數(shù)列的前40個(gè)數(shù)。已知Fibonacci數(shù)列:圖5-9
N-S流程圖程序如下:
#include<stdio.h>
voidmain()
{
inti;
longintf1=1,f2=1,f3;
printf(“%-10ld%-10ld”,f1,f2);
for(i=3;i<=40;i++)
{
f3=f1+f2; /*計(jì)算下一個(gè)f*/
f1=f2;
f2=f3;
printf(“%-10ld”,f3);
if(i%5==0)printf(“\n”);
}
}
【例5.14】
用牛頓迭代法求方程f(x)=2x3-4x2+3x-7=0在x=2.5附近的實(shí)根,直到滿足|xn-xn-1|<10-6為止。
分析:
牛頓迭代法的基本思想如圖5-10所示。圖5-10牛頓迭代法的基本思想設(shè)xk是方程f(x)=0的精確解x*附近的一個(gè)猜測(cè)解,過點(diǎn)Pk(xk,f(xk))作f(x)的切線。該切線方程為它與x軸的交點(diǎn)是方程:的解,為于是由xk推出xk+1,再由xk+1推出xk+2,以此類推,這就是牛頓迭代公式??梢宰C明,若猜測(cè)解xk取在單根x*附近,則它恒收斂。這樣,經(jīng)過有限次迭代后,便可以求得符合誤差要求的近似根。本題的解題思路如下:
(1)建立迭代關(guān)系式。根據(jù)牛頓迭代公式有這就是要建立的迭代關(guān)系式。
(2)給定初值。初值為x=2.5
(3)給定精度(誤差)為E0。精度是迭代控制的條件,即當(dāng)誤差大于E0時(shí),要繼續(xù)迭代。如何計(jì)算誤差呢?顯然應(yīng)該用?|xk+1-xk|?來表示誤差,于是得到循環(huán)結(jié)構(gòu)的控制條件:
fabs(xk+1-xk)>=E0程序如下:
#include“stdio.h”
#include“math.h”
main()
{
floatx=2.5,x0,f,f2;
do{
x0=x; /*保存上一個(gè)x*/
f=2*x0*x0*x0-4*x0*x0+3*x0-7; /*計(jì)算f(xn-1)*/
f2=6*x0*x0-8*x0+3; /*計(jì)算f‘(xn-1)*/
x=x0-f/f2; /*計(jì)算下一個(gè)x*/
}while(fabs(x-x0)>=10e-6);
printf("%f",x);
} 5.8循環(huán)程序設(shè)計(jì)實(shí)例
【例5.15】
用公式求π。
分析:
先設(shè)置一個(gè)double類型的參數(shù)sum作為和;每個(gè)項(xiàng)是正負(fù)交替的,需要一個(gè)變量作為符號(hào)標(biāo)志,在?-1和1之間循環(huán)變化;分母是不斷變化的,也需要一個(gè)變量記錄分母。
N-S流程圖如圖5-11所示。圖5-11
N-S流程圖程序如下:
#include<math.h>
main()
{
ints;
floatn,t,pi;
t=1,pi=0;n=1.0;s=1;
while(fabs(t)>1e-6)
{pi=pi+t;
n=n+2;
s=-s;
t=s/n;
}
pi=pi*4;
printf("pi=%10.6f\n",pi);
}說明
(1)要改為for結(jié)構(gòu),只要修改“while(fabs(t)>1e-6)”為“for(;fabs(t)>1e-6;)”即可。
(2)為什么“n=n+2;s=-s;”要在“t=s/n;”之前?請(qǐng)讀者自行分析。
【例5.16】
判斷m是否為素?cái)?shù)。
N-S流程圖如圖5-12所示。
程序如下:
#include<math.h>
main()
{
intm,i,k;
scanf(“%d”,&m);
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>=k+1)
printf(“%disaprimenumber\n”,m);
else
printf("%disnotaprimenumber\n",m);
}圖5-12
N-S流程圖
【例5.17】
有數(shù)列2/3,4/5,6/9,10/15,…,求此數(shù)列前30項(xiàng)的和。
分析:
對(duì)于數(shù)列的題,首先要找出通項(xiàng)公式或前后項(xiàng)的計(jì)算關(guān)系公式,根據(jù)公式來求解。由于數(shù)列的題一般執(zhí)行次數(shù)能確定,因此用for語句來編寫比較方便。
此題前后項(xiàng)的關(guān)系是:后一項(xiàng)的分子是前一項(xiàng)的分母加1,后一項(xiàng)的分母是前一項(xiàng)的分子加分母。解題思路是用循環(huán)語句求各項(xiàng),并把值累加,因?yàn)槭乔笄?0項(xiàng)的和,所以循環(huán)執(zhí)行30次。程序如下:
#include<stdio.h>
main()
{inti=2,j=3,n,c;
floats=0;
for(n=1;n<=30;n++)
{
s=s+(float)i/j;
c=i;
i=j+1;
j=c+j;
}
printf("\n%f",s);
}說明
此題中的n與循環(huán)體中的執(zhí)行語句沒有數(shù)值上的聯(lián)系,僅僅用于決定循環(huán)執(zhí)行的次數(shù)。
【例5.18】
已知a?>?b?>?c?>?0,a、b、c為整數(shù),且a?+?b?+?c?<?100,則滿足1/a2?+?1/b2?=?1/c2的a、b、c共有多少組?
分析:
這是一道典型的三重嵌套循環(huán)的題目。a、b、c都是位于1到99之間的整數(shù)。編程的基本思路是:找出1到99之間的所有a、b、c的排列,查看同時(shí)滿足a?>?b?>?c、a?+?b?+?c?<?100、1/a2?+?1/b2?=?1/c2這三個(gè)條件的a、b、c有多少組。值得注意的是,1/a2?+?1/b2?=?1/c2這個(gè)條件并不能簡單地原樣照寫,因?yàn)樵谇蠓謹(jǐn)?shù)的過程中必然有四舍五入,不能得出真正的準(zhǔn)確的結(jié)果,必須把條件變形成c2(a2?+?b2)?=?a2b2才能得出正確的結(jié)果。程序如下:
#include<stdio.h>
main()
{longa,b,c,n=0;
for(c=1;c<=97;c++)
for(b=c+1;b<=98;b++)
for(a=b+1;a<=99;a++)
if(a+b+c<100&&c*c*(a*a+b*b)==a*a*b*b)
n++;
printf("\n%ld",n);
}特別注意,此題中變量不能定義成int型。
此題可作改進(jìn),在循環(huán)時(shí)確保a?>?b?>?c,而不需要再在if中判斷。改進(jìn)后的程序如下:
for(a=1;a<=99;a++)
for(b=1;b<=99;b++)
for(c=1;c<=99;c++)
if(a>b&&b>c&&a+b+c<100&&c*c*(a*a+b*b)==a*a*b*b)
n++;
【例5.19】
從鍵盤任意輸入一個(gè)正整數(shù),編程判斷它是否是素?cái)?shù),若是素?cái)?shù),輸出“Yes!”,否則輸出“No!”。
判斷素?cái)?shù)的方法:除了能被1和它本身整除外,不能被其他任何整數(shù)整除。1不是素?cái)?shù)。2是最小的素?cái)?shù)。
分析:
把m作為被除數(shù),把i?=?2~(m?-?1)依次作為除數(shù),判斷被除數(shù)m與除數(shù)i相除的結(jié)果,若都除不盡,即余數(shù)都不為0,則說明m是素?cái)?shù)。反之,只要有一次能除盡(余數(shù)為0),則說明m存在一個(gè)1和它本身以外的另外一個(gè)因子,它不是素?cái)?shù)。方法一:
程序如下:
#include<stdio.h>
main()
{
intnumber;
inti;
/*定義循環(huán)變量i*/
intflag=1; /*定義素?cái)?shù)標(biāo)識(shí),初始為1*/
printf(“pleaseinputanumber:\n”);
scanf(“%d”,&number); /*從鍵盤輸入一個(gè)整數(shù)*/
for(i=2;i<=number-1&&flag;i++){
/*查看從2至number-1之間所有整數(shù)是否能整除number*/
if(number%i==0){
flag=0;
/*如果能整除number,則說明number不是素?cái)?shù),存在因子,故素?cái)?shù)標(biāo)識(shí)改為0*/
}
}
printf(“\n”);
if(flag)
/*若素?cái)?shù)標(biāo)識(shí)為1,則輸出是素?cái)?shù),否則輸出不是素?cái)?shù)*/
printf(“YES====>%disaprimenumber!\n”,number);
else
printf("NO====>%disnotaprimenumber!\n",number);
}為了減少循環(huán)次數(shù),用數(shù)學(xué)的方法可以證明:只需用2~sqrt(m)之間的數(shù)去除m,即可得到正確的判定結(jié)果。
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度建筑工人勞動(dòng)合同(附創(chuàng)新技術(shù)培訓(xùn)內(nèi)容)
- 二零二五年度國際酒店餐飲業(yè)勞務(wù)供應(yīng)協(xié)議
- 二零二五年度生活垃圾清運(yùn)與環(huán)保技術(shù)研發(fā)應(yīng)用合同
- 電子商務(wù)平臺(tái)代運(yùn)營服務(wù)協(xié)議
- 采購合同辣椒采購合同
- 音樂課本中的歌曲背后的故事征文
- 專業(yè)保潔服務(wù)合作協(xié)議
- 簡愛人物形象塑造分析:世界名著導(dǎo)讀課程教案
- 人力資源招聘與培訓(xùn)流程說明
- 企業(yè)綠色信用修復(fù)服務(wù)協(xié)議
- 10我們所了解的環(huán)境污染 (教學(xué)設(shè)計(jì))2023-2024學(xué)年統(tǒng)編版道德與法治四年級(jí)上冊(cè)
- 2025中國煙草/中煙工業(yè)招聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 新教科版小學(xué)科學(xué)三年級(jí)下冊(cè)教案(全冊(cè))
- 2025小學(xué)語文一年級(jí)下冊(cè)第二單元教學(xué)課件匯編(配套新教材)
- 語文課堂中的多媒體教學(xué)方法研究
- 2025年湖南交通職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫含答案解析
- 小學(xué)生傳統(tǒng)文化教育的家庭學(xué)校社會(huì)協(xié)同機(jī)制
- 兒童飲食健康指南
- 民用無人機(jī)操控員執(zhí)照(CAAC)考試復(fù)習(xí)重點(diǎn)題庫500題(含答案)
- 2025年春新北師大版物理八年級(jí)下冊(cè)課件 第六章 質(zhì)量和密度 第三節(jié) 密度的測(cè)量與應(yīng)用
- 2024-2025學(xué)年成都市高一上英語期末考試題(含答案和音頻)
評(píng)論
0/150
提交評(píng)論