Реализация класса Дробь на C#

d180d0b5d0b0d0bbd0b8d0b7d0b0d186d0b8d18f d0bad0bbd0b0d181d181d0b0 d0b4d180d0bed0b1d18c d0bdd0b0 c статьи

В своих программах часто приходится работать с вещественными числами. Для их хранения в c# предусмотрены такие вещественные типы, как float, double и decimal. Однако не для кого не секрет, что все вещественные числа в компьютере имеют ограниченную точность. Например, если объявить целую переменную, присвоить ей значение равное двум, а затем извлечь квадратный корень и результат возвести в квадрат, то мы получим число, несколько отличающееся от двух. Чтобы не быть голословным, напишем небольшую программу.

Результат в консоли:

Результат в отладчике:

Реализация класса "Дробь" на C# (С#)

Результаты показывают, хоть в консоль и вывелось точное значение (из-за особенностей работы метода Console.WriteLine), в действительности оно не такое уж и точное.

Таким образом, мы имеем некоторую погрешность, которая зачастую только мешает, поэтому я предлагаю написать новый тип (а точнее класс) "Дробь", в котором будут реализованы все (ну или почти) действия с дробями. Итак начнем!

Класс Fraction

В классе будет три поля:

  • числитель
  • знаменатель
  • знак

После того, как поля описаны, переходим к конструктору.

Конструкторы

Я предлагаю дать возможность создавать дроби двумя способами:

  1. явно указав числитель и знаменатель
  2. указав лишь один числитель, подразумевая, что в знаменателе будет единица

Как Вы успели заметить, ни в одном конструкторе не указывается знак. Сделал я это преднамеренно, с той целью, чтобы во время создания дроби не возникало вопросов насчет знаков числителя и знаменателя. Иными словами, знак будет определяться знаком произведения числителя на знаменатель.

Арифметические операции над дробями

Мы должны написать класс так, чтобы операции над дробями можно было выполнять так же, как и с обычными числами, то есть нам необходимо перегрузить операторы. Для начала мы реализуем сами методы операций, а затем обернем их методами, переопределяющие операторы.

Поиск наименьшего общего знаменателя

Для выполнения операций сложения и вычитания дробей нам понадобится приводить их к общему знаменателю, причем к наименьшему. Наименьшим общим знаменателем двух дробей является наименьшее общее кратное (НОК) их знаменателей. В свою очередь поиск НОК сводится к поиску наибольшего общего делителя (НОД).

Обобщив все вышесказанное, получаем, что нам нужно реализовать два метода:

  • возвращающий НОК двух чисел
  • возвращающий НОД двух чисел

Метод нахождения наибольшего общего делителя

Метод нахождения наименьшего общего кратного

После написания этих двух методов, можно приступать к написанию методов сложения и вычитания. Однако ввиду того, что действия при этих операциях в основном схожи, то я предлагаю написать один метод, который будет возвращать результат сложения или вычитания дробей, в зависимости от того, какую функцию мы передадим.

Перегрузка арифметических операторов

Как Вы наверняка успели заметить, в только что написанном коде используются два неописанных ранее методов:

  • GetReverse — возвращает дробь, обратную данной
  • GetWithChangedSign — возвращает дробь с противоположным знаком

Операции сравнения

Для перегрузки операторов сравнения необходимо переопределить методы Equals и GetHashCode. Первый будет возвращать значение истины, если заданный объект равен текущему. Второй же метод возвращает хэш-код для текущего объекта.

Перегрузка операторов "==" и "!="

Хорошо. Сравнивать на равенство дроби уже умеем. Теперь сделаем так, чтобы можно было выяснить, какая из двух дробей больше. Как и ранее, пишем вспомогательный метод.

Перегрузка операторов ">", "<", ">=", "<="

По сути на этом можно и остановиться, но я добавлю метод Reduce, который будет возвращать максимально сокращенную дробь, и переопределю метод ToString. Нам же нужен красивый вывод Реализация класса "Дробь" на C# (С#)

Вот и все. Класс готов. Ниже представлен скрин работы программы, в которой тестируются все публичные методы.

1 отзыв на “ Реализация класса «Дробь» на C# ”

Большое спасибо за выложенный код — я уже готовился писать все с нуля, а нужно еще писать лабу по реализации сиплекс-метода решений ЗЛП. А так сэкономил кучу времени.

Оцените статью
Секреты программирования
Добавить комментарий