Поле first – целое положительное число, числитель; поле second – целое положительное...

0 голосов
59 просмотров

Поле first – целое положительное число, числитель; поле second – целое положительное число, знаменатель. Реализовать метод nesokr ( ) – приведение дроби first/second к несократимому виду. Тема: Классы, язык С++


Информатика (64 баллов) | 59 просмотров
Дан 1 ответ
0 голосов

Привет, код задачи приведен ниже, пожалуйста:
1. Отметь ответ как лучший (поставь 5 звезд).
2. Нажми кнопочку "Спасибо" тут и в моем аккаунте, спасибо :)

(За 8 былов такое никто не делает кроме меня, пожалуйста, будь благодарен в ответ)

Код прокомментирован, за дополнительными вопросами или информацией прошу:
* Обращайся в комментарии, я отвечу на вопросы.
* Зайди ко мне в профиль, в моих записях ты найдешь ссылки на полезные ресурсы.



FILE: CFraction.hpp

#ifndef CFRACTION_HPP
#define CFRACTION_HPP

//Это класс дроби, тут мы храним чеслитель, знаменатель и функцию nesokr().
class CFraction
{
   public:

      CFraction();   //Конструктор класа

      //"Геттеры" класса для получения значений приватных полей
      const unsigned int& getNumerator() const;
      const unsigned int& getDenumerator() const;

      //"Сеттеры" класса для задани значений приватным полям
      void setNumerator(const unsigned int& value);
      void setDenumerator(const unsigned int& value);

      //Функция заданная по заданию для сокращения дроби
      void nesokr();

   private:

      //Функция реализующая поиск найбольшего общего делителя по алгоритму Евклида
      const unsigned int getGreatestCommonDivisor() const;
      //Функция проверяющая, есть ли необходимость искать НОД
      const bool isRequireCalculationGCD() const;

   private:

      unsigned int mFirst;    //Поле для числителя
      unsigned int mSecond;   //Поле для знаменателя
};

#endif //CFRACTION_HPP



FILE: CFraction.cpp

#include "CFraction.hpp"

CFraction::CFraction()
: mFirst(0)    //Числитель инициализируем нулем
, mSecond(1)   //Знаменатель по умолчанию инициализируем единицей
{

}

//Возращение значений происходит по константной ссылке.
//Благодаря этому избегается копирование переменной,
//а так же её модификация по ссылке.
const unsigned int& CFraction::getNumerator() const
{
   return mFirst;
}

//Функция имеет в конце себя слово const сигнализирующее компилятору,
//что метод не способен модифицировать поля класса.
const unsigned int& CFraction::getDenumerator() const
{
   return mSecond;
}

//Передача аргумента в функцию так же реализуется по константной ссылке,
//из тех же соображений что и возращение поля по константной ссылке.
void CFraction::setNumerator(const unsigned int& value)
{
   mFirst = value;
}

void CFraction::setDenumerator(const unsigned int& value)
{
   //Проверяем значение на 0, знаменатель не может быть равнм нулю.
   //Значение не проверяется на знак отрицания, по тому, что везде используется
   //беззнаковый целочисленный тип данных unsigned int.
   if (0 != value)
   {
      mSecond = value;
   }
}

void CFraction::nesokr()
{
   //Если есть необходимость проводить расчёты и сокращать дробь, то
   //находим НОД и делим на него чеслитель и знаменатель.
   if ( isRequireCalculationGCD() )
   {
      unsigned int greatestCommonDivisor = getGreatestCommonDivisor();

      mFirst /= greatestCommonDivisor;
      mSecond /= greatestCommonDivisor;
   }
}

const bool CFraction::isRequireCalculationGCD() const
{
   //Проверяем, не является, ли знаменатель равным единице,
   //иначе нет смысла проводить безсмысленную работу, т.к. в любом случаи НОД
   //будет единица, то же самое делаем с числителем.
   return ( (1 != mSecond || 1 != mFirst) || (1 != mSecond && 1 != mFirst) );
}

const unsigned int CFraction::getGreatestCommonDivisor() const
{
   //Алгоритм поиска НОД называется алгоритмом Евклида
   unsigned int remainder(1);

   //Для его реадизации берем два числа и выделяем из них большее и меньшее.
   unsigned int gretestNumber = (mFirst > mSecond ? mFirst : mSecond);
   unsigned int leastNumber   = (mFirst < mSecond ? mFirst : mSecond);

   while (0 != remainder)
   {
      remainder = gretestNumber % leastNumber;

      //Если остаток деления большего на меньшее равен нулю,
      //то НОД является меньшее из этих чисел
      if (0 != remainder)
      {
         //Если же остаток не равен нулю,
         //то большим числом становится предыдущее меньшее,
         //а меньшим становится остаток от леления.
         gretestNumber = leastNumber;
         leastNumber   = remainder;
      }
   }

   return leastNumber;
}



FILE: main.cpp

#include
#include "CFraction.hpp"

int main()
{
   CFraction example;
   
   example.setNumerator(15);
   example.setDenumerator(255);
   
   std::cout << "Fraction before simplification:" << std::endl;<br>   std::cout << "Fraction numerator:   " << example.getNumerator() << std::endl;<br>   std::cout << "Fraction denumerator: " << example.getDenumerator() << std::endl;<br>   
   example.nesokr();
   std::cout << "------------------------------" << std::endl;<br>   
   std::cout << "Fraction after simplification:" << std::endl;<br>   std::cout << "Fraction numerator:   " << example.getNumerator() << std::endl;<br>   std::cout << "Fraction denumerator: " << example.getDenumerator() << std::endl;<br>
   return 0;
}


(1.4k баллов)