栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java编写复数类之——乘法和输出的陷阱

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java编写复数类之——乘法和输出的陷阱

又写作业了,这次要求写一个复数类,需要实现默认和有参两种构造方法、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;
	}
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/273720.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号