复化梯形公式的c语言程序,第五次实验报告

c语言程序报告

姓名:吴波     实验地点:第一教学楼514教室     实验时间:5月16日

实验项目:

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

2、计算Ackerman函数

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

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

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

一、实验目的与要求:

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

1、掌握c语言中定义函数的方法

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

•计算Ackerman函数

1、掌握递归函数的设计方法

2、进一步联系阅读检查与测试修改c程序的方法

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

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

7c1f51239b946dbd2758476ab9fd278e.png

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

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

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

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

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

eda66fc5bd1b260f0969a3d4c4dac8bd.png

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

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

•编写递归函数实现Ackerman函数

1、根据递归公式编写递归函数

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

二、实验内容

6.4.2.2实验练习:

问题描述:

(1)编制一个函数sab(a,b,n),其功能为利用复化梯形公式计算定积分

bab819cd05094ac1431f5a5070adf354.png

其中n为对区间[a,b]的等分数。要求该函数在一个独立的文件中。

(2)编制一个主函数以及计算被积函数值的函数f(x),在主函数中调用(1)中的函数sab(a,b,n)计算并输出下列积分值

5287a5d51852017899e1c11a4d94d69f.png

要求主函数与函数f(x)在同一文件中。

(3)编制另一个主函数以及计算被积函数值的函数f(x),在主函数中调用(1)中的函数sab(a,b,n)计算并输出下列积分值

0bfffa015e68c43483ecdce7059f55f6.png

同样要求主函数与函数f(x)在同一文件夹中

(4)要求画出模块sab()的流程图。

方法说明:

设定积分为:

2dfc00b60eb88bfbddc2222f265d4272.png

则复化梯形求积公式为:

2855309d8d78f65b1381f40aae7760d2.png

其中:

fe46a69a82d3ec8a0599f2994031be2f.png

程序流程图:

563f5545caaf56e72a3823c6b42af5ab.png

实验代码:

头文件:

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

}

result=h*(x1+x2)/2+h*x3;

return result;

}

/2-1.cpp/

#include

#include

#include"stab.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("%lf%lf%d",&a,&b,&n);

result=sab(a,b,n);

printf("结果为:%f",result);

}

/2-2.cpp/

#include

#include"stab.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("%lf%lf%d",&a,&b,&n);

result=sab(a,b,n);

printf("结果为:%f",result);

return 0;

}

问题分析:一开始不知道头文件要变后缀名,导致一直报错。

程序运行图:

1db6654cb2efc438ed9783a1d8eb0002.png

476e17dc954fc99c24e330437c200d3c.png

6.4.2.3实验练习:

问题描述:

具体要求:

(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为非负整数,且

cf096251f3d6aee689a3a6e65a0dcc43.png

程序流程图:

fcd33fc8e03175c6bea4ec41e255ca96.png

实验代码:

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

}

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("请输入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) ;

}

问题分析:无问题

程序运行图:

6fce9e38687eeb0b8048d6bae607ea04.png

6.4.3.1实验练习:

问题描述:编写程序,分别从键盘输入数据x和y,计算x的y次幂并输出。

程序流程图:

5a2e03b1e1dc9f2f16f08d7db581c19f.png

实验代码:

#include

long getpower(int x,int y)

{

if(y==1)

{

return x;

}

else

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

}

main()

{

int num,power;

long answer;

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

scanf("%d",&num);

printf("\n请输入幂次方:");

scanf("%d",&power);

answer=getpower(num,power);

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

}

问题分析:输出格式要记得为%ld。

程序运行图:

fe6d8833ebcacb42c6a6a636afb2ce29.png

6.4.3.2实验练习:

问题描述:用递归方法计算学生的年龄。已知第一位学生年龄最小为10岁,其余学生一个比一个大2岁,求第5位学生的年龄。

程序流程图:

a263aee30dadd7e93ceffd27cd9ea326.png

实验代码:

#include

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

}

问题分析:非常简单无问题。

程序运行图:

4ae30912752c02c46ad95c86332dea5c.png

6.4.3.3实验练习:

问题描述:定义递归函数实现下列Ackerman函数:

bfe0b262cf4ae1820c4f3f458701e06e.png

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

程序流程图:

b4cf29d0a1b551a21185548e14578005.png

实验代码:

#include

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

return a;

}

}

main()

{

int f=2,g=1,h=3,w,b;

printf("Acm(%d,%d)=%d\n Acm(%d,%d)=%d\n",f,g,Acm(f,g),h,f,Acm(h,f));

}

问题分析:这道题目是要我们直接输出Acm(2,1)和Acm(3,2)的结果,不需要我们手动输入数字是程序计算。

实验运行图:

fd0d3c30e3fad74d57a0bd3e0a9949d1.png

实验小结:

实验比之前越来越熟练,但还是很依赖流程图,但比之前好了的,我觉得我需要慢慢自己先思考,慢慢的不再太依赖书上给的流程图而是自己能搞定。

标签:函数,递归函数,int,double,Acm,第五次,result,实验报告

来源: https://www.cnblogs.com/ganyiwubo/p/10890398.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值