c语言复化求积公式程序,第六章 函数与宏定义实验2
C程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)項(xiàng)目:
一.模塊化程序設(shè)計(jì)
1.利用復(fù)化梯形公式計(jì)算定積分。
2.計(jì)算Ackerman函數(shù)。
二. 函數(shù)的遞歸調(diào)用
1.編程計(jì)算x的y次冪的遞歸函數(shù)getpower(int x,int y),并在主程序中實(shí)現(xiàn)輸入輸出
2.編寫計(jì)算學(xué)生年齡的遞歸函數(shù)
3.編寫遞歸函數(shù)實(shí)現(xiàn)Ackman函數(shù)
姓名:李小玲 實(shí)驗(yàn)地點(diǎn): 514實(shí)驗(yàn)室 實(shí)驗(yàn)時(shí)間:2019年5月16日
一、實(shí)驗(yàn)?zāi)康呐c要求
6.4.2、模塊化程序設(shè)計(jì)
實(shí)驗(yàn)1.利用復(fù)化梯形公式計(jì)算定積分
1.掌握C語(yǔ)言中定義函數(shù)的方法
2.掌握通過(guò)“值傳遞”調(diào)用函數(shù)的方法
實(shí)驗(yàn)2. 計(jì)算Ackerman函數(shù)
1.掌握遞歸函數(shù)的設(shè)計(jì)方法
2.進(jìn)一步練習(xí)閱讀檢查與的調(diào)試修改C程序的方法
6.4.3 函數(shù)的遞歸調(diào)用
實(shí)驗(yàn)3. 編程計(jì)算x的y次冪的遞歸函數(shù)getpower(int x,int y),并在主程序中實(shí)現(xiàn)輸入輸出
1.寫出解決該問(wèn)題的遞歸算法:
2.在遞歸函數(shù)中,使用數(shù)字1作為回歸條件
3.在遞歸函數(shù)中,使用if-else語(yǔ)句根據(jù)條件的真假來(lái)決定是遞推還是回歸
實(shí)驗(yàn)4. 編寫計(jì)算學(xué)生年齡的遞歸函數(shù)
1.寫出解決該問(wèn)題的遞歸算法:
遞歸公式如下,根據(jù)公式容易寫出遞歸程序。
2.在遞歸函數(shù)中,使用數(shù)字1作為回歸條件
3.在遞歸函數(shù)中,使用if-else語(yǔ)句根據(jù)條件的真假來(lái)決定是遞推還是回歸
實(shí)驗(yàn)5.?編寫遞歸函數(shù)實(shí)現(xiàn)Ackman函數(shù)
1.根據(jù)遞歸公式編寫遞歸函數(shù)
2.在遞歸函數(shù)中,使用if-else語(yǔ)句根據(jù)條件的真假來(lái)決定是遞推還是回歸
二、實(shí)驗(yàn)內(nèi)容
6.4.2:模塊化程序設(shè)計(jì)
實(shí)驗(yàn)練習(xí)1:利用復(fù)化梯形公式計(jì)算定積分
1.問(wèn)題的簡(jiǎn)單描述:(1)編寫一個(gè)函數(shù)sab(a,b,n),其功能為利用復(fù)化梯形公式計(jì)算定積分
其中n為對(duì)區(qū)間[a,b]的等分?jǐn)?shù)。要求改函數(shù)在一個(gè)獨(dú)立的文件中。(2)編制一個(gè)主函數(shù)以及計(jì)算被積函數(shù)值的函數(shù)f(x),在主函數(shù)中調(diào)用(1)中的函數(shù)sab(a,b,n)計(jì)算并輸出下列積分值
要求主函數(shù)與函數(shù)f(x)在同一文件中。(3)編制另一個(gè)主函數(shù)以及計(jì)算被積函數(shù)值的函數(shù)f(x),在主函數(shù)中調(diào)用(1)中的函數(shù)sab(a,b,n)計(jì)算并輸出下列積分值
同樣要求主函數(shù)與函數(shù)f(x)在同一文件中。(4)要求畫出模板sab()的流程圖。方法說(shuō)明:設(shè)定積分為
則復(fù)化梯形求積公式為
其中
2.實(shí)驗(yàn)代碼,流程圖,效果圖:
#include
double f(doublex);double sab(double a,double b,intn)
{double h,result,x1,x2,x3=0,t;intk;
h=(b-a)/n;
x1=f(a);
x2=f(b);for(k=1;k<=n-1;k++)
{
t=a+k*h;
x3=x3+f(t);
}
result=h*(x1+x2)/2+h*x3;returnresult;
}
#include#include#include"sab.h"
double f(doublex)
{doubleresult;
result=x*x*exp(x);returnresult;
}
main()
{doublea,b,result;intn;
printf("please input double a,b and integer n:");
scanf("%lf%lf%d",&a,&b,&n);
result=sab(a,b,n);
printf("sab(%lf,%lf,%d)=%lf",a,b,n,result);return 0;
}
#include#include"sab.h"
double f(doublex)
{doubleresult;
result=1/(25+x*x);returnresult ;
}
main()
{doublea,b,result;intn;
printf("please input double a,b and integer n:");
scanf("%lf%lf%d",&a,&b,&n);
result=sab(a,b,n);
printf("sab(%lf,%lf,%d)=%lf",a,b,n,result);return 0;
}
3.分析:剛開(kāi)始的時(shí)候沒(méi)怎么思考,沒(méi)錯(cuò),我就是那個(gè)剛開(kāi)始把三個(gè)文件橋在一起的傻子。后面看了下書上要把sab.h和其他兩個(gè)函數(shù)要分三個(gè)文件來(lái),在運(yùn)用函數(shù)的時(shí)候調(diào)用sab.h頭文件就可以出結(jié)果;最最理不理解不了的就是為什么scanf("%f%f%d",&a,&b,&n)運(yùn)行不出來(lái)結(jié)果,但是換成 lf 就可以,歡迎大神來(lái)為我解答。
(這個(gè)是出不來(lái)答案的程序)
實(shí)驗(yàn)練習(xí)2:計(jì)算Ackerman函數(shù)
1.問(wèn)題的簡(jiǎn)單描述:
具體要求如下:(1)根據(jù)方法說(shuō)明,編制計(jì)算Ackerman函數(shù)的遞歸函數(shù)ack(n,x,y)。(2)編制一個(gè)主函數(shù),由鍵盤輸入n,x,y,調(diào)用(1)中的函數(shù)ack(n,x,y),計(jì)算Ackerman函數(shù)(3)在主函數(shù)中,輸入之前要有提示,并檢查輸入數(shù)據(jù)的合理性。若輸入的數(shù)據(jù)不合理,則輸出出錯(cuò)信息。輸出要有文字說(shuō)明。(4)輸入(n,x,y)=(2,3,1)運(yùn)行該程序。然后自定義幾組數(shù)據(jù)在運(yùn)行該程序。方法說(shuō)明:Ackerman函數(shù)的定義如下:n,x,y為非負(fù)整數(shù),且
2.實(shí)驗(yàn)代碼,流程圖,效果圖:
if(n==0)
a=x+1;if(n==1&&y==0)
a=x;if(n==2&&y==0)
a=0;if(n==3&&y==0)
a=1;if(n>=4&&y==0)
a=2;if(n!=0&&y!=0)return Ack(n-1,Ack(n,x,y-1),x);returna;
}
main()
{intn,x,y,result;
printf("please input n,x,y,:");if(n<0||x<0||y<0)
printf("error!請(qǐng)?jiān)俅屋斎?\n");
scanf("%d%d%d",&n,&x,&y);
result=Ack(n,x,y);
printf("Ack(%d,%d,%d)=%d\n",n,x,y,result);
}
3.分析:這個(gè)程序還好,就是寫出五個(gè)回歸條件;我的話,就在最后那個(gè)進(jìn)一步遞推的時(shí)候有點(diǎn)懵它是要return到那個(gè)去,后面發(fā)現(xiàn)題目的問(wèn)題描述中有說(shuō),說(shuō)明看題目不是很仔細(xì);大部分的話還是看流程圖能看懂的。
6.4.3:函數(shù)的遞歸調(diào)用
實(shí)驗(yàn)練習(xí)3:編程計(jì)算x的y次冪的遞歸函數(shù)getpower(int x,int y),并在主程序中實(shí)現(xiàn)輸入輸出
1.問(wèn)題的簡(jiǎn)單描述:編寫程序,分別從鍵盤輸入數(shù)據(jù)x和y,計(jì)算x和y次冪并輸出。
2.實(shí)驗(yàn)代碼,流程圖,效果圖:
#include"stdio.h"
long getpower(int x ,inty)
{if(y==1)returnx;else
return (x*getpower(x,y-1));
}
main()
{intnum,power;longanswer;
printf("輸入一個(gè)數(shù):");
scanf("%d",&num);
printf("輸入冪次方:");
scanf("%d",&power);
answer=getpower(num,power);
printf("結(jié)果是:%ld\n",answer);
}
3.分析:這題我在函數(shù)調(diào)用方面出了問(wèn)題,就是沒(méi)搞清楚answer要調(diào)用的是哪個(gè)式子,然后的話就是定義里面的getpower()是計(jì)算冪函數(shù)的一種形式,不足的話就是我沒(méi)有去考慮輸入的數(shù)不是整數(shù)時(shí)候或者不是數(shù)字時(shí)候的情況,沒(méi)有嚴(yán)格設(shè)置它要輸入的格式問(wèn)題。
實(shí)驗(yàn)練習(xí)4:編寫計(jì)算學(xué)生年齡的的遞歸函數(shù)
1.問(wèn)題的簡(jiǎn)單描述:用遞歸方法計(jì)算學(xué)生的年齡。已知第一位學(xué)生的年齡最小為10歲,其余學(xué)生一個(gè)比一個(gè)大2歲,求第5位學(xué)生的年齡。
2.實(shí)驗(yàn)代碼,流程圖,效果圖:
#include
int age (intn)
{intc;if(n==1)
c=10;else
return age(n-1)+2;returnc;
}
main()
{int n=5;
printf("%d",age(n));
}
3.分析:這題其實(shí)還好,就是我剛開(kāi)始做的時(shí)候把n初始值設(shè)置從0開(kāi)始 了,后面自己算了下是錯(cuò)的,再仔細(xì)看了下題目發(fā)現(xiàn)是從第一個(gè)人開(kāi)始,應(yīng)該是從n=1開(kāi)始的。
實(shí)驗(yàn)練習(xí)5:編寫遞歸函數(shù)實(shí)現(xiàn)Ackman函數(shù)
1.問(wèn)題的簡(jiǎn)單描述:定義遞歸函數(shù)實(shí)現(xiàn)下列Ackman函數(shù):
其中m、n為正整數(shù)。設(shè)計(jì)創(chuàng)新求Acm(2,1),Acm(3,2)。
2.實(shí)驗(yàn)代碼,流程圖,效果圖:
#includeAcm(int m,intn)
{intc;if(m==0)
c=n+1;if(n==0)return Acm(m-1,1);if(n>0,m>0)return Acm(m-1,Acm(m,n-1));
}intmain()
{intx,y;
x=Acm(2,1);
y=Acm(3,2);
printf("Acm(2,1)=%d\n",x);
printf("Acm(3,2)=%d\n",y);return 0;
}
3.分析:這題的話只要看的懂Ackman函數(shù)就能寫函數(shù)定義,再就是輸出的時(shí)候注意格式,這題我是設(shè)置了就是只求
Acm(2,1),Acm(3,2);如果要輸入其他數(shù)值的話,直接改一下main函數(shù)里面的就好了。
三.實(shí)驗(yàn)小結(jié)
通過(guò)第一個(gè)實(shí)驗(yàn),我知道了怎么調(diào)用另一個(gè)文件中的函數(shù),然后要根據(jù)函數(shù)中存放數(shù)的大小來(lái)選擇其定義的類型;我對(duì)于遞推函數(shù)的運(yùn)用也不是很熟練,大部分是看著流程圖來(lái)做的,不然就容易出錯(cuò),最最重要的是,我對(duì)于遞推和回歸這兩個(gè)概念整的有點(diǎn)懵了,
百度了一下也沒(méi)整明白;其他的都還好,按照步驟來(lái)都還是可以解出來(lái)的,就是概念可能不是那么熟悉。
總結(jié)
以上是生活随笔為你收集整理的c语言复化求积公式程序,第六章 函数与宏定义实验2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 100的阶乘c语言代码,求10000的阶
- 下一篇: 无忧计算机c语言二级题库,干货for计算