zoukankan      html  css  js  c++  java
  • 第六章

    C程序设计实验报告

    姓名:伍臣林  实验地点: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.流程图:

    代码:

    复制代码
    #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;
    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("%lf
    ",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("a,b,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;
    }
    复制代码

    问题分析:一开始我傻乎乎的将三段代码敲在一起 一脸懵逼 不懂引用外部文件,无法将三个文件联系起来。

    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)
    printf("错误,请重新输入
    ");
    result=Ack(n,x,y);
    printf("Ack(%d,%d,%d)=%d
    ",n,x,y,result);
    }
    复制代码

    问题分析:函数的递归还不是很理解 完成这个题目耗费时间较长!需要熟练递归函数

    3.实验练习: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);
    }
    int 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.流程图:

    代码:

    复制代码
    #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,year;    
    year=age(n);
    printf("%d",year);
    }
    复制代码

    基本没问题

    实验练习3

    编写递归函数实现Ackman函数

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

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

     

    代码:

    复制代码
    #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
    a=Acm(m-1,Acm(m,n-1));
        return a;
    }
    int main()
    {
    printf("Acm(2,1)=%d
    Acm(3,2)=%d
    ",Acm(2,1),Acm(3,2));    
    return 0;
    }
    复制代码

    问题分析:依靠着流程图在正确答案边缘不断试探,稀里糊涂的做着这些题目!

    实验小结:实验课上遇到的难题一个个被攻克的感觉真的好爽!解除困难后的欣喜是藏捏不住的!可真是一门有趣的学科!

  • 相关阅读:
    Educational Codeforces Round 20 D. Magazine Ad
    Educational Codeforces Round 20 C. Maximal GCD
    紫书第三章训练2 暴力集
    Educational Codeforces Round 20 B. Distances to Zero
    Educational Codeforces Round 20 A. Maximal Binary Matrix
    紫书第三章训练1 D
    紫书第一章训练1 D -Message Decoding
    HAZU校赛 Problem K: Deadline
    Mutual Training for Wannafly Union #8 D
    紫书第三章训练1 E
  • 原文地址:https://www.cnblogs.com/wu18151783/p/10920314.html
Copyright © 2011-2022 走看看