Как я могу разрешить пользователю изменять значение дробей?

Я должен написать программу, которая имеет num и denom в качестве элементов данных класса Fractions. Я также должен включить функцию-конструктор, которая устанавливает оба значения равными 1 или разрешает инициализацию пользователя, перегруженную операторную функцию для + и функцию-член, которая может отображать значения данных объекта. Кроме того, предполагается запретить 0 для значения знаменателя. Как разрешить пользователю изменять значения дробей? Кроме того, что я должен сделать, чтобы запретить использование 0 в качестве знаменателя? Когда я запускаю свою программу, она просто показывает слова в первых 4 строках, но не позволяет вводить данные пользователем.

#include <iostream>

using namespace std;

class Fractions
{
private:
    int num;
    int denom;
public:
    Fractions() : num(1), denom(1) {}
    Fractions(int numerator, int denominator) 
        : num(numerator), denom(denominator) {}

    Fractions& operator+=(Fractions f);

    int numerator() const { return num; }
    int denominator() const { return denom; }

};

Fractions& Fractions::operator+=(Fractions f)
{
    if (denom != f.denom)
    {
        int new_base = denom * f.denom;

        num *= new_base / denom;
        denom = new_base;

        f.num *= new_base / f.denom;
        f.denom = new_base;
    }

    num += f.num;
    return *this;
}

// operator+ is commonly implemented in terms of operator+=
Fractions operator+(Fractions a, const Fractions& b)
{
    return a += b;
}

std::ostream& operator<<(std::ostream& os, const Fractions& f)
{
    os << f.numerator();

    if (f.denominator() != 1)
        os << '/' << f.denominator();

    return os;
}

int main()
{
    int w, x, y, z;
    Fractions a(w, x);
    Fractions b(y, z);

    std::cout << "Enter the first numerator: " << endl;
    std::cin >> w;
    std::cout << "Enter the first denominator: " << endl;
    std::cin >> x;
    std::cout << "Enter the second numerator: " << endl;
    std::cin >> y;
    std::cout << "Enter the second denominator: " << endl;
    std::cin >> z;

    std::cout << a << " + " << b << " = " << a + b << '\n';
}

person user3427349    schedule 17.03.2014    source источник
comment
Сначала инициализируйте переменные.   -  person Balu    schedule 17.03.2014


Ответы (2)


Вы должны использовать переменные после ввода пользователя:

int main()
{
    int w, x, y, z;

    std::cout << "Enter the first numerator: " << endl;
    std::cin >> w;
    std::cout << "Enter the first denominator: " << endl;
    std::cin >> x;
    std::cout << "Enter the second numerator: " << endl;
    std::cin >> y;
    std::cout << "Enter the second denominator: " << endl;
    std::cin >> z;

    Fractions a(w, x);
    Fractions b(y, z);

    std::cout << a << " + " << b << " = " << a + b << '\n';

}

person songyuanyao    schedule 17.03.2014
comment
Я сделал это, но он все еще не позволяет вводить - person user3427349; 17.03.2014
comment
@user3427349 user3427349 Что значит запретить ввод? Пожалуйста, объясните это более подробно. Каков результат и что вы ожидаете? - person songyuanyao; 17.03.2014

В вашем коде есть несколько проблем.

Самое главное, вы инициализируете дроби до чтения пользовательского ввода, тогда как вы должны инициализировать их после. Поэтому строка cout в вашем коде будет производить только мусор.

Чтобы позволить пользователю изменять значения, вы можете реализовать функции

int & numerator() { return num; } и

int & denominator() { return num; }

а затем использовать

a.numerator() = 5 например.

Кроме того, вы можете изменить свой код, чтобы operator+ не реализовывался как operator+=.

person riklund    schedule 17.03.2014
comment
Возврат ссылок на внутренние члены данных — плохая практика программирования, поскольку она превращает ваш класс из черного ящика в белый ящик. Лучше иметь пары сеттер/геттер при работе с внутренними данными. - person RobbieE; 17.03.2014
comment
@user3427349 user3427349, эталонные функции входят в определение вашего класса. - person riklund; 17.03.2014
comment
@RobbieE, в общем случае ты абсолютно прав. Для этого конкретного (небольшого) класса я не вижу необходимости в черном ящике. - person riklund; 17.03.2014