C程序设计实验报告5
C程序设计实验报告五
实验项目:6.3.1 函数的定义和调用 ,6.3.2 模块化程序设计 ,6.3.3 函数的递归调用
姓名:胡一阳
实验地点:家中
实验时间:2020.04.22
一、实验目的与要求
1、了解符号常量的定义;
2、使用长整型变量存放乘积,使用局部静态变量存放乘积,使用全局变量存放乘积;
3、通过“值传递”调用函数的方法;
4、递归函数的设计方法;
5、在递归函数中,使用if…else语句根据条件的真假来决定是递推还是回归;
二、实验内容
1、实验练习: 6.3.1 函数的定义和调用
1、问题的简单描述:调用三角形面积函数求面积;求主调函数传来的i的阶乘,并传回主调函数且输出;调用gcd函数;
2、实验代码:
(1)已知三角形的三条边,求三角形的面积
(2)求N的阶乘
(3)求两个整数的最大公约数
(4)打印输出指定的图形
#include<math.h> #include<stdio.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); } void main() { float a,b,c,ts; printf("输入三角形的三条边\n"); scanf("%f %f %f",&a,&b,&c); if(a+b>c&&a+c>b&&b+c>a) { ts=area(a,b,c); printf("area=%f\n",ts); } else printf("data error!"); }
#include<stdio.h> #define N 5 long function(int i) { static long f=1; f=f*i; return f; } void main() { long product; int i; for(i=1;i<=N;i++) { product=function(i); printf("%d的阶乘是%d\n",i,product); } }
#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; } void main() { int a,b; int fac; printf("输入两个整数:"); scanf("%d %d",&a,&b); fac=gcd(a,b); printf("the great common divisor is%d",fac); }
#include<stdio.h> void trangle(int n) { int i,j; for(i=0;i<n;i++) { j=0; for(;j<n-i;j++) { putchar(' '); } for(j=0;j<=2*i;j++) putchar('*'); putchar('\n'); } } void main() { int n; printf("输入一个整数:"); scanf("%d",&n); printf("\n"); trangle(n); }
3、问题分析:程序会用到开方,要将头文件math.h包含进来;定义符号变量可以超强程序可读性;用辗转相除求最大公约数;
2、实验练习:6.3.2 模块化程序设计
1、问题的简单描述:要注意函数的调用以及返回数值;编写一个sab函数;编写函数然后递归;
2、实验代码:
(1)求500以内的所有亲密数对
(2)利用复化梯形公式计算定积分
(3)计算Ackerman函数
#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; } void 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++; } }
#include<stdio.h> #include<math.h> #include"sab.h" double f(double x) { double result; result=x*x*exp(x); return result; } void main() { double a,b,result; int n; printf("输入a,b,n的值"); scanf("%lf %lf %d",&a,&b,&n); result=sab(a,b,n); printf("sab(%lf,%lf,%d)=%lf",a,b,n,result); }
#include<stdio.h> int Ack(int n,int x,int y) { int a; if(n==0) a=x+1; else if(n==1&&y==0) a=x; else if(n==2&&y==0) a=0; else if(n==3&&y==0) a=1; else if(n>=4&&y==0) a=2; else a=Ack(n-1,Ack(n,x,y-1),x); return a; } void main() { int n,x,y,result; printf("输入n,x,y:"); scanf("%d %d %d",&n,&x,&y); while(n<0||x<0||y<0) { printf("输入错误,请重新输入\n"); scanf("%d %d %d",&n,&x,&y); } result=Ack(n,x,y); printf("Ack(%d,%d,%d)=%d\n",n,x,y,result); }
3、问题分析:f++是先赋值在自增;sab函数是放在一个独立文件中;
3、实验练习:6.3.3 函数的递归调用
1、问题的简单描述:如何计算函数的次幂并且输出
2、实验代码:
(1)编写计算x的y次幂的递归函数,并在主程序中实现输入和输出;
#include<stdio.h> #include<math.h> long getpuwer(int x,int y) { long s; if(y==1) { return x; } else s=x*getpuwer(x,y-1); return s; } void main() { int num,power; long answer; printf("输入num的值:\n"); scanf("%d",&num); printf("输入幂次方power的值:\n"); scanf("%d",&power); answer=getpuwer(num,power); printf("%d^%d=%ld\n",num,power,answer); }
3、问题分析:在存放较大的数的时候要用long型