c语言中sab是什么函数名,函数的宏定义(2) - osc_s5ssp1ty的个人空间 - OSCHINA - 中文开源技术交流社区...

本文介绍了C语言编程实验,包括利用复化梯形公式计算定积分的函数`sab`,实现Ackerman函数的递归算法,编写计算x的y次幂的递归函数`getpower`,计算学生年龄的递归函数,以及再次实现Ackman函数的递归函数`Acm`。实验涉及函数定义、递归调用、输入输出及错误处理,通过流程图辅助理解程序逻辑。
摘要由CSDN通过智能技术生成

实验项目:

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

2、计算Ackerman函数

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

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

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

姓名:郭薪  实验地点: 514实验室 实验时间:2019.5.16

一、实验目的与要求一、实验目的与要求

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

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

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

2.计算Ackerman函数

掌握递归函数的设计方法;

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

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

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

19e0d31b2124cb7a26bf05406042dc8f.png

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

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

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

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

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

53ffaeeb28ae1e76d8f946916633fe93.png

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

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

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

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

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

二、实验内容

6.4.2.2

1、 问题的简单描述:

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

59e1bd895cadc30d989090909e942a0e.png

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

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

c84c293749fee8a6642b1f1af9169f6d.png

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

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

2a2f7b2a37912b8cdb35bd3d1a7fc318.png

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

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

方法说明:

设定积分为

52e311882166c66ee3180490bb1837f0.png

则复化梯形求积公式为

ca156cd614aaf1071b7dd15b515761ba.png

其中h=(b-a)/n,Xk=a+kh。

2.程序流程图:

二、实验内容

6.4.2.2

1、 问题的简单描述:

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

31fe91daf269e8adb38919fe39c75c4a.png

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

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

a0e2fb2877307c3a704f672f95f74ed2.png

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

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

f1b943a70eee165ffa140216a96a6771.png

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

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

方法说明:

设定积分为

835de82e69c8771c15c7181872b90f61.png

则复化梯形求积公式为

4ec4a766bcdf4fa6ddd3295514398e90.png

其中h=(b-a)/n,Xk=a+kh。

2.程序流程图:

二、实验内容

6.4.2.2

1、 问题的简单描述:

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

d015a78265a13b997aebfd0035e05c49.png

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

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

19a7add671f12553763cb3ec3c153802.png

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

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

7c378d93c037366ddcda58ed24229c0e.png

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

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

方法说明:

设定积分为

8ba0a73c1df96479cfa663f61b65552e.png

则复化梯形求积公式为

28650f1a61af64257ddedf72792b0255.png

其中h=(b-a)/n,Xk=a+kh。

2.程序流程图:

93b47ba849ef8ffb11790a42f19e6721.png

代码:

#include

double f(doublex);double sab(double a, double b,intn)

{intk;double h,result,x1,x2,x3=0,t;

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

}

#include#include#include"sab.h"

double f(doublex)

{doubleresult;

result=x*x*exp(x);returnresult;

}

main()

{doublea,b,result;intn;

printf("请输入a,b,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;

}

#include#include#include"sab.h"

double f(doublex)

{doubleresult;

result=x*x*exp(x);returnresult;

}

main()

{doublea,b,result;intn;

printf("请输入a,b,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;

}

运行结果:

e158213edb20f3159a482f6b1fcfce22.png

09cbfcbcafd4d42b52fa40d5974a9795.png

问题分析:这道题在于将相同的“头文件”和“函数”放进其他文件中进行引用,按照流程图来走没有问题。不过,因为要用到相应的头文件,所以要先进行头文件的编译再进行其他两个文件的编译。

6.4.2.3

1、问题的简单描述:具体要求:

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

f668f6360f3ff91e1227c17e97258315.png

2、流程图:

b47506e784e0feb1b9e32c7d79d680e4.png

代码:

#include

int Ack(int n,int x,inty)

{inta;if(n==0)

a=x+1;else if(n==1&&y==0)

a=x;else if(n==2&&y==0)

a=0;else if(n==3&&y==0)

a=1;else if(n>=4&&y==0)

a=2;else if(n!=0&&y!=0)

a=Ack(n-1,Ack(n,x,y-1),x);//*我在前面用了一个return*//returna;

}

main()

{intn,x,y,result;

printf("Please input nx,y:");

scanf("%d,%d,%d",&n,&x,&y);if(n<0||x<0||y<0)

printf("Error!");

result=Ack(n,x,y);

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

}

运行结果:

818797497355291ec4a6f93a24d308fd.png

问题分析:首先,用到了条件分支结构,我在考虑要不要用if else的结构,改了很久发现其实用不用都可以。接下来,依旧是对函数的调用。

6.4.3.1

1、问题的简单描述:编写程序,分

别从键盘输入数据x和y,计算x的y次幂并输出。

2、流程图:

3e7b57f8e820ccb52a97b344dd0ca8b5.png

代码:

#include

long getpower(int x,inty)

{if(y==1)returnx;else

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

}

main()

{intnum,power;longanswer;

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

scanf("%d",&num);

printf("输入幂次方:");

scanf("%d",&power);

answer=getpower(num,power);

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

}

运行结果:

729242b1a11beb9c2c7839d9ca84331c.png

问题分析:首先if()条件中的“==”号的问题很难发现一旦犯错,然后其实我个人是有在两个printf后面接上if条件语句判断是否为整数的代码,否则输出错误。但发现,没有也可以照常输出,为了简化代码,就删除了。

6.4.3.2

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

2、流程图:

06043046b8111ef03c69d2f3669e23ed.png

代码:

#include

int age(intn)

{intc;if(n==1)

c=10;elsec=age(n-1)+2;returnc;

}

main()

{int n=5,result;

result=age(n);

printf("第五位学生的年龄是%d岁",result);

}

运行结果:

ce3a9e55a752334fb04111304f9956d4.png

问题分析:问题不大。

6.4.3.3

1、问题的简单描述:

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

4b738deae9778f66218b9d59fe6d9497.png

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

2、流程图:

a81b41cb6fa77d758b3cb8dd9b2f1537.png

代码:

#includeAcm(int m,intn)

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

}intmain()

{int f=2,g=1,k=3;

printf("Acm(2,1)=%d\nAcm(3,2)=%d",Acm(f,g),Acm(k,f));return 0;

}

运行结果:

d31688cf22389a69ae0371ba32d4d872.png

问题分析:对分段函数的处理,不同条件返回不同的值,按照流程图走,没有过多的问题。

总结思考:学会了将通用的重要文件独立开来并引用,根据流程图进行编写的过程中更多的是将它运行出来,不知所以然。在今后的学习过程中,要更加将自己看懂流程图,理解流程图并动手设计流程图融汇起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值