c5第五章循環結構程序設計_第1頁
c5第五章循環結構程序設計_第2頁
c5第五章循環結構程序設計_第3頁
c5第五章循環結構程序設計_第4頁
c5第五章循環結構程序設計_第5頁
已閱讀5頁,還剩76頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第五章循環結構程序設計C

語言程序設計

Lecture51附件:warningC4013:'getch'undefined;

assumingexternreturningint

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

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

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

3循環結構

LoopIterationRepetition

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

1、while語句常稱為“當型”循環語句。

循環體!00表達式5

2、while語句的形式:

while(表達式)

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

while(1)

循環體;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。循環初值循環終值

循環條件循環體循環變量增值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();}運行結果: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語句常稱為“直到型”循環語句。

循環體!00表達式92、do--while的形式:

do

循環體;

while(表達式);特點:先執行,后判斷。說明:至少執行一次循環體do~while可轉化成while結構例:用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.循環體如果包含一個以上的語句,應該用花括號括起來,以復合語句形式出現。

2.循環體中應有使循環趨于結束的語句。例:分析下列二個程序段

使用循環結構要注意:inti=1;while(i<=10){

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

putchar(‘*’);

i++;11

當循環結構:main(){

inti,sum=0;

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

i++;

}

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

getch();}

直到循環結構: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數字菜單演示程序#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輸出結果是什么?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輸出結果是什么?#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.逗號運算符

對象數名稱運算符運算規則運算對象結合性雙目逗號

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

2.逗號運算符的優先級任何運算符優先于逗號運算符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語言中最靈活、最復雜的循環語句;表達式1表達式2循環體語句表達式3可以用于循環次數確定的情況;可以用于循環次數不確定的情況;可實現while和do--while語句所有功能。非00192、for循環結構的形式:

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

循環體

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

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

它相當于以下語句:

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省略,即不判斷循環條件,循環無終止地進行下去; 如: for(sum=0,i=1;;i++){

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

結束。 如: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(;;)循環體;

相當于

while(1)循環體;

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

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

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

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

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

for(;i<10;)

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

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

for(;i<10;i++)

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

putchar(‘a’+i);}以下4個例子的運行結果都是abcdefghij26例:寫出程序的運行結果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/

運行結果是:+-

/27[例(分類統計)]

輸入10個整數,計算其中有多少個奇數,多少個偶數和多少個零?思路:以下這一連串動作反復做10次(循環體)▲輸入一個數字n▲判斷n是否為0 (n1++)▲否則,判斷n%2是否為1(n2++)▲否則,n%2必定為0 (n3++)相應的程序代碼為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個數字=",i); scanf("%d",&n);

if(n==0) n1++;

else

if(n%2) n2++;

else n3++; }

printf("\n其中有%d個偶數、%d個奇數、%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個偶數、%d個奇數、%d個零",n3,n2,n1);

getch();}30[例]輸入一個整數,計算它的位數.并反向輸出.分析:設一個數13579,一位一位地切下末位循環結束條件:num==0;同時計數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數列1201年,意大利數學家Fibonacci發現了以他自己的名字命名的Fibonacci數列。他是在研究兔子的生長、繁殖規律中發現這一數列的。他對數列的研究是從一對剛剛出生的小兔子開始計算在n個月后將會有多少只兔子,他做了如下的假設: 1、新出生的小兔子在一個月的時間里發育為成年兔子; 2、每對成年兔子每月繁殖一對小兔子; 3、兔子沒有死亡發生。用Fn代表n個月后兔子的對數。因為從一對新生的兔子開始,所以,F0=1,F1=1。這一對兔子在第二個月末生出另一對小兔子,從而F2=1+1=2。在第三個月末,第一對兔子將生下又一對小兔子,所以F3=2+1=3。用如下的表格表示前5個月每個月末兔子的數量: 月數 成年兔子的對數 新生兔子的對數 總數(對) 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數列0,1,1,2,3,5,8,…的前20項。33分析:由于Fibonacci數列滿足下面關系: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數列前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)是一種數學比例關系,來源于Fibonacci級數中前后兩個數的比值。由公元前六世紀古希臘數學家畢達哥拉斯發現,以嚴格的比例性、藝術性、和諧性,蘊藏著豐富的美學價值。應用時一般取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[例]求分數數列 前20項之和。分析:▲對于該數列,可知:Xn+1=1+1/Xn得到遞推公式X=1+1/X即,從X0=2就可以得到X1=1+1/X0=1.666667▲只要循環執行X=1+1/X就可以依次得到數列各項的絕對值。▲再利用標識符號f=1,f=-f的算法得到

數列各項的值f*x,則,s+=f*x就是數列的和。解法: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);}運算結果是:sum=0.577922375.5continue語句break語句一般形式:break;功能:跳出所在的多分支switch語句跳出所在的while、do-while、for循環語句(提前結束循環)。continue語句一般形式:continue;功能:提前結束本次(本輪)循環體的執行,接著進行下一次循環條件的判別。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當i=3時,結束循環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當i=3時,結束本次循環體的執行40for(e1;e2;e3){…if(e)continue;…}break與continue的區別for(e1;e2;e3){…if(e)break;…}計算e1e2語句…非00e非0語句…計算e30break語句0計算e1e2語句…非00e非0語句…計算e3continue語句循環體41[例](ch5_05.c)輸出1~10中不是3的倍數的數。

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的倍數的數字42(1)while(){……while(){……}…...}(2)do{……do{……}while();…...}while();(3)while(){……do{……}while();…….}5.6

循環的嵌套三種循環可互相嵌套,層數不限外層循環可包含兩個以上內循環嵌套循環的執行流程嵌套循環的跳轉

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

i:1~9

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

……… ……....9 18 27 36 45 54 63 72 81ij例循環嵌套,輸出九九表。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();}外循環內循環45(1)當外層循環結構每執行一次循環時,內層循環結構在一般情況下要從循環的開始到循環的正常結束從頭到尾執行一遍。

例1(2)在內層循環結構中使用break語句可以提前結束本次內層循環結構的執行,而不影響外層循環結構的繼續執行。 例2(3)對于并列的循環結構,控制循環執行的變量名字可以相同。在嵌套循環結構中,內、外層控制循環執行的變量名字不能相同。

例3

對于嵌套循環結構的幾點說明: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‘*’的個數j與當前行的關系:

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

開始時,第一行有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[綜合例題]輸入若干個整數(0表示結束),

求它們的總和、均值、最大值和最小值。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

循環程序設計的問題

1、寫循環,先要發現循環。注意計算中的重復性動

作,引進循環可能統一描述和處理。

重復動作的常見例子:

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

循環中常出現幾類變量,了解這些有助于思考和分析。這也是寫循環程序的經驗總結。

1)循環控制變量(循環變量):循環前設初值,循環遞增/遞減,達到/超過界限時循環結束。控制循環的進行/結束。for中常有這類變量。

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

while((c=getchar())!=‘\n’) 4.小經驗:對于charnum,將字符變成數字i=num-’0’; 5.判斷字符范圍(c>‘a’&&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當|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[例]梯形法求數值積分。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牛頓迭代法(牛頓切線法)求解相應的遞推公式(迭代函數)為

牛頓迭代法有很明顯的幾何意義: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*************

本例還是要考慮每行的空格數、和星號數問題,但要關注空格數與星號數在增加到一定的時候又要減少的規律。[例]用循環語句顯示下面的圖案。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)變化規律是:2,1,0,1,2。

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

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

為32767,

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

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

產生閉區間[m,n]的隨機整數。64/*公式rand()/(float)RAND_MAX*(m-n+1)+m產生閉區間[m,n]的隨機整數。*/#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;//產生[6,8]隨機數

printf("%d",x); }

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

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

落在?圓內點數K與(落在正方形內的)總點數J之比

應等于它們的面積比。

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

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

隨機數發生器函數:rand()

功能:產生[0,32767)區間的一個隨機整數。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){ /*產生一對[0,1)的隨機數(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只,設為x 雞母:可能有1只、2只、…、33只,設為y 雞雛:可能有3只、6只、…、300只,設為z只要將上述的數集按條件x+y+z==100和5x+3y+z/3==100同時成立進行三重遍歷,就可以求出所有的解。枚舉法或稱為窮舉法、遍歷法。一般用于不定方程求非負整數解的問題。它將方程中未知數可以取的到的非負整數逐個進行驗證找出所有滿足方程的解。百錢百雞問題雞翁壹,錢值伍;雞母壹,錢值叁;雞雛叁,錢值壹。何以百錢買百雞?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();}百錢百雞問題結果為:

x=4,y=18,z=78

x=8,y=11,z=81

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

(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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論