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

    C程序实验报告

    实验项目:

    2、模块化程序设计

    3、函数的递归调用

    姓名:陈福洲  实验地点:教学楼514教室  实验时间:2019.5.16

    一、实验目的与要求

    2、模块化程序设计

    目的:掌握C语言中定义函数的方法;掌握通过“值传递”调用函数的方法。

    3、函数的递归调用

    目的:在递归函数中,使用数字1作为回归条件;使用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,Xk=a+kh。流程图如下:

    (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;
    }
    /*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_2.cpp*/
    #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(a,b,n)=%f",result);
        return 0;
    }

    运行结果:

    (3)问题分析:这个实验有些复杂,基本是靠书上的流程图补充出来的。还有就是刚开始像老师说的那样,直接把代码打在了同一个程序里,程序运行出错。在老师的提醒下,我把它分成了3个文件,还有将输出精度该成lf%,才得到答案。

    实验练习3:计算Ackerman函数。

    (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函数的定义如下:
    1n,x,y为非负整数,且

    流程图如下图所示:

    (2)实验代码:

    #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 a,b,c,result;
        printf("please enter three numbers:");
        scanf("%d%d%d",&a,&b,&c);
        if(a<0||b<0||c<0)
            printf("sory,you enter the wrong numbers!");
        else
        {
            result=Ack(a,b,c);
            printf ("Ack(%d,%d,%d)=%d
    ",a,b,c,result);
        }
    }

    运行结果:

    (3)问题分析:无。

    2、函数的递归调用(6.4.3)

    实验练习1:编写计算x的y次方的递归函数getpower(int x,int y),并在主程序中实现输入输出。

    (1)问题的简单描述:编写程序,分别从键盘输入数据x和y,计算x的y次幂并输出。

    流程图如下:

    (2)实验代码:

    #include<stdio.h>
    long getpower(int x,int y)
    {
        if(y==1)
        return x;
        else 
        y=x*getpower(x,y-1);
    }
    main()
    {
        int num,power;
        long answer ;
        printf("please enter a integer:
    ");
        scanf("%d",&num);
        printf("请输入幂次方:
    ");
        scanf("%d",&power);
        answer=getpower(num,power);
        printf("结果是:%ld
    ",answer);
    }

    运行结果:

    (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,c;
        c=age(n);
        printf("%d",c);
    }

    运行结果:

    (3)问题分析:无。

    实验练习3:编写递归函数实现Ackman函数

    (1)问题的简单描述:

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

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

    流程图:

    (2)实验代码:

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

    运行结果:

    (3)问题分析:无。

    三、实验总结

    首先进一步了解了递归函数的调用,还用到了if语句,其次还是认为细心很重要,在实验6.4.2(3)中,仅因为少了一个字母程序没有报错,但是得不出结果,检查用了很多时间。还有就是用word画流程图画的好慢而且不标准,还是对键盘的使用不熟悉,要继续努力!

  • 相关阅读:
    spring mvc给参数起别名
    聊聊分布式定时任务中间件架构及其实现--转
    Batch Normalization的算法本质是在网络每一层的输入前增加一层BN层(也即归一化层),对数据进行归一化处理,然后再进入网络下一层,但是BN并不是简单的对数据进行求归一化,而是引入了两个参数λ和β去进行数据重构
    终端安全工具 gartner 排名
    When Cyber Security Meets Machine Learning 机器学习 安全分析 对于安全领域的总结很有用 看未来演进方向
    DNS隧道之DNS2TCP实现——dns2tcpc必须带server IP才可以,此外ssh可以穿过墙的,设置代理上网
    DNS隧道之DNS2TCP使用心得教程——是可以用来穿透qiang的,ubuntu下直接apt install dns2tcp
    DNS隧道工具汇总——补充,还有IP over DNS的工具NSTX、Iodine、DNSCat
    Data Mining and Machine Learning in Cybersecurity PDF
    ES failed to notify ClusterStateListener java.lang.IllegalStateException: environment is not locked
  • 原文地址:https://www.cnblogs.com/0219cfz/p/10887006.html
Copyright © 2011-2022 走看看