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

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

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


FAQ

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

++

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

++

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

++

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

++

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

++

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

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

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

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

++

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

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

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

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

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

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

18 сентября
- Нулевой указатель (nullptr).

  1. Динамическое выделение памяти, new, delete.
  2. Выделение памяти для массивов.
  3. typedef, динамические многомерные массивы.
  4. const , void , приведение типов для указателей.

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

25 сентября
- Ссылочный тип и создание псевдонимов.

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

2 октября

  1. Статическая перегрузка функций. Значение по умолчанию.
  2. Unit-test.
  3. Указатель на функцию.

Примеры
Использование указателя на функцию
9 октября

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

16 октября

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

23 октября

  1. Разбор всяких антипримеров и подготовка к к/р.

Примеры
Разобранные антипримеры.

30 октября

  1. К/р по пройденным темам. Задания типа “найди проблемы в коде”, “напишу функцию, которая делает X” и “что напечатает программа”. UPD К/р состоялась, результаты опубликованы.

6 ноября

  1. Cin/cout, пространство имен и всякие другие новшества С

++

. Граница С/С

++

. 2. Некоторое введение в потоки и std::string. 3. fstream, vector (как примеры объектов).

13 ноября

  1. Понятие ООП, базовая методология, идеи. Инкапсуляция.
  2. Понятие класса, отличие класса от структуры. Методы, поля, доступ.

20 ноября

  1. Конструкторы и деструкторы. Оператор присваивания. Динамическое создание и жизненный цикл объекта.

27 ноября

  1. const, static. Вызов конструктора для поля.
  2. Наследование.

4 декабря

  1. Полиморфизм. Абстрактный класс, виртуальный и чисто виртуальный метод. Понятие об интерфейсе. “Виртуальный конструктор”. Виртуальный деструктор. Разбор примера с геометрическими фигурами.

11 декабря

  1. Немного о множественном наследовании. Интерфейсы.
  2. Повторение. Подготовка к зачету.

Задачи

I II FP III IV V
1. Артишевская Юлия + + + + + +
2. Сорокин Владимир + + + + + +
3. Воеводская Анна + + + + + +
4. Тихомиров Георгий + + + + +? +
5. Севастьянова Юлия + + + + +? +
6. Просвирнина Мария + + + + + +
7. Кривец Никита + + + + +? +
8. Баклановская Белла + + + ? ? ?

Номер Вашего варианта = Ваш номер в таблице выше. Если у Вас нет задания, Вы нашли ошибку или формулировка не до конца ясна, просьба отправить мне запрос по почте.

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

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

Задание FP Реализовать функцию, принимающую на вход массив(ы) вещественных данных и указатель на функцию, и применяющую к ним функцию определенным образом. Варианты. Юнит-тесты обязательны.

Задание 3 Реализовать описанные в каждом варианте строковые функции. Использовать только классические C-строки и функции для работы с ними. Варианты. Юнит-тесты обязательны. UPD Не нужно выделять память в функции. Чтобы “вернуть строку” из функции, передавайте в функцию указатель на начало буфера, куда нужно осуществить вывод результата.

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

Задание 5 Фигуры. Написать программу, состоящую из нескольких классов геометрических фигур. Фигура, Треугольник, Квадрат, Круг + еще несколько фигур. Фигура — базовый класс, остальные — его наследники. В базовом классе объявить методы: площадь, периметр, радиус вписанной окружности и метод introduce. Метод introduce должен выводить на экран сообщение-приветствие для фигуры: ее тип, площать, периметр, радиус вписанной окружности. Для наследников определить конструкторы с достаточными параметрами (для круга, к примеру, радиус) и реализовать методы базового класса. Далее в main() создается массив длины N (к примеру, 20) указателей на Фигура и заполняется случайными фигурами со случайными параметрами. Чтобы сделать это создание более изящным, объявить в базовом классе Фигура “вирутальный конструктор” — статический метод create(int type) который создает фигуру переданного типа (например, если type == 1, то содать круг, 2 — квадрат и т. д.) со случайными параметрами, а если type == 0, то создает случайную фигуру со случайными параметрами, и возвращает указатель типа Фигура* на только что созданный объект. Далее пройтись по массиву в цикле и вывести для каждой фигуры вызвать метод introduce(), затем корректно удалить все созданные объекты.

Задания у разных людей различаются по набору дополнительных фигур.
Воеводская, Сорокин, Артишевская, Просвирнина, Тихомиров реализуют дополнительно Ромб и Эллипс.
Севастьянова и Кривец — Правильный Пятиугольник и Прямоугольник
Баклановская — Правильный Шестиугольник и Параллелограм

Для фигур вроде прямоугольника вписанную окружность понимать как наибольшую возможную вписанную окружность, т.е. для прямоугольника диаметр вписанной окружности будет равен меньшей стороне.

К/р I

1 2 3 4 5 6 7 8 9 10
1. Артишевская Юлия - -/+ + -/+ + +/- + +/- + 5.7
2. Сорокин Владимир + +/- + + + + + + +/- 6.3
3. Воеводская Анна + + + + + + + + + 7
4. Тихомиров Георгий + + + + +/- + + + + 7
5. Севастьянова Юлия + + + + + + +/- +/- +/- 7
6. Просвирнина Мария + + + + + + +/- +/- +/- 7
7. Кривец Никита - - + -/+ + + + + + 7
8. Баклановская Белла + + + + + + + +/- + 7

Переписывание состоялось, результаты обновлены вторично.

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

4.09 11.09 18.09 25.09 02.10 09.10 16.10 23.10 30.10 6.11 13.11 20.11 27.11 04.12 11.12
1. Артишевская Юлия - + +(3) +(2) +(1) - +(1) - +(1) - +(2) + + +(1) +
2. Сорокин Владимир + + +(2,1) - +(4) - +(1) +(1) +(3) +(1) +(3) + + +(1) +
3. Воеводская Анна + + +(4) +(3) +(2) + - - - - +(1) + - - +
4. Тихомиров Георгий + + +(1) +(1,1) +(1) + + + + +(1) + + + +(1) +
5. Севастьянова Юлия - + +(1) - +(1) + + - + + + - + - -
6. Просвирнина Мария - - -/+ +(1,1) +(1) + - - +(1) - + - + +(1) +
7. Кривец Никита - - - - - - + + - - + - + - -
8. Баклановская Белла - - - - - - - - - + - - + - -

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

  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. Ключевое слово здесь должно. Дело в том, что на данный момент поддержка распространенными компиляторами Стандарта является далеко неполной ↩