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