Технологии программирования | страница 130
>WriteLn(с:10:4, ' = 0:');
>{ Само решение квадратного уравнения }
>if (Abs (a) > 1e — 6)
>then
>begin
>{ Продолжение решения с вычислением дискриминанта }
>end;
>if ((Abs(a) <= 1e — 6) and (Abs(b) > 1e — 6))
>then
>begin
>{ Решение линейного уравнения }
>end;
>if ((Abs(a) <= 1e — 6) and (Abs(b) <= 1e — 6) and
>(Abs(c) > 1e — 6))
>then
>WriteLn ('Нет решения');
>if ((Abs(a) <= 1e — 6) and (Abs(b) <= 1e — 6 and
>(Abs(c) <= 1e — 6))
>then
>begin
>Write ('бесчисленное множество решений уравне');
>WriteLn ('ния (корни — любые числа)');
>end;
>WriteLn;
>Write ('Для завершения программы нажмите');
>WriteLn ('любую клавишу…');
>repeat until KeyPressed; { Цикл ожидания нажатия
>любой клавиши }
>end.
Декомпозируем действие "Решение линейного уравнения". Это действие представляет цепочку из двух элементарных операторов. Выполним проверку информационной согласованности действий:
Входная информация: b, с.
>{ Решение линейного уравнения }
>x1:= — c/b;
>WriteLn ('уравнение линейное x = ', x1: 10: 4);
Декомпозируем действие "Продолжение решения с вычислением дискриминанта". Данное действие представляет ЦЕПОЧКУ СЛЕДОВАНИЙ из двух СЛЕДОВАНИЙ.
Входная информация: а, Ь, с
>{ Продолжение решения с вычислением дискриминанта }
>{ Вычисление дискриминанта квадратного уравнения }
>d:= Sqr (b) — 4.0*а*с; { Решение уравнения }
Переменная d у нас не описана, поэтому в секцию Var необходимо добавить строку описания:
>d: Real; { Значение дискриминанта }
Декомпозируем действие "Решение уравнения". Согласно табл. 5.3 данное действие представляет ЦЕПОЧКУ АЛЬТЕРНАТИВ из трех альтернатив в цепочке. Осуществив детализацию этих альтернатив в установленном порядке, получим:
Входная информация: a, b, c, d.
>{ Решение уравнения }
>if d > 1e-6
>then
>begin
>{ Расчет двух различных корней }
>end;
>if ((d >= -1e-6) and (d <= 1e-6))
>then
>begin
>{ Расчет двух равных корней }
>WriteLn ('два равных корня x = ', (-b)/(2.0 * а):10:4);
>end;
>if d < -1e-6 then begin
>{ Вывод надписи: уравнение не имеет решения }
>WriteLn ('уравнение не имеет решения');
>end;
Декомпозируем действие "Расчет двух различных корней". Это действие представляет цепочку из трех элементарных операторов. Выполним проверку информационной согласованности действий:
Входная информация: a, b, c, d
>{ Расчет двух различных корней }
>x1:= ((-b) — Sqrt (d))/(2.0*a);
>x2:= ((-b) + Sqrt (d))/(2.0*а);
>Write ('два различных корня x1 = ', x1:10:4);
>WriteLn (' x2 = ', х2:10:4);
Здесь вывод одной строки осуществлен двумя операторами. Осуществим сборку всей программы, удалив избыточные комментарии и избыточные операторные скобки begin — end, охватывающие лишь один оператор. Испытаем полученную программу на всех заранее подготовленных тестах. Собранный вариант программы: