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²)]i
    2.设计一个方法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.1i
    
    10.设计一个方法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题)