Проверить программы онлайн · файлы остаются в браузере

Обработка данных в файлах — практикум

10 класс, углублённый уровень. Занятие восьмое: программа читает числа не с клавиатуры, а из файла — как в задании 17 ЕГЭ.

План на пару. Сначала тренажёр: шесть коротких задач на чтение программ, которые работают с файлом, — отбор по условию, первая строка-количество, пары соседних чисел, самая длинная серия, два прохода по файлу, запись в файл. Потом три своих программы: каждая читает числа из файла. Проверяет их оболочка Проверка.bat из общей папки: она запускает программу на девяти своих файлах — маленьких с подвохом и больших, на тысячи чисел. Интернет не нужен.

Часть 1. Тренажёр: читаем программы с файлом

Шесть типов задач, по одной на каждый. Под задачей — строки файла data.txt сверху вниз, по одному числу в строке. Считать в уме или на бумаге. Остаток от деления у отрицательных — по правилам Python: -17 % 10 равно 3.

0 верно из 6

Часть 2. Как программа читает файл

Открыть и пройти по строкам

фрагмент программы — набери его сам

Файл открывается по имени, без пути, — тогда Python ищет его в папке программы. Положи файл данных рядом с .py. Текстовый файл — это символы и переводы строк, его можно открыть Блокнотом; двоичный (картинка, архив) — байты в своём формате, и читают его по-другому.

Первая строка — отдельно

фрагмент программы — набери его сам

Файловая переменная помнит место: после readline() цикл for line in f продолжит со второй строки и пройдёт до конца файла.

Пары соседних: prev и x

фрагмент программы — набери его сам

Пар на одну меньше, чем чисел. Старт prev = 0 — ошибка: он создаёт лишнюю пару (0; первое число), которой в файле нет.

Два прохода

Когда условие пары зависит от всего файла («сумма больше наибольшего числа на 7»), сначала первым проходом находят это число, потом второй проход считает пары. После первого прохода файловая переменная стоит в конце: файл открывают заново — f.close(), потом снова f = open("17.txt"). Списков мы не знаем, и они не нужны.

Запись в файл

фрагмент программы — набери его сам

Ловушки задания 17

Часть 3. Три программы

Задание 1 Отбор по условию — файл 1.txt

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

Файл 1.txt

5
-17
27
3
-7

Вывод

Количество: 3
Наибольшее: 27

Проверяется: чтение файла по строкам, последняя цифра отрицательного числа, старт наибольшего.

Если застрял

Счётчик код и наибольшее код — до цикла. В цикле код превращаешь строку в число и проверяешь последнюю цифру. Подошло — счётчик плюс один и сравнение с код.

Ловушки, ради которых это задание. Оболочка подаст файл, где все числа на 7 отрицательные: код напечатает 0, которого в файле нет. И числа вроде −17: условие код их пропустит, а −13 — наоборот, засчитает (в Python −13 % 10 равно 7).

Задание 2 Пары соседних — файл 2.txt

Пара — два числа, стоящие в файле код друг за другом. Найди количество пар, в которых хотя бы одно число кратно 5, а сумма пары больше код — наибольшего из чисел файла, оканчивающихся на 7. Затем наибольшую из сумм таких пар. В файле есть хотя бы одна такая пара.

Файл 2.txt

9999
5
-3
17

Вывод

Пар: 1
Наибольшая сумма: 10004

Здесь код. Пары: (9999; 5) — 5 кратно 5, сумма 10004 > 17, подходит; (5; −3) — сумма 2, не больше 17; (−3; 17) — ни одно не кратно 5.

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

Если застрял

Первый проход — как задание 1, только нужно одно наибольшее код. Потом код и снова код. Второй проход: первое число — в код до цикла, в цикле пара код, в конце витка код.

Ловушки, ради которых это задание. Первое число файла большое, а код до цикла даст лишнюю пару (0; первое): ноль кратен 5. Все числа отрицательные: суммы пар меньше нуля, и старт наибольшей суммы с нуля врёт. И код в поиске код.

Задание 3 Самая длинная серия — файл 3.txt

Серия — несколько чисел файла код подряд, каждое из которых строго больше предыдущего; одно число — тоже серия длины 1. Программа печатает длину самой длинной серии и её первое число. Если самых длинных серий несколько — первое число той, что встретилась раньше.

Файл 3.txt

4
1
5
9
2
2
8

Вывод

Длина: 3
Первое число: 1

Проверяется: prev и две пары накопителей — текущая серия и лучшая; равные соседи, серия в конце файла, равная длина.

Если застрял

До цикла: первое число — в код; текущая серия длины 1 начинается с него, и лучшая пока она же. В цикле: если код, серия удлиняется; иначе новая серия длины 1 начинается с код. После этого — сравнение с лучшей, на каждом шаге.

Ловушки, ради которых это задание. Лучшая серия в самом конце файла: если сравнивать только при обрыве, она потеряется. Равные соседи серию обрывают («строго больше»). Две серии одной длины — сравнение строгое, остаётся первая.

Часть 4. Сдача

  1. Файлы zadanie1.py … zadanie3.py лежат в твоей папке, отладочные print из них убраны.
  2. В общей папке двойной щелчок по Проверка.bat.
  3. «Найти мои файлы» → «Проверить всё».
  4. Покажи учителю два экрана: тренажёр наверху этой страницы и итог оболочки.
Если вместо окна открылся текст программы — файл открылся в IDLE как код. Нажми F5, окно появится.

Оболочка показывает, на каком файле программа ошиблась и что должна была вывести. Большой файл в отчёт не поместится — поэтому она кладёт его в твою папку как proverka-1.txt (proverka-2.txt, …). Открой его в программе вместо своего и найди ошибку. Попыток сколько угодно.

Подсказка: обработка данных в файлах

Файлы

Текстовый файл — символы и переводы строк, открывается Блокнотом. Двоичный — байты в своём формате (картинка, архив). Файл данных кладут в папку программы и открывают по имени: f = open("17.txt"). f — файловая переменная: помнит, докуда файл прочитан.

Чтение

for line in f — по всем непрочитанным строкам до конца файла. f.readline() — одна следующая строка. Строка — текст: x = int(line), перевод строки int() отбросит сам. Второй проход — f.close() и снова open.

Запись

g = open("out.txt", "w") — "w" стирает старое содержимое, "a" дописывает в конец. print(x, file=g) пишет строку в файл. В конце g.close().

Пары соседних

prev = int(f.readline()) до цикла; в цикле пара (prev; x), в конце витка prev = x. Пар на одну меньше, чем чисел. prev = 0 — лишняя пара с нулём.

Серия подряд

cur — длина текущей серии, best — лучшая. Подходит: cur + 1, иначе серия начинается заново. best сравнивать на каждом шаге — иначе серия в конце файла потеряется.

Ловушки задания 17

Последняя цифра: abs(x) % 10, потому что -17 % 10 == 3. Наибольшее и наибольшая сумма: старт не с нуля, а с числа меньше любого возможного.

Материалы подготовлены с использованием технологий искусственного интеллекта.