第六章 函数与宏定义实验报告
实验项目:
-
6.4.1.1. 编写由三角形三边求面积的函数
-
6.4.1.2. 编写求N的阶乘的函数
-
6.4.1.3. 求两个整数的最大公约数
-
6.4.1.4. 打印输出的指定图形
-
6.4.2.1. 求500以内的所有亲密数对
一、实验目的与要求
6.4.1.1. 编写由三角形三边求面积的函数
-
调用area()函数求三角形的面积;
-
在求面积函数中运用海伦公式;
6.4.1.2. 编写求N的阶乘的函数
-
定义符号常量;
-
使用长整型变量存放累乘积;
-
在函数中,使用局部静态变量存放累乘积;
-
使用全局变量存放累乘积;
6.4.1.3. 求两个整数的最大公约数
-
调用gcd()函数求两个整数的最大公约数;
-
掌握辗转相除法求两个整数的最大公约数;
6.4.1.4. 打印输出的指定图形
-
调用trangle()函数输出三角形;
-
在trangle()函数中用for循环的嵌套输出指定的结果;
6.4.2.1. 模块化程序设计
-
掌握C语言中定义函数的方法;
-
掌握通过值传递调用函数的方法。
二、实验内容
6.4.1.1. 编写由三角形三边求面积的函数:
◆问题描述:编写程序,从键盘输入三角形的3条边,调用三角形函数求出其面积,并输出结果。
◆流程图:
◆实验代码:
1 #include<stdio.h> 2 #include<math.h> 3 float area(float a,float b,float c) 4 { 5 float s,p,area; 6 s=(a+b+c)/2; 7 p=s*(s-a)*(s-b)*(s-c); 8 area=sqrt(p); 9 return (area); 10 } 11 main() 12 { 13 float x,y,z,ts; 14 scanf("%f%f%f",&x,&y,&z); 15 ts=area(x,y,z); 16 if((x+y>z)&&(x+z>y)&&(y+z>x)) 17 printf("area=%f\n",ts); 18 else printf("data error"); 19 }
◆输出结果:
◆问题分析:最开始的时候不知道海伦公式是什么,也不理解函数调用中的形参和实参的区别,盲目的使用函数调用,导致输出的结果一直都是0.00000;然后又去书上研究了一下,了解了形参与实参的区别,改了一下参数,输出结果就正确了。
6.4.1.2. 编写求N的阶乘的函数:
◆问题描述:编写函数,求出从主调函数传来的数值i的阶乘值,然后将其传出主调函数并输出。
◆流程图:
◆实验代码:
1 #include<stdio.h> 2 #define N 5 3 long function(int i) 4 { 5 static int f=1; 6 f=f*i; 7 return f; 8 } 9 int main() 10 { 11 long products; 12 int i; 13 for(i=1;i<=N;i++) 14 { 15 products=function(i); 16 printf("%d的阶乘为%d\n",i,products); 17 } 18 }
◆输出结果:
◆问题分析:这道题目的关键是理解static型存储变量的含义,理解了static是静态存储变量后就可以了。
6.4.1.3. 求两个整数的最大公约数:
◆问题描述:编写程序,从键盘输入两个整数,调用gcd()函数求它们的最大公约数,并输出结果。
◆流程图:
◆辗转相除法实验代码:
1 #include<stdio.h> 2 int gcd(int a,int b) 3 { 4 int temp; 5 int remainder; 6 if(a<b) 7 { 8 temp=b; 9 b=a; 10 a=temp; 11 } 12 remainder=a%b; 13 while(remainder!=0) 14 { 15 a=b; 16 b=remainder; 17 remainder=a%b; 18 } 19 return b; 20 } 21 main() 22 { 23 int x,y; 24 int fac; 25 printf("please enter liang ge zheng shu:"); 26 scanf("%d,%d",&x,&y); 27 fac=gcd(x,y); 28 printf("The great common divisor is:%d",fac); 29 }
◆输出结果:
◆问题分析:关键在于理解辗转相除中的“辗转”的意思,即反复用结果和上一个结果相除,直到得出正确的结果再return给主函数。
◆更相减损法实验代码:
1 #include<stdio.h> 2 int gcd(int a,int b) 3 { 4 int temp; 5 int remainder; 6 if(a<b) 7 { 8 temp=b; 9 b=a; 10 a=temp; 11 } 12 remainder=a-b; 13 while(remainder!=0) 14 { 15 a=b; 16 b=remainder; 17 if(a<b) 18 { 19 temp=b; 20 b=a; 21 a=temp; 22 } 23 remainder=a-b; 24 } 25 return b; 26 } 27 main() 28 { 29 int x,y; 30 int fac; 31 printf("please enter liang ge zheng shu:"); 32 scanf("%d,%d",&x,&y); 33 fac=gcd(x,y); 34 printf("The great common divisor is:%d",fac); 35 }
◆输出结果:
6.4.1.4. 打印输出的指定图形:
◆问题描述:输入整数n,输出高度为n的等边三角形。
◆流程图:
◆实验代码:
1 #include<stdio.h> 2 void trangle(int n) 3 { 4 int i,j; 5 for (i=0;i<n;i++) 6 { 7 for(j=0;j<n-i;j++) 8 printf(" "); 9 for(j=0;j<=2*i;j++) 10 printf("*"); 11 putchar('\n'); 12 } 13 } 14 main() 15 { 16 int n; 17 printf("please enter a zheng shu:"); 18 scanf("%d",&n); 19 printf("\n"); 20 trangle(n); 21 }
◆输出结果:
◆问题分析:无。
6.4.2.1. 求500以内的所有亲密数对:
◆问题描述:若正整数A的所有因子(包括1但不包括自身,下同)之和为B,而B的因子之和为A,则称A和B为一对亲密数。例如,6的因子之和为1+2+3=6,因此6与6为一对亲密数(即6自身构成一对亲密数);又如,220的因子之和为1+2+4+5+10+11+20+22+44+55+110=284,而284的因子之和为1+2+4+71+142=220,因此,220与284为一对亲密数。 求500以内的所有的亲密数对。 具体要求如下: (1)编制一个函数facsum(m),返回给定正整数m的所有因子(包括1但不包括自身)之和。 (2)编制一个主函数,调用(1)中的函数facsum(),寻找并输出500以内的所有亲密数对。 (3)输出要有文字说明。在输出每对亲密数时,要求从小到大排列并去掉重复的亲密数对。 (4)所有函数中的循环均为for循环。
◆流程图:
◆实验代码:
1 #include<stdio.h> 2 int facsum(int m) 3 { 4 int sum=1,f=2; 5 for(f=2;f<=m/2;f++) 6 { 7 if(m%f==0) 8 sum=sum+f; 9 } 10 return sum; 11 } 12 main() 13 { 14 int m=3,n,k; 15 for(m=3;m<=500;m++) 16 { 17 n=facsum(m); 18 k=facsum(n); 19 if(m==k&&m<=n) 20 printf("%d %d\n",m,n); 21 } 22 }
◆输出结果:
◆问题分析:老问题,if(m%f==0)判断的时候当时没用==,导致一直出错,输出结果一直为1,1无限循环。