一、实验报告内容:
设计抽象数据类型有理数的描述 (有理数是其分子、分母均为整数且分母不为零的分数)。
有理数主要数据运算有:
1. 构造有理数T,元素e1,e2分别被赋以分子、分母值
2. 销毁有理数T
3. 用e返回有理数T的分子或分母,i=1返回分子, i=2返回分母。
4. 改变有理数T的分子或分母为e,i=1改变分子, i=2改变分母
5. 有理数T1,T2相加,结果存入有理数T3
6. 有理数T1,T2相减,结果存入有理数T3
7. 有理数T1,T2相乘,结果存入有理数T3
8. 有理数T1,T2相除,结果存入有理数T3
二、本次实验存在问题:
1.有11个人查重》=80%,记为0分。我们的每次实验作业都会查重,希望大家实验报告尽量多写你们的实验思路、实验体会。代码有完成多少实验报告贴多少。不要把别人代码拷贝过来。
2.每次实验报告一定要按照模板要求来写,本次作业发现不少同学值贴代码,思路、代码注释、运行结果截图全部没有。
int main()
{
typedef int Status;
typedef int ElemType;
typedef ElemType * Rational_Num;
Rtional_Num T1,T2,T3;
ElemType a1,a2,b1,b2;
printf("请输入第一个有理数,第一个为分子,第二个为分母:");
scanf("%d%d",&a1,&a2);
printf("请输入第二个有理数,第一个为分子,第二个为分母:");
scanf("%d%d",&b1,&b2);
if(a2==0||b2==0)
{
printf("Warm:分母不能为零!\n请重新输入!\n");
printf("请输入第一个有理数,第一个为分子,第二个为分母:");
scanf("%d%d",&a1,&a2);
printf("请输入第二个有理数,第一个为分子,第二个为分母:");
scanf("%d%d",&b1,&b2);
}
else{
InitRational_Num(T1,a1,a2);
InitRational_Num(T2,b1,b2);
printf("您构造的两个有理数分别为:%d/%d,%d/%d\n",a1,a2,b1,b2);
Add(T1,T2,T3);
printf("%d/%d+%d/%d=%d/%d\n",T1[0],T1[1],T2[0],T2[1],T3[0],T3[1]);
Sub(T1,T2,T3);
printf("%d/%d-%d/%d=%d/%d\n",T1[0],T1[1],T2[0],T2[1],T3[0],T3[1]);
Mul(T1,T2,T3);
printf("%d/%d*%d/%d=%d/%d\n",T1[0],T1[1],T2[0],T2[1],T3[0],T3[1]);
Div(T1,T2,T3);
printf("(%d/%d)/(%d/%d)=%d/%d\n",T1[0],T1[1],T2[0],T2[1],T3[0],T3[1]);
}
DistroyRational_Num(T1);
DistroyRational_Num(T2);
DistroyRational_Num(T3);
}
以上就是某个同学代码,没任何注释。
3.大部分同学在做除法函数时候没考虑除0情况。如下面代码中如果第二个有理数分子的情况一定要判断。
Status Div(Rational_Num T1,Rational_Num T2,Rational_Num &T3);
{
T3[0]=T1[0]*T2[1];
T3[1]=T1[1]*T2[0];
int temp=Gcd(T3[0],T3[1]);
T3[0]=T3[0]/temp;
T3[1]=T3[1]/temp;
return Ok;
}
4. 没有考虑有理数负数情况,比如用户如果分母输入负数,这应该是不合理。负数我们的处理应该只允许分子为负数,分母正数。如下面代码中,考虑了分母不能为0,却没考虑分母为负数情况,如果分母为负数,应提示并重输。
printf("请输入第一个有理数,第一个为分子,第二个为分母:");
scanf("%d%d",&a1,&a2);
printf("请输入第二个有理数,第一个为分子,第二个为分母:");
scanf("%d%d",&b1,&b2);
if(a2==0||b2==0)
{
printf("Warm:分母不能为零!\n请重新输入!\n");
printf("请输入第一个有理数,第一个为分子,第二个为分母:");
scanf("%d%d",&a1,&a2);
printf("请输入第二个有理数,第一个为分子,第二个为分母:");
scanf("%d%d",&b1,&b2);
}
下面这个同学就有考虑负数情况,我们可以参考:
Triplet L1,L2,L3;
int e1,e2,e3,e4;
L3= (int *)malloc(2 * sizeof(int));
printf("输入:\n");
scanf("%d %d",&e1,&e2);
while(e2<=0) //分母不能等于0或负数
{
printf("请重新输入:");
scanf("%d %d",&e1,&e2);
}
scanf("%d %d",&e3,&e4);
while(e4<=0)
{
printf("请重新输入:");
scanf("%d %d",&e3,&e4);
}
5.有几位同学函数、变量命名很不好识别,看下面代码:
这样代码请问能看的下去?????????
typedef struct
{
int a1;
int a2;
} iii;
void aaa(Rational T,int e1,int e2);
void bbb(&T);
int ccc(&T,e);
int ddd(T,e);
void eee(T1,T2,&T3);
void fff(T1,T2,&T3);
void ggg(T1,T2,&T3);
void hhh(T1,T2,&T3);
6.没有对有理数分子分母求最大公约数,即约分。
7.还有一些同学没传代码,只有简单实验报告,这部分同学得分不及格。
8。代码和实验报告都放在同一word文档,不要分开放,但还是有同学操作错误。如张晨曦
三、本次作业小结。
1.有一半同学编程实现了有理数。还有一半左右同学不理解结构体定义、结构体指针应用、malloc函数使用。我将在实验课讲解一份同学的实验同时复习结构体。
2.有一半左右同学实验报告只负责贴代码,没有任何代码注释。代码运行结果截图上,只用一组测试数据截图,这是不合理,应该拿多个测试数据的截图。
3.很多同学代码有错,但是未解决就交上来。所以如何找代码的错误需要课堂重新演示。