700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 复化梯形c语言计算定积分 第六章 函数和宏定义实验(2)

复化梯形c语言计算定积分 第六章 函数和宏定义实验(2)

时间:2021-12-25 00:45:27

相关推荐

复化梯形c语言计算定积分 第六章 函数和宏定义实验(2)

1、利用复化梯形公式计算定积分

2、计算Ackerman函数

3、编写计算x的y次幂的递归函数getpower(int x,int y),并在主程序中实现输入输出

4、编写计算学生年龄的递归函数

5、编写递归函数实现Ackman函数

一、实验目的与要求

1、利用复化梯形公式计算定积分

掌握C语言中定义函数的方法

掌握通过“值传递”调用函数的方法

2、计算Ackerman函数

掌握递归函数的设计方法

进一步练习阅读检查与调试修改C程序的方法

3、编写计算x的y次幂的递归函数getpower(int x,int y),并在主程序中实现输入输出

写出解决该问题的递归算法:

在递归函数中,使用数字1 作为回归条件;

在递归函数中,使用 if_else 语句根据条件的真假来决定是递推还是回归。

4、编写计算学生年龄的递归函数

写出解决该问题的递归算法:

递归公式如下,根据公式容易写出递归程序。

在递归函数中,使用数字1 作为回归条件;

在递归函数中,使用if_else语句根据条件的真假来决定是递推还是回归。

5、编写递归函数实现Ackman函数

根据递归公式编写递归函数;

在递归函数中,使用if_else语句根据条件的真假来决定是递推还是回归。

二、实验内容

1、利用复化梯形公式计算定积分

问题的简单描述:

(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

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

#include

#include

#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.

#include

#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;

}

运行结果

问题分析

注意输出结果的类型,开始定义变量为double,所以结果也应该是相应的%lf,然后是算法,复化梯形公式,一开始没怎么看明白这个sab函数怎么写的,然后联想到定积分的基本定义,用一个个的小梯形的面积去替代曲面的面积,利用到了微元法和近似计算法。然后根据实验要求给的框图,大概理解了这个算法,h*【f(a)+f(b)】/2表示梯形的面积,再加上一个h乘上f(x)的累加,从1累加到n-1.

2、计算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

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 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("data error");

result=Ack(n,x,y);

printf("Ack(%d,%d,%d)=%d",n,x,y,result);

}

运行结果如下

问题分析:

注意函数最后一个判断语句的写法,注意还有一个进一步递推的公式才能够写完这个程序。

3、编写计算x的y次幂的递归函数getpower(int x,int y),并在主程序只能怪实现输入输出

问题的简单描述:

编写程序,分别从键盘输入数据x和y,计算x的y次幂并输出。程序流程图如下图所示:

实验代码:

#include

long getpower(int x,int y)

{

if (y==1)

return x;

else if(y>=2)

return (x*getpower(x,y-1));

}

main()

{

int num,power;

long answer;

printf("请输入一个数:");

scanf("%d",&num);

printf("请输入一个幂次方:");

scanf("%d",&power);

answer=getpower(num,power);

printf("结果是:%ld\n",answer);

}

运行结果如下:

问题分析:

这题比较简单没什么大问题。

4、编写计算学生年龄的递归函数

问题的简单描述:

用递归方法计算学生的年龄。已知第一位学生年龄最小为10岁,其余学生一个比一个大2岁,求第5位学生的年龄。流程图如下图所示:

实验代码:

#include

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));

}

运行结果如下:

问题分析:

注意递归公式就好了。

5、编写递归函数实现Ackman函数

问题的简单描述:

定义递归函数实现下列Ackman函数:

其中m、n为正整数。设计程序求Acm(2,1),Acm(3,2)。

实验代码:

#include

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));

}

运行结果如下:

问题分析:

这个程序其实也不难,只要看懂了要怎样下一步递推就可以了。

三、实验小结(在本次实验中收获与不足)

这节课我学会如何调用另一个独立文件程序中的函数,且要注意,在独立文件头文件中还要对函数进行声明。就是可以自己定义的东西直接拿来用,不用再去敲那些函数了,循环使用。现在敲代码还是看着框图去敲代码,发现自己存在很多问题,这个技能锻炼熟练了,但是里面的函数一些关键语句,比如变量代表的含义是什么,然后for里面的循环到底是什么东西,算法是怎么的出来的。

做第一个时候我终于感受到了数学的重要性,去思考一个问题怎么用数学方法来解决,那种更简单,应该是以后实验的方向。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。