上海电机学院Java编程实验题

【问题描述】设计一个分数类Fraction,包含分子与分母两个成员变量,包含计算分数加减乘除及约分的成员方法。为便于运算和比较,所有分数均以最简形式存储和输出(分子可以大于分母,但是分子和分母不能进一步约分;若分数为负,为方便处理,约定分子为负,分母为正)
在这里插入图片描述

暂时不想解释了,直接看代码吧

package sy06.sy01;

import java.util.Scanner;

public class TestFraction {
    public static void main(String[] args) {
        Fraction f2 = null;
        Scanner sc = new Scanner(System.in);
        System.out.println("Please enter fraction f1:");
        int n1 = sc.nextInt();
        int d1 = sc.nextInt();
        Fraction f1 = new Fraction(n1, d1);
        System.out.println("Please enter fraction f2:");
        int n2 = sc.nextInt();
        int d2 = sc.nextInt();
        f2 = new Fraction(n2, d2);
        sc.close();
        Fraction addRet = null, subRet = null, mulRet = null, divRet = null;
        addRet = f1.add(f2);
        subRet = f1.sub(f2);
        mulRet = f1.mul(f2);
        divRet = f1.div(f2);
        System.out.println(f1 + " + " + f2 + " = " + addRet);
        System.out.println(f1 + " - " + f2 + " = " + subRet);
        System.out.println(f1 + " * " + f2 + " = " + mulRet);
        System.out.println(f1 + " / " + f2 + " = " + divRet);
        System.out.println(f1 + " equals " + f2 + " ? " + f1.equals(f2));
    }
}

class Fraction {
    int nume; // numerator
    int deno; // denominator

    Fraction() {
        this(0, 1);
    }

    Fraction(int nume, int denu) {
        this.nume = nume;
        this.deno = denu;
        reduce();
    }

    Fraction add(Fraction fo) {
        int x;
        int y = this.deno;
        if (this.deno == fo.deno) {
            x = this.nume + fo.nume;
        } else {
            x = this.nume * fo.deno + fo.nume * this.deno;
            y = this.deno * fo.deno;
        }
        return new Fraction(x, y);
    }

    Fraction sub(Fraction fo) {
        int x;
        int y = this.deno;
        if (this.deno == fo.deno) {
            x = this.nume - fo.nume;
        } else {
            x = this.nume * fo.deno - fo.nume * this.deno;
            y = this.deno * fo.deno;
        }
        return new Fraction(x, y);
    }

    Fraction mul(Fraction fo) {
        int x = this.nume * fo.nume;
        int y = this.deno * fo.deno;
        return new Fraction(x, y);
    }

    Fraction div(Fraction fo) {
        if (fo.nume == 0) {
            System.out.println("Cannot be divided by zero!");
            System.exit(-1);
        }
        int x = this.nume * fo.deno;
        int y = this.deno * fo.nume;
        return new Fraction(x, y);
    }

    int getMaxComFactor(int m, int n) {
        if (nume == 0)
            return 1;
        if (m < n) {
            m = m + n;
            n = m - n;
            m = m - n;
        }
        int r = m % n;
        while (r != 0) {
            m = n;
            n = r;
            r = m % n;
        }
        return n;
    }

    void reduce() {
        if (deno == 0) {
            System.out.println("The denominator cannot be zero!");
            System.exit(-1);
        }
        int sign = 1;
        if (nume * deno < 0) {
            sign = -1;
        }
        int absNume = Math.abs(nume);
        int absDenu = Math.abs(deno);
        int maxFac = getMaxComFactor(absNume, absDenu);
        nume = absNume / maxFac * sign;
        deno = absDenu / maxFac;
    }

    @Override
    public String toString() {
        if (nume == 0)
            return "0";
        else if (nume == deno)
            return "1";
        else
            return nume + "/" + deno;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        else if (obj.getClass() == Fraction.class) {
            Fraction ft = (Fraction) obj;
            if (ft.nume == this.nume && ft.deno == this.deno)
                return true;
            else
                return false;
        } else {
            return false;
        }
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值