第六章 实验报告(函数与宏定义)
C程序设计实验报告
实验项目:函数与宏定义(第6章)
姓名:李宏远 实验地点:一教524 实验时间:5月27日
一、实验目的与要求
1、熟练函数的定义方法和调用规则。
2、掌握在C语言程序中主调函数和被调用函数之间进行数据传递的规则。
3、了解函数的返回值及其类型,并正确使用。
4、了解局部变量和全局变量的作用域及它们与存储分类的关系,理解变量的存在性和可见性的概念。
5、练习递归函数的使用。
6、理解宏的概念,掌握定义无参宏和带参宏的方法。
7、了解文件的概念,掌握其用法。
8、理解内部函数和外部函数,了解外部函数的编译和连接的方法。
二、实验内容
1、实验练习:
1问题的简单描述:编写函数,求出从主调函数传来数值的阶乘值,然后传回主调函数并输出。
2实验代码:
#include"stdio.h"
#define N 5
long function(int i)
{
static int f = 1;
f = f * i;
return f;
}
void main()
{
long product;
int i;
for(i=1; i<=N; i++)
{
product=function(i);
printf("%d!=%ld\n", i, product);
}
}
3问题分析:数字不断相乘并输出,计算乘阶。题目中的N被固定为5,若是继续扩展,可以把N设的更大,以及考虑如何使用进位方法记录长数字。
2、实验练习:
1问题的简单描述:编写程序,输入两个整数,调用函数求它们的最大公约数,并输出结果。
2实验代码:
#include<math.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;
remainder=a%b;
}
return b;
}
main()
{
int x,y;
int fac;
printf("请输入两个整数");
scanf("%d,%d",&x,&y);
fac=gcd(x,y);
printf("The great common divisor is:%d",fac);
}
3问题分析:设计一个函数,使用辗转相除法求两个数的最大公约数。难点在于辗转相除法输出的数为b,循环结束的判定为“a%b=0”。
3、实验练习:
1问题的简单描述:输入整数n,设计函数,输出高度为n的等边三角形。
2实验代码:
#include <stdio.h>
void trangle(int n)
{
int i,j;
for (i=0;i<n;i++)
{
for (j=0;j<n-i;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问题分析:难点在于设计循环输出空格和星号的函数。实际上输出的图形好像不等边,可以扩展。
4、实验练习:
1问题的简单描述:设计函数,若A的所有因子之和为B,且B的所有因子之和也为A,那么称A与B为一对亲密数,求500以内的所有亲密数对。
2实验代码:
#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)
{
k=facsum(m);
n=facsum(k);
if(n==m&&m<=k)
printf("%d,%d \n",m,k);
m++;
}
}
3问题分析:求因数合,并将因数合结果的因数合与自身比对,若相等,则输出,因为结果不能重复,因此要求m要小于k。
三、什么是辗转相除法:
辗转相除法又称欧几里得算法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。
计算公式:gcd(a,b)=gcd(b,a mod b)。——摘自百度百科
四、实验小结:
收获:经过长时间的练习,出现基础错误的次数明显减少,学会了函数和宏定义,可以实现更多,更复杂的程序运算。
不足:遇到新算法时需要反复研究才能明白其用法,单词的拼写仍不熟练。
五、近期个人学习小结:
无主张复习内容,课堂作业扩展深度普遍较低。无主张复习倾向。