С++, 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. Приветствие. Знакомство. Система приема задач, план семестра. Проверка знаний слушателей. Возникновение С/С++, эволюция, статус на данный момент. Где и как используется, положение относительно других языков.
  2. Препроцессор, компилятор, линкер. Оптимизатор. Debug/Release сборка.
  3. Немного о стандартах. Стандарт/Платформа+Компилятор/Undefined Behavour.
  4. Структура программы, объявления, заголовочные файлы. Hello, world. Элементарный вывод. Комментарии, отступы, оформление кода.
  5. Переменные. Понятие о строгой типизации. Основные целочисленные типы, unsigned, производные типы; size_t. Вещественные типы. Символ как целочисленный тип. Арифметика, приоритеты операций. Побитовые операции. Переполнение. Приведение типа. NaN, INFINITY. Примеры переполнений. Sizeof. cfloat, climits, limits.

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

11 сентября

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

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

18 сентября

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

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

25 сентября

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

2 октября

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

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

9 октября

  1. Еще немного про функции.
  2. C-строки, функции для работы с ними.
  3. Определения класса символа (<cctype>).
  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)
Ключевое слово здесь должно. Дело в том, что на данный момент поддержка распространенными компиляторами Стандарта является далеко неполной
study/fall2012/3cpp_mm.txt · Последнее изменение: 2013/02/08 07:35 — ash
Наверх
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0