C程序設計實驗報告
實驗項目:
一、利用復化梯形公式計算定積分
二、計算Ackerman函數
三、編寫計算x的y次冪的遞歸函數getpower(int x,int y),並在主程序中實現輸入輸出
四、編寫計算學生年齡的遞歸函數
五、編寫遞歸函數實現Ackman函數html
姓名:陳峯 實驗地點:教學樓514 實驗時間:2019.5.16
1、實驗目的與要求
一、利用復化梯形公式計算定積分
- 掌握C語言中定義函數的方法
- 掌握經過「值傳遞」調用函數的方法
二、計算Ackerman函數
- 掌握遞歸函數的設計方法
- 進一步練習閱讀檢查與調試修改C程序的方法
三、編寫計算x的y次冪的遞歸函數getpower(int x,int y),並在主程序中實現輸入輸出
- 寫出解決該問題的遞歸算法:
- 在遞歸函數中,使用數字1 做爲迴歸條件;
- 在遞歸函數中,使用 if_else 語句根據條件的真假來決定是遞推仍是迴歸。
四、編寫計算學生年齡的遞歸函數
- 寫出解決該問題的遞歸算法:
遞歸公式以下,根據公式容易寫出遞歸程序。 - 在遞歸函數中,使用數字1 做爲迴歸條件;
- 在遞歸函數中,使用if_else語句根據條件的真假來決定是遞推仍是迴歸。
五、編寫遞歸函數實現Ackman函數
- 根據遞歸公式編寫遞歸函數;
- 在遞歸函數中,使用if_else語句根據條件的真假來決定是遞推仍是迴歸。
2、實驗內容
一、利用復化梯形公式計算定積分
- 問題的簡單描述:
(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()的流程圖。
方法說明:
設定積分爲
則復化梯形求積公式爲
其中h=(b-a)/n,Xk=a+kh。程圖如圖下圖所示:
- 實驗代碼:
(1)sab.h
#include<stdio.h> double f(double x); double sab(double a,double b,int n) { double h,result,x1,x2,x3=0,t; int k; 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); } return h*(x1+x2)/2+h*x3; }
(2)6.4.2.2.1.cpp算法
#include<stdio.h> #include<math.h> #include"sab.h" double f(double x) { double result; result=x*x*exp(x); return result; } main() { double a,b,result; int n; 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)=%f",a,b,n,result); return 0; }
(3)6.4.2.2.2.cppmarkdown
#include<stdio.h> #include"sab.h" double f(double x) { double result; result=1/(25+x*x); return result; } main() { double a,b,result; int n; printf("please input double a,b and integer n:"); scanf("%lf%lf%d",&a,&b,&n); result=sab(a,b,n); printf("sab(%f,%f,%d)=%f",a,b,n,result); return 0; }
運行結果以下:函數
-
- 問題分析:一開始我就是真的像書上同樣把那些代碼所有按順序寫下來了,結果就搞笑了,原來這個有的是子文件要分三個來作而後連接起來就好了,其餘沒什麼問題。
- 二、計算Ackerman函數
- 問題的簡單描述:
具體要求以下:
(1)根據方法說明,編制計算Ackerman函數的遞歸函數ack(n,x,y)。post
(2)編制一個主函數,由鍵盤輸入n,x,y,調用(1)中的函數ack(n,x,y),計算Ackerman函數ui
(3)在主函數中,輸入以前要有提示,並檢查輸入數據的合理性,若輸入的數據不合理,則輸出出錯信息。輸出要有文字說明。url
(4)輸入(n,x,y) = (2,3,1)運行該程序。而後自定義幾組數據再運行該程序。spa
方法說明:
Ackerman函數的定義以下:
1n,x,y爲非負整數,且設計
流程圖以下圖所示:3d
- 實驗代碼:
#include<stdio.h>
int Ack(int n,int x,int y)
{
int a;
if(n==0)
a=x+1;
else if(n==1&&y==0)
a=x;
else if(n==2&&y==0)
a=0;
else if(n==3&&y==0)
a=1;
else if(n==4&&y==0)
a=2;
else if(n!=0&&y!=0)
a=Ack(n-1,Ack(n,x,y-1),x);
return a;
}
main()
{
int n,x,y,result;
printf("please input n,x,y:");
scanf("%d,%d,%d",&n,&x,&y);
if(n<0||x<0||y<0)
printf("輸入錯誤,請從從新輸入");
result=Ack(n,x,y);
printf("Ack(%d,%d,%d)=%d\n",n,x,y,result);
}
運行結果以下:
- 問題分析:一開始我不知道進一步遞推那裏是怎麼填寫,後來我問了邊上的同窗他告訴我就是迴歸a的值,我看了下前一頁的函數定義發現也是這樣。後來就懂了。
三、編寫計算x的y次冪的遞歸函數getpower(int x,int y),並在主程序只能怪實現輸入輸出
- 問題的簡單描述:編寫程序,分別從鍵盤輸入數據x和y,計算x的y次冪並輸出。程序流程圖以下圖所示:
- 實驗代碼:
#include"stdio.h"
long getpower(int x,int y)
{ int a;
if(y==1)
{
a=x;
return a;
}
else
a=x*getpower(x,y-1);
return a;
}
main()
{
int num,power;
long answer;
printf("輸入一個數:");
scanf("%d",&num);
printf("輸入冪次方:");
scanf("%d",&power);
answer=getpower(num,power);
printf("結果是:%ld\n",answer);
}
運行結果以下:
- 問題分析:一開始我搞不懂函數的定義裏的函數返回值究竟是怎麼個回事,老是搞不出來因此後來問了老師講解以後我就懂了,返回值是返回給那個定義的變量給它儲存。
四、編寫計算學生年齡的遞歸函數
- 問題的簡單描述:用遞歸方法計算學生的年齡。已知第一位學生年齡最小爲10歲,其他學生一個比一個大2歲,求第5位學生的年齡。流程圖以下圖所示:
- 實驗代碼:
#include<stdio.h> int age(int n) { int c; if(n==1) c=10; else return age(n-1)+2; return c; } main() { int n=5; printf("%d",age(n)); }
運行結果以下:
- 問題分析:無。
五、編寫遞歸函數實現Ackman函數
- 問題的簡單描述:定義遞歸函數實現下列Ackman函數:
其中m、n爲正整數。設計程序求Acm(2,1),Acm(3,2)。程序流程圖以下圖所示:
- 實驗代碼:
#include<stdio.h> Acm(int m,int n) { if(m==0) return n+1; if(n==0) return Acm(m-1,1); if(n>0&&m>0) return Acm(m-1,Acm(m,n-1)); } int main() { int m,n,x,y; printf("please input two integers m,n:"); scanf("%d%d",&m,&n); printf("please input two integers x,y:"); scanf("%d%d",&x,&y); printf("Acm(%d,%d)=%d\n",m,n,Acm(m,n)); printf("Acm(%d,%d)=%d",x,y,Acm(x,y)); }
運行結果以下:
- 問題分析:無。
3、實驗小結(在本次實驗中收穫與不足)
一、要注意C語言中也是有子文件,也是能夠連接頭文件的包含關係。二、要掌握返回值的定義,和函數的調用明白其的用法。