繁体   English   中英

使用运算符重载添加分数

[英]Add fractions using operator overloading

在一次采访中,我被要求创建两个班级。 第一个抽象类叫做Number,它支持一个操作“+”。 而另一个实现“Number”抽象类的部分。

进一步:对于一次添加的分数,它需要以原始形式显示。 也就是说,2/4必须显示为“2/4”,而不是“1/2”或“0.5”。

没有提供其他细节。

以下是我的尝试(不完整)。

我的main.cpp

#include <iostream>
#include "Fraction.h"
using namespace std;
int main()
{
    Fraction sumFraction;
    Fraction n11(1,2);
    Fraction n21(1,2);
    cout << n11.getValuenum() << "/";
    cout << n11.getValueden() << endl;
    cout << n21.getValuenum() << "/";
    cout << n21.getValueden() << endl;
    sumFraction = n11 + n21;
    cout << sumFraction.getValuenum() << endl;
    cout << sumFraction.getValueden() << endl;
    return 0;
}

我的Numbers.h //抽象类

  #pragma once
    template<class T>
    class Number
    {
        virtual T& operator= (const T &) = 0; // first parameter is implicitly passed
        virtual const T operator+ (const T &) = 0;
        virtual void display() = 0;
    };

我的Fraction.cpp

#include "Fraction.h"

int Fraction::getValuenum()
{
    return this->a1;
}

int Fraction::getValueden()
{
    return this->a2;
}

Fraction::Fraction()
{
    a1 = 0;
    a2 = 0;
}
Fraction::Fraction(int num, int den)
{
    a1 = num;
    a2 = den;
}

void Fraction::display()
{
    // will display the number in its original form
}

Fraction& Fraction::operator=(const Fraction &num)
{
    a1 = num.a1;
    a2 = num.a2;
    return *this;
}

const Fraction Fraction::operator+(const Fraction &numberTwo)
{
    Fraction n1;
    n1.a1 = this->a1*numberTwo.a2 + this->a2*numberTwo.a1;
n1.a2 = this->a2*numberTwo.a2;
    return n1;
}

我的Fraction.h

#pragma once
#include "Number.h"
class Fraction : public Number<Fraction>
{
private:
    int a1;
    int a2;
public:
    void display();
    Fraction();
    Fraction(int num, int den);
    int getValuenum();
    int getValueden();
    Fraction& operator= (const Fraction &); // first parameter is implicitly passed
    const Fraction operator+ (const Fraction &); // first parameter is implicitly passed

};

以下是我的问题:

  1. 我是否真的需要为每个分数分别从我的Main函数传递分子和分母。 目前,我正在单独传递它以跟踪分子和分母,这可能有助于在分数方面添加和返回结果。

  2. 使用我的操作符+逻辑,如果我添加1/4 + 1/4,我得到8/16,如果我们正常添加,我猜的是2/4。 那么如何添加使用分子和分母并以这种方式保持分数,这样如果输出是2/4然后是2/4而不是1/2或0.5。

请帮我。

一些评论:

  • 你不应该允许分母为0,因为它给出了一个不存在的数字(无穷大或未终止)
  • 你绝对应该因为同样的原因将分母初始化为0(1似乎是更合理的值)
  • 分数的正确(数学)加法是(*):

     a/b + c/d = (ad +bc)/bd 

而不是(或除了)显示方法,我建议你写一个ostream& operator << (ostream&, const Fraction&)重载。 这样你就可以只写你的主要内容

std::cout << n11 << " + " << n21 << " = " << sumFraction << std::endl;

我没有真正理解你的第一个问题,但我会从int添加一个转换:

Fraction(int n): a1(n), a2(1) {};

允许直接写入Fraction(1, 2) + 1Fraction(1) + Fraction(1/2) (加法的第一个元素必须是分数)

(*)这是简单而通用的方式。 您还可以使用最小公倍数来获得更清晰的结果:

den = lcm(b,d)
a/b + c/d = (a * den/b) + c * den/d) / den

那样你就得到1/4 + 2/4 = 3/4而不是12/16

计算LCM远不是这个答案......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM