C程序設計實驗報告
實驗項目:
1、利用復化梯形公式計算定積分
2、計算Ackerman函數
3、編寫計算x的y次冪的遞歸函數getpower(int x,int y),并在主程序中實現輸入輸出
4、編寫計算學生年齡的遞歸函數
5、編寫遞歸函數實現Ackman函數
姓名:王錦輝 實驗地點: 514實驗室 實驗時間:2019.5.16
一、實驗目的與要求一、實驗目的與要求
1.利用復化梯形公式計算定積分
- 掌握C語言中定義函數的方法;
- 掌握通過“值傳遞”調用函數的方法;
2.計算Ackerman函數
- 掌握遞歸函數的設計方法;
- 進一步練習閱讀檢查與調試修改C程序的方法;
3.編寫計算x的y次冪的遞歸函數getpower(int x,int y),并在主程序中實現輸入輸出
- 寫出解決該問題的遞歸算法:
- 在遞歸函數中,使用數字1 作為回歸條件;
- 在遞歸函數中,使用 if_else 語句根據條件的真假來決定是遞推還是回歸。
4.編寫計算學生年齡的遞歸函數
- 寫出解決該問題的遞歸算法:
遞歸公式如下,根據公式容易寫出遞歸程序。 - 在遞歸函數中,使用數字1 作為回歸條件;
- 在遞歸函數中,使用if_else語句根據條件的真假來決定是遞推還是回歸。
5.編寫遞歸函數實現Ackman函數
- 根據遞歸公式編寫遞歸函數;
- 在遞歸函數中,使用if_else語句根據條件的真假來決定是遞推還是回歸。
二、實驗內容
6.4.2.2
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()的流程圖。
方法說明:
設定積分為
則復化梯形求積公式為
其中h=(b-a)/n,Xk=a+kh。
2.程序流程圖:
3、實驗代碼:
#include<stdio.h>
double f(double x);
double sab(double a, double b,int n)
{int k;double h,result,x1,x2,x3=0,t;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;return result;
}
#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("請輸入a,b,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;
}
#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("請輸入a,b,n的值:\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;
}
附圖:
6.4.2.3
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、流程圖:
3、實驗代碼:
#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("輸入錯誤,請重新輸入!\n"); result=Ack(n,x,y);printf("Ack(%d,%d,%d)=%d\n",n,x,y,result);
}
附圖:
6.4.3.1
1、問題的簡單描述:編寫程序,分別從鍵盤輸入數據x和y,計算x的y次冪并輸出。
2、流程圖:
3、實驗代碼:
#include<stdio.h>
long getpower(int x,int y)
{if(y==1)return x;elsereturn x*getpower(x,y-1);
}
main()
{int num,power;long answer;printf("輸入一個數:");scanf("%d",&num);printf("輸入冪次方:");scanf("%d",&power);answer=getpower(num,power);printf("結果是:%ld\n",answer);
}
附圖:
6.4.3.2
1.問題的簡單描述:用遞歸方法計算學生的年齡。已知第一位學生年齡最小為10歲,其余學生一個比一個大2歲,求第5位學生的年齡。
2、流程圖:
3、實驗代碼:
#include<stdio.h>
int age(int n)
{int c;if(n==1)c=10;elsec=age(n-1)+2;return c;
}
main()
{int n=5,result;result=age(n);printf("第五位學生的年齡是%d歲",result);
}
附圖:
6.4.3.3
1、問題的簡單描述:
定義遞歸函數實現下列Ackman函數:
其中m,n為正整數,設計程序求Acm(2,1),Acm(3,2)。
2、流程圖:
3、實驗代碼:
#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 f=2,g=1,k=3;printf("Acm(2,1)=%d\nAcm(3,2)=%d",Acm(f,g),Acm(k,f));return 0;
}
附圖: