第六章函數與宏定義實驗報告二

第六章函數與宏定義實驗報告二

 

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語言中也是有子文件,也是能夠連接頭文件的包含關係。二、要掌握返回值的定義,和函數的調用明白其的用法。

相關文章
相關標籤/搜索