
Анализ циклического алгоритма. Определение результата алгоритма
Штана Альберт Игоревич
В этой статье будет разобрано задание 6.
Рассмотрим задачи из шестого задания ЕГЭ по информатике.
Данное задание относится к базовому уровню сложности.
Время выполнения задания ≈ 4 минуты.
Данное задание проверяет умение определять возможные результаты работы простейших алгоритмов управления исполнителями и вычислительных алгоритмов.
Исполнитель Черепаха действует на плоскости с декартовой системой координат. В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен. При опущенном хвосте Черепаха оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя и направление его движения. У исполнителя существует две команды: Вперёд n (где n — целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова, и Направо m (где m — целое число), вызывающая изменение направления движения на m градусов по часовой стрелке. Запись Повтори k Команда1 Команда2 … КомандаS означает, что последовательность из S команд повторится k раз. Черепахе был дан для исполнения следующий алгоритм:
Повтори 4 [Вперёд 12 Направо 90]
Повтори 3 [Вперёд 12 Направо 120].
Определите, сколько точек с целочисленными координатами будут находиться внутри области, ограниченной линией, заданной данным алгоритмом Повтори 4 [Вперёд 12 Направо 90], и находиться вне области, ограниченной линией, заданной данным алгоритмом: Повтори 3 [Вперёд 12 Направо 120]. Точки на линии учитывать не следует.
Запустим программу Кумир-Стандарт. В начале нужно подключить модуль Черепаха.

После того как подключили модуль Черепаха нужно воспроизвести(написать) алгоритм:
использовать Черепаха
алг
нач
опустить хвост
нц 4 раз
вперед(12)
вправо(90)
кц
нц 3 раз
вперед(12)
вправо(120)
кц
кон
В начале нужно подключить модуль Черепаха: пишется команда использовать Черепаха. Слово алг обозначает начало алгоритма. Слово нач - это начало программы.
Опускаем хвост у Черепахи. Цикл пишем с помощью команды нц - начало цикла. Команда кц - это конец цикла. Команда вправо - это аналог команды Направо (видим, что эти команды пишутся по-разному). Аналогично есть команда влево в программе Кумир. Команда вперед пишется без буквы ё.
После того как алгоритм перенесли в программу Кумир, запускаем программу, нажав на кнопку F9 (или кнопка play в виде треугольника).
После этого появится окно в правом нижнем углу. Это окно можно масштабировать до нужных размеров, чтобы было удобно анализировать рисунок.

Настроить масштабирование на 1.

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

Получается 65 точек.
Считать точки вручную в графическом редакторе — не удобно. Это может занять достаточно много времени. Правильнее будет данную задачу решать с помощью программирования. Но если задание(фигура) достаточно сложное, чтобы посчитать точки, тогда единственным решением на экзамене останется способ решения задачи с подсчётом точек вручную.
Напишем программу на Python в которой сразу посчитаем количество точек.
Зная условие (по которому производится подсчёт точек) — можно не визуализировать исполнителя.
k = 0
for x in range(1, 12):
for y in range(1, 12):
if (y < x / 3 ** 0.5) or (y > -x / 3 ** 0.5 + 12):
k += 1
print(k)
Здесь с помощью цикла мы перебираем все возможные координаты x, y которые могут получиться у фигуры построенной черепашкой(в задаче она двигается каждый раз вперёд на 12 клеток поэтому функцию range запускаем от 1 до 12). Внутри циклов нужно прописать условие, которое ответит на вопрос: попала ли точка внутрь области? Если попала тогда считаем её с помощью переменной счётчика(k). В конце работы циклов получаем ответ на задачу.
Можно также решать данный тип задач похожим образом как в среде Кумир, но только с помощью модуля turtle в Python. Ниже ещё одно решение данной задачи:
from turtle import * # Подключаем модуль черепашку
left(90) # Изначально черепашку нужно повернуть по часовой стрелки на 90 градусов
M = 20 # Масштаб одной клетки
counter = 0 # Переменная для подсчёта количество точек
# Алгоритмы действий черепашки
for i in range(4): # Повтори 4 раза
forward(12 * M) # Вперёд на 12: (12 * 20) в 20 раз увеличиваем расстояние чтобы было видно фигуру
right(90) # Поворот направо на 90 градусов
for i in range(3): # Повтори 3 раза
forward(12 * M) # (12 * 10) в 10 раз увеличиваем расстояние чтобы было видно фигуру
right(120) # Поворот направо на 120 градусов
penup() # Поднимаем перо(хвост у черепашки чтобы не рисовала) по умолчанию рисует
# Решим задачу на определение количества точек в области фигуры
for x in range(1, 12): # Условно двумя циклами обойдём получившийся прямоугольник
for y in range(1, 12): # Начинаем с 1 потому что нам нужны точки не на линиях фигуры
goto(x * M, y * M) # Не забываем про масштаб
# Условие проверки попадания точки в область
if (y < x / 3 ** 0.5) or (y > -x / 3 ** 0.5 + 12):
counter += 1 # Подсчитываем количество нарисованных точек
dot(4) # Рисуем точку
goto(120, 150) # Переходим по координате чтобы там вывести ответ
write(counter, align='right', move=True, font=("Arial", 14, "bold")) # Выводим ответ количество точек на экран
ht() # Скрываем курсор
done() # Должен быть последним оператором в программе графики черепахи
Результат работы программы:

Ответ: 65
Исполнитель Черепаха действует на плоскости с декартовой системой координат. В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен. При опущенном хвосте Черепаха оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя и направление его движения. У исполнителя существует две команды: Вперёд n (где n – целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова, и Направо m (где m – целое число), вызывающая изменение направления движения на m градусов по часовой стрелке. Запись Повтори k [Команда1 Команда2 … Команда_S_] означает, что последовательность из S команд повторится k раз.
Черепахе был дан для исполнения следующий алгоритм:
Повтори 7 [Вперёд 10 Направо 120].
Определите, сколько точек с целочисленными координатами будут находиться внутри области, ограниченной линией, заданной данным алгоритмом. Точки на линии учитывать не следует.
from turtle import * # Подключаем модуль черепашку
left(90) # Изначально черепашку нужно повернуть по часовой стрелки на 90 градусов
M = 20 # Масштаб одной клетки
counter = 0 # Переменная для подсчёта количество точек
# Алгоритмы действий черепашки
for i in range(7): # Повтори 7 раз
forward(10 * M) # Вперёд на 10: (10 * 20) в 20 раз увеличиваем расстояние чтобы было видно фигуру
right(120) # Поворот направо на 120 градусов
penup() # Поднимаем перо(хвост у черепашки чтобы не рисовала) по умолчанию рисует
# Решим задачу на определение количества точек в области фигуры
for x in range(1, 10): # Условно двумя циклами обойдём получившийся прямоугольник
for y in range(1, 10): # Начинаем с 1 потому что нам нужны точки не на линиях фигуры
goto(x * M, y * M) # Не забываем про масштаб
# Условие попадания точки в область треугольника
if (y > x / 3 ** 0.5) and (y < -x / 3 ** 0.5 + 10):
counter += 1 # Подсчитываем количество нарисованных точек
dot(5) # Рисуем точку
goto(120, 150) # Переходим по координате чтобы там вывести ответ
write(counter, align='right', move=True, font=("Arial", 14, "bold")) # Выводим ответ количество точек на экран
ht() # Скрываем курсор
done() # Должен быть последним оператором в программе графики черепахи
Результат работы программы:

Ответ: 38
Черепахе был дан для исполнения следующий алгоритм:
Повтори 2 [Вперёд 10 Направо 90 Вперёд 20 Направо 90]
Поднять хвост
Вперёд 3 Направо 90 Вперёд 5 Налево 90
Опустить хвост
Повтори 2 [Вперёд 70 Направо 90 Вперёд 80 Направо 90]
Определите, сколько точек с целочисленными координатами будут находиться внутри пересечения фигур, ограниченных заданными алгоритмом линиями, включая точки на границах этого пересечения.
from turtle import * # Подключаем модуль черепашку
left(90) # Изначально черепашку нужно повернуть по часовой стрелки на 90 градусов
M = 5 # Масштаб одной клетки
counter = 0 # Переменная для подсчёта количество точек
# Алгоритмы действий черепашки
for i in range(2): # Повтори 2 раза
forward(10 * M) # Вперёд на 10: (10 * 5) в 5 раз увеличиваем расстояние чтобы было видно фигуру
right(90) # Поворот направо на 90 градусов
forward(20 * M) # Вперёд на 20
right(90) # Поворот направо на 90 градусов
penup() # Поднимаем перо(хвост у черепашки чтобы не рисовала) по умолчанию рисует
forward(3 * M) # Вперёд 3
right(90) # Направо 90
forward(5 * M) # Вперёд 5
left(90) # Налево 90
pendown() # Опустить хвост
for i in range(2): # Повтори 2 раза
forward(70 * M) # Вперёд на 70: (70 * 5) в 5 раз увеличиваем расстояние чтобы было видно фигуру
right(90) # Поворот направо на 90 градусов
forward(80 * M) # Вперёд на 80
right(90) # Направо 90
penup() # Поднимаем перо(хвост у черепашки чтобы не рисовала) по умолчанию рисует
# Решим задачу на определение количества точек в области фигуры
for x in range(0, 21): # Условно двумя циклами обойдём получившийся прямоугольник
for y in range(0, 11): # Начинаем с 0 потому что нам нужны точки и на линиях пересечения фигур
goto(x * M, y * M)
# Условие попадания точки в область пересечения двух фигур
if (20 >= x >= 5) and (10 >= y >= 3): # Условие определяем после визуального построения черепашкой двух фигур
counter += 1 # Подсчитываем количество нарисованных точек
dot(4) # Рисуем точку
goto(120, 150) # Переходим по координате чтобы там вывести ответ
write(counter, align='right', move=True, font=("Arial", 14, "bold")) # Выводим ответ количество точек на экран
ht() # Скрываем курсор
done() # Должен быть последним оператором в программе графики черепахи
Результат работы программы:

Ответ: 128
Черепахе был дан для исполнения следующий алгоритм:
Повтори 2 [Вперёд 8 Направо 90 Вперёд 18 Направо 90]
Поднять хвост
Вперёд 4 Направо 90 Вперёд 10 Налево 90
Опустить хвост
Повтори 2 [Вперёд 17 Направо 90 Вперёд 7 Направо 90]
Определите, сколько точек с целочисленными координатами будут находиться внутри объединения фигур, ограниченных заданными алгоритмом линиями, включая точки на линиях.
from turtle import * # Подключаем модуль черепашку
left(90) # Изначально черепашку нужно повернуть по часовой стрелки на 90 градусов
M = 10 # Масштаб одной клетки
counter = 0 # Переменная для подсчёта количество точек
# Алгоритмы действий черепашки
for i in range(2): # Повтори 2 раза
forward(8 * M) # Вперёд на 8: (8 * 10) в 10 раз увеличиваем расстояние чтобы было видно фигуру
right(90) # Поворот направо на 90 градусов
forward(18 * M) # Вперёд на 20
right(90) # Направо 90
penup() # Поднять хвост
forward(4 * M) # Вперёд 4
right(90) # Направо 90
forward(10 * M) # Вперёд 10
left(90) # Налево 90
pendown() # Опустить хвост
for i in range(2): # Повтори 2 раза
forward(17 * M) # Вперёд на 17
right(90) # Поворот направо на 90 градусов
forward(7 * M) # Вперёд на 7
right(90) # Направо 90
penup() # Поднимаем перо(хвост у черепашки чтобы не рисовала) по умолчанию рисует
# Решим задачу на определение количества точек в области фигуры
for x in range(0, 19): # Условно двумя циклами обойдём получившийся прямоугольник
for y in range(0, 22): # Начинаем с 0 потому что нам нужны точки и на линиях пересечения фигур
goto(x * M, y * M)
# Условие попадания точки в область объединения двух фигур
if (x <= 18 and y <= 8) or ((10 <= x <= 17) and (4 <= y <= 21)): # Условие определяем после визуального построения черепашкой двух фигур
counter += 1 # Подсчитываем количество нарисованных точек
dot(5) # Рисуем точку
goto(70, 150) # Переходим по координате чтобы там вывести ответ
write(counter, align='right', move=True, font=("Arial", 14, "bold")) # Выводим ответ количество точек на экран
ht() # Скрываем курсор
done() # Должен быть последним оператором в программе графики черепахи
Результат работы программы:

Ответ: 275
Черепахе был дан для исполнения следующий алгоритм:
Повтори 9 [Вперёд 22 Направо 90 Вперёд 6 Направо 90]
Поднять хвост
Вперёд 1 Направо 90 Вперёд 5 Налево 90
Опустить хвост
Повтори 9 [Вперёд 53 Направо 90 Вперёд 75 Направо 90] \
Определите периметр области пересечения фигур, ограниченных заданными алгоритмом линиями.
from turtle import * # Подключаем модуль черепашку
left(90) # Изначально черепашку нужно повернуть по часовой стрелки на 90 градусов
M = 5 # Масштаб одной клетки
# Пропишем алгоритмы действий черепашки
for i in range(9): # Повтори 9 раз
forward(22 * M) # 22 * 5 - в 5 раз увеличили расстояние чтобы было лучше видно
right(90) # Поворот направо на 90 градусов
forward(6 * M) # Вперёд 6
right(90) # Поворот направо на 90 градусов
penup() # Поднять хвост
forward(1 * M) # Вперёд 1
right(90) # Направо 90
forward(5 * M) # Вперёд 5
left(90) # Налево 90
pendown() # Опустить хвост(перо)
for x in range(9): # Повтори 9 раз
forward(53 * M) # Вперёд 53
right(90) # Направо 90
forward(75 * M) # Вперёд 75
right(90) # Направо 90
penup() # Поднимаем перо(хвост у черепашки чтобы не рисовала) по умолчанию рисует
# Решим задачу на определение периметра области пересечения двух фигур
count = 0 # Переменная для подсчёта количество точек по периметру
for x in range(0, 8): # Условно двумя циклами обойдём получившийся прямоугольники прямоугольником 7 на 24
for y in range(0, 25): # Начинаем с 0 потому что нам нужны точки и на линиях фигур
# Условие проверки попадания точки на периметр области пересечения фигур
if x <= 1 and y <= 21: # Условие определил визуально после построение черепашкой двух фигур
goto(x * M, y * M) # Переходим по координатам
dot(4) # Рисуем точку
count += 1 # Подсчитываем количество нарисованных точек
goto(0, 0) # Переходим по координате чтобы там вывести ответ
write(count, align='right', move=True, font=("Arial", 14, "bold")) # Выводим ответ количество точек на экран
ht() # Скрываем курсор
done() # Должен быть последним оператором в программе графики черепах
Результат работы программы:

Ответ: 44
Описание исполнителя Черепаха есть в начале каждого задания, оно одинаковое.
Черепахе был дан для исполнения следующий алгоритм:
Повтори 2 [Вперёд 14 Налево 270 Назад 12 Направо 90]
Поднять хвост
Вперёд 9 Направо 90 Назад 7 Налево 90
Опустить хвост
Повтори 2 [Вперёд 13 Направо 90 Вперёд 6 Направо 90] \
Определите, сколько точек с целочисленными координатами находятся внутри объединения фигур, ограниченного заданными алгоритмом линиями, включая точки на линиях.
from turtle import * # Подключаем модуль черепашку
left(90) # Изначально черепашку нужно повернуть по часовой стрелки на 90 градусов
M = 10 # Масштаб одной клетки
# Пропишем алгоритмы действий черепашки
for i in range(2): # Повтори 2 раза
forward(14 * M) # Вперёд 14 * 10 - в 10 раз увеличили расстояние чтобы было лучше видно
left(270) # Поворот направо на 90 градусов
back(12 * M) # Назад 12
right(90) # Поворот направо на 90 градусов
penup() # Поднять хвост
forward(9 * M) # Вперёд 9
right(90) # Направо 90
back(7 * M) # Назад 7
left(90) # Налево 90
pendown() # Опустить хвост(перо)
for x in range(2): # Повтори 2 раза
forward(13 * M) # Вперёд 13
right(90) # Направо 90
forward(6 * M) # Вперёд 6
right(90) # Направо 90
penup() # Поднимаем перо(хвост у черепашки чтобы не рисовала) по умолчанию рисует
# Решим задачу на определение точек внутри объединения фигур
count = 0 # Переменная для подсчёта количество точек
for x in range(-12, 1, 1): # Условно двумя циклами обойдём получившийся прямоугольники прямоугольником 12 на 22
for y in range(0, 23): # Начинаем с 0 и -12 потому что нам нужны точки и на линиях фигур
flag = False # с помощью булевой переменной контролируем попала ли точка в первый прямоугольник
if x >= -12 and y <= 14: # Условие проверки попадания точки в первый прямоугольник
goto(x * M, y * M) # Переходим по координатам
dot(5) # Рисуем точку
count += 1 # Подсчитываем количество нарисованных точек
flag = True # меняем с False на True
if (x >= -7 and x <= -1) and (y >= 9 and y <= 22): # Условие проверки попадания точки во второй прямоугольник
if not flag: # если точка не попадала до этого в первый прямоугольник(т.к. они пересекаются)
goto(x * M, y * M) # Переходим по координатам
dot(5) # Рисуем точку
count += 1 # Подсчитываем количество нарисованных точек
goto(50, 200) # Переходим по координате чтобы там вывести ответ
write(count, align='right', move=True, font=("Arial", 14, "bold")) # Выводим ответ количество точек на экран
ht() # Скрываем курсор
done() # Должен быть последним оператором в программе графики черепах
Ответ: 251
Результат работы программы:

P.S. Программа на Кумире(после выполнения считаем точки сами):
использовать Черепаха
алг
нач
опустить хвост
нц 2 раз
вперед(14)
влево(270)
назад(12)
вправо(90)
кц
поднять хвост
вперед(9)
вправо(90)
назад(7)
влево(90)
опустить хвост
нц 2 раз
вперед(13)
вправо(90)
вперед(6)
вправо(90)
кц
кон
Попробуйте сами запустить код в окне ниже с интерпретатором Python и повторите примеры из статьи чтобы самим увидеть и понять как всё это работает. Для этого в ячейке с кодом нажмите клавиши на клавиатуре Shift+Enter или запустите код через кнопку Run по значку ▶.