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)计算并输出下列积分值

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

    同样要求主函数与函数f(x)在同一文件中。
    (4)要求画出模块sab()的流程图。
    方法说明:
    设定积分为

    则复化梯形求积公式为

    其中h=(b-a)/n,Xk=a+kh

    2、流程图:

    3、实验代码:

    (1)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;/***求h的值***/ 
    	x1=f(a);/***求f(a)的值***/ 
    	x2=f(b);/***求 f(b)的值***/
    	for(k=1;k<=n-1;k++) /***for循环的循环体***/ 
    	{
    		t=a+k*h;
    		x3=x3+f(t); /***求 hf(xk)值***/ 
    	}
    	result=h*(x1+x2)/2+h*x3;/***最终的值存入result中***/ 
    	return result;
    }
    

      (2)6.4.2-1

    #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:");/***提示输入a,b,n***/ 
    	scanf("%lf%lf%d",&a,&b,&n);/***输入a,b,n***/ 
    	result=sab(a,b,n);/***调用sab(a,b,n)求积分***/ 
    	printf("sab(%lf,%lf,%d)=%f",a,b,n,result);/***输出结果***/ 
    	return 0;
    }
    
     (3)6.4.2-2
    #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:");/***提示输入a,b,n***/ 
    	scanf("%lf%lf%d",&a,&b,&n);/***输入a,b,n***/ 
    	result=sab(a,b,n);/***调用sab(a,b,n)求积分***/ 
    	printf("sab(%lf,%lf,%d)=%f",a,b,n,result);/***输出结果***/ 
    	return 0;
    }
    

    4、运行结果

    5、问题分析:

    三个文件要分开放的,头文件sab.h在两个程序中都要调用,开始时文件命名出错,一直找不到问题,后来经他人提醒才发现问题。还有就是%f和%lf之间有区别。

    2.计算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函数的定义如下:

    n,x,y为非负整数,且

    2.流程图:

    3、实验代码

    #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)
    		return a=ack(n-1,ack(n,x,y-1),x);
    		return a;
    }
    main()
    {
    	int n,x,y,r;
    	printf("请输入n,x,y:");/***提示输入n,x,y***/ 
    	scanf("%d%d%d",&n,&x,&y);/***输入a,b,n***/ 
    	if(n<0||x<0||y<0)
    	{ 
    		printf("请输入正整数
    ");
    		scanf("%d%d%d",&n,&x,&y);/***输入a,b,n***/ 
    	} 
        r=ack(n,x,y);
    	printf("ack(%d,%d,%d)=%d
    ",n,x,y,r);/***输出结果***/
     } 
    

    4、运行结果

    5、问题分析:

    根据流程图进行,主要是注意if条件的判断。

    3、编写计算x的y次幂的递归函数getpower(int x,int y),并在主程序只能怪实现输入输出

    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);/***输入一个整数***/ 
    	if(num!=int(num))
    	{
    		printf("输入错误,请重新输入
    ");
    		scanf("%d",&num);
    	}
    	printf("请输入幂次方:");/***提示输入幂次方***/ 
    	scanf("%d",&power);/***输入一个整数***/ 
    	if(power!=int(power))
    	{
    		printf("输入错误,请重新输入
    ");
    		scanf("%d",&power);
    	}
    	answer=getpower(num,power);
    	printf("结果是:%ld
    ",answer);
     } 
    

    4、运行结果

    5、问题分析:

    主要是根据流程图进行,但我的还不能提示错误之后继续很好的进行。

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

    1、问题的简单描述:

    用递归方法计算学生的年龄。已知第一位学生年龄最小为10岁,其余学生一个比一个大2岁,求第5位学生的年龄。

    2、流程图如下:

    3、实验代码:

    #include <stdio.h>
    int age(int n)
    {
    	int c;
    	if(n==1)
    		c=10;
    	else
    	if(n>1)
    		c=age(n-1)+2;
    		return c;
    }
    main()
    {
    	int n=5,nl;
    	nl=age(n);
    	printf("第五位学生年龄:%d
    ",nl);
    }
    

    4、运行结果:

    5、问题分析:

    进行下一步递推,将调用函数的结果放进去。

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

    1、问题的简单描述:

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

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

    2、程序流程图如下

    3、实验代码:

    #include <stdio.h>
    acm(int m,int n)
    {
    	if(m==0)/***判断回归条件的if语句头部***/ 
    		m=n+1;
    	else
    	if(n==0)
    		m=acm(m-1,1);/***进一步递推的语句***/ 
    	else
    	if(n>0&&m>0)
    		m=acm(m-1,acm(m,n-1));
    }
    int main()
    {
    	int m,n,x,y;
        printf("请输入 m,n:");
        	scanf("%d%d",&m,&n);
        printf("请输入 x,y:");
        	scanf("%d%d",&x,&y);
        printf("acm(%d,%d)=%d
    ",m,n,acm(m,n));
        printf("acm(%d,%d)=%d",x,y,acm(x,y));
        return 0; 
    }
    

    4、运行结果:

    5、问题分析:

    根据前面两题可以很轻松的做出来;

    三、实验小结

    1、在6.4.2-2中知道了对于另外文件的调用,在函数头部进行声明。

    2、加强了if语句的熟练,和递归函数的调用。

  • 相关阅读:
    2016"百度之星"
    codeforces 55 div2 C.Title 模拟
    codeforces 98 div2 C.History 水题
    codeforces 97 div2 C.Replacement 水题
    codeforces 200 div2 C. Rational Resistance 思路题
    bzoj 2226 LCMSum 欧拉函数
    hdu 1163 九余数定理
    51nod 1225 余数的和 数学
    bzoj 2818 gcd 线性欧拉函数
    Codeforces Round #332 (Div. 2)D. Spongebob and Squares 数学
  • 原文地址:https://www.cnblogs.com/zsflhm/p/10891800.html
Copyright © 2011-2022 走看看