有理数类设计

有理数类设计

一.有理数类代码

package com.company;

public class Rational {
   
    private int numerator;//分子
    private int denominator;//分母

    public int getNumerator() //获取分子
    {
   
        return numerator;
    }

    public int getDenominator()//获取分母
    {
   
        return denominator;
    }

    public Rational()//无参构造函数
    {
   
        this.numerator=0;
        this.denominator=1;
    }
    public Rational(int numerator,int denominator)//构造函数
    {
   
        int gcd=gcd(numerator,denominator);
        this.numerator=((denominator>0)?1:-1)*numerator/gcd;
        this.denominator=Math.abs(denominator)/gcd;
    }
    private static int gcd(int n,int d)//辗转相除法,求最大公约数
    {
   
        int n1=Math.abs(n);
        int n2=Math.abs(d);
        int tmp;
        while (n2 != 0) {
   
            tmp = n1 % n2;
            n1 = n2;
            n2 = tmp;
        }
        return n1;
    }
    public Rational add(Rational secondRational)//加法
    {
   
        int n=this.numerator*secondRational.getDenominator()+
                this.denominator*secondRational.getNumerator();
        int d=this.denominator*secondRational.getDenominator();
        return new Rational(n,d);
    }

    public Rational subtract(Rational secondRational)//减法
    {
   
        int n=this.numerator*secondRational.getDenominator()-
                this.denominator*secondRational.getNumerator();
        int d=this.denominator*secondRational.getDenominator();
        return new Rational(n,d);
    }

    public Rational multiply(Rational secondRational)//乘法
    {
   
        int n=this.numerator*secondRational.getNumerator();
        int d=this.denominator*secondRational.getDenominator();
        return new Rational(n,d);
    }

    public Rational divide(Rational secondRational)//除法
    {
   
        int n=this.numerator*secondRational.getDenominator();
        int d=this.denominator*secondRational.getNumerator();
        return new Rational(n,d);
    }

    public String toString()//转换为字符串类型
    {
   
        if (this.denominator==1)
        {
   
            return this.numerator+"";
        }else{
   
            return this.numerator+"/"+this.denominator;
        }
    }

    public boolean equals(Rational secondRational)//判断是否相等
    {
   
        if (this.subtract(secondRational).getNumerator()==0)
            return true;
        else
            return false;
    }

    public int compare(Rational secondRational)//比较大小
    {
   
        if (this.subtract(secondRational).getNumerator()>0)
            return 1;
        else if (this.subtract(secondRational).getNumerator()==0)
            return 0;
        else
            return -1;
    }

    public int intValue() //转换为int型
    {
   
        return (int)doubleValue();
    }

    public long longValue() //转换为long型
    {
   
        return (long)doubleValue();
    }

    public float floatValue()  //转换为float型
    {
   
        return (float)doubleValue();
    }

    public double doubleValue() //转换为double型
    {
   
        return this.numerator*1.0/this.denominator;
    }
}

二.测试代码

import com.company.Rational;

public class Main {
   

    public static void main(String[] args){
   
        Rational x=new Rational(2,3);
        Rational y=new Rational(4,5);
        System.out.println(x.toString());
        System.out.println(y.toString());
        System.out.println(x.add(y));
        System.out.println(x.subtract(y));
        System.out.println(x.multiply(y));
        System.out.println(x.divide(y));
        System.out.println(x.equals(y));
        System.out.println(x.compare(y));
        System.out.println(x.intValue());
        System.out.println(x.longValue());
        System.out.println(x.floatValue());
        System.out.println(x.doubleValue());
    }
}

运行结果截图

有理数类设计

三.讨论

1.描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?

面向过程的C语言是对程序的执行过程的编写, 而面向对象编程是编写出很多功能性的代码,主要是对类的编写,在运用的时候很多时候只需要调用就可以了。

2.别人如何复用你的代码?

导入自己编写的有理数类

3.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?

会依赖,不影响。

4.有理数类的public方法是否设置合适?为什么有的方法设置为private?

只需要调用就可以了。

2.别人如何复用你的代码?

导入自己编写的有理数类

3.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?

会依赖,不影响。

4.有理数类的public方法是否设置合适?为什么有的方法设置为private?

合适,因为有的方法只能运用在类中,不能随便更改,需要通过public的方法访问该方法,保证数据的安全性。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114442.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python中的多线程「建议收藏」

    Python中的多线程「建议收藏」什么是多线程:进程:正在运行的程序,QQ360……线程:就是进程中一条执行程序的执行路径,一个程序至少有一条执行路径。(360中的杀毒电脑体检电脑清理同时运行的话就需要开启多条路

    2022年7月3日
    33
  • vue项目中使用postcss-px2rem的方法总结「建议收藏」

    vue项目中使用postcss-px2rem的方法总结「建议收藏」标题vue项目中postcss-px2rem的使用在项目中为了屏幕适配,经常会用到rem,postcss-px2rem就是为了让我们直接在将代码中px自动转化成对应的rem的一个插件如何使用:1.安装npmipostcss-px2rem–save-dev2.设置(以下总结了三种方式)1).找到项目根目录下的.postcssrc文件module.exports={“plugins”:{“postcss-import”:{},”postcss-url”

    2025年8月1日
    3
  • A2W W2A A2T T2A _T() 含义以及用法

    A2W W2A A2T T2A _T() 含义以及用法A2W、W2A、A2T、T2A _T() 的含义及使用方法1、A2W和W2A在《Window核心编程》,多字节和宽字节之间转换比较麻烦的,MultiByteToWideChar函数和WideCharToMultiByte函数有足够多的参数的意义让我们去理解。那么使用ATL的一个很好的字符串的转换宏:A2W和W2A。char:8位字节类型,表示ASCII码WCHAR:16位字符类型,表示Un…

    2022年8月18日
    4
  • C#网络编程(Socket编程)「建议收藏」

    C#网络编程(Socket编程)「建议收藏」一、Socket网络编程1.Socket是什么?在计算机通信领域,Socket被译为“套接字”。它是计算机之间进行通信的一种约定或一种方式。通过Socket这种约定可以接收到其他计算机的数据,也可以向其他计算机发送数据。2.本质是编程接口(API),对于TCP/IP的封装,TCP/IP也提供了可供程序员做网络开发所用的接口3.作用Socket的英文原意是“插座”,的意思,通常在计算机编…

    2022年7月13日
    14
  • ubuntu 安装Qt Creator

    ubuntu 安装Qt Creator转载地址:http://my.phirobot.com/blog/2013-12-ros_ide_qtcreator.htmlQt下载地址: http://download.qt.io/archive/ROS开发环境之QtCreatorCreatedat: 2013-12-29T00:00:00  YuanboShe  ROS  turtlebot, ros, qt,可以用于ROS开发的…

    2022年9月25日
    2
  • Linux系统安装Nodejs(4.4.7)

    Linux系统安装Nodejs(4.4.7)

    2021年9月6日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号