第六章实验报告(2)

C程序设计实验报告

实验项目:

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

6.4.2.3、编计算Ackerman函数

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

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

6.4.3.3、编写递归函数下hi先Ackerma函数

姓名:钟俊敏    实验地点:教学楼514教室     实验时间:5月16日

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

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

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

6.4.2.3、计算Ackerman函数

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

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

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

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

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

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

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

●写出解决该问题的递归算法递归公式如下,根据公式容易写出递归程序
●在递归函数中,使用数字1作为回归条件

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

6.4.3.3、编写递归函数下hi先Ackerma函数

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

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

二、实验内容

1、实验练习(6.4.2.2):

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,x=a+kh 。流程图如图6-6所示。

2.实验代码:

/*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,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<stdio.h>
#include<math.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(%f,%f,%d)=%f",a,b,n,result);
    return 0;
}
/*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,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>
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;
}

3.问题分析:

a、主要的问题:首先这个程序的最主要的问题是关于头文件名和文件的调用问题。

解决方法:一开始不知道#include“sab.h”是对函数文件的调用,导致程序运行的时候一直报错,然后将其删除之后这个问题就没有了。在李哥的指导下我才真正了解这个头文件的真正用法。这种用法其实就是实现了函数的调用,如果很多的程序中都需要用到该文件以及算法,就可以直接引用该文件,就能够更简便的运用。

b、程序运行如下:

2、实验练习(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为非负整数,且

2.程序流程图:

3.实验代码:

#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 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("请输出符合条件的数");
    else
    {
    result=Ack(n,x,y);
    printf("Ack(%d,%d,%d)=%d\n",n,x,y,result);
     }
}

4.问题分析:

a、这个程序遇到的主要是之前运行出来的结果都是ack(2.3.1)=0,然后经过检查之后然后改动代码后发现出不来结果。这也是我经常犯的错误,if中输入的不是判断语句,经常只有一个=,而if中两个=才表示判断。最后还有一个小小的问题就是如何在提示输入错误的信息出来后,能够不关闭程序,继续输入想要的数字。

b、程序运行如下:

3、实验练习(6.4.3.1):

1.问题的简单描述:

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

2.程序流程图:

3.实验代码:

#include"stdio.h"
long getpower(int x,int y)
{
    if(y==1)
    y=x;
    else
    y=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.问题分析:

a、这个程序遇到的主要问题还是如何判断输入的数是正确的以及如何调出循环,之前都是定式思维,想着如何用一个while语句实现,之后经过老师的提醒想到可以直接用一个if语句结局这个问题,就是直接在程序之前就判断输入的数是否正确,如果正确的话就引用函数,如果输入错误的话就直接提示输入错误。这样相比于while就更加的简便。也解决了输入的是符号的问题。

b、程序运行如下:

3、实验练习(6.4.3.2):

1.问题的简单描述:

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

2.程序流程图:

3.实验代码:

#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,m;
    m=age(n);
    printf("第五位学生的年龄为:%d",m);
}

4.问题分析:

a、这个程序主要用的还是一个递归思想,通过引用的函数的循环加上数值的设定,一步一步将结果的出,10+2+2+2+2=18.

b、程序运行如下:

3、实验练习(6.4.3.3):

1.问题的简单描述:

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

2.程序流程图:

3.实验代码:

#include<stdio.h>
int acm(int m,int n)
{
    if(m==0)
    return n+1;
    else if(n==0)
    return acm(m-1,1);
    else
    return acm(m-1,acm(m,n-1));
}
int main()
{
    int s,b;
    s=acm(2,1);
    printf("acm(2,1)=%d\n",s);
    b=acm(3,2);
    printf("acm(3,2)=%d\n",b);
}

4.问题分析:

a、这个程序最大的问题就是看懂该函数,了解递归思想。

b、程序运行如下:

三、实验小结

这次实验总共做了5个实验,其中有三个实验是关于递归函数的实验。我在这次实验中的最大收获是弄懂了程序的头文件以及在不同的文件中对函数的调用。我可以引用#include“文件名”,这个可以实现对函数的直接引用。其次就是了解到了递归思想,而递归思想主要的难度就是在函数的定义上面。想要更好的实现递归函数就得看得懂算法,而这次实验中,我确实还有挺多的算法没有弄明白,这几个程序都是通过题目给的流程图来完成,没有真正的对算法进行进一步的思考。所以之后得慢慢的学会自己编写流程图,还得努力。

原文地址:https://www.cnblogs.com/zjm956/p/10874739.html

时间: 2024-10-12 05:02:00

第六章实验报告(2)的相关文章

第六章 实验报告 (函数与宏定义)

C程序设计实验报告 实验项目: 6.4.1.1编写由三角形三边求面积的函数 6.4.1.2编写求N的阶层 6.4.1.3求两个整数的最大公约数 6.4.1.4打印输出的指定图形 6.4.2.1模块化程序设计 姓名:杨婷 实验地点:教学楼514教室 实验时间:2019年4月30日 一.实验目的与要求 <1>6.4.1.1编写由三角形三边求面积的函数 调用area()函数求三角形的面积 在求面积函数中运用海伦公式 <2>6.4.1.2编写求N的阶层 定义符号常量 使用长整型变量存放累乘

第六章实验报告

C程序设计实验报告 实验项目: 函数和宏定义实验 姓名: 王雨晴 实验地点: 514物联网实验室 实验时间:2019年4月30日 一.实验目的和要求 1.掌握函数的定义方法和调用规则. 2.掌握C语言程序中主调函数和被调用函数之间进行数据传递的规则. 3.了解函数的返回值及其类型,并正确使用它. 4.了解局部变量和 全局变量的作用域及它们与储存分类的关系,理解变量的存在性和可见性的概念. 5.练习递归函数的使用. 6.理解宏观的概念,掌握定义无参宏和带 参宏的方法.了解文件包含的概念,掌握其用法

第六章 实验报告(函数与宏定义)2

C程序设计实验报告 实验项目:函数和宏定义实验 姓名:罗子健 实验地点:物联网实验室 实验时间:2019年5月16日 一.实验目的与要求 (1)掌握函数定义方法和调用规则. (2)掌握在C语言程序中主调函数和被调用函数之间进行数据传递的规则. (3)了解函数的返回值及其类型,并正确使用它. (4)了解局部变量和全局变量的作用域及它们与储存分类的关系,理解变量的存在性和可变性的概念. (5)练习递归函数的使用. (6)理解宏的概念,掌握定义无参宏和带参宏的方法.了解文件包含的概念,掌握其用法. (

第六章 实验报告(函数与宏定义)

实验项目:函数的定义和调用 模块化程序设计 实验练习1:编写由三角形三边求面积的函数 实验目的: 调用area()函数求三角形的面积 在求面积函数运用海伦公式 问题描述:编写程序,从键盘输入三角形的3条边,调用三角形面积函数求出其面积,并输出结果. 程序框图: 程序实现: #include<math.h> #include<stdio.h> float area(float a,float b,float c) { float s,p,area; s=(a+b+c)/2; p=s*

第六章实验报告(函数与宏定义)

实验项目:函数和宏定义实验 姓名:谢丽萍    试验地点:教学楼514教室    实验地点:2019 年4月30日 一.实验目的与要求 1.掌握函数的定义方法和调用规则 2.掌握在c语言程序中主调函数和背调函数之间进行数据传递的规则 3.了解函数的返回值及其类型,并用正确使用它 4.了解局部变量和全局变量的作用域及他们与存储分类的关系,理解变量的存在性和可见性的概念 5.练习递归函数的使用 6.理解宏的概念,掌握定义无参宏和代参宏的方法了解文件包含的概念,掌握其方法 7.理解内部函数和外部函数,

第六次实验报告第二部分

第六章函数和宏定义 姓名:廖云福 实验地点:514教室 实验时间:5.16 一.实验目的与要求 1.模块化程序设计: 6.4.2.2. 利用复化梯形公式计算定积分 掌握C语言中定义函数的方法: 掌握通过"值传递"调用函数的方法. 6.4.2.3. 计算Ackerman函数 掌握递归函数的设计方法: 进一步练习阅读检查与调试修改C程序的方法. 6.4.3.1. 编写计算x的y次幂的递归函数getpower(int x,int y),并在主程序中实现输入输出 写出该函数的递归算法: 在递归

信息安全系统设计第六周实验报告

第六章.储存器层次结构 存储器系统:具有不同容量.成本和访问时间的存储器设备的层次结构.计算机程序的基本属性:局部性.具有良好局部性的程序倾向于一次又一次访问相同的或者邻近的数据项集合,倾向于从存储器层次结构中较高层次处访问数据项,因此运行的更快. 一.存储技术 (1)随机访问存储器(RAM) 静态RAM:用来作为高速缓存存储器,每个位存储在一个双稳态的存储器单元里. 动态RAM:用来作为主存以及图形系统的帧缓冲区. 传统的DRAM: 1.信息通过称为引脚的外部连接器流入/流出芯片,每个引脚携带

第七章实验报告(数组实验)

C语言程序设计实验报告 实验项目: 1.一维数组的应用 2.二维数组的应用 3.字符数组应用 姓名:徐溢璠     实验地点: 514实验室       实验时间:2019年5月29日 一.实验目的与要求 1.一维数组的应用 定义一个一维整型数组,其大小为10,即它能存放10个数据: 使用循环语句,利用随机函数产生10个整数存放在数组中: 编写排序函数sort1(): 使用循环语句,将排好序的10个数依次输出. 2.二维数组的应用 怎样定义和使用二维数组: 怎样用循环进行二维数组中值的计算: 使

第九章实验报告

C程序设计实验报告 实验项目:构造数据类型实验 姓名:罗子健 实验地点:物联网实验室 实验时间:2019年6月26日 一.实验目的与要求 (1)掌握结构体类型说明和结构体类型变量.数组.指针的定义方法及使用. (2)学会引用结构体中的成员. (3)掌握利用指向结构体的指针成员构成链表的基本算法. (4)了解联合体类型和枚举类型的说明.其变量的定义及赋初值的方法. (5)了解联合类型变量中各成员的存储结构,学会引用各成员中的数据. (6)学习正确引用枚举类型常量,了解如何对枚举类型变量进行操作.