Задание №13 ЕГЭ по информатике: разбор, шаблоны кода Python и анти-примеры | СмартКИМ
СмартКИМ УДОБНАЯ ПОДГОТОВКА К ЕГЭ И ОГЭ
Задачи №13 Решать в тренажере Войти в СмартКИМ
ЕГЭ (1–27) ОГЭ (1–15) Python: шпаргалка
Быстрый переход по номерам и темам
Базовый (1 балл) Время: 2-4 мин Python ipaddress ipaddress.ip_network Все задачи №{ topic_num } в каталоге

Задание №13. Компьютерные сети, IP-адреса и маски подсетей

Тема: Модуль ipaddress, побитовая маска подсети, адрес сети и количество хостов
Определение адреса сети, количества доступных IP-адресов в подсети или значения третьего/четвертого байта маски с помощью встроенного модуля ipaddress.

1. Модуль ipaddress в Python:

  • ipaddress.ip_network('IP/Маска', strict=False) — создание объекта сети (параметр strict=False ОБЯЗАТЕЛЕН, если передаётся адрес узла!).
  • net.network_address — адрес сети.
  • net.num_addresses — общее количество адресов в подсети.
  • Допустимые байты маски подсети: 0, 128, 192, 224, 240, 248, 252, 254, 255 (в двоичной записи единицы идут строго подряд слева направо без нулей между ними!).

Разновидности и прототипы задания на экзамене

Тип 1: Определение адреса сети по IP и маске
Побитовое умножение IP-адреса на маску.
Тип 2: Подбор неизвестного байта маски
Перебор допустимых значений маски (0, 128, 192, 224, 240, 248, 252, 254, 255).
Тип 3: Подсчет IP-адресов с условием на количество единиц/нулей
Перебор всех хостов в сети через `net.hosts()` или `net`.

Боевой шаблон решения на Python

Запустить код в онлайн-песочнице
# === Боевой шаблон Задания №13 на Python ===
from ipaddress import ip_network

# Пример 1: Поиск адреса сети
net = ip_network('192.168.32.145/255.255.240.0', strict=False)
print("Адрес сети:", net.network_address)

# Пример 2: Подбор маски
# Даны IP-адрес узла и адрес сети, найти допустимый 3-й байт маски:
valid_mask_bytes = [0, 128, 192, 224, 240, 248, 252, 254, 255]

for b3 in valid_mask_bytes:
    mask = f"255.255.{b3}.0"
    net = ip_network(f"192.168.120.45/{mask}", strict=False)
    if str(net.network_address) == "192.168.112.0":
        print("Подходящий 3-й байт маски:", b3)

# Пример 3: Подсчет адресов с условием на двоичные единицы:
net = ip_network('112.160.0.0/255.240.0.0', strict=False)
count = 0
for ip in net:
    # Переводим IP в двоичную строку:
    ip_bin = "".join(f"{int(octet):08b}" for octet in str(ip).split('.'))
    if ip_bin.count('1') > ip_bin.count('0'):
        count += 1

print("Количество подходящих IP:", count)

Анти-примеры (Типичные ошибки vs Как делать правильно)

Как делать НЕ надо:
Ошибка: Забыть strict=False при создании сети
ip_network('192.168.1.5/24') упадет с ValueError: has host bits set!
Как делать ПРАВИЛЬНО:
Правильно: ВСЕГДА указывать strict=False: ip_network('192.168.1.5/24', strict=False)
ГРОБ

ГРОБ №13: Сеть содержит 2^16 адресов, цикл `for ip in net` работает медленно

Сеть с маской /12 содержит 1 048 576 адресов — перебор каждого адреса займет 30 секунд.

Как обойти ловушку: Анализируйте изменяемую часть адреса отдельно: перебирайте только изменяемые байты хоста.

Лайфхаки и подводные камни на экзамене:

  • При переводе октета IP в двоичный вид используйте `f'{int(octet):08b}'`, чтобы сохранить ведущие нули (ровно 8 бит на байт!).
Банк реальных задач №13 Открыть в тренажере СмартКИМ