Перейти к содержанию

С++, 322 гр., спец. ММ

Место и время проведения: вторник, вторая (2446) и четвертая (2520) пары.
Преподаватель: Шлемов Александр Юрьевич shlemovalex@gmail.com


FAQ

  • Что? — Курс по программированию на C

++

. - А конкретнее? — начнем с основ (вот буквально с синтаксиса), затем изучим программирование “до объектов” (практически, чистый C), потом ООП. Если останется время, то посмотрим на шаблоны и пощупаем STL. - А еще что-нибудь будет? — Курс будет обогащен всевозможными смежными темами, относящимися к программированию вообще. - А алгоритмы будут? А системное программирование? А многопоточность? А… — Очень жаль, но ничего этого включить не удастся. Впрочем, возможно организовать дополнительные пары, целиком посвященные интересующим вопросам. - Я все это знаю, что мне делать? — приходите на пару. Потом подойдите ко мне. Возможно, придумаем интересное индивидуальное задание. - Я вообще не знаю C

++

, знаю только PASCAL (BASIC, PHP, ничего не знаю) — Приходите, всему научим =) - А зачем мне C

++

? Все давно пишут на C#, Java, R, MATLAB, etc — Во-первых, на C

++

пишут до сих пор довольно много. А во-вторых, разобравшись с C

++

намного легче работать с языками более высокого уровня, потому что начинаешь понимать, как все устроено. - Кто читает? — Читаю я, Александр Шлемов, аспирант Статмода. - Сколько пар? — Две пары в неделю (вторая и четвертая во вторник). Всего 17 недель по две пары. - За что ставится зачет? — Зачета два, по вычпрактикуму и по семинару. Для первого нужно будет сделать некоторое количество задач самостоятельно (написать несколько программ), а для второго — успешно сдать два теоретических минизачета. - Что за программы? — Небольшие программы по темам курса. - Что за “минизачеты”? — Тест по первой части (не-ООП) и собеседование по ООП. - Какой формат теста? — Тест состоит из нескольких примеров реального (или почти реального) кода; необходимо разобраться, что этот код делает и (возможно) найти в нем ошибку. - А что за “собеседование”? — Нечто вроде устного экзамена. Основная цель — убедиться, что основные идеи и понятия усвоены правильно. - У меня еще остались вопросы — Приходите на пары, задавайте. Можете написать мне на почту.

Методические материалы и примеры

Темы и материалы к занятиям

3 сентября
- Приветствие. Знакомство. Система приема задач, план семестра. Проверка знаний слушателей. Возникновение С/С

++

, эволюция, статус на данный момент. Где и как используется, положение относительно других языков.

  1. Компилятор. Оптимизатор. Debug/Release сборка.
  2. Немного о стандартах. Стандарт/Платформа+Компилятор/Undefined Behavour.
  3. Структура программы, объявления, заголовочные файлы. Hello, world. Элементарный вывод. Комментарии, отступы, оформление кода.
  4. Переменные. Понятие о строгой типизации. Основные целочисленные типы, unsigned, производные типы; size_t. Вещественные типы. Символ как целочисленный тип. Арифметика, приоритеты операций. Побитовые операции. Переполнение. Приведение типа.

NaN, INFINITY. Примеры переполнений. Sizeof. cfloat, climits, limits.

Примеры:
Пример с различными арифметическими действиями
Пример с limits, NaN и переполнениями

10 сентября
-

  1. const и #define. Препроцессор.
  2. Управляющие конструкции языка.
  3. Логические выражения.
  4. Блоки, область видимости.
  5. Статические массивы, инициализация, многомерные массивы.

Примеры
Пример с вычислением экспоненты
Возведение в степень

17 сентября
- Указатели, типы указателей, арифметика с указателями.

  1. Связь указателей и массивов.
  2. Нулевой указатель (nullptr).
  3. Динамическое выделение памяти, new, delete.
  4. Выделение памяти для массивов.
  5. typedef, динамические многомерные массивы.
  6. const , void , приведение типов для указателей.
  7. Ссылочный тип и создание псевдонимов.

Примеры
Пример с тернарным оператором и вычислениями по короткой схеме
Запутанный пример с указателями и массивом
Пример с указателями и ссылками

24 сентября
Самостоятельная работа в компьютерных классах. Темы: массивы,выделение памяти, динамический массив с поблоковым отведением памяти.

1 октября
- Функции, вызов, передача параметров и возврат.

  1. Передача параметров по значению, по ссылке, по указателю.
  2. Const& Const* в параметрах.
  3. Понятие о куче и стеке, почему нельзя возвращать ссылку на локальный объект.
  4. Понятие о рекурсии.
  5. Моделирование случайных величин. Метод Монте-Карло для нахождения площадей фигур.

8 октября

  1. Статическая перегрузка функций.
  2. Unit-test.
  3. Указатель на функцию.
  4. Понятия о компиляции и компоновке (linking).
  5. C-строки, начало.

Примеры
Использование указателя на функцию. Пример показывает разные способы определения и использования указателя на функцию. Все они эквивалентны. Функция === указатель на функцию.
15 октября

  1. Еще немного про функции. Значение по умолчанию.
  2. C-строки, функции для работы с ними.
  3. Определения класса символа ().
  4. Перевод чисел в строки и наоборот.
  5. Массивы строк.

22 октября

  1. Структуры, массивы структур.
  2. Вложенные структуры, инициализация структур.
  3. Передача структур по ссылке/указателю, динамическое создание структур.
  4. Динамические структуры данных (списки и так далее).

29 октября

  1. Разбор всяких антипримеров и подготовка к к/р.
  2. Задача с очередями и списками (у доски)

Примеры
Разобранные антипримеры. Вариант теста от 30 октября прошлого года.

5 ноября

  1. Объекты как “умные структуры”
  2. Конструктор и деструктор
  3. const-методы и передача объектов по ссылке
  4. Очередь в виде объекта (у доски)

12 ноября

  1. Перегрузка операторов, примеры, детали, особенности
  2. Перегрузка конкструктора копирования и оператора присваивания
  3. Передача объекта в функцию и возврат из функции

19 ноября

  1. Агрегация. Хранить объект или ссылку на объект? Понятие владения.
  2. Наследование. Идеи, приводящие к наследованию — повторное использование кода, иераршия классов, повторяющая модель реального мира, абстрактные методы и интерфейсы
  3. Реализация наследования в

C++

  1. Невозможность получить динамически перегружаемый метод имеющимися средствам

26 ноября

  1. Виртуальные методы. Различие виртуальный/невиртуальный метод.
  2. Чисто виртуальные (абстрактные) методы. Абстрактные классы и интерфейсы.

3 декабря

  1. Статические методы и поля.
  2. Виртуальные конструкторы. Фабричный статический метод, clone, “proto”.
  3. Интерфейсы и множественное наследование.

10 декабря

  1. Подготовка к зачету по ООП.
  2. Самостоятельная работа.
  3. Консультации.

Материалы
Вопросы для зачета

17 декабря

  1. Зачет по ООП.

Задачи

I II FP IV OOP
1. Караваева Валерия + + + + +
2. Алиева Наталия + + + + +
3. Зиннатулина Белла + + + + +
4. Куликов Даниил + + + +
5. Куракин Владислав
6. Эсаулова Екатерина +

Номер Вашего варианта = Ваш номер в таблице выше. Если у Вас нет задания, Вы нашли ошибку или формулировка не до конца ясна, просьба отправить мне запрос по почте. Обозначения: плюсик — задача зачтена, вопрос — решение отправлено на доработку (т.е. я жду исправлений).

Задание 1 С использованием циклов и условий нарисовать фигурку как в приложенном файле. Фигурка должна быть параметризована одной или двумя константами-параметрами, имеющими смысл размеров. Варианты к заданию 1.

Задание 2 Аналитически и с помощью метода Монте-Карло найдите площадь фигуры, ограниченной линиями. Программа должна уже быть написана в процедурном стиле, т.е. с использованием функций. Число испытаний М-К возьмите 10, 100, 1000 и так далее (сделайте верхнюю границу задаваемой). Программа должна выводить табличку со следующими столбцами: число испытаний, полученная оценка, разность оценки и истинного значения (ошибка), ошибка, умноженная на корень из числа испытаний. Варианты к заданию 2.

Задание FP Реализовать функцию, принимающую на вход массив(ы) вещественных данных и указатель на функцию, и применяющую к ним функцию определенным образом. Варианты.. Еще реализовать функцию сортировки, принимающую на вход указатель на функцию сравнения элементов массива. Для обоих функций необходимо подобрать информативные примеры и оформить их в виде тестов. Также тесты должны покрывать крайние случаи.

Задание 4 Задание на структуры. Варианты заданий. Задание описано по ссылке, кратко суть. Написать программу “Записная книжка”. Программа должна позволять вводить данные, искать и удалять. Варианты отличаются видами поиска и форматом хранения данных.

Задание OOP Необходимо реализовать классы для очередей и списков (на массивах и на списках). Описать виртуальные классы для очередей, списков и PushPullera. Реализовать конструкторы, конструкторы копирования, деструкторы, операторы присваивания, виртуальный метод clone() и статический фабричный метод.

Посещаемость

3.09 10.09 17.09 24.09 1.10 8.10 15.10 22.10 29.10 5.11 12.11 19.11 26.11 3.12
1. Караваева Валерия + +(1) +(3) + + + + + + + + + + +
2. Алиева Наталия + +(1) +(2) + + + + + + + + + + +
3. Зиннатулина Белла + + +(3) + + + + + + + + + + +
4. Куликов Даниил + +(1) - + + + + + + + - + - -
5. Куракин Владислав + + - - - - - - - - - - -

Литература (и другие источники)

  1. Г. Шилдт. Полный справочник по C++ Довольно классическая книжка, сильно ее рекомендую. Мой стиль и порядок изложения в целом соответствует ей. Последнее издание — четвертое, есть и по-русски, и по-английски. Книга очень известна, хорошо доступна. Однако книга далеко не новая, из-за чего некоторые вещи выглядят устаревшими.
  2. C++ Для чайников Несмотря на провокационное название, довольно приличная книга. Хорошее введение для начинающих с правильно поставленными акцентами. Есть русская и английская версия, при этом русский перевод очень приличный. Особенно приятно, что книга новая (точнее, новое переиздание) и она учитывает новые стандарты языка. Однако многие подробности в ней опущены, не следует рассматривать ее как руководство.
  3. http://cplusplus.com/ Всякая инфа по языку и документация по использованию встроенной библиотеки с примерами. Коротко и удобно.
  4. http://en.cppreference.com/w/ Аналогично предыдущему ресурсу.
  5. C++11 Standard latest draft Последний черновой вариант1 актуального стандарта C

++

. Чтение не очень захватывающее, документ пропитан духом формализма. Но позволяет точно ответить на вопрос “А как это должно быть на самом деле?” 2 6. C++0x Compiler support Сводная таблица по поддержке новых возможностей различными компиляторами. 7. MSDN C++ Позволяет ответить на вопрос “А как же оно на самом деле работает” применительно к майкрософтовской реализации C++ (Visual C++). В целом, удобная онлайн-справка по языку и Visual Studio IDE. Некоторыми признается вообще лучшей документацией по языку.


  1. за окончательный вариант стандарта ISO требует весьма круглую сумму денег, но последний черновик отличается от окончательно варианта в исключительно мелких деталях (если не ошибаюсь, двумя опечатками), поэтому простые смертные обычно довольствуются этим самым черновиком. Впрочем, существуют и другие пути получения финальной версии стандарта ↩

  2. Ключевое слово здесь должно. Дело в том, что на данный момент поддержка распространенными компиляторами Стандарта является далеко неполной ↩