实验:函数与宏定义
C程序设计实验报告
姓 名:陈庆楚
实验地点:家
实验时间: 2020年4月26日
实验项目:
6.3.1练习1 编写由三角形三边求面积的函数
6.3.1练习2 编写求N阶乘的函
6.3.1练习3 求两个整数的最大公约数
6.3.1练习4 打印输出指定图
6.3.2练习1 求500以内的所有亲密数对
6.3.3练习1 编写x的y次幂的递归函数
6.3.3练习2 编写计算学生年龄的递归函数
一、实验目的与要求
1.熟练地掌握函数的定义方法和调用规则。
2.掌握在C语言程序中主调函数和被调用函数之间进行数据传递的规则。
3.了解函数的返回值及其类型,并正确使用它。
4.了解局部变量和全局变量的作用域及它们与存储分类的关系,理解变量的存在性和可见性的概念
5.练习递归函数的使用
二、实验内容
(1)6.3.1练习1 编写由三角形三边求面积的函数
1、问题的简单描述:编写程序,从键盘输入三角形的3条边,调用三角形面积函数求出其面积,并输出结果。
2、实验代码:
#include<stdio.h> #include<math.h> float area(float a,float b,float c) { float s,p,area; s=(a+b+c)/2; p=s*(s-a)*(s-b)*(s-c); area=sqrt(p); return (area); } main() { float a,b,c,ts; printf("输入三角形的三条边a,b,c:\n"); scanf("%f%f%f",&a,&b,&c); ts=area(a,b,c); if (a+b>c&&a+c>b&&b+c>a) printf("area=%f\n",ts); else printf("Data error!"); }
3、问题分析:海伦公式(设s=(a+b+c)/2,S=√s(s-a)(s-b)(s-c))
(2)6.3.1练习2 编写求N阶乘的函数
1、问题的简单描述:编写函数,求出从主函数传来的数值i阶乘值,然后将其传回主调函数并输出。
2、实验代码:
#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("product=%ld\n",product); } }

3、问题分析:长整形long定义符号ld.
(3)6.3.1练习3 求两个整数的最大公约数
1、问题的简单描述:编写程序,从键盘输入两个整数,调用gcd()函数求他们的最大公约数,并输出结果。
2、实验代码:
#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; remainder=a%b; } return b; } main() { int x,y; int fac; printf("输入整数啊x,y:"); scanf("%d%d",&x,&y); fac=gcd(x,y); printf("The great conmon divisor is :%d",fac); }

3、问题分析:交换两个数设置一个中间变量就可以解决,辗转相除法求两数最大公约数。
(4)6.3.1练习4 打印输出指定图
1、问题的简单描述:输入整数n,输出高度为n的等边三角形,当n的值为5,等边三角形为:

2、实验代码:
#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("Please input int n:\n"); scanf("%d",&n); trangle(n); }

3、问题分析:这道题和之前差不多,主要是找到规律。
(5)求500以内的所有亲密数对
1、问题的简单描述:若正整数A的所有因子(包括1但不包括自身,下同)之和为B,而B的因子之和为A,则称A和B为一对亲密数。
2、实验代码:
#include<stdio.h> facsum(int m) { int sum=1,f=2; while (f<=m/2) { if (m%f==0) sum=sum+f; f=f+1; } 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、问题分析:f<=m/2与m%f==0两个条件是判断出m所包含的因子但不包含本身,这是关键。&身后紧跟变量,错误给m、n填上&导致结果出错。
(6)编写x的y次幂的递归函数
1、问题的简单描述:编写程序,分别从键盘输入数据x和y,计算x的y次幂并输出。
2、实验代码:
#include<stdio.h> long getpower(int x,int y) { long s=0; if (y==1) return x; else s=x*getpower(x,y-1); } main() { int num,power; long answer; printf("Please input num:\n"); scanf("%ld",&num); printf("Please input power:\n"); scanf("%d",&power); answer=getpower(num,power); printf("%d^%d=%ld\n",num,power,answer); }

3、问题分析:s=s*getpower(y-1)是递归函数,当y=1时回归。
(7)编写计算学生年龄的递归函数
1、问题的简单描述:用递归方法计算学生的年龄。已知第一位学生年龄最小为10岁,其余学生一个比另一个大2岁,求第五位学生的年龄。
2、实验代码:
#include<stdio.h> 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); }

3、问题分析:n=1作为回归条件,递归公式简单,比较容易写出递归程序。
三、实验小结
这次实验课要运行的程序都有些难度,这次实验课的题目也较多,通过流程图掌握了一些函数,也通过实验加深了对函数的理解,在C语言的函数练习上有了进一步的体会。不足的的是,相比于之前,现在的学习热情并不是很高,有些松散,还要努力。


浙公网安备 33010602011771号