Содержание
С++, 322 гр., спец. ММ
Место и время проведения: вторник, первая (ауд. 2408) и вторая (ауд. 2511) пары.
Преподаватель: Шлемов Александр Юрьевич shlemovalex@gmail.com
FAQ
- Что? — Курс по программированию на C++.
- А конкретнее? — начнем с основ (вот буквально с синтаксиса), затем изучим программирование «до объектов» (практически, чистый C), потом ООП. Если останется время, то посмотрим на шаблоны и пощупаем STL.
- А еще что-нибудь будет? — Курс будет обогащен всевозможными смежными темами, относящимися к программированию вообще.
- А алгоритмы будут? А системное программирование? А многопоточность? А… — Очень жаль, но ничего этого включить не удастся. Впрочем, возможно организовать дополнительные пары, целиком посвященные интересующим вопросам.
- Я все это знаю, что мне делать? — приходите на первую пару. Потом подойдите ко мне. Возможно, придумаем интересное индивидуальное задание.
- Я вообще не знаю C++, знаю только PASCAL (BASIC, PHP, ничего не знаю) — Приходите, всему научим
- А зачем мне C++? Все давно пишут на C#, Java, R, MATLAB, etc — Во-первых, на C++ пишут до сих пор довольно много. А во-вторых, разобравшись с C++ намного легче работать с языками более высокого уровня, потому что начинаешь понимать, как все устроено.
- Кто читает? — Читаю я, Александр Шлемов, аспирант Статмода.
- Сколько пар? — Две пары в неделю (первые две во вторник). Всего 17 недель по две пары.
- За что ставится зачет? — Зачета два, по вычпрактикуму и по семинару. Для первого нужно будет сделать некоторое количество задач самостоятельно (написать несколько программ), а для второго — успешно сдать два теоретических минизачета.
- Что за программы? — Небольшие программы по темам курса.
- Что за «минизачеты»? — Тест по первой части (не-ООП) и собеседование по ООП.
- Какой формат теста? — Тест состоит из нескольких примеров реального (или почти реального) кода; необходимо разобраться, что этот код делает и (возможно) найти в нем ошибку.
- А что за «собеседование»? — Нечто вроде устного экзамена. Основная цель — убедиться, что основные идеи и понятия усвоены правильно.
- А что будет после Вашего курса? — В следующем семестре будет спецвычпрактикум по C#. Вести будет Петр Шпилев.
- У меня еще остались вопросы — Приходите на пары, задавайте. Можете написать мне на почту.
Методические материалы и примеры
- Пример использования стандартного случайного генератора. Пример проекта с несколькими файлами. Больше примеров, подробное описание модуля std::random. Нам нужен только пример, читать две последние ссылки имеет смысл только интересующимся.
Темы и материалы к занятиям
4 сентября
- Приветствие. Знакомство. Система приема задач, план семестра. Проверка знаний слушателей. Возникновение С/С++, эволюция, статус на данный момент. Где и как используется, положение относительно других языков.
- Препроцессор, компилятор, линкер. Оптимизатор. Debug/Release сборка.
- Немного о стандартах. Стандарт/Платформа+Компилятор/Undefined Behavour.
- Структура программы, объявления, заголовочные файлы. Hello, world. Элементарный вывод. Комментарии, отступы, оформление кода.
- Переменные. Понятие о строгой типизации. Основные целочисленные типы, unsigned, производные типы; size_t. Вещественные типы. Символ как целочисленный тип. Арифметика, приоритеты операций. Побитовые операции. Переполнение. Приведение типа. NaN, INFINITY. Примеры переполнений. Sizeof. cfloat, climits, limits.
Примеры:
Пример с различными арифметическими действиями
Пример с limits, NaN и переполнениями
11 сентября
- <cmath>
- const и #define
- Управляющие конструкции языка.
- Логические выражения.
- Блоки, область видимости.
- Статические массивы, инициализация, многомерные массивы.
- Указатели, типы указателей, арифметика с указателями.
- Связь указателей и массивов.
Примеры
Пример с вычислением экспоненты
Возведение в степень
Пример с тернарным оператором и вычислениями по короткой схеме
18 сентября
- Нулевой указатель (nullptr).
- Динамическое выделение памяти, new, delete.
- Выделение памяти для массивов.
- typedef, динамические многомерные массивы.
- const *, void *, приведение типов для указателей.
Примеры
Запутанный пример с указателями и массивом
Пример с указателями и ссылками
25 сентября
- Ссылочный тип и создание псевдонимов.
- Функции, вызов, передача параметров и возврат.
- Передача параметров по значению, по ссылке, по указателю.
- Const&.
- Понятие о куче и стеке, почему нельзя возвращать ссылку на локальный объект.
- Понятие о рекурсии.
- Моделирование случайных величин.
2 октября
- Статическая перегрузка функций. Значение по умолчанию.
- Unit-test.
- Указатель на функцию.
Примеры
Использование указателя на функцию
9 октября
- Еще немного про функции.
- C-строки, функции для работы с ними.
- Определения класса символа (<cctype>).
- Перевод чисел в строки и наоборот.
16 октября
- Массивы строк.
- Структуры, массивы структур.
- Вложенные структуры, инициализация структур.
- Передача структур по ссылке/указателю, динамическое создание структур.
- Динамические структуры данных (списки и так далее).
23 октября
- Разбор всяких антипримеров и подготовка к к/р.
Примеры
Разобранные антипримеры.
30 октября
- К/р по пройденным темам. Задания типа «найди проблемы в коде», «напишу функцию, которая делает X» и «что напечатает программа». UPD К/р состоялась, результаты опубликованы.
6 ноября
- Cin/cout, пространство имен и всякие другие новшества С++. Граница С/С++.
- Некоторое введение в потоки и std::string.
- fstream, vector (как примеры объектов).
13 ноября
- Понятие ООП, базовая методология, идеи. Инкапсуляция.
- Понятие класса, отличие класса от структуры. Методы, поля, доступ.
20 ноября
- Конструкторы и деструкторы. Оператор присваивания. Динамическое создание и жизненный цикл объекта.
27 ноября
- const, static. Вызов конструктора для поля.
- Наследование.
4 декабря
- Полиморфизм. Абстрактный класс, виртуальный и чисто виртуальный метод. Понятие об интерфейсе. «Виртуальный конструктор». Виртуальный деструктор. Разбор примера с геометрическими фигурами.
11 декабря
- Немного о множественном наследовании. Интерфейсы.
- Повторение. Подготовка к зачету.
Задачи
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. Баклановская Белла | - | - | - | - | - | - | - | - | - | + | - | - | + | - | - |
Литература (и другие источники)
- Г. Шилдт. Полный справочник по C++ Довольно классическая книжка, сильно ее рекомендую. Мой стиль и порядок изложения в целом соответствует ей. Последнее издание — четвертое, есть и по-русски, и по-английски. Книга очень известна, хорошо доступна. Однако книга далеко не новая, из-за чего некоторые вещи выглядят устаревшими.
- C++ Для чайников Несмотря на провокационное название, довольно приличная книга. Хорошее введение для начинающих с правильно поставленными акцентами. Есть русская и английская версия, при это русский перевод очень приличный. Особенно приятно, что книга новая (точнее, новое переиздание) и она учитывает новые стандарты языка. Однако многие подробности в ней опущены, не следует рассматривать ее как руководство.
- http://cplusplus.com/ Всякая инфа по языку и документация по использованию встроенной библиотеки с примерами. Коротко и удобно.
- http://en.cppreference.com/w/ Аналогично предыдущему ресурсу.
- C++11 Standard latest draft Последний черновой вариант1) актуального стандарта C++. Чтение не очень захватывающее, документ пропитан духом формализма. Но позволяет точно ответить на вопрос «А как это должно быть на самом деле?» 2)
- C++0x Compiler support Сводная таблица по поддержке новых возможностей различными компиляторами.
- MSDN C++ Позволяет ответить на вопрос «А как же оно на самом деле работает» применительно к майкрософтовской реализации C++ (Visual C++). В целом, удобная онлайн-справка по языку и Visual Studio IDE. Некоторыми признается вообще лучшей документацией по языку.