第六章 函数与宏定义实验报告

第六章 函数与宏定义实验报告

                                                                 姓名:周萌                     班级:18物联网                           实验时间:2019年4月30日


实验项目:

  • 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. 编写由三角形三边求面积的函数

  1. 调用area()函数求三角形的面积;

  2. 在求面积函数中运用海伦公式;

6.4.1.2. 编写求N的阶乘的函数

  1. 定义符号常量;

  2. 使用长整型变量存放累乘积;

  3. 在函数中,使用局部静态变量存放累乘积;

  4. 使用全局变量存放累乘积;

6.4.1.3. 求两个整数的最大公约数

  1. 调用gcd()函数求两个整数的最大公约数;

  2. 掌握辗转相除法求两个整数的最大公约数;

6.4.1.4. 打印输出的指定图形

  1. 调用trangle()函数输出三角形;

  2. 在trangle()函数中用for循环的嵌套输出指定的结果;

6.4.2.1. 模块化程序设计

  1. 掌握C语言中定义函数的方法;

  2. 掌握通过值传递调用函数的方法。


二、实验内容

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无限循环。


三、实验小结

◆感觉几次实验后,发现自己有点离不开书上流程图了,但是书上的流程图又有很多错误,以后要学会现在自己脑海李构思一下算法了,毕竟算法才是程序的灵魂,其他相对算法来说都是次要的。

posted @ 2019-05-04 13:27  声微、饭否  阅读(305)  评论(0编辑  收藏  举报