第四次实验报告

C语言实验报告

实验项目:函数与宏定义实验。
姓名:杨康 实验地点:一教524 实验时间:2021.5.27

一、实验目的及要求。

1.掌握函数与宏定义的具体概念。
2.掌握函数的定义及调用。
3.能够熟练的使用DevC++,进行调试发现错误。
4.理解宏的概念,掌握定义无参宏和有参宏的方法;
5.理解文件的概念,并掌握其用法;
6.理解内部函数和外部函数,掌握外部函数的编译方法和连接方法;

二、实验内容

1.实验6.3.1-3
1.问题描述:编写程序,从键盘中输入两个数,调用gcd函数求它们的最大公约数,并输出结果。
2.实验代码:

#include<stdio.h>
int gcd(int a,int b)
{
	int temp;
	int remainder;
	if(a<b)
	{
		int t=a;
		a=b;
		b=t;
	 } 
	    remainder=a%b;
	 while(remainder!=0)
	 {
	 	remainder=a%b;
	 	a=b;
	 	b=remainder;
	 }
	 return a;
}	
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);
}

问题分析:这个实验使用了辗转相除法以及函数的调用,在函数用if语句来判断a,b的大小,并让其相除,取余数为0,最后得到最大公约数。
2.实验6.3.1-4
问题描述:输出图案
实验代码:

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

问题描述:构建if语句时注意究竟是小于还是小于等于。
3.实验6.3.1-2
问题描述:构建n的阶乘
实验代码:

#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);
	}
} 

问题分析:注意变量的静态存储类型static,定义局部变量时,局部变量的值将被保留,若定义时没有赋初值,则系统会自动为其赋0值,该题定义累乘积为long,初始值为1.
4.实验6.3.2-3
问题描述:计算Ackerman函数的递归函数Ack(n,x,y)
实验代码:

#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("Please put n,x,y:");
	scanf("%d,%d,%d",&n,&x,&y);
	if(n<0||x<0||y<0)
	{
	printf("ERROR\n");
	}
	result=Ack(n,x,y);
	printf("Ack(%d,%d,%d)=%d",n,x,y,result);
}

问题分析:注意if···else的配对并且当数据出错是要有出错提示

三、辗转相除法

 辗转相除法,又被称为欧几里德(Euclidean)算法, 是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。
  两个数的最大公约数是指能同时整除它们的最大正整数。辗转相除法的基本原理是:两个数的最大公约数等于它们中较小的数和两数之差的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为252 − 105 = 147,所以147和105的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。这时,所剩下的还没有变成零的数就是两数的最大公约数。由辗转相除法也可以推出,两数的最大公约数可以用两数的整数倍相加来表示,如21 = 5 × 105 + (−2) × 252。这个重要的等式叫做贝祖等式(Bézout's identity)。
  辗转相除法法原先只用来处理自然数,但在19世纪,辗转相除法被推广至其他类型的数,如高斯整数和一元多项式。另外,还被用来解决丢番图方程(Diophantine equations)和构造连分数等。

四、实验小结

1.本节课了解并学会了辗转相除法的使用,并对递归函数等有了更深入的了解与使用
2.不足在于不可以看到的第一眼就知道如何解决问题和经常会出现一些小问题

五、学习计划

多看以前的内容,多翻课本,把书上的习题做一遍

posted @ 2021-06-03 19:24    阅读(69)  评论(1编辑  收藏  举报