Решение квадратного уравнения. Дискриминант в Паскеле.


Формулировка. Даны вещественные числа a, b и c, причем a отлично от 0. Решить квадратное уравнение ax2 + bx + c = 0 или сообщить о том, что действительных решений нет.
Решение. Из алгебры известно, что:
Квадратное уравнение ax2 + bx + c = 0, выражение D = b2 – 4ac – дискриминант:
– если D > 0, имеет два решения:  , ;
– если D = 0, имеет единственное решение: ;– если D < 0, не имеет действительных решений.
Следовательно, нам необходимо вычислить дискриминант (заведем для него вещественную переменную d типа real) и в зависимости от его значения организовать ветвления. Сначала нужно проверить, имеет ли уравнение действительные решения (для решений заведем переменные x1 и x2 типа real). Если да, и если дискриминант не равен нулю, то вычисляем оба решения по формулам, а если дискриминант равен нулю, то вычисляем единственное решение. Если же действительных решений нет, выводим текстовое сообщение об этом. Основной алгоритм можно проиллюстрировать следующей блок-схемой:
Три нерасшифрованных блока представляют собой стандартные операторы вывода. Разберем их подробнее:
1)      При выводе двух корней выражение будет выглядеть следующим образом:
x1 := (-b + sqrt(d)) / 2 * a;
x2 := (-b - sqrt(d)) / 2 * a;
writeln('x1 = ', x1:4:2, ', x2 = ', x2:4:2);
При этом выводимое выражение будет выглядеть так: 'x1 = m, x2 = n', где синим цветом выделены однозначные текстовые константы, которые берутся из списка аргументов writeln, красным – вычисленные значения x1 и x2. Причем корни выведены в форматированном виде: число после первого двоеточия задает ширину поля вывода для переменной вместе с точкой (при нехватке поля она будет расширено программой), а число после второго двоеточия – количество выводимых дробных знаков (его при работе программы изменить нельзя);
2)      При выводе одного корня – все то же самое, только выводится один корень:
x1 := -(b / 2 * a);
writeln('x = ', x1:4:2);
3)      При отсутствии действительных корней выводим сообщение:
writeln('No real solutions!');
В итоге внутренний условный оператор с телом включительно будет выглядеть так:
if d <> 0 then begin
  x1 := (-b + sqrt(d)) / 2 * a;
  x2 := (-b - sqrt(d)) / 2 * a;
  writeln('x1 = ', x1:4:2, ', x2 = ', x2:4:2)
end
else begin
  x1 := -(b / 2 * a);
  writeln('x = ', x1:4:2)
end;
Код:
program QuadraticEquation;
vara, b, c, d, x1, x2: real;
beginreadln(a, b, c);
d := b * b - 4 * a * c;
if d >= 0 then beginif d <> 0 then beginx1 := (-b + sqrt(d)) / 2 * a;
x2 := (-b - sqrt(d)) / 2 * a;
writeln('x1 = ', x1:4:2, ', x2 = ', x2:4:2)
endelse beginx1 := -(b / 2 * a);
writeln('x = ', x1:4:2)
endendelse beginwriteln('No real solutions!');
endend.