C程序设计实验报告(五)
•实验项目:
6.3.1练习1 已知三角形的3边,求面积;
6.3.1练习2 求N的阶乘;
6.3.1练习3 求两个数的最大公约数;
6.3.1练习4 打印出指定的等边三角形;
6.3.2练习1 求500以内的所有亲密数对;
6.3.2练习3计算Ackerman函数
6.3.3练习1 编写计算x的y次幂的递归函数;
•姓名:曾福波
•实验地点:家中
•实验时间:2020.04.21
一、实验目的与要求
1、熟练地掌握函数的定义的方法和调用规则。
2、掌握在 C语言程序中主调函数和被调函数之间进行数据传递的规则。
3、了解函数的返回值及其类型,并正确使用它。
4、了解局部变量和全局变量的作用域及它们与存储分类的关系,理解变量的存在性和可见性的概念。
5、练习递归函数的使用。
二、实验内容
1、实验练习:6.3.1练习1 已知三角形的3边,求面积。
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-b)*(s-a)*(s-c); area=sqrt(p); return (area); } main() { float x,y,z,ts; scanf("%f%f%f",&x,&y,&z); ts=area(x,y,z); if(x+y>z||x-y<z) printf("area=%f\n",ts); else printf("data error!"); }
3问题分析:无
2、实验练习:6.3.1练习2 求N的阶乘。
1问题的简单描述:编写函数,求出从主调函数传来的数值 i 的阶乘值,然后将其传回主调函数并输出。
2实验代码:
#includeint N=5; long function(int i) { static long f=1; f=f*i; return f; } int main() { long product; int i; for(i=1;i<=N;i++) { product=function(i); printf("%d的阶乘是:%d\n",i,product); } }
3问题分析:在看完流程图后,我参照书上的描述很快就完成了,这个问题没有困扰我很久。
3、实验练习:6.3.1练习3 求两个数的最大公约数。
1问题的简单描述:编写程序,从键盘输入两个整数,调用 gcd() 函数求它们的最大公约数,并输出结果。
2实验代码:
#includeint 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("please input two integers:"); scanf("%d%d",&x,&y); fac=gcd(x,y); printf("The great common divisior is:%d",fac); }
3问题分析:这个程序的关键点是用辗转相除法求两个整数的最大公约数,求最大公约数函数的类型是整型,他是有返回值的,不能写成调用语句,而要把函数调用当做表达式,能把它放在表达式能出现的任何地方。
4、实验练习:6.3.1练习4 打印出指定的等边三角形。
1问题的简单描述:输入整数n,输出高度为n的等边三角形。
2实验代码:
#includevoid trangle(int n) { int i,j; for (i=0;i ) { for(j=0;j ) printf(" "); for(j=0;j<=2*i;j++) printf("*"); putchar('\n'); } } main() { int n; printf("please input one integer n:"); scanf("%d",&n); printf("\n"); trangle(n); }
3问题分析:这个程序其实之前我们就已经做过了类似的了,问题不大 上手快
5、实验练习: 6.3.2练习1 求500以内的所有亲密数对。
1问题的简单描述:若正整数 A 的所有因子( 包括 1 但不包括自身,下同)之和为 B ,而 B 的因子之和为 A,则称 A 和 B 为一对亲密数。例如,6的因子之和为1+2+3=6,因此6与6为一对亲密数。求出500以内的所有亲密数对
2实验代码:
int facsum(int m) { int sum=1,f=2; while(f<=m/2) { while(m%f==0) { sum=sum+f; break; } 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问题分析:这个程序的关键点是用辗转相除法求两个整数的最大公约数,求最大公约数函数的类型是整型,他是有返回值的,不能写成调用语句,而要把函数调用当做表达式,能把它放在表达式能出现的任何地方。
6、实验练习:6.3.2练习3计算Ackerman函数
(1)问题简单描述:计算Ackerman函数。
(2)实验代码:
int Ack(int n,int x,int y) { int a; if(n==0) a=x+1; if(n==1&&y==0) a=x; if(n==2&&y==0) a=0; if(n==3&&y==0) a=1; if(n>=4&&y==0) a=2; if(n!=0&&y!=0) return Ack(n-1,Ack(n,x,y-1),x); return a; } main() { int a,b,c,d; printf("please input a,b,c:"); scanf("%d%d%d",&a,&b,&c); while (a<=0||b<=0||c<=0) { printf("error,please input again!\n"); scanf("%d%d%d",&a,&b,&c); } d=Ack(a,b,c); printf("Ack(%d,%d,%d)=%d\n",a,b,c,d); }
3问题分析:无
7,实验练习:6.3.3练习1 编写计算x的y次幂的递归函数。
1问题的简单描述:编写程序,分别从键盘输人数据 x 和 y ,计算 x 的 y次幂并输出。
2实验代码:
#includelong getpower(int x,int y) { if(y==1) return x; else return x*getpower(x,y-1); } main() { int num,power; long answer; printf("输入一个数:"); scanf("%d",&num); printf("输入幂次方:"); scanf("%d",&power); answer=getpower(num,power); printf("结果是:%1d\n",answer); return 0; }
3问题分析:无
四、实验小结
经过这么久的学习和练习,我得到了一定的进步,但还是十分的不足,在完成这些练习的时候,都是在参照课本上给出的样板,然后参考网上的代码,才能进行编写。编写代码时,多数时候都是一头雾水,不断地重复一些错误,一改再改,而且编写的速度十分缓慢,在课程时间内只能完成两三个代码,无法跟上大部分同学的进度。