函數與宏定義模塊化
利用負化梯形公式計算定積分。 函數
計算Ackeman函數。spa
編寫計算x的y次冪的遞歸函數getpower(intx,inty),並在主程序中實現輸入輸出。設計
編寫計算學生年齡的遞歸函數。3d
編寫遞歸函數實現Ackman函數。code
(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()的流程圖。
方法說明:
設定積分爲
則復化梯形求積公式爲:
流程圖以下:
#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;
}
#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);
}
#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; }
問題:剛開始我得出的結果爲
解決辦法:詢問老師,結果發現兩個積分的代碼之間是有關聯的,必須同時存在。
具體要求以下:
(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語句中是沒有逗號的,可是我輸入數字又加了逗號。
編寫程序,分別從鍵盤輸入數據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);
}
該題目根據流程圖來寫並無什麼問題。
用遞歸方法計算學生的年齡。已知第一位學生年齡最小爲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); }
該代碼並無什麼問題。
定義遞歸函數實現下列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;
}
一、之後能夠將須要重複使用的模塊放入一個獨立文件中,可使代碼更加簡潔。
二、要注意函數名的大小寫,不然沒法識別。
三、若是變量要存放較大的數,那麼能夠將類型定義爲long型。長整型的輸出格式爲%ld。
四、最後一個代碼我根據流程圖,結果錯了。要有本身的思惟過程,不能一昧的根據書上流程圖寫代碼。
一、我在第一個實驗卡了很久,發現老是沒法得出結果,我就變得很急躁,後面的幾個實驗效率明顯變低而且沒法專一。之後要提升注意力。
二、過於依賴書本。