Онлайн час в Google Meet
Лого на 91. НЕГ „Проф. Константин Гълъбов“

11. клас · Модул 1 · Урок 8

Линейни изчислителни процеси

Обобщение чрез задачи: аритметика с правилни дроби вместо неточни дробни типове, диаграма на процеса и програмите AddRat, SubRat, MulRat и DivRat.

Защо ни е това

Този урок е обобщение — няма нови оператори. Има една задача, която изглежда лесна, докато не я погледнеш отблизо, и която ще решим докрай по всички правила: анализ, диаграма, код.

Вече знаеш, че пресмятанията с дробните типове не са много точни, особено когато общият брой на цифрите на десетичните дроби е твърде голям. Алтернативата е да смятаме с правилни дроби, представени с числител и знаменател, и да превръщаме резултата в десетична дроб чак преди да го изведем.

Задача 1 — четирите действия с правилни дроби

Условие. Напиши програми, които извършват четирите аритметични операции с правилни дроби. Числителите и знаменателите на двете дроби се въвеждат от стандартния вход — първо числителя и знаменателя на първия операнд, а след това числителя и знаменателя на втория.

Анализ на задачата

Нека дробното число x е представено с числителя си numx и знаменателя си denumx, denumx > 0, а числото y — с numy и denumy, denumy > 0.

За знаменател на резултата можем да вземем кое да е общо кратно на denumx и denumy. Най-лесното е произведението им. Оттам излизат формулите:

ОперацияЧислител numzЗнаменател denumz
z = x + ynumx·denumy + numy·denumxdenumx·denumy
z = x − ynumx·denumy − numy·denumxdenumx·denumy
z = x · ynumx·numydenumx·denumy
z = x / ynumx·denumydenumx·numy

За да работи програмата с максимално допустими числа, числителите и знаменателите се представят в най-мощния знаков целочислен тип — long.

Диаграма на процеса

Процесът е безусловно линеен — четири блока един под друг, точно както в грубата диаграма от предишния урок, само че вече детайлизирани.

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);
Фиг. 1. Събиране на правилни дроби.

Програмата 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.
  • Четирите програми се различават с два реда. Когато анализът е направен добре, кодът е кратък.
  • Линейният процес се разпознава веднага: няма нито един ромб в диаграмата.