Информатика 10 класс
Тема: Анализ программы с циклом.
Что проверяется:
Знание основных конструкций языка программирования, понятия переменной, оператора присваивания.
1.7.2. Основные конструкции языка программирования. Система программирования.
1.1.4. Читать и отлаживать программы на языке программирования.
Что нужно знать:
основные конструкции языка программирования:
объявление переменных
оператор присваивания
оператор вывода
циклы
уметь выполнять ручную прокрутку программы
уметь выделять переменную цикла, от изменения которой зависит количество шагов цикла
уметь определять количество шагов цикла
уметь определять переменную, которая выводится на экран
формулу для вычисления
-ого элемента арифметической прогрессии:
где
–
-ый элемент последовательности,
– шаг (разность) последовательности
Пример задания:
Р-04. Определите, при каком наименьшем введённом значении переменной s программа выведет число 64.
var s, n: integer;
begin
readln (s);
n := 1;
while s
s := s + 5;
n := n * 2
end;
writeln(n)
end.
Решение (теоретическое):
из программы видно, что в конце программы выводится значение переменной n
из программы видно, что начальное значение переменной n равно 1
на каждой итерации цикла значение переменной n увеличивается в 2 раза
поскольку 64 = 26, для того чтобы получить n=64, необходимо выполнить тело цикла 6 раз
при каждой итерации цикла значение переменной s увеличивается на 5, то есть после 6 итераций мы получим s=s0+6*5=s0+30, где s0 – введённое начальное значение s
цикл останавливается при условии s=51, то есть при s0+30=51 или s0=21
Ответ: 21.
Решение (перебор с помощью программы с ручным вводом):
вы можете набрать программу и запускать её много раз, вводя различные значения s
вводим сначала 1 – получаем 1024; вводим 100 – получаем 1; делаем вывод, что при увеличении s значение, которое выводит программа, уменьшается
пробуем использовать двоичный поиск: берём середину отрезка [1;100], для числа 50 получаем 2, то есть искомое значение меньше 50
взяв 25, получаем 64, это то, что надо
уменьшая вводимое значение на 1, находим, что при 21 программа выводит 64, а при 20 – уже 128
Ответ: 21.
Решение (перебор с помощью программы):
из программы видим, что при каждой итерации цикла значение переменной s увеличивается, и цикл заканчивается, когда оно станет больше или равно 51, то есть начальное значение s должно быть меньше, чем 51
организуем цикл, в котором будем уменьшать начальное значение s0, и выводить его на экран в том случае, если в результате работы исходного алгоритма получилось число 64:
s0 := 51;
while True do begin
s := s0;
...
if n = 64 then writeln(s0);
s0 := s0 - 1;
end;
Здесь рамкой с многоточием обозначен исходный алгоритм:
n := 1;
while s
s := s + 5;
n := n * 2
end;
программа будет последовательно выводить все числа, при вводе которых исходный алгоритм печатает 64; очевидно, что программа зацикливается, и последнее выведенное число и будет ответом к задаче
обратите внимание, что здесь обязательно использовать новую переменную s0, поскольку переменная s изменяется в ходе работы внутреннего цикла
аналогичное решение на Python:
s0 = 51
while True:
s = s0
n = 1
while s
s = s + 5
n = n * 2
if n == 64: print(s0)
s0 -= 1
аналогичное решение на С++:
#include
using namespace std;
int main()
{ int s, s0, n;
s0 = 51;
while( 1 ) {
s = s0;
n = 1 ;
while( s
s = s + 5;
n = n * 2;
}
if( n == 64 ) cout
s0 -= 1;
}
return 0;
}
Ещё пример задания:
Р-03. При каком наибольшем введенном числе d после выполнения программы будет напечатано 55?
var n, s, d: integer;
begin
readln(d);
n := 0;
s := 0;
while s
s := s + d;
n := n + 5
end;
write(n)
end.
Решение:
из программы видно, что начальные значения переменных s и n равны нулю
шаг изменения переменной n равен 5, а шаг изменения переменной s равен неизвестному значению d
для того, чтобы значение n стало равно 55, нужно увеличить его на 5 (с нуля) ровно 11 раз, поэтому цикл выполнится ровно 11 раз
следовательно, s увеличится на d тоже 11 раз и станет равно 0 + 11·d = 11·d
чтобы цикл остановился на 11-м шаге, нужно выполнить условие 11·d 365, при этом он не должен остановиться на 10-м шаге, то есть, 10·d 365, поэтому получаем два неравенства:
в итоге значение d – целое число – ограничено отрезком [34; 36], наибольшее из подходящих чисел равно 36
Ответ: 36.
Ещё пример задания:
Р-02. Запишите число, которое будет напечатано в результате выполнения программы.
var s, n: integer;
begin
s := 33;
n := 1;
while s 0 do begin
s := s – 7;
n := n * 3
end;
writeln(n)
end.
Решение:
из программы видно, что начальные значения переменных s и n равны соответственно 33 и 1
цикл заканчивается, когда нарушается условие s 0, то есть количество шагов цикла определяется изменением переменной s
после окончания цикла выводится значение переменной n
таким образом, задача сводится к тому, чтобы определить число шагов цикла, необходимое для того, чтобы значение s стало меньше или равно 0
с каждым шагом цикла значение s уменьшается на 7, а значение n увеличивается в 3 раза, так что n=3k, где k – это число шагов цикла
поскольку s уменьшается на 7, конечное значение s должно быть равно 33-7*k , причём первое значение, меньшее или равное 0, достигается при k=5 (и s=33–7*5=-2)
тогда n=3k=35=243
Ответ: 243.
Ещё пример задания:
Р-01. Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
s:=0;
k:=0;
while s
s:=s+10;
k:=k+1;
end;
write(k);
end.
Решение:
из программы видно, что начальные значения переменных k и s равны нулю
цикл заканчивается, когда нарушается условие s , то есть количество шагов цикла определяется изменением переменной s
после окончания цикла выводится значение переменной k
таким образом, задача сводится к тому, чтобы определить число шагов цикла, необходимое для того, чтобы значение s стало не меньше 1024
с каждым шагом цикла значение s увеличивается на 10, а значение k – на единицу, так что фактически k – это счётчик шагов цикла
поскольку s увеличивается на 10, конечное значение s должно быть кратно 10, то есть это 1030 1024
для достижения этого значения переменную s нужно 103 раза увеличить на 10, поэтому цикл выполнится 103 раза
так как k – это счётчик шагов цикла, конечное значение k будет равно 103
Ответ: 103.
| Возможные ловушки и проблемы: можно перепутать переменную, которая выводится на экран (внимательно смотрим на оператор вывода) |
Ещё пример задания:
Р-00. Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
k:=5;
s:=2;
while k
s:=s+k;
k:=k+2;
end;
write(s);
end.
Решение:
начальные значения переменных k и s равны соответственно 5 и 2
цикл заканчивается, когда нарушается условие k 120, то есть количество шагов цикла определяется изменением переменной k
после окончания цикла выводится значение переменной s
с каждым шагом цикла значение s увеличивается на k, а затем значение k – на 2, так что к начальному значению s добавляется сумма членов арифметической прогрессии с начальным значением
и разностью
поскольку начальное значение k равно 5 и с каждым шагом оно увеличивается на 2, переменная k принимает последовательно нечётные значения: 5, 7, 9, …
цикл заканчивается, когда значение k становится не меньше 120; поскольку k всегда нечётное, конечное значение k равно 121
поскольку значение k увеличивается после того, как увеличивается значение s, значение 121 уже не входит в сумму, то есть последний элемент последовательности
:
количество
членов последовательности, которые входят в сумму, можно вычислить: чтобы из 5 получить 119 нужно 57 раз добавить шаг 2, поэтому общее число элементов последовательности равно
(на один больше)
теперь используем формулу для вычисления суммы членов арифметической прогрессии:
к этой сумме нужно добавить начальное значение переменной s, равное 2:
Ответ: 3598.
| Возможные ловушки и проблемы: попытка делать ручную трассировку, скорее всего, приведет к вычислительной ошибке, потому что число шагов слишком велико легко забыть, что начальные значения переменных s и k не равны нулю нужно помнить, что количество членов арифметической прогрессии на 1 больше, чем количество шагов, которые необходимы для перехода от первого значения к последнему |
Задачи для тренировки
1:
Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
s:=0;
k:=1;
while k
s:=s+k;
k:=k+1;
end;
write(s);
end.
Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
s:=0;
k:=0;
while k
k:=k+3;
s:=s+k;
end;
write(s);
end.
Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
s:=3;
k:=1;
while k
s:=s+k;
k:=k+2;
end;
write(s);
end.
Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
s:=2;
k:=2;
while s
s:=s+k;
k:=k+2;
end;
write(k);
end.
Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
s:=0;
k:=0;
while s
s:=s+k;
k:=k+4;
end;
write(k);
end.
Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
s:=0;
k:=1;
while s
k:=k+3;
s:=s+k;
end;
write(k);
end.
Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
s:=5;
k:=0;
while k
k:=k+2;
s:=s+k;
end;
write(s);
end.
Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
s:=0;
k:=0;
while k
s:=s+2*k;
k:=k+3;
end;
write(s);
end.
Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
s:=0;
k:=0;
while s
s:=s+2*k;
k:=k+4;
end;
write(s);
end.
Определите, что будет напечатано в результате работы следующего фрагмента программы:
var k, s: integer;
begin
s:=1;
k:=0;
while k
s:=s+2*k;
k:=k+4;
end;
write(s+k);
end.
1 Источники заданий:
Демо-варианты ЕГЭ 2012-2016 гг.
Тренировочные и диагностические работы МИОО.
Крылов С.С., Ушаков Д.М. ЕГЭ 2015. Информатика. Тематические тестовые задания. — М.: Экзамен, 2015.
Ушаков Д.М. ЕГЭ-2015. Информатика. 20 типовых вариантов экзаменационных работ для подготовки к ЕГЭ. — М.: Астрель, 2014.
9 http://kpolyakov.spb.ru