Это старая версия документа!
Содержание
С++, 322 гр., спец. ММ
Место и время проведения: вторник, вторая (2446) и четвертая (2520) пары.
Преподаватель: Шлемов Александр Юрьевич shlemovalex@gmail.com
FAQ
- Что? — Курс по программированию на C++.
- А конкретнее? — начнем с основ (вот буквально с синтаксиса), затем изучим программирование «до объектов» (практически, чистый C), потом ООП. Если останется время, то посмотрим на шаблоны и пощупаем STL.
- А еще что-нибудь будет? — Курс будет обогащен всевозможными смежными темами, относящимися к программированию вообще.
- А алгоритмы будут? А системное программирование? А многопоточность? А… — Очень жаль, но ничего этого включить не удастся. Впрочем, возможно организовать дополнительные пары, целиком посвященные интересующим вопросам.
- Я все это знаю, что мне делать? — приходите на пару. Потом подойдите ко мне. Возможно, придумаем интересное индивидуальное задание.
- Я вообще не знаю C++, знаю только PASCAL (BASIC, PHP, ничего не знаю) — Приходите, всему научим
- А зачем мне C++? Все давно пишут на C#, Java, R, MATLAB, etc — Во-первых, на C++ пишут до сих пор довольно много. А во-вторых, разобравшись с C++ намного легче работать с языками более высокого уровня, потому что начинаешь понимать, как все устроено.
- Кто читает? — Читаю я, Александр Шлемов, аспирант Статмода.
- Сколько пар? — Две пары в неделю (вторая и четвертая во вторник). Всего 17 недель по две пары.
- За что ставится зачет? — Зачета два, по вычпрактикуму и по семинару. Для первого нужно будет сделать некоторое количество задач самостоятельно (написать несколько программ), а для второго — успешно сдать два теоретических минизачета.
- Что за программы? — Небольшие программы по темам курса.
- Что за «минизачеты»? — Тест по первой части (не-ООП) и собеседование по ООП.
- Какой формат теста? — Тест состоит из нескольких примеров реального (или почти реального) кода; необходимо разобраться, что этот код делает и (возможно) найти в нем ошибку.
- А что за «собеседование»? — Нечто вроде устного экзамена. Основная цель — убедиться, что основные идеи и понятия усвоены правильно.
- У меня еще остались вопросы — Приходите на пары, задавайте. Можете написать мне на почту.
Методические материалы и примеры
- Пример использования стандартного случайного генератора. Пример проекта с несколькими файлами. Больше примеров, подробное описание модуля std::random. Нам нужен только пример, читать две последние ссылки имеет смысл только интересующимся.
- Проект с примером использования фреймворка googletest и Руководство по добавлению фреймворка в проект + сами файлы фреймворка + вводная статья из официальной документации. Для корректной работы фреймворка в MS Visual Studio 2012, добавьте первой строчкой в gtest.h следующее: '#define _VARIADIC_MAX 10'
Темы и материалы к занятиям
3 сентября
- Приветствие. Знакомство. Система приема задач, план семестра. Проверка знаний слушателей. Возникновение С/С++, эволюция, статус на данный момент. Где и как используется, положение относительно других языков.
- Компилятор. Оптимизатор. Debug/Release сборка.
- Немного о стандартах. Стандарт/Платформа+Компилятор/Undefined Behavour.
- Структура программы, объявления, заголовочные файлы. Hello, world. Элементарный вывод. Комментарии, отступы, оформление кода.
- Переменные. Понятие о строгой типизации. Основные целочисленные типы, unsigned, производные типы; size_t. Вещественные типы. Символ как целочисленный тип. Арифметика, приоритеты операций. Побитовые операции. Переполнение. Приведение типа. NaN, INFINITY. Примеры переполнений. Sizeof. cfloat, climits, limits.
Примеры:
Пример с различными арифметическими действиями
Пример с limits, NaN и переполнениями
10 сентября
- <cmath>
- const и #define. Препроцессор.
- Управляющие конструкции языка.
- Логические выражения.
- Блоки, область видимости.
- Статические массивы, инициализация, многомерные массивы.
Примеры
Пример с вычислением экспоненты
Возведение в степень
17 сентября
- Указатели, типы указателей, арифметика с указателями.
- Связь указателей и массивов.
- Нулевой указатель (nullptr).
- Динамическое выделение памяти, new, delete.
- Выделение памяти для массивов.
- typedef, динамические многомерные массивы.
- const *, void *, приведение типов для указателей.
- Ссылочный тип и создание псевдонимов.
Примеры
Пример с тернарным оператором и вычислениями по короткой схеме
Запутанный пример с указателями и массивом
Пример с указателями и ссылками
24 сентября
Самостоятельная работа в компьютерных классах. Темы: массивы,выделение памяти, динамический массив с поблоковым отведением памяти.
1 октября
- Функции, вызов, передача параметров и возврат.
- Передача параметров по значению, по ссылке, по указателю.
- Const& Const* в параметрах.
- Понятие о куче и стеке, почему нельзя возвращать ссылку на локальный объект.
- Понятие о рекурсии.
- Моделирование случайных величин. Метод Монте-Карло для нахождения площадей фигур.
8 октября
- Статическая перегрузка функций.
- Unit-test.
- Указатель на функцию.
- Понятия о компиляции и компоновке (linking).
- C-строки, начало.
Примеры
Использование указателя на функцию. Пример показывает разные способы определения и использования указателя на функцию. Все они эквивалентны. Функция === указатель на функцию.
15 октября
- Еще немного про функции. Значение по умолчанию.
- C-строки, функции для работы с ними.
- Определения класса символа (<cctype>).
- Перевод чисел в строки и наоборот.
- Массивы строк.
22 октября
- Структуры, массивы структур.
- Вложенные структуры, инициализация структур.
- Передача структур по ссылке/указателю, динамическое создание структур.
- Динамические структуры данных (списки и так далее).
29 октября
- Разбор всяких антипримеров и подготовка к к/р.
- Задача с очередями и списками (у доски)
Примеры
Разобранные антипримеры.
Вариант теста от 30 октября прошлого года.
5 ноября
- Объекты как «умные структуры»
- Конструктор и деструктор
- const-методы и передача объектов по ссылке
- Очередь в виде объекта (у доски)
12 ноября
- Перегрузка операторов, примеры, детали, особенности
- Перегрузка конкструктора копирования и оператора присваивания
- Передача объекта в функцию и возврат из функции
19 ноября
- Агрегация. Хранить объект или ссылку на объект? Понятие владения.
- Наследование. Идеи, приводящие к наследованию — повторное использование кода, иераршия классов, повторяющая модель реального мира, абстрактные методы и интерфейсы
- Реализация наследования в C++
- Невозможность получить динамически перегружаемый метод имеющимися средствам
26 ноября
- Виртуальные методы. Различие виртуальный/невиртуальный метод.
- Чисто виртуальные (абстрактные) методы. Абстрактные классы и интерфейсы.
3 декабря
- Статические методы и поля.
- Виртуальные конструкторы. Фабричный статический метод, clone, «proto».
- Интерфейсы и множественное наследование.
10 декабря
- Подготовка к зачету.
- Самостоятельная работа.
- Консультации.
17 декабря
- Зачет по ООП.
Задачи
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. Куракин Владислав | + | + | - | - | - | - | - | - | - | - | - | - | - |
Литература (и другие источники)
- Г. Шилдт. Полный справочник по 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. Некоторыми признается вообще лучшей документацией по языку.