карта : гостевая

 
 

Инструкция по решению задач B14 с использованием цикла с предусловием (while)

Вы уже умеете решать задачки содержащие цикл с параметром, поэтому без труда найдете, что будет напечатано в результате работы следующего фрагмента программы:

Var a,b,t,M,R :integer;
Function F(x:integer):integer;
begin  F := 8 * (x -  7 ) * ( x -  1 );
end;
BEGIN
a:=1; b:=7;
M:=a; R:=F(a);
for t:=a to b do begin
if (F(t)<R)then begin
M:=t;
R:=F(t);
end;
end;
write(M);
END.

1)            Анализируя программу, замечаем, что в программе есть цикл, в котором переменная t принимает последовательно все целые значения в интервале от a до b с шагом 1:
for t:=a to b do begin
...
end;
2)            до начала цикла в переменную M записывается значение a, а в переменную R – значение функции в точке a:
M:=a; R:=F(a);
3)         внутри цикла есть условный оператор, в котором вычисляется значение функции F(t) и сравнивается со значением переменной R:
if (F(t)<R)then begin
M:=t;
R:=F(t);
end;
если новое значение функции меньше, чем значение R, в R записывается значение функции в точке t, а в переменной M запоминается само значение t (аргумент функции, соответствующий значению в R)
4)            в результате анализа пп. 1-3 можно сделать вывод, что цикл ищет минимум функции F(t) на интервале от a до b, и после выполнения цикла в переменной M оказывается значение аргумента t, при котором функция достигает минимума на заданном интервале (здесь это интервал [1, 7])
5)            функция F вычисляет значение F := 8 * (x - 7) * (x - 1);
6)            видим, что программа ищет значение t, при котором функция F(t) принимает минимальное значение на интервале от a до b.
7)        запишем функцию в следующем виде: F(x) = 8(x - 7)(x - 1) = 8(x^2 - 8x + 7)
8)            график этой функции – парабола, оси которой направлены вверх, поэтому функция имеет минимум
9)            найдем абсциссу точки минимума, которая совпадает с абсциссой точки минимума функции F(x) = (x^2 - 8x + 7) => Xmin = -b / 2a = -(-8)/2*1 = 4
Таким образом, правильный ответ: 4

А теперь давайте немного изменим заданный алгоритм, а именно, заменим цикл с параметром на цикл с предусловием.

Var a,b,t,M,R :integer;
Function F(x:integer):integer;
begin  F := 8 * (x -  7 ) * ( x -  1 );
end;
BEGIN
a:=1; b:=7;
M:=a; R:=F(a);
t:=a;
while t < b do begin
if (F(t)<R)then begin
M:=t;
R:=F(t);
end;
t:=t+2
end;
write(M);
END.
Проделав все тоже самое, что и для первого алгоритма мы найдем, что Хmin = 4.
Но, увы и ах, этот ответ окажется не верным!

Дело в том, что мы исследовали предложенную функцию на минимум, а предложенная программа этого делать не умеет!
И что же она в таком случае делает?
Вот с этим нам и предстоит разобраться. Прокрутим вручную фрагмент программы:

a:=1; b:=7;
M:=a; R:=F(a);
t:=a;

переменной t присвоено значение 1, а R = 0 (F := 8 * (1 -  7 ) * ( 1 -  1 ) = 0)
идем далее:

while t < b do begin
if (F(t)<R)then begin
M:=t;
R:=F(t);
end;
t:=t+2
end;

Первый круг:
while t < b do begin     - проверяется условие: 1 < 7, да, поэтому входим в цикл и проверяем новое условие:

if (F(t)<R) then begin

t=1,  F(1) = 0 и R = 0. условие не выполнилось, поэтому идем на ближайший end, пропуская две строки:
M:=t;
R:=F(t);
end;

следующая команда увеличивает значение t на 2

t:=t+2 - переменной t присвоено новое значение 1+2 = 3
end; - возвращаемся к проверке условия цикла.

Второй круг:
while t < b do begin     - проверяется условие: 3 < 7, да, поэтому вновь входим в цикл и проверяем новое условие:

if (F(t)<R) then begin

t=3,  F(3) = -64 и R = 0. условие выполнилось, поэтому выполняются следующие строки:
M:=t;  - в М запоминается  значение 3
R:=F(t); - в R запоминается значение -64
end;
следующая команда увеличивает значение t на 2
t:=t+2
переменной t присвоено новое значение 3+2 = 5
  end; - и вновь возвращаемся к проверке условия цикла.

Третий круг:
while t < b do begin     - проверяется условие: 5 < 7, да, поэтому вновь входим в цикл и проверяем новое условие:

if (F(t)<R) then begin

t=5,  F(5) = -64 и R = -64. условие не выполнилось, поэтому пропускаем строки:
M:=t
R:=F(t);
end;
следующая команда увеличивает значение t на 2
t:=t+2
переменной t присвоено новое значение 3+2 = 7
end; - и вновь возвращаемся к проверке условия цикла.

Четвертый круг:
while t < b do begin     - проверяется условие: 7 < 7 - нет, поэтому выходим из цикла
Угадайте, что напечатает команда: write(M);
Конечно 3!

Как ТРИ, ведь минимум функци будет в точке ЧЕТЫРЕ!!!

А кто вам сказал, что нам нужно найти минимум, ведь в условии сказано: "...что будет напечатано в результате работы следующего фрагмента программы:"

Мы предположили, что программа ищет минимум, а на самом деле, если быть дословным, то она ищет наименьшее значение указанной функции в указанном диапазоне и с указанным шагом.

Тогда возникает вопрос, почему ТРИ, а не ПЯТЬ, ведь при t = 5, F(t) = -64.

Для ответа на данный вопрос следуеи внимательно посмотреть на эту строку алгоритма

if (F(t)<R) then begin

при t=3 в R запоминается наименьшее значение т.е -64, при t = 5 F(t) так же равно -65, но вэтом случае условие

if (F(t)<R) then begin - не выполняется, посколку -65 не меньше -65, поэтому значение t = 5 не запоминается!

ВЫВОД:

Алгоритм программ из заданий В14 запоминает и выводит на печать min (max) функции в случае если шаг его цикла равен 1, в противном случае он запоминает ПЕРВОЕ наименьшее (наибольшее) значение для заданной функции в заданном диапазоне и для заданного шага.

Как это использовать при решении задач? - показать

 

 
  © Александр Козлов, 2014
671717 г.Северобайкальск
 
Рейтинг@Mail.ru