DALL·E 2024 11 29 12.22.11 A robotic turtle crawling on the sandy beach of a tropical island towards the ocean. The turtle has a sleek futuristic design with metallic and mecha

Задание 6 ЕГЭ по информатике нацелено на определение результатов работы простейших алгоритмов управления исполнителями. Само по себе задание, с точки зрения программирование достаточно простое. От вас, как от программистов, здесь требуется просто переписать представленный в условии алгоритм и построить по нему фигуры.

Но трудности могут возникнуть со второй частью этого задания, где требуется провести некоторый анализ построенных фигур. Для получения верного ответа необходимо помнить базовые геометрические термины, а также внимательно подсчитывать необходимые значения на изображении.

До 2024 года подходов к решению задания 6 было три:

  1. Использование исполнителя Черепаха в среде Кумир
  2. Использование графического модуля turtle на языке программирования Python
  3. Использование аналитического метода решения

В настоящее время среда Кумир уже не является обязательной к наличию на компьютерах при проведении ЕГЭ по информатике. А аналитический метод порой требует более значительных знаний по геометрии, а также при использовании такого подхода легче ошибиться в расчётах.

Мы же остановимся на визуализации работы алгоритмов, предложенных в задании 6, с помощью модуля turtle в Python. Это более наглядный метод, а сам по себе программный код для решения этого задания является типовым. Даже если вы забудете какую-то его часть, то всегда сможете самостоятельно дойти реализации тех же подходов, просто используя документацию к данному модулю (она доступна по умолчанию при использовании языка Python).

Формулировки

Условие задания 6 ЕГЭ по информатике обычно начинается с описания команд исполнителя и базовой информации о записи циклов с примером алгоритма.

Далее идет непосредственно тот алгоритм, который вам необходимо реализовать. Напомним, что фраза «Повтори k» означает, что вам необходимо запустить цикл for с k итерациями. После команды «Вперёд» идет расстояние в пикселях, в после команд поворотов «Направо» и «Налево» идёт угол поворота в градусах. Фразы «Поднять хвост» и «Опустить хвост», соответственно, означают начало отрисовки линии (поднять перо) и конец отрисовки (опустить перо).

И после определения алгоритма как раз и идут те формулировки, которые определяют, что именно вам необходимо дать в ответ. Рассмотрим их подробнее.

Пересечение и объединение фигур

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

На поле есть две фигуры:

  1. Оранжевый прямоугольник с номером 1
  2. Зелёный прямоугольник с номером 2
Задание 6 1

Теперь давайте сдвинем каждую фигуру на одну клетку в центр. Получим теперь, условно, три фигуры: часть первой, часть второй и третья фигура, которая является «наложением» первых двух.

Задание 6 2

Этот третий прямоугольник и будет являться пересечением фигур 1 и 2. Таким образом, пересечение двух прямоугольников — это часть плоскости, которая принадлежит одновременно обоим прямоугольникам.

Задание 6 3

Здесь не зря сделан акцент на слово «одновременно». Ключевую роль это сыграет при определении объединения фигур.

Объединением двух фигур называется фигура, состоящая из всех точек двух фигур. То есть все фигуры вместе — 1, 2 и 3 — дают нам объединение фигур 1 и 2.

Задание 6 4

А теперь давайте рассмотрим ту же самую картину, но не с позиции фигур на ней, а с позиции точек, принадлежащих этим фигурам.

Задание 6 5 1

С пересечением все просто: мы видим некую область, которая принадлежит обеим фигурам (жёлтая). Подсчитать, сколько точек принадлежит пересечению несложно, здесь получим 9 точек.

Куда интереснее ситуация обстоит с объединением фигур.

До момента пересечения, у каждой из фигур было по 20 точек (5 на длине и 4 на ширине прямоугольника). Но после пересечения у каждой из фигур осталось по 11 точек. А вместо 18 точек, которые принадлежали раньше обоим фигурам (по 9 у каждой) теперь осталось только 9, которые принадлежат пересечению фигур.

Этот момент крайне важно осознать. В реальных заданиях 6 могут быть достаточно большие фигуры, а подсчёт точек вручную — процесс довольно муторный. Проще будет перемножить количество точек на сторонах (длине и ширине) каждого прямоугольника, получив тем самым общее количество точек, принадлежащих этой фигуре.

Для подсчёта количества точек объединения фигур мы не можем просто сложить количество точек каждой их этих фигур. Ведь мы помним, что у нас есть еще общие точки на пересечении. Следовательно, необходимо из суммы количества точек этих фигур вычесть количество точек их пересечения.

Давайте подсчитаем здесь количество точек объединения:

5 · 4 + 5 · 4 – 3 · 3 = 20 + 20 – 9 = 31.

Теперь вернёмся к различным формулировкам задания 6.

Точки внутри пересечения

Одна из формулировок задания 6 звучит следующим образом:

«Определите, сколько точек с целочисленными координатами будут находиться внутри области пересечения фигур, ограниченных заданными алгоритмом линиями, включая точки на границах этого пересечения.»

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

Можно это сделать как вручную, так и с помощью формул из геометрии для соответствующих фигур.

Сложнее тут обстоят дела с формулировкой, когда необходимо найти количество точек внутри пересечении, не включая точки на линии.

Задание 6 6

Например, на данном изображении всего одна точка внутри пересечения фигур, которая не лежит на линии (отмечена синим).

Рассмотрим другую фигуру: здесь у нас зелёный прямоугольник, у которого 7 точек на одной стороне и 5 на другой. Необходимо найти все точки, которые не лежат на линии. Можем сразу посчитать количество «внутренних» точек — умножим 5 на 3.

Задание 6 7

Точки внутри объединения

Ряд заданий 6 предполагает нахождение точек внутри объединения.

Например, можно встретить такую формулировку:

«Определите, сколько точек с целочисленными координатами будут находиться внутри объединения фигур, ограниченных заданными алгоритмом линиями, включая точки на границах этого объединения.»

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

Формулировки данного типа, где необходимо находить точки внутри объединения, обычно не предусматривают исключение точек на линиях из ответа. То есть в данном типа заданий вы не встретите формулировку из разряда «не включая точки на границах этого объединения».

Площадь и периметр фигуры

Ранее мы рассматривали типы задания 6, где работа велась только с точками фигур. Но есть формулировки этого задания, где необходимо найти площадь или периметр фигур, находящихся на пересечении или объединении исходных фигур.

Рассмотрим следующую формулировку:

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

Для заданий такого типа нам важнее видеть не точки поверх фигуры, а отрезки между этими точками. Этот момент найдет своё отражение в коде, что мы и рассмотрим позднее. На изображениях же мы заменим цвет точек на белый, идентичный цвету фона, что позволит проще различать отрезки между точками.

Задание 6 9

Разберем тот же самый прямоугольник, у которого 7 точек на одной стороне и 5 на другой. Только теперь нам важны уже не точки, а отрезки между ними.

Следовательно, отрезков у нас 6 и 4. Значит и длины сторон у нас тоже 6 и 4 единиц. Тогда площадь найдем перемножив длину одной стороны на длину другой: 6 · 4 = 24. Периметр находим сложив длины всех стороны: 6 + 4 + 6 + 4 = 20.

Примеры решений

Прежде чем перейдём к решению конкретных примеров, давайте рассмотрим базовые подходы, которые будут присутствовать в каждом решении.

Начнем с кода. Импортировать будем сразу все функции из модуля turtle такой конструкцией:

from turtle import *

Теперь поговорим о базовой настройке отображения окна с графикой. Для начала, отключим анимацию отрисовки командой tracer(0).

Далее нам необходимо ввести переменную, отвечающую за масштаб изображения. Её значение нужно будет подбирать вручную, ведь для каждого задания необходим разный масштаб. Можете установить её на значение 20, запустить весь код и проверить, насколько хорошо отображаются все необходимые фигуры.

От масштаба будут зависеть и остальные параметры отображения. Например, мы будем менять размер пера (pensize()) и размер окна (screensize()) для лучшего отображения на выбранном масштабе. Также в зависимости от масштаба будем менять значения для переменной размера точек, которые будем расставлять поверх фигур и цвета этих точек.

Когда мы ищем площадь или периметр, цвет точек выбираем белым, а размер побольше. Когда ищем количество точек, цвет выбираем более контрастным (например, тёмно-красный), размер точек выставляем примерно равным размеру линии.

Полный код базовой настройки черепахи с комментариями представлен ниже. Имена для переменных scale, dot_size, dot_color можете выбрать любые.

# Базовая настройка
tracer(0) # Отключаем анимацию
pensize(3) # Размер пера
screensize(2000,2000) # Размер окна

scale = 20 # Масштаб
dot_size = 15 # Размер точек
dot_color = "white" # Цвет точек

lt(90) # Поворот по положительному направлению оси ординат

Для отрисовки точек будем использовать два цикла for. Значения внутри функции range() подобраются вручную так, чтобы точки покрывали всю необходимую площадь.

# Точки
for x in range(0,50):
    for y in range(0,50):
        goto(x * scale, y * scale)
        dot(dot_size,dot_color)

В конце вызываем функцию done(), чтобы предотвратить закрытие окна после завершения работы черепахи.

Подробно работу с модулем turtle мы рассматривали здесь.

Пример 1

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

«Черепахе был дан для исполнения следующий алгоритм:

Повтори 8 [Вперёд 16 Направо 90 Вперёд 22 Направо 90]
Поднять хвост
Вперёд 5 Направо 90 Вперёд 5 Налево 90
Опустить хвост
Повтори 8 [Вперёд 52 Направо 90 Вперёд 77 Направо 90]

Определите площадь области пересечения фигур, ограниченных заданными алгоритмом линиями. В ответе укажите только число. Единицу измерения указывать не нужно»

Здесь будем работать с единичными отрезками на границах фигур. Следовательно, размер точек ставим больше, а цвет их заменяем на белый.

Размер фигур здесь отличается более чем в 3 раза, при этом перемещение без рисования, которое и обеспечивает нам область пересечения, происходит всего на 5 единиц. Логично предположить, что в данном задании можем сконцентрироваться на первой фигуре и пересечении, ведь вторая фигура просто не влезет в экран при достаточном масштабе для первой.

Размер экрана поставим стандартным в наших задачах — 2500 по горизонтали и вертикали. Масштаб оставим порядка 30. Размер точек будет 14, а их цвет — белый.

Первая фигура чертится по такому алгоритму:

Повтори 8 [Вперёд 16 Направо 90 Вперёд 22 Направо 90]

В Python это эквивалентно циклу по диапазону значений до 8 и четырём командам внутри цикла:

for i in range(8):
    fd(16 * scale)
    rt(90)
    fd(22 * scale)
    rt(90)

За 8 итераций цикла мы начертим прямоугольник со сторонами 16 и 22. После выхода их цикла Черепаха окажется в начале координат, голова будет смотреть «вверх». Далее идет смещение на 5 единиц в положительном направлении оси OY и столько же в положительном направлении OX:

Вперёд 5 Направо 90 Вперёд 5 Налево 90

В Python это перемещение записывается так:

pu()
fd(5 * scale)
rt(90)
fd(5 * scale)
lt(90)
pd()

Следом идет алгоритм для второй фигуры — прямоугольника со сторонами 52 и 77:

Повтори 8 [Вперёд 52 Направо 90 Вперёд 77 Направо 90]

В программе это выглядит аналогично первой фигуре, за исключением значений у функций fd():

for i in range(8):
    fd(52 * scale)
    rt(90)
    fd(77 * scale)
    rt(90)

В конце программы расставим точки. Поскольку они у нас белые, то может расставлять в диапазоне от -50 до 50 единиц по обеим осям, они мешать не будут.

pu()
for x in range(-50, 50):
    for y in range(-50, 50):
        goto(x * scale, y * scale)
        dot(dot_size, dot_color)

Работая в PyCharm не забываем про функцию done().

Полный код для данного задания следующий:

from turtle import *

# Базовая настройка
tracer(0)  # Отключаем анимацию
pensize(6)  # Размер пера
screensize(2500, 2500)  # Размер окна

scale = 30  # Масштаб
dot_size = 14  # Размер точек
dot_color = "white"  # Цвет точек

lt(90)  # Поворот по положительному направлению оси ординат

color("#A7D380")  # Цвет границ первой фигуры

# Первая фигура
for i in range(8):
    fd(16 * scale)
    rt(90)
    fd(22 * scale)
    rt(90)

# Перемещение
pu()
fd(5 * scale)
rt(90)
fd(5 * scale)
lt(90)
pd()

color("#F76D47")  # Цвет границ второй фигуры

# Вторая фигура
for i in range(8):
    fd(52 * scale)
    rt(90)
    fd(77 * scale)
    rt(90)

# Точки
pu()
for x in range(-50, 50):
    for y in range(-50, 50):
        goto(x * scale, y * scale)
        dot(dot_size, dot_color)

done()

В итоге получаем такое пересечение двух прямоугольников.

Задание 6 10

Отметим известные нам стороны первой фигуры: 16 и 22.

Задание 6 11

Также помним, что смещение было ровно на 5 единиц по обеим осям.

Задание 6 12

Поскольку левый верхний угол прямоугольника на пересечении (жёлтого) соответствует такому же углу зелёного прямоугольника, то легко вычислить его стороны. Для этого достаточно отнять 5 от длины и ширины зелёного прямоугольника.

В итоге получаем, что стороны пересечения фигур равны 11 и 17.

Задание 6 13

Для вычисления площади достаточно просто перемножить эти два числа. В итоге получаем ответ 187.

Пример 2

Условие следующее:

«Черепахе был дан для исполнения следующий алгоритм:

Повтори 9 [Вперёд 22 Направо 90 Вперед 6 Направо 90]
Поднять хвост
Вперед 1 Направо 90 Вперёд 5 Налево 90
Опустить хвост
Повтори 9 [Вперёд 53 Направо 90 Вперёд 75 Направо 90]

Определите периметр области пересечения фигур, ограниченных заданными алгоритмом линиями»

Давайте проанализируем предложенный алгоритм. Первая фигура строится следующими командами:

Повтори 9 [Вперёд 22 Направо 90 Вперед 6 Направо 90]

В Python это будет такой блок кода:

for i in range(9):
    fd(22 * scale)
    rt(90)
    fd(6 * scale)
    rt(90)

За одну итерацию цикла Черепаха построит одну половину прямоугольника со сторонами 22 и 6.

Задание 6 14

После выполнения цикла черепаха окажется в левом верхнем углу только что построенного прямоугольника, при этом голова у неё будет повёрнута «вниз».

Далее идет перемещение вперёд и влево (относительно нас) такой командой:

Вперед 1 Направо 90 Вперёд 5 Налево 90

pu()
fd(1 * scale)
rt(90)
fd(5 * scale)
lt(90)
pd()
Задание 6 15

И с этого момента начнётся построение большого прямоугольника со сторонами 53 и 75.

Повтори 9 [Вперёд 53 Направо 90 Вперёд 75 Направо 90]

for i in range(9):
    fd(53 * scale)
    rt(90)
    fd(75 * scale)
    rt(90)

Учитывая, что второй командой стоит поворот направо, а Черепаха повёрнута на момент начала цикла головой «вниз», то вторая фигура будет строиться слева от первой.

Уже можно сказать, что пересечение здесь будет в виде прямоугольника со сторонами 1 (на столько Черепаха сдвинута относительно левой границы первой фигуры) и 22 (на 1 меньше, чем длина первого прямоугольника).

Но давайте достроим обе фигуры, расставим точки и убедимся в наших вычислениях.

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

from turtle import *

# Базовая настройка
tracer(0) # Отключаем анимацию
pensize(6) # Размер пера
screensize(2500,2500) # Размер окна

scale = 30 # Масштаб
dot_size = 14 # Размер точек
dot_color = "white" # Цвет точек

lt(90)  # Поворот по положительному направлению оси ординат

color("#A7D380")  # Цвет границ первой фигуры

# Первая фигура
for i in range(9):
    fd(22 * scale)
    rt(90)
    fd(6 * scale)
    rt(90)

# Перемещение
pu()
fd(1 * scale)
rt(90)
fd(5 * scale)
lt(90)
pd()
update()
color("#F76D47")  # Цвет границ второй фигуры

# Вторая фигура
for i in range(9):
    fd(53 * scale)
    rt(90)
    fd(75 * scale)
    rt(90)

# Точки
pu()
for x in range(-50, 50):
    for y in range(-50, 50):
        goto(x * scale, y * scale)
        dot(dot_size, dot_color)

done()

Получаем такое изображение и убеждаемся в истинности наших суждений.

Задание 6 16

Осталось лишь высчитать периметр прямоугольника со сторонами 21 и 1. В ответ пишем число 44.

Пример 3

Условие задания:

«Черепахе был дан для исполнения следующий алгоритм:

Повтори 3 [Вперёд 7 Направо 90 Вперёд 12 Направо 90]
Поднять хвост
Вперёд 4 Направо 90 Вперёд 6 Налево 90
Опустить хвост
Повтори 4 [Вперёд 83 Направо 90 Вперёд 77 Направо 90]

Определите, сколько точек с целочисленными координатами будут находиться внутри объединения фигур, ограниченных заданными алгоритмом линиями, включая точки на границах этого объединения»

Здесь уже не будем подробно останавливаться на разборе алгоритма. Программа будет практически аналогична тем, что были представлены в предыдущих примерах. Разве что теперь будем работать с точками, а не с отрезками на границах фигур.

В таком случае, точки отметим не белым (цветом фона), а более контрастным, например, серым (в формате hex: #696969). И размер точек сделаем поменьше, чтобы сильно не перегружать изображение.

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

from turtle import *

# Базовая настройка
tracer(0)  # Отключаем анимацию
pensize(6)  # Размер пера
screensize(2500, 2500)  # Размер окна

scale = 50  # Масштаб
dot_size = 5  # Размер точек
dot_color = "#696969"  # Цвет точек

lt(90)  # Поворот по положительному направлению оси ординат

color("#A7D380")  # Цвет границ первой фигуры

# Первая фигура
for i in range(3):
    fd(7 * scale)
    rt(90)
    fd(12 * scale)
    rt(90)

# Перемещение
up()
fd(4 * scale)
rt(90)
fd(6 * scale)
lt(90)
down()

color("#F76D47")  # Цвет границ второй фигуры

# Вторая фигура
for i in range(9):
    fd(83 * scale)
    rt(90)
    fd(77 * scale)
    rt(90)

# Точки
up()
for x in range(0, 13):
    for y in range(0, 8):
        goto(x * scale, y * scale)
        dot(dot_size, dot_color)

done()

Результатом работы нашей программы станет такое изображение.

Задание 6 17

Для начала отметим стороны первой фигуры. Вспомним, что первая фигура задаётся алгоритмом:

Повтори 3 [Вперёд 7 Направо 90 Вперёд 12 Направо 90]

Следовательно, стороны у неё будут 7 и 12. Но количество точек, включая точки на границах фигуры, будет ровно на 1 больше — 8 и 12.

Задание 6 18

Аналогично можем поступить и со второй фигурой. Здесь количество точек будет 84 и 78.

Задание 6 18 1

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

Вперёд 4 Направо 90 Вперёд 6 Налево 90

Здесь, как и в прошлом примере, количество повторений цикла, в котором строится первая фигура нечётное. Следовательно, Черепаха закончить строить её в левом верхнем углу.

Смещение идёт на 4 единицы «вниз» и на 6 «влево» (относительно нас). Следовательно, левый верхний край второй фигуры сдвинут относительно такого же края первой фигуры на 4 единицы в отрицательном направлении оси OY и на 6 в отрицательном направлении оси OX.

Отсюда вычисляем количество точек по сторонам пересечения: 13 – 6 и 8 – 4, то есть 7 и 4, соответственно.

Задание 6 19

Для вычисления количество точек на объединении фигуры мы складываем количество точек первой и второй фигур и отнимаем от этой суммы количество точек на пересечении.

Количество точек первой фигуры: 13 ∙ 8 = 104

Количество точек второй фигуры: 84 ∙ 78 = 6552

Количество точек на пересечении: 7 ∙ 4 = 28

Количество точек внутри объединения: 6552+ 104 – 28= 6628.

Число 6628 и будет ответом на данное задание.

Больше заданий данного типа с подробным решением вы можете найти в нашем тренажёре