Анализ программы с подпрограммами
  главная : карта раздела : автора  
 


Интерактивный тренажер 21 ЕГЭ ДЕМО 2017
"Анализ программы с подпрограммами"


Возникли вопросы, сомнения или появились замечания, пишите...


Разбор решения задания 21 демоверсии ЕГЭ 2016
двумя способами с отработкой на интерактивных тренажерах

Напишите в ответе наименьшее значение входной переменной k, при котором программа выдаёт тот же ответ, что и при входном значении k = 10.
var k, i : longint;
function f(n: longint): longint;
begin
f := n * n * n;
end;
function g(n: longint): longint;
begin
g := 2*n + 3;
end;
begin
readln(k);
i := 1;
while f(i) < g(k) do
i := i+1;
writeln(i)
end.

Тренажер к заданию 21 демоверсии ЕГЭ 2016

Решение задачи прокруткой, или методом «гуманитариев»

В интернете можно найти решение данной задачи с помощью неравенств, что, несомненно, упрощает решение, но, к сожалению, только для ученика  с математическими способностями, а как быть  «гуманитариям».

Так вот, метод прокрутки- это тот способ, который позволяет решить данную задачу, не затрудняясь составлением неравенств.

Разберем пошагово, как работать с этим методом. Для начала внимательно прочитаем задание: «Напишите в ответе наименьшее значение входной переменной k, при котором программа выдаёт тот же ответ, что и при входном значении k = 10.»

А что выдаст программа при входном значение k=10?  Для того чтобы ответить на этот вопрос, прокрутим программу:

begin
readln(k);
i := 1;
while f(i) < g(k) do
i := i+1;
writeln(i)
end.

Перевод которой на русский язык означает примерно следующее:

Начало
Вводим значение для переменной K = 10, а переменной i присваиваем значение, равное 1
Пока f(i)<g(k) увеличиваем переменную i на 1  (эта строка выполняется в цикле до тех пор, пока будет выполняться условие)
Если условие не выполняется, печатаем значение i
Конец

Встретив запись f(i), Паскаль ищет объявленную ранее функцию с именем f и передает ей значение переменной i, которое в данный момент равно 1

function f(n: longint): longint;
begin
f := n * n * n;
end;
 

после выполнения, которой  в программу возвращается значение  f = 1*1*1 = 1

Далее, пропуская знак сравнения «меньше», Паскаль встречает  вызов второй функции g(k), которой передает значение переменной k = 10

function g(n: longint): longint;
begin
g := 2*n + 3;
end;

после выполнения, которой  в программу возвращается значение   g = 2*10+3 = 23

после чего остается  сравнить полученные результаты.

Поскольку 1<23, увеличиваем значение i на 1, т.е i = 2 и повторяем цикл

f(2) = 2*2*2 = 8 ; g(10) = 23 ; 8 < 23 ; i = 3

f(3) = 3*3*3 = 27 ; 27<23 – условие не выполняется, выходим из цикла и печатаем  значение i, а оно у нас равно трем!

Итак. если k будет равно 10, то программа напечатает 3.

Нам остается ответить на первую половину вопроса: «Напишите в ответе наименьшее значение входной переменной k, при котором программа выдаёт -  3»

А какое целое положительное число самое наименьшее? Конечно, один.  Проверяем свою мысль .

Если k=1              то f(1) = 1*1*1 = 1 ; g(1) = 2*1+3 = 5 ; 1<5 ; i = i +1=2

                                то f(2) = 2*2*2 = 8 ; g(1) = 2*1+3 = 5 ; 8<5 условие нарушилось, при значении i = 2 и программа печатает 2.

Если k=2              то f(2) = 2*2*2 = 8 ; g(2) = 2*2+3 = 7 ; 8<7  условие нарушилось при i=2

Если k=3              то f(2) = 2*2*2 = 8 ; g(3) = 2*3+3 = 9 ; 8<9  ; i = i+1 = 3

наименьшее k, при котором программа печатает то же число, что и при k=10,  равно 3

Правильный ответ:  3

 

Попробуйте решить задачу, обратную разобранной самостоятельно:

 

Напишите в ответе наибольшее  значение входной переменной k, при котором программа выдаёт тот же ответ, что и при входном значении k = 10.

var k, i : longint;
function f(n: longint): longint;
begin
f := n * n * n;
end;
function g(n: longint): longint;
begin
g := 2*n + 3;
end;
begin
readln(k);
i := 1;
while f(i) < g(k) do
i := i+1;
writeln(i)
end.
 
© Северобайкальск, Russia
Александр Козлов, 2017

  Рейтинг@Mail.ru