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

下載本文檔

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

文檔簡介

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

while循環(huán)語句

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

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

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

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

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

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

voidmain()

{

inti,sum;

i=5;sum=0;

while(i>0)

{sum=sum+i;

i--;

}

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

while(i>0)

sum=sum+i;

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

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

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

例5.1

利用while語句實現(xiàn):從鍵盤輸入n(n>0)個數(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);

}運行結(jié)果:

Inputn:6↙

123421195↙

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

例5.2

從鍵盤連續(xù)輸入字符,直到輸入“回車”符為止,統(tǒng)計輸入的字符個數(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);

}運行結(jié)果:

Typeinasentence,thenpress<Enter>

thisisasentence.↙

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

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

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

do語句

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

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

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

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

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

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

do

{

sum+=i;

i--;

}

while(i>0);

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

例5.3

利用do-while語句重做例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);

}運行結(jié)果:

Inputn:6↙

1237112334↙

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

for循環(huán)語句

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

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

語句

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

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

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

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

(3)求解表達式3。

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

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

for語句的功能可用while語句描述如下:表達式1;

while(表達式2)

{

語句;表達式3;

}

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

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

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

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

(3)for語句中的表達式1和表達式3,既可以是一個簡單表達式,也可以由逗號運算符將多個表達式連接起來,如下例,此時表達式1和表達式3都是逗號表達式。

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

sum=sum+i;

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

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

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

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

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

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

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

例5.4

利用for語句重做例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);

}運行結(jié)果:

Inputn:6↙

711205219↙

sumis:64

例5.5

計算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);

}運行結(jié)果:

sum=1965.4循環(huán)的嵌套當(dāng)一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu)時,稱為循環(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)的嵌套常用于解決矩陣運算、報表打印等問題。圖5.7循環(huán)嵌套

(1)while()

{

while()

{

}

}

(2)for(;;)

{

do

{

}

while();

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

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

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

(3)要注意優(yōu)化程序,盡量節(jié)省程序的運行時間,提高程序的運行速度。循環(huán)嵌套寫得不好,會增加很多次循環(huán),造成不必要的時間浪費。具體示例參見例5.10及《〈C程序設(shè)計〉學(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);

}運行結(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語句和continue語句5.5.1break語句

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

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

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

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

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

for(…)

{

for(…)

{

break;

}

…/*注1*/

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

例5.7

計算r=1到r=10時的圓面積,直到面積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);

}

}運行結(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時,執(zhí)行break語句,提前終止執(zhí)行循環(huán),即不再繼續(xù)執(zhí)行其余的幾次循環(huán)。5.5.2continue語句

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

continue語句的一般形式如下:

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

例5.8

把100到150之間的不能被3整除的數(shù)輸出,要求一行輸出10個數(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");

}

}運行結(jié)果:

100101103104106107109110112113

115116118119121122124125127128

130131133134136137139140142143

145146148149

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

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

goto標(biāo)號;

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

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

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

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

(2)退出多重循環(huán)。前面指出,使用break語句和continue語句可以跳出本層循環(huán)和結(jié)束本層循環(huán),當(dāng)程序流程需要從多重嵌套的內(nèi)層循環(huán)體中退出多層循環(huán)時,使用goto語句效率更高。例5.9用goto語句和if語句構(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);

} 運行結(jié)果:

sum=5050

5.7程序設(shè)計舉例

例5.10

用公式求出π的近似值,直到最后一項的絕對值小于10-6為止。

分析:這是一個典型的累加求和問題,但這里的循環(huán)次數(shù)并不能預(yù)先確定,而且各個累加項是以正、負交替的規(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)前累加項t的絕對值是否大于1e-6*/

{

pi=pi+t;

n=n+2;

s=-s;/*處理符號*/

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

}

pi=pi*4;

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

}運行結(jié)果:

pi=3.141594

說明:此程序中增加了一個頭文件math.h,這是因為在使用fabs()函數(shù)(求絕對值)時需要包含這一頭文件。

例5.11

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

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

}

if(flag)

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

else

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

}運行結(jié)果:

Inputanumber:35↙

35isnotaprimenumber.說明:

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

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

例5.12

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

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

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

#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);

}運行結(jié)果:

Enterthefirstapprochx:1.5↙

Therootofequationis:2.0000000

例5.13

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

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

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

(2)將每次變換的一位十進制數(shù),從高位開始,按位加權(quá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′;/*計算當(dāng)前data值*/

}

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

}運行結(jié)果:

Inputchar:1463↙

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

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

#include<stdio.h>

voidmain()

{

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論