Технологии программирования | страница 129



считающихся равными 5, даже если g = 5,00000, в силу округлений при вычислениях значение f может оказаться равным либо 4,99999, либо 5,00000, либо 5,00001. Согласно данному примеру путем простой проверки на равенство факт равенства будет установлен в одном случае из трех.

Для надежного сравнения двух вещественных чисел используют прием использования неравенства |f — g| ≤ ε, где ε — заведомо малое число. На языке программирования это неравенство имеет вид

>Abs (f — g) <= 1е — 6

Продолжаем кодирование структуры. Глядя на действия, записываем логические условия выполнения действий. Входная информация: a, b, c.

>{ Само решение квадратного уравнения }

>if (Abs(а) > 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

>begin

>{ Вывод сообщения: линейное уравнение не имеет решения }

>WriteLn ('Нет решения');

>end;

>if ((Abs(a) <= 1e — 6) and (Abs(b) <= 1e — 6 and >(Abs(c) <= 1e — 6))

>then

>begin

>{ Вывод сообщения: бесчисленное множество решений уравнения }

>Write ('бесчисленное множество решений уравне');

>WriteLn ('ния (корни — любые числа)');

>end;

Осуществим сборку получившейся программы. При сборке удалим избыточные комментарии и избыточные операторные скобки begin — end, охватывающие лишь один оператор. Испытаем полученную программу на тестах a = 0, b = 0, c = 0 a = 0, b = 0, c = 2. Собранный вариант программы:

>Program Kvadrat;

>{ Программа решения квадратного уравнения

>вида a*x*x + b*x + c = 0 с произвольными значениями

>коэффициентов a, b, c типа вещественный }

>Uses

>Crt, Dos;

>Var

>a, b, c: Real; {Коэффициенты квадратного уравнения}

>xl, x2: Real; {Корни квадратного уравнения}

>begin

>ClrScr; { Очистка экрана }

>{Вывод информации о назначении программы}

>WriteLn ('Программа решения квадратного уравнения');

>Write (>'вида a*x*x + b*x + c = 0 с произвольными');

>Write ('значениями');

>WriteLn ('коэффициентов a, b, c типа вещественный');

>WriteLn;

>{Ввод значений коэффициентов а, b, с};

>Write ('Укажите значение коэффициента а = ');

>ReadLn(a); { Ввод а}

>Write ('Укажите значение коэффициента b = ');

>ReadLn(b); { Ввод b}

>Write ('Укажите значение коэффициента с = ');

>ReadLn(c); { Ввод с}

>{ Вывод проверочно-протокольной информации

>о введенных значениях коэффициентов a, b, c }

>WriteLn;

>WriteLn ('Решается квадратное уравнение');

>Write (a:10:4, '*x*x + ', b:10:4, '*x + ');