Главная › ЕГЭ по информатике › Задание 10
ЕГЭ по информатике · задание №10

Задание 10: решаем IP-адреса и маски кодом

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

Пишем решение вместе

Научись выполнять задание 10 своим кодом

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

Построй сеть NETWORK. Найди её наибольший адрес компьютера и выведи сумму его октетов.

1. Построить сеть по IP узла

Импортируй ip_network и создай ip_net с strict=False.

У исходного IP узловые биты не нулевые. Strict=False находит сеть, содержащую узел.

Строки этого шага и порядок действий

from ipaddress import ip_network
ip_net = ip_network(NETWORK, strict=False)
Дано для запуска

Эти переменные уже доступны в редакторе. Используй их в решении.

Tab — 4 пробела для отступа · Ctrl+Enter — проверка · код сохраняется в этом браузере

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

Вывод программы

Здесь появится вывод print.

Значения после выполнения

Запусти код, чтобы увидеть значения.

Скачать все учебные программы и условия этого задания

Видеоразбор

Видео по заданию №10

Видео скоро выйдет.

Шпаргалка, дополнительные разборы и упражнения
Два типа из шпаргалки

Задание 10 ЕГЭ: сначала пойми, что требуется от IP-адресов

В одном типе нужно выбрать конкретный адрес из сети. В другом — перебрать адреса и посчитать подходящие по двоичному условию. Для обоих используем стандартный модуль ipaddress; устанавливать его отдельно не нужно.

Что спрашиваютОсновное действиеКакой ответ
Наибольший адрес компьютераПостроить сеть, взять ip_net[-2]IP или сумма его октетов — прочитай последнюю фразу.
Адрес сети / broadcastВзять ip_net[0] / ip_net[-1]Нужный адрес диапазона.
Сколько адресов удовлетворяют условиюЦикл по нужному диапазону и count += 1Количество, а не один IP.

Индексы компьютеров здесь разбираем для обычных IPv4-подсетей, как в шпаргалке: крайние адреса заняты сетью и broadcast. Особенности /31 и /32 не нужны для этих примеров; о них есть пояснение в конце.

От IP узла к объекту сети

ip_network: что передать и зачем strict=False

from ipaddress import ip_network

ip_net = ip_network('68.203.243.87/255.255.224.0', strict=False)

В кавычках одна строка: IP, косая черта, маска. Мы передали IP узла, у которого узловые биты могут быть ненулевыми. strict=False позволяет построить содержащую его сеть. Это та же настройка, что второй аргумент 0 в шпаргалке: ip_network('...', 0).

Не путай две косые черты: внутри строки IP/маска разделяет адрес и маску. Никакого деления Python эта часть строки не выполняет. Маску можно также записать длиной префикса: /19 соответствует 255.255.224.0, /21 — 255.255.248.0.

Нужный адресИндексДля примера из шпаргалки
Адрес сетиip_net[0]68.203.224.0
Первый компьютерip_net[1]68.203.224.1
Последний компьютерip_net[-2]68.203.255.254
Broadcastip_net[-1]68.203.255.255
Отрицательный индекс считается с конца диапазона−1 — последний адрес; −2 — предпоследний. Для максимального адреса компьютера в этом примере нужен именно −2.
Почему сеть начинается с 224 в третьем октете?

Маска третьего октета 224 = 11100000₂. Третий октет IP 243 = 11110011₂. Побитовое И оставляет 11100000₂ = 224. Последний октет маски равен 0, поэтому последний октет адреса сети — 0.

В маске 19 единиц и 13 нулей: внутри сети 2¹³ = 8192 адреса. Третий октет в диапазоне 224–255, последний 0–255. Это объясняет границы, которые Python уже нашёл за нас.

Тип 1 · выбрать адрес

Наибольший адрес компьютера и сумма октетов

Сеть задана IP узла 68.203.243.87 и маской 255.255.224.0. Найди наибольший IP, который можно назначить компьютеру. В ответ запиши сумму числовых значений октетов найденного адреса.

1. Выбираем правильный край диапазона

ip_net[-2] даёт 68.203.255.254. Адрес 68.203.255.255 — broadcast: он на единицу больше, но условию про компьютер не соответствует.

2. Превращаем четыре октета в числа и складываем

СтрокаРезультат
ip = ip_net[-2]Объект адреса 68.203.255.254
str(ip)Текст '68.203.255.254'
str(ip).split('.')Части ['68', '203', '255', '254']
sum(map(int, octets))68 + 203 + 255 + 254 = 780

3. Полная программа сразу выводит требуемый ответ

Тип 1 · сумма октетов последнего компьютера
from ipaddress import ip_network

ip_net = ip_network('68.203.243.87/255.255.224.0', strict=False)
ip = ip_net[-2]
octets = str(ip).split('.')
print(sum(map(int, octets)))

В шпаргалке напечатан сам адрес, а сумма посчитана после него. Здесь добавлены последние строки, чтобы программа сразу вывела 780. Для проверки адреса временно напиши print(ip), затем убери этот диагностический вывод.

Ответ: 780Это сумма октетов адреса 68.203.255.254, а не сумма октетов исходного IP.
Тип 2 · посчитать адреса

Сколько IP имеют число единиц, не кратное 5?

Сеть задана адресом 172.16.168.0 и маской 255.255.248.0. Сколько IP-адресов этой сети имеют количество единиц в двоичной записи, не кратное 5?

1. Выбираем диапазон по условию

Требуются IP-адреса сети, поэтому используем for ip in ip_net:. Сюда входят и адрес сети, и broadcast. Если бы требовались только адреса компьютеров этой подсети, использовали бы ip_net.hosts().

2. Считаем единицы по четырём октетам

Октетbin(...)[2:]Число единиц
172101011004
16100001
168101010003
000

Для 172.16.168.0 всего 4 + 1 + 3 + 0 = 8 единиц. Цепочка bin(int(mas[1]))[2:] сначала превращает строку '16' в число 16, затем в двоичную строку и убирает префикс 0b.

В выводе bin нет ведущих нулей. Для подсчёта единиц они не нужны. Но для количества нулей или проверки позиций необходимо дополнять каждый октет до 8 бит: format(int(octet), '08b').

3. Переводим «не кратно 5»

ФразаУсловие
Количество единиц кратно 5ones % 5 == 0
Не кратно 5ones % 5 != 0
Чётное количествоones % 2 == 0
Ровно 10 единицones == 10

Для 8 единиц остаток от деления на 5 равен 3, значит адрес проходит. Ровно 10 единиц дали бы остаток 0 и не прошли бы.

4. Собираем код по шпаргалке

Тип 2 · четыре октета и счётчик
from ipaddress import ip_network

ip_net = ip_network('172.16.168.0/255.255.248.0', strict=False)
count = 0
for ip in ip_net:
    mas = str(ip).split('.')
    mas2 = [bin(int(mas[0]))[2:], bin(int(mas[1]))[2:],
            bin(int(mas[2]))[2:], bin(int(mas[3]))[2:]]
    ones = (mas2[0].count('1') + mas2[1].count('1')
            + mas2[2].count('1') + mas2[3].count('1'))
    if ones % 5 != 0:
        count += 1
print(count)

mas хранит четыре текстовых октета, mas2 — четыре двоичных строки. ones складывает числа единиц. Count растёт только после проверки. Итоговый print(count) находится после цикла; break здесь не нужен.

Ответ: 1663Диапазон сети — 172.16.168.0–172.16.175.255, всего 2048 адресов. Из них проходят 1663. Если ошибочно оставить только hosts(), получится 1661: оба крайних адреса здесь тоже проходят двоичное условие.
Как сократить программу после понимания четырёх октетов

int(ip) даёт числовое значение всего IPv4-адреса. Подсчитать единицы можно сразу в его двоичной записи. Результат тот же:

Короткий вариант · тот же ответ 1663
from ipaddress import ip_network

ip_net = ip_network('172.16.168.0/255.255.248.0', strict=False)
count = 0
for ip in ip_net:
    ones = bin(int(ip))[2:].count('1')
    if ones % 5 != 0:
        count += 1
print(count)

Для нулей по-прежнему нужна полная ширина 32 бита: format(int(ip), '032b'). Укорачивать код имеет смысл после того, как понятно, какие адреса и какие биты требуется проверить.

Два вопроса к одной сети

Проверь границы сети и подсчёт единиц

Измени IP и маску-префикс. Укажи, нужен весь диапазон или только компьютеры, и делитель для условия «не кратно». Тренажёр покажет все четыре границы и фрагмент перебора. Для удобства здесь доступны подсети /19–/30.

Таблица показывает первые восемь и последние два адреса выбранного диапазона. Количество рассчитывается по всему выбранному диапазону. Введённый Python на странице не исполняется.

Попробуй написать код сам

Собери три программы и проверь их вывод

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

Кнопка «Проверить строки» сравнивает фрагменты с шаблоном. Страница не исполняет введённый Python. Другие способы проверяй запуском в своём редакторе и по числовому ответу. Пробелы между частями выражения и обычные одинарные или двойные кавычки допустимы.

Решено: 0 из 12

Сборка 1. Последний компьютер, затем сумма октетов

IP узла 192.168.10.77, маска 255.255.255.192. Найди наибольший адрес, который можно назначить компьютеру, и выведи сумму его октетов.
from ipaddress import ip_network

ip_net = ip_network(⟦1⟧, strict=⟦2⟧)
ip = ip_net[⟦3⟧]
octets = ⟦4⟧.split(⟦5⟧)
print(⟦6⟧)

1. Какой ответ напечатала программа?

Введи одно итоговое число после запуска своего решения.

Сборка 2. Подсчёт всех адресов сети

Для сети 10.0.0.0/255.255.255.248 посчитай все IP-адреса сети, у которых количество единиц в двоичной записи не кратно 3.
from ipaddress import ip_network

ip_net = ip_network('10.0.0.0/255.255.255.248', strict=False)
count = ⟦1⟧
for ip in ⟦2⟧:
    mas = str(ip).split('.')
    ones = (bin(int(mas[0]))[2:].count('1')
            + bin(int(mas[1]))[2:].count('1')
            + bin(int(mas[2]))[2:].count('1')
            + bin(int(mas[3]))[2:].count('1'))
    if ones % ⟦3⟧ ⟦4⟧ ⟦5⟧:
        count += 1
print(⟦6⟧)

2. Какой ответ напечатала программа?

Введи одно итоговое число после запуска своего решения.

Сборка 3. Подсчёт только компьютеров

Для сети 10.0.0.0/255.255.255.248 посчитай только адреса, назначаемые компьютерам, у которых количество единиц в двоичной записи не кратно 3.
from ipaddress import ip_network

ip_net = ip_network('10.0.0.0/255.255.255.248', strict=False)
count = ⟦1⟧
for ip in ⟦2⟧:
    mas = str(ip).split('.')
    ones = (bin(int(mas[0]))[2:].count('1')
            + bin(int(mas[1]))[2:].count('1')
            + bin(int(mas[2]))[2:].count('1')
            + bin(int(mas[3]))[2:].count('1'))
    if ones % ⟦3⟧ ⟦4⟧ ⟦5⟧:
        count += 1
print(⟦6⟧)

3. Какой ответ напечатала программа?

Введи одно итоговое число после запуска своего решения.

Ещё девять вопросов по коду

Ответы можно исправлять и проверять снова.

4. Индекс broadcast

Какой индекс в ip_net выбирает последний адрес сети — broadcast?

5. Сумма октетов

Какой ответ нужен в первом разборе, если требуется сумма октетов наибольшего адреса компьютера?

6. Двоичный октет

Какую строку даст bin(16)[2:]? Впиши только цифры.

7. Единицы всего IP

Сколько единиц в двоичной записи 172.16.168.0?

8. Не кратно 5

У адреса ровно 10 единиц. Проходит ли он условие «число единиц не кратно 5»? Ответь «да» или «нет».

9. Весь диапазон или компьютеры

В подсети /29 восемь адресов. Сколько вернёт hosts() для компьютеров такой обычной подсети?

10. Число адресов /21

Сколько всех IPv4-адресов в сети с префиксом /21?

11. Граница диапазона

Какой IP является наибольшим адресом компьютера в сети первого разбора? Впиши адрес через точки.

12. Разрешить IP узла

Что указать после strict=, чтобы ip_network принял обычный IP узла? Напиши True или False.

Напиши с чистого листа

Скачать Python и задания для самостоятельного решения

Четыре готовых файла: выбор адреса, подробный подсчёт единиц, короткий подсчёт и просмотр границ сети. В папке practice — три новых условия с местом для твоего кода; в solutions — решения для сверки после попытки.

Скачать учебные файлы PythonРаспакуй архив, открой нужный .py и запусти в Python 3. Дополнительные библиотеки и файлы данных не нужны.

Если ответ не совпадает

Что проверитьКак исправить
ValueError: has host bits setВ ip_network добавь strict=False или второй аргумент 0.
Для компьютера выбран broadcastПроверь индекс: нужен −2, не −1.
Получен IP вместо требуемого числаПосле выбора адреса вычисли сумму октетов, если спрашивается она.
Подсчёт отличается на один-два адресаПроверь формулировку: весь диапазон или только компьютеры. Не вычитай 2 из готового count автоматически — крайние адреса могут не пройти условие.
Bin не принимает октетЭлемент mas — строка: сначала int(mas[i]).
Единицы посчитаны в 172.16.168.0 как в текстеТребуется двоичная запись каждого октета или всего числового IP, а не десятичные символы.
Считаются кратные вместо некратныхДля «не кратно» нужен остаток != 0.
Неверное количество нулейДля нулей дополни октеты до 8 бит или весь IPv4 до 32 бит.
Печатаются промежуточные количестваИтоговый print(count) должен стоять после цикла.

Вопросы по решению кодом

Почему IP через точки нельзя передать в bin напрямую?

Bin принимает целое число. При разборе по октетам используй int(octet); если ip уже объект IPv4Address, int(ip) даст целое значение всего адреса.

Почему не нужно дописывать нули для числа единиц?

Ноль не меняет число единиц. Для количества нулей и проверки конкретных позиций разряды уже важны, поэтому нужна ширина 8 бит на октет или 32 на весь IPv4.

Работают ли правила двух служебных адресов для /31 и /32?

В этих примерах и тренажёре рассматриваются обычные подсети с префиксом не длиннее /30. В Python hosts() для /31 возвращает оба адреса, а для /32 — единственный. Поэтому индексы [1] и [-2] нельзя переносить на эти специальные случаи автоматически.

Справка: ipaddress в документации Python.

Где повторить нужный приём Python?

Открой учебник, повтори конкретный приём и вернись к самостоятельному решению. Здесь разобраны строки, которые нужны именно для задания 10.

Проверь, что можешь восстановить решение сам

Возьми условие из папки practice и напиши код в пустом файле. Перед запуском объясни себе каждое ограничение и последнюю строку ответа. Затем переходи к практике на новых заданиях.