8.14 实例:复数类的设计
设计一个复数类,首先我们来看看什么是复数。
我们把形如a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位。i的平方等于-1。
当虚部等于零时,这个复数可以视为实数;当z的虚部不等于零时,实部等于零时,常称z为纯虚数。
复数是由意大利米兰学者卡当在十六世纪首次引入,经过达朗贝尔、棣莫弗、欧拉、高斯等人的工作,此概念逐渐为数学家所接受。
复数的四则运算规定为:
加法法则:
(a+bi)+(c+di)=(a+c)+(b+d)i
减法法则:
(a+bi)-(c+di)=(a-c)+(b-d)i
乘法法则:
(a+bi)·(c+di)=(ac-bd)+(bc+ad)i
除法法则:
(a+bi)/(c+di)=[(ac+bd)/(c²+d²)]+[(bc-ad)/(c²+d²)]i
复数的模:实部的平方加上虚部的平方,再开根号
练习题
-
按照要求设计复数类,每一道题都是在上一题的基础上增加方法,例如第X题完成的代码是AABB,那么第X+1题的代码就在AABB的基础上增加方法。不要删除上一题已完成的方法。1.设计一个方法div,功能是两个复数的除法,接收一个复数参数,返回两个复数的商(当前对象除以参数,结果也是一个复数) (10分) [编程]提示:调用是类似于com1.div(com2),需要测试被除数是否为0
本题测试代码需要用到两个参数的构造函数,计算模的函数
注意,被除数的模不能为0,
(a+bi)/(c+di)=[(ac+bd)/(c²+d²)]+[(bc-ad)/(c²+d²)]i2.设计一个方法isPure,测试对象是否是纯虚数。是的话返回true,否则返回false (10分) [编程]3.设计一个方法isReal,测试对象是否是实数。是的话返回true,否则返回false (10分) [编程]虚部为0就是实数4.定义复数类Complex,含有两个属性x和y,分别代表实部和虚部(x是实部),都是double类型 (10分) [编程]定义类不需要main函数5.用eclipse的代码生成功能,生成x和y的getter和setter函数 (10分) [编程]6.添加一个构造函数,接受两个double参数,分别设置x和y的值 (10分) [编程]注意是在上题基础上添加7.设计一个方法toString,不需要参数,以“5+6i”的形式返回值实部和虚部 (10分) [编程]注意区别以下情况
当虚部是0的时候,不打印i,例如7是正确的,7+0i是错误的
当实部是0的时候,不打印“+”号,例如9i是正确的,0+9i就是错误的
当虚部是负数的时候,不打印“+”号,例如5-7i是正确的,5+-7i是错误的。
由于实部虚部都是double类型,5+6i会打印成5.0+6.0i,对此种情况不予处理
(实际上这个方法是复写Object类的toString方法,这使得我们可以直接打印对象:Complex s=new Complex(6.0,7.0);/*将打印6.0+7.0i */System.out.println(s);8.设计方法len,不需要参数,返回复数的模 (10分) [编程]实部的平方加上虚部的平方,再开平方,就是复数的模
开平方可使用Math.sqrt函数
本题测试代码需要用到两个参数的构造函数9.设计一个方法add,接收一个复数参数,返回两个复数的和(结果也是一个复数) (10分) [编程]提示:调用是类似于Complex com3=com1.add(com2)
本题测试代码需要用到两个参数的构造函数Complex c1=new Complex(2.2,4.0);Complex c2=new Complex(3.5,5.1);Complex c3=c1.add(c2);System.out.println(c3);//这里将打印5.7+9.1i10.设计一个方法minus,接收一个复数参数,返回两个复数的差(当前对象减去参数,结果也是一个复数) (10分) [编程]提示:调用是类似于Complex com3=com1.minus(com2)
本题测试代码需要用到两个参数的构造函数11.(***)升级toString函数,不需要参数,以“5+6i”的形式返回值实部和虚部 (20分) [编程]1.4题的规则:
当虚部是0的时候,不打印i,例如7是正确的,7+0i是错误的
当实部是0的时候,不打印“+”号,例如9i是正确的,0+9i就是错误的
当虚部是负数的时候,不打印“+”号,例如5-7i是正确的,5+-7i是错误的。
在上面的规则,添加虚部是正负1的规则:
当虚部是1和-1的时候,不打印1,例如5+i,6-i
由于实部虚部都是double类型,5+6i会打印成5.0+6.0i,这样打印不规范,可用下面代码的方法来规避:
/*在Complex.java内部 */public String toString(){ /* 强制转换成int */ int xx=(int)this.x; int yy=(int)this.y; /* 默认的实部的字符串形式,默认的虚部的字符串形式 */ String strX=this.x+""; String strY=this.y+""; /* 如果转换的整数等于小数,说明小数部分为0,也就是3.0这样的形式,那么实部的字符串形式改成整数转成 */ if(xx==this.x){ strX=xx+""; } if(yy==this.y){ strY=yy+""; } /* 把后续的this.x替换成strX,this.y替换成strY,就可以实现去掉“.0” */ }/*测试用的main函数,尽量不要写在Complex类 */public static void main(String[]args){ /* 将打印-i */ Complex c=new Complex(0,-1); System.out.println(c); /* 将打印i */ s=new Complex(0,1); System.out.println(s); /* 将打印3-i */ s=new Complex(3,-1); System.out.println(s); /* 将打印3+i */ s=new Complex(3,1); System.out.println(s); /* 正常打印3.3-2.3i */ s=new Complex(3.3,-2.3); System.out.println(s); /* 正常打印3.3+2.3i */ s=new Complex(3.3,2.3); System.out.println(s);}12.设计一个方法com,功能是两个复数的乘法,接收一个复数参数,返回两个复数的积(也是一个复数) (10分) [编程]提示:调用是类似于Complex c3=c1.com(c2)
本题测试代码需要用到两个参数的构造函数13.设计一个静态方法add,接收两个复数参数,返回两个复数加法的和(结果也是一个复数) (10分) [编程]提示:调用是类似于Complex com3=Complex.add(com1,com2)
本题测试代码需要用到两个参数的构造函数(本节第1.3题)