Python или C++ для ЕГЭ по информатике
Спор «Python или C++» в школьной информатике возникает каждый сентябрь, и аргументы в нём повторяются из года в год. Одни говорят: на Python короче, значит, быстрее пишешь. Другие отвечают: на Python медленно считает, значит, подведёт на сложной задаче. Обе стороны правы, только про разное, и выбор зависит от того, кто вы и что собираетесь сдавать.
Вывод у меня такой: большинству ребят я советую Python, но при трёх условиях, которые стоит проверить, а не принять на веру. Кто уже уверенно пишет на C++, тому переучиваться незачем, и дальше можно не читать.
Что даёт Python в условиях экзамена
Первое достоинство Python: программа получается короткой. Задача на обработку чисел из файла умещается в десяток строк, а на C++ те же действия требуют заголовков, объявления типов и ручной работы с вводом. В экзамене, где время считается минутами, десять строк пишутся быстрее двадцати пяти, а ошибиться в них можно реже.
Второе достоинство в том, что встроены длинные числа. В Python целое число не переполняется: вы можете возвести двойку в степень в несколько тысяч и получить точный результат. Задачи, где числа быстро растут, на C++ приходится решать с оглядкой на разрядность, а в Python никакой оглядки не нужно. Третье достоинство в строках: разрезать, перевернуть, найти подстроку, посчитать вхождения можно одной командой, и этим пользуются в заданиях на текст.
Нельзя не сказать и о привычке. В школе первым языком чаще всего оказывается именно Python, и к одиннадцатому классу у большинства ребят за плечами не один год практики. Бросать то, что получается, ради теоретически более мощного инструмента — нерациональная трата сил, особенно в год экзамена.
Где Python подводит
Платой за короткую запись служит скорость. Цикл на несколько миллионов шагов Python пройдёт за секунды, а вот вложенный перебор с большими границами заставит ждать минутами. На экзамене это не провал сам по себе: программу запускаете вы, отдельного ограничения по времени на её работу нет, и ответ вы получите в любом случае. Но ожидание съедает ваше время, а оно общее на всю работу. Как с этим жить, разобрано в статье про последнюю задачу с большим файлом.
Вторая неприятность в рекурсии. Глубина вложенных вызовов в Python по умолчанию ограничена, и порядок этого предела около тысячи. Решение «перебор с возвратом» или обход графа рекурсией на больших данных вылетает с ошибкой, которую не сразу узнаёшь, если видишь её впервые. Исправляется это поднятием предела или переписыванием рекурсии в цикл, но знать о проблеме нужно заранее.
Хуже всего, что эти три неприятности проявляются поздно: на маленьких данных всё работает, и ученик успокаивается. Поэтому тренироваться стоит сразу на больших файлах, пусть даже придуманных самим, чтобы столкнуться с замедлением в октябре, а не в июне. Файл с миллионом строк можно получить генератором случайных чисел за одну короткую программу.
Третья в мелочах. Динамическое программирование на Python удобно писать с запоминанием результатов, и в стандартной библиотеке для этого есть готовое средство. Только не забудьте, что его нужно подключить, а доступность модулей на рабочем месте проверяется по описанию среды, а не по памяти.
Когда C++ оправдывает себя
C++ нужен там, где скорость решает дело. C++ выбирают по складу ученика, а не по экзамену. Ученик, который любит олимпиадное программирование и сидит на задачах с ограничениями по времени, обычно уже пишет на C++, и менять его незачем. Привычка считать операции и следить за типами вырабатывается годами.
Для остальных плата за C++ ощутима. Программа длиннее, и ошибок в ней больше: забытая точка с запятой, неверный тип, выход за границы массива, после которого программа не сообщает об ошибке и тихо портит результат. Переполнение обычного целого происходит на числах порядка двух миллиардов, а суммы в задачах с большими файлами это число легко пересекают. Ответ получается правдоподобным и неверным, и найти ошибку труднее, чем в любом сообщении об ошибке.
У языка есть и выигрышная сторона для тех, кто на нём пишет: программа выполняется быстро всегда, и вам не нужно думать, хватит ли ей терпения на большом файле. Поэтому тот, кто умеет писать на C++, чувствует себя на последней задаче спокойнее. Вопрос только в том, умеете ли вы.
Для сравнения самая простая обработка файла: прочитать столбец чисел и найти сумму тех, что кратны семи. На Python это открыть файл, пройти по строкам, превратить каждую в число, проверить остаток и прибавить к накопленной сумме. Программа занимает пять-шесть строк, и в ней трудно ошибиться: нет ни типов, ни заголовков, ни размеров. На C++ нужно подключить библиотеки для ввода и вывода, объявить переменные с типами, прочитать числа циклом и не забыть про тип суммы. Пока числа небольшие, обычного целого хватит. Но стоит взять значения порядка миллиарда, и уже сумма нескольких из них выйдет за границы: предельное значение обычного целого около двух миллиардов, а у типа побольше около девяти квинтиллионов.
Разница в том, что в Python вы вообще не должны об этом думать, а в C++ должны помнить каждый раз. Каждая такая мелочь стоит секунд, а за весь экзамен таких секунд набегает немало. С другой стороны, если вы уже сжились с этой дисциплиной, она перестаёт мешать и становится частью привычки: тип суммы вы указываете автоматически, как пристёгиваетесь в машине.
Рабочее место: ввод, вывод и среда
Школьники редко задумываются о вводе, пока не столкнутся с ним на настоящей задаче. Файл с данными на экзамене лежит в определённом месте, и путь к нему нужно указать верно, иначе программа не найдёт файл и сообщит об ошибке. В тренировочной среде вы привыкли держать файл рядом с программой, а на рабочем месте его расположение может быть иным. Заранее выясните, как в вашем языке открывать файл по полному пути и как читать оттуда числа, и потренируйтесь делать это без подсказок.
С выводом другая неприятность. Репетиция в простой среде полезна ещё и тем, что показывает, какие команды вы привыкли вызывать подсказкой: без неё выясняется, что половину имён функций вы не помните. Эти места лучше найти заранее и выучить. Привычка выводить на экран всё подряд при отладке в какой-то момент оборачивается тысячами строк на большом файле, и программа вместо расчёта занимается печатью. Выводите в конце одно число, то самое, которое надо ввести как ответ, а промежуточные значения убирайте сразу после отладки. Это относится к обоим языкам.
Три условия для Python и вопрос о смене языка
Первое — вы умеете читать файл построчно и не сохранять в памяти всё содержимое без нужды; на больших файлах это решает, хватит ли памяти и терпения. Второе: вы знаете два-три способа ускорить перебор, например заменить вложенный цикл накопленными суммами. Третье: вы заранее видели ошибку рекурсии и знаете, что с ней делать. Проверить себя можно за один вечер: возьмите три задачи с большими данными и посмотрите, что у вас получится без подсказок. Если эти три пункта вам знакомы, то Python не подведёт на подавляющем большинстве заданий, а на оставшихся подведёт редко.
Если же вы не можете сказать «да» хотя бы на два из трёх, то дело не в языке. Эти же слабости останутся и на C++, они просто примут другую форму: вместо долгого ожидания будет переполнение. Сначала нужно закрыть пробелы, а потом уже спорить о синтаксисе.
Мнения здесь расходятся. Бывают репетиторы, которые считают, что школьника надо сразу вести на C++, раз он всё равно пригодится в вузе. По-моему, это правда лишь для тех, кто идёт на направления, где программирование будет основным, и кому есть для чего учить язык. Для остальных лишние полгода синтаксиса отнимут время у задач, за которые на экзамене дают баллы.
Переход посреди года почти всегда проигрывает. Причина простая: пока вы два месяца учите новый язык, пропадает и накопленная скорость. Задачи, которые вы решали за десять минут, снова будут занимать полчаса. Если до экзамена остаётся меньше полугода, менять язык я бы не советовал вовсе.
Единственный случай, когда переход оправдан: вы дошли до уровня, где регулярно упираетесь в скорость, а до экзамена остаётся достаточно времени, чтобы заново переписать несколько десятков решённых задач на новом языке. Это хорошее упражнение само по себе, оно показывает разницу, но запускать его надо осенью, а не весной.
Если нужно проверить, насколько вам подходит выбранный язык, лучше всего решить на нём полный вариант в условиях, близких к экзамену, и честно записать, где потеряно время. Структура самой работы описана в статье про экзамен по информатике, а годовой порядок подготовки — в материале о подготовке за год. Если слабое место у вас системы счисления, их разбор лежит отдельно: как устроены такие задания.
Среда на экзамене может отличаться от домашней. Вы не найдёте привычных подсказок и расширений, и вы не будете искать синтаксис в поисковике, потому что интернета на рабочем месте нет. Поэтому за месяц-два до экзамена стоит поработать в самой простой среде, без подсвечивания ошибок и автодополнения, чтобы привыкнуть писать без опоры.
Проверьте ещё два места, где школьники теряют время. Как в вашей среде запускается программа и как читается файл по заданному пути: в тренировочной среде это могло быть одной кнопкой, а в экзаменационной окажется иначе. И как вы выводите результат: выводить надо только то, что нужно, а не всё подряд, особенно на больших файлах.
Начать поиск:
- репетиторы по информатике для подготовки к ЕГЭ
- репетиторы по информатике с опытом от семи лет
- все репетиторы для подготовки к ЕГЭ
Вопросы и ответы
Какой язык выбрать, если в школе учили Паскаль? Если вы на нём пишете уверенно, то можно остаться, если он есть в списке рабочего места вашего года. Если нет, то Python осваивается быстрее всего, и первые рабочие программы появляются уже в первые недели занятий.
Разве C++ не лучше, раз он быстрее? Быстрее, но только в тех случаях, когда вы пишете на нём без ошибок. Для среднего ученика лишние строки и переполнение стоят больше, чем выигрыш в скорости.
Нужно ли знать два языка? Нет. Знать надо один, но хорошо. Второй имеет смысл, если вы собираетесь учить программирование дальше, в вузе.
Что делать, если программа на Python не успевает? Сначала искать, где вложенный перебор, который можно заменить накопленными суммами или словарём. Если это не помогает и вы всё равно упираетесь в предел, пересмотрите алгоритм, а язык менять в последнюю очередь. Бывает и так, что программа вовсе не медленная, а просто выводит слишком много строк, и тогда помогает уборка отладочной печати. Проверьте это раньше всего, потому что исправляется за минуту.
Оставить заявку
- Татьяна Попова — Информатика и олимпиадное программирование · от 3 000 ₽
- Артём Игоревич Соловьёв — Информатика и математика: ОГЭ и ЕГЭ от практикующего разработчика · от 2 100 ₽
- Илья Германович Воронцов — Информатика: ЕГЭ, олимпиады и алгоритмы для студентов · от 1 700 ₽