《C語言程序設(shè)計(jì) 》課件第5章_第1頁
《C語言程序設(shè)計(jì) 》課件第5章_第2頁
《C語言程序設(shè)計(jì) 》課件第5章_第3頁
《C語言程序設(shè)計(jì) 》課件第5章_第4頁
《C語言程序設(shè)計(jì) 》課件第5章_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論