Задача № 12. Решить квадратное уравнение



Формулировка. Даны вещественные числа 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). Если да, и если дискриминант не равен нулю, то вычисляем оба решения по формулам, а если дискриминант равен нулю, то вычисляем единственное решение. Если же действительных решений нет, выводим текстовое сообщение об этом. Основной алгоритм можно проиллюстрировать следующей блок-схемой:

 

 

 


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

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

Глава 3. Циклы

Задача № 13. Вывести на экран все натуральные числа до заданного

Формулировка. Дано натуральное число. Вывести на экран все натуральные числа до заданного включительно.

Решение. Данная задача решается с использованием оператора цикла for. Напомним, что с помощью цикла for можно совершить заданное количество итераций (повторений) некоторых операторов, которые синтаксически заключены в содержимое его тела (так называемого тела цикла). При этом некоторая целочисленная переменная изменяется от некоторого стартового значения до некоторого конечного (оба значения включительно), увеличиваясь на единицу с каждым повторением тела цикла.

Так как нам необходимо выводить натуральные числа, это означает, что вывод должен всегда начинаться с единицы, и при этом выводятся все следующие за ней натуральные числа до тех пор, пока значение переменной цикла (обычно используют переменную i) не достигнет конечного n (на последнем шаге значение переменной цикла будет равно n). После этого цикл завершится, и будут выполнены те операторы, которые следуют непосредственно за ним. Кстати, не стоит забывать, что после выхода из цикла for его переменная цикла считается неопределенной!

Код:

1. program FromOneToN; 2. 3. var 4.   i, n: word; 5. 6. begin 7.   readln(n); 8.   for i := 1 to n do begin 9.     write(i, ' ') 10.   end 11. end.

Пусть введено число 5, например. При входе i станет равно 1 и будет проверено существование отрезка в заданных границах. Так как 1 меньше 5, то произойдет вход в цикл, и будут выполняться следующие команды, пока i не превысит n:

1) Выполнение команд в теле цикла;

2) Увеличение i на 1;

3) Возвращение на шаг 1.

Нетрудно понять, что в нашем случае i будет принимать значения 1, 2, 3, 4, 5 и будет выведена на экран строка '1 2 3 4 5 '. Здесь красным цветом выделены изменяющиеся значения переменной цикла, а синим – выводящаяся неизменной пробельная константа.


Дата добавления: 2018-10-25; просмотров: 265; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!