Задание 13 ЕГЭ по информатике: решайте с автопроверкой

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

Решать задачи номера

Как решать программой

В Python есть модуль ipaddress, который знает правила адресации. ip_network("адрес/маска", strict=False) строит сеть по адресу узла, а у сети есть адрес сети, широковещательный адрес, число адресов и перебор всех адресов.

Если удобнее работать с битами, переведите адрес в 32-битное число: каждый байт сдвигается на 8 разрядов. Адрес сети — это поразрядное И адреса и маски, а маска с k единицами — это (2³² − 1) − (2^(32 − k) − 1).

Число адресов, которые можно выдать узлам, на два меньше размера сети: адрес сети и широковещательный адрес узлам не назначают. Внимательно читайте, о каком числе спрашивают.

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

Разбор примера

Узел 172.30.140.9, маска 255.255.240.0. Сколько адресов этой сети можно назначить узлам?

from ipaddress import ip_network

net = ip_network('172.30.140.9/255.255.240.0', strict=False)
print(net.num_addresses - 2)

Программа печатает

4094

В маске 255.255.240.0 двадцать единиц и двенадцать нулей. Значит, в сети 2¹² = 4096 адресов, а узлам можно назначить на два меньше: 4094.

Решить эту задачу

Задачи к заданию 13

  • Сколько узлов поместится в сетиЛёгкаяРешать
  • Адреса сети с кратным числом единицСредняяРешать
  • Сколько масок подходит двум узламСредняяРешать
  • Сколько единиц может быть в маскеСредняяРешать
  • Последний адрес узла в сетиЛёгкаяРешать
  • Адреса сети с суммой байтов, кратной dСредняяРешать

Бесплатно и без регистрации: пишете код в браузере и проверяете его тестами (без аккаунта — несколько задач в день).

Вопросы и ответы

Можно ли пользоваться модулем ipaddress на экзамене?
Да: модуль входит в стандартную библиотеку Python и есть в любой установке. Решение битами тоже стоит знать, оно работает на любом языке.
Зачем strict=False?
Без него ip_network ждёт адрес сети, а не адрес узла, и выдаёт ошибку.
Как посчитать единицы в адресе?
Переведите адрес в число и возьмите bin(n).count("1").
Как перевести адрес в число без модуля?
Разбейте строку по точкам и соберите число: каждый следующий байт добавляется после сдвига на 8 разрядов влево, то есть умножения на 256.