---恢復內容開始---算法
C程序設計報告編程
實驗項目:一、利用復化梯形公式計算定積分 二、計算Ackerman函數 三、編寫計算x的y次冪的遞歸函數getpower(int x,int y),並在主程序中實現輸入輸出 四、編寫計算學生年齡的遞歸函數 五、編寫遞歸函數實現Ackman函數
姓名:李研 實驗地點:第一教學樓514教室 實驗時間:2019.5.16
1、實驗目的與要求
一、掌握C語言中定義函數的方法函數
掌握經過「值傳遞」調用函數的方法spa
二、掌握遞歸函數的設計方法設計
進一步練習閱讀檢查與調試修改C程序的方法調試
三、code
寫出解決該問題的遞歸算法:
blog
在遞歸函數中,使用數字1 做爲迴歸條件;遞歸
在遞歸函數中,使用 if_else 語句根據條件的真假來決定是遞推仍是迴歸。ci
四、
寫出解決該問題的遞歸算法:
遞歸公式以下,根據公式容易寫出遞歸程序。
在遞歸函數中,使用數字1 做爲迴歸條件;
在遞歸函數中,使用if_else語句根據條件的真假來決定是遞推仍是迴歸。
五、根據遞歸公式編寫遞歸函數
在遞歸函數中,使用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。程圖如圖下圖所示:
實驗代碼:
#include <stdio.h> double f(double x); double sab(double a, double b,int n) { double h,result,x1,x2,x3=0,t; h=(b-a)/a; 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("%d,%d,%d",&a,&b,&n); result=sab(a,b,n); printf("sab(a,b,n)=%d",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的值:"); scanf("%d%d%d",&a,&b,&n); result=sab(a,b,n); printf("sab(a,b,n)=%d",result); result 0; }
問題分析:sab()模塊在一個獨立的文件中,本題將其放在sab.h頭文件中
sab()模塊中還須要調用主程序文件中的f()函數,因此在sab.h頭文件中還需對f()函數進行聲明
二、實驗練習 計算Ackerman函數
問題的簡單描述:
具體要求以下:
(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函數的定義以下:
1n,x,y爲非負整數,且
流程圖以下圖所示:
實驗代碼:
#include<stdio.h> int Ack(int n,int x,int y) { int a; 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); return a; } main() { int a,b,c,d; printf("please input a,b,c:"); scanf("%d%d%d",&a,&b,&c); while (a<=0||b<=0||c<=0) { printf("error,please input again!\n"); scanf("%d%d%d",&a,&b,&c); } d=Ack(a,b,c); printf("Ack(%d,%d,%d)=%d\n",a,b,c,d); }
問題分析:在根據遞歸公式編寫遞歸程序時,注意有5個迴歸條件
三、實驗練習 編寫計算x的y次冪的遞歸函數getpower(int x,int y),並在主程序中實現輸入輸出
問題的簡單描述:
編寫程序,分別從鍵盤輸入數據x和y,計算x的y次冪並輸出。程序流程圖以下圖所示:
實驗代碼:
#include"stdio.h" long getpower(int x,int y) { if(y==1) return x; else x=x*getpower(x,y-1); return x; } int main() { int num,power; long answer; printf("please enter a zhengshu:"); scanf("%d",&num); printf("please enter its micifang:"); scanf("%d",&power); answer=getpower(num,power); printf("結果是:%d\n",answer); }
問題分析:輸出結果的printf()函數,因爲要輸出長整型數據,因此其輸出格式爲「%ld"
四、實驗練習 編寫計算學生年齡的遞歸函數
問題的簡單描述:用遞歸方法計算學生的年齡。已知第一位學生年齡最小爲10歲,其他學生一個比一個大2歲,求第5位學生的年齡
實驗代碼:
#include<stdio.h> int age(int n) { int c; if(n==1) c=10; else c=age(n-1)+2; return c; } main() { int n=5; printf("第五個學生的年齡是:%d",age(5)); }
問題分析:無
五、實驗練習 編寫遞歸函數實現Ackman函數
問題的簡單描述:
定義遞歸函數實現下列Ackman函數:
其中m、n爲正整數。設計程序求Acm(2,1),Acm(3,2)
實驗代碼:
#include<stdio.h> int Acm(int m,int n) { int x; if(m==0) { x=n+1; return x; } else { if(n==0) { x=Acm(m-1,1); // return x; } else { x=Acm(m-1,Acm(m,n-1)); // return x; }} } int main() { int x,y; x=Acm(2,1); y=Acm(3,2); printf("Acm(2,1)=%d\nAcm(3,2)=%d",x,y); return 0; }
問題分析:無
3、實驗小結
依靠提示和流程圖基本上可以解決全部的問題,但脫離了流程圖和提示,就很難解決了,比較困難。本次的實驗收穫是可以看懂語句的含義及用法,可以在流程圖的提示下順利完成實驗代碼的編程。不足是脫離了流程圖不可以獨立的完成,寫代碼比較慢,手不夠靈活,不可以作到盲打,能力有待提升,目前綜合能力仍是偏弱的
---恢復內容結束---