Основы и методология программирования 2016/2017

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск

Материалы первого модуля (программирование на Python'е)

Второй и третий модули (программирование на C++)

Лекторы: А. И. Зобнин (С++), С. А. Объедков (алгоритмы).

Лекции: С++: понедельник, 10:30 - 11:50, ауд. 622;
Алгоритмы: четверг, 12:10-13:30, ауд. 622.

Текущие оценки

Экзаменационный контест по C++ пройдет в четверг, 30 марта.
Первая смена: начало в 10:30. Группы: 162 (ауд. 301), 164 (ауд. 501), 165 (ауд. 505).
Вторая смена: начало в 13:40. Группы: 166 (ауд. 301), 167 (ауд. 501), 168 (ауд. 505).


Контрольная работа по С++ состоится в понедельник, 20 марта с 10:30 до 11:50.
Студенты со своим ноутбуком могут писать контрольную работу в ауд. 622.
Студенты без своего ноутбука приглашаются в ауд. 503 (группы 162 и 164), 513 (группы 165 и 166) и 605 (группы 167 и 168).

Переписывание контрольных работ по C++ состоится в субботу, 25 марта с 13:40 до 15:00.
Студенты со своим ноутбуком приглашаются в ауд. 317.
Студенты без своего ноутбука приглашаются в ауд. 503.

Программа второго модуля

  1. Встроенные типы данных, std::string. Потоковый ввод-вывод. Условный оператор, циклы, switch.
  2. Шаблон std::vector. Структуры как POD-типы.
  3. Функции. Передача параметров по значению и по ссылке. Константность. Шаблоны функций.
  4. Контейнеры map/set, unordered_map/unordered_set. Range-based for.
  5. Алгоритмы стандартной библиотеки. Итераторы. Лямбда-функции.
  6. Битовые операции. Выражения. Приоритет операторов.
  7. Временные объекты. Время жизни объекта. Классы. Конструкторы, деструктор. Перегрузка операторов.
  8. Стек и динамическая память. Умные указатели: std::unique_ptr/std::shared_ptr.
  9. Исключения. Move-семантика.

Примерная программа третьего модуля

  1. Обработка исключений.
  2. Динамическая память. Указатели. Низкоуровневые массивы. С-строки.
  3. Идиома RAII. Контейнеры STL как воплощение идиомы RAII. Умные указатели unique_ptr/shared_ptr.
  4. Пример: собственная реализация unique_ptr. Move-семантика.
  5. Наследование. Полиморфизм. Виртуальные функции.
  6. Пример: собственная реализация контейнера vector.
  7. Единицы трансляции. Сборка программы.


Краткое содержание прочитанных лекций

31.10.2016. C++: ввод и вывод, условный оператор, циклы, оператор switch. [Код, написанный на лекции.]

07.11.2016. Векторы и строки. Структуры. [Код, написанный на лекции.]

10.11.2016. Константность. Ссылки. Функции. [Код, написанный на лекции.]

14.11.2016. Контейнеры map и unordered_map. [Код, написанный на лекции.]

21.11.2016. Контейнеры list и deque. Алгоритмы стандартной библиотеки. [Код, написанный на лекции.]

24.11.2016. Адаптеры stack, queue и priority_queue. Алгоритмы стандартной библиотеки (продолжение). [Код, написанный на лекции.]

28.11.2016. Битовые операции. Выражения, операторы. Перегрузка операторов. [Код, написанный на лекции.]

05.12.2016. Класс Date. Шаблонный класс Matrix. [Код, написанный на лекции.]

08.12.2016. Пример: итератор для класса Matrix (код будет выложен позже).

12.12.2016. Жизненный цикл объекта. Конструкторы, деструктор. Семантика перемещения. [Код, написанный на лекции.]

16.01.2017. Исключения (код будет выложен позже).

23.01.2017. Указатели. Динамическая память. Динамические массивы. Null-terminated strings. [Код, написанный на лекции.]

30.01.2017. Идиома RAII. [Код, написанный на лекции.]

06.02.2017. Умные указатели [Код, написанный на лекции.]

13.02.2017. Умные указатели (продолжение). Наследование [Код, написанный на лекции.]

20.02.2017. Виртуальные функции. [Код, написанный на лекции.]

Используемое ПО

Рекомендуется работать в Linux, использовать текстовый редактор Vim и компилятор clang 3.8.

На занятия можно приносить свой ноутбук.


Преподаватели и ассистенты

Подгруппа Преподаватель Учебные ассистенты Семинары Консультации
162-1 Алексей Зобнин Николай Вельдяйкин Пн, 9:00, 501; Чт, 9:00*, 301; Чт, 10:30, 412
162-2 Василий Жовнер Николай Вельдяйкин Пн, 9:00, 513; Чт, 9:00*, 10:30, 327
164-1 Федор Строк Вт, 15:10, 420; Чт, 9:00*, 10:30, 501
164-2 Илья Макаров Вт, 13:40, 420; Чт, 10:30*, 12:10, 416
165-1 Евгений Салагаев Валерия Бубнова Чт, 9:00*, 10:30, 503; Пт, 9:00, 412
165-2 Иван Фефер Валерия Бубнова Пн, 9:00, 503; Чт, 9:00*, 10:30, 505
166-1 Андрей Кондратьев Петр Жижин Пн, 9:00, 605; Чт, 9:00*, 10:30, 513
166-2 Михаил Густокашин Петр Жижин Пн, 13:40, 301; Чт, 10:30*, 12:10, 301 Чт. 13:40-16:40, 501
167-1 Алексей Умнов Никита Александров Ср, 12:10, 503 см. страницу семинаров
167-2 Дмитрий Вельтищев Никита Александров Пн, 9:00, 327; Чт, 9:00*, 10:30, 605
168-1 Михаил Дектярёв Александра Рябинина Пн, 9:00, 505; Чт, 9:00*, 411; Чт, 10:30, 432
168-2 Андрей Кашин Александра Рябинина Ср, 9:00, 10:30, 301; Чт, 9:00*, 416

Домашняя работа

Новая домашняя работа выкладывается еженедельно по средам в 9:00. Максимальная оценка за работу 1200 баллов (соответствует оценке 12). Дедлайн на выполнение домашней работы - 1 неделя (дедлайн перед контрольной - полночь). Еще в течение одной недели можно сдавать задачи и они будут получать половину баллов.

За неудачную посылку по задаче предусмотрен штраф в 1 балл, однако, если неудачных посылок очень много, но задача сдана, то она будет оценена минимум в 80% баллов.

Контест 1 (Числа, if, циклы, строки): https://official.contest.yandex.ru/contest/3156 (дедлайн 10.11.2016 9:00)

Контест 2 (Вектор, индексация строк, функции): https://official.contest.yandex.ru/contest/3202 (дедлайн 17.11.2016 9:00)

Контест 3 (Сортировка структур, контейнеры, рекурсия): https://official.contest.yandex.ru/contest/3434 (дедлайн 24.11.2016 9:00)

Внимание! В этом контесте мы будем вручную рецензировать решения ваших задач I (Поступление) и P (Сессия). Для этого всем студентам нужно зарегистрироваться в системе Anytask:

1. Зарегистрируйтесь на http://anytask.org/accounts/register/. Пожалуйста, вводите правильно свою фамилию и имя на русском языке.

2. Укажите инвайт от своей подгруппы:

162-1 ygTQx77
162-2 eYzME9f
164-1 9WOeHCe
164-2 QjW2SVe
165-1 jUTAPd8
165-2 1BRstCB
166-1 kA3HLRk
166-2 H2pdqaP
167-1 YPXr9yn
167-2 8ewB9l4
168-1 aVNsHhA
168-2 5cNE8fX

3. Найдите себя в списке группы. Нажмите на ячейку в таблице в своей строке и в столбце задачи. Отправьте решения своих задач (получившие статус OK в Я.Контесте).

4. Если всё прошло успешно, вы получите ссылку на Review board (систему рецензирования) с вашим кодом. Логин и пароль для входа в Review board - такой же, как и в Anytask.

5. Ожидайте рецензии от вашего преподавателя или ассистента. Вы получите об этом автоматическое уведомление по почте. Будьте готовы исправить замечания в решении, если потребуется. За недочёты в решениях будут вычитаться баллы у соответствующих задач.

6. За нарушение правил регистрации (неправильно введены фамилия/имя, регистрация в чужой подгруппе и т. д.) мы также будем снимать баллы.


Контест 4 (Стандартные алгоритмы и структуры данных): https://official.contest.yandex.ru/contest/3485 (дедлайн 1.12.2016 0:00) - в этом контесте сложные (на наш взгляд) задачи помечены звездочкой. На рецензию в Anytask необходимо сдать задачи I (игра в пьяницу) и T (unique).

Контест 5 (Битовые операции и классы): https://official.contest.yandex.ru/contest/3517 (дедлайн 8.12.2016 9:00). Новые задачи добавляться больше не будут. На рецензию в Anytask необходимо сдать задачи H (забавная игра) и P (рациональное число).

Контест 6 разбит на две части: класс "Матрица" (https://official.contest.yandex.ru/contest/3552) и класс "Многочлен" (https://official.contest.yandex.ru/contest/3557). Дедлайн по первой части: 15.12.2016 0:00. Дедлайн по второй части: 22.12.2016 0:00. На рецензию в Anytask необходимо сдать последнюю задачу H (многочлен sparse).

Контест 7 (Исключения и динамическая память): https://official.contest.yandex.ru/contest/3714. Дедлайн продлён до 06.02.2017 23:59 из-за технических проблем с Яндекс.Контестом.

Контест 8 (Умные указатели): https://official.contest.yandex.ru/contest/3571. Дедлайн - 19.02.2017 23:59.

Контест 9 (Указатели, наследование, полиморфизм): https://official.contest.yandex.ru/contest/4017. Дедлайн - 05.03.2017 23:59.

Контест 10 (Реализация классов стандартной библиотеки): https://official.contest.yandex.ru/contest/4073. Дедлайн - 20.03.2017 23:59. Добавилась задача E. Новые задачи добавляться больше не будут.

Контрольные работы

Будут проводиться на семинарах по четвергам каждую вторую неделю (начиная с 17 ноября).

Контрольную работу можно писать только в классе!

Первая контрольная работа:

Контест для первой пары: https://official.contest.yandex.ru/contest/3442/problems/

Контест для второй пары: https://official.contest.yandex.ru/contest/3443/problems/


Вторая контрольная работа:

Контест для первой пары: https://official.contest.yandex.ru/contest/3521/problems/

Контест для второй пары: https://official.contest.yandex.ru/contest/3522/problems/


Третья контрольная работа:

Контест для первой пары: https://official.contest.yandex.ru/contest/3588/problems/

Контест для второй пары: https://official.contest.yandex.ru/contest/3589/problems/


Четвёртая контрольная работа:

https://official.contest.yandex.ru/contest/4225/problems/


Переписывание (19.12.2016):

Переписывание состоится 19 декабря с 10:30 до 11:50 вместо лекции.

Студенты со своими ноутбуками приглашаются в ауд. 622. Студенты без своих ноутбуков приглашаются в ауд. 501, 503, 513.

За переписывание будет выставлена последняя оценка (то есть, если вы переписали хуже, чем написали, то получите меньшую оценку). Считается, что студент участвовал в переписывании, если он отправил хотя бы одну посылку.

Первая контрольная: https://official.contest.yandex.ru/contest/3602/problems/

Вторая контрольная: https://official.contest.yandex.ru/contest/3599/problems/

Третья контрольная: https://official.contest.yandex.ru/contest/3603/problems/

Формулы оценок

Накопленная оценка за II-III модули = 0,4 * (Средняя оценка за домашние работы) + 0,6 * (Средняя оценка за контрольные работы)


Требования к оформлению кода программ

Мы используем cpplint для проверки стиля. Вот список требований.

Флаги для cpplint: --filter=-,+build/include,-build/include_order,+build/include_what_you_use,+build/storage_class,+readability/alt_tokens,+readability/braces, +readability/casting,+readability/inheritance,+runtime/casting,-runtime/explicit,+whitespace/blank_line,+whitespace/braces,+whitespace/comma, +whitespace/comments,+whitespace/empty_conditional_body,+whitespace/empty_loop_body,+whitespace/end_of_line, +whitespace/ending_newline,+whitespace/forcolon,+whitespace/indent,+whitespace/line_length,+whitespace/newline, +whitespace/operators,+whitespace/parens,+whitespace/semicolon,+whitespace/tab --linelength=100

Вот скрипт, в котором уже включены эти флаги (и который можно запускать без дополнительных параметров): https://yadi.sk/d/vRnvWsAlxzyaG

Полезные ссылки

Bandit - игра для освоения консольных команд Linux

Practical Vim - хороший учебник по Vim