设计并实现一个分数类Fraction

 

描述

一个分数有两部分组成——分子和分母,如5/6

为Fraction类定义实现赋值、加、减、乘、除以及相等判定的运算符,

并定义转换至double型值的函数(保留小数点后六位)

输入

输入一个分数计算表达式,分数用a/b表示,计算符只有+,-,*,/
表达式比较简单,只有 A operator B,其中A和B是分数,operator是计算符

输出

输出计算结果,分别用分数和小数的形式表示: 形如 分数(小数)

样例输入

5/6 + 3/4

样例输出

19/12(1.583333)

提示

1. 分数表达式必须是最简,该约分约分,不要用带分数
2. 小数表达时,如果小数点后不足六位,则需要对应补零
3. 例如对于 5/6 * 3/4, 输出 5/8(0.625000)

#include <iostream>
#include <cstdio>
#include <iomanip>
int gcd(int a,int b)
{
    return b==0 ? a : gcd(b,a%b);
}
class fraction
{
    int num;//numerator
    int deno;//denomination
    double valu;
public:
    fraction(int a=0,int b=0):num(a),deno(b){}

    fraction operator+(fraction &b)
    {
        fraction temp;
        int a=deno;
        num*=b.deno,deno*=b.deno;
        b.num*=a,b.deno*=a;
        if(deno==b.deno)//现在分母相同了,这句可省
        {
            temp.num=num+b.num;
            temp.deno=deno;
            a=gcd(temp.num,temp.deno);
            if(a)
            {
                temp.num/=a;
                temp.deno/=a;
            }
            temp.valu=temp.num/temp.deno;
            return temp;
        }
    }
    fraction operator-(fraction &b)
    {
        fraction temp;
        int a=deno;
        num*=b.deno,deno*=b.deno;
        b.num*=a,b.deno*=a;
        if(deno==b.deno)//现在分母相同了
        {
            temp.num=num-b.num;
            temp.deno=deno;
            a=gcd(temp.num,temp.deno);
            if(a)
            {
                temp.num/=a;
                temp.deno/=a;
            }
            temp.valu=(double)temp.num/temp.deno;
            return temp;
        }
    }
    fraction operator*(fraction &b)
    {
        fraction temp;
        temp.deno=deno*b.deno;
        temp.num=num*b.num;
        int a=gcd(temp.num,temp.deno);
        if(a)
        {
            temp.num/=a;
            temp.deno/=a;
        }
        temp.valu=(double)temp.num/temp.deno;
        return temp;
    }
    fraction operator/(fraction &b)
    {
        fraction temp;
        temp.deno=deno*b.num;
        temp.num=num*b.deno;
        int a=gcd(temp.num,temp.deno);
        if(a)
        {
            temp.num/=a;
            temp.deno/=a;
        }
        temp.valu=(double)temp.num/temp.deno;
        return temp;
    }
    void print()
    {
        printf("%d/%d(%.6lf)\n",num,deno,num*1.0/deno);
    }
};

int main()
{
    char ch;
    int a1,a2,b1,b2;
    scanf("%d/%d %c %d/%d",&a1,&a2,&ch,&b1,&b2);
    fraction a(a1,a2),b(b1,b2);
    fraction c;
    switch(ch)
    {
        case '+':c=a+b;break;
        case '-':c=a-b;break;
        case '*':c=a*b;break;
        case '/':c=a/b;break;
    }
    c.print();
    return 0;
}

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页