Различия между версиями 2 и 3
Версия 2 от 2022-10-01 21:14:06
Размер: 10997
Редактор: FrBrGeorge
Комментарий:
Версия 3 от 2022-10-01 21:15:16
Размер: 10996
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 28: Строка 28:
  можно перейти на страницу с полной формулировкой задачи  можно перейти на страницу с полной формулировкой задачи

Домашняя работа по курсу

  • Домашняя работа нужна в первую очередь для того, чтобы доказать себе и экзаменатору, что ты освоил тему.
  • Задача считается сданной в срок, если в ejudge (см. ниже) зафиксирована посылка решения, успешно принятого системой (результат OK) до наступления срока сдачи.
  • Количество (точнее, процент от общего числа) домашних задач, сданных в срок, формируют оценку автоматом, которую можно исправить на экзамене (в обе стороны ☺).
  • Решения, скопированные друг у друга, считаются отсутствующими.

  • Если решение не проходит проверку, придумайте побольше своих тестов. Напишите генератор входных данных (модуль random вам в помощь).

  • Домашняя работа — не олимпиада. Если что-то не получается, всегда можно спросить (FrBrGeorge, знакомого питониста).

Как сдавать домашнюю работу

  1. Зарегистрироваться на факультетском Ejudge

    • По этой же ссылке заполнить графу «Имя» (там должны быть имя и группа, кому оценку ставить)
    • <!> ВНИМАНИЕ! Зарегистрированные пользователи заходят тут

  2. Выбрать 230-й «турнир» (UNИX Python 2022)
    • Возможно, придётся пойти по ссылке «Confirm registration» («Подтвердить регистрацию»)
    • Возможно, придётся пойти по ссылке «Participate» («Участвовать»)
  3. Выбрать соответствующую задачку
  4. Загрузить решение
    • Прежде, чем загружать решение, убедитесь, что оно правильное. Не надо вместо этого делать много различных вариантов решения в надежде, что какой-то один всё-таки пройдёт тесты.
    • Если возникают вопросы — спрашивайте, для этого есть и интерфейс eJudge, и группа в Telegram
  5. Дождаться конца проверки (как правило, несколько секунд) и обновить страницу браузера

О формулировках задач

  • Формулировку Д/З не стоит смотреть непосредственно на EJudge: во-первых, её там может не быть, во-вторых, возможности форматирования та ограничены, в третьих, условия всё равно копируются туда из лекций
  • Мало того, формулировки иногда уточняются и исправляются — только здесь!

  • Из краткой формулировки задачи непосредственно в лекции по второй ссылке вида
    • [WWW]EJudge

      : ИмяЗадачи «'Название задачи'»

    можно перейти на страницу с полной формулировкой задачи
  • На странице с формулировкой часто встречаются пояснения и подсказки
  • На странице с формулировкой могут быть т. н. «спойлеры» — обычно явное описание алгоритма решения или ссылка на соответствующую статью. Спойлеры изначально скрыты, они появятся, если нажать ссылку «Комментарии» в шапке страницы.

  • Если вопросы всё ещё остались, задавайте их в чате UNИX.

Как оформлять решение

В Д/З могут встречаться несколько типов заданий.

Задача типа «написать программу»

По умолчанию, т. е. если иное не указано отдельно:

  • программа читает со стандартного ввода и выводит на стандартный вывод
  • вводимые данные корректны
  • Тесты представляют собой наборы входных данных и соответствующие им наборы выходных.
  • Если ваше решение
    • останавливается с ошибкой
    • работает слишком долго
    • или выдаёт не такие выходные данные, как в тесте

    • тест считается не пройденным.

⇒ Для ввода можно пользоваться input() (чаще даже eval(input())) без строки-подсказки, а для вывода — print(). Ещё раз: никаких переговоров с роботом — только ввод входных данных и вывод выходных, иначе программа не пройдёт тест!

Задача типа «написать функцию»

  • Решение — фрагмент программы, реализующий часть её функциональности (как правило — определение классов или функций), который ничего не вводит и не выводит сам.

  • Во время проверки к решению в конец приписывается тестирующий код

  • Тест — это также фрагмент программы, который использует определённые в решении объекты

  • Полученная программа вводит и исполняет тест

  • Вывод теста сравнивается с соответствующим эталоном

Алгоритм сдачи такого задания:

  • Пишете программу, содержащую и требуемую функцию или класс, и тест
  • Отлаживаете её (возможно, меняя тест на другие)
  • Удаляете тест, оставляя только функцию или класс
  • Загружаете в EJudge

Пример решения задачи «написать функцию»

Написать функцию gt12(), которая принимает два заведомо сравнимых параметра и возвращает 1, если первый параметр больше второго, и 2 в противном случае:

  • Решение:
    •    1 def gt12(a, b):
         2     return 1 if a>b else 2
      
  • Ввод (он же тест):
    •    1 print(gt12(12, 45))
         2 print(gt12("100500", "стопицот"))
         3 print(gt12(600, 12.34))
      
  • Вывод (он же эталон):
    • 2
      2
      1

Пример решения задачи «написать класс»

Написать класс C, который ничего не делает:

  • Решение:
    •    1 class C:
         2     pass
      
  • Тест (он же ввод):
    •    1 print(C)
         2 a,b = C(),C()
         3 print(a is b)
      
  • Эталон (он же вывод):
    •    1 <class '__main__.C'>
         2 False
      
  • Тест может включать в себя проверку на то, что в классе нет полей, кроме тех, что указаны в условии, и вообще как-то исследовать ваш класс.

Задача типа «написать модуль»

  • Решение — программа-модуль, которую предполагается импортировать и использовать определённые в ней объекты (функции, классы и т. п.)
  • Решение может содержать раздел

    •    1 
         2 if __name__ == "__main__":
         3 
      
      для самостоятельного запуска (при тестировании не используется)
  • Тесты представляют собой программы, которые импортируют модуль-решение под именем mod и задействуют определённые в нём объекты. Для каждой такой программы есть соответствующий файл с выходными данными, с которыми сравнивается результат её работы.

  • Тест может включать в себя проверку на то, что в модуле нет имён, кроме тех, что указаны в условии и разные другие проверки

Пример задачи: Написать модуль, в котором будет присутствовать целочисленный объект Count, изначально равный 0, и функция incr(level), увеличивающая Count на число level

Модуль-решение:

   1 Count = 0
   2 
   3 def incr(level):
   4     global Count
   5     Count += level

Тест:

   1 print(mod.Count)
   2 mod.incr(100)
   3 print(mod.Count)
   4 # Список неспециальных объектов модуля
   5 print(*sorted(s for s in dir(mod) if not s.startswith("_")))

Вывод:

0
100
Count incr

Тестирующая программа

LecturesCMC/PythonIntro2022/RulesHomework (последним исправлял пользователь FrBrGeorge 2022-10-17 11:18:30)