第六章 函数和宏定义实验
C程序设计实验报告
实验项目:
1、函数的定义和调用
2、模块化程序设计
姓名:徐溢璠 实验地点: 514实验室 实验时间:2019年4月30日
一、实验目的与要求
1、函数的定义和调用
实验练习1 编写由三角形三边求面积的函数
-
调用area()函数求三角形的面积
-
在求面积函数中运用海伦公式
实验练习2 编写求N阶乘的函数
-
定义符号常量
-
使用长整型变量存放累乘积
-
在函数中,使用局部静态变量存放累乘积
实验练习3 求两个整数的最大公约数
-
调用gcd()函数求两个整数的最大公约数
-
掌握辗转相除法求两个整数的最大公约数
实验练习4 打印输出指定图形
-
调用trangle()函数输出三角形
-
在trangle()函数中用for循环的嵌套输出指定的结果
2、模块化程序设计
实验练习1 求500以内的所有亲密数对
-
掌握C语言中定义函数的方法
-
掌握通过“值传递”调用函数的方法
二、实验内容
6.4.1 函数的定义和调用
实验练习1 编写由三角形三边求面积的函数
1、简单问题描述
编写程序,从键盘输入三角形的3条边,调用三角形面积函数求出其面积,并输出结果。程序流程图如图6-1所示。流程图如下:
2、实验代码
#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); } main() { float x,y,z,ts; printf("请输入三条边长:"); scanf("%f%f%f",&x,&y,&z); ts=area(x,y,z); if(x+y>z&&x+z>y&&y+z>x) { printf("area=%f ",ts); } else printf("data error!"); }
3、问题分析
问题:我将return(area)写成了return(p),得出结果如下:
解决办法:重新检查程序,改正过来。
实验练习2 编写求N阶乘的函数
1、简单问题描述
编写函数,求出从主调函数传来的数值 i 的阶乘值,然后将其传回主调函数并输出。流程图如下:
2、实验代码
#include<stdio.h> long function(int i) { static long f=1; f=f*i; return f; } main() { long product; int i; for(i=1;i<=5;i++) { product=function(i); printf("%d的阶乘是:%d ",i,product); } }
3、问题分析
解决办法:将printf中改成%d的阶乘是:%d。
实验练习3 求两个整数的最大公约数
1、简单问题描述
编写程序,从键盘输入两个整数,调用 gcd()函数求它们的最大公约数,并输出结果。流程图如下所示:
2、实验代码
#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; } main() { int x,y; int fac; printf("请输入两个数字: "); scanf("%d%d",&x,&y); fac=gcd(x,y); printf("The great common divisor is:%d",fac); }
3、问题分析
由于刚开始我代码是这样写的,然后发现我如果求较小的数就能得出正确结果,数字大了就无法输出。
解决办法:听老师的提示,我在while语句中加入了break;发现可以得到正确答案,但是这只是巧合,经过参考同学的代码,我知道应该在while语句中加上remainder=a%b,即可获得正确答案。
实验练习4 打印输出指定图形。
1、简单问题描述
输入整数n,输出高度为n的等边三角形。当n=5时的等边三角形如下:
*
***
*****
*******
*********
2、实验代码
#include<stdio.h> void trangle(int n) { int i,j; for(i=0;i<n;i++) { for(j=i;j<n;j++) printf(" "); for(j=0;j<=2*i;j++) printf("*"); putchar(' '); } } main() { int n; printf("请输入一个整数n: "); scanf("%d",&n); printf(" "); trangle(n); }
3、问题分析
这个代码之前理论课已经遇见过,没有问题。
6.4.2 模块化程序设计
实验练习1 求500以内的亲密对数。
1、简单问题描述
若正整数A的所有因子(包括1但不包括自身,下同)之和为B ,而B的因子之和为A ,则称A和B为一对亲密数。例如,6的因子之和为1+2+3=6,因此6与6为一对亲密数(即自身构成一对亲密数);又如,22的因子之和为1+2+4+5+10+11+20+22+44+55+110=248,而248的因子之和为1+2+4+71+142=220,因此220与248是一对亲密数。流程图如下:
2、实验代码
#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; } main() { int m=3,n,k; while(m<=500) { n=facsum(m); k=facsum(n); if(m==k&&m<=n) { printf("%d,%d ",m,n); } m++; } }
3、问题分析
问题:
发现无法输出结果,之后改正;
发现我没有换行,加上" ",得到正确答案。
三、实验小结
收获:
1、在上第六章的理论课时,发现对于函数的定义,调用和声明不太了解,但是通过这几个编程题题目我对于本章内容更加了解了,可以实际应用。果然,C语言是一门很需要实践的课程。
2、通过第一个实验和以前的一些实验,我发现自己使用if语句容易犯的几个错误,以及原因。
3、第二个实验联系了static的用法,同时我也知道如果字符太长,就用long。
4、第三个实验我知道了怎样交换两个数字的值,以及学会了辗转相除法和更相减损法。
5、又犯了一个新错误,&应该用在scanf中而不是printf中,以后要注意。
不足:
1、还不怎么会使用断点的方法找程序的错误,导致我调试的效率很低。
2、不习惯使用注释,总是自己都不懂自己的代码。
3、容易跟着书上的提示和流程图走,没有自己的思路。