Задание 16 ОГЭ по информатике: программирование — полный разбор
Подтемы
- Задания для подготовки45 задач
Что проверяет задание
Задание 16 — это практическое программирование. Проверяется умение написать короткую, но работающую программу, которая обрабатывает числовую последовательность и вычисляет заданную характеристику: сумму, количество элементов по условию, максимум, минимум или комбинацию этих величин.
Задание проверяет не знание синтаксиса ради синтаксиса, а способность:
- правильно прочитать входные данные (из файла или из стандартного ввода);
- организовать цикл обработки;
- применить условие отбора элементов;
- накопить и вывести результат в нужном формате.
Язык программирования выбирается самостоятельно — на экзамене чаще всего используют Python как самый компактный и понятный вариант, но допускаются Pascal, C++, Basic и другие.
Как выглядит формулировка и сколько баллов
Типичная формулировка звучит так: «В файле находится последовательность из не более чем целых чисел, значения которых не превышают по модулю . Определить количество чисел, кратных 7, и вывести их сумму» — или похожий вариант с другим условием отбора.
Особенности формата:
- количество чисел в файле обычно не сообщается явно, программа должна читать данные до конца файла;
- числа могут быть как положительными, так и отрицательными;
- результат нужно вывести в строго заданном порядке и формате (например, «сначала количество, затем сумма через пробел»).
За задание можно получить максимум 2 балла. Программа проверяется автоматически на нескольких тестах: чтобы получить баллы, решение должно правильно работать на всех тестах, а не только на примере из условия.
Что нужно знать
- Переменная-накопитель (аккумулятор) — переменная, которая хранит промежуточный результат: сумму, количество, максимум.
- Цикл
for— используется, когда известно количество повторений или элементы читаются по одному до конца файла. - Цикл
while— используется, когда условие продолжения цикла проверяется каждый раз (например, «пока не конец файла»). - Условный оператор
if— проверка условия отбора элемента. - Остаток от деления: — используется для проверки кратности числа: число кратно , если .
- Целочисленное деление: — целая часть частного.
- Среднее арифметическое: , где — сумма элементов, — их количество.
- Проверка чётности: число чётное, если .
- Функции для готовых операций:
max(),min(),sum(),len()— облегчают код, но не всегда подходят при потоковом чтении файла. - Индексация элементов последовательности: первый элемент имеет номер 1 или 0 в зависимости от контекста задачи — это важно уточнять по условию.
Методы решения
1. Метод накопления суммы и количества.
Заводятся две переменные: s = 0 (сумма) и k = 0 (количество). В цикле при выполнении условия к s добавляется значение элемента, а k увеличивается на 1.
Мини-пример: посчитать сумму и количество чисел, кратных 3, в последовательности 3, 5, 9, 12, 7.
Проверка кратности: , , . Итог: количество — 3, сумма .
2. Метод поиска экстремума (максимум/минимум) с условием. Заводится переменная-«текущий максимум», которая инициализируется первым подходящим элементом или очень маленьким числом (например, ). При каждом новом элементе, удовлетворяющем условию, значение сравнивается и обновляется при необходимости.
Мини-пример: найти максимум среди отрицательных чисел последовательности . Отрицательные: . Максимум среди них — .
3. Метод фильтрации по сложному условию.
Когда условие отбора состоит из нескольких частей (например, «число чётное и больше 100»), условия объединяются логическими операторами and, or. Важно проверить порядок вычисления и скобки.
Мини-пример: отобрать числа, которые одновременно кратны 2 и кратны 5, то есть кратны 10: и .
4. Метод анализа соседних элементов. Используется, когда нужно сравнивать элемент с предыдущим или следующим (например, найти количество пар соседних элементов одного знака). Здесь удобно хранить значение предыдущего элемента в отдельной переменной и обновлять её после каждой итерации.
Мини-пример: дана последовательность 1, 2, -3, -4, 5. Пары одного знака: — оба положительные, — оба отрицательные. Всего 2 пары.
5. Метод одновременного вычисления нескольких характеристик. Часто в одном задании требуется вывести сразу несколько величин (например, количество, сумму и максимум). Все накопители заводятся одновременно и обновляются в одном проходе цикла — двойной проход по данным не нужен и обычно неэффективен при больших объёмах.
Алгоритм решения по шагам
- Внимательно прочитать условие: что является входными данными (файл или ввод с клавиатуры), какое условие отбора элементов, что нужно вывести и в каком порядке.
- Определить формат чтения: числа записаны в одну строку через пробел или каждое число на отдельной строке.
- Завести все необходимые переменные-накопители и присвоить им начальные значения (0 для суммы и количества, экстремальное значение для максимума/минимума).
- Организовать цикл чтения: если размер последовательности неизвестен, читать до конца файла (
for line in fили циклwhileс проверкой конца потока). - Внутри цикла преобразовать прочитанную строку в число (
int()), проверить условие отбора и обновить накопители. - После завершения цикла вывести результат в требуемом формате — важно соблюдать порядок значений и разделители (пробел, перевод строки).
- Проверить программу на примере из условия задачи, затем продумать граничные случаи: пустой файл, файл с одним числом, все числа не подходят под условие.
Разбор примеров
Пример 1. В файле записана последовательность целых чисел, количество которых неизвестно. Найти количество чётных чисел в последовательности и их сумму.
Шаг 1. Условие отбора: число чётное, то есть .
Шаг 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, сумма . Программа выведет «3 22».
Шаг 5. Проверить граничный случай: если чётных чисел нет, программа выведет «0 0» — это корректно, так как переменные были инициализированы нулями.
Пример 2. В последовательности целых чисел найти максимальное значение среди чисел, кратных 3. Гарантируется, что хотя бы одно такое число есть.
Шаг 1. Условие отбора: .
Шаг 2. Так как нужен максимум только среди подходящих чисел, инициализировать переменную максимума очень маленьким числом, например , чтобы первое подходящее число точно её обновило.
Шаг 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. Дана последовательность целых чисел. Найти количество пар соседних элементов, у которых оба числа положительны (то есть и ).
Шаг 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. Пары: — оба положительны, засчитывается; — нет; — нет; — засчитывается; — нет; — нет. Итог: 2 пары. Программа выведет «2».
Шаг 4. Ключевой момент — переменная prev инициализируется значением None, чтобы не засчитать несуществующую пару перед первым элементом. Это частая ошибка: если инициализировать prev = 0, а в последовательности встретится число 0, логика может исказиться при неаккуратной проверке.
Типичные ошибки и ловушки
- Неверная инициализация накопителей. Если забыть присвоить начальное значение переменной суммы или количества, программа выдаст ошибку или неверный результат.
- Некорректная инициализация экстремума. Если для поиска максимума взять начальное значение 0, а все числа в последовательности отрицательные, результат окажется неправильным. Нужно использовать заведомо маленькое (или большое для минимума) число.
- Ошибка в условии кратности. Часто путают с — проверка кратности всегда идёт через остаток, а не через целочисленное деление.
- Игнорирование границы файла. Если не предусмотреть чтение до конца файла произвольной длины, программа может обрезать данные или зациклиться.
- Ошибки в формате вывода. Экзаменующая система строго сравнивает вывод: лишний пробел, перевод строки в неверном месте или неправильный порядок чисел приводят к потере баллов, даже если логика решения верна.
- Отсутствие обработки пустого результата. Если ни один элемент не подошёл под условие, а программа должна вывести, например, «нет решения», забытая проверка на пустой случай ломает тест.
- Путаница между индексами и значениями. В задачах про соседние элементы легко перепутать, что именно сравнивается — сами числа или их позиции.
- Неправильный тип данных. Если забыть преобразовать строку в число (
int()илиfloat()), сравнения и арифметические операции будут работать неверно или вызовут ошибку.
Как готовиться
- Выберите один язык программирования (лучше Python за счёт простого синтаксиса) и доведите базовые конструкции — циклы, условия, работу с файлами — до автоматизма.
- Решайте варианты прошлых лет и типовые сборники задач именно этого номера, чтобы увидеть все распространённые формулировки условий отбора: кратность, чётность, знак числа, попадание в диапазон.
- После написания программы обязательно проверяйте её на нескольких самостоятельно придуманных примерах, включая крайние случаи: пустой файл, все числа одного знака, единственное число в последовательности.
- Заведите привычку сначала словами описывать алгоритм (что читаем, что проверяем, что накапливаем), а затем переводить его в код — это снижает количество логических ошибок.
- Обращайте внимание на формат вывода в каждом конкретном задании: порядок чисел, наличие или отсутствие пояснительного текста, разделители.
- Тренируйте скорость написания коротких программ без ошибок — на экзамене важно не только решить задачу, но и успеть переписать код в бланк или ввести его в проверяющую систему за отведённое время.
Частые вопросы
Какой язык программирования лучше выбрать для задания 16?
Чаще всего выбирают Python — у него компактный синтаксис и удобная работа с файлами и строками, что ускоряет написание решения на экзамене.
Нужно ли знать точное количество чисел в последовательности заранее?
Нет, обычно оно неизвестно, поэтому программа должна читать данные до конца файла, а не по заранее известному числу повторений.
Как проверить, что число кратно другому числу?
Через остаток от деления: число кратно , если . Использовать целочисленное деление для этой проверки нельзя.
Что делать, если в последовательности не окажется ни одного подходящего элемента?
Нужно заранее продумать этот случай: например, для суммы и количества это будут нули, а для максимума — специальная проверка, что накопитель не изменился с начального значения.
Почему важно инициализировать переменную максимума очень маленьким числом?
Если инициализировать её нулём или произвольным малым числом, а все элементы последовательности окажутся отрицательными, результат будет неверным — первое сравнение должно всегда обновлять накопитель.
Сколько баллов можно получить за задание 16?
Максимум 2 балла, они присуждаются только при полностью верной работе программы на всех тестах проверяющей системы.
Как избежать ошибок в формате вывода?
Внимательно читайте условие: соблюдайте порядок значений, разделители (пробел или перевод строки) и не добавляйте лишний текст, если он не требуется в задании.