版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鋼鐵廠租賃協(xié)議
- 水利工程清包工施工合同
- 工業(yè)園區(qū)照明改造合同
- 建筑綠化施工圖設(shè)計合同模板
- 橡膠廠原料吊籃租賃合同
- 陶瓷制品加工廠合同
- 旅游地產(chǎn)交易補充協(xié)議
- 內(nèi)衣襪子訂貨合同范例
- 山東物流設(shè)施建設(shè)合同
- 建筑施工合同裝配式建筑生產(chǎn)
- TFJPACIA 001-2024 氟石膏規(guī)程規(guī)范
- 醫(yī)院提高住院患者抗菌藥物治療前病原學(xué)送檢率學(xué)習(xí)培訓(xùn)課件
- 2024-2025學(xué)年七年級英語上冊第一學(xué)期 期末綜合模擬考試卷(滬教版)(一)
- 10S505 柔性接口給水管道支墩
- 2024北京高考語文試卷(真題+答案)
- DL∕T 939-2016 火力發(fā)電廠鍋爐受熱面管監(jiān)督技術(shù)導(dǎo)則
- GB/T 35603-2024綠色產(chǎn)品評價衛(wèi)生陶瓷
- TDT 1083-2023 國土調(diào)查數(shù)據(jù)庫更新數(shù)據(jù)規(guī)范
- 手機攝影教程
- 模擬集成電路設(shè)計智慧樹知到期末考試答案章節(jié)答案2024年廣東工業(yè)大學(xué)
- 人機工程設(shè)計智慧樹知到期末考試答案章節(jié)答案2024年蘭州理工大學(xué)
評論
0/150
提交評論