Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Тема Анализ программы содержащей подпрограммы циклы и ветвления.1

Работа добавлена на сайт samzan.net: 2016-03-13

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 21.5.2024

© К. Поляков, 2009-2013

B8 (повышенный уровень, время – 5 мин)

Тема:  Анализ программы, содержащей подпрограммы, циклы и ветвления.

Что нужно знать:

  1. операции целочисленного деления (div) и взятия остатка (mod)
  2. как работают операторы присваивания, циклы и условные операторы в языке программирования

Пример задания:

Ниже записана программа. Получив на вход число , эта программа печатает два числа,  и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 7.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:=L+1;

   if M < (x mod 10) then begin

     M:=x mod 10;

   end;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

 Решение:

  1. для решения задачи необходимо понять, что делает эта программа
  2. если это не видно сразу, можно выполнить ручную прокрутку для какого-то простого числа, например, для числа 251:

оператор

условие

x

L

M

readln(x);

251

?

?

L:=0; M:=0;

0

0

while x > 0 do…

251 > 0? да

L:=L+1;

1

if M<(x mod 10) then

M <(251 mod 10)? да

M:=x mod 10;

1

x:=x div 10;

25

while x > 0 do…

25 > 0? да

L:=L+1;

2

if M<(x mod 10) then…

M <(25 mod 10)? да

M:=x mod 10;

5

x:=x div 10;

2

while x > 0 do…

2 > 0? да

L:=L+1;

3

if M<(x mod 10) then…

M <(2 mod 10)? нет

x:=x div 10;

0

while x > 0 do…

0 > 0? нет

writeln(L); write(M);

3

5

  1. можно догадаться, что в результате работы программы в переменной L окажется число цифр числа, а в переменной M – наибольшая цифра, но это предположение нужно постараться доказать
  2. нужно вспомнить (и запомнить), что для целого числа остаток от деления на 10 (x mod 10) – это последняя цифра в десятичной записи числа, а целочисленное деление (x div 10) отсекает последнюю цифру, то есть из 123 получается 12
  3. рассмотрим цикл, число шагов которого зависит от изменения переменной x:

 while x > 0 do begin

   ...

   x:= x div 10;      { отсечение последней цифры }

 end;

здесь оставлены только те операторы, которые влияют на значение x

  1. из приведенного цикла видно, что на каждом шаге от десятичной записи x отсекается последняя цифра до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0; поэтому цикл выполняется столько раз, сколько цифр в десятичной записи введенного числа
  2. на каждом шаге цикла переменная L увеличивается на 1:

 L:=L+1;

других операторов, меняющих значение L, в программе нет; поэтому после завершения цикла в переменной L действительно находится количество цифр

  1. теперь разберемся с переменной M, которая сначала равна 0; оператор, в котором она меняется, выглядит так:

 if M < (x mod 10) then begin

   M:=x mod 10;

 end;

учитывая, что x mod 10 – это последняя цифра десятичной записи числа, получается что если эта цифра больше, чем значение M, она записывается в переменную M;  

  1. этот оператор выполняется в цикле, причем выражение x mod 10 по очереди принимает значения всех цифр исходного числа; поэтому после завершения циклам в переменной M окажется наибольшая из всех цифр, то есть наша догадка подтверждается
  2. итак, по условию задачи фактически требуется найти наибольшее трехзначное число со старшей цифрой 7; очевидно, что это 777.
  3. ответ: 777.

Возможные ловушки и проблемы:

  1.  это очень неплохая задача на понимание, тут достаточно сложно «вызубрить» метод решения, можно только освоить последовательность (системность) анализа
  2.  ручной прокрутки в такой задаче недостаточно, по её результатам можно угадать алгоритм, но можно и не угадать; в критическом случае можно сделать ручную прокрутку для нескольких чисел им попытаться понять закономерность

Ещё пример задания:

Ниже записана программа. Получив на вход число , эта программа печатает два числа,  и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 120.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=1;

 while x > 0 do begin

   L:=L+1;

   M:= M*(x mod 8);

   x:= x div 8;

 end;

 writeln(L); write(M);

end.

 Решение:

  1. для решения задачи необходимо понять, что делает эта программа; повторяя рассуждения из предыдущего примера, выясняем, что
  2. переменная L с каждым шагом цикла увеличивается на 1
  3. переменная x на каждом шаге цикла делится на 8 и остаток отбрасывается

поэтому можно сделать вывод, что в конце цикла переменная L будет равна количеству цифр введенного числа, записанного в восьмеричной системе счисления; таким образом, восьмеричная запись числа содержит ровно 3 цифры

  1. выражение x mod 8 – это последняя цифра восьмеричной записи числа; на каждом шаге цикла переменная M умножается на эту величину, поэтому в результате в M будет записано произведение всех цифр восьмеричной записи введенного числа
  2. по условию это произведение равно 120, то есть , где a, b и с – числа от 0 до 7 (которые в восьмеричной системе счисления записываются одной цифрой)
  3. поскольку нам нужно наибольшее число, перебираем делители числа 120, начиная со старшей цифры – 7; видим, что 120 на 7 не делится, поэтому такой цифры в восьмеричной записи числа нет
  4. но 120 делится на 6, поэтому старшей цифрой может быть 6 – только в том случае, когда второй сомножитель можно представить в виде произведения двух чисел в интервале 1..6
  5. делим 120 на 6, получаем 20; это число представляется как произведение 5 и 4, каждое из этих чисел записывается в виде одной восьмеричной цифры, то есть, они нам подходят
  6. вспомним, что нас интересует максимальное число, поэтому цифры нужно выстроить в порядке убывания: 6548
  7. заметим, что мы получили число в восьмеричной системе, а ответ нужно дать в десятичной; переводим: 6548 = 6·82 + 5·81 + 4·80 = 428.
  8. ответ: 428.

Возможные ловушки и проблемы:

  1.  поскольку в цикле идет деление на 8, мы получаем цифры числа в восьмеричной системе; каждая из них должна быть в интервале 0..7 (не может быть 8 и 9)
  2.  на последнем шаге нужно не забыть перевести число из восьмеричной системы в десятичную


Задачи для тренировки3:

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 7.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:= L + 1;

   M:= M + x mod 10;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 8.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:= L + 1;

   if x mod 2 = 0 then

     M:= M + x mod 10;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 0.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:= L + 1;

   if x mod 2 = 0 then

     M:= M + x mod 10;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 8.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:= L + 1;

   if x mod 2 = 1 then

     M:= M + x mod 10;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 7.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:= L + 1;

   if x mod 2 = 0 then

     M:= M + (x mod 10) div 2;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 7.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:= L + 1;

   if x mod 2 = 1 then

     M:= M + (x mod 10) div 2;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 7.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:=L+1;

   if M < x then begin

     M:=x mod 10;

   end;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 8.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:=L+1;

   if (M < x) and (x mod 2 = 0) then begin

     M:=x mod 10;

   end;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 10.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:=L+1;

   if (M < x) and (x mod 2 = 1) then begin

     M:= (x mod 10) * 2;

   end;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 10.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:=L+1;

   if M < x then begin

     M:= (x mod 10) * 2;

   end;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 2, а потом 72.

var x, a, b: integer;

begin

 readln(x);

 a:=0; b:=1;

 while x>0 do begin

   a:=a+1;

   b:=b*(x mod 10);

   x:= x div 10;

 end;

 writeln(a); write(b);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 2, а потом 14.

var x, a, b : integer;

begin

 readln(x);

 a := 0; b := 1;

 while x > 0 do begin

   a := a + 1;

   b := b * (x mod 10);

   x := x div 10;

 end;

 writeln(a); write(b);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 7.

var x, a, b : integer;

begin

 readln(x);

 a := 0; b := 1;

 while x > 0 do begin

   a := a + 1;

   b := b * (x mod 10);

   x := x div 10;

 end;

 writeln(a); write(b);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 0.

var x, a, b : integer;

begin

 readln(x);

 a := 0; b := 1;

 while x > 0 do begin

   a := a + 1;

   b := b * (x mod 10);

   x := x div 10;

 end;

 writeln(a); write(b);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 7.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:= L + 1;

   M:= M + x mod 10;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 8.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:= L + 1;

   if x mod 2 = 0 then

     M:= M + x mod 10;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 0.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:= L + 1;

   if x mod 2 = 0 then

     M:= M + x mod 10;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 8.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:= L + 1;

   if x mod 2 = 1 then

     M:= M + x mod 10;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 7.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:= L + 1;

   if x mod 2 = 0 then

     M:= M + (x mod 10) div 2;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 7.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:= L + 1;

   if x mod 2 = 1 then

     M:= M + (x mod 10) div 2;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 7.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:=L+1;

   if M < x then begin

     M:=x mod 10;

   end;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 8.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:=L+1;

   if (M < x) and (x mod 2 = 0) then begin

     M:=x mod 10;

   end;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 10.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:=L+1;

   if (M < x) and (x mod 2 = 1) then begin

     M:= (x mod 10) * 2;

   end;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 28.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 0 do begin

   L:=L+1;

   if M < x then begin

     M:= M + (x mod 10) * 2;

   end;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 2, а потом 72.

var x, a, b: integer;

begin

 readln(x);

 a:=0; b:=1;

 while x>0 do begin

   a:=a+1;

   b:=b*(x mod 10);

   x:= x div 10;

 end;

 writeln(a); write(b);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 2, а потом 14.

var x, a, b : integer;

begin

 readln(x);

 a := 0; b := 1;

 while x > 0 do begin

   a := a + 1;

   b := b * (x mod 10);

   x := x div 10;

 end;

 writeln(a); write(b);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 7.

var x, a, b : integer;

begin

 readln(x);

 a := 0; b := 1;

 while x > 0 do begin

   a := a + 1;

   b := b * (x mod 10);

   x := x div 10;

 end;

 writeln(a); write(b);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 36.

var x, a, b : integer;

begin

 readln(x);

 a := 0; b := 1;

 while x > 0 do begin

   a := a + 1;

   b := b * (x mod 10);

   x := x div 10;

 end;

 writeln(a); write(b);

end.

  1. (Д.Ю. Мельникова, г. Саратов) Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите набольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 24.

var x, a, b : integer;

begin

 readln(x);

 a := 0; b := 1;

 while x > 0 do begin

   a := a + 1;

   b := b * (x mod 8);

   x := x div 8;

 end;

 writeln(a); write(b);

end.

  1. (Д.Ю. Мельникова, г. Саратов) Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 10.

var x, a, b : integer;

begin

 readln(x);

 a := 0; b := 1;

 while x > 0 do begin

   a := a + 1;

   b := b * (x mod 8);

   x := x div 8;

 end;

 writeln(a); write(b);

end.

  1. (Д.Ю. Мельникова, г. Саратов) Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 6.

var x, a, b : integer;

begin

 readln(x);

 a := 0; b := 1;

 while x > 0 do begin

   a := a + 1;

   b := b * (x mod 6);

   x := x div 6;

 end;

 writeln(a); write(b);

end.

  1. (Д.Ю. Мельникова, г. Саратов) Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 9.

var x, a, b : integer;

begin

 readln(x);

 a := 0; b := 1;

 while x > 0 do begin

   a := a + 1;

   b := b * (x mod 5);

   x := x div 5;

 end;

 writeln(a); write(b);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 2, а потом 21.

var x, a, b: integer;

begin

 readln(x);

 a:=0; b:=1;

 while x>0 do begin

   a:=a+1;

   b:=b*(x mod 10);

   x:= x div 10

 end;

 writeln(a); write(b);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 35.

var x, a, b: integer;

begin

 readln(x);

 a:=0; b:=1;

 while x>0 do begin

   a:=a+1;

   b:=b*(x mod 10);

   x:= x div 10

 end;

 writeln(a); write(b);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 4.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=9;

 while x > 5 do begin

   L:= L + 1;

   if M > (x mod 10) then M:= x mod 10;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

  1. Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наименьшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 7.

var x, L, M: integer;

begin

 readln(x);

 L:=0; M:=0;

 while x > 5 do begin

   L:= L + 1;

   if M < (x mod 10) then M:= x mod 10;

   x:= x div 10;

 end;

 writeln(L); write(M);

end.

3 Источники заданий:

Авторские разработки.

Тренировочные и диагностические работы МИОО.

Путимцева Ю.С. Информатика. Диагностические работы в формате ЕГЭ 2012. М.: МЦНМО, 2012.




1. х гг.В канун президентских выборов 1991 г.
2.  Сопоставляющие счета предназначены для исчисления финансового результата как отдельных хозяйственных пр
3. О милиции с изменениями внесенными Законом Украины
4. закапанестетикзат
5. а~аА б~аЕаМб~- JSP б~б~б~б~аКб~б~б~аА аИ аОб~аГаАаНаИаЗаАб~аИб~ а~аОб~аОаНаЕаЖ 2006 аГ
6. Экономическая политика современной России
7. ТИПОЛОГИЯ ВРЕДНЫХ ЛЮДЕЙ 1.html
8. Налогообложение страховых компаний на примере страховой медицинской компании Вита
9. Государственный долг и методы его регулировани
10. Речевые технологии
11. Я уезжаю в Бостон завтра
12.  Паспортная часть Ф
13. Либерализация и стабилизация пять лет спустя
14.  Введение 2
15. модуль 4 Налоги и налогообложение Вариант 25 Определить НДС подлежащий уплате в бюджет и заполнить н
16. Самоорганізація в науці
17. лекция Элементный и структурный анализ в развитии современных технологий
18. рятувальним підрозділом
19. Прочитайте та перекладіть текст- ldquo;Vriety is the spice of life
20. музыки [1] Введение [2] Рок 50х [3] Рок 60х