C程序设计实验报告
姓名:钟子良
实验地点:家
实验时间:2020.04.26
一、实验目的与要求
1、熟练地掌握函数的定义方法和调用规则。
2、掌握在C语言程序中主调函数和被调用函数之间进行数据传递的规则。
3、了解函数的返回值及其类型,并正确使用它。
4、了解局部变量和全局变量的作用域及它们与存储分类的关系,理解变量的存在性和可见性的概念。
5、练习递归函数的使用。
二、实验内容
1、函数的定义与调用
(1)6.3.1实验练习1:已知三角形的三条边,求三角形的面积
(1)问题简单描述:编写程序,从键盘输入三角形的3条边,调用三角形函数求出其面积,并输出结果。
(2)实验代码:
#include#include 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("请输入三角形的三条边:"); scanf("%f%f%f",&a,&b,&c); ts=area(a,b,c); if(a+b>c&&a+c>b&&b+c>a) printf("area=%.0f\n",ts); else printf("此数据不能构成三角形"); }
(3)问题分析:一开始没有考虑到数据不能构成三角形的情况,后面仔细分析了流程图才想出来。
(4)流程图:
(2)6.3.1实验练习2:求N的阶乘
(1)1.问题的简单描述:①局部静态变量的定义;②宏定义的运用
(2)实验代码:
#include#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("%d的阶乘是%d\n",i,product); } }
(3)问题分析:用宏定义定义符号常量N,其作用域是全局的
(4)流程图:
(3)6.3.1实验练习3:求两个整数的最大公约数
(1)问题简单描述:编写程序,从键盘输入两个整数,调用gcd()函数求它们的最大公约数,并输出结果。
(2)实验代码:
#includeint gcd(int a,int b) { int temp; int remainder; if(a<b) { int t; t=a;a=b;b=t; } 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("它们的最大公约数是 %d",fac); }
(3)问题分析:程序的关键是使用循环体,用辗转相除法求公约数。刚开始不明白辗转相除法的方式,后面查看实验书才明白。
(4)流程图:
(4)6.3.1实验练习4:打印输出指定的类型
(1)问题简单描述:输入整数n,输出高度为n的等边三角形。
(2)实验代码:
#includetrangle(int n) { int i,j; for(i=0;i ) { for(j=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)问题分析:先控制行数,再控制空格输出,最后控制*输出。
2、模块化程序设计
(5)6.3.2实验练习1:求500以内的所有亲密数对
(1)问题的简单描述:若正整数A的所有因子(包括1但不包括自身,下同)之和为B,而B的因子之和为A,则称A和B为一对亲密数。
(2)实验代码:
#includeint 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)问题分析:主要是对亲密对数的理解要清楚,才能确定算法。
3、函数的递归调用
(6)6.3.3练习1 编写x的y次幂的递归函数
(1)问题简单描述:编写程序,分别从键盘输入数据x和y,计算x的y次幂并输出。
(2)实验代码:
#include"stdio.h" long getpower(int x,int y) { if(y==1) return x; else y=x*getpower(x,y-1); } 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); }
(3)问题分析:无。
(7)6.3.3练习2 编写计算学生年龄的递归函数
(1)问题简单描述:用递归方法计算学生的年龄。已知第一位学生年龄最小为10岁,其余学生一个比另一个大2岁,求第五位学生的年龄。
(2)实验代码:
#includeint age(int n) { int c; if(n==1) c=10; else c=age(n-1)+2; return c; } void main() { int n=5,sage; sage=age(n); printf("第%d位学生的年龄为%d\n",n,sage); }
(3)问题分析:思路较简单,用if-else语句很快算出结果。
小结:
这次实验学习了如何定义和调用函数,函数必须先定义才可以调用,在主函数中调用定义过的函数可以使得程序更加简洁清晰。但是在调用的过程中必须明确调用函数里返回值的类型,否则会出现错误。