Решить квадратное уравнение

Формулировка. Даны вещественные числа a, b и c, причем a отлично от 0. Решить квадратное уравнение ax2 + bx + c = 0 или сообщить о том, что действительных решений нет.

Решение. Из алгебры известно, что:

Квадратное уравнение ax2 + bx + c = 0, выражение D = b24ac – дискриминант:

– если D > 0, имеет два решения:  , ;

– если D = 0, имеет единственное решение: ;

– если D < 0, не имеет действительных решений.

Следовательно, нам необходимо вычислить дискриминант (заведем для него вещественную переменную d типа real) и в зависимости от его значения организовать ветвления. Сначала нужно проверить, имеет ли уравнение действительные решения (для решений заведем переменные x1 и x2 типа real). Если да, и если дискриминант не равен нулю, то вычисляем оба решения по формулам, а если дискриминант равен нулю, то вычисляем единственное решение. Если же действительных решений нет, выводим текстовое сообщение об этом. Основной алгоритм можно проиллюстрировать следующей блок-схемой:

pascal12_4

Три нерасшифрованных блока представляют собой стандартные операторы вывода. Разберем их подробнее:

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;

Код:

  1. program QuadraticEquation;
  2. var
  3. a, b, c, d, x1, x2: real;
  4. begin
  5. readln(a, b, c);
  6. d := b * b — 4 * a * c;
  7. if d >= 0 then begin
  8. if d <> 0 then begin
  9. x1 := (-b + sqrt(d)) / 2 * a;
  10. x2 := (-b — sqrt(d)) / 2 * a;
  11. writeln(‘x1 = ‘, x1:4:2, ‘, x2 = ‘, x2:4:2)
  12. end
  13. else begin
  14. x1 := -(b / 2 * a);
  15. writeln(‘x = ‘, x1:4:2)
  16. end
  17. end
  18. else begin
  19. writeln(‘No real solutions!’);
  20. end
  21. end.