函数与宏定义
C程序设计实验报告
实验项目:函数与宏定义
姓名:张依君 实验地点:524 实验时间:2021.5.27
一、实验目的与要求(10分)
1、掌握函数的定义和调用规则
2、掌握在C语言程序中主调函数和被调函数之间进行数据传递的规则
3、了解局部变量和全局变量的作用域及它们与存储分类的关系,理解变量的存在性和可见性的概念
4、理解内部函数和外部函数,掌握外部函数的编译和连接方法
二、实验内容(选择你认为本次实验中最具代表性的4个实验项目进行分析 50分)
1、实验练习:6.5
1问题的简单描述:编写程序,从键盘输入两个整数,调用gcd()函数求它们的最大公约数,并输出结果
2实验代码:
int gcd(int a,int b)
{
int temp;
int remainder;
if(a<b)
{
a=a^b;
b=a^b;
a=a^b;
}
remainder=a%b;
while(remainder!=0)
{
a=b;
b=remainder;
remainder=a%b;
}
return b;
}
main()
{
int x,y;
int fac;
printf("Please input two integers:",x,y);
scanf("%d,%d",&x,&y);
fac=gcd(x,y);
printf("The great common divisor is%d",fac);
3问题分析:首先调用gcd()函数求两个整数的最大公约数,其次使用辗转相除法求两个整数的最大公约数,并且最大公约数函数的类型是整型。
2、实验练习:6.7
1问题的简单描述:求500以内的所有亲密数对
2实验代码:
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问题分析:先定义函数,编制一个facsum(m),返回给定正整数m的所有因子,然后编制主函数,调用函数facsum(),寻找并输出500以内的所有亲密数对
3、实验练习:6.11
1问题的简单描述:用递归方法计算学生的年龄。已知第1位学生的年龄最小为10岁,其余学生一个比另一个大2岁,求第5位学生的年龄。
2实验代码:
int age(int n)
{
int c;
if(n==1)
c=10;
else
c=age(n-1)+2;
return c;
}
main()
{
int n=5,sage;
sage=age(n);
printf("第%d位学生的年龄为%d\n",n,sage);
}
4、实验练习:6.12
1问题的简单描述:设计程序求Acm(2,1)和Acm(3,2)
2实验代码:
Acm(int m,int n)
{
unsigned a;
if(m==0)
a=n+1;
else if(n==0)
a=Acm(m-1,1);
else if(m>0&&n>0)
a=Acm(m-1,Acm(m,n-1));
else return a;
}
main()
{
unsigned int s1,s2;
s1=Acm(2,1);
s2=Acm(3,2);
printf("Acm(2,1)=%d\nAcm(3,2)=%d",s1,s2);
}
3问题分析:一开始运用递归公式编写递归函数时不知如何下手,认真分析了流程图后按着步骤写出来
三、什么是辗转相除法(摘要介绍,并注明出处 10分)
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。
四、实验小结
这次课主要学习了函数定义和函数调用,一开始函数的嵌套调用和递归调用一脸懵逼,对概念不清楚后来在进行了几个试验后有了一定的了解,通过这节课,也学习了什么是辗转相除法,每个实验几乎都运用了循环语句也让自己更熟悉
五、近期个人学习小结(学习收获与不足,计划如何复习,希望老师在哪部分加强训练和给与什么方面的帮助 10分)
这么长时间的学习不仅学习了书本上的理论知识,还通过实验学习了如何敲代码将程序运行出来,在后面的学习感觉自己力不从心,对于第六章的学习不是很能听得懂,自己也应该多看课本巩固知识。