Домашняя работа по курсу
- Домашняя работа нужна в первую очередь для того, чтобы доказать себе и экзаменатору, что ты освоил тему.
 - Задача считается сданной в срок, если в ejudge (см. ниже) зафиксирована посылка решения, успешно принятого системой (результат OK) до наступления срока сдачи.
 - Количество (точнее, процент от общего числа) домашних задач, сданных в срок, формируют оценку автоматом, которую можно исправить на экзамене (в обе стороны ☺).
 Решения, скопированные друг у друга, считаются отсутствующими.
Если решение не проходит проверку, придумайте побольше своих тестов. Напишите генератор входных данных (модуль random вам в помощь).
Домашняя работа — не олимпиада. Если что-то не получается, всегда можно спросить (FrBrGeorge, знакомого питониста).
Как сдавать домашнюю работу
Зарегистрироваться на факультетском Ejudge
- По этой же ссылке заполнить графу «Имя» (там должны быть имя и группа, кому оценку ставить)
 
 ВНИМАНИЕ! Зарегистрированные пользователи заходят тут 
- Выбрать 230-й «турнир» (UNИX Python 2022) 
- Возможно, придётся пойти по ссылке «Confirm registration» («Подтвердить регистрацию»)
 - Возможно, придётся пойти по ссылке «Participate» («Участвовать»)
 
 - Выбрать соответствующую задачку
 - Загрузить решение 
- Прежде, чем загружать решение, убедитесь, что оно правильное. Не надо вместо этого делать много различных вариантов решения в надежде, что какой-то один всё-таки пройдёт тесты.
 - Если возникают вопросы — спрашивайте, для этого есть и интерфейс eJudge, и группа в Telegram
 
 - Дождаться конца проверки (как правило, несколько секунд) и обновить страницу браузера
 
О дедлайнах
Домашние задания посвящены теме лекции. Более того, на следующей лекции предполагается, что Д/З уже выполнено, и слушатели достаточно хорошо себе представляют материал прошлой недели: потыкали в него руками, порешали задачи, спросили и узнали всё, что было непонятно и т. п.
Поэтому дедлайн по Д/З — шесть дней со дня лекции. Д/З, сданное в день следующей лекции, считается просроченным на неделю. Тем не менее задание выгоднее сдать невовремя, чем вообще не делать.
В течение следующей недели (до очередной лекции) просроченное задание оценивается в 50%
После этого — в 25%
Стоит помнить, что «решить все задания в последний день» нельзя как чисто физиологически, так и формально — потому что баллов для участия в экзамене вам не хватит.
О формулировках задач
- Формулировку Д/З не стоит смотреть непосредственно на EJudge: во-первых, её там может не быть, во-вторых, возможности форматирования та ограничены, в третьих, условия всё равно копируются туда из лекций
 Мало того, формулировки иногда уточняются и исправляются — только здесь!
- Из краткой формулировки задачи непосредственно в лекции по второй ссылке вида 
EJudge: ИмяЗадачи «'Название задачи'» 
 - На странице с формулировкой часто встречаются пояснения и подсказки
 На странице с формулировкой могут быть т. н. «спойлеры» — обычно явное описание алгоритма решения или ссылка на соответствующую статью. Спойлеры изначально скрыты, они появятся, если нажать ссылку «Комментарии» в шапке страницы.
- Если вопросы всё ещё остались, задавайте их в чате UNИX.
 
Как оформлять решение
В Д/З могут встречаться несколько типов заданий.
Задача типа «написать программу»
По умолчанию, т. е. если иное не указано отдельно:
- программа читает со стандартного ввода и выводит на стандартный вывод
 - вводимые данные корректны
 - Тесты представляют собой наборы входных данных и соответствующие им наборы выходных.
 - Если ваше решение  
- останавливается с ошибкой
 - работает слишком долго
 или выдаёт не такие выходные данные, как в тесте
тест считается не пройденным.
 
⇒ Для ввода можно пользоваться input() (чаще даже eval(input())) без строки-подсказки, а для вывода — print(). Ещё раз: никаких переговоров с роботом — только ввод входных данных и вывод выходных, иначе программа не пройдёт тест!
Задача типа «написать функцию»
Решение — фрагмент программы, реализующий часть её функциональности (как правило — определение классов или функций), который ничего не вводит и не выводит сам.
Во время проверки к решению в конец приписывается тестирующий код
Тест — это также фрагмент программы, который использует определённые в решении объекты
Полученная программа вводит и исполняет тест
- Вывод теста сравнивается с соответствующим эталоном
 
Алгоритм сдачи такого задания:
- Пишете программу, содержащую и требуемую функцию или класс, и тест
 - Отлаживаете её (возможно, меняя тест на другие)
 - Удаляете тест, оставляя только функцию или класс
 - Загружаете в EJudge
 
Пример решения задачи «написать функцию»
Написать функцию gt12(), которая принимает два заведомо сравнимых параметра и возвращает 1, если первый параметр больше второго, и 2 в противном случае:
- Решение: 
 - Ввод (он же тест): 
 - Вывод (он же эталон): 
2 2 1
 
Пример решения задачи «написать класс»
Написать класс C, который ничего не делает:
- Решение: 
 - Тест (он же ввод): 
 - Эталон (он же вывод):  
 Тест может включать в себя проверку на то, что в классе нет полей, кроме тех, что указаны в условии, и вообще как-то исследовать ваш класс.
Задача типа «написать модуль»
- Решение — программа-модуль, которую предполагается импортировать и использовать определённые в ней объекты (функции, классы и т. п.)
 Решение может содержать раздел
- для самостоятельного запуска (при тестировании не используется)
 
Тесты представляют собой программы, которые импортируют модуль-решение под именем mod и задействуют определённые в нём объекты. Для каждой такой программы есть соответствующий файл с выходными данными, с которыми сравнивается результат её работы.
Тест может включать в себя проверку на то, что в модуле нет имён, кроме тех, что указаны в условии и разные другие проверки
Пример задачи: Написать модуль, в котором будет присутствовать целочисленный объект Count, изначально равный 0, и функция incr(level), увеличивающая Count на число level
Модуль-решение:
Тест:
Вывод:
0 100 Count incr
