Реалізація класу - Дроби - на C# - Секрети програмування
У своїх програмах часто доводиться працювати із речовими числами. Для їх зберігання c# передбачені такі речові типи, якfloat,double іdecimal. Однак ні для кого не секрет, що всі дійсні числа в комп'ютері мають обмежену точність. Наприклад, якщо оголосити цілу змінну, привласнити їй значення, що дорівнює двом, а потім витягти квадратний корінь і результат звести в квадрат, то ми отримаємо число, дещо відрізняється від двох. Щоб не бути голослівним, напишемо невелику програму.
Результат у консолі:
Результат у відладчику:
Результати показують, хоч консоль і вивелося точне значення (через особливості роботи методу Console.WriteLine), насправді воно не таке вже й точне.
Таким чином, ми маємо деяку похибку, яка часто лише заважає, тому я пропоную написати новий тип (а точніше клас) "Дроб", в якому будуть реалізовані всі (ну чи майже) дії з дробами. Тож почнемо!
Клас Fraction
У класі буде три поля:
Після того як поля описані, переходимо до конструктора.
Конструктори
Я пропоную дати можливість створювати дроби двома способами:
- явно вказавши чисельник та знаменник
- вказавши лише один чисельник, маючи на увазі, що у знаменнику буде одиниця
Як ви встигли помітити, в жодному конструкторі не вказується знак. Зробив я це навмисно, з метою, щоб під час створення дробу не виникало питань щодо знаків чисельника і знаменника. Іншими словами, знак визначатиметься знаком твору чисельника на знаменник.
Арифметичні операції над дробами
Ми повинні написати клас так, щоб операції над дробамиможна було виконувати так само, як і із звичайними числами, тобто нам необхідно перевантажити оператори. Для початку ми реалізуємо самі методи операцій, а потім обернемо їх методами, що перевизначають оператори.
Пошук найменшого спільного знаменника
Для виконання операцій складання та віднімання дробів нам знадобиться приводити їх до спільного знаменника, причому до найменшого. Найменшим загальним знаменником двох дробів є найменше загальне кратне (НОК) їх знаменників. У свою чергу пошук НОК зводиться до пошукунайбільшого спільного дільника (НДД).
Узагальнивши все сказане вище, отримуємо, що нам потрібно реалізувати два методи:
- повертає НОК двох чисел
- повертає НОД двох чисел
Метод знаходження найбільшого спільного дільника
Метод знаходження найменшого загального кратного
Після написання цих двох методів, можна приступати до написання методів складання та віднімання. Однак через те, що дії при цих операціях в основному схожі, то я пропоную написатиодин метод, який повертатиме результат складання або віднімання дробів, залежно від того, яку функцію ми передамо.
Перевантаження арифметичних операторів
Як Ви напевно встигли помітити, у щойно написаному коді використовуються два неописані раніше методи:
- GetReverse - повертає дріб, зворотний даній
- GetWithChangedSign — повертає дріб із протилежним знаком
Операції порівняння
Для перевантаження операторів порівняння необхідно перевизначити методиEquals іGetHashCode.Перший повертатиме значення істини, якщо заданий об'єкт дорівнює поточному. Другий метод повертає хеш-код для поточного об'єкта.
Перевантаження операторів "==" та "!="
Добре. Порівнювати на рівність дробу вже вміємо. Тепер зробимо так, щоб можна було з'ясувати, який із двох дробів більше. Як і раніше, пишемо допоміжний метод.
1 відгук на “Реалізація класу «Дроб» на C# ”
Велике спасибі за викладений код – я вже готувався писати все з нуля, а треба ще писати лабу щодо реалізації сиплекс-методу рішень ЗЛП. А так заощадив купу часу.