Как обычно проходит олимпиада по информатике на нашем районе)
Заявляется допустим 50 участников. Приезжают 45. Через 15 минут после начала начинают выходить первые юные программисты с несколько озадаченным выражением на лице. Через полчаса уходит треть. Иногда уже половина. Через 2 часа остаются 5 монстров которые и остаются все допустимые по регламенту 4 часа. Кто-то из них получит какие-то баллы. Возможно. Может и нет.
Почувствуете мощь, с которой сейчас в наших школах растут кадры российской IT-элиты...
На прошлой неделе я и сам возил учеников на муниципальный этап олимпиады школьников по информатике. Есть повод рассказать интересующимся о процедуре ну и пару мыслей&наблюдений накидать.
За последние 15 лет олимпиада по информатике одновременно и сильно изменилась и осталась абсолютно прежней.
Что осталось неизменным, так это главная идея - олимпиада по информатике = олимпиада по программированию. Другого не дано. Неважно в каком ученик классе, в седьмом или одиннадцатом. Для получения баллов необходимо составить работающую программу на одном из языков программирования. Так у нас было всегда. Сейчас стало совсем безвариантно.
Что изменилось очень сильно - сама процедура. Еще лет 5-6 назад участникам раздавались задания на листочках. Теперь участники перед началом олимпиады получают логин-пароль для доступа на сайт олимпиады. Логинятся и читают задания на сайте. На сайт же и загружают файлы с решениями. Решение - скомпилированный исполнимый файл текстовый файл с кодом.
Решением задачи является программа, написанная на одном из следующих
языков программирования:
• Pascal
• C
• C++
• Java
• Python.
Кому интересно, при компиляции текста программы, которую участник сдает на проверку, жюри
использует вполне определенные командные строки для компиляции решений:
Компилятор | Командная строка |
GNU С 4.9 (MinGW) | gcc -O2 -х с –WI, --stack=67108864 <исходный файл> |
GNU C++ 4.9 (MinGW) |
g++ -O2 -х с++ –WI, --stack=67108864 <исходный файл> |
GNU C++11 4.9 (MinGW) |
g++ -O2 -х с++ -D_ _USE_MINGW_ANSI _STDIO=0- WI, --stack=67108864 --std=c++11 <исходный файл> |
GNU C++11 5 (Linux) |
g++ -O2 --std=c++11 -static <исходный файл> |
Visual C++ 2015 | cl /F67108864/O2 /EHs /TP <исходный файл> |
Java | javac <исходный файл> |
Free Pascal | fpc <исходный файл> |
Pascal ABC.Net 2.1 | pabcnetcc <исходный файл> |
Python 3.5 | python <исходный файл> |
Когда-то (лет 5-6 назад), школьники после завершения олимпиады оставляли за собой файлы с кодом и листочки с кодом и блок-схемами. Ученики расходились, а толпа коллег-информатиков начинала коллегиально проверять решения и раздавать баллы. Бывали жаркие дискуссии)
Теперь ничего интересного. Никаких интриг и мордобоя. Решения участников проверяются в 2 этапа:
- сначала бездушная система берет загруженную учеником прогу и подсовывает ей файлы с исходными данными. Решения системе разумется известны так что если творение шкодера вдруг выдает именно верное решение, то участнику начисляется БАЛЛ. Совершенно автоматически.
- набравшие баллы программы проверяются живыми экспертами
Вот так.
Скучно теперь стало на олимпиадах. В нашем муниципальном образовании - всего 58 школ. Из них - 34 в самом городе. Остальные - в окрестных поселках. Было врем, городские и деревенские олимпиады проводились отдельно. Теперь - все вместе собираемся в городе. В этом году из 24 сельских школ заявились на муниципальный этап всего 4 школы. Приехали фактически - только из 3.
Собственно, школьники никогда массово не осваивали программирование. В былые времена, когда преподаватели информатики сами проверяли работы, то балл ученику могли начислить просто за правильную структуру программы или за корректное применение команд. Вобщем, какие-то баллы кидали даже за неработающие алгоритмы и программы. Работающие проги встречались очень редко. Прога с реально правильным алгоритмом решения - это было уже призовое место как минимум.
Вот тогда было на олимпиаде общение с коллегами. Информатики района знали друг друга. Были вечные соперники принципиальные) Пока дети решали, коллеги обменивались опытом и точили кинжалы. Живое душевное общение вобщем) Преподавателей, которые реально умели программировать, всегда было очень мало, единицы, и они всегда охотно делились опытом и старались мотивировать остальных.
Как автоматизировали это дело, так общение окончательно рухнуло. Быстро выяснилось, что проводить отдельную олимпиаду для сельских школ - нецелесообразно. Слишком мало решений проходило фильтр автоматизированной проверки. Со всей определенностью вылезло - программировать в школах дети не умеют.
При работе с автоматизированной системой есть объективная сложность - участнику совершенно недостаточно найти правильный алгоритм решения задачи. Для того, чтоб система приняла решение, необходимо в программе ПРАВИЛЬНО реализовать ввод-вывод информации через текстовые файлы. Это - сама по себе отдельная задача с неочевидными решениями. Вот и получилось, если ранее ученики могли хотя бы алгоритм реализовать внятно и это решение могло быть оценено комиссией живых проверяющих преподавателей, то теперь ученику просто реализовать алгоритм - уже недостаточно. Вот и пошел дополнительный отсев деток без устойчивых навыков практического программирования.
Сам курс алгоритмизации и программирования в базовом курсе основного общего образования - одна четверть во втором полугодии 9го класса. Подготовить олимпиадника просто на уроках в школе - нереально от слова совсем. Потенциального олимпиадника по информатике надо выявлять как можно ранее, затаскивать на кружок и держать под контролем круглый год. И тогда успех не гарантирован.
Есть еще проблема. В школах преподаватели информатики просто сами не умеют программировать. Даже на простейшем уровне. И решения этой проблемы - не особенно видно. Я получил диплом педагога всего 3 года назад. В моей группе заочников из будущих преподавателей информатики умел программировать только один человек. Можно наверно порадоваться, что в школу работать все равно никто не отправился.
Хорошо, что в наше время талантливым деткам есть возможность раскрыться и реализоваться даже без толкового преподавателя. Самый лучший в программировании школьник который мне встречался, сам освоил Си. Без какой-либо помощи со стороны преподавателя.
Я сам толпу кружкистов своих первым делом отправляю на сайт Информатикс - сайт дистанционной подготовки к олимпиадам по информатике. Кто сможет разобраться и начать продвигаться там, тот реально чего-то стоит и с таким кадром надо работать точно.
Президент наш в последнее время неоднократно и определенно провозглашал курс на развитие информационного общества. Заявлял, что нам нужны хорошие программисты в товарных количествах.
Задача Президентом сформулирована, но вот решение наталкивается на проблемы еще на школьном этапе.
Комментарии
Можно, сделать стандартные блоки для вывода.
а также можно написать часть программы, которая отвечает за вывод. И просить писать алгоритм или функцию, которая возвращает массив или объект.
Отлично на openedu.ru,в курсе про алгоритмы, было реализовано
Да, верно. Решение типовое. Но и его надо ученику понять и в голову уместить.
Они ведь с интернетом и примерами решают, а как только инет обрубается, так и структуру программу забыть могут)
Язык программирования это такой же язык как и любой естественный, для того чтобы писать программы на нем нужно иметь потребность в этой деятельности.. Ровно так же как нельзя выучить иностранный язык зубрежкой, на пару месяцев таких "знаний" хватит, а потом начинается деградация знания с экспоненциальной скоростью. Но это естественный язык да еще и в период близкий к "лингвистическому взрыву" школьника. Ведь его окончание приходится на 10 -11 лет. Все рядом. А программирование это нечто другое, чуждое растущему мозгу (не все левополушарные формалисты), тут зубрежкой делу не поможешь!
По этой причине школьнику для того чтобы программировать надо иметь потребность в программировании. А вот ее никакой обыкновенный учитель не даст, и обыкновенная школа тоже, и обыкновенная система образования. Вот если бы для обучения в школе требовалось бы программировать чтобы учить другие дисциплины! Это могло бы помочь.
А так забивать голову мусором тому кому это в принципе не надо - это вредительство! Говорю как инженер-программист с пятнадцатилетним стажем.
И еще, очень сомнительной кажется идея решать задачи по программированию не на псевдокоде, а на реальных языках. Вот уж точно разбазаривание ресурсов обучающихся впустую! При той скорости с которой эволюционируют реальные языки программирования. Учить то чего завтра уже не будет - это безобразие!
Язык программирования всё-таки не естественный язык в том, что знак-слово в нем не меняет смысл в зависимости от контекста. Те for- всегда означает начало цикла, а if означает начало некоторого условия.
К сожалению, иностранный язык учится только зубрежкой, необходимо наработать некоторый минимум повторяя и обыгрывая известные словосочетаниям и слова. Те это даст вам возможность говорить и выражать мысли, конечно вы не сможете через зубрежку понять культуру)
на самом деле, вообще все, что мало-мальски относится к науке, контр-интуитивно) и учеба несколько контр-интуитивна. Нет ничего естественного в искусственных теориях, которые ре-интерпретируют факты)
но ставя в зависимость от прагаммирования знания в других областях, а также успехи в других областях, мы можем закрыть двери для знаний в других областях для тех, кто в какой-то момент не понял программирование. И все учатся в разном темпе. Не очень правильно ставить зависимость успехов во всех областях к знанию программирования.
А чем псевдокод отличается от любого языка программирования? Синтаксис псевдокода тоже нужно учить. А проверять его сложнее. Его не отправишь на исполнение. И не проверишь правильность решения, а будешь ждать учителя.
Вот поплюсую и присоединюсь к мнению.
Школьные основы программирования - это ввод-вывод, условие и цикл. Суперцель школьного курса - чтоб школьники уяснили саму концепцию, сам смысл работы этих конструкций. Это ведь не так то и просто.
И как в таком случае следует называть все попытки засовывания туда объектной модели в отрыве от опытной базы, породившей её?
Пра-а-авильно. Вредительство!
Вредность объектной модели не означает вредность преподавания программирования вообще. В школах используют в первую очередь императивный и процедурный подходы, а сосредотачиваются прежде всего на языковых конструкциях и алгоритмах.
Мне тогда интересно, а как надо "всовывать" объектную модель правильно?
Я и самого всовывания объектной модели не наблюдаю. Может и интересно было бы. Но куда школьному преподу втыкать функциональную модель или объектную если времени только по базовым конструкциям есть проскакать.
Кто из комментаторов полистал учебники базового уровня для 7-9 классов?
Согласен с комментатором выше про зубрежку синтаксиса... Для проверки его есть компиляторы/интерпретаторы... И те меняются чуть ли не с каждым новым проектом... Если уж на то пошло и нужен автоматический контроль результатов - предоставьте также автоматическую проверку синтаксиса и стандартизированный фреймворк для ввода вывода. Все что между и будет достижениями ученика.
Я как инженер программист - не помню всех нюансов всех тех языков программирования на которых я что то делал в прошлом - мне это банально было не критично.
Не…
Там всё куда веселее…
Я представлял процесс запуска проверяющим hardened-бинарника на «обыкновенной» системе (для низведения проверяющих полезен обратный финт: попытка запуска «обычных» бинарников в hardened или хотя бы no-multilib окружении).
☺
Считаю вредительством мучить детей псевдокодом. Дети должны прежде всего видеть практический результат своей работы. Только тогда есть вероятность, что они увидят смысл в этом занятии и будут заниматься самостоятельно. А когда в роли парсера будет выступать учитель, то во-первых ни о каких практических результатах речи и быть не может, во-вторых, ученик не сможет зниматься программированием на псевдокоде самостоятельно - нужен учитель, который будет читать этот псевдокод и оценивать, в-третьих, программирование - это не литература, тут нужны прежде всего объективные оценки, а только потом можно учитывать соображения учителя. Если программа не работает, то не имеет значения, написана ли она по всем канонам. Только если программа заработала, тогда можно послушать рекомендации учителя, как можно улучшить программу. В программировании очень удачно то, что есть возможность объективно оценить результат и ученик не будет считать, что учитель его специально завалил и подтянул своего любимчика.
При той скорости, с какой эволюционируют реальные языки программирования, нужно будет учить и учить новые языки постоянно. Отказ от изучения одного реального языка никак не облегчит освоение последующих реальных языков. А вот один освоенный реальный язык даст возможность значительно легче осваивать последующие.
Учить то, чего никогда по-настоящему не было - вот настоящее безобразие.
А всё почему?
Всё от того, что Культура работы с классической справочной подсистемой утрачена уже на уровне педагога.
Мелко) Судя по всему, оная Культура утрачена на уровне разработчиков учебников, учебных программ и самих федеральных образовательных стандартов)
Вы развивайте мысль, пожалуйста. Интересно же в самом деле.
Нельзя утратить то, чем они никогда не владели.
А поговорить?
Угу. Может еще и поцеловать? )
Второе - фактически полное....
К сожалению, соглашусь.
Эта проблема плохо озвучена.
Человек, который умеет программировать, скорее всего может с успехом найти работу с зарплатой в разы превышающей зарплату школьного преподавателя.
Иными словами нет не только мотивации учащихся, но и мотивации преподавателей.
Мотивация у преподавателей без сомнения есть. Но она не связана с зарплатой.
Полагаете, задача дрессировки погромистов (особливо — морских свинок) ограничивается школой?
Быдлокодеров дрессировать вовсе не надо. Они сами появляются.
Воспитание адекватного кодера, как и любого профессионала, начинается с младенческого возраста. И не заканчивается никогда
Было дело, в конце 90-х, даже места какие-то занимал. Задания ограничивались созданием алгоритма(блок-схемы), без реализации в коде.
Аналогично.
Отдельные редкие хакеры писали на Бейсике
никакие мы не хакеры, мы просто умели правильно включить ес1840
Это потому, что тогда были задания действительно по информатике. А нонче - это всё от информатики безнадежно далеко.. При чем тут информатика к программе на паскале - совершенно непонятно.
Собсна, я хоть и с 1997 года ни разу не, но облечь блок-схему в строки проблем не составляло, так штааа....нмв, алгоритм - 80 процентов решения.
Вы знаете, я в программировании с 91 года где-то, ну, если серьезно брать, а не детские поделки. Боюсь, что забыл все эти условные обозначения на блок-схемах ) Более того, они мне ни разу в жизни не пригодились. А вот матричное исчисление, векторная математика, геометрия и интегралы - постоянно нужны.
Блок-схема для простоты визуализации решения, только и всего. Начальный этап, Прикладная математика будет позже.
Мне проще по коду сразу алгоритм читать.. А вот с прикладной математикой у молодёжи большие проблемы. Они не понимают, как использовать знания, полученные в школе-институте. Они не понимают, как работают вектора, как обсчитать движение под воздействием сил без участия физического движка. Неоднократно на форумах читаю вопросы о "начальной точке вектора", что в компьютерной графике есть дичь, или о "силе, приложенной к вектору",
Weard, полностью с вами согласен. Мой опыт работы в различных проектах говорит то же самое.. Прикладная математика это альфа и омега! Большинство думает, что кодирование это синоним программирования и даже не представляет что такое разработка ПО. boost и stl - тяп-ляп и в продакшн..
Хе, хе, ну дык, понимание, что ВО учит работать с литературой, а не только диплом, дано не всем.
Блок-схемы к реальному программированию отношения почти не имеют. Достаточно представить, что в современном программировании данные и код могут смешиваться в произвольных сочетаниях. Например, объект - это данные с функциями для манипуляции этими данными. Замыкания - это экземпляр данных, который формируется в момент вызова функции и становится связанным с процессом её выполнения. Лямбда-функции - это код, который можно поместить в переменную. На блок-схемах всё это адекватно представить практически невозможно.
Фредерик Брукс в знаменитой книге "Мифический человеко-месяц" писал:
Как бывший школьник-олимпиадник отвечу: да, олимпиада по программированию. И да, нужно не только придумать алгоритм решения задачи, но и его реализовать. Но блин, вы уже не на листочке пишете программу, и не в блокноте! У вас есть IDE, вы можете программу скомпилировать и отладить. Или cin << a; cout >> b; уже так сложно запомнить?
cin << a; cout >> b; - это уже не катит.
Исходные данные - из текстового файла. Матрицы - тоже.
Ответ - в текстовый файл строго заданной структуры.
Не преувеличивайте, пожалуйста.
Данные из текстового файла в задачах - это набор чисел или строк. Не вижу ничего сложного в том, чтобы эти числа считать в правильном порядке.
"Текстовый файл строго заданной структуры" - аналогично, вывести числа/строки ответа в заданном порядке. Причем в большинстве случаев ответ это одно число или же YES/NO на первой строке и число на второй.
Все верно. Типовая задача. Ничего сложного.
Если понять)
Чтоб врубиться в эту простоту школьник либо должен сам сильно захотеть, либо его должен научить преподаватель. Вы Си в школе сами освоили? Или вас таки научили? Мне просто интересно. И сколько человек в Вашем классе так же смогли врубиться хотя бы в смысл работы какого-нибудь циклического оператора.
Программирование - это таки набор достаточно непростых концепций. Понять их их - большой труд и отличное достижение.
Я к сожалению не показатель, т.к. физматлицей. Врубились все.
Очень талантливые ребята появляются и в обычных классах)
Если бы в обычных школах было больше компетентных преподавателей информатики, то выявлять самородков и помогать им развиться было бы гораздо проще. А пока, у меня самый лучший в программировании ученик был - появился в 11 классе и уже сам освоил Си. В качестве разминки на кружке сделал крестики-нолики с выбирающим оптимальные ходы компьютером. Учить его в школе было практически нечему.
Это, к сожжалению, касается не только информатики. Мотивированных и компетентных учителей в школе очень тяжело найти...Если кто-то хочет идти на олимпиаду - школьный учитель, обычно, ничем не поможет... А еще есть момент, что на олимпиаду не всегда берут самых талантливых, а тех, за которых договорились (с удивлением обнаружили в этом году, что за старшего (10 класс) нужно было договариваться, чтобы его взяли на олимпиаду по математике, хотя в прошлом году такого не было.. младшего (6 класс) взяли без договоренностей, но школа другая).
Интересно. Хотя, ожидаемо. Призовое место на олимиаде - хороший бонус при поступлении в ВУЗ. Да еще и на бюджетное место.
Вот только какой смысл преподавателю отправлять более слабого ученика на олимпиаду... Это выстрел себе в ногу.
И что там кроме этого надо? Для всего, что вы перечислили, максимум что может понадобиться - это getline.
+1
скажу больше, 20 лет назад уже приходили к идее "ввод с файла", "вывод в файл" - хотя бы для первичной фильтрации. Хотя за алгоритмы и хорошее форматирование бывало тоже накидывали.
В списке смущает отсутствие JavaScript, хотя он сейчас на пике популярности. FPC/PascalABC.Net - вообще узко нишевое и на любителя. Начинать с Паскаля это, по мне, неплохо, но вот на олимпиады с ним идти - не айс.
А что есть в JS для этого? Какие-то библиотеки из node тащить? Какие? В том же Python numpy и scipy - перебор.
Джаваскрипт - это всё-таки веб язык, а задачи предусматривают ввод-вывод через файл или stdin/stdout. К тому же там нет стандартной библиотеки, как в C++ или Java. А паскаль - это типа legacy-экзотика ))
Самые быстрые решения пишутся на FreePascal, однако
Откуда дровишки?
На муниципальном уровне обычно не дают жёстко ограниченные по скорости задачи - максимум что-нибудь за квадрат. А писать регион и выше на паскале - это, извините, извращение )))
Я не про решения на скорую руку, а про те, что основательно делаются на онлайн тестирующих системах во время тренировок. И максимальная скорость получается из-за ввода-вывода, встроенного в язык и оптимизируемого компилятором. Там этот момент очень хорошо проработан. Плюс быстрая инициализация/старт программы.
По собственному опыту участия в региональных олимпиадах и выше - задания формулируются так, чтобы ввод и вывод максимально не влиял на решение задачи. Значительная часть задач для своего решения редко требует более 10 чисел на ввод и более 5 на вывод.
Не скажите. Часто 1e5 данных, для решения за nlogn. Но вход-выход обычно действительно заморачиваться не надо.
Страницы