函数与宏定义
C语言程序设计实验报告
姓名:邓文超 实验地点:宿舍
1.实验项目6.3.1.1
问题的简单描述:我测试了下不能构成三角形的三条边(例如:3,2,1),如果三条边顺序的乱,之前的代码就不会运行错误提示。
实验代码:
#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 a,b,c,ts;
printf("请输入三角形的3条边:");
scanf("%f,%f,%f",&a,&b,&c);
ts=area(a,b,c);
if(a+b>c&&b+c>a&&a+c>b)
printf("area=%f\n",ts);
else
printf("Data error!");
}
问题分析:if语句中的条件不足,非专业性问题。doge
2.实验项目6.3.1.3
问题的简单描述:交换a和b的值的过程中,没有意识到这是关于汉诺塔问题的情况,直接'a=b;b=a',主要是瞄了眼同桌dp的代码就是这样,那时候就感觉不对劲了,结果代码果然运行不出;然后就是不理解辗转相除法了。
实验代码:
#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("请输入2个整数:");
scanf("%d,%d",&x,&y);
fac=gcd(x,y);
printf("The great common divisor is %d",fac);
}
问题分析:明白汉诺塔的原理,但不晓得运用。
3.实验项目6.3.1.4
问题的简单描述:for循环太久没打了,导致构思代码时间有点久。
实验代码:
#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('\n');
}
}
main()
{
int n;
printf("请输入一个整数n:");
scanf("%d",&n);
printf("\n");
trangle(n);
}
问题分析:考试月也到了,将以前学过的知识反复复习。
4.实验项目6.3.1.1
问题的简单描述:while循环一下子就忘了公式。
实验代码:
#include<stdio.h>
int facsum(int m)
{
int sum=1,f=2;
while(f<=m/2)
{
if(m%f==0)
sum=sum+f;
f=f+1;
}
return sum;
}
main()
{
int m=3,n,k;
while(m<=500)
{
n=facsum(n);
k=facsum(k);
if(m==k&&m<=n)
printf("%d%d\n",m,n);
m++;
}
}
问题分析:多加练习,融会贯通。
辗转相除法:
又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。
它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,
再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止,
如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
另一种求两数的最大公约数的方法是更相减损法。[搜狗百科]
实验小结
这次课我觉得学习的内容不多,但有些知识点有点晦涩难懂,比如递归,不是太懂这个用处,可能是使某些程序更简单。
其他还好,总之多练习敲代码吧。复习的话我觉得做书上的题目是一种方法。