第六章 函數和宏定義實驗(2)

 第六章 函數和宏定義實驗(2)

C程序設計實驗報告

實驗項目:

函數與宏定義模塊化

姓名:徐溢璠   實驗地點:514教室   實驗時間:5月16日

1、實驗目的與要求

一、模塊化程序設計

  • 利用負化梯形公式計算定積分。  函數

  • 計算Ackeman函數。spa

二、函數的遞歸

  • 編寫計算x的y次冪的遞歸函數getpower(intx,inty),並在主程序中實現輸入輸出。設計

  • 編寫計算學生年齡的遞歸函數。3d

  • 編寫遞歸函數實現Ackman函數。code

2、實驗內容

實驗練習2:利用負化梯形公式計算定積分。  

一、簡單問題描述:

(1)編制一個函數sab(a,b,n),其功能爲利用復化梯形公式計算定積分blog

 

 


其中n爲對區間[a,b]的等分數。要求該函數在一個獨立的文件中。
(2)編制一個主函數以及計算被積函數值的函數 f(x),在主函數中調用(1)遞歸

中的函數sab(a,b,n)計算並輸出下列積分值three

 

 


要求主函數與函數f(x)在同一文件中。
(3)編制另外一個主函數以及計算被積函數值的函數 f(x),在主函數中調用(1)中的函數sab(a,b,n)計算並輸出下列積分值get



一樣要求主函數與函數f(x)在同一文件中。
(4)要求畫出模塊sab()的流程圖。
方法說明:
設定積分爲

則復化梯形求積公式爲:

 

流程圖以下:

二、實驗代碼

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);
     } 
    result=h*(x1+x2)/2+h*x3;
    return result;
   }

 2-1

#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 enter a、b、n:");
    scanf("%lf%lf%d",&a,&b,&n);
    result=sab(a,b,n);
    printf("sab(%lf,%lf,%d)=%lf",a,b,n,result);
}

2-2

#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 enter a、b、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;
}

 

三、問題分析

問題:剛開始我得出的結果爲

解決辦法:詢問老師,結果發現兩個積分的代碼之間是有關聯的,必須同時存在。

實驗練習3:計算Ackeman函數。

一、簡單問題描述:

具體要求以下:
(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爲非負整數,且

 

 程序流程圖以下所示:

二、實驗代碼

#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)
    a=Ack(n-1,Ack(n,x,y-1),x);
    return a;
}
main()
{
    int a,b,c,result;
    printf("please enter three numbers:");
    scanf("%d%d%d",&a,&b,&c);
    if(a<0||b<0||c<0)
        printf("sorry,you are wrong!");
    else
    {
        result=Ack(a,b,c);
        printf ("Ack(%d,%d,%d)=%d\n",a,b,c,result);
    }
}

 三、問題分析

剛開始我獲得的結果以下所示:

解決辦法:通過查看流程圖我發現個人代碼沒有問題,後來同窗提醒,我才發現,我在scanf語句中是沒有逗號的,可是我輸入數字又加了逗號。

6.4.3函數的遞歸

實驗練習1:編寫計算x的y次冪的遞歸函數getpower(intx,inty),並在主程序中實現輸入輸出。

一、簡單問題描述

編寫程序,分別從鍵盤輸入數據X與Y,計算X的Y次冪並輸出。程序流程圖以下:

二、實驗代碼

#include<stdio.h>
long getpower(int x,int y)
{
 if(y==1)
 return x;
 else
 y=x*getpower(x,y-1);
}
main()
{
 int num,power;
 long answer ;
 printf("請輸入一個數:\n");
 scanf("%d",&num);
 printf("請輸入冪次方:\n");
 scanf("%d",&power);
 answer=getpower(num,power);
 printf("結果是:%ld\n",answer);
}

 

三、問題分析

該題目根據流程圖來寫並無什麼問題。

實驗練習2:編寫計算學生年齡的遞歸函數。

一、簡單問題描述

用遞歸方法計算學生的年齡。已知第一位學生年齡最小爲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,c;
    c=age(n);
    printf("第五位學生年齡爲%d。",c);
}

三、問題分析

該代碼並無什麼問題。  

實驗練習3:編寫遞歸函數實現Ackman函數。

一、簡單問題描述

定義遞歸函數實現下列Ackman函數:

 

其中m,n爲正整數。設計程序求Ack (2,1),Ack (3,2)。程序流程圖以下所示:

二、實驗代碼

#include<stdio.h>
Acm(int m,int n)
{
 int a;
 if(m==0)
 {
  a=n+1;
  return a;
 }
 if(n==0)
 {
  a=Acm(m-1,1);
 }
 if(n>0&&m>0)
 {
  a=Acm(m-1,Acm(m,n-1));
 }
 
 }
 int main()
 {
  int m,n,x,y;
  x=Acm(2,1);
  y=Acm(3,2);
  printf("Acm(2,1)=%d\nAcm(3,2)=%d",x,y);
  return 0;
 }

 

三、問題分析

該開始我按照流程圖的分析,得出了以下結果:

解決辦法:經過閱讀完整題目,我發現應該將

if(m==0)
    {
        a=m+1;
        return a;
    }

改成

if(m==0)
    {
        a=n+1;
        return a;
    }

3、實驗小結

收穫:

一、之後能夠將須要重複使用的模塊放入一個獨立文件中,可使代碼更加簡潔。

二、要注意函數名的大小寫,不然沒法識別。

三、若是變量要存放較大的數,那麼能夠將類型定義爲long型。長整型的輸出格式爲%ld。

四、最後一個代碼我根據流程圖,結果錯了。要有本身的思惟過程,不能一昧的根據書上流程圖寫代碼。

不足:

一、我在第一個實驗卡了很久,發現老是沒法得出結果,我就變得很急躁,後面的幾個實驗效率明顯變低而且沒法專一。之後要提升注意力。

二、過於依賴書本。

相關文章
相關標籤/搜索