第五次實驗報告

 

 

 

---恢復內容開始---算法

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、實驗小結

依靠提示和流程圖基本上可以解決全部的問題,但脫離了流程圖和提示,就很難解決了,比較困難。本次的實驗收穫是可以看懂語句的含義及用法,可以在流程圖的提示下順利完成實驗代碼的編程。不足是脫離了流程圖不可以獨立的完成,寫代碼比較慢,手不夠靈活,不可以作到盲打,能力有待提升,目前綜合能力仍是偏弱的

 

 

 

---恢復內容結束---

相關文章
相關標籤/搜索