Решение задачи №598
Условие задачи №598:
Даны вещественные числа a, b и c, причем a отлично от 0. Решить квадратное уравнение ax2 + bx + c = 0 или сообщить о том, что действительных решений нет.Решение
Подробное решениеИз алгебры известно, что:
Квадратное уравнение ax2 + bx + c = 0, выражение D = b2 – 4ac – дискриминант:
– если D > 0, имеет два решения:
\[x_{1}=\tfrac{-b+\sqrt{D}}{2a}, x_{2}=\tfrac{-b-\sqrt{D}}{2a}\]
– если D = 0, имеет единственное решение:
\[x_{1}=-\tfrac{b}{2a}\]
– если D < 0, не имеет действительных решений.
Следовательно, нам необходимо вычислить дискриминант (заведем для него вещественную переменную d типа real) и в зависимости от его значения организовать ветвления. Сначала нужно проверить, имеет ли уравнение действительные решения (для решений заведем переменные x1 и x2 типа real). Если да, и если дискриминант не равен нулю, то вычисляем оба решения по форму-лам, а если дискриминант равен нулю, то вычисляем единственное решение. Если же действи-тельных решений нет, выводим текстовое сообщение об этом. Основной алгоритм можно проил-люстрировать следующей блок-схемой:
Три нерасшифрованных блока представляют собой стандартные операторы вывода. Разберем их подробнее:
1) При выводе двух корней выражение будет выглядеть следующим образом:
1 2 3 | 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) При выводе одного корня – все то же самое, только выводится один корень:
1 2 | x1 := -(b / 2 * a);writeln('x = ', x1:4:2); |
3) При отсутствии действительных корней выводим сообщение
1 | writeln('No real solutions!'); |
В итоге внутренний условный оператор с телом включительно будет выглядеть так:
1 2 3 4 5 6 7 8 9 | 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)endelse begin x1 := -(b / 2 * a); writeln('x = ', x1:4:2)end; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | program QuadraticEquation; var a, b, c, d, x1, x2: real; begin readln(a, b, c); d := b * b - 4 * a * c; if d >= 0 then begin 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 end else begin writeln('No real solutions!'); endend. |