В своих программах часто приходится работать с вещественными числами. Для их хранения в c# предусмотрены такие вещественные типы, как float, double и decimal. Однако не для кого не секрет, что все вещественные числа в компьютере имеют ограниченную точность. Например, если объявить целую переменную, присвоить ей значение равное двум, а затем извлечь квадратный корень и результат возвести в квадрат, то мы получим число, несколько отличающееся от двух. Чтобы не быть голословным, напишем небольшую программу.
- Результат в консоли:
- Результат в отладчике:
- Класс Fraction
- Конструкторы
- Арифметические операции над дробями
- Поиск наименьшего общего знаменателя
- Метод нахождения наибольшего общего делителя
- Метод нахождения наименьшего общего кратного
- Перегрузка арифметических операторов
- Операции сравнения
- Перегрузка операторов "==" и "!="
- Перегрузка операторов ">", "<", ">=", "<="
- 1 отзыв на “ Реализация класса «Дробь» на C# ”
Результат в консоли:
Результат в отладчике:
Результаты показывают, хоть в консоль и вывелось точное значение (из-за особенностей работы метода Console.WriteLine), в действительности оно не такое уж и точное.
Таким образом, мы имеем некоторую погрешность, которая зачастую только мешает, поэтому я предлагаю написать новый тип (а точнее класс) "Дробь", в котором будут реализованы все (ну или почти) действия с дробями. Итак начнем!
Класс Fraction
В классе будет три поля:
- числитель
- знаменатель
- знак
После того, как поля описаны, переходим к конструктору.
Конструкторы
Я предлагаю дать возможность создавать дроби двумя способами:
- явно указав числитель и знаменатель
- указав лишь один числитель, подразумевая, что в знаменателе будет единица
Как Вы успели заметить, ни в одном конструкторе не указывается знак. Сделал я это преднамеренно, с той целью, чтобы во время создания дроби не возникало вопросов насчет знаков числителя и знаменателя. Иными словами, знак будет определяться знаком произведения числителя на знаменатель.
Арифметические операции над дробями
Мы должны написать класс так, чтобы операции над дробями можно было выполнять так же, как и с обычными числами, то есть нам необходимо перегрузить операторы. Для начала мы реализуем сами методы операций, а затем обернем их методами, переопределяющие операторы.
Поиск наименьшего общего знаменателя
Для выполнения операций сложения и вычитания дробей нам понадобится приводить их к общему знаменателю, причем к наименьшему. Наименьшим общим знаменателем двух дробей является наименьшее общее кратное (НОК) их знаменателей. В свою очередь поиск НОК сводится к поиску наибольшего общего делителя (НОД).
Обобщив все вышесказанное, получаем, что нам нужно реализовать два метода:
- возвращающий НОК двух чисел
- возвращающий НОД двух чисел
Метод нахождения наибольшего общего делителя
Метод нахождения наименьшего общего кратного
После написания этих двух методов, можно приступать к написанию методов сложения и вычитания. Однако ввиду того, что действия при этих операциях в основном схожи, то я предлагаю написать один метод, который будет возвращать результат сложения или вычитания дробей, в зависимости от того, какую функцию мы передадим.
Перегрузка арифметических операторов
Как Вы наверняка успели заметить, в только что написанном коде используются два неописанных ранее методов:
- GetReverse — возвращает дробь, обратную данной
- GetWithChangedSign — возвращает дробь с противоположным знаком
Операции сравнения
Для перегрузки операторов сравнения необходимо переопределить методы Equals и GetHashCode. Первый будет возвращать значение истины, если заданный объект равен текущему. Второй же метод возвращает хэш-код для текущего объекта.
Перегрузка операторов "==" и "!="
Хорошо. Сравнивать на равенство дроби уже умеем. Теперь сделаем так, чтобы можно было выяснить, какая из двух дробей больше. Как и ранее, пишем вспомогательный метод.
Перегрузка операторов ">", "<", ">=", "<="
По сути на этом можно и остановиться, но я добавлю метод Reduce, который будет возвращать максимально сокращенную дробь, и переопределю метод ToString. Нам же нужен красивый вывод
Вот и все. Класс готов. Ниже представлен скрин работы программы, в которой тестируются все публичные методы.
1 отзыв на “ Реализация класса «Дробь» на C# ”
Большое спасибо за выложенный код — я уже готовился писать все с нуля, а нужно еще писать лабу по реализации сиплекс-метода решений ЗЛП. А так сэкономил кучу времени.