又写作业了,这次要求写一个复数类,需要实现默认和有参两种构造方法、get和set方法、复数与实数的加减乘法、复数与复数的加减乘法、以及输出复数的方法。其实掌握了基础知识之后,这个作业并不是很难,只是需要写的方法多一些,另外一个非常重要的点是细节的考虑。
完整代码在文末,在此之前先讨论一些新手比较容易出错的小问题。

乘法陷阱

先看一段代码:

ComplexNumber complexMulti(ComplexNumber c){/***当前复数与形参复数相乘*@param c 接收的参数,一个复数*@return 返回乘法运算的结果*/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){/***当前复数与形参复数相乘*@param c 接收的参数,一个复数*@return 返回乘法运算的结果*/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(){/***以字符串形式输出复数*@return 返回字符串*/String s = "";s = this.realPart + "+" + this.iPart + "i";    return s;}

告诉我你是不是这样想的?
这个写法当然不是错的,但它不够严谨,它只适用于实部和虚部都大于零的情况,而其他情况,这个写法会出现一些不符合我们平常习惯的结果:比如“0±1.5i”,正常人都会写“-1.5i”。
所以要分几种情况进行考虑:
对于实部,只需要考虑是否为零的情况,如果是零则省略不写,而因为它前面什么也没有,即使有负号也是符合常规写法的;
对于虚部,需要考虑正、负、零三种情况,因为它要与前面的实部连接,如果是零则省略,如果是正则不需要符号,如果是负则需要去掉前面的“+”符号。
实部两种情况,虚部三种情况,相乘共有6种情况,但是考虑到当实部为零时,不需要“+”连接,因此后面的虚部无论大于零还是小于零都可以用同一种方法表示。所以,只需要五种情况,代码如下:

public String toString(){/***以字符串形式输出复数*@return 返回字符串*/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也可以省略。

完整代码

下面是完整代码,需要自取。

/**
*@author Linda ZHENG
*/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){/***无参构造方法*@param r 接收的第一个参数,实部*@param i 接收的第二个参数,虚部*/realPart = r;iPart = i;  }double getRealPart(){/***获取实部*@return 实部*/return realPart;    }void setRealPart(double d){/***设置实部*@param d 接收的参数,实部*/realPart = d;  }double getIPart(){/***获取实部*@return 实部*/return iPart;  }void setIPart(double d){/***设置虚部*@param d 接收的参数,虚部*/iPart = d;    }ComplexNumber complexAdd(ComplexNumber c){/***当前复数与形参复数相加*@param c 接收的参数,一个复数*@return 返回加法运算的结果*/realPart += c.realPart;iPart += c.iPart;return this; }ComplexNumber complexAdd(double c){/***当前复数与形参实数相加*@param c 接收的参数,一个实数*@return 返回加法运算的结果*/realPart += c;return this;    }ComplexNumber complexMinus(ComplexNumber c){/***当前复数与形参复数相减*@param c 接收的参数,一个复数*@return 返回减法运算的结果*/realPart -= c.realPart;iPart -= c.iPart;return this; }ComplexNumber complexMinus(double c){/***当前复数与形参实数相减*@param c 接收的参数,一个实数*@return 返回减法运算的结果*/realPart -= c;return this;   }ComplexNumber complexMulti(ComplexNumber c){/***当前复数与形参复数相乘*@param c 接收的参数,一个复数*@return 返回乘法运算的结果*/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){/***当前复数与形参实数相乘*@param c 接收的参数,一个实数*@return 返回乘法运算的结果*/realPart *= c;iPart *= c;return this;}public String toString(){/***以字符串形式输出复数*@return 返回字符串*/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;}
}

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

  1. java设计复数类报告总结_java复数类

    1 编写一个完整的 Java 程序,包括 Complex 和 TestComplex 两个类. 使用复数类 Complex 验证两个复数 1+2i 和 3+4i 相加产生一个新的复数 4+6i . . ...

  2. Java 编写程序打印以下图形_怎么用java编写如下程序在屏幕上输出如下图形 * *** *** * 循环语句做(if语句)...

    怎么用java编写如下程序在屏幕上输出如下图形 * *** ***** ******* ***** ... 4个答案  提问时间: 2011-12-16  22个赞 回答:这个图形对吧? * *** ...

  3. java编写教师类输出_Java类和对象的区别和联系,超简单易懂!

    在面向对象的编程语言中,类和对象必然是最核心的特性之一.本文主要介绍Java中的类和对象. 示例 以班级成员为例,班上有小红.小明.小李,还有王老师.张老师和魏老师,我们认为他们都属于"人类 ...

  4. java编写一个类book代表教材_java 请通过代码封装,实现如下需求: 编写一个类Book,代表教材:...

    java 请通过代码封装,实现如下需求: 编写一个类Book,代表教材: 关注:191  答案:2  mip版 解决时间 2021-02-01 17:18 提问者万丈深渊 2021-02-01 10: ...

  5. java编写计算类加减乘除_老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java...

    导航:网站首页 > 老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java 时间:2019-4-10 老师要求张浩使用面向对象的思想编 ...

  6. java编写hot_类的热加载(Hot Deployment)的简单例子

    应用服务器一般都支持热部署(Hot Deployment),更新代码时把新编译的确类 替换旧的就行,后面的程序就执行新类中的代码.这也是由各种应用服务器的独 有的类加载器层次实现的.那如何在我们的程序 ...

  7. java声明复数类_JAVA声明复数类

    声明复数类,成员变量包括实部和虚部,成员方法包括实现由字符串构造复数.复数加法.减法,字符串描述.比较相等等操作. 虽然我只是一个刚学一个月JAVA的菜鸡,但是强迫症让我把复数乘法和除法一起写出来了. ...

  8. java测试类生成对象,java编写student类 用Java编写一段测试程序,生成student类的两个对象,并输出每个对象基本信息?...

    java中怎么创建对象数组?比如我创建了一个学生类Student,怎么用这个类创建一个对象数组,麻烦给个例子? 学生类:classA{privateStringnameprivateintagepub ...

  9. Java编写学生类student程序_编写一个JAVA程序片断定义一个表示学生的类student.docx...

    编写一个JAVA程序片断 定义一个表示学生的类student,包括域"学号","班级","姓名","性别"," ...

最新文章

  1. linux内核如何安装vim,如何在Linux 中安装和使用 PacVim?
  2. GCC中同时使用动态和静态库链接的编译
  3. C语言a+++b的问题
  4. Linux Graphic DRI Wayland 显示子系统
  5. 农村电商谋定双创工程-李玉庭:互联网+农产品重整流通
  6. 怎么判断前轮左右的位置_如何判定汽车前面左右轮的位置?大家有什么经验?...
  7. matlab 次坐标轴 标注,matlab标注坐标轴
  8. 零基础入门Python数据分析,只需要看懂这一张图,附下载链接!
  9. c++ primer随笔
  10. 使用 ONNX 模型做预测
  11. Py下载指定路径下所有图片
  12. SQL必知必会阅读笔记
  13. 项目中常用字典表 —— 各个国家简称映射
  14. python实现动态壁纸_如何实现一个 windows 桌面动态壁纸
  15. 大学计算机基础教程大纲
  16. html按钮功能的实现原理,触摸按键原理是什么 触摸按键原理介绍【图文详解】...
  17. Linux resolv.conf 简介
  18. ui设计一般用什么软件(ui学哪些软件)
  19. 数据治理(四):数据仓库数据质量管理
  20. Phong与Blinn-Phong

热门文章

  1. 案例:儿童呼吸道疾病数据集
  2. mkmf.rb can‘t find header files for ruby at /System/Library/Frameworks/Ruby.framework/... ...
  3. SimpleDateFormat的时空穿越之旅
  4. 什么叫大数据,与云计算有何关系
  5. Android 解析二维码图片
  6. 办公软件之excel打印时打印区域与纸张不符解决方法
  7. Nginx修改上传文件的大小限制
  8. stm32成长记之滴答时钟
  9. 前端学习 -- 什么是api
  10. DHC谷歌浏览器插件的安装