Java的Complex复数类计算并逐步优化
Java实现Complex复数类的加减乘除
- 实现Complex类的成员以及构造方法还有get( )和set()方法
- 进行加法减法的编写,确定加法和减法的参数 以及方法的public protected 和 private的属性
- 对乘法除法进行相同的思路分析
- 还有对to String ()方法进行重写
- 对equals()方法进行重写,使之成为判断Complex类的相等判断方法
- 接下来看一看我们的构造方法以及我们的重写的方法
public class Complex {
private double real;
private double vir;
public Complex(double real,double vir) {
this.real=real;
this.vir=vir;
}
public Complex() {
this(0.0,0.0);
}
public Complex(Complex c) {
this(c.real,c.vir);
}
public Complex(double vir) {
this.real=0.0;
this.vir=vir;
}
public double getReal() {
return real;
}
public void setReal(double real) {
this.real = real;
}
public double getVir() {
return vir;
}
public void setVir(double vir) {
this.vir = vir;
}
}
看看我们写的重写方法:
public boolean equals(Object obj) {
if(null==obj) { //传入的对象为空
return false;
}
if(!(obj instanceof Complex)) { //不是同一种类
return false;
}
if((this == obj)) { //两个首地址直接是相等的 ,两个类相等
return true;
}
Complex c=(Complex) obj;
return Math.abs(this.real-c.real)<1e-6 && Math.abs(this.vir-c.vir)<1e-6;
}
这里穷尽了实部的虚部的各种情况,进行合理的输出:
public String toString() {
if(this.vir ==0&&Math.abs(real)>1e-6) {
return real+"";
}
if(this.vir==1&&Math.abs(real)>1e-6) {
return real+"+"+"i";
}
if(vir<0&&Math.abs(real)>1e-6) {
if(vir==-1) {
return real+"-"+"i";
}
return real+"-"+(-vir)+"i";
}
if(Math.abs(real)<10e-6&&Math.abs(vir)<1e-6) {
return "0.0";
}
if(Math.abs(real)<10e-6&&vir==-1 ) {
return "-i";
}
if(Math.abs(real)<10e-6&&vir==1 ) {
return "i";
}
if(Math.abs(real)<10e-6) {
return vir+"i";
}
return real+"+"+vir+"i";
}
- 接下来进行add()方法的编写 ,属性为public的,现在考虑只有一个参数的情况,通过对象来调用add(),将两个Complex相加
- 另一种情况是双参数的方法,及两个参数之间进行相加,这时候要注意调用相关方法时,如果在通过一个对象来进行调用的话,语句可能会出现从c1.add(c2,c3); 这样会看着比较奇怪,所以我们将add()双参方法设置成为static属性的,这样就可以直接用类名来调用add()函数,Complex.add(c1,c2);
- 我们来看看代码:
public void add(Complex one) {
this.vir+=one.vir;
this.real+=one.real;
}
public static Complex add(Complex one,Complex two) {
one.vir+=two.vir;
one.real+=two.real;
return one;
}
接下来进行减法的设计,和加法同理,不过我们想调用工具,于是做一个求相反数的类。
public static Complex sub(Complex one,Complex two) {
return add(one, opposite(two));
}
public static Complex opposite(Complex one) {
return new Complex(-one.real,-one.vir);
}
- 乘除与加减类似,我们打算用一个求倒数的方法来让我们调用:
public static Complex multiply(Complex one,Complex two) {
double c=one.real;
one.real=one.real*two.real-two.vir*two.vir;
one.vir=c*two.vir+one.vir*two.real;
return one;
}
public static Complex reciprocal(Complex a) {
int model =(int) (a.real*a.real+a.vir*a.vir);
if(Math.abs(model)<10e-6)
return null;
else {
a.real=a.real/model;
a.vir=a.vir/model;
return a;
}
}
public static Complex divide(Complex one,Complex two) {
Complex c=reciprocal(two);
return c==null ?null: multiply(one,c);
}
这样我们就设计好了一个类,虽然不算完备,但已经实现了该有的加减乘除方法。
也具备一定的工具思想!