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

Материал из SEWiki
Перейти к: навигация, поиск
(Примерные правила оценки лабораторных)
(Общие знания)
Строка 25: Строка 25:
 
* [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%BE_%D1%82%D1%80%D1%91%D1%85_(C%2B%2B_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) Правило трёх/пяти]. На <code>&&</code> пока забиваем - это move-семантика, появилась в C++11, будет в конце семестра, там весело (теоретически похоже на ад, если стандарт читать, на практике применять просто). Пока что просто игнорируйте соответствующий конструктор и оператор.
 
* [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%BE_%D1%82%D1%80%D1%91%D1%85_(C%2B%2B_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) Правило трёх/пяти]. На <code>&&</code> пока забиваем - это move-семантика, появилась в C++11, будет в конце семестра, там весело (теоретически похоже на ад, если стандарт читать, на практике применять просто). Пока что просто игнорируйте соответствующий конструктор и оператор.
 
* <code>delete</code> и <code>delete[]</code> *корректно* разбирают случай "аргумент - <code>NULL</code>", просто ничего не делает. Дополнительные проверки не нужны.
 
* <code>delete</code> и <code>delete[]</code> *корректно* разбирают случай "аргумент - <code>NULL</code>", просто ничего не делает. Дополнительные проверки не нужны.
 +
 +
=== Полезные утилиты ===
 +
 +
* Для автоматического форматирования программ на C++ можно пользоваться либо какой-нибудь IDE (я верю, что Visual Studio, Eclipse, NetBeans, CodeBlocks и CLion все умеют форматировать; если не так - поправьте), либо консольными утилитами вроде clang-format или astyle. В качестве референсного можете использовать Google Code Style.
 +
* gcov может показывать покрытие строчек кода тестами. Документация [https://gcc.gnu.org/onlinedocs/gcc/Invoking-Gcov.html#Invoking-Gcov тут], читать пример со слов "Running the program will cause profile output to be generated."
  
 
== Примерные правила оценки лабораторных ==
 
== Примерные правила оценки лабораторных ==

Версия 16:57, 26 февраля 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. Про проверку стиля в течение недели: не обещаю, что буду проверять так же внимательно, как и на "реальной" попытке сдачи. Можно присылать и куски кода, и общие вопросы ("куда класть тесты для вектора"), и весь проект целиком. Чем меньше кусок кода - тем быстрее и качественнее получите ответ.

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

  • Правило трёх/пяти. На && пока забиваем - это 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 балл за сильную (не)асимптотическую неэффективность (например, лишние вызовы конструкторов и выделения памяти).

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

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

  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'ах, лишний код).