函数与宏定义实验报告

实验项目:

姓名:胡思思 实验地点:一教524 实验时间:2021.5.18

一.实验目的与要求

<1>掌握函数的定义方法和调用规则;
<2>掌握在C语言程序中主调函数和被调用函数之间进行数据传递的规则;
<3>了解函数的返回值及其类型,并正确使用它;
<4>了解局部变量和全局变量的作用域及它们与存储分类的关系,理解变量的存在性和可见性的概念;
<5>练习递归函数的使用;
<6>理解宏的概念,掌握定义无参宏和带参宏的方法。了解文件包含的概念,掌握其用法;
<7>理解内部函数和外部函数,了解外部函数的编译和连接方法。

二.实验内容

1.实验练习:6.3.1实验2

1.1问题的简单描述:编写程序,求出从主调函数传来的数值i的阶乘值,然后将其传回主函数并输出。
1.2实验代码:

#include"stdio.h"
#define N 5
long function(int i)
{
	static long f=1;
	f=f*i;
	return f;
}
main()
{
	long product;
	int i;
	for(i=1; i<=N; i++)
	{
		product=function(i);
		printf("%d的阶乘是:%d\n",i,product);
	}
}

运行结果:

1.3问题分析:刚开始对定义符号常量认识不清楚后来通过看前面的知识弄懂了。

2.实验练习:6.3.1实验3

2.1问题的简单描述:编写程序,从键盘输入两个整数,调用gcd()函数求它的最大公约数,并输出结果
2.2实验代码:

#include<stdio.h>
int gcd(int a,int b)
{
	int temp;
	int remainder;
	if(a<b)
	{
		temp=a;a=b;b=temp; 
	}
	remainder=a%b;
	while(remainder!=0)
	{
		a=b;
		b=remainder;break; 
	}
	return b;
}
main()
{
	int x,y;
	int fac;
	printf("please input two integers:\n");
	scanf("%d,%d",&x,&y);
	fac=gcd(x,y);
	printf("The great common divisor is:%d",fac);
}

运行结果:

2.3问题分析:(1)刚开始代码运行不出来,并检查代码发现代码中少了braek才导致的结果;
(2)运行代码是没注意这两个“%d%d”之间没“,”跟着书上打发现代码运行的结果和书上的不吻合,后经过检查才发现这一细节。

3.实验练习:6.3.1实验4

3.1问题的简单描述:输入整数,输出高度为n的等边三角形。
3.2实验代码:

#include<stdio.h>
void trangle(int n)
{
	int i,j;
	for (i=0;i<=n;i++)
	{
		for(j=i;j<=n;j++)
		printf(" ");
		for(j=0;j<=2*i;j++)
		printf("*");
		putchar('\n');
	}
}
main()
{
	int n;
	printf("请输入一个整数:\n");
	scanf("%d",&n);
	printf("\n");
	trangle(n);
}

运行结果:

3.3问题分析:通过这个代码对函数的调用认识更深。

4.实验练习:

4.1问题的简单描述:6.3.2实验3
(1)根据方法说明,编制计算Ackerman函数的递归函数Ack(n,x,y)。
(2)编写一个主函数,由键盘输入n、x、y,调用(1)中的函数Ack(n, x, y),计算Ackerman函数。
(3)在主函数中,输人之前要有提示,并检查输人数据的合理性,若输人的数据不合理,则输出出错信息。输出要有文字说明。
(4)输入(n, x, y)= (2,3,1)并运行该程序。然后自定义几组数据,再运行该程序。
4.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
	a=Ack(n-1,Ack(n,x,y-1),x);
	return a;
 } 
void main()
{
	int n,x,y,result;
	printf("请输入n,x,y的值:\n");
	scanf("%d %d %d",&n,&x,&y);
	while(n<0||x<0||y<0)
	{
	printf("输入错误,请重新输入:");
	scanf("%d %d %d",&n,&x,&y);
}


        result=Ack(n,x,y);
	printf("Ack(%d,%d,%d)=%ld\n",n,x,y,result);
}

运行结果:

4.3问题分析:对函数的调用不是很熟悉导致代码运行有误

三、什么是辗转相除法

在数学中,辗转相除法,又称欧几里得算法(Euclidean algorithm),是求取最大公约数的一种算法。辗转相除法首次出现于欧几里得的《几何原本》中的第Ⅶ卷,书中的命题ⅰ和命题ⅱ所描述的就是辗转相除法,而在中国,辗转相除法最早出现在《九章算法》中。辗转相除法之所以有效是因为其基于一个核心原理,即:两个数的最大公约数等于其中较小的数字和二者之间余数的最大公约数。

四、实验小结:

1.通过这次实验对函数概念的理解更加清楚;
2.对一些式子的计算掌握清楚;
3.对函数的调用通过实践更加了解;
4.并且对一些公式的运用也更加清楚;
5.掌握了定义函数的方法
6.对递归函数也有了一定的了解

五、近期个人学习小结

1.收获:通过C语言的理论课程和实验课程对C语言的了解逐步加深,从刚开始对代码的不熟悉和理解到现在对代码有了一定的认识,通过实验课了解到了更多的函数;
2.不足:打代码时会出现卡顿,对一些基本常识认识不深,有时还会因为自己的粗心而使代码运行错误;
3.在接下来的复习日子里打算先把课本知识熟悉一遍再看看以前打过的代码从而加深印象,并多加练习打代码。

posted @ 2021-06-06 23:53  SSOY  阅读(138)  评论(0编辑  收藏  举报