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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第五章循環(huán)結(jié)構(gòu)的C程序設(shè)計(jì)5.1while循環(huán)語(yǔ)句5.2do-while循環(huán)語(yǔ)句5.3for循環(huán)語(yǔ)句5.4循環(huán)的嵌套5.5break語(yǔ)句和continue語(yǔ)句5.6goto語(yǔ)句和標(biāo)號(hào)5.7程序設(shè)計(jì)舉例習(xí)題5.1

while循環(huán)語(yǔ)句

while循環(huán)的一般形式如下:

while(表達(dá)式)語(yǔ)句其流程圖如圖5.1所示。圖5.1while循環(huán)

while語(yǔ)句的執(zhí)行過程是:先計(jì)算while后面圓括號(hào)內(nèi)表達(dá)式的值,如果其值為“真”(非0),則執(zhí)行語(yǔ)句部分(即循環(huán)體);然后再計(jì)算表達(dá)式的值,并重復(fù)上述過程,直到表達(dá)式的值為“假”(0)時(shí),循環(huán)結(jié)束,程序控制轉(zhuǎn)至循環(huán)結(jié)構(gòu)的下一語(yǔ)句。

while循環(huán)中的表達(dá)式與分支中的表達(dá)式一樣,可以是任何有效的表達(dá)式,如:關(guān)系表達(dá)式(如i<=100)或邏輯表達(dá)式(如a<b&&x<y),數(shù)值表達(dá)式或字符表達(dá)式,同時(shí)表達(dá)式的值非0表示邏輯真,0表示邏輯假。只要其值非0,就可執(zhí)行循環(huán)體。使用while語(yǔ)句時(shí),應(yīng)注意以下幾個(gè)問題:

(1)while語(yǔ)句的特點(diǎn)是“先判斷,后執(zhí)行”,即先判斷表達(dá)式的值,然后執(zhí)行循環(huán)體中的語(yǔ)句。因此,如果表達(dá)式的值一開始就為“假”時(shí),則循環(huán)體一次也不執(zhí)行。

(2)循環(huán)體由多個(gè)語(yǔ)句組成時(shí),必須用左、右花括號(hào)括起來,使其構(gòu)成一復(fù)合語(yǔ)句。如下例:

voidmain()

{

inti,sum;

i=5;sum=0;

while(i>0)

{sum=sum+i;

i--;

}

}若其中的循環(huán)體無(wú){},即循環(huán)語(yǔ)句寫成:

while(i>0)

sum=sum+i;

i--;那么循環(huán)體中只包含sum求和一條語(yǔ)句,而語(yǔ)句i--則變?yōu)檠h(huán)結(jié)構(gòu)的下一條語(yǔ)句,盡管i--語(yǔ)句也采用了縮進(jìn)的形式,但計(jì)算機(jī)執(zhí)行程序時(shí)是按語(yǔ)法進(jìn)行的。這是循環(huán)結(jié)構(gòu)編程的常見錯(cuò)誤,要予以重視。

(3)為使循環(huán)最終能夠結(jié)束,不產(chǎn)生“無(wú)限循環(huán)”,每執(zhí)行一次循環(huán)體,表達(dá)式的值都應(yīng)向表達(dá)式趨于“假”變化。如上例中,若循環(huán)體的兩條語(yǔ)句未構(gòu)成復(fù)合語(yǔ)句,即i--不在循環(huán)體內(nèi),那么循環(huán)表達(dá)式i>0的值就不會(huì)變化,永遠(yuǎn)為真,程序?qū)o(wú)限次的執(zhí)行下去,即通常所說的,是一個(gè)“死循環(huán)”。

(4)要做好循環(huán)前的準(zhǔn)備工作。如上例中,i和sum的初值要在while之前賦好,i的初值要正確,sum要清零,否則程序就可能出錯(cuò)。請(qǐng)讀者考慮,若i的初值為0時(shí),結(jié)果如何?

例5.1

利用while語(yǔ)句實(shí)現(xiàn):從鍵盤輸入n(n>0)個(gè)數(shù),求其和。分析:程序流程圖如圖5.2所示。

#include<stdio.h>

voidmain()

{

inti,n,k,sum;

i=1;sum=0;

printf("Inputn:");

scanf("%d",&n);

while(i<=n)

{

scanf("%d",&k);

sum=sum+k;

i++;

}

printf("\nsumis:%d\n",sum);

}運(yùn)行結(jié)果:

Inputn:6↙

123421195↙

sumis:73圖5.2求n個(gè)數(shù)的和

例5.2

從鍵盤連續(xù)輸入字符,直到輸入“回車”符為止,統(tǒng)計(jì)輸入的字符個(gè)數(shù)。

分析:算法由圖5.3所示的流程圖描述。

#include<stdio.h>

#include<conio.h>

voidmain()

{

charch;

intlen=0;

puts("Typeinasentence,thenpress<Enter>\n");

while((ch=getch())!=′\r′)

{

putchar(ch);

len++;

}

printf("\nSentenceis%dcharacterslong.\n",len);

}運(yùn)行結(jié)果:

Typeinasentence,thenpress<Enter>

thisisasentence.↙

Sentenceis19characterslong.圖5.3統(tǒng)計(jì)輸入字符的個(gè)數(shù)5.2

do-while循環(huán)語(yǔ)句

do-while循環(huán)的一般形式如下:

do語(yǔ)句

while(表達(dá)式);其流程圖如圖5.4所示。圖5.4do-while循環(huán)

do-while語(yǔ)句的執(zhí)行過程是:先執(zhí)行循環(huán)體中的語(yǔ)句,然后計(jì)算表達(dá)式的值。若表達(dá)式的值為“真”(非0),則再次執(zhí)行循環(huán)體。如此重復(fù),直至表達(dá)式的值為“假”(0)時(shí),結(jié)束循環(huán)。

do-while語(yǔ)句中的表達(dá)式的要求同while語(yǔ)句。使用do-while語(yǔ)句應(yīng)注意如下幾個(gè)問題:

(1)do和while都是關(guān)鍵字,配合起來使用,while(表達(dá)式)后面的“;”不可少。

(2)do-while語(yǔ)句的特點(diǎn)是“先執(zhí)行,后判斷”。因此,無(wú)論一開始表達(dá)式的值為“真”還是“假”,循環(huán)體都至少被執(zhí)行一次,這一點(diǎn)與while語(yǔ)句不同。

(3)若do-while語(yǔ)句的循環(huán)體部分由多個(gè)語(yǔ)句組成時(shí),必須用左、右花括號(hào)括起來,使其形成復(fù)合語(yǔ)句。例如:

do

{

sum+=i;

i--;

}

while(i>0);

(4)C語(yǔ)言中的do-while語(yǔ)句是在表達(dá)式的值為“真”時(shí)重復(fù)執(zhí)行循環(huán)體的,這一點(diǎn)同別的語(yǔ)言中的類似語(yǔ)句有區(qū)別,在程序設(shè)計(jì)中應(yīng)引起注意。

例5.3

利用do-while語(yǔ)句重做例5.1。

分析:算法流程由圖5.5描述。

#include<stdio.h>

voidmain()

{

inti,n,k,sum;

i=1;sum=0;

printf("Inputn:");

scanf("%d",&n);

do

{

scanf("%d",&k);

sum=sum+k;

i++;

}

while(i<=n);

printf("sumis:%d\n",sum);

}運(yùn)行結(jié)果:

Inputn:6↙

1237112334↙

sumis:90圖5.5求n個(gè)數(shù)的和在一般情況下,用while語(yǔ)句和do-while語(yǔ)句處理同一問題時(shí),若兩者的循環(huán)體部分是一樣的,它們的結(jié)果也一樣。若while后面的表達(dá)式一開始就為假時(shí),兩種循環(huán)的結(jié)果是不一樣的,while語(yǔ)句中的循環(huán)體一次都不執(zhí)行,而do-while則至少執(zhí)行一次。請(qǐng)讀者比較例5.1和例5.3,仔細(xì)分析其執(zhí)行過程。5.3

for循環(huán)語(yǔ)句

for循環(huán)語(yǔ)句的一般形式如下:

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

語(yǔ)句

C語(yǔ)言中的for語(yǔ)句使用非常靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它可以代替while語(yǔ)句,是一種比while循環(huán)功能更強(qiáng)的循環(huán)語(yǔ)句。

for語(yǔ)句的流程圖如圖5.6所示。圖5.6for循環(huán)其執(zhí)行過程是:

(1)首先求解表達(dá)式1。

(2)求解表達(dá)式2,若其值為“真”(非0),則執(zhí)行循環(huán)體中的語(yǔ)句,然后執(zhí)行第(3)步。若為“假”(0),則結(jié)束循環(huán),轉(zhuǎn)至第(5)步。

(3)求解表達(dá)式3。

(4)轉(zhuǎn)至第(2)步重復(fù)執(zhí)行。

(5)執(zhí)行for循環(huán)語(yǔ)句的下一語(yǔ)句。

for語(yǔ)句的功能可用while語(yǔ)句描述如下:表達(dá)式1;

while(表達(dá)式2)

{

語(yǔ)句;表達(dá)式3;

}

for語(yǔ)句是最簡(jiǎn)單的應(yīng)用形式,也是最容易理解的形式:

for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)語(yǔ)句例如,"for(i=1;i<=50;i++)sum=sum+i;"。使用for語(yǔ)句時(shí),需要注意以下幾個(gè)問題:

(1)for語(yǔ)句中的任何一個(gè)表達(dá)式都可以省略,但其中的分號(hào)一定要保留。當(dāng)省略表達(dá)式2時(shí),相當(dāng)于“無(wú)限循環(huán)”(循環(huán)條件總為“真”),這時(shí)就需要在for語(yǔ)句的循環(huán)體中設(shè)置相應(yīng)的語(yǔ)句來結(jié)束循環(huán)。

(2)如果for語(yǔ)句的循環(huán)體部分是由多個(gè)語(yǔ)句組成的,也必須用左、右花括號(hào)括起來,使其形成復(fù)合語(yǔ)句。

(3)for語(yǔ)句中的表達(dá)式1和表達(dá)式3,既可以是一個(gè)簡(jiǎn)單表達(dá)式,也可以由逗號(hào)運(yùn)算符將多個(gè)表達(dá)式連接起來,如下例,此時(shí)表達(dá)式1和表達(dá)式3都是逗號(hào)表達(dá)式。

for(i=0,sum=0;i<=100;i++,i++)

sum=sum+i;

(4)表達(dá)式2一般是關(guān)系表達(dá)式(如i<=100)或邏輯表達(dá)式(如a<b&&x<y),但也可以是數(shù)值表達(dá)式或字符表達(dá)式,其形式及邏輯取值與分支中的表達(dá)式一樣,只要其值為非零,就可執(zhí)行循環(huán)體。例如:

for(i=0;(c=getchar())!=′\n′;i+=c)

;注意此循環(huán)體為空語(yǔ)句,把本來要在循環(huán)體內(nèi)處理的內(nèi)容放在表達(dá)式3中,作用是一樣的,但因可讀性差而不宜采用。

(5)避免死循環(huán)。發(fā)生死循環(huán)的原因很多,主要有以下幾個(gè):①漏掉循環(huán)變量值的修改語(yǔ)句,如:

for(i=1;i<=100;){…},若循環(huán)體中也沒有i的增值語(yǔ)句,則出現(xiàn)死循環(huán)。②循環(huán)體中對(duì)循環(huán)變量重新賦值,如:

for(i=1;i<=100;i++){…;i=2;},循環(huán)體內(nèi)總使i為2,表達(dá)式3總使i為3。③表達(dá)式2設(shè)置錯(cuò)誤,如想循環(huán)10次,寫成:

for(i=1;i=10;i++){…},表達(dá)式2是賦值語(yǔ)句,其值永等于10,恒真。遇到死循環(huán),要認(rèn)真地多方面分析程序,可在關(guān)鍵位置增設(shè)printf語(yǔ)句,或利用debug調(diào)試。while語(yǔ)句、do-while語(yǔ)句也同樣會(huì)出現(xiàn)這樣的情況,必須要注意循環(huán)條件的正確書寫,以及循環(huán)變量的修改,使循環(huán)趨于結(jié)束。

例5.4

利用for語(yǔ)句重做例5.1。

#include<stdio.h>

voidmain()

{

inti,n,k,sum=0;

printf("Inputn:");

scanf("%d",&n);

for(i=1;i<=n;i++)

{

scanf("%d",&k);

sum=sum+k;

}

printf("sumis:%d\n",sum);

}運(yùn)行結(jié)果:

Inputn:6↙

711205219↙

sumis:64

例5.5

計(jì)算1至50中是7的倍數(shù)的數(shù)值之和。

#include<stdio.h>

voidmain()

{

inti,sum=0;

for(i=1;i<=50;i++)

if(i%7==0)sum+=i;

printf("sum=%d\n",sum);

}運(yùn)行結(jié)果:

sum=1965.4循環(huán)的嵌套當(dāng)一個(gè)循環(huán)體內(nèi)又包含另一個(gè)完整的循環(huán)結(jié)構(gòu)時(shí),稱為循環(huán)的嵌套或多重循環(huán)。while、do-while和for這三種循環(huán)均可以相互嵌套,即在while循環(huán)、do-while循環(huán)和for循環(huán)體內(nèi),都可以完整地包含上述任一種循環(huán)結(jié)構(gòu)(如圖5.7所示)。循環(huán)的嵌套常用于解決矩陣運(yùn)算、報(bào)表打印等問題。圖5.7循環(huán)嵌套

(1)while()

{

while()

{

}

}

(2)for(;;)

{

do

{

}

while();

}當(dāng)然,還可以有很多種配合形式,不管三種循環(huán)語(yǔ)句如何搭配,編寫循環(huán)嵌套結(jié)構(gòu)時(shí)要注意以下幾點(diǎn):

(1)必須是外層循環(huán)“包含”內(nèi)層循環(huán),不能發(fā)生交叉。

(2)書寫形式上一定要正確使用“縮進(jìn)式”的形式來明確層次關(guān)系,以增強(qiáng)程序的可讀性。

(3)要注意優(yōu)化程序,盡量節(jié)省程序的運(yùn)行時(shí)間,提高程序的運(yùn)行速度。循環(huán)嵌套寫得不好,會(huì)增加很多次循環(huán),造成不必要的時(shí)間浪費(fèi)。具體示例參見例5.10及《〈C程序設(shè)計(jì)〉學(xué)習(xí)指導(dǎo)(第二版)》中的典型例題分析。

例5.6

輸出九九表。

#include<stdio.h>

voidmain()

{

inti,j;

for(i=1;i<10;i++)

printf("%4d",i);

printf(“\n---------------\n");

for(i=1;i<10;i++)

for(j=1;j<10;j++)

printf((j==9)?"%4d\n":"%4d",i*j);

}運(yùn)行結(jié)果:1 2 3 4 5 6 7 8 9-----------------------1 2 3 4 5 6 7 8 92 4 6 8 10 12 14 16 183 6 9 12 15 18 21 24 274 8 12 16 20 24 28 32 365 10 15 20 25 30 35 40 456 12 18 24 30 36 42 48 547 14 21 28 35 42 49 56 638 16 24 32 40 48 56 64 729 18 27 36 45 54 63 72 81問題:若只打印輸出其上三角或下三角,該如何編程?5.5break語(yǔ)句和continue語(yǔ)句5.5.1break語(yǔ)句

break語(yǔ)句能夠跳出switch語(yǔ)句,而轉(zhuǎn)入下一語(yǔ)句繼續(xù)執(zhí)行,這在前面已經(jīng)介紹過。前面所講的三種循環(huán)語(yǔ)句都是在執(zhí)行循環(huán)體之前或之后通過對(duì)一個(gè)表達(dá)式的測(cè)試來決定循環(huán)是否結(jié)束,這是正常出口。另外,在循環(huán)體中,也可以通過使用break語(yǔ)句來立即終止循環(huán)的執(zhí)行,直接跳出循環(huán)語(yǔ)句,轉(zhuǎn)去執(zhí)行下一語(yǔ)句。在第四章中,我們已用break語(yǔ)句來跳出switch語(yǔ)句,并知其形式為

break;使用break語(yǔ)句應(yīng)注意如下幾個(gè)問題:

(1)break語(yǔ)句只能用于switch結(jié)構(gòu)或循環(huán)結(jié)構(gòu),如果在程序中有下列語(yǔ)句:

if(…)break;則此時(shí)的if語(yǔ)句一定位于循環(huán)體中或switch結(jié)構(gòu)中,break語(yǔ)句跳出的也不是if語(yǔ)句,而是跳出包含此if語(yǔ)句的循環(huán)結(jié)構(gòu)或switch結(jié)構(gòu)。

(2)在循環(huán)語(yǔ)句嵌套使用的情況下,break語(yǔ)句只能跳出(或終止)它所在的循環(huán),而不能同時(shí)跳出(或終止)多層循環(huán),如:

for(…)

{

for(…)

{

break;

}

…/*注1*/

}上述的break語(yǔ)句只能從內(nèi)層的for循環(huán)體中跳到外層的for循環(huán)體中(注1所在位置),而不能同時(shí)跳出兩層循環(huán)體。

例5.7

計(jì)算r=1到r=10時(shí)的圓面積,直到面積area大于100為止。

#include<stdio.h>

#definePI3.1415926

voidmain()

{

intr;

floatarea;

for(r=1;r<=10;r++)

{

area=PI*r*r;

if(area>100)break;

printf("r:%dareais:%f\n",r,area);

}

}運(yùn)行結(jié)果:

r:1areais:3.1415930

r:2areais:12.566370

r:3areais:28.274334

r:4areais:50.265480

r:5areais:78.539818

說明:從上面的for循環(huán)可以看到:當(dāng)area>100時(shí),執(zhí)行break語(yǔ)句,提前終止執(zhí)行循環(huán),即不再繼續(xù)執(zhí)行其余的幾次循環(huán)。5.5.2continue語(yǔ)句

continue語(yǔ)句的作用是結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語(yǔ)句,直接進(jìn)行下一次是否執(zhí)行循環(huán)的判定。

continue語(yǔ)句的一般形式如下:

continue;其執(zhí)行過程是:終止當(dāng)前這一輪循環(huán),即跳過循環(huán)體中位于continue后面的語(yǔ)句而立即開始下一輪循環(huán);對(duì)于while和do-while來講,這意味著立即執(zhí)行條件測(cè)試部分,而對(duì)于for語(yǔ)句來講,則意味著立即求解表達(dá)式3。請(qǐng)讀者注意continue和break語(yǔ)句的區(qū)別:continue語(yǔ)句只結(jié)束本次循環(huán),而不是終止整個(gè)循環(huán)的執(zhí)行;break語(yǔ)句則是結(jié)束循環(huán),不再進(jìn)行條件判斷。

例5.8

把100到150之間的不能被3整除的數(shù)輸出,要求一行輸出10個(gè)數(shù)。

#include<stdio.h>

voidmain()

{

intn,i=0;

for(n=100;n<=150;n++)

{

if(n%3==0)

continue;

printf("%4d",n);

i++;

if(i%10==0)printf("\n");

}

}運(yùn)行結(jié)果:

100101103104106107109110112113

115116118119121122124125127128

130131133134136137139140142143

145146148149

說明:變量i用來統(tǒng)計(jì)一行輸出個(gè)數(shù)。當(dāng)n能被3整除時(shí),執(zhí)行continue語(yǔ)句,結(jié)束本次循環(huán)(即跳過其后的三條語(yǔ)句,進(jìn)行下一次循環(huán)),只有n不能被3整除時(shí)才執(zhí)行循環(huán)體中的后續(xù)語(yǔ)句。問題:此例若不用continue語(yǔ)句,該如何編程?5.6goto語(yǔ)句和標(biāo)號(hào)

goto語(yǔ)句為無(wú)條件轉(zhuǎn)向語(yǔ)句,程序中使用goto語(yǔ)句時(shí)要求和標(biāo)號(hào)配合,它們的一般形式為:

goto標(biāo)號(hào);

標(biāo)號(hào):語(yǔ)句;標(biāo)號(hào)用標(biāo)識(shí)符表示,其定名規(guī)則與變量名相同,即由字母、數(shù)字和下劃線組成,其中第一個(gè)字符必須為字母或下劃線,但注意不能用整數(shù)來作標(biāo)號(hào)。例如:“gotolabel;”是合法的,而“goto1000;”就是非法的。

goto語(yǔ)句的功能是:把程序控制轉(zhuǎn)移到標(biāo)號(hào)指定的語(yǔ)句處,使程序從指定標(biāo)號(hào)處的語(yǔ)句繼續(xù)執(zhí)行。

C語(yǔ)言規(guī)定,goto語(yǔ)句的使用范圍僅局限于函數(shù)內(nèi)部,不允許在一個(gè)函數(shù)中使用goto語(yǔ)句把程序控制轉(zhuǎn)移到其它函數(shù)之內(nèi)。一般來講,goto語(yǔ)句可以有兩種用途:

(1)與if語(yǔ)句一起構(gòu)成循環(huán)結(jié)構(gòu)。

(2)退出多重循環(huán)。前面指出,使用break語(yǔ)句和continue語(yǔ)句可以跳出本層循環(huán)和結(jié)束本層循環(huán),當(dāng)程序流程需要從多重嵌套的內(nèi)層循環(huán)體中退出多層循環(huán)時(shí),使用goto語(yǔ)句效率更高。例5.9用goto語(yǔ)句和if語(yǔ)句構(gòu)成循環(huán),求

#include<stdio.h>

voidmain()

{

inti=1,sum=0;

loop:if(i<=100){

sum=sum+i;

i++;

gotoloop;

}printf("sum=%d\n",sum);

} 運(yùn)行結(jié)果:

sum=5050

5.7程序設(shè)計(jì)舉例

例5.10

用公式求出π的近似值,直到最后一項(xiàng)的絕對(duì)值小于10-6為止。

分析:這是一個(gè)典型的累加求和問題,但這里的循環(huán)次數(shù)并不能預(yù)先確定,而且各個(gè)累加項(xiàng)是以正、負(fù)交替的規(guī)律出現(xiàn)的。如何解決這類問題呢?具體程序如下:

#include<math.h>

#include<stdio.h>

voidmain()

{

ints;

floatn,t,pi;

t=1;pi=0;n=1.0;s=1;

/*為各變量賦初值*/

while(fabs(t)>=1e-6)

/*判斷當(dāng)前累加項(xiàng)t的絕對(duì)值是否大于1e-6*/

{

pi=pi+t;

n=n+2;

s=-s;/*處理符號(hào)*/

t=s/n;/*計(jì)算新的當(dāng)前項(xiàng)值*/

}

pi=pi*4;

printf("pi=%10.6f\n",pi);

}運(yùn)行結(jié)果:

pi=3.141594

說明:此程序中增加了一個(gè)頭文件math.h,這是因?yàn)樵谑褂胒abs()函數(shù)(求絕對(duì)值)時(shí)需要包含這一頭文件。

例5.11

從鍵盤輸入一個(gè)大于2的整數(shù)n,判斷n是不是素?cái)?shù)。

分析:只能被1和它本身整除的數(shù)是素?cái)?shù)。為了判斷n是不是素?cái)?shù),可以讓n除以2~n-1之間的每一個(gè)數(shù),如果n能被2~n-1之間的某一個(gè)數(shù)整除,則說明n不是素?cái)?shù),否則n是素?cái)?shù)。如此編出的程序有值得優(yōu)化之處:若n=13,則讓13被2~12之間的數(shù)除,因?yàn)?×6=12,3×4=12,檢驗(yàn)2和3后,若再檢驗(yàn)13能否被4和6整除就重復(fù)了。n值越大,這種沒必要的重復(fù)就越多,所以將n被2~之間的數(shù)整除可以節(jié)省不少運(yùn)行時(shí)間。這是編寫循環(huán)程序時(shí)應(yīng)考慮的。具體程序如下:

#include<stdio.h>

#include<math.h>

voidmain()

{

intn,k,i,flag;

do

{

printf("Inputanumber:");

scanf("%d",&n);

}

while(n<=2);

k=sqrt((double)n);

flag=1;

for(i=2;i<=k;i++)

if(n%i==0)

{

flag=0;

break;/*有一數(shù)能整除就不是素?cái)?shù),不再循環(huán)*/

}

if(flag)

printf("%disaprimenumber.\n",n);

else

printf("%disnotaprimenumber.\n",n);

}運(yùn)行結(jié)果:

Inputanumber:35↙

35isnotaprimenumber.說明:

(1)在程序的開始處利用了do-while循環(huán)語(yǔ)句來處理讀鍵盤過程,這是為了保證所讀入的數(shù)據(jù)是一個(gè)大于2的正整數(shù)。如果不滿足這一條件,將重復(fù)讀操作,直到讀入的數(shù)據(jù)滿足條件為止。考慮待處理數(shù)據(jù)的正確性是程序的基本組成部分,也是程序能正確應(yīng)用的基本保證。

(2)程序中的flag變量是用于設(shè)置標(biāo)志的,當(dāng)flag=1時(shí),說明n滿足素?cái)?shù)條件,最后通過對(duì)flag的判斷來顯示相應(yīng)的提示信息。這是一種很典型的用法,希望讀者能掌握。請(qǐng)讀者考慮,如不用此變量,程序應(yīng)作什么修改?

例5.12

用牛頓迭代法求方程2x3-4x2+3x-6=0的根,要求誤差小于10-5。

分析:牛頓迭代法是:先任意設(shè)定一個(gè)與真實(shí)的根接近的值xk作為第一次近似根,由xk求出f(xk)。再過(xk,f(xk))點(diǎn)做f(x)的切線,交x軸于xk+1,它作為第二次近似根。再由xk+1求出f(xk+1),再過(xk+1,f(xk+1))點(diǎn)做f(x)的切線,交x軸于xk+2。再求出f(xk+2),再做切線,……如此繼續(xù)下去,直到足夠接近真正的根x*為止。從圖5.8可以看出:因此這就是牛頓迭代公式??梢岳盟蓌k求出xk+1,然后由xk+1推出xk+2…。令f(x)=2x3-4x2+3x-6,可寫成以下形式:

f(x)=((2x-4)x+3)x-6圖5.8用牛頓迭代法求方程的根用這種方法表示的表達(dá)式可以節(jié)省運(yùn)行時(shí)間。具體程序如下:

#include<stdio.h>

#include<math.h>

voidmain()

{

floatx,x0,f,f1;

printf("Enterthefirstapprochx:");

scanf("%f",&x);

do

{

x0=x;

f=((2*x0-4)*x0+3)*x0-6;/*求f(x0)*/

f1=(6*x0-8)*x0+3;/*求f′(x0)*/

x=x0-f/f1;

}

while(fabs(x-x0)>=1e-5);

printf("Therootofequationis:%10.7f\n",x);

}運(yùn)行結(jié)果:

Enterthefirstapprochx:1.5↙

Therootofequationis:2.0000000

例5.13

從鍵盤輸入4個(gè)9以內(nèi)的數(shù)字字符,將其轉(zhuǎn)換為4位十進(jìn)制數(shù)后顯示出來。

分析:這個(gè)問題的實(shí)質(zhì)是將鍵入碼轉(zhuǎn)換為對(duì)應(yīng)的十進(jìn)制數(shù),求解思路可分為兩步:

(1)將每個(gè)數(shù)字字符c變成對(duì)應(yīng)的數(shù)字,即將以ASCII碼表示的數(shù)字字符變成一位十進(jìn)制數(shù),方法為:c-′0′,如c=′8′時(shí),c-′0′=8。轉(zhuǎn)換中若遇非′0′~′9′字符則結(jié)束轉(zhuǎn)換。

(2)將每次變換的一位十進(jìn)制數(shù),從高位開始,按位加權(quán),變成多位的十進(jìn)制數(shù),放在變量data中。如輸入1,2,3,4,則data=1×103+2×102+3×10+4=(((1×10)+2)×10+3)×10+4結(jié)果應(yīng)是按%d格式顯示的1234。具體程序如下:

#include<stdio.h>

voidmain()

{

charc;

inti,data=0;

printf("Inputchar:");

for(i=0;i<4;i++)

{

c=getchar();/*輸入一數(shù)字字符*/

if(c<′0′||c>′9′)

/*判斷輸入字符是否在′0′~′9′范圍內(nèi)*/

break;

data=data*10+c-′0′;/*計(jì)算當(dāng)前data值*/

}

printf("data=%d\n",data);

}運(yùn)行結(jié)果:

Inputchar:1463↙

data=1463說明:本程序中的循環(huán)結(jié)構(gòu)有兩個(gè)出口:一為輸入的4位均是′0′~′9′字符,如1463↙,輸出data=1463;另一為4位以內(nèi)即遇到非′0′~′9′字符,如鍵入123d↙,則輸出data=123。

例5.14Fibonacci數(shù)列,前幾個(gè)數(shù)為0,1,1,2,3,5,…,其規(guī)律是

F1=0 (n=1)

F2=1 (n=2)

Fn=Fn-1+Fn-2 (n≥3)編程求此數(shù)列的前40個(gè)數(shù)。分析:這是一個(gè)遞推問題,其遞推公式為Fn=Fn-1+Fn-2,初始條件為F1=0,F(xiàn)2=1。n≥3的每項(xiàng)都可按照遞推公式推算出來。我們可以假設(shè)需要的當(dāng)前項(xiàng)為f,它的前一項(xiàng)為f1,前兩項(xiàng)為f2,則算法如圖5.9所示。圖5.9遞推公式的算法具體程序如下:

#include<stdio.h>

voidmain()

{

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論