有理数四则运算的实验报告小结

一、实验报告内容:

设计抽象数据类型有理数的描述 (有理数是其分子、分母均为整数且分母不为零的分数)。

 有理数主要数据运算有:

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:分母不能为零!
请重新输入!
");
			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
",a1,a2,b1,b2);
		Add(T1,T2,T3);
		printf("%d/%d+%d/%d=%d/%d
",T1[0],T1[1],T2[0],T2[1],T3[0],T3[1]);
		Sub(T1,T2,T3);
		printf("%d/%d-%d/%d=%d/%d
",T1[0],T1[1],T2[0],T2[1],T3[0],T3[1]);
		Mul(T1,T2,T3);
		printf("%d/%d*%d/%d=%d/%d
",T1[0],T1[1],T2[0],T2[1],T3[0],T3[1]);
		Div(T1,T2,T3);
		printf("(%d/%d)/(%d/%d)=%d/%d
",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:分母不能为零!
请重新输入!
");
			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("输入:
");
  	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.很多同学代码有错,但是未解决就交上来。所以如何找代码的错误需要课堂重新演示。

原文地址:https://www.cnblogs.com/linli069/p/6536768.html