又写作业了,这次要求写一个复数类,需要实现默认和有参两种构造方法、get和set方法、复数与实数的加减乘法、复数与复数的加减乘法、以及输出复数的方法。其实掌握了基础知识之后,这个作业并不是很难,只是需要写的方法多一些,另外一个非常重要的点是细节的考虑。
完整代码在文末,在此之前先讨论一些新手比较容易出错的小问题。
先看一段代码:
ComplexNumber complexMulti(ComplexNumber c){
realPart = realPart * c.realPart - iPart * c.iPart;
iPart = iPart * c.realPart + realPart * c.iPart;
return this;
}
你觉得这段代码有问题吗?它能得出正确的乘积结果吗?
如果看不出来,可以试着运行一下。
运行一下,你会发现出来一个离谱的结果。为什么会这样?
我当时也挺迷惑的,与人工计算相比较,乘积的实部是正确的,但虚部是错误的,所以仔细想一想,发现问题出在哪里了吗?
出在“realPart = realPart * c.realPart - iPart * c.iPart”这一句上,在这一句里,原本的复数的realPart已经改变了,而在后一句中,计算iPart时,使用的是这个已经改变了的realPart。
所以解决方法时,新建临时变量,把原本的复数的实部和虚部存储在这个临时变量中,代码如下:
ComplexNumber complexMulti(ComplexNumber c){
double r1 = realPart;
double r2 = c.realPart;
double i1 = iPart;
double i2 = c.iPart;
realPart = r1 * r2 - i1 * i2;
iPart = i1 * r2 + r1 * i2;
return this;
}
再尝试运行,多试几个复数,就会发现结果都正确了。
输出的陷阱当你完成了一些计算后,你可能会希望程序向你报告这个复数,因此会用到toString方法,形成一个字符串,然后打印在屏幕上,toString多简单嘛,你可能会这样想,那不就是:
public String toString(){
String s = "";
s = this.realPart + "+" + this.iPart + "i";
return s;
}
告诉我你是不是这样想的?
这个写法当然不是错的,但它不够严谨,它只适用于实部和虚部都大于零的情况,而其他情况,这个写法会出现一些不符合我们平常习惯的结果:比如“0±1.5i”,正常人都会写“-1.5i”。
所以要分几种情况进行考虑:
对于实部,只需要考虑是否为零的情况,如果是零则省略不写,而因为它前面什么也没有,即使有负号也是符合常规写法的;
对于虚部,需要考虑正、负、零三种情况,因为它要与前面的实部连接,如果是零则省略,如果是正则不需要符号,如果是负则需要去掉前面的“+”符号。
实部两种情况,虚部三种情况,相乘共有6种情况,但是考虑到当实部为零时,不需要“+”连接,因此后面的虚部无论大于零还是小于零都可以用同一种方法表示。所以,只需要五种情况,代码如下:
public String toString(){
String s = "";
if(this.realPart == 0 && this.iPart != 0){
s = iPart + "i";
}else if(this.realPart == 0 && this.iPart == 0){
s = "" + 0.0;
}else if(this.realPart != 0 && this.iPart < 0){
s = this.realPart + "" + this.iPart + "i";
}else if(this.realPart != 0 && this.iPart == 0){
s = this.realPart + "";
}else if(this.realPart != 0 && this.iPart > 0){
s = this.realPart + "+" + this.iPart + "i";
}
return s;
}
这里还是有一些欠考虑,比如虚部是1i,通常1也可以省略。
完整代码下面是完整代码,需要自取。
public class ComplexNumber{
public static void main(String[] args){
ComplexNumber c = new ComplexNumber(4.0, 5.0);
ComplexNumber cc = new ComplexNumber(3.0, -4.0);
c.complexMulti(cc);
System.out.println(c.toString());
}
double realPart;
double iPart;
ComplexNumber(){
realPart = 0.0;
iPart = 0.0;
}
ComplexNumber(double r, double i){
realPart = r;
iPart = i;
}
double getRealPart(){
return realPart;
}
void setRealPart(double d){
realPart = d;
}
double getIPart(){
return iPart;
}
void setIPart(double d){
iPart = d;
}
ComplexNumber complexAdd(ComplexNumber c){
realPart += c.realPart;
iPart += c.iPart;
return this;
}
ComplexNumber complexAdd(double c){
realPart += c;
return this;
}
ComplexNumber complexMinus(ComplexNumber c){
realPart -= c.realPart;
iPart -= c.iPart;
return this;
}
ComplexNumber complexMinus(double c){
realPart -= c;
return this;
}
ComplexNumber complexMulti(ComplexNumber c){
double r1 = realPart;
double r2 = c.realPart;
double i1 = iPart;
double i2 = c.iPart;
realPart = r1 * r2 - i1 * i2;
iPart = i1 * r2 + r1 * i2;
return this;
}
ComplexNumber complexMulti(double c){
realPart *= c;
iPart *= c;
return this;
}
public String toString(){
String s = "";
if(this.realPart == 0 && this.iPart != 0){
s = iPart + "i";
}else if(this.realPart == 0 && this.iPart == 0){
s = "" + 0.0;
}else if(this.realPart != 0 && this.iPart < 0){
s = this.realPart + "" + this.iPart + "i";
}else if(this.realPart != 0 && this.iPart == 0){
s = this.realPart + "";
}else if(this.realPart != 0 && this.iPart > 0){
s = this.realPart + "+" + this.iPart + "i";
}
return s;
}
}



