zoukankan      html  css  js  c++  java
  • 函数的宏定义(2)

     

    实验项目:

    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语句根据条件的真假来决定是递推还是回归。

    二、实验内容

    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,Xk=a+kh。

    2.程序流程图:

    二、实验内容

    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,Xk=a+kh。

    2.程序流程图:

    二、实验内容

    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,Xk=a+kh。

    2.程序流程图:

    代码:

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

    运行结果:

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

    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、流程图:

    代码:

    #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*//
        return a;
     } 
     main()
     {
         int n,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,x,y,result);
     }

     运行结果:

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

    6.4.3.1

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

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

    2、流程图:

    代码:

    #include<stdio.h>
    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("输入幂次方:");
        scanf("%d",&power);
        answer=getpower(num,power);
        printf("结果是:%ld
    ",answer);
    }

    运行结果:

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

    6.4.3.2

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

    2、流程图:

     

    代码:

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

    运行结果:

    问题分析:问题不大。

    6.4.3.3

    1、问题的简单描述:
    定义递归函数实现下列Ackman函数:

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

    2、流程图:

     代码:

    #include<stdio.h>
    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 f=2,g=1,k=3;
        printf("Acm(2,1)=%d
    Acm(3,2)=%d",Acm(f,g),Acm(k,f));
        return 0;
    }

    运行结果:

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

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

  • 相关阅读:
    LeetCode 461. Hamming Distance
    LeetCode 442. Find All Duplicates in an Array
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode Find the Difference
    LeetCode 415. Add Strings
    LeetCode 445. Add Two Numbers II
    LeetCode 438. Find All Anagrams in a String
    LeetCode 463. Island Perimeter
    LeetCode 362. Design Hit Counter
    LeetCode 359. Logger Rate Limiter
  • 原文地址:https://www.cnblogs.com/Artificial/p/10891521.html
Copyright © 2011-2022 走看看