С++, 1 курс, 3 группа, 2 семестр, 2016/17 — различия между версиями

Материал из SEWiki
Перейти к: навигация, поиск
(Лабораторная 11 (I/O и полиморфизм))
(Лабораторная 11 (I/O и полиморфизм))
Строка 81: Строка 81:
 
#* -1 балл за серьёзное несоответствие "традициям" языка C++ или за неожиданную логику программы (нумерация массивов с единицы, реализация больших нешаблонных методов в header'ах, лишний код).
 
#* -1 балл за серьёзное несоответствие "традициям" языка C++ или за неожиданную логику программы (нумерация массивов с единицы, реализация больших нешаблонных методов в header'ах, лишний код).
  
28.02.2017 было произведено перемасштабирование: если баллы за пункты равнялись <math>a</math>, <math>b</math>, <math>c</math>, <math>d</math>, то новый балл равен <math>\frac 4 3 a + \frac 4 2 b + \frac 1 2 c + \frac 1 3 d</math>. Суммарный балл округляется до ближайшего целого, 0.5 округляется вверх.
+
28.02.2017 было произведено перемасштабирование: если баллы за пункты равнялись <math>a</math>, <math>b</math>, <math>c</math>, <math>d</math>, то новый балл равен <math>\frac 4 3 a + \frac 4 2 b + \frac 1 2 c + \frac 1 3 d</math>. Баллы за каждый пункт округляются до одного знака после запятой. После этого суммарный балл округляется до ближайшего целого, 0.5 округляется вверх.

Версия 11:47, 28 февраля 2017

Страница курса.

Преподаватель: Егор Суворов (egor_suvorov@mail.ru, vk.com/egor.suvorov)

Префикс в теме письма: [C++TA]

Вопросы можно писать либо в ВК, либо на почту. В ВК быстрее отвечаю. Если вопросов много или они требуют вдумчивого ответа - лучше на почту.

Есть чат в ВК, там публикуются ответы на часто задаваемые вопросы, комментарии по лаборатным/домашкам и прочее. Также могут появляться общие комментарии по программированию и плюсам в частности. Я их буду время от времени переносить в раздел ниже, если заметили, что чего-то не хватает - перенесите. Копировать мои сообщения самостоятельно не стоит.

Общие знания

Deadline

По поводу deadline и попыток сдачи *лабораторных* (для домашек будут особенности):

  1. Дедлайн железобетонный в 23:59, если иное не объявлено в чатике. Если проверяю до дедлайна - беру последнюю версию. После после - последнюю, которая закоммичена до 23:59. Проверяйте, что все файлы добавились в репозиторий.
  2. Проверяю по возможности, одна попытка есть всегда, если успеваете отреагировать на замечания до дедлайна - то получается две, три, и так далее.
  3. К сожалению, пока что проверяю только в воскресенье днём-вечером, так что скорее попытка одна. Возможно, в будущем это изменится.
  4. Жёстких ограничений на количество попыток сдачи нет, но спамить не стоит. Процесс сдачи итеративный, но не интерактивный.
  5. Вы можете задавать вопросы в течение недели по любой теме: теория, "как правильно", "можно ли сделать так", "почему вот такой вот код на таком тесте выдаёт X, а не Y" (обязательно наличие кода и каких-то подробностей вроде "вот отчёт Valgrind и тест из одной строчки, с int работает, с Product - нет" - как на StackOverflow), "есть ли бросающиеся в глаза стилистические замечания?"
  6. Про проверку стиля в течение недели: не обещаю, что буду проверять так же внимательно, как и на "реальной" попытке сдачи. Можно присылать и куски кода, и общие вопросы ("куда класть тесты для вектора"), и весь проект целиком. Чем меньше кусок кода - тем быстрее и качественнее получите ответ.
  7. Для второй попытки сдачи требуется переоткрыть карточку в Trac: состояние reopened, "ожидает проверки", версия - 2.0 или 3.0.

Полезные правила

  • Правило трёх/пяти. На && пока забиваем - это move-семантика, появилась в C++11, будет в конце семестра, там весело (теоретически похоже на ад, если стандарт читать, на практике применять просто). Пока что просто игнорируйте соответствующий конструктор и оператор.
  • delete и delete[] *корректно* разбирают случай "аргумент - NULL", просто ничего не делает. Дополнительные проверки не нужны.

Полезные утилиты

  • Для автоматического форматирования программ на C++ можно пользоваться либо какой-нибудь IDE (я верю, что Visual Studio, Eclipse, NetBeans, CodeBlocks и CLion все умеют форматировать; если не так - поправьте), либо консольными утилитами вроде clang-format или astyle. В качестве референсного можете использовать Google Code Style.
  • gcov может показывать покрытие строчек кода тестами. Документация тут, читать пример со слов "Running the program will cause profile output to be generated.". Будьте осторожны с оптимизациями - если функция заинлайнена, то она в покрытии не показывается.

Примерные правила оценки лабораторных

Это больше руководство для меня и контрольные точки, чем чёткие правила; баллы могут сниматься и по другим причинам. Апелляции подавать можно и нужно - я мог что-то не заметить (например, что вы что-то на самом деле сделали, или что это ещё не проходили, или что в заданее не требуется), мог сделать слишком жёсткую систему оценки (тогда мы обсудим это с коллегами). Если что-то непонятно - задавайте вопросы.

Лабораторная 12 (вектора)

10 баллов распределяются так:

  1. За прохождение тестов и Valgrind (от 0 до 3 баллов):
    • 0 баллов, если программа не компилируется или падает.
    • 1 балл, если падает при запуске ваших тестов с каким-нибудь типом, кроме int и Product (удовлетворяющим, тем не менее, всем разумным требованиям).
    • 2 балла, если ваша реализация my_vector не прошла наши тесты.
    • 3 балла, если все тесты пройдены.
    • -1 балл, если есть утечки памяти, но нет более страшных проблем.
    • -2 балла, если есть undefined behavior вроде чтения из неинициализированной памяти (тогда -1 балл за утечки памяти не ставится).
  2. За тесты:
    • 2 балл, если покрыты все строчки.
    • 1 балл, если покрыты все методы.
    • 0 баллов иначе.
  3. За качество и корректность интерфейсов классов (включая поля) и функций:
    • 2 балла, если претензий нет.
    • 1 балл, если в целом идея верная, но сделали что-то не слишкои опасное (открыты лишние методы которые не могут нарушить инвариант, просто есть лишние методы), или что-что, что обнаружится на этапе компиляции (забыли const qualifier).
    • 0 баллов, если интерфейс опасен (забыли закрыть/реализовать оператор присваивания/конструктор копирования, открыт метод, который может нарушить инвариант, пространство имён после включения заголовка меняется слишком неожиданно).
  4. За качество и корректность реализации ставится от 0 до 3 баллов (субъективно). Снимаются за, например:
    • -1 балл, если есть обширное дублирование кода, от которого можно избавиться (например, функцией).
    • -1 балл за серьёзное несоответствие "традициям" языка C++ или за неожиданную логику программы.
    • -1 балл за сильную (не)асимптотическую неэффективность (например, лишние вызовы конструкторов и выделения памяти).

28.02.2017 было произведено перемасштабирование: если баллы за пункты равнялись , , , , и - флаг "верно ли, что " (0 или 1; т.е. покрыты ли все методы), а - флаг "верно ли, что " (0 или 1; т.е. покрыты ли все строчки), то новый балл равен . Суммарный балл округляется до ближайшего целого, 0.5 округляется вверх.

Лабораторная 11 (I/O и полиморфизм)

Итак, 10 баллов распределяются (до 27.02.2017) примерно следующим образом:

  1. За прохождение тестов:
    • 3 балла, если прошло всё и сразу.
    • 2 балла, если потребовалось косметически поменять формат вывода текста (вроде `SalaryManager` и `Salary Manager`).
    • 1 балл, если работает только текст (возможно, после косметических исправлений) или программа исходно не компилировалась.
    • 0 баллов, если не удалось простыми изменениями заставить заработать.
  2. За Valgrind:
    • 2 балла, если претензий нет.
    • 1 балл, если есть только утечки памяти.
    • 0 баллов, если есть undefined behavior вроде чтения из неинициализированной памяти.
  3. За качество и корректность интерфейсов классов (включая поля) и функций:
    • 2 балла, если претензий нет.
    • 1 балл, если в целом идея верная, но сделали что-то не слишкои опасное (открыты лишние методы), или что-что, что обнаружится на этапе компиляции (забыли const qualifier).
    • 0 баллов, если интерфейс опасен (невиртуальный деструктор, забыли закрыть оператор присваивания/конструктор копирования).
  4. За качество и корректность реализации ставится от 0 до 3 баллов и снимаются за:
    • -1 балл, если есть обширное дублирование кода, от которого можно избавиться (например, вынести в предка).
    • -1 балл за скрытые ограничения (вроде фиксированной максимальной длины строки).
    • -1 балл за серьёзное несоответствие "традициям" языка C++ или за неожиданную логику программы (нумерация массивов с единицы, реализация больших нешаблонных методов в header'ах, лишний код).

28.02.2017 было произведено перемасштабирование: если баллы за пункты равнялись , , , , то новый балл равен . Баллы за каждый пункт округляются до одного знака после запятой. После этого суммарный балл округляется до ближайшего целого, 0.5 округляется вверх.