首页 > 代码库 > 有理数四则运算的实验报告小结
有理数四则运算的实验报告小结
一、实验报告内容:
设计抽象数据类型有理数的描述 (有理数是其分子、分母均为整数且分母不为零的分数)。
有理数主要数据运算有:
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.很多同学代码有错,但是未解决就交上来。所以如何找代码的错误需要课堂重新演示。
有理数四则运算的实验报告小结