Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2020, 13:27   #1
Александр222
Пользователь
 
Регистрация: 15.04.2020
Сообщений: 59
Вопрос C++. Проверка знаменателя

Вопрос. Как сделать так, чтобы знаменатель корректно проверялся на 0. Здесь код, где я проверяю его через if. Еще была попытка через try. Суть в том, что это работает, но программа все равно вычисляет дробь. А надо, чтобы (в случае знаменателя = 0) выводил mistake. Как можно решить этот вопрос?

Rational.cpp
Код:
#include <iostream>
#include "Rational.h"

Rational::Rational(int Numerator, int Denominator): Numerator(Numerator), Denominator(Denominator) {}
Rational::Rational(const Rational& R): Numerator{ R.Numerator }, Denominator{ R.Denominator } {}

void Rational::SetNumerator(){}
void Rational::SetDenominator(){}

int Rational::GetNumerator() const { return Numerator; }
int Rational::GetDenominator() const { 
    
    if (Denominator == 0) {
        std::cout << "mistake!";
        return 0;
    }
    else { return Denominator; }
    
}

Rational operator + (const Rational& a, const Rational& b) {
    Rational R (a.GetNumerator() * b.GetDenominator() + b.GetNumerator() * a.GetDenominator(), a.GetDenominator() * b.GetDenominator());

    R.reduce();
    return R;
}

Rational operator - (const Rational& a, const Rational& b) {
    Rational R (a.GetNumerator() * b.GetDenominator() - b.GetNumerator() * a.GetDenominator(), a.GetDenominator() * b.GetDenominator());

    R.reduce();
    return R;
}

Rational operator * (const Rational& a, const Rational& b) {
    Rational R(a.GetNumerator() * b.GetNumerator(), a.GetDenominator() * b.GetDenominator());

    R.reduce();
    return R;
}

Rational operator / (const Rational& a, const Rational& b) {
    Rational R (a.GetNumerator() * b.GetDenominator(), a.GetDenominator() * b.GetNumerator());

    R.reduce();
    return R;
}

bool operator > (const Rational& a, const Rational& b) { return (a.GetNumerator()/b.GetNumerator()) > (a.GetDenominator()/b.GetDenominator()); }
bool operator < (const Rational& a, const Rational& b) { return (a.GetNumerator() / b.GetNumerator()) < (a.GetDenominator() / b.GetDenominator()); }
bool operator == (const Rational& a, const Rational& b) { return (a.GetNumerator() == b.GetNumerator() && a.GetDenominator() == b.GetDenominator()); }
bool operator != (const Rational& a, const Rational& b) { return !(a == b); }

std::ostream& operator << (std::ostream& out, const Rational& R) { 
    out << "Numerator, Denominator: " << R.Numerator << ", " << R.Denominator;
    return out;
};

std::istream& operator >> (std::istream& in, Rational& R) {
    in >> R.Numerator >> R.Denominator;
    return in;
};
Rational.h

Код:
#ifndef RATIONAL_H
#define RATIONAL_H
#include <iostream>
#include <sstream>

class Rational {

private:
    int Numerator{};
    int Denominator{};
    
    void reduce() {        
        int N = NOD(Numerator < 0 ? -Numerator : Numerator, Denominator);
        Numerator /= N;
        Denominator /= N;                
    }
    int NOD(int a, int b) const {
        while (a) {
            int t = b % a;
            b = a;
            a = t;
        }
        return b;
    }  
public:
    Rational() = default;
    Rational(int Numerator, int Denominator);
    Rational(const Rational& R);

    void SetNumerator();
    void SetDenominator();

    int GetNumerator() const;
    int GetDenominator() const;
    
    friend Rational operator + (const Rational& a, const Rational& b);
    friend Rational operator - (const Rational& a, const Rational& b);
    friend Rational operator * (const Rational& a, const Rational& b);
    friend Rational operator / (const Rational& a, const Rational& b);

    friend bool operator > (const Rational& a, const Rational& b);
    friend bool operator < (const Rational& a, const Rational& b);
    friend bool operator == (const Rational& a, const Rational& b);
    friend bool operator != (const Rational& a, const Rational& b);

    friend std::ostream& operator << (std::ostream& out, const Rational&);
    friend std::istream& operator >> (std::istream& in, Rational&);
};
#endif

Последний раз редактировалось BDA; 03.10.2020 в 14:39.
Александр222 вне форума Ответить с цитированием
Старый 04.10.2020, 18:36   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Нужно кидать исключение, а не сразу печатать сообщение. Возможно стоит "не давать" создавать дроби с нулевым знаменателем (кидать исключение в конструкторе). Потом уже ловить исключение и печатать сообщение. Операторы сравнения на больше и меньше сейчас неверно работают. Во-первых, там получается целочисленное деление. Во-вторых, сравнивать стоит, наверное, a.GetNumerator() * b.GetDenominator() и a.GetDenominator() * b.GetNumerator(), чтобы не использовать вещественные числа.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.10.2020, 20:02   #3
Александр222
Пользователь
 
Регистрация: 15.04.2020
Сообщений: 59
По умолчанию

BDA, Спасибо!
Александр222 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка БД anatoliy1992 Помощь студентам 1 10.08.2015 10:20
excel.Проверка VBA и проверка функции Будда Помощь студентам 0 14.04.2011 21:10
проверка на IE TDrive JavaScript, Ajax 2 05.03.2010 13:41
Проверка FTP }{oт@бь)ч Работа с сетью в Delphi 5 05.02.2009 04:44