标签:有理数 int denominator numerator Rational 设计 public
有理数类的设计
1.给出你的有理数类的代码。
package Rational;
public class Rational {
private int denominator = 1;// 有理数的分母
private int numerator = 0;// 有理数的分子
public Rational() // 构造无参函数
{
this(0, 1);
}
public Rational(int numerator, int denominator) // 构造有参数的函数
{
this.denominator = Math.abs(denominator);
this.numerator = ((denominator > 0) ? 1 : -1) * numerator;
}
public double toDouble()// 转化为double
{
return this.numerator * 1.0 / this.denominator;
}
public int toInt()// 转化为int
{
return (int) toDouble();
}
public float toFloat()// 转化为float
{
return (float) toDouble();
}
public long toLong()// 转化为long
{
return (long) toDouble();
}
public int gcd(int a, int b) //求最大公约数
{
int x = Math.abs(a);
int y = Math.abs(b);
if (x < y) {
int temp = x;
x = y;
y = temp;
}
if (x % y != 0) {
int k = x % y;
return gcd(y, k);// 再次循环
}
return y;
}
public Rational add(Rational a, Rational b) // 有理数加法
{
int x = a.numerator * b.denominator + b.numerator * a.denominator;
int y = a.denominator * b.denominator;
int newnum = x / gcd(x, y);
int newden = y / gcd(x, y);
return new Rational(newnum, newden);
}
public Rational subtract(Rational a, Rational b) // 有理数减法
{
int x = a.numerator * b.denominator - b.numerator * a.denominator;
int y = a.denominator * b.denominator;
int newnum = x / gcd(x, y);
int newden = y / gcd(x, y);
return new Rational(newnum, newden);
}
public Rational multiply(Rational a, Rational b) // 有理数乘法
{
int x = a.numerator * b.numerator;
int y = a.denominator * b.denominator;
int newnum = x / gcd(x, y);
int newden = y / gcd(x, y);
return new Rational(newnum, newden);
}
public Rational divide(Rational a, Rational b) // 有理数除法
{
int x = a.numerator * b.denominator;
int y = a.denominator * b.numerator;
int newnum = x / gcd(x, y);
int newden = y / gcd(x, y);
return new Rational(newnum, newden);
}
public String toString()// 转换为字符串类型
{
if (this.denominator == 1) {
return this.numerator + "";
} else {
return this.numerator + "/" + this.denominator;
}
}
public void compare(Rational a, Rational b)// 比较大小
{
if (this.subtract(a, b).toDouble() > 0)
System.out.println(a + ">" + b);
else if (this.subtract(a, b).toDouble() == 0)
System.out.println(a + "=" + b);
else
System.out.println(a + "<" + b);
}
public String roundedTothree()// 保留三位小数
{
java.text.DecimalFormat df = new java.text.DecimalFormat("#0.000");
return df.format(this.numerator * 1.0 / this.denominator);
}
}
2.你的测试代码。要在与有理数类不同包的其他类中调用有理数类。
package javalearn;
import Rational.Rational;
public class Main {
public static void main(String[] args) {
Rational x = new Rational(5, 7);
Rational y = new Rational(4, 5);
Rational z = new Rational();
System.out.println(x.toString());
System.out.println(y.toString());
System.out.println(z.add(x, y).toString());
System.out.println(z.subtract(x, y).toString());
System.out.println(z.multiply(x, y).toString());
System.out.println(z.divide(x, y).toString());
z.compare(x, y);
System.out.println(x.toInt());
System.out.println(x.toLong());
System.out.println(x.toFloat());
System.out.println(x.toDouble());
System.out.println(x.roundedTothree());
}
}
3.运行结果
4.尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
java是针对对象的机制,可以通过对类的编写,使用时导入,在对象后写其方法就可以,十分便捷,而c语言则需要通过函数的方式,面对过程,编写代码时也是对这个过程的编写,使用时调用就可以了。
5.尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
a.别人如何复用你的代码?
导入包中的有理数类,
import Rational.Rational;
b.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
依赖,不影响,有理数类中属性设置为private,不影响他人调用
c.有理数类的public方法是否设置合适?为什么有的方法设置为private?
合适,不希望被别人更改,同时编写相应的public方法使别人使用。
标签:有理数,int,denominator,numerator,Rational,设计,public 来源: https://www.cnblogs.com/song0820/p/13766536.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。