c5第五章循環(huán)結(jié)構(gòu)程序設(shè)計_第1頁
c5第五章循環(huán)結(jié)構(gòu)程序設(shè)計_第2頁
c5第五章循環(huán)結(jié)構(gòu)程序設(shè)計_第3頁
c5第五章循環(huán)結(jié)構(gòu)程序設(shè)計_第4頁
c5第五章循環(huán)結(jié)構(gòu)程序設(shè)計_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第五章循環(huán)結(jié)構(gòu)程序設(shè)計C

語言程序設(shè)計

Lecture51附件:warningC4013:'getch'undefined;

assumingexternreturningint

警告信息的解決使用getch()函數(shù)需要添加頭文件conio.h:

#include<conio.h>conio是ConsoleInput/Output(控制臺輸入輸出)的簡寫,其中定義了通過控制臺進行數(shù)據(jù)輸入和數(shù)據(jù)輸出的函數(shù),主要是一些用戶通過按鍵盤產(chǎn)生的對應(yīng)操作,比如getch()、putch()函數(shù)等等。2附件:warningC4013:‘system’undefined;assumingexternreturningint

警告信息的解決使用system("cls")函數(shù)需要添加頭文件stdlib.h:#include<stdlib.h>頭文件stdlib.h里包含了C語言的一些常用的函數(shù),如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。具體內(nèi)容在VC++的include目錄里面的stdlib.h頭文件中。

3循環(huán)結(jié)構(gòu)

LoopIterationRepetition

循環(huán):就是在給定的條件成立時反復(fù)執(zhí)行某一程序段,被反復(fù)執(zhí)行的程序段稱為循環(huán)體。在C語言中可以用以下語句來實現(xiàn)循環(huán):1、用while語句;(“當(dāng)”循環(huán))2、用do--while語句;(“直到”循環(huán))3、用for語句;(計數(shù)循環(huán))45.1while語句

1、while語句常稱為“當(dāng)型”循環(huán)語句。

循環(huán)體!00表達式5

2、while語句的形式:

while(表達式)

循環(huán)體;特點:先判斷表達式,后執(zhí)行語句。說明:循環(huán)體有可能一次也不執(zhí)行循環(huán)體可為任意類型語句下列情況,退出while循環(huán)條件表達式不成立(為零)循環(huán)體內(nèi)遇break,return,goto無限循環(huán):

while(1)

循環(huán)體;6#include<stdio.h>#include<conio.h>main(){

inti=0,sum=0;

while(i<100){ i++; sum+=i; }

printf("%d",sum);

getch();}例(ch5_01.c)求1+2+3+4+5+···+100。循環(huán)初值循環(huán)終值

循環(huán)條件循環(huán)體循環(huán)變量增值7例(ch5_02.c)顯示1~10的平方#include<stdio.h>#include<conio.h>main(){

inti=1;

while(i<=10){

printf("%d*%d=%d\n",i,i,i*i); i++;}

getch();}運行結(jié)果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=10085.2do--while語句1、do--while語句常稱為“直到型”循環(huán)語句。

循環(huán)體!00表達式92、do--while的形式:

do

循環(huán)體;

while(表達式);特點:先執(zhí)行,后判斷。說明:至少執(zhí)行一次循環(huán)體do~while可轉(zhuǎn)化成while結(jié)構(gòu)例:用do~while求1+2+3+4+5+···+100#include<stdio.h>#include<conio.h>main(){

inti=0,sum=0;

do{ i++; sum+=i; }while(i<100);

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

getch();}10

1.循環(huán)體如果包含一個以上的語句,應(yīng)該用花括號括起來,以復(fù)合語句形式出現(xiàn)。

2.循環(huán)體中應(yīng)有使循環(huán)趨于結(jié)束的語句。例:分析下列二個程序段

使用循環(huán)結(jié)構(gòu)要注意:inti=1;while(i<=10){

putchar('*');i++;}Inti=1;while(i<=10);

putchar(‘*’);

i++;11

當(dāng)循環(huán)結(jié)構(gòu):main(){

inti,sum=0;

i=1; while(i<=100){ sum+=i;

i++;

}

printf(“%d\n”,sum);

getch();}

直到循環(huán)結(jié)構(gòu):main(){

inti,sum=0; i=1; do{

sum+=i; i++;

}while(i<=100);

printf(“%d\n”,sum);

getch();}12文字菜單演示程序#include<stdio.h>#include

<conio.h>main(){

charx;

do{

system("cls");

printf("_______________________________________________\n");

printf("||\n");

printf("|E--Exit|\n");

printf("||\n");

printf("|I--Insert|\n");

printf("||\n");

printf("|D--Display|\n");

printf("||\n");

printf("||\n");

printf("|CopyRight2008Mr./Miss.***|\n");

printf("|_______________________________________________|\n");

printf("ChooseEorIorD:"); x=getchar();}while(x!='E'&&x!='I'&&x!='D');

printf("Thatwas%c.\n\n",x);

getch();}13數(shù)字菜單演示程序#include<conio.h>#include<stdio.h>main(){

int

x,y;do{

system("cls");

printf("___________________________________________\n");

printf("| |\n");

printf("|E--Exit |\n");

printf("| |\n");

printf("|I--Insert |\n");

printf("||\n");

printf("|D--Display|\n");

printf("||\n");

printf("||\n");

printf("|CopyRight2008Mr./Miss.***|\n");

printf("|___________________________________________|\n");

printf("Choose0or1or2:"); y=scanf("%d",&x);

if(y!=1)

scanf("%c",&x);}while(x!=0&&x!=1&&x!=2);

printf("Thatwas%d.\n\n",x);

getch();}14輸出結(jié)果是什么?S=5050#include<conio.h>#include<stdio.h>main(){

ints=0,i=1;

while(i<=100) s+=i++;

printf("S=%d\n",s);

getch();}

15輸出結(jié)果是什么?#include<conio.h>#include<stdio.h>main(){

ints=0,i=1;

while(i++<100) s+=i;

printf("S=%d\n",s);

getch();}S=504916逗號運算符和逗號表達式

逗號運算符是雙目運算符,其運算對象是表達式。

1.逗號運算符

對象數(shù)名稱運算符運算規(guī)則運算對象結(jié)合性雙目逗號

,依次計算前、后表達式表達式自左向右注意:由逗號運算符組成的式子是一個表達式,表達式的逗號值為最后分式的值。

2.逗號運算符的優(yōu)先級任何運算符優(yōu)先于逗號運算符17解答:20解釋:逗號表達式求解過程自左至右,依次計算各表達式的值,“表達式n”的值即為整個逗號表達式的值。先求解a=3*5,得a=15;再求a*4=60;最后求解a+5=20,所以逗號表達式的值=20。

例1:

逗號表達式(a=3*5,a*4),a+5

的值main(){

int

i,t;i=(t=1,t=3,t=99,printf("t=%d\n",t));

printf("i=%d,t=%d\n",i,t);

getch();}例2:逗號表達式t=1,t=3,t=99,printf("t=%d\n",t)的值i=5,t=99185.3for語句1、C語言中最靈活、最復(fù)雜的循環(huán)語句;表達式1表達式2循環(huán)體語句表達式3可以用于循環(huán)次數(shù)確定的情況;可以用于循環(huán)次數(shù)不確定的情況;可實現(xiàn)while和do--while語句所有功能。非00192、for循環(huán)結(jié)構(gòu)的形式:

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

循環(huán)體

其中:表達式1用于為循環(huán)變量賦初值,表達式2給出循環(huán)結(jié)束條件,表達式3是循環(huán)變量的增值語句。執(zhí)行for語句時,先執(zhí)行表達式1,然后判斷表達式2是否成立,若成立,執(zhí)行循環(huán)體內(nèi)的語句,接下來執(zhí)行表達式3,再判斷表達式2是否成立,若成立,執(zhí)行循環(huán)體內(nèi)的語句,……直至表達式2不成立,跳出循環(huán)。循環(huán)變量賦初值循環(huán)終止條件循環(huán)變量控制20sum=0;

for(i=1;i<=100;i++) sum+=i;

它相當(dāng)于以下語句:

sum=0;

i=1;

while(i<=100){

sum+=i;

i++;

}表達式1;While(表達式2){

語句;表達式3;}213、for語句中表達式的省略(1)for語句一般形式中的“表達式1”可以省略; 如: sum=0;i=1; for(;i<=100;i++)sum+=i;(2)表達式2省略,即不判斷循環(huán)條件,循環(huán)無終止地進行下去; 如: for(sum=0,i=1;;i++){

sum+=i; }if(i>100)break;22(3)表達式3也可以省略,但此時保證循環(huán)能正常

結(jié)束。 如:for(sum=0,i=1;i<=100;){sum+=i;i++;

}(4)可以省略表達式1和表達式3,只有表達式2。 如:i=1;sum=0; i=1;sum=0; for(;i<=100;){ while(i<=100){sum+=i; sum+=i;i++;i++;

}}23(5)三個表達式都可省略,

如: for(;;)循環(huán)體;

相當(dāng)于

while(1)循環(huán)體;

即不設(shè)初值,不判斷條件,循環(huán)變量不增值。無終止地執(zhí)行循環(huán)體。 如: sum=0,i=1; for(;;){ if(i>100)break;sum+=i;i++;

}24(6)循環(huán)體為空語句對for語句,循環(huán)體為空語句的一般形式為:

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

如:for(sum=0,i=1;i<=100;sum+=i,i++); 又如:要在顯示器上復(fù)制輸入的字符,輸入的字符為‘.’時,結(jié)束循環(huán)。

while(putchar(getchar())!=’.’); 輸入abcdefg.輸出abcdefg.25例4:#include<stdio.h>main(){inti=0;

for(;i<10;)

putchar(‘a(chǎn)’+(i++));}例3:#include<stdio.h>main(){inti=0;for(;i<10;putchar(‘a(chǎn)’+i),i++);

}例2:#include<stdio.h>main(){inti=0;

for(;i<10;i++)

putchar(‘a(chǎn)’+i);}例1:#include<stdio.h>main(){inti;for(i=0;i<10;i++)

putchar(‘a(chǎn)’+i);}以下4個例子的運行結(jié)果都是abcdefghij26例:寫出程序的運行結(jié)果main(){inti;

clrscr();for(i=1;i<=5;i++)switch(i%5){case0:printf("/");break;case3:printf("*");break;case1:printf("+");break;case2:printf("-");

default:printf("\n");}}因為:1%5=1case1+2%5=2case2-

default3%5=3case3*4%5=4default

5%5=0case0/

運行結(jié)果是:+-

/27[例(分類統(tǒng)計)]

輸入10個整數(shù),計算其中有多少個奇數(shù),多少個偶數(shù)和多少個零?思路:以下這一連串動作反復(fù)做10次(循環(huán)體)▲輸入一個數(shù)字n▲判斷n是否為0 (n1++)▲否則,判斷n%2是否為1(n2++)▲否則,n%2必定為0 (n3++)相應(yīng)的程序代碼為for(i=1;i<=10;i++){scanf("%d",&n);if(n==0)n1++;elseif(n%2)n2++;elsen3++;}28main(){

inti,n,n1=0,n2=0,n3=0;

for(i=1;i<=10;i++){ printf("第%d個數(shù)字=",i); scanf("%d",&n);

if(n==0) n1++;

else

if(n%2) n2++;

else n3++; }

printf("\n其中有%d個偶數(shù)、%d個奇數(shù)、%d個零",n3,n2,n1); getch();}29main(){

int

i,t,n,n1=0,n2=0,n3=0;

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

printf("The%dnum=",i);scanf("%d",&n); t=1*(n==0)+2*(n%2==1)+3*(n%2==0&&n!=0);

switch(t){

case1: n1++;break;

case2: n2++;break;

case3: n3++; }}

printf("\n其中有%d個偶數(shù)、%d個奇數(shù)、%d個零",n3,n2,n1);

getch();}30[例]輸入一個整數(shù),計算它的位數(shù).并反向輸出.分析:設(shè)一個數(shù)13579,一位一位地切下末位循環(huán)結(jié)束條件:num==0;同時計數(shù)count=count+1;1351357135797bitbit95bit13bit1bitbit=num%10num=num/10135791357135count=0;輸入numnum!=0輸出num%10count++num=num/10輸出count31331main(){

longintnum;

int

x,count=0;

printf("Pleaseenteraninteger:\n");

scanf("%ld",&num);

do{ x=num%10; num=num/10; count++;

printf("%d",x);}while(num!=0);

printf(",%ddigits.",count);

getch();}

Pleaseenteraninteger:382992834digits.32Fibonacci數(shù)列1201年,意大利數(shù)學(xué)家Fibonacci發(fā)現(xiàn)了以他自己的名字命名的Fibonacci數(shù)列。他是在研究兔子的生長、繁殖規(guī)律中發(fā)現(xiàn)這一數(shù)列的。他對數(shù)列的研究是從一對剛剛出生的小兔子開始計算在n個月后將會有多少只兔子,他做了如下的假設(shè): 1、新出生的小兔子在一個月的時間里發(fā)育為成年兔子; 2、每對成年兔子每月繁殖一對小兔子; 3、兔子沒有死亡發(fā)生。用Fn代表n個月后兔子的對數(shù)。因為從一對新生的兔子開始,所以,F(xiàn)0=1,F(xiàn)1=1。這一對兔子在第二個月末生出另一對小兔子,從而F2=1+1=2。在第三個月末,第一對兔子將生下又一對小兔子,所以F3=2+1=3。用如下的表格表示前5個月每個月末兔子的數(shù)量: 月數(shù) 成年兔子的對數(shù) 新生兔子的對數(shù) 總數(shù)(對) 0 0 1 1 1 1 0 1 2 1 1 2 3 2 1 3 4 3 2 5 5 5 3 8

問題例(ch5_04.c)

:求fibonacci數(shù)列0,1,1,2,3,5,8,…的前20項。33分析:由于Fibonacci數(shù)列滿足下面關(guān)系:F1=1 (n=1)F2=1 (n=2)Fn=Fn-1+Fn-2 (n≥3)

a=1,b=1fori=1to10輸出a,ba=a+bb=b+a

11235813‥a+bab+ab

a+bab+

ab‥‥34求fibonacci數(shù)列前20項的程序:

main(){

int

i,a=1,b=1,k=0;

for(i=1;i<=10;i++){printf("%10d%10d",a,b); a=a+b;b=a+b; k+=2; if(k%4==0)printf("\n"); } }112358132134558914423337761098735/Golden/index.htm(黃金分割主頁)黃金分割率(GoldenSection)是一種數(shù)學(xué)比例關(guān)系,來源于Fibonacci級數(shù)中前后兩個數(shù)的比值。由公元前六世紀(jì)古希臘數(shù)學(xué)家畢達哥拉斯發(fā)現(xiàn),以嚴(yán)格的比例性、藝術(shù)性、和諧性,蘊藏著豐富的美學(xué)價值。應(yīng)用時一般取0.618,用希臘字母φ表示這個值。

#include<math.h> main(){

inta=1,b=1,i=0; doublex,y=0;

clrscr(); do{ i++; x=y; a=a+b; b=a+b; y=(float)a/b;

printf("%d----%16.14lf\n",i,y);}while(fabs(y-x)>1e-8); }GoldenSection36[例]求分?jǐn)?shù)數(shù)列 前20項之和。分析:▲對于該數(shù)列,可知:Xn+1=1+1/Xn得到遞推公式X=1+1/X即,從X0=2就可以得到X1=1+1/X0=1.666667▲只要循環(huán)執(zhí)行X=1+1/X就可以依次得到數(shù)列各項的絕對值?!倮脴?biāo)識符號f=1,f=-f的算法得到

數(shù)列各項的值f*x,則,s+=f*x就是數(shù)列的和。解法:main(){int

i,f=1;floatx=2,s=0;

for(i=1;i<=20;i++){ s+=f*x; x=1+1/x; f=-f;}

printf("sum=%10.6f",s);}運算結(jié)果是:sum=0.577922375.5continue語句break語句一般形式:break;功能:跳出所在的多分支switch語句跳出所在的while、do-while、for循環(huán)語句(提前結(jié)束循環(huán))。continue語句一般形式:continue;功能:提前結(jié)束本次(本輪)循環(huán)體的執(zhí)行,接著進行下一次循環(huán)條件的判別。38break語句main(){inti;for(i=1;i<=5;i++){printf("\n%5d",i);printf("%5d",i);}}main(){inti;for(i=1;i<=5;i++){printf("\n%5d",i);if(i==3)break;

printf("\n%d",i);}}

1122334455

11223當(dāng)i=3時,結(jié)束循環(huán)39continue語句main(){inti;for(i=1;i<=5;i++){printf("\n%5d",i);printf("%5d",i);}}main(){inti;for(i=1;i<=5;i++){ printf("\n%5d",i);

if(i==3) continue;

printf("\n%d",i);}}

1122334455

112234455當(dāng)i=3時,結(jié)束本次循環(huán)體的執(zhí)行40for(e1;e2;e3){…if(e)continue;…}break與continue的區(qū)別for(e1;e2;e3){…if(e)break;…}計算e1e2語句…非00e非0語句…計算e30break語句0計算e1e2語句…非00e非0語句…計算e3continue語句循環(huán)體41[例](ch5_05.c)輸出1~10中不是3的倍數(shù)的數(shù)。

main(){ intn; for(n=1;n<=10;n++) {if(n%3==0)break;

printf(“%d,”,n);} }輸出:1,2,continue;輸出:1,2,4,5,7,8,10,

不輸出3的倍數(shù)的數(shù)字42(1)while(){……while(){……}…...}(2)do{……do{……}while();…...}while();(3)while(){……do{……}while();…….}5.6

循環(huán)的嵌套三種循環(huán)可互相嵌套,層數(shù)不限外層循環(huán)可包含兩個以上內(nèi)循環(huán)嵌套循環(huán)的執(zhí)行流程嵌套循環(huán)的跳轉(zhuǎn)

禁止:從外層跳入內(nèi)層跳入同層的另一循環(huán)(4)for(;;){……do{……}while();……while(){……}…...}內(nèi)循環(huán)外循環(huán)內(nèi)循環(huán)43

i:1~9

1 j:1~i 2 4 動作:顯示j*i 3 69

……… ……....9 18 27 36 45 54 63 72 81ij例循環(huán)嵌套,輸出九九表。44i<=9輸出j*i假(0)真(1)i=1j++j=1j<=i真(1)假(0)換行動作

i++main(){

int

i,j;

for(i=1;i<=9;i++){

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

printf("%2d*%-2d",j,i);

printf("\n");}

getch();}外循環(huán)內(nèi)循環(huán)45(1)當(dāng)外層循環(huán)結(jié)構(gòu)每執(zhí)行一次循環(huán)時,內(nèi)層循環(huán)結(jié)構(gòu)在一般情況下要從循環(huán)的開始到循環(huán)的正常結(jié)束從頭到尾執(zhí)行一遍。

例1(2)在內(nèi)層循環(huán)結(jié)構(gòu)中使用break語句可以提前結(jié)束本次內(nèi)層循環(huán)結(jié)構(gòu)的執(zhí)行,而不影響外層循環(huán)結(jié)構(gòu)的繼續(xù)執(zhí)行。 例2(3)對于并列的循環(huán)結(jié)構(gòu),控制循環(huán)執(zhí)行的變量名字可以相同。在嵌套循環(huán)結(jié)構(gòu)中,內(nèi)、外層控制循環(huán)執(zhí)行的變量名字不能相同。

例3

對于嵌套循環(huán)結(jié)構(gòu)的幾點說明:46

123412341234

123123123

例1:main(){

int

i,j;

for(i=0;i<3;i++){

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

printf("%d",j);

printf("\n");}}

運行后輸出:例2:main(){

int

i,j;

for(i=0;i<3;i++){for(j=1;j<=4;j++){printf("%d",j);if(!(j%3))break;}

printf("\n");}}運行后輸出:47例3:

main(){

inti,j;for(i=0;i<3;i++)

printf("%d",i);

printf("\n");

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

printf("%d",i);

}運行后輸出:012123448for(i=1;i<=5;i++){for(j=1;j<=i;j++)

printf("");

printf("\n“);

}*for(i=1;i<=5;i++){for(j=1;j<=5-i+1;j++)

printf("");

printf("\n“);

}*for(i=1;i<=5;i++){for(j=1;j<5-i+1;j++)

printf("");}for(j=1;j<=i;j++){

printf("");

printf("\n");}*for(i=1;i<=5;i++){for(j=1;j<i;j++)

printf("");}for(j=1;j<=5-i+1;j++){

printf("");

printf("\n“);}**************************************************************************************143for(i=1;i<=5;i++){for(j=1;j<=5;j++)

printf("");

printf("\n“);

}*249分析:

行的控制i:1~9‘*’的個數(shù)j與當(dāng)前行的關(guān)系:

j=2*i-1‘*’前面的空格k與行的關(guān)系:

開始時,第一行有8個空格每多一行,少一個空格k=9-iwhile(i<=9){ for(k=1;k<=9-i;k++)

輸出空格; for(j=1;j<=2*i-1;j++)

輸出*;}*********************************************************************************50main(){

inti,j,k;i=1;while(i<=9){for(k=1;k<=9-i;k++)

printf(“”);for(j=1;j<=2*i-1;j++)

printf(“*”);

printf(“\n”);i++;}}

i=1

i<=9k=1k<=9-i輸出空格k=k+1j=1j<=2*i-1輸出*j=j+1換行,i=i+151[綜合例題]輸入若干個整數(shù)(0表示結(jié)束),

求它們的總和、均值、最大值和最小值。main(){int

x,max,min,total=0,i=0;floatave=0.0;

printf("Inputaninteger,0toexit:\n");while(1){

scanf("%d",&x);

if(x==0){

ave=(float)total/i;

printf("Total=%d,Average=%f,Max=%d,Min=%d",total,ave,max,min);break; }

if(i==0)max=min=x;i++;total+=x;

if(x>max)max=x;

if(x<min)min=x;}}525.7

循環(huán)程序設(shè)計的問題

1、寫循環(huán),先要發(fā)現(xiàn)循環(huán)。注意計算中的重復(fù)性動

作,引進循環(huán)可能統(tǒng)一描述和處理。

重復(fù)動作的常見例子:

累積一批可按規(guī)律算出的數(shù)據(jù)(如累加等);反復(fù)從一個結(jié)果算出下一結(jié)果(遞推等);對一批數(shù)據(jù)做同樣的加工處理;等。2、寫循環(huán)結(jié)構(gòu)時要考慮和解決的問題:循環(huán)涉及哪些變量,引進什么臨時性變量?這些變量在循環(huán)正式開始前應(yīng)給什么初值?循環(huán)如何開始?每次循環(huán)中變量的值應(yīng)如何改變?什么情況下繼續(xù)循環(huán),什么情況下終止循環(huán)?循環(huán)終止后如何得到所需結(jié)果?53循環(huán)中的幾種變量

循環(huán)中常出現(xiàn)幾類變量,了解這些有助于思考和分析。這也是寫循環(huán)程序的經(jīng)驗總結(jié)。

1)循環(huán)控制變量(循環(huán)變量):循環(huán)前設(shè)初值,循環(huán)遞增/遞減,達到/超過界限時循環(huán)結(jié)束??刂蒲h(huán)的進行/結(jié)束。for中常有這類變量。

for(n=0;n<10;n++)...... for(n=2;n<52;n+=4)......2)累積變量:循環(huán)中常用+=或*=等更新。初值常用運算的單位元(加用0;乘用1為初值)。循環(huán)結(jié)束時變量終值被作為循環(huán)計算結(jié)果。3)遞推變量:前兩類變量的推廣形式。復(fù)雜循環(huán)常用幾個協(xié)同的變量,每次由一個/幾個變量推出一個新值,其余依次更新。 對變量x1、x2、x3,循環(huán)體可能有序列: x1=x0...; x2=x1...; x3=...x1...x2...;54本章重點三種循環(huán)語句while,do---while和for求累加和累乘的典型算法建立循環(huán)通常有以下情況: 1.給定次數(shù),for比較適用for(i=1;i<100;i++) 2.給定條件,while比較適用while((x+y)<z) 3.字符的情況通常以回車做結(jié)束符

while((c=getchar())!=‘\n’) 4.小經(jīng)驗:對于charnum,將字符變成數(shù)字i=num-’0’; 5.判斷字符范圍(c>‘a(chǎn)’&&c<‘z’)||(c>‘A’&&c<‘Z’)555.8程序舉例[例]用/41-1/3+1/5-1/7+…的公式求的近似值,直到最后一項的絕對值小于10—6為止t=1,pi=0,n=1,f=1當(dāng)|t|10-6pi=pi+tn=n+2f=-f;t=f/npi=pi*4輸出pi#include<math.h>main(){

intf;floatn,t,pi;t=1;pi=0;n=1.0;f=1;

while(fabs(t)>=1.0e-6){pi=pi+t;n=n+2;f=-f;t=f/n;}pi=pi*4;

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

getch();}56[例]梯形法求數(shù)值積分。0yxaa+ha+iha+(i+1)hbf(x)f(x)=(4-x2)dxba

∫57main(){

floata,b,h,n1,n2,s=0;

inti;

printf("請輸入積分下限a:");

scanf("%f",&a);

printf("請輸入積分上限b:");

scanf("%f",&b); h=(b-a)/1000;

for(i=0;i<1000;i++){ n1=4-(a+i*h)*(a+i*h); n2=4-(a+(i+1)*h)*(a+(i+1)*h); s+=(n1+n2)*h/2;}

printf("s=%10.2f\n",s);

getch();}58牛頓迭代法(牛頓切線法)求解相應(yīng)的遞推公式(迭代函數(shù))為

牛頓迭代法有很明顯的幾何意義:59[例]

給定α,用牛頓迭代法求x=取為解方程x2-α=0在[0,+∞)上的實根由牛頓迭代公式則得到60取變量x=0,x1=1為初值,f,f1為f(x)和f’(x)a為輸入#include<math.h>main(){

float

a,x=0,x1=1,f,f1;

printf("\nInputa=");

scanf("%f",&a);

while(fabs(x1-x)>1e-5){ x=x1; x1=0.5*(x+a/x); } printf("sqrt(%.2f)=%f\n",a,x1);

printf("f(%f)=%.10f\n",x1,x*x-a);

getch();}`61*************

本例還是要考慮每行的空格數(shù)、和星號數(shù)問題,但要關(guān)注空格數(shù)與星號數(shù)在增加到一定的時候又要減少的規(guī)律。[例]用循環(huán)語句顯示下面的圖案。62for(i=0;i<4;i++){for(j=0;j<20-i;j++)printf(“”);/*空格遞減*/for(k=0;k<2*i+1;k++)printf(“*”);/*星號遞增*/}

#include<math.h>main(){inti,j,k;for(i=-2;i<=2;i++){ for(j=1;j<=18+fabs(i);j++)

printf("");

for(k=1;k<=5-2*fabs(i);k++)

printf("*");

printf("\n");}}fabs(i)變化規(guī)律是:2,1,0,1,2。

每行的空格數(shù)是:20,19,18,19,20。每行的星號數(shù)是:1,2,3,2,1。注意初終值從-2到2的目的。63隨機數(shù)rand()和種子srand()隨機函數(shù)rand()產(chǎn)生[0,32767)區(qū)間的一個整數(shù)。

必須使用#include<stdlib.h>隨機種子函數(shù)srand(time(0))產(chǎn)生一個以當(dāng)前累計秒為參數(shù)的隨機序列起始值(”種子”,seed)。系統(tǒng)常變量RAND_MAX

為32767,

是rand()的上限值。公式rand()/(float)RAND_MAX

產(chǎn)生區(qū)間[0,1)的隨機小數(shù)。公式rand()/(float)RAND_MAX*(m-n+1)+m

產(chǎn)生閉區(qū)間[m,n]的隨機整數(shù)。64/*公式rand()/(float)RAND_MAX*(m-n+1)+m產(chǎn)生閉區(qū)間[m,n]的隨機整數(shù)。*/#include<stdlib.h>main(){

int

i,x,n; srand(time(0));

printf("n=");

scanf("%d",&n);

for(i=0;i<n;i++){ x=rand()/(float)RAND_MAX*3+6;//產(chǎn)生[6,8]隨機數(shù)

printf("%d",x); }

getch();}65例:MonteCarlo法從定義求π值已知總投擲次數(shù)J,其中落入贏區(qū)(1/4單位圓)內(nèi)K次。

由于點(x,y)的隨機均勻分布性,可以認(rèn)為:

落在?圓內(nèi)點數(shù)K與(落在正方形內(nèi)的)總點數(shù)J之比

應(yīng)等于它們的面積比。

而根據(jù)π的定義,?單位圓面積是1/π。所以有:

點(x,y)落在?圓內(nèi)的條件是:

隨機數(shù)發(fā)生器函數(shù):rand()

功能:產(chǎn)生[0,32767)區(qū)間的一個隨機整數(shù)。66#include<stdlib.h>main(){

int

j,i=1,k=1;

float

x,y; srand(time(0));

printf("InputJ=");

scanf("%d",&j);

while(i<=j){ /*產(chǎn)生一對[0,1)的隨機數(shù)(x,y)*/ x=rand()/32767.0; y=rand()/32767.0;if(x*x+y*y<1.0)k++;i++; }printf("PI=4.0*%d/%d=%f\n",k,j,4.0*k/j);

getch();}67分析:這是一個不定方程: 雞翁:可能有1只、2只、…、20只,設(shè)為x 雞母:可能有1只、2只、…、33只,設(shè)為y 雞雛:可能有3只、6只、…、300只,設(shè)為z只要將上述的數(shù)集按條件x+y+z==100和5x+3y+z/3==100同時成立進行三重遍歷,就可以求出所有的解。枚舉法或稱為窮舉法、遍歷法。一般用于不定方程求非負整數(shù)解的問題。它將方程中未知數(shù)可以取的到的非負整數(shù)逐個進行驗證找出所有滿足方程的解。百錢百雞問題雞翁壹,錢值伍;雞母壹,錢值叁;雞雛叁,錢值壹。何以百錢買百雞?68百錢百雞問題程序如下:main(){

int

x,y,z;for(x=1;x<=20;x++)for(y=1;y<=33;y++)for(z=3;z<=300;z+=3)

if(x+y+z==100&&x*5+y*3+z/3==100)

printf("\nx=%d,y=%d,z=%d",x,y,z);

getch();}百錢百雞問題結(jié)果為:

x=4,y=18,z=78

x=8,y=11,z=81

x=12,y=4,z=8469百錢百雞問題的優(yōu)化解法:由于x+y+z=100,即z=100-x-y。那么對于: 雞翁:可能有1只、2只、…、20只,設(shè)為x 雞母:可能有1只、2只、…、33只,設(shè)為y則只要將上述的數(shù)集按條件

(100-x-y)%3==0

5x+3y+(100-x-y)/3==100進行二重遍歷,就可以求出所有4組解.70修改的程序如下:#include<stdio.h>main(){intx,y,z;system("cls");for(x=1;x<=20;x++)for(y=1;y<=33;y++) if((100-x-y)%3==0&&x*5+y*3+(100-x-y)

溫馨提示

  • 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

提交評論