zoukankan      html  css  js  c++  java
  • 第六章 函数和宏定义实验(2)

    C程序设计实验报告

    实验项目:

    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),并在主程序中实现输入输出

    • 写出解决该问题的递归算法:
    • 在递归函数中,使用数字1 作为回归条件;
    • 在递归函数中,使用 if_else 语句根据条件的真假来决定是递推还是回归。

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

    • 写出解决该问题的递归算法:
      递归公式如下,根据公式容易写出递归程序。
    • 在递归函数中,使用数字1 作为回归条件;
    • 在递归函数中,使用if_else语句根据条件的真假来决定是递推还是回归。

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

      • 根据递归公式编写递归函数;
      • 在递归函数中,使用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()的流程图。
    方法说明:
    设定积分为:

    则复化梯形求积公式为:

    其中

    2.流程图:

     3.实验代码:

    /*sab.h*/
    #include<stdio.h> double f(double x); double sab(double a, double b,int n) { int k; 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; 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 input double a,b and integer 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;
    }
    #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 input double a,b and integer 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;
    }

    4.问题分析:要注意三个文件要分开放的,而且头文件sab.h在两个程序中都要调用,一开始我就是按照课本的格式输入代码,但怎么都没用,原来我是没有对其进行重命名,还要注意是文件都要保存在同一个地方,如果把他们放在一个文件,要注意main()函数只能有一个。

    5.运行效果:

    对应的示例输出:

    对应的示例输出:

    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;
        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 a;
    }
    main()
    {
        int n,x,y,result;
        printf("please input n,x,y:");
        scanf("%d,%d,%d",&n,&x,&y);
        if(n&&x&&y<0)
        printf("error!");
        else
        result=Ack(n,x,y);
        printf("Ack(%d,%d,%d)=%d
    ",n,x,y,result);
        
    }

    4.问题分析:我第一次写代码的时候不会表达进一步的递推,怎么都运行不出来,后来琢磨了一下,发现自己少了一步用renturn进行进一步的递推,在后面就是关于函数的调用不太熟练。

    5.运行效果:

    3.实验练习:6.4.3.1

    1.问题描述:

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

    2.流程图:

     3.实验代码:

    #include<stdio.h>
    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",answer);
    }

    4.问题分析:根据课本没有很大难度,但我们还是应该注意到%d和%ld有啥区别,这样我们以后就不会犯类似的小问题了。

    4.实验练习: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 a,n=5;
        a=age(n);
        printf("第%d位同学的年龄为%d",n,a);
    }

    4.问题分析:无

    5.运行效果:

    5.实验练习:6.4.3.3

    1.问题描述:

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

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

    2.流程图:

     3.实验代码:

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

    4.问题分析:题目已经给出了Acm函数的定义,而且我们前面也做过类似的问题,我们一开始也可以先定义一个字母来代替Acm函数,然后用if语句就可以了。

    5.运行效果:

    三、实验小结

         这次的实验我主要就是掌握了函数的调用,我们在很多地方都需要用到函数的调用,所以这是很重要的,递归函数同时要用if语句分情况讨论,在写的时候注意不要落下某一种情况,在写递归函数的时候,有时候几个程序都要调用一个函数,那么就可以把它独立的放到一个文件中;还有就是对于进一步递推,我们要会用代码去实现。

  • 相关阅读:
    进程池,线程池,协程,gevent模块,协程实现单线程服务端与多线程客户端通信,IO模型
    线程相关 GIL queue event 死锁与递归锁 信号量l
    生产者消费者模型 线程相关
    进程的开启方式 进程的join方法 进程间的内存隔离 其他相关方法 守护进程 互斥锁
    udp协议 及相关 利用tcp上传文件 socketserver服务
    socket套接字 tcp协议下的粘包处理
    常用模块的完善 random shutil shevle 三流 logging
    day 29 元类
    Django入门
    MySQL多表查询
  • 原文地址:https://www.cnblogs.com/Angle1998----/p/10919993.html
Copyright © 2011-2022 走看看