3.1-互评-OO设计-有理数类的设计
有理数类的设计
有理数类的代码。
package practice;
public class RationalNumber {
private int molecule; //分子
private int denominator; //分母
public RationalNumber(int molecule,int denominator){
this.molecule =molecule;
if(denominator==0) //错误情况输入提示
{
System.out.println("输入错误,分母不能为0");
System.exit(0);
}
else this.denominator =denominator;
}
public int GetMolecule() {
return this.molecule; //获得分子
}
public int GetDenominator() {
return this.denominator; //获得分母
}
public void SetMolecule(int molecule) {//设置分子
this.molecule = molecule;
}
public void SetDenominator(int denominator) {//设置分母
this.denominator = denominator;
}
public RationalNumber Reduction() {//约分运算
int m,d;
m=this.molecule;
d=this.denominator;
if(m<d)
{
int temp=m;
m=d;
d=temp;
}
while(d!=0)
{
int temp=m;
m=d;
d=temp%d;
}
this.denominator/=m; //经循环后获得的m为最大公因子
this.molecule/=m;
return this;
}
public RationalNumber Add(RationalNumber number2) {//加法运算
RationalNumber result=new RationalNumber(0,1);
result.denominator=number2.denominator*this.denominator;
result.molecule=number2.molecule*this.denominator+this.molecule*number2.denominator;
return result.Reduction(); //得到结果后调用约分
}
public RationalNumber Subtraction(RationalNumber number2) {//减法运算
RationalNumber result=new RationalNumber(0,1);
RationalNumber temp=new RationalNumber(0,1);
temp.molecule=-number2.molecule;
temp.denominator=number2.denominator;
result=Add(temp); //减法就是添上负号的加法运算
return result;
}
public RationalNumber Muiltiply(RationalNumber number2) {//乘法运算
RationalNumber result=new RationalNumber(0,1);
result.molecule=this.molecule*number2.molecule;
result.denominator=this.denominator*number2.denominator;
return result.Reduction();
}
public RationalNumber Division(RationalNumber number2) {//除法运算
RationalNumber temp=new RationalNumber(0,1);
temp.denominator=number2.molecule;
temp.molecule=number2.denominator;
return Muiltiply(temp); //除以一个数相当于乘上该数的倒数
}
public String toString(){
if(denominator ==1){
return molecule +"";
}else{
return molecule +"/"+ denominator;
} //转化为字符串
}
}
测试代码(要在与有理数类不同包的其他类中调用有理数类)
package test;//在不同包中
import practice.RationalNumber;
public class Main {
public static void main(String[] args) {
RationalNumber x = new RationalNumber(4, 9);
RationalNumber y = new RationalNumber(2, 9);
System.out.println("x的分母为:"+x.GetDenominator());
System.out.println("x的分子为:"+x.GetMolecule());
System.out.println("x = " + x);
System.out.println("y的分母为:"+y.GetDenominator());
System.out.println("y的分子为:"+y.GetMolecule());
System.out.println("y = " + y);
System.out.println("x + y = " + x.Add(y));
System.out.println("x - y = " + x.Subtraction(y));
System.out.println("x * y = " + x.Muiltiply(y));
System.out.println("x / y = " + x.Division(y));
}
}
- 测试结果
尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
C语言的有理数代码中,往往是通过有理数的 数据结构体 + 函数 来实现有理数的相关运算。
而我设计的类则是将 有理数的 属性以及方法 都包含在类中。
在调用使用时,这些属性和方法都是针对该对象的,直接对该对象进行操作调用。
而C中的函数调用方法中传递参数时,传递参数值往往可能是多个对象的值或属性,需要考虑是哪几个对象间的操作函数,可能并不是只针对某一个对象。
尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论:
别人如何复用你的代码?
通过导入我设计的有理数类,如测试样例中:
//不同包中导入有理数类
package test;
import practice.RationalNumber;
别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
依赖,有需要用到有理数的属性的时候代码中自然会有所体现需要调用。
但是当我的有理数类属性修改时并不影响他人调用有理数代码。
有理数类的public方法是否设置合适?为什么有的方法设置为private?
有理数类的public方法设置合理,方便调用,包中的其他类都可以调用。
如有理数的属性设为private,这正是有理数的不能轻易改变的代码部分。比如一些产品属性是不便使用客户修改的这种情况,就需要设置private。同时设为private也更好的保证代码的安全性.