Защо ни е това
Този урок е обобщение — няма нови оператори. Има една задача, която изглежда лесна, докато не я погледнеш отблизо, и която ще решим докрай по всички правила: анализ, диаграма, код.
Вече знаеш, че пресмятанията с дробните типове не са много точни, особено когато общият брой на цифрите на десетичните дроби е твърде голям. Алтернативата е да смятаме с правилни дроби, представени с числител и знаменател, и да превръщаме резултата в десетична дроб чак преди да го изведем.
Задача 1 — четирите действия с правилни дроби
Условие. Напиши програми, които извършват четирите аритметични операции с правилни дроби. Числителите и знаменателите на двете дроби се въвеждат от стандартния вход — първо числителя и знаменателя на първия операнд, а след това числителя и знаменателя на втория.
Анализ на задачата
Нека дробното число x е представено с числителя си numx и знаменателя си denumx, denumx > 0, а числото y — с numy и denumy, denumy > 0.
За знаменател на резултата можем да вземем кое да е общо кратно на denumx и denumy. Най-лесното е произведението им. Оттам излизат формулите:
| Операция | Числител numz | Знаменател denumz |
|---|---|---|
| z = x + y | numx·denumy + numy·denumx | denumx·denumy |
| z = x − y | numx·denumy − numy·denumx | denumx·denumy |
| z = x · y | numx·numy | denumx·denumy |
| z = x / y | numx·denumy | denumx·numy |
За да работи програмата с максимално допустими числа, числителите и знаменателите се представят в най-мощния знаков целочислен тип — long.
Диаграма на процеса
Процесът е безусловно линеен — четири блока един под друг, точно както в грубата диаграма от предишния урок, само че вече детайлизирани.
Програмата AddRat
static void Main(string[] args)
{
long numx, denumx;
long numy, denumy;
long numz, denumz;
numx = long.Parse(Console.ReadLine());
denumx = long.Parse(Console.ReadLine());
numy = long.Parse(Console.ReadLine());
denumy = long.Parse(Console.ReadLine());
numz = numx * denumy + numy * denumx;
denumz = denumx * denumy;
Console.WriteLine(numz + "/" + denumz);
}Останалите три програми — SubRat, MulRat и DivRat — се различават само по двата реда с формулите. Точно затова си струваше да ги изведем предварително в таблица.
Още линейни задачи
Контрол и оценка
Какво трябва да запомниш
- Дробните типове са приблизителни. Две цели числа — числител и знаменател — пазят стойността точно.
- Знаменателят на резултата може да е кое да е общо кратно; най-лесното е произведението на двата знаменателя.
- Знакът се държи в числителя — така програмата работи и с отрицателни дроби. Затова типът е
long, а неulong. - Четирите програми се различават с два реда. Когато анализът е направен добре, кодът е кратък.
- Линейният процес се разпознава веднага: няма нито един ромб в диаграмата.