Определите без компьютера что будет напечатано при выполнении следующих фрагментов а 100

Обновлено: 06.07.2024

МБУ ДО «Дворец детского творчества» г. Дзержинск, Нижегородская обл., 2019 г. Готовимся к ЕГЭ. Задание 8. Анализ программ с циклами. (Си/С++) Панченко Надежда Петровна, педагог дополнительного образования

Содержание: Общие сведения. Что нужно знать. Разбор задач. Возможные ловушки и проблемы. Задачи для тренировки и самопроверки.

Общие сведения Сложность: базовая. Примерное время решения (для тех, кто будет выполнять часть C : 3 минуты. Тема: Анализ программы. Подтема: Построение алгоритма управления исполнителем. Что проверяется: Умение построить неветвящийся алгоритм для исполнителя, описанного в условии задачи по заданным входным и выходным данным.

Что нужно знать: Как может выглядеть задание? Например, так: Дан фрагмент программы. Необходимо определить значение переменной (переменных после его исполнения). Объем задания – до шести итераций цикла (если задание требует «ручной» прокрутки цикла, или большое число итераций с очевидным алгоритмом, две - три операции присваивания внутри цикла.

Что нужно знать: основные конструкции языка программирования: объявление переменных; оператор присваивания; оператор вывода; циклы(for, while); уметь: выполнять ручную прокрутку программы; выделять переменную цикла, от изменения которой зависит количество шагов цикла; определять количество шагов цикла; определять переменную, которая выводится на экран;

Что нужно знать: формулу для вычисления n -ого элемента арифметической прогрессии: формулу для вычисления суммы первых членов арифметической прогрессии: где ai - i –ый элемент последовательности, d – шаг (разность последовательности.

Разбор задачи 1: Определите, что будет напечатано в результате работы следующего фрагмента программы: < int k, s; s = 0; k = 0; while (s < 1024) < s = s + 10; k = k + 1; >cout<<k; >

Решение: из программы видно, что начальные значения переменных k и s равны нулю; цикл заканчивается, когда нарушается условие s < 1024, то есть количество шагов цикла определяется изменением переменной s после окончания цикла выводится значение переменной k; таким образом, задача сводится к тому, чтобы определить число шагов цикла, необходимое для того, чтобы значение s стало не меньше 1024; с каждым шагом цикла значение s увеличивается на 10, а значение k – на единицу, так что фактически k – это счётчик шагов цикла; поскольку s увеличивается на 10, конечное значение s должно быть кратно 10, то есть это 1030 > 1024; для достижения этого значения переменную s нужно 103 раза увеличить на 10, поэтому цикл выполнится 103 раза; так как k – это счётчик шагов цикла, конечное значение k будет равно 103; Ответ: 103.

Разбор задачи 2: Определите, что будет напечатано в результате работы следующего фрагмента программы: < int k, s; k = 5; s = 2; while (k < 120) < s = s + k; k = k + 2; >cout<<s; >

начальные значения переменных k и s равны соответственно 5 и 2; цикл заканчивается, когда нарушается условие k < 120, то есть количество шагов цикла определяется изменением переменной k; после окончания цикла выводится значение переменной s; с каждым шагом цикла значение s увеличивается на k, а затем значение k – на 2, так что к начальному значению s добавляется сумма членов арифметической прогрессии с начальным значением и разностью d = 2; поскольку начальное значение k равно 5 и с каждым шагом оно увеличивается на 2, переменная k принимает последовательно нечётные значения: 5, 7, 9, …; цикл заканчивается, когда значение k становится не меньше 120; поскольку k всегда нечётное, конечное значение k равно 121; Решение:

поскольку значение k увеличивается после того, как увеличивается значение s, значение 121 уже не входит в сумму, то есть последний элемент последовательности an = 121 – 2 = 119: количество членов последовательности, которые входят в сумму, можно вычислить: чтобы из 5 получить 119 нужно 57 раз добавить шаг 2, поэтому общее число элементов последовательности равно n = 58 (на один больше; теперь используем формулу для вычисления суммы членов арифметической прогрессии: к этой сумме нужно добавить начальное значение переменной s, равное 2: s = 2 + 3596 = 3598 Ответ: 3598. Решение:

Разбор задачи 3: Запишите число, которое будет напечатано в результате выполнения программы. < int s, n; s = 33; n = 1; while (s > 0) < s = s – 7; n = n * 3; >Cout<<n; >

из программы видно, что начальные значения переменных 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. Решение:

попытка делать ручную трассировку, скорее всего, приведет к вычислительной ошибке, потому что число шагов слишком велико; легко забыть, что начальные значения переменных s и k не равны нулю; нужно помнить, что количество членов арифметической прогрессии на 1 больше, чем количество шагов, которые необходимы для перехода от первого значения к последнему. Возможные ловушки и проблемы:

Определите, что будет напечатано в результате работы следующей программы. Текст программы приведён на пяти языках программирования.

DIM k, s AS INTEGER

for k in range(1,10):

using namespace std;

Определите, что будет напечатано в результате работы следующей программы. Текст программы приведён на пяти языках программирования.

DIM k, s AS INTEGER

for k in range(10):

using namespace std;

Определите, что будет напечатано в результате работы следующей программы. Текст программы приведён на пяти языках программирования.

DIM k, s AS INTEGER

for k in range(10):

using namespace std;

Определите, что будет напечатано в результате работы следующей программы. Текст программы приведён на пяти языках программирования.

DIM k, s AS INTEGER

for k in range(1, 4):

using namespace std;

Определите, что будет напечатано в результате работы следующей программы. Текст программы приведён на пяти языках программирования.

DIM k, s AS INTEGER

for k in range(4, 0, −1):

using namespace std;

Определите, что будет напечатано в результате работы следующей программы. Текст программы приведён на пяти языках программирования.

DIM k, s AS INTEGER

for k in range(1, 6):

using namespace std;

Определите, что будет напечатано в результате работы следующей программы. Текст программы приведён на пяти языках программирования.

DIM k, s AS INTEGER

for k in range(5):

using namespace std;

Определите, что будет напечатано в результате работы следующей программы. Текст программы приведён на пяти языках программирования.

DIM k, s AS INTEGER

for k in range(1,8):

using namespace std;

Определите, что будет напечатано в результате работы следующей программы. Текст программы приведён на пяти языках программирования.

DIM k, s AS INTEGER

for k in range(3,11):

using namespace std;

В таблице A хранятся данные о количестве призёров олимпиады по программированию по девяти округам Москвы. Определите, что будет напечатано в результате выполнения следующего алгоритма, записанного на пяти языках программирования.

DIM A(9) AS INTEGER

DIM k, score AS INTEGER

score = score + A(k)

A = [6, 11, 7, 12, 13, 5, 9, 3, 4]

for k in range (9):

A: array[1..9] of integer;

using namespace std;

Программа предназначена для определения суммарного количества призёров в тех округах, в которых призёров не менее девяти. Это количество равно 11 + 12 + 13 + 9 = 45.

Определите, что будет напечатано в результате работы следующей программы. Текст программы приведён на пяти языках программирования.

DIM k, s AS INTEGER

FOR k = 14 TO 18

for k in range(14,19):

using namespace std;

В таблице Dat хранятся данные ежедневных измерений количества осадков за неделю в миллиметрах (Dat[1] — данные за понедельник, Dat[2] — за вторник и т.д.). Определите, что будет напечатано в результате выполнения следующего алгоритма, записанного на пяти языках программирования.

DIM Dat(7) AS INTEGER

DIM k, day AS INTEGER

Dat(1) = 14: Dat(2) = 9

Dat(3) = 0: Dat(4) = 15

Dat(5) = 0: Dat(6) = 15

IF Dat(k) = 0 THEN

Dat = [14, 10, 0, 15, 0, 15, 10]

for k in range(7):

Var k, day: integer;

Dat: array[1..7] of integer;

using namespace std;

Программа предназначена для определения последнего дня в неделе, в который не выпало осадков. Следовательно, программа выведет число 5.

Определите, что будет напечатано в результате работы следующей программы. Текст программы приведен на пяти языках программирования.

DIM k, s AS INTEGER

for k in range(6,13):

using namespace std;

Цикл «for k := 6 to 12 do» выполняется семь раз. Каждый раз переменная s увеличивается на 5. Поскольку изначально s = 0, после выполнения программы получим: s = 7 · 5 = 35.

Определите, что будет напечатано в результате работы следующей программы. Текст программы приведен на пяти языках программирования.

DIM k, s AS INTEGER

for k in range(1,6):

using namespace std;

Определите, что будет напечатано в результате работы следующей программы. Текст программы приведен на пяти языках программирования.

DIM k, s AS INTEGER

for k in range(1,11):

using namespace std;

Цикл «for k:=1 to 10 do» выполняется десять раз. Каждый раз переменная s увеличивается на 7. Поскольку изначально s = 0, после выполнения программы получим: s = 10 · 7 = 70.

DIM Dat(11) AS INTEGER

DIM k, m AS INTEGER

Dat(1) = 20: Dat(2) = 27

Dat(3) = 19: Dat(4) = 28

Dat(5) = 26: Dat(6) = 22

Dat(7) = 24: Dat(8) = 28

Dat(9) = 26: Dat(10) = 21

using namespace std;

Программа предназначена для поиска количества учеников в последнем классе в массиве, в котором менее 25 человек. Проанализировав входные данные, приходим к выводу, что ответ 21.

Обратите внимание, что находится не минимальный элемент массива.

Источник: ГИА по информатике 31.05.2013. Основная волна. Вариант 1316.

DIM Dat(10) AS INTEGER

DIM k,m AS INTEGER

Dat(1) = 12: Dat(2) = 15

Dat(3) = 17: Dat(4) = 15

Dat(5) = 14: Dat(6) = 12

Dat(7) = 10: Dat(8) = 13

Dat(9) = 14: Dat(10) = 15

IF Dat(k) = 15 THEN

Dat = [12, 15, 17, 15, 14, 12, 10, 13, 14, 15]

for k in range (10):

Var k, m: integer;

Dat: array[1..10] of integer;

using namespace std;

Источник: ГИА по информатике 31.05.2013. Основная волна. Центр, Урал. Вариант 1301.

Проверяемые элементы содержания: Знание основных конструкций языка программирования, понятия переменной, оператора присваивания



Задание демонстрационного варианта 2022 года ФИПИ
Плейлист видеоразборов задания на YouTube:

6_1 new: Определите, при каком наименьшем введённом значении переменной s программа выведет число 256 (с сайта К. Полякова со ссылкой на М.В. Кузнецову):

var k,n,p,l,s,x:integer; var s, n: integer; begin readln (s); n := 1; while s <=45 do begin s := s + 4; n := n * 2 end; writeln(n) end.

s = int(input()) n = 1 while s <= 45: s = s + 4 n = n * 2 print( n )

Ответ: 3

begin var s0 := 1; while true do // внешний цикл, бесконечный begin var s := s0; // --- код из условия задания --- // var n := 1; while s <= 45 do // внутренний цикл из задания begin s := s + 4; n := n * 2; end; // --- конец кода из условия задания --- // if n = 256 then // если найдено, то выводим соответствующее s begin print(s0); break; // выход из бесконечного цикла end; s0 := s0 + 1; // end; end.

6_2 new: Определите, при каком наибольшем введённом значении переменной s программа выведет число 96 (с сайта К. Полякова № 68 со ссылкой на М.В. Кузнецову):

var s, n: integer; begin readln (s); n := 3; while s <= 51 do begin s := s + 7; n := n * 2 end; writeln(n) end.

s = int(input()) n = 3 while s <= 51: s = s + 7 n = n * 2 print( n )

Ответ: 23

begin var s1 := 50; while true do // внешний цикл, бесконечный begin var s := s1; // --- код из условия задания --- // var n := 3; while s <= 51 do // внутренний цикл из задания begin s := s + 7; n := n * 2; end; // --- конец кода из условия задания --- // if n = 96 then // если найдено, то выводим соответствующее s begin print(s1); break; // выход из бесконечного цикла end; s1 := s1 - 1; // end; end.

6_3 new: (с сайта К. Полякова № 83):

Сколько существует различных значений d , оканчивающихся на 8, при вводе которых эта приведенная программа выведnет число 50?

var S, N, d: integer; begin readln(d); S := 15; N := 10; while S <= 2400 do begin S := S + d; N := N + 5; end; writeln(N); end.

d = int(input()) S = 15 N = 10 while S <= 2400: S = S + d N = N + 5 print(N)

Ответ: 4

var S, N: integer; begin S := 15; N := 10; var counter := 0; // цикл для перебора значений d for var d := 1 to 2400 do begin // из условия задачи while S <= 2400 do begin S := S + d; N := N + 5; end; // проверка условий: увеличение счетчика if (d mod 10 = 8) and (N = 50) then begin writeln($''); Inc(counter); end; // устанавливаем первоначальные значения S := 15; N := 10; end; writeln('Результат = ', counter); end.

6_4 new: с сайта К. Полякова № 138:

Определите наименьшее и наибольшее введённое значение переменной s , при котором программа выведет число 210. В ответ запишите оба числа в порядке убывания без пробелов и других разделителей

var s, n: integer; begin readln(s); n := 600; while n > s do begin s := s + 3; n := n - 6 end; writeln(n) end.

s = int(input()) n = 600 while n > s: s = s + 3 n = n - 6 print(n)

Ответ: 2315

Решения подобных заданий прошлых лет

Определить, какое число пропущено

6_14: ЕГЭ по информатике 2020 (Тематические тренировочные задания, 2020 г., Самылкина Н.Н., Синицкая И.В., Соболева В.В., задание № 2):


Сопоставьте формулу:

и программу, предназначенную для расчета по данной формуле. Программа написана правильно, а в формуле допущена ошибка.

Определите, где и какое число в формуле пропущено?

var k,n,p,l,s,x:integer; begin writeln('введите n='); readln(n); writeln('введите x='); readln(x); s:=0; p:=1; l:=x; For k:=1 to n do begin p:=p * k; s:=s + 3*l/p; l:=l*x; end; writeln('S=',S:5:2); end.

INPUT "введите n=", n INPUT "введите x=", x s=0: p=1 l=x FOR k:=1 to n p = p * k: s = s + 3*l/p l = l*x NEXT k PRINT "S=",S END

n = int(input('введите n=')) x = int(input('введите x=')) s=0 p=1 l=x For k in range (1,n+1): p*= k s+=3*l/p l*=x print('S=',S)

Ответ: 3



Фактически она обозначает: сумма x k / k! для всех k, начиная от 1 до n.

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

ЕГЭ по информатике 2017 задание ФИПИ вариант 15 (Крылов С.С., Чуркина Т.Е.):

Определите, что будет напечатано в результате работы следующего фрагмента программы:

var k,s:integer; begin s:=512; k:=0; while s<2048 do begin s:=s+64; k:=k+1; end; write(k); end.

DIM S, K AS INTEGER S = 512 K = 0 WHILE S < 2048 S = S + 64 K = K + 1 WEND PRINT K

s = 512 k = 0 while s < 2048: s = s + 64 k = k + 1 print(k)

Ответ: 24

Решение 6 задания ЕГЭ по информатике (контрольный вариант № 2 экзаменационной работы 2018 года, С.С. Крылов, Д.М. Ушаков):

Определите, что будет напечатано в результате выполнения программы:

var s, i: integer; begin i := 1; s := 105; while s > 5 do begin s := s - 2; i := i + 1 end; writeln(i) end.

DIM S, I AS INTEGER I = 1 S = 105 WHILE S > 5 S = S - 2 I = I + 1 WEND PRINT I

i = 1 s = 105 while s > 5: s = s - 2 i = i + 1 print(i)

Ответ: 51

  • Рассмотрим алгоритм. Цикл зависит от переменной s, которая уменьшается каждую итерацию цикла на 2.
  • В цикле также присутствует счетчик - переменная i, которая увеличится на единицу ровно столько раз, сколько итераций (проходов) цикла. Т.е. в результате выполнения программы распечатается значение, равное количеству итераций цикла.
  • Поскольку условие цикла зависит от s, нам необходимо посчитать, сколько раз сможет s уменьшиться на 2 в цикле. Для удобства подсчета изменим условие цикла на while s > 0 ; так как мы s уменьшили на 5, соответственно, изменим и 4-ю строку на s:=100 (105-5):
  • Для того чтобы посчитать, сколько раз выполнится цикл, необходимо 100 разделить на 2, т.к. s каждый шаг цикла уменьшается на 2:
  • В 3-й строке видим, что начальным значением i является 1, т.е. в первую итерацию цикла i = 2. Значит, нам необходимо к результату (50) прибавить 1.
  • Это значение и будет выведено на экран.
6 задание. Демоверсия ЕГЭ 2018 информатика:

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

var s, n: integer; begin s := 260; n := 0; while s > 0 do begin s := s - 15; n := n + 2 end; writeln(n) end.

DIM S, N AS INTEGER S = 260 N = 0 WHILE S > 0 S = S - 15 N = N + 2 WEND PRINT N

s = 260 n = 0 while s > 0: s = s - 15 n = n + 2 print(n)

Ответ: 36

10 Тренировочных вариантов экзаменационных работ для подготовки к ЕГЭ по информатике 2017, задание 8, вариант 1 (Ушаков Д.М.):

Определите, что будет напечатано в результате выполнения следующего фрагмента программы:

var k,s: integer; begin k:=1024; s:=50; while s>30 do begin s:=s-4; k:=k div 2; end; write(k) end.

DIM S, K AS INTEGER S = 50 K = 1024 WHILE S > 30 S = S - 4 K = K \ 2 WEND PRINT K

s = 50 k = 1024 while s > 30: s = s - 4 k = k // 2 print(k)

Ответ: 32

Решение 6 задания ЕГЭ по информатике 2018 (диагностический вариант экзаменационной работы 2018 года, С.С. Крылов, Д.М. Ушаков, Тренажер ЕГЭ):

Определите значение переменной c после выполнения следующего фрагмента программы. Ответ запишите в виде целого числа.

a:=-5; c:=1024; while a<>0 do begin c:=c div 2; a:=a + 1 end;

A = -5 C = 1024 WHILE A <> 0 C = C \ 2 A = A + 1 WEND

a = -5 c = 1024 while a != 0: c = c // 2 a = a + 1

int a = -5, c = 1024; while (a != 0) < c = c / 2; a = a + 1; >

Ответ: 32

6_12: Решение 6 (8) задания (источник: вариант 25, К. Поляков):

Определите, что будет напечатано в результате работы следующего фрагмента программы.

var n, s: integer; begin n := 1; s := 0; while s <= 365 do begin s := s + 36; n := n * 2 end; write(n) end.

N = 1 S = 0 WHILE S <= 365 S = S + 36 N = N * 2 WEND PRINT N

n = 1 s = 0 while s <= 365: s = s + 36 n = n * 2 print(n)

Ответ: 2048

  • с каждым шагом цикла значение s увеличивается на 36, пока не станет больше 365; а значение n увеличивается в 2 раза, так что n=2 k , где k – это число итераций цикла;
  • поскольку s увеличивается на 36, конечное значение s должно быть равно 0+36*k , достигается при k=11 (и s=36*11=396);
  • тогда n = 2 k = 2 11 = 2048 .

Сумма или разность двух линейных функций (while s - n или while s + n)

Разбор 6 (раньше №8) задания ЕГЭ вариант № 1, 2019 Информатика и ИКТ Типовые экзаменационные варианты (10 вариантов), С.С. Крылов, Т.Е. Чуркина:

Запишите число, которое будет напечатано в результате выполнения следующей программы:

var s, n: integer; begin s := 522; n := 400; while s - n > 0 do begin s := s - 20; n := n - 15 end; write(s) end.

DIM S, N AS INTEGER S = 522 N = 400 WHILE S - N > 0 S = S - 20 N = N - 15 WEND PRINT S

s = 522 n = 400 while s - n > 0: s = s - 20 n = n - 15 print(s)

Ответ: 22

  • В алгоритме присутствует цикл. Для того, чтобы разобраться в алгоритме, выполним трассировку начальных итераций цикла:
    № шагаусловие циклаsn
    1522-400=122
    122 > 0
    522-20=502400-15=385
    2502-385=117
    117 > 0
    502-20=482385-15=370
    3482-370=112
    112 > 0
    ..
  • Видим, что в условии разница между значениями составляет 5:
  • Таким образом, чтобы определить количество итераций (шагов) цикла, необходимо значение условия цикла, полученное в первой итерации, разделить на 5:

Это значит, что на 24-й итерации цикла переменные s и n получили такие значения, после которых условие еще осталось истинным: 2 > 0. На 25-м шаге выполняется это условие:

ЕГЭ по информатике задание 6.13 (источник: вариант 59, К. Поляков)

Запишите число, которое будет выведено в результате работы программы:

var s, n: integer; begin s := 10; n := 55; while n > s do begin s := s + 1; n := n - 1 end; writeln(n) end.

DIM S, N AS INTEGER S = 10 N = 55 WHILE N > S S = S + 1 N = N - 1 WEND PRINT N

s = 10 n = 55 while n > s: s = s + 1 n = n - 1 print(n)

Ответ: 32

  • Для условия цикла - перенесем влево:
  • Согласно начальным значениям, имеем:
  • Запишем, как будет изменяться условие цикла в каждой итерации (в каждом шаге):
  • Т.е. условие цикла будет истинным пока возможно вычитать 2. Сколько раз можно вычесть два из 45?
  • Соответственно, получили 23 итерации цикла.
  • Изначально n = 55. С каждой итерацией выполнялось n-1. Посчитаем n:

Поиск наименьшего/наибольшего целого введенного числа d

При каком наименьшем целом введенном числе d после выполнения программы будет напечатано число 192?

var k,s,d: integer; begin readln (d); s:=0; k:=0; while k < 200 do begin s:=s+64; k:=k+d; end; write(s); end.

DIM S, K, D AS INTEGER INPUT D S = 0 K = 0 WHILE K < 200 S = S + 64 K = K + D WEND PRINT S

d = int (input ()) s = 0 k = 0 while k < 200: s = s + 64 k = k + d print(s)

Ответ: 67

  • Цикл зависит от переменной k, которая каждую итерацию цикла увеличивается на значение d (вводимое). Цикл закончит "работу", когда k сравняется с 200 или превысит его (k >= 200).
  • Результатом программы является вывод значения переменной s. В цикле s увеличивается на 64.
  • Так как по заданию необходимо, чтобы вывелось число 192, то число повторов цикла определим так:
  • Так как в цикле k увеличивается на значение d, а повторов цикла 3 (при этом цикл завершается при k>=200), составим уравнение:
  • Поскольку число получилось нецелое, то проверим и 66 и 67. Если мы возьмем 66, то:

т.е. цикл после трех прохождений еще продолжит работу, что нам не подходит.

ЕГЭ по информатике задание 6.9 (источник: вариант 37, К. Поляков со ссылкой на О.В. Гасанова)

Запишите через запятую наименьшее и наибольшее значение числа d, которое нужно ввести, чтобы после выполнения программы было напечатано 153?

var n, s, d: integer; begin readln(d); n := 33; s := 4; while s <= 1725 do begin s := s + d; n := n + 8 end; write(n) end.

DIM S, N, D AS INTEGER INPUT D N = 33 S = 4 WHILE S <= 1725 S = S + D N = N + 8 WEND PRINT N

d = int (input ()) n = 33 s = 4 while s <= 1725: s = s + d n = n + 8 print(n)

Ответ: 115, 122

  • Цикл программы зависит от значения переменной s, которая в цикле постоянно увеличивается на значение d (d вводится пользователем в начале программы).
  • Кроме того, в цикле переменная n увеличивается на 8. Значение переменной n выводится на экран в конце программы, т.е. по заданию n к концу программы должно n = 153.
  • Необходимо определить количество итераций цикла (прохождений). Так как начальное значение n = 33, а в конце оно должно стать 153, в цикле увеличиваясь на 8, то сколько раз 8 "поместится" в 120 (153 - 33)? :
  • Как мы определили, цикл зависит от s, которая в начале программы s = 4. Для простоты работы примем, что s = 0, тогда изменим и условие цикла: вместо s сделаем s (1725-1721)
  • Найдем d. Так как цикл выполняется 15 раз, то необходимо найти такое целое число, которое при умножении на 15 возвращало бы число большее 1721:
  • 115 - это наименьшее d при котором n станет равным 153 (за 15 шагов цикла).
  • Найдем наибольшее d. Для этого надо найти такое число, которое соответствует неравенствам:
  • Найдем:
  • Наибольшее d= 122

Усложненные задания с двумя линейными функциями

ЕГЭ по информатике задание 6.6 (источник: вариант 36, К. Поляков)

Запишите число, которое будет напечатано в результате выполнения следующей программы:

var s, n: integer; begin s := 0; n := 0; while 2*s*s < 123 do begin s := s + 1; n := n + 2 end; writeln(n) end.

DIM S, N AS INTEGER S = 0 N = 0 WHILE 2*S*S < 123 S = S + 1 N = N + 2 WEND PRINT N

s = 0 n = 0 while 2*s*s < 123: s = s + 1 n = n + 2 print(n)

Ответ: 16

  • В цикле переменная s постоянно увеличивается на единицу (работает как счетчик), а переменная n в цикле увеличивается на 2.
  • В результате работы программы на экран выводится значение n.
  • Цикл зависит от s, причем работа цикла завершится когда 2 * s 2 >= 123.
  • Необходимо определить количество прохождений цикла (итераций цикла): для этого определим такое наименьшее возможное s, чтобы 2 * s 2 >= 123:

Либо просто нужно было бы найти такое наименьшее возможное четное число >= 123, которое при делении на 2 возвращало бы вычисляемый корень числа:

Арифметическая и геометрическая прогрессия

ЕГЭ по информатике задание 6.10 (источник: вариант 3, К. Поляков)

Определите, что будет напечатано в результате работы следующего фрагмента программы:

var k, s: integer; begin s:=3; k:=1; while k < 25 do begin s:=s+k; k:=k+2; end; write(s); end.

DIM S, K AS INTEGER S = 3 K = 1 WHILE K < 25 S = S + K K = K + 2 WEND PRINT S

s = 3 k = 1 while k < 25: s = s + k k = k + 2 print(s)

Ответ: 147

  • Результатом программы является вывод значения s.
  • В цикле s меняется, увеличиваясь на k, при начальном значении s = 3.
  • Цикл зависит от k. Выполнение цикла завершится при k >= 25. Начальное значение k = 1.
  • В цикле k постоянно увеличивается на 2 -> значит, можно найти количество итераций цикла.
  • Количество итераций цикла равно:

(т.к. k изначально равнялось 1, то в последнее, 12-е прохождение цикла, k = 25; условие цикла ложно)

где a1 - первый член прогрессии,
d - разность,
n - количество членов прогрессии (в нашем случае - кол-во итераций цикла)

Государственный выпускной экзамен ГВЭ 2019 (информатика ГВЭ ФИПИ, № 15):

Запишите число, которое будет напечатано в результате выполнения программы:

var n, s: integer; begin n := 1; s := 0; while n <= 1000 do begin s := s + n; n := n * 2 end; write(s) end.

DIM N, S AS INTEGER N = 1 S = 0 WHILE N <= 1000 S = S + N N = N * 2 WEND PRINT S

n = 1 s = 0 while n <= 1000: s = s + n n = n * 2 print(s)

№1. Опре­де­ли­те, что будет на­пе­ча­та­но в ре­зуль­та­те ра­бо­ты сле­ду­ю­ще­го фраг­мен­та про­грам­мы:

var k, s: integer;

while s < 66 do begin

Цикл while вы­пол­ня­ет­ся до тех пор, пока ис­тин­но усло­вие s < 66, т. е. пе­ре­мен­ная s опре­де­ля­ет, сколь­ко раз вы­пол­нит­ся цикл.

Зна­че­ние s есть сумма пер­вых n чле­нов ариф­ме­ти­че­ской про­грес­сии. b =2 a 1+( n -1) d \2* n , — сумма пер­вых n чле­нов про­грес­сии, — раз­ность про­грес­сии, — ко­ли­че­ство чле­нов.

Цикл пре­рвет­ся, когда . s = 2 s 1+( n -1) d /2* n <66

Най ­ дем :s=(2s1+(n-1)d)n<132 ,s1=1 ,d=3 ( т . к . k:=k+3). Чтобы ре­шить это не­ра­вен­ство, нам не­об­хо­ди­мо ре­шить квад­рат­ное урав­не­ние 3 n ^2- n -132=0, среди его кор­ней нас ин­те­ре­су­ют толь­ко по­ло­жи­тель­ные, сле­до­ва­тель­но, n =6,8

Вос­поль­зо­вав­шись ме­то­дом ин­тер­ва­лов, на­хо­дим, что пер­вое на­ту­раль­ное n, при ко­то­ром на­ру­ша­ет­ся усло­вие, есть n =7 .

Под­ста­вив из­вест­ные па­ра­мет­ры в Kn = k 1+( n -1) d по­лу­ча­ем, что k 1=19

№2. Опре­де­ли­те, что будет на­пе­ча­та­но в ре­зуль­та­те ра­бо­ты сле­ду­ю­ще­го фраг­мен­та про­грам­мы:

var k, s: integer;

while k < 30 do begin

Цикл while вы­пол­ня­ет­ся до тех пор, пока ис­тин­но усло­вие k < 30, т. е. пе­ре­мен­ная k опре­де­ля­ет, сколь­ко раз вы­пол­нит­ся цикл.

Так как по­сле­до­ва­тель­ность k пред­став­ля­ет собой ариф­ме­ти­че­скую про­грес­сию, най­дем n из не­ра­вен­ства:

Kn=k1+9n-1)d<30,k1=0,d=3( т . к . k:=k+3). Вос­поль­зо­вав­шись ме­то­дом ин­тер­ва­лов, на­хо­дим пер­вое на­ту­раль­ное n, при ко­то­ром на­ру­ша­ет­ся усло­вие: n =11

Зна­че­ние s есть сумма пер­вых n чле­нов ариф­ме­ти­че­ской про­грес­сии. b =2 a 1+( n -1) d \2* n — сумма пер­вых n чле­нов про­грес­сии, — раз­ность про­грес­сии, — ко­ли­че­ство чле­нов.

№3. Опре­де­ли­те, что будет на­пе­ча­та­но в ре­зуль­та­те ра­бо­ты сле­ду­ю­ще­го фраг­мен­та про­грам­мы:

var k, s: integer;

while k < 13 do begin

Цикл while вы­пол­ня­ет­ся до тех пор, пока ис­тин­но усло­вие k < 13, т. е. пе­ре­мен­ная k опре­де­ля­ет, сколь­ко раз вы­пол­нит­ся цикл.

Так как числа не­боль­шие, можно ак­ку­рат­но вы­пи­сать все s и k:

(Пом­ни­те, что усло­вие k < 13 про­ве­ря­ет­ся сразу после k:=k+4, сле­до­ва­тель­но, дей­ствие s:=s+2*k для k=16 вы­пол­нять­ся не будет)

Сле­до­ва­тель­но, ответ 49+16=65

№4. Опре­де­ли­те, что будет на­пе­ча­та­но в ре­зуль­та­те ра­бо­ты сле­ду­ю­ще­го фраг­мен­та про­грам­мы:

var k, s: integer;

while k < 11 do begin

Цикл while вы­пол­ня­ет­ся до тех пор, пока ис­тин­но усло­вие k < 11, т. е. пе­ре­мен­ная k опре­де­ля­ет, сколь­ко раз вы­пол­нит­ся цикл.

За­пи­шем по­сле­до­ва­тель­но зна­че­ния s и k:

k 1 2 3 4 5 6 7 8 9 10

s 0 3 6 10 15 21 28 36 45 55

Цикл вы­пол­нит­ся де­сять раз: так как дей­ствие k := k+1 стоит в конце цикла для k=11 дей­ствие s:= s + k не будет вы­пол­нять­ся.

№5. Опре­де­ли­те, что будет на­пе­ча­та­но в ре­зуль­та­те ра­бо­ты сле­ду­ю­ще­го фраг­мен­та про­грам­мы:

var k, s: integer;

while k < 15 do begin

Цикл while вы­пол­ня­ет­ся до тех пор, пока ис­тин­но усло­вие k < 15, т. е. пе­ре­мен­ная k опре­де­ля­ет, сколь­ко раз вы­пол­нит­ся цикл.

Цикл будет вы­пол­нять­ся, пока k не ста­нет боль­ше либо рав­ным 15. Учи­ты­вая, что k при­ни­ма­ет толь­ко чётные зна­че­ния, по­след­ним дей­стви­ем будет , а цикл вы­пол­нит­ся 8 раз. К 5 в ре­зуль­та­те по­сле­до­ва­тель­но при­бав­ля­ют­ся все чет­ные числа до 16 вклю­чи­тель­но. За­ме­тим, что это — ариф­ме­ти­че­ская про­грес­сия с раз­но­стью про­грес­сии, рав­ной 2. Поль­зу­ясь фор­му­лой для суммы n пер­вых чле­нов ариф­ме­ти­че­ской про­грес­сии, по­лу­чим:

№6. Опре­де­ли­те, что будет на­пе­ча­та­но в ре­зуль­та­те ра­бо­ты сле­ду­ю­ще­го фраг­мен­та про­грам­мы:

var n, s: integer;

while n <= 8 do begin

По­сколь­ку из­на­чаль­но n = 4, цикл while n <= 8 вы­пол­нит­ся пять раз. Сле­до­ва­тель­но, s = 4 + 5 + 6 + 7 + 8 = 30.

№7. Опре­де­ли­те, что будет на­пе­ча­та­но в ре­зуль­та­те ра­бо­ты сле­ду­ю­ще­го фраг­мен­та про­грам­мы:

var k, s: integer;

while s < 100 do begin

Цикл while вы­пол­ня­ет­ся до тех пор, пока ис­тин­но усло­вие s < 100, т. е. пе­ре­мен­ная s опре­де­ля­ет, сколь­ко раз вы­пол­нит­ся цикл.

Зна­че­ние s есть сумма пер­вых n чле­нов ариф­ме­ти­че­ской про­грес­сии. d =2 a 1+( n -1) d \2* n , — сумма пер­вых n чле­нов про­грес­сии, — раз­ность про­грес­сии, — ко­ли­че­ство чле­нов.

Цикл пре­рвет­ся, когда s =2 s 1( m -1) d \2* n <100 .

Най ­ дем :s=(2s1+(n-1)d)n<200 ,s1=0 ,d=4 ( т . к . k:=k+4). Чтобы ре­шить это не­ра­вен­ство, нам не­об­хо­ди­мо ре­шить квад­рат­ное урав­не­ние: n ^2- n -50=0 . Среди его кор­ней нас ин­те­ре­су­ют толь­ко по­ло­жи­тель­ные, сле­до­ва­тель­но, n=7,5

Вос­поль­зо­вав­шись ме­то­дом ин­тер­ва­лов, на­хо­дим, что пер­вое на­ту­раль­ное n, при ко­то­ром на­ру­ша­ет­ся усло­вие, есть n =8 .

Учи­ты­вая по­ря­док опе­ра­ций в цикле, вы­яс­ня­ем, что, до того как пре­рвать­ся, цикл вы­пол­нит­ся еще раз, сле­до­ва­тель­но, n =9 .

Под­ста­вив из­вест­ные па­ра­мет­ры в Kn = k 1+( n -1) d , по­лу­ча­ем, что k 9=32

№8. Опре­де­ли­те, что будет на­пе­ча­та­но в ре­зуль­та­те ра­бо­ты сле­ду­ю­ще­го фраг­мен­та про­грам­мы:

var k, s: integer;

while s < 50 do begin

Цикл while вы­пол­ня­ет­ся до тех пор, пока ис­тин­но усло­вие s < 50, т. е. пе­ре­мен­ная s опре­де­ля­ет, сколь­ко раз вы­пол­нит­ся цикл.

Зна­че­ние s есть сумма пер­вых n чле­нов ариф­ме­ти­че­ской про­грес­сии. d=2a1+(n-1)d\2*n , — сумма пер­вых n чле­нов про­грес­сии, — раз­ность про­грес­сии, — ко­ли­че­ство чле­нов.

Цикл пре­рвет­ся, когда s =2 s 1+( n -1) d \2* n <50 .

Вы ­ яс ­ ним : s=(2s1+(n-1)d)n<100, s1=2, d=2 ( т . к . k:=k+2). Чтобы ре­шить это не­ра­вен­ство, нам не­об­хо­ди­мо ре­шить квад­рат­ное урав­не­ние: n^2-n-50=0 . Среди его кор­ней нас ин­те­ре­су­ют толь­ко по­ло­жи­тель­ные, сле­до­ва­тель­но n =6,5

Вос­поль­зо­вав­шись ме­то­дом ин­тер­ва­лов, на­хо­дим, что пер­вое на­ту­раль­ное n, при ко­то­ром на­ру­ша­ет­ся усло­вие, есть n =7.

Так как опе­ра­ция k:=k+2; идет после s:=s+k; то цикл вы­пол­нит­ся еще раз, сле­до­ва­тель­но, n =8.

Kn=k1+(n-1)d Под­ста­вив из­вест­ные па­ра­мет­ры, по­лу­ча­ем, что k 8=16

№9. Опре­де­ли­те, что будет на­пе­ча­та­но в ре­зуль­та­те ра­бо­ты сле­ду­ю­ще­го фраг­мен­та про­грам­мы:

var k, s: integer;

while k < 25 do begin

Цикл while вы­пол­ня­ет­ся до тех пор, пока ис­тин­но усло­вие k < 25, т.к. по усл. while k < 25 do begin и k:=k+2. То есть цикл будет вы­пол­нен 13 раз.

Ак­ку­рат­но вы­пи­шем все s и k:

s 3 4 7 12 19 28 39 52 67 84 103 124 147

k 1 3 5 7 9 11 13 15 17 19 21 23 25

№10. Опре­де­ли­те, что будет на­пе­ча­та­но в ре­зуль­та­те вы­пол­не­ния про­грам­мы (за­пи­сан­ной ниже на раз­ных язы­ках про­грам­ми­ро­ва­ния):

Читайте также: