第六章 函数与宏定义
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、考试临近会把书本看一遍,一些定义知识要理解什么意思。