复数的四则运算

复数的四则运算

下面的代码是用Java编写的,主要是Complex的四则运算

该类主要负责实现复数的四则运算,加减乘除
每种运算都使用了两种方式,类似a+=b,c=a+b
减法使用加法表示,除法使用乘法表示,
包括取反,和取倒数

1.复数必须包含两个变量,实部(real)虚部(vir),为方便外界调用,给予对应的Getter和Setter方法,同时,给予四种构造方法,无参,单参,双参,对象参

	private double real;
	private double vir;
	
	public Complex() {
	}
		
	public Complex(double real) {
		this.real = real;
	}

	public Complex(double real, double vir) {
		this.real = real;
		this.vir = vir;
	}
	
	public Complex(Complex complex) {
		this(complex.real,complex.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;
	}

2.为了实现减法用加法表示,除法用乘法表示,给出取反和取倒

鉴于这两个函数只是为完成减法和除法的编写,所以不打算给外界调用,故使用private

	//取反
	private static  Complex invert(Complex a) {
		return new Complex(-a.real,-a.vir);
	}
	
	/*取倒数
	 *  1/(a+bi)
	 * (a-bi)/((a+bi)(a-bi))
	 * (a-bi)/(a*a + b*b)
	 * 实部:a/(a*a + b*b);虚部:-b/(a*a + b*b)
	 */
	private static Complex reciprocal(Complex a) {
		if(a.real*a.real+a.vir*a.vir - 0 < 1e-6)	
			throw new DivZeroException("除0错");
			//此处可直接抛RunTimeException()异常,DivZeroException()异常为我自行定义,继承了RunTimeException()
		return new Complex(a.real/(a.real*a.real+a.vir*a.vir),-(a.vir/(a.real*a.real+a.vir*a.vir)));
	}

3.每种四则运算皆有两种表示方式,类似a+=b,c=a+b,下面以加法为例

	//a+=b
	public Complex add(Complex a) {
		this.real+=a.real;
		this.vir+=a.vir;
		return this;
	}
	
	//c=a+b,调用add(Complex a)
	public static Complex add(Complex a,Complex b) {
		return new Complex(a).add(b);
	}

4.重写equals方法和toString方法,输出格式为(real,vir)

@Override
	public boolean equals(Object obj) {
		if (obj == null) {
			return false;
		}
		if (this == obj) {
			return true;
		}
		if (obj.getClass() != this.getClass()) {
			return false;
		}
		
		Complex c = (Complex) obj;
		
		return Math.abs(c.real - this.real) < 1e-6 && Math.abs(c.vir - this.vir) < 1e-6;
	}


	@Override
	public String toString() {
		return "("+real+","+vir+")";//用(real,vir)格式输出复数
	}

该类完整代码如下:


public class Complex {
	private double real;
	private double vir;
	
	public Complex() {
	}
		
	public Complex(double real) {
		this.real = real;
	}

	public Complex(double real, double vir) {
		this.real = real;
		this.vir = vir;
	}
	
	public Complex(Complex complex) {
		this(complex.real,complex.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;
	}
	
	
	//取反
	private static  Complex invert(Complex a) {
		return new Complex(-a.real,-a.vir);
	}
	
	/*取倒数
	 *  1/(a+bi)
	 * (a-bi)/((a+bi)(a-bi))
	 * (a-bi)/(a*a + b*b)
	 * 实部:a/(a*a + b*b);虚部:-b/(a*a + b*b)
	 */
	private static Complex reciprocal(Complex a) {
		if(a.real*a.real+a.vir*a.vir - 0 < 1e-6)	
			throw new DivZeroException("除0错");
			//此处可直接抛RunTimeException()异常,DivZeroException()异常为我自行定义,继承了RunTimeException()
		return new Complex(a.real/(a.real*a.real+a.vir*a.vir),-(a.vir/(a.real*a.real+a.vir*a.vir)));
	}
	
	//加法
	//a+=b
	public Complex add(Complex a) {
		this.real+=a.real;
		this.vir+=a.vir;
		return this;
	}
	
	//c=a+b,调用add(Complex a)
	public static Complex add(Complex a,Complex b) {
		return new Complex(a).add(b);
	}
	
	//减法
	//a-=b
	public Complex sub(Complex a) {
		return add(invert(a));
	}
	
	//c=a-b
	public static  Complex sub(Complex a,Complex b) {
		return new Complex(a).add(invert(a));
	}
	
	//乘法
	//a*=b
	//实部:ac-bd  虚部:(ad+bc)i
	public Complex mul(Complex a) {
		double real1 = this.real;
		double real2 = a.real;
		double vir1 = this.vir;
		double vir2=a.vir;
		this.real = real1*real2-vir1*vir2;
		this.vir = real1*vir2+real2*vir1;
		return this;
	}
	
	//c=a*b
	public static Complex mul(Complex a,Complex b) {
		return new Complex(a).mul(b);
	}
	
	//a/=b
	public Complex div(Complex a) {
		return mul(reciprocal(a));
	}
	
	//c=a/b
	public static Complex div(Complex a,Complex b) {
		return new Complex(a).mul(reciprocal(b));
	}
	
	

	@Override
	public boolean equals(Object obj) {
		if (obj == null) {
			return false;
		}
		if (this == obj) {
			return true;
		}
		if (obj.getClass() != this.getClass()) {
			return false;
		}
		
		Complex c = (Complex) obj;
		
		return Math.abs(c.real - this.real) < 1e-6 && Math.abs(c.vir - this.vir) < 1e-6;
	}

	//输出
	@Override
	public String toString() {
		return "("+real+","+vir+")";//用(real,vir)格式输出复数
	}

}

下面为测试类,为了便于计算,只调用了双参的四则运算,即类似于c=a+b

在下面的测试类中,我使用Complex类直接调用了四则运算的方法,这种写法是可以的,但有一个前提,直接使用类名调用方法时,要求该方法为静态,即使用static修饰

public class Test {

	public static void main(String[] args) {
		Complex c1 = new Complex(1, -6);
		Complex c2 = new Complex(2, 6);
		
		System.out.println("加法");
		Complex c3 = Complex.add(c1, c2);
		System.out.println(c3);
		
		System.out.println("减法");
		Complex c4 =Complex.sub(c1, c2);
		System.out.println(c4);

		System.out.println("乘法");
		Complex c5 = Complex.mul(c1, c2);
		System.out.println(c5);

		System.out.println("除法");
		Complex c6 = Complex.div(c1, c2);
		System.out.println(c6);
		

	}

}

不使用类名调用,add(Complex a,Complex b)就可以不使用“static”修饰。下面以加法为例,代码如下:

	System.out.println("加法");
	Complex c3 = new Complex();
	c3.add(c1, c2);
	System.out.println(c3);

运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 编写一个类实现复数的运算。 复数ComplexNumber的属性: m_dRealPart:部,代表复数数部分。 m_dImaginPart:虚部,代表复数的虚数部分。 复数ComplexNumber的方法: ComplexNumber():构造函数,将部、虚部都置为0。 ComplexNumber(double r,double i):构造函数,创建复数对象的同时完成复数部、虚部的初始化,r为部的初值,i为虚部的初值。 getRealPart():获得复数对象部。 getImaginPart():获得复数对象的虚部。 setRealPart(double d):把当前复数对象部设置为给定的形式参数的数字。 setImaginaryPart(double d):把当前复数对象的虚部设置为给定的形式参数的数字。 complexAdd(ComplexNumber c):当前复数对象与形式参数复数对象相加,所得的结果也是复数值,返回给此方法的调用者。 complexAdd(double c):当前复数对象与形式参数对象相加,所得的结果仍是复数值,返回给此方法的调用者。 complexMinus(ComplexNumber c) :当前复数对象与形式参数复数对象相减,所得的结果也是复数值,返回给此方法的调用者。 complexMinus(double c) :当前复数对象与形式参数对象相减,所得的结果仍是复数值,返回给此方法的调用者。 complexMulti(ComplexNumber c):当前复数对象与形式参数复数对象相乘,所得的结果也是复数值,返回给此方法的调用者。 complexMulti(double c):当前复数对象与形式参数对象相乘,所得的结果仍是复数值,返回给此方法的调用者。 toString():把当前复数对象部、虚部组合成a+bi的字符串形式,其中和分别为部和虚部的数据。 2. 编写Java Application程序使用上题定义的类,检查类定义是否正确。
import java.io.*; public class Book{ double sb; double xb; Book(double x,double y){ this.sb=x; this.xb=y; } Book(){ } public static void main(String args[]){ System.out.println("请输入数据:"); double a=0; double b=0; double c=0; double d=0; String s; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入第一个复数部:"); try{ s = in.readLine(); a=Double.parseDouble(s); } catch(IOException e) { System.out.println("抛掷异常");} System.out.println("请输入第一个复述的虚部:"); try{ s = in.readLine(); b =Double.parseDouble(s); } catch(IOException e) { System.out.println("抛掷异常");} System.out.println("请输入第二个复述的部:"); try{ s = in.readLine(); c =Double.parseDouble(s); } catch(IOException e) { System.out.println("抛掷异常");} System.out.println("请输入第二个复述的虚部:"); try{ s = in.readLine(); d =Double.parseDouble(s); } catch(IOException e) { System.out.println("抛掷异常");} Book h; h=new Book(a,b); Book j; j=new Book(c,d); System.out.println("您输入的一个数为:"); toString(h); System.out.println("您输入的二个数为:"); toString(j); Book k; k=new Book(); char z='y'; do{ System.out.println("请选择您要进行的计算:"); System.out.println("1 :进行加法运算"); System.out.println("2 :进行减法运算"); System.out.println("3 :进行修改"); System.out.println("4 :进行乘法运算"); System.out.println("5 :进行除法运算"); System.out.println("6 :查看修改结果"); int i=0; try{ i= Integer.parseInt(in.readLine()); } catch(IOException e) { System.out.println("抛掷异常");} switch(i) { case 1: k.sb=jia(h.sb,j.sb); k.xb=jia(h.xb,j.xb); System.out.println("计算结果的部为:"+k.sb); System.out.println("计算结果的虚部为:"+k.xb); toString(k); break ; case 2: k.sb=jian(h.sb,j.sb); k.xb=jian(h.xb,j.xb); System.out.println("计算结果的部为:"+k.sb); System.out.println("计算结果的虚部为:"+k.xb); toString(k); brea

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值