Complex工具类的设计及其加减乘除的实现

Complex工具类的设计及其加减乘除的实现

  • 工具类
    • 实现功能,复数的加减乘除
        • 1.关于Complex类的成员及构造方法设计
        • 2.方法组合设计(实例方法+静态方法)

工具类

根据Java自带的类(或者开发者设计为便捷开发的而自定义的类)和方法开发出来的工具。

实现功能,复数的加减乘除

1.关于Complex类的成员及构造方法设计

private double real;//实部
private double vir;//虚部

public Complex() {//无参构造
	this(0.0,0.0);
}
	
public Complex(double real) {//单参构造
	this(real,0.0);
}
	
public Complex(Complex other) {//参数是Complex类对象的单参构造
	this(other.real,other.vir);	
}
	
public Complex(double real, double vir) {//双参构造
	this.real = real;
	this.vir = vir;
}

2.方法组合设计(实例方法+静态方法)

  1. 加法设计。对于复数的加法来说,复数的加法按照以下规定的法则进行:设z1=a+bi,z2=c+di是任意两个复数,则它们的和z1+z2= (a+bi)+(c+di)=(a+c)+(b+d)i,对应两个复数的实部和1对应相加。
public  Complex Add(Complex other) {//通过实例方法来实现复数的加法,结果返回给调用该方法的对象
	this.real+=other.real;
	this.vir+=other.vir;
	return this;
}
	
public static Complex Add(Complex c1,Complex c2) {//将两个复数对象作为函数参数,通过单参对象构造法及实例相加方法来实现两个复数对象的加法,简化代码
	return new Complex(c1).Add(c2);
}
  1. 减法设计。对于复数减法,这里除了类似的加法的两种方法实现外还新添了了一种方法(加负法)。
public Complex Sub(Complex other) {
	this.real-=other.real;
	this.vir-=other.vir;
	return this;
}
public static Complex Sub(Complex c1,Complex c2) {
	return new Complex(c1).Sub(c2);
}
public Complex Sub(Complex c1,Complex c2){//加负法实现复数减法
	return new Complex(c1).Add(Complex.opposite(c2));
}
private static Complex opposite(Complex other) {//复数取反
	return new Complex(-other.real,-other.vir);
}
  1. 乘法设计。 设z1=a+bi,z2=c+di (a、b、c、d∈R)是任意两个复数,那么它们的积(a+bi)(c+di)=(ac-bd)+(bc+ad)i。两个复数的积仍然是一个复数。
public Complex Mul(Complex other) {
    double  tempreal=this.real; 
	this.real=tempreal*other.real-vir*other.vir;
	this.vir=tempreal*other.vir+vir*other.real;
	return this;
}
	
public static Complex Mul(Complex c1,Complex c2) {
	return new Complex(c1).Mul(c2);
}
  1. 除法设计 。设复数a+bi (a,b∈R),除以c+di (c,d∈R),即(a+bi)÷(c+di)=(a+bi)(c/(c2+d2),-d/(c2+d2)),这里公式里面c2与d2都是各自的平方,其结果也是复数,运算过程如图4.1
    Complex工具类的设计及其加减乘除的实现_第1张图片
    图4.1 复数的除法运算

public Complex Div(Complex other) {//乘以倒数
	Complex another=Complex.qudao(other);
	return another==null?null:Mul(another);
}
	
public static Complex Div(Complex c1,Complex c2) {
	Complex another=Complex.qudao(c2);
	return another==null?null:c1.Mul(another);
}

private static Complex qudao(Complex other) {//取复数的倒数
	double common=other.real*other.real+other.vir*other.vir;
	if(Math.abs(common)<1e-6) {//除数不为0
		return null;
	}
	return new Complex(other.real/common,-other.vir/common);
}
  1. 输出格式设计
    (1)实部虚部皆为0,输出0;
    (2)讨论实部,当实部为0,输出空串,否则输出实部;
    (3)讨论虚部,当虚部为0时,输出空串,否则判断虚部是否小于0(若小于0(再讨论是否等于-1,若为-1,则输出-i,否则输出虚部),若虚部大于0(再讨论实部是否为0(若为0再讨论(虚部是否等于1,若相等,则输出i,否则输出虚部),若不为0,则输出"+"实部));
public String toString() {
		if(Math.abs(real)<1e-6&&Math.abs(vir)<1e-6) {
			return "0";
		}
		return ((Math.abs(real)<1e-6)?"":real)
				+(Math.abs(vir)<1e-6?"":(vir<0?(((Math.abs(vir)-1)<1e-6)?"-i":vir+"i"):(Math.abs(real)<1e-6)?(((Math.abs(vir)-1)<1e-6)?"i":vir+"i"):("+"+vir+"i")));
	}

到此,Complex工具类的设计实现便完成了,其中方法的组合设计对于静态方法和实例方法都是一个很好的应用;而方法的多种实现方式也在某些方面达到某种借鉴作用。
初学工具类的设计,不足之处,请多多多指教!

参考文档:关于复数的运算法则

你可能感兴趣的:(Java工具类)