第六章 函数与宏定义

C程序设计实验报告

实验项目:函数与宏定义

   姓名:米思琪 实验地点:实验时间:5.27

一、实验目的与要求

1、掌握函数的定义方法和调用规则。

2、了解局部变量和全局变量的作用域及它们与存储分类的关系,理解变量的存在性和可见性的概念。

3、熟悉递归函数。

4、正确使用函数的返回值及其类型。

二、实验内容

1、实验练习:6.3.1练习三

问题的简单描述:

编写程序,从键盘输入两个整数,调用gcd()函数求它们的最大公约数,并输出结果。

实验代码:

#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;
} 
int main()
{
	int x,y;
	int fac;
	printf("输入两个整数:\n");
	scanf("%d,%d",&x,&y);
	fac=gcd(x,y);
	printf("The great common divisor is %d",fac);
 } 

问题分析:

按照教材上的思路,进行算法。在函数的交换和辗转相除法出现问题,不明白怎么交换。

2、实验练习:6.3.2练习一

问题的简单描述:

若正整数 A 的所有因子( 包括 1 但不包括自身,下同)之和为 B ,而 B 的因子之和为 A,则称 A 和 B 为一对亲密数。例如,6的因子之和为1+2+3=6,因此6与6为一对亲密数。求出500以内的所有亲密数对。

实验代码:

#include<stdio.h>
int facsum(int m)
{
	int sum=1,f=2;
	while(f<=m/2)
	{
		if(m%f==0)
		sum=sum+f;
		f++;
	}
	return sum;
}
main()
{
	int m=3,n,k;
	while(m<=500)
	{
		n=facsum(m);
		k=facsum(n);
		if(m==k&&m<=n)
		printf("%d,%d\n",m,n);
		m++;
	}

问题分析:

要先知道亲密度函数的意思,后看流程图写代码。

3、实验练习:6.3.3练习一

问题的简单描述:

编写程序,分别从键盘输入数据x和y,计算x的y次幂并输出。

实验代码:

#include<stdio.h>
long getpower(int x,int y)
{
	if(y==1)
	return x;
	else if(y>=2)
	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("%d^%d=%ld\n",num,power,answer);
 }

问题分析:

不熟悉递归函数,练习起来很困难,消耗较多时间。

4、实验练习:6.3.3练习三

问题的简单描述:

定义递归函数:当m=0时,Acm(m,n)=n+1;当n=0时,Acm(m,n)=Acm(m-1,1);当n>0且m>0时,Acm(m,n)=Acm(m-1,Acm(m,n-1);
其中,m、n为正整数。设计程序求Acm (2,1)和Acm (3,2)。

实验代码:

#include <stdio.h>
Acm(int m,int n)
{
	unsigned a;
	if(m==0)
	a=n+1;
	if(n==0)
	a=Acm(m-1,1);
	if(m>0&&n>0)
	a=Acm(m-1,Acm(m,n-1));
	return a;
}
void main()
{
	unsigned int s1,s2;
	s1=Acm(2,1);
	s2=Acm(3,2);
	printf("输出Acm(2,1)值:%d\n",s1);
	printf("输出Acm(3,2)值:%d\n",s2);
}

问题分析:

需要用到递归函数,if语句,函数的调用和定义,综合起来很困难很麻烦。

三、什么是辗转相除法

百度处摘要:

欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。欧几里得算法和扩展欧几里得算法可使用多种编程语言实现。

四、实验小结

收获:
经过多次练习,对代码的定义与调用和局部变量全局变量等定义有了解,仅仅是了解还不是很熟悉。
不足:
1、对递归函数很不熟练,甚至定义有时候也不明白
2、有些程序自己打不出来,看答案就能打出来,看完后知道代码大概是什么意思,但是自己再打的时候还是不知道

五、近期个人学习小结

1、喜欢动脑思考代码,虽然大多数也写不出来。
2、对c语言有兴趣,但平时不太主动打代码,大多数都在上实验课的时候才会打,遇到不会的还容易放弃。
3、考试临近会把书本看一遍,一些定义知识要理解什么意思。

posted @ 2021-06-03 16:48  飒廲  阅读(111)  评论(1编辑  收藏  举报