В прошлой статье мы научились работать с функциями Черепахи из модуля turtle, разобрались с пересечением и объединением фигур и опробовали алгоритм решения задания 6 первого типа.
В этой статье продолжим работу с заданием, но уделим внимание второму типу: будем находить площадь и периметр областей пересечения и объединения.
Не будем затягивать и сразу приступим к практике!
Алгоритм решения
Изменения в коде будут минимальными. Главное – задать точкам цвет, обычно белый, и увеличить их размер. Первый блок решения может выглядеть так:
from turtle import *
tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12
lt(90) # Не обязательно
По сравнению с кодом из прошлой статьи здесь изменены значения только двух переменных: dot_color и dot_size.
Для расстановки точек необязательно точно подбирать диапазоны. Можно взять область с запасом, например от −50 до 50. Но чем меньше лишних координат перебирает программа, тем быстрее строится рисунок.
В остальном же код остаётся прежним. Давайте опробуем его на задании с такой формулировкой (как и в прошлый раз, ограничимся лишь алгоритмом черепахи и условием):
Исполнитель Черепаха действует на плоскости с декартовой системой координат.
В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен.
При опущенном хвосте Черепаха оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя и направление его движения.
У исполнителя существует 6 команд: Поднять хвост, означающая переход к перемещению без рисования; Опустить хвост, означающая переход в режим рисования; Вперёд n (где n — целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова; Назад n (где n — целое число), вызывающая перемещение в противоположном голове направлении; Направо m (где m — целое число), вызывающая изменение направления движения на m градусов по часовой стрелке; Налево m (где m — целое число), вызывающая изменение направления движения на m градусов против часовой стрелки.
Запись Повтори k [Команда 1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.
Черепахе был дан для исполнения следующий алгоритм:
К этим трём блокам кода добавляем блоки с базовой настройкой и размещением точек. В итоге наша программа приобретает такой вид:
from turtle import *
tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12
lt(90) # Не обязательно
color("#A7D380")
# Повтори 9
for _ in range(9):
fd(17 * scale) # Вперёд 17
lt(90) # Налево 90
fd(8 * scale) # Вперёд 8
lt(90) # Налево 90
fd(17 * scale) # Вперёд 17
pu() # Поднять хвост
lt(90) # Налево 90
fd(3 * scale) # Вперёд 3
rt(90) # Направо 90
fd(5 * scale) # Вперёд 5
lt(90) # Налево 90
pd() # Опустить хвост
color("#F76D47")
# Повтори 4
for _ in range(4):
fd(97 * scale) # Вперёд 97
rt(90) # Направо 90
fd(132 * scale) # Вперёд 132
rt(90) # Направо 90
pu() # Поднять хвост
for x in range(-5, 1):
for y in range(-17, -4):
goto(x * scale, y * scale) # Переместиться к x, y
dot(dot_size, dot_color) # Поставить точку
done()
Запустим её и увидим такое изображение на экране.
Прямоугольник с двумя пунктирными зелёными и оранжевыми сторонами – как раз та область, периметр которой нужно вычислить. Отрезков немного, поэтому посчитаем вручную.
Ширина этого прямоугольника равна 5 единичным отрезкам, а длина – 12. Складываем все стороны: 5 + 5 + 12 + 12. И получаем ответ на это задание: 34.
Пример 1
Только что мы работали с периметром пересечения. Но порой требуется найти и периметр объединения нескольких фигур. Правда, в таких случаях формулировка звучит несколько иначе:
Исполнитель Черепаха действует на плоскости с декартовой системой координат.
В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен.
При опущенном хвосте Черепаха оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя и направление его движения.
У исполнителя существует 6 команд: Поднять хвост, означающая переход к перемещению без рисования; Опустить хвост, означающая переход в режим рисования; Вперёд n (где n — целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова; Назад n (где n — целое число), вызывающая перемещение в противоположном голове направлении; Направо m (где m — целое число), вызывающая изменение направления движения на m градусов по часовой стрелке; Налево m (где m — целое число), вызывающая изменение направления движения на m градусов против часовой стрелки.
Запись Повтори k [Команда 1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.
Черепахе был дан для исполнения следующий алгоритм:
Определите в сантиметрах длину замкнутой ломаной, которая является границей объединения фигур, очерченных заданными алгоритмом линиями. В ответе укажите только число. Единицы измерения указывать не нужно.
Не переживайте, в алгоритме Черепахи нет опечаток. Он действительно задаёт одну сложную фигуру – объединение трёх квадратов. Главное – правильно определить, какие команды входят во внешний, а какие во вложенный цикл.
Давайте построчно перепишем алгоритм. Фраза «Повтори 3» на Python переводится как for _ in range(3):. Затем следует команда «Опустить хвост», то есть pd().
Ну а второй цикл уже привычный: Повтори 2 [Вперёд 10 Направо 90 Вперёд 10 Направо 90]. Запишем его так:
Допишем в начало код базовой настройки, а в конец блок кода с расстановкой точек и получим такую программу:
from turtle import *
tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12
lt(90) # Не обязательно
color("#A7D380") # Цвет границ
# Повтори 3
for _ in range(3):
pd() # Опустить хвост
# Повтори 2
for _ in range(2):
fd(10 * scale) # Вперёд 10
rt(90) # Направо 90
fd(10 * scale) # Вперёд 10
rt(90) # Направо 90
pu() # Поднять хвост
fd(5 * scale) # Вперёд 5
rt(90) # Направо 90
fd(5 * scale) # Вперёд 5
lt(90) # Налево 90
pu() # Поднять хвост
for x in range(0, 21):
for y in range(0, 21):
goto(x * scale, y * scale) # Переместиться к x, y
dot(dot_size, dot_color) # Поставить точку
done()
Прежде чем запускать программу, подумаем, что увидим на экране. Внешний цикл повторяется три раза, поэтому Черепаха построит три квадрата и объединит их в одну сложную фигуру.
Во вложенном цикле Черепаха проходит две соседние стороны квадрата по 10 единиц. Цикл повторяется дважды, поэтому в итоге получается целый квадрат со стороной 10.
Затем Черепаха поднимает хвост и смещается на 5 единиц вверх и на 5 вправо – точно в центр только что начерченного квадрата.
И далее снова повторяется отрисовка квадрата и переход к его центру. Значит, на экране у нас будет три квадрата, каждый из которых начинается из центра предыдущего.
Запустим код и убедимся в этом.
Отлично, всё получилось так, как мы предполагали. Нам нужно найти длину замкнутой ломаной – внешней границы объединения трёх квадратов. Давайте выделим её цветом
Сторона каждого квадрата равна 10. Новый квадрат начинается в центре предыдущего, поэтому восемь коротких участков внешней границы имеют длину 5 – половину стороны квадрата.
Отметим все числа на рисунке (длины маленьких сторон на углах отметим по одному разу).
Остаётся сложить длины всех участков по часовой стрелке: 10 + 5 + 5 + 5 + 5 + 10 + 10 + 5 + 5 + 5 + 5 + 10 = 80. Это число и запишем в ответ.
Пример 2
Теперь поработаем с площадью фигур. Начнём с такой формулировки:
Исполнитель Черепаха действует на плоскости с декартовой системой координат.
В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен.
При опущенном хвосте Черепаха оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя и направление его движения.
У исполнителя существует 6 команд: Поднять хвост, означающая переход к перемещению без рисования; Опустить хвост, означающая переход в режим рисования; Вперёд n (где n — целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова; Назад n (где n — целое число), вызывающая перемещение в противоположном голове направлении; Направо m (где m — целое число), вызывающая изменение направления движения на m градусов по часовой стрелке; Налево m (где m — целое число), вызывающая изменение направления движения на m градусов против часовой стрелки.
Запись Повтори k [Команда 1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.
Черепахе был дан для исполнения следующий алгоритм:
Имея опыт решения задания 6, можем сразу сказать, что будут построены два прямоугольника. Второй, более крупный, смещён относительно первого на 2 и 8 единиц.
Давайте допишем программу полностью и запустим её.
from turtle import *
tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12
lt(90) # Не обязательно
color("#A7D380")
# Повтори 4
for _ in range(4):
fd(19 * scale) # Вперёд 19
rt(90) # Направо 90
fd(30 * scale) # Вперёд 30
rt(90) # Направо 90
# Перемещение
pu()
fd(2 * scale) # Вперёд 2
rt(90) # Направо 90
fd(8 * scale) # Вперёд 8
lt(90) # Налево 90
pd()
color("#F76D47")
# Повтори 4
for _ in range(4):
fd(93 * scale) # Вперёд 93
rt(90) # Направо 90
fd(97 * scale) # Вперёд 97
rt(90) # Направо 90
pu() # Поднять хвост
for x in range(0, 31):
for y in range(0, 20):
goto(x * scale, y * scale) # Переместиться к x, y
dot(dot_size, dot_color) # Поставить точку
done()
В итоге имеем такое пересечение двух прямоугольников.
Отметим жёлтым цветом интересующую нас область.
Нужно вычислить длину и ширину этой области. Исходим из размеров первой, зелёной, фигуры. Она задаётся командами Вперёд 19 и Вперёд 30, поэтому её стороны равны 19 и 30.
Теперь определим смещение второй фигуры по движению Черепахи с поднятым хвостом: Вперёд 2 Направо 90 Вперёд 8 Налево 90. Получаем смещения на 2 и 8 единиц. Отметим их на рисунке.
Теперь будет несложно подсчитать размеры сторон пересечения: от 30 отнимаем 8 и от 19 отнимаем 2. Получается, что длина пересечения равна 22, а ширина – 17.
Для вычисления площади осталось перемножить эти числа: 22 × 17 = 374. Это и есть ответ.
Пример 3
В заключение решим задание на площадь объединения фигур:
Исполнитель Черепаха действует на плоскости с декартовой системой координат.
В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен.
При опущенном хвосте Черепаха оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя и направление его движения.
У исполнителя существует 6 команд: Поднять хвост, означающая переход к перемещению без рисования; Опустить хвост, означающая переход в режим рисования; Вперёд n (где n — целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова; Назад n (где n — целое число), вызывающая перемещение в противоположном голове направлении; Направо m (где m — целое число), вызывающая изменение направления движения на m градусов по часовой стрелке; Налево m (где m — целое число), вызывающая изменение направления движения на m градусов против часовой стрелки.
Запись Повтори k [Команда 1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.
Черепахе был дан для исполнения следующий алгоритм:
Дополним программу базовой настройкой, цветом каждой фигуры и расстановкой точек:
from turtle import *
tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12
lt(90) # Не обязательно
color("#A7D380")
# Повтори 3
for _ in range(3):
fd(39 * scale) # Вперёд 39
rt(90) # Направо 90
fd(48 * scale) # Вперёд 48
rt(90) # Направо 90
# Перемещение
pu()
fd(27 * scale) # Вперёд 27
rt(90) # Направо 90
fd(24 * scale) # Вперёд 24
lt(90) # Налево 90
pd()
color("#F76D47")
# Повтори 3
for _ in range(3):
fd(29 * scale) # Вперёд 29
rt(90) # Направо 90
bk(18 * scale) # Назад 18
rt(90) # Направо 90
pu() # Поднять хвост
for x in range(0, 50):
for y in range(-20, 50):
goto(x * scale, y * scale) # Переместиться к x, y
dot(dot_size, dot_color) # Поставить точку
done()
Проверим результат работы программы.
Здесь расположение фигур сложнее, поэтому разберём движение Черепахи по этапам.
Изначально она находилась в точке с координатами (0, 0), а её голова была направлена «вверх». Первым делом выполняются команды: Вперёд 39 Направо 90 Вперёд 48 Направо 90. То есть черепаха рисует две стороны прямоугольника с длинами 39 и 48 единиц.
Далее снова выполняются всё те же команды и прямоугольник дорисовывается полностью.
А на третьей итерации цикла for черепаха перемещается в правый верхний угол фигуры и поворачивается головой «вниз».
Далее идёт перемещение с поднятым хвостом вперёд на 27 единиц.
После этого Черепаха поворачивает налево и смещается ещё на 24 единицы.
Повернувшись направо на 90 градусов, она приступает ко второй фигуре. Нам важно, что одна сторона пересечения совпадает со стороной второй фигуры и имеет длину 18.
Осталось лишь найти вторую сторону пересечения. На изображении она отмечена синим цветом.
Найти её несложно: из меньшей стороны первой фигуры, равной 39, вычитаем первое перемещение Черепахи с поднятым хвостом, равное 27.
В итоге получим, что длина искомой стороны пересечения равна 12.
Теперь найдём площадьобъединения. Складываем площади обеих фигур и вычитаем площадь пересечения, чтобы не учитывать её дважды: 39 × 48 + 29 × 18 − 18 × 12 = 2178.
Ответ: 2178.
На этом мы закончили разбор алгоритма решения 6 заданий ЕГЭ по информатике. А попрактиковаться в решении заданий данного типа вы можете в нашем тренажёре.
Разберём эту тему на бесплатном пробном занятии
Преподаватель покажет, как решать такие задачи, и подскажет, с чего начать подготовку. Группы до 8 человек, очно в Калининграде и онлайн.
Мы используем файлы cookie. Необходимые обеспечивают работу сайта: корзину и вход в личный кабинет. С вашего согласия мы также используем сервис Яндекс Метрика, чтобы анализировать посещаемость и улучшать сайт.
Подробнее — в политике конфиденциальности.