C程序设计实验报告
实验项目:函数与宏定义
姓名:许鑫琪 实验地点: 第一教学楼514 实验时间:4月30日
一、实验目的与要求
1、函数的定义与调用
- 编写由三角形三边求面积的函数。
- 编写求N阶乘的函数。
- 求两个整数的最大公约数。
- 打印输出指定图形。
2、模块化程序设计
求500以内的所有亲密数对
二、实验内容
6.4.1
实验练习1:编写由三角形三边求面积的函数。
问题描述:编写程序,从键盘输入三角形的3条边,调用三角形面积函数求出其面积,并输出结果。
实验代码:
#include <stdio.h> #include<math.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("请键盘输入三角形的三边x、y、z: "); scanf("%f%f%f",&x,&y,&z); if ((x>0)&&(y>0)&&(z>0)&&(x+y>z)&&(y+z>x)&&(x+z>y)) { ts=area(x,y,z);//函数的调用// printf("area=%f ",ts); } else printf("data error!"); }
运行结果:
实验流程图
问题分析:这个题一个是所有实验中最简单的,但是我却花了最长的时间,我写完了之后一直运行不出来,我便在检查代码,发现没啥问题,
线上问同学,然后我们一直讨论,但并没有效果,就用老师说的断点试了一下,找出错误后修改了,但是由于自己输入的格式不对,还是没能
输出正确的结果,我又重新检查了一遍,%f,%f,%f;我运行时用了空格代替结果运行不出来,卡了好久。
实验练习2:编写求N阶乘的函数。
问题描述:编写函数,求出从主函数传来的数值i的阶乘值,然后将其传回主调函数并输出。
实验代码:
#include<stdio.h> char N=5;//定义符号常量N,代表数字5// long function (int i) { static int f=1;//定义局部静态变量f并赋初值为1// f=f*i;//求形参i 的阶乘// return f; } int main() { long product; int i; for (i=1;i<=N;i++) { product= function(i); printf("%d!=%1d ",i,product); } }
运行结果:
实验流程图
问题分析:在没看流程图的情况下这一题我写的格式出了错误,看了流程图之后,想了一下便改正了。
实验练习3:求两个整数的最大公约数。
问题描述:编写程序,从键盘输入两个整数,调用gcd()函数求它们的最大公约数,并输出结果。
实验代码:
#include<stdio.h> int gcd(int a,int b) { int temp; int remainder; if(a<b) { temp=a; a=b; b=temp; //交换a与b的值// } 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 divisor is:%d",fac); }
运行结果:
实验流程图
问题分析:
这道题也卡了比较久,一直运行不出来,然后同学说把第二个while改为if的形式,试了一下有用;
不过之后老师讲解了,再不改变while的形式下就要在加一行:remainder=a%b;
实验练习4:打印输出指定图形。
问题描述:输入整数n,输出高度为n的等边三角形。当n=5时的等边三角形如下:
*
***
*****
*******
*********
实验代码:
#include<stdio.h> void trangle(int n) { int i,j,k; for (i=1;i<n;i++) { for(j=i;j<=n;j++) printf(" ") ; for(k=1;k<=2*i-1;k++) printf("*"); putchar(' '); } } main () { int n; printf("please input one integers: "); scanf("%d",&n); printf(" "); trangle(n); }
运行结果:
实验流程图
问题分析:
这道题比较简单,之前写的课后思考题做了很多这样的例子,这里只要换一下形式用函数定义的;
6.4.2模块化程序设计
实验练习1:求500以内的所有亲密数对。
问题描述:若正整数A的所有因子(包括1但不包括自身,下同)之和为B ,而B的因子之和
为A ,则称A和B为一对亲密数。例如,6的因子之和为1+2+3=6,因此6与6为一对亲密数(即
自身构成一对亲密数);又如,220的因子之和为1+2+4+5+10+11+20+22+44+55+110=248,
而248的因子之和为1+2+4+71+142=220,因此220与248是一对亲密数。
求500以内的所有亲密数对。
具体要求若下:
(1)编制一个函数facsum(m),返回给定的正整数m的所有的因子(包括1但不包括本身)之和。
(2)编制一个主函数,调用(1)中的函数facsum (),寻找并输出500以内的所有亲密数对。
(3)输出要有文字说明。在输出每对亲密数时,要求从小到大排列并去掉重复的亲密数对。
(4)所有函数中的循环均采用for循环。
实验代码:
#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; for(;m<=500;m++) { n=facsum(m); k=facsum(n); if(m==k&&m<=n) printf("%d,%d ",m,n); } }
运行结果:
实验流程图
问题分析:
这道题根据运行的内容应该是没有问题的,但是由于没有换行导致了这样子的结果:
我开始一直没有找出问题,然后又觉得算法应该是没有问题的,就跟同学讨论了一下。
三、实验小结
1、“细心”真得很重要,之前一直觉得是自己敲代码太慢了,
现在发现主要是自己太粗心了,老是犯一些低级错误,
耗费了大量的时间。
2、看懂流程图并把其转化为代码的形式和画流程图都是十
分重要的,就如看懂他人和自己的想法一样,才能进行
下一步的工作,没有思想的程序员无异于普通的打字员。
3、对于不懂的知识点最好的方法就是多多练习,就像写输
出图形是实验信手拈来,平常自己要多思考多练习。
4、设断点是一个发现自己问题的捷径,同时会让你的思维
更加的清晰,不可能每次都会有同学,有老师在身边提
醒,这是断点无疑是最好的老师。