Задание 16 ОГЭ по информатике: программирование — полный разбор

Подтемы

Что проверяет задание

Задание 16 — это практическое программирование. Проверяется умение написать короткую, но работающую программу, которая обрабатывает числовую последовательность и вычисляет заданную характеристику: сумму, количество элементов по условию, максимум, минимум или комбинацию этих величин.

Задание проверяет не знание синтаксиса ради синтаксиса, а способность:

  • правильно прочитать входные данные (из файла или из стандартного ввода);
  • организовать цикл обработки;
  • применить условие отбора элементов;
  • накопить и вывести результат в нужном формате.

Язык программирования выбирается самостоятельно — на экзамене чаще всего используют Python как самый компактный и понятный вариант, но допускаются Pascal, C++, Basic и другие.

Как выглядит формулировка и сколько баллов

Типичная формулировка звучит так: «В файле находится последовательность из не более чем 10610^6 целых чисел, значения которых не превышают по модулю 10910^9. Определить количество чисел, кратных 7, и вывести их сумму» — или похожий вариант с другим условием отбора.

Особенности формата:

  • количество чисел в файле обычно не сообщается явно, программа должна читать данные до конца файла;
  • числа могут быть как положительными, так и отрицательными;
  • результат нужно вывести в строго заданном порядке и формате (например, «сначала количество, затем сумма через пробел»).

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

Что нужно знать

  • Переменная-накопитель (аккумулятор) — переменная, которая хранит промежуточный результат: сумму, количество, максимум.
  • Цикл for — используется, когда известно количество повторений или элементы читаются по одному до конца файла.
  • Цикл while — используется, когда условие продолжения цикла проверяется каждый раз (например, «пока не конец файла»).
  • Условный оператор if — проверка условия отбора элемента.
  • Остаток от деления: a mod ba \bmod b — используется для проверки кратности числа: число aa кратно bb, если a mod b=0a \bmod b = 0.
  • Целочисленное деление: a // ba \,//\, b — целая часть частного.
  • Среднее арифметическое: xˉ=Sn\bar{x} = \dfrac{S}{n}, где SS — сумма элементов, nn — их количество.
  • Проверка чётности: число nn чётное, если n mod 2=0n \bmod 2 = 0.
  • Функции для готовых операций: max(), min(), sum(), len() — облегчают код, но не всегда подходят при потоковом чтении файла.
  • Индексация элементов последовательности: первый элемент имеет номер 1 или 0 в зависимости от контекста задачи — это важно уточнять по условию.

Методы решения

1. Метод накопления суммы и количества. Заводятся две переменные: s = 0 (сумма) и k = 0 (количество). В цикле при выполнении условия к s добавляется значение элемента, а k увеличивается на 1.

Мини-пример: посчитать сумму и количество чисел, кратных 3, в последовательности 3, 5, 9, 12, 7.

Проверка кратности: 3 mod 3=03 \bmod 3 = 0, 9 mod 3=09 \bmod 3 = 0, 12 mod 3=012 \bmod 3 = 0. Итог: количество — 3, сумма 3+9+12=243+9+12=24.

2. Метод поиска экстремума (максимум/минимум) с условием. Заводится переменная-«текущий максимум», которая инициализируется первым подходящим элементом или очень маленьким числом (например, −1018-10^{18}). При каждом новом элементе, удовлетворяющем условию, значение сравнивается и обновляется при необходимости.

Мини-пример: найти максимум среди отрицательных чисел последовательности −5,3,−10,−2,8-5, 3, -10, -2, 8. Отрицательные: −5,−10,−2-5, -10, -2. Максимум среди них — −2-2.

3. Метод фильтрации по сложному условию. Когда условие отбора состоит из нескольких частей (например, «число чётное и больше 100»), условия объединяются логическими операторами and, or. Важно проверить порядок вычисления и скобки.

Мини-пример: отобрать числа, которые одновременно кратны 2 и кратны 5, то есть кратны 10: n mod 2=0n \bmod 2 = 0 и n mod 5=0n \bmod 5 = 0.

4. Метод анализа соседних элементов. Используется, когда нужно сравнивать элемент с предыдущим или следующим (например, найти количество пар соседних элементов одного знака). Здесь удобно хранить значение предыдущего элемента в отдельной переменной и обновлять её после каждой итерации.

Мини-пример: дана последовательность 1, 2, -3, -4, 5. Пары одного знака: (1,2)(1,2) — оба положительные, (−3,−4)(-3,-4) — оба отрицательные. Всего 2 пары.

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

Алгоритм решения по шагам

  1. Внимательно прочитать условие: что является входными данными (файл или ввод с клавиатуры), какое условие отбора элементов, что нужно вывести и в каком порядке.
  2. Определить формат чтения: числа записаны в одну строку через пробел или каждое число на отдельной строке.
  3. Завести все необходимые переменные-накопители и присвоить им начальные значения (0 для суммы и количества, экстремальное значение для максимума/минимума).
  4. Организовать цикл чтения: если размер последовательности неизвестен, читать до конца файла (for line in f или цикл while с проверкой конца потока).
  5. Внутри цикла преобразовать прочитанную строку в число (int()), проверить условие отбора и обновить накопители.
  6. После завершения цикла вывести результат в требуемом формате — важно соблюдать порядок значений и разделители (пробел, перевод строки).
  7. Проверить программу на примере из условия задачи, затем продумать граничные случаи: пустой файл, файл с одним числом, все числа не подходят под условие.

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

Пример 1. В файле записана последовательность целых чисел, количество которых неизвестно. Найти количество чётных чисел в последовательности и их сумму.

Шаг 1. Условие отбора: число чётное, то есть n mod 2=0n \bmod 2 = 0.

Шаг 2. Нужно вывести два значения — количество и сумму.

Шаг 3. Программа на Python:

count = 0
s = 0
with open('input.txt') as f:
 for line in f:
 n = int(line)
 if n % 2 == 0:
 count += 1
 s += n
print(count, s)

Шаг 4. Проверка на примере: последовательность 3, 4, 7, 8, 10. Чётные: 4, 8, 10. Количество — 3, сумма 4+8+10=224+8+10=22. Программа выведет «3 22».

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

Пример 2. В последовательности целых чисел найти максимальное значение среди чисел, кратных 3. Гарантируется, что хотя бы одно такое число есть.

Шаг 1. Условие отбора: n mod 3=0n \bmod 3 = 0.

Шаг 2. Так как нужен максимум только среди подходящих чисел, инициализировать переменную максимума очень маленьким числом, например −1018-10^{18}, чтобы первое подходящее число точно её обновило.

Шаг 3. Программа:

max_val = -10**18
with open('input.txt') as f:
 for line in f:
 n = int(line)
 if n % 3 == 0:
 if n > max_val:
 max_val = n
print(max_val)

Шаг 4. Проверка на примере: последовательность 5, 9, 2, 15, 6, 1. Кратные 3: 9, 15, 6. Максимум среди них — 15. Программа выведет «15».

Шаг 5. Важная деталь: если бы условие не гарантировало наличие хотя бы одного подходящего числа, нужно было бы отдельно проверять, не осталось ли max_val равным начальному значению, и выводить сообщение об отсутствии решения.

Пример 3. Дана последовательность целых чисел. Найти количество пар соседних элементов, у которых оба числа положительны (то есть ni>0n_i > 0 и ni+1>0n_{i+1} > 0).

Шаг 1. Здесь нужно сравнивать текущий элемент с предыдущим, поэтому потребуется хранить предыдущее значение в отдельной переменной.

Шаг 2. Программа:

count = 0
prev = None
with open('input.txt') as f:
 for line in f:
 n = int(line)
 if prev is not None and prev > 0 and n > 0:
 count += 1
 prev = n
print(count)

Шаг 3. Проверка на примере: последовательность 3, 5, -2, 7, 8, -1, 4. Пары: (3,5)(3,5) — оба положительны, засчитывается; (5,−2)(5,-2) — нет; (−2,7)(-2,7) — нет; (7,8)(7,8) — засчитывается; (8,−1)(8,-1) — нет; (−1,4)(-1,4) — нет. Итог: 2 пары. Программа выведет «2».

Шаг 4. Ключевой момент — переменная prev инициализируется значением None, чтобы не засчитать несуществующую пару перед первым элементом. Это частая ошибка: если инициализировать prev = 0, а в последовательности встретится число 0, логика может исказиться при неаккуратной проверке.

Типичные ошибки и ловушки

  • Неверная инициализация накопителей. Если забыть присвоить начальное значение переменной суммы или количества, программа выдаст ошибку или неверный результат.
  • Некорректная инициализация экстремума. Если для поиска максимума взять начальное значение 0, а все числа в последовательности отрицательные, результат окажется неправильным. Нужно использовать заведомо маленькое (или большое для минимума) число.
  • Ошибка в условии кратности. Часто путают a mod b=0a \bmod b = 0 с a // ba \,//\, b — проверка кратности всегда идёт через остаток, а не через целочисленное деление.
  • Игнорирование границы файла. Если не предусмотреть чтение до конца файла произвольной длины, программа может обрезать данные или зациклиться.
  • Ошибки в формате вывода. Экзаменующая система строго сравнивает вывод: лишний пробел, перевод строки в неверном месте или неправильный порядок чисел приводят к потере баллов, даже если логика решения верна.
  • Отсутствие обработки пустого результата. Если ни один элемент не подошёл под условие, а программа должна вывести, например, «нет решения», забытая проверка на пустой случай ломает тест.
  • Путаница между индексами и значениями. В задачах про соседние элементы легко перепутать, что именно сравнивается — сами числа или их позиции.
  • Неправильный тип данных. Если забыть преобразовать строку в число (int() или float()), сравнения и арифметические операции будут работать неверно или вызовут ошибку.

Как готовиться

  1. Выберите один язык программирования (лучше Python за счёт простого синтаксиса) и доведите базовые конструкции — циклы, условия, работу с файлами — до автоматизма.
  2. Решайте варианты прошлых лет и типовые сборники задач именно этого номера, чтобы увидеть все распространённые формулировки условий отбора: кратность, чётность, знак числа, попадание в диапазон.
  3. После написания программы обязательно проверяйте её на нескольких самостоятельно придуманных примерах, включая крайние случаи: пустой файл, все числа одного знака, единственное число в последовательности.
  4. Заведите привычку сначала словами описывать алгоритм (что читаем, что проверяем, что накапливаем), а затем переводить его в код — это снижает количество логических ошибок.
  5. Обращайте внимание на формат вывода в каждом конкретном задании: порядок чисел, наличие или отсутствие пояснительного текста, разделители.
  6. Тренируйте скорость написания коротких программ без ошибок — на экзамене важно не только решить задачу, но и успеть переписать код в бланк или ввести его в проверяющую систему за отведённое время.

Частые вопросы

Какой язык программирования лучше выбрать для задания 16?

Чаще всего выбирают Python — у него компактный синтаксис и удобная работа с файлами и строками, что ускоряет написание решения на экзамене.

Нужно ли знать точное количество чисел в последовательности заранее?

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

Как проверить, что число кратно другому числу?

Через остаток от деления: число aa кратно bb, если a mod b=0a \bmod b = 0. Использовать целочисленное деление для этой проверки нельзя.

Что делать, если в последовательности не окажется ни одного подходящего элемента?

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

Почему важно инициализировать переменную максимума очень маленьким числом?

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

Сколько баллов можно получить за задание 16?

Максимум 2 балла, они присуждаются только при полностью верной работе программы на всех тестах проверяющей системы.

Как избежать ошибок в формате вывода?

Внимательно читайте условие: соблюдайте порядок значений, разделители (пробел или перевод строки) и не добавляйте лишний текст, если он не требуется в задании.