zoukankan      html  css  js  c++  java
  • 第六章函数与宏定义

    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.实验练习:

    1.问题描述:

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

       其中n为对区间[a,b]的等分数。要求该函数在一个独立的文件中.
    (2)编制一个主函数以及计算被积函数值的函数f(x),在主函数中调用(1)中的函数sab(a,b,n)计算并输出下列积分值

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

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

    (4)要求画出模块sab()的流程图。
      方法说明:
     设定积分为:

    则复化梯形求积公式为:

    其中

    2.流程图:

    3.实验代码:

    #include<stdio.h>
    double f(double x);
    double sab (double a,double b,int n)
    {
     double h,result,x1,x2,x3=0,t;
     int k,x;
     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;
    }
    int 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;
    }
    int 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; 
    }

    实验效果:

    问题分析:一开始一股脑全把代码放在同一个文件里也不知道为什么要分开,然后同学告诉我头文件sab.h在两个程序中都要调用,放一起怎么都没用,还要注意是文件都要保存在同一个地方,sab.h中得调用主程序文件中的f()函数,所以在sab.h头文件中还需要对f()函数进行声明,在写代码的过程中,我们还要理解函数,知道它怎么运算,才能准确运行成功。如果真的要把他们放在一个文件,要注意main()函数只能有一个。还有i就是对一个数的定义类型要特别注意,有时候是整型,有时候是双精度等,都要根据情况而改变。

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

     实验代码:

    #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>=0&&x>=0&y>=0)
     {
      result=ack(n,x,y);
      printf("ack(%d,%d,%d)=%d
    ",n,x,y,result);
     }
     else
     {
      printf("error,please input again");
     }
    }

    问题分析:这个题目复杂就在五个递归条件,要知道一步步的含义,递推。还有就是无论在验证时还是书写代码时,要注意英文与中文逗号的区别。不然很可能就因为这么一点小失误导致很结果不对。

    实验效果:

    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
      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.实验练习: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,c;
      c=age(n);
      printf("输出第五位学生的年龄:%d",c); 
     }

    实验效果:

    实验分析:关键写出递归就能解决。

    实验练习3

    编写递归函数实现Ackman函数

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

    其中m、n为正整数。设计程序求Acm(2,1),Acm(3,2)。流程图如下图所示:

     

    实验代码:

    #include<stdio.h>
    acm(int m,int n)
    {
     if(m==0)
     return n+1;
     else if(n==0)
     return acm(m-1,1);
     else if(n>0&&m>0)
     return acm(m-1,acm(m,n-1));
    }
    int main()
      {
      int m,n,c;
      printf("请输入两个数:");
      scanf("%d,%d",&m,&n);
      c=acm(m,n);
      printf("acm(%d,%d)=%d
    ",m,n,c);
      }

    实验效果:

     实验分析:还是递归。。。但是不得不说很多细节问题,还是很得小心。

    三、实验小结

    怎么说呢,我感觉c语言越来越有挑战性了。自己还是有很多不足,很多细节问题虽然犯了很多次错误,但是还是会继续犯错。这一章主要还是要学会函数调用与递归。

  • 相关阅读:
    CSS之旅——第二站 如何更深入的理解各种选择器
    CSS之旅——第一站 为什么要用CSS
    记录一些在用wcf的过程中走过的泥巴路 【第一篇】
    asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result
    asp.net mvc 之旅—— 第一站 从简单的razor入手
    Sql Server之旅——终点站 nolock引发的三级事件的一些思考
    Sql Server之旅——第十四站 深入的探讨锁机制
    Sql Server之旅——第十三站 对锁的初步认识
    Sql Server之旅——第十二站 sqltext的参数化处理
    Sql Server之旅——第十一站 简单说说sqlserver的执行计划
  • 原文地址:https://www.cnblogs.com/wangzhilin/p/10909384.html
Copyright © 2011-2022 走看看