Реализация операций с дробями

95
01 октября 2021, 10:50

Суть задания:

Реализовать класс Fraction для работы с дробными числами, число представлено двумя полями: целая часть (long int) и дробная часть (unsigned short int). Реализовать сложение, вычитание, умножение и сравнение.

Пример моей реализации:

class Fraction{
private:
    long int integer;
    unsigned short int fractional;
public:
void Read(){
        cin >> integer;
        cin >> fractional;
    }
    bool isEq(const Fraction& obj){
        if(integer == obj.integer && fractional == obj.fractional){
            return true;
        }
        else{
            return false;
        }
    }
    void Sum(const Fraction& obj){
        integer += obj.integer;
        fractional += obj.fractional;
    }
    void Display(){
        cout << integer << "." << fractional << endl;
    }
};

Вопрос: При сложении дробей может возникнуть ситуация, когда сумма дробной части превышает 1 (3.25 + 3.85 = 7.1 (В программе выходит 6.110)). Как реализовать корректное сложение дробной части?

Вопрос 2: Возможно ли представить дробную часть которая начинается с "0" (.001) используя unsigned short int?

Answer 1

Ваш класс должен выглядеть совершенно иначе, но все же ответ на первый вопрос. Нужно определять количество цифр у максимального числа, и после этого все легко:

void Sum(const Fraction& obj) {
    integer += obj.integer;
    unsigned short e = 10,
        max = std::max(fractional, obj.fractional);
    fractional += obj.fractional;
    while (max > e)
        e *= 10;
    if (fractional > e) {
        fractional %= e;
        ++integer;
    }           
}

Ответ на второй вопрос: возможно, но нужно хранить в классе количество этих нулей

Answer 2

Думаю, предполагается, что в дробной части хранятся сотые.

void Sum(const Fraction& obj) {
    integer += obj.integer;
    fractional += obj.fractional;
    integer += fractional / 100;
    fractional = fractional % 100;
}
cout << integer << "." << /* add 0 if needed */fractional << endl;
READ ALSO
SVG Анимация постепенного появления stroke-dasharray

SVG Анимация постепенного появления stroke-dasharray

Спустя неоднократные попытки анимировать круг со свойством stroke-dasharray, придумал вариант вложенности circle в circle:

111
Управление SVG-координатами `path` с помощью JavaScript

Управление SVG-координатами `path` с помощью JavaScript

У меня есть path SVG со следующими точками в атрибуте d

93
Импорт модуля Node/JS, require/import, module/commonjs

Импорт модуля Node/JS, require/import, module/commonjs

Пытаюсь достучаться до импорта модулей

172
Как правильно в данном случае поступить с функцией, как при вызове функции пропускать параметры

Как правильно в данном случае поступить с функцией, как при вызове функции пропускать параметры

Есть задачаНаписать функцию, которая принимает время (часы, минуты, секунды) и выводит его на экран в формате «чч:мм:сс»

199