JAVA面向对象程序设计翁恺 第一周作业——类与对象

题目链接:面向对象程序设计——Java语言_中国大学MOOC(慕课) (icourse163.org)

题目内容:设计一个表示分数的类Fraction。这个类用两个int类型的变量分别表示分子和分母。

这个类的构造函数是:

Fraction(int a, int b);//构造一个a/b的分数。

这个类要提供以下的功能:

double toDouble();

//将分数转换为double

Fraction plus(Fraction r);

//将自己的分数和r的分数相加,产生一个新的Fraction的对象。注意小学四年级学过两个分数如何相加的哈。

Fraction multiply(Fraction r);

//将自己的分数和r的分数相乘,产生一个新的Fraction的对象。

void print();

//将自己以“分子/分母”的形式输出到标准输出,并带有回车换行。如果分数是1/1,应该输出1。当分子大于分母时,不需要提出整数部分,即31/30是一个正确的输出。

注意,在创建和做完运算后应该化简分数为最简形式。如2/4应该被化简为1/2。

你写的类要和以下的代码放在一起,并请勿修改这个代码:

import java.util.Scanner;

public class Main
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        Fraction a = new Fraction(in.nextInt(), in.nextInt());
        Fraction b = new Fraction(in.nextInt(),in.nextInt());
        a.print();
        b.print();
        a.plus(b).print();
        a.multiply(b).plus(new Fraction(5,6)).print();
        a.print();
        b.print();
        in.close();
    }
}

注意,你的类的定义应该这样开始:

class Fraction {

也就是说,在你的类的class前面不要有public。

输入格式:

程序运行时会得到四个数字,分别构成两个分数,依次是分子和分母。

输出格式:

输出一些算式。这些输入和输出都是由Main类的代码完成的,你的代码不要做输入和输出。

输入样例:

2 4 1 3

输出样例:

1/2

1/3

5/6

1

1/2

1/3

实现代码如下:

import java.util.Scanner;

public class Main
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        Fraction a = new Fraction(in.nextInt(), in.nextInt());
        Fraction b = new Fraction(in.nextInt(),in.nextInt());
        a.print();
        b.print();
        a.plus(b).print();
        a.multiply(b).plus(new Fraction(5,6)).print();
        a.print();
        b.print();
        in.close();
    }
}

class  Fraction
{
    //类中的成员变量最好都设置为private
    private int mol;//分子
    private  int den;//分母
    private double dou;//浮点数类型值
    public Fraction(int mol, int den)//构造函数
    {
        this.mol = mol;
        this.den = den;
    }
    public double toDouble()//将分数转换为double类型值
    {
        dou = mol/(double)den;
        return dou;
    }
    public int theDivisor(int a, int b)//返回a,b两个数的最大公约数
    {
        int num = 1;
        for(int i=2; i<=a && i<=b; i++)
        {
            if(a%i==0 && b%i==0)
                num = i;
        }
        return num;
    }
    public Fraction plus(Fraction r)//将自己的分数和r的分数相加,产生一个新的Fraction的对象
    {
        int mol_1 = this.mol;//为了不改变对象原始值,采用新增的变量来计算并返回值
        int den_1 = this.den;
        int mol_2 = r.mol;
        int den_2 = r.den;
        int ride_den, mol_result;//分别为两个分数相加之后分母、分子的最终值
        if(den_1 == den_2)
        {
            mol_result = mol_1 + mol_2;
            ride_den = den_1;
        }
        else if(den_2%den_1==0)
        {
            ride_den = den_2;
            mol_1 *= (den_2/den_1);
            mol_result = mol_1 + mol_2;
        }
        else if(den_1%den_2==0)
        {
            ride_den = den_1;
            mol_2 *= (den_1/den_2);
            mol_result = mol_1 + mol_2;
        }
        else
        {
            ride_den = den_1 * den_2;
            mol_1 *= den_2;
            mol_2 *= den_1;
            mol_result = mol_1 + mol_2;
        }
        return new Fraction(mol_result, ride_den);
    }
    public Fraction multiply(Fraction r)//将自己的分数和r的分数相乘
    {
        int mol_1 = this.mol;
        int den_1 = this.den;
        int mol_2 = r.mol;
        int den_2 = r.den;
        int mol_result = mol_1*mol_2;
        int den_result = den_1*den_2;
        //产生一个新的Fraction的对象
        return new Fraction(mol_result, den_result);//这样不会改变a对象中变量的值
    }
    public void print()//将自己以“分子/分母”的形式输出到标准输出
    {
        if(this.mol == this.den)//分子分母相等
            System.out.println(1);
        else if(theDivisor(mol,den) == 1)//没有最大公约数
            System.out.println(mol+"/"+den);
        else//有最大公约数进行约分
        {
            int divisor = theDivisor(mol,den);
            int mol_1 = mol, den_1 = den;
            mol_1 /= divisor;
            den_1 /= divisor;
            System.out.println(mol_1+"/"+den_1);
        }
    }
    public void printDouble()//打印变为double的值,本次作业没有用到
    {
        double toDouble = toDouble();
        System.out.println("double is: "+toDouble);
    }
}

运行结果:

 

如有感到疑惑的地方欢迎在评论区提出或私信作者噢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱摸鱼的小铁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值