Задачи на 28 апреля Язык С++1Задачи на 28 апреля Язык С++1.

Презентация:



Advertisements
Похожие презентации
Д.з. 1Д.з. 1Числа в обратном порядке - 1 list l; // Вариант с list // Добавляем числа в обратном // порядке for (;;) { cin >> n; // Читаем числа if (n==0)
Advertisements

Д.з Язык С++ - занятие 31. Задача 1: 1/1 + 1/3 + 1/5 … #include using namespace std; int main() { int n; cin >> n; double sum = 0;// Сумма for.
Д.з. на 7 апреля Язык С++1. Задача 1: * и *= для rational class rational { int num, den; public: rational(int num_=0, int den_=1) : num(num_), den(den_)
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Д.з. на 31 марта Язык С++1Д.з. на 31 марта Язык С++1.
Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
1 Переопределение операций Макаревич Л. Г.. 2 Зачем нужна перегрузка операций? class Complex { double re; double im; public: Complex(double r=0, double.
САОД кафедра ОСУ 1 Основные абстрактные типы данных Схема процесса создания программ для решения прикладных задач ВУ.
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
Д.з. 1. Задача 1: order // Вспомогательная функция: // Упорядочиваем два числа void order(int& x, int& y) { if (x > y) { int tmp = x; x = y; y = tmp;
Д.з. на 3 марта Язык С++ - занятие 41Д.з. на 3 марта Язык С++ - занятие 41.
Д.з. на 17 марта Язык С++ - занятие 61. Задача 2: фигуры // shape - общий интерфейс для // фигур class shape { protected: int x, y; public: shape(int.
ООП Классы – 2.
Лекция 22. Шаблоны (часть 2) Красс Александр СПбГУ ИТМО, 2008.
Работа с файлами Сазонов Д.О. ПМиЭММ Часть 2. Тема занятия: Работа с файлами через потоки Для реализации файлового ввода/вывода, необходимо включить в.
1 Д.з. Shape – типичные ошибки contains (Circle r x y) a b = if (sqrt ((x-a)^2+(y-b)^2)) Double contains:: a -> Double -> Double -> Bool instance Shape.
Д.з. на 3 марта Язык С++ - занятие 51. Задача 4: top class stack { … int & top() { return stk[size -1 ]; } … }; // Пример вызова: stack s; … s.top() =
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Прикладное программирование кафедра прикладной и компьютерной оптики Полиморфизм.
Обработка исключений Основы метапрограммированияОбработка исключений Основы метапрограммирования.
Транксрипт:

Задачи на 28 апреля Язык С++1

Задача 3: swp template void swp(T& x, T& y) { T tmp = x; x = y; y = tmp; } Замечание: T tmp;// Так хуже, чем T tmp = x; tmp = x; - Немного медленнее - Более существенно, работает только если в классе есть конструктор по умолчанию (определение менее общее). Язык С++2

Задача 1: Удаление кружка - план OnRButtonDown Ищем кружок, в который мы попали Если нашли, то удаляем Перерисовываем Язык С++3

Задача 1: Удаление кружка void CCirclesView::OnRButtonDown(UINT nFlags, CPoint point) { vector ::iterator p; for (p=m_circles.begin(); p != m_circles.end(); p++) { if ( (p->x - pt.x)*(p->x - pt.x) + (p->y - pt.y)*(p->y - pt.y)

Архитектура "Документ/представление" (Document-View) Язык С++5

Тут мы обсуждали, почему лучше иметь два класса – один для данных, и другой для их изображения

Архитектура Document-View Данные хранятся не в окне, а в отдельном классе (C…Doc, производный от CDocument) Взаимодействие: Из окна можно получить указатель на документ: pDoc = GetDocument(); Можно обновить окно для документа (или окна, их может быть несколько): UpdateAllViews(NULL); Почему удобно использовать такую архитектуру? Несколько окон для одного документа Несколько способов просмотра Вообще часто полезно разделять объект и его изображение Примерно то же: MVC (model-view-controler). Язык С++7

Circles в архитектуре Document-View m_circles - перенести в CCirclesDoc class CCirclesDoc { vector m_circles; OnDraw: CCirclesDoc* pDoc= GetDocument(); for (int i = 0; i m_circles.size(); i++) { CPoint& pt = pDoc->m_circles[i]; pDC->Ellipse(pt.x – 10, pt.y – 10, pt.x + 10, pt.y + 10, } OnLButtonDown: CCirclesDoc* pDoc= GetDocument(); pDoc->m_circles.push_back(point); pDoc->UpdateAllViews(NULL); Язык С++8

Шаблоны классов Язык С++9

Пример: шаблон класса "стек" template class stack { T stk[100]; int size; public: stack() : size(0) {} void push(const T& x) { size[top++] = x; } T pop { return stk[--size]; } }; Использование stack s1; stack s2; stack s3; stack > s4; При использовании параметры надо указывать явно Язык С++10

Замечания Методы можно описывать вне класса template void stack ::push(const T& x) {... } В частности, конструктор: template stack ::stack(): size(0) {} Язык С++11

Еще возможности Не типовые параметры: template class stack { T stk[maxsize]; … }; stack s; Такие параметры м.б. только целые (и в некоторых случаях указатели) При вызове д.б. константы Внутри - как константы Параметры по умолчанию template class stack { … stack s; // To же, что stack Язык С++12

typename Пусть в разных классах определен один вложенный тип. class a { typedef int mytype; … }; class b { typedef double mytype; … }; class c { typedef bool mytype; … }; И мы пишем шаблон, в котором используем это. template void f(T x) { … T::mytype x; … } Проблема: Откуда компилятор знает, что T::mytype это тип (а не поле T или метод T и т.д.)? Приходится подсказывать.. Язык С++13

typename - продолжение template void f(T x) { … typename T::mytype y; … } typename относится к выражению T::mytype Означает: "мы обещаем, что при вызове это будет вложенный в T тип" Язык С++14

Специализация Специализация шаблона template class stack { // Что-то особенное }; Специализация метода template void stack :: push(double x) { // Что-то особенное }; Реальный пример из STL – vector Язык С++15

Частичная специализация template class stack { // Что-то особенное }; М.б. сложная система разных специализаций template class abc { … }; template class abc { … }; template class abc { … }; template class abc { … }; template class abc { … }; Не во всех компиляторах! (Visual C++ после VS 2003) Язык С++16

Шаблон метода class abc { … template void f(T x) { … } … }; abc x; x.f(5);// f x.f(3.14);// f // Пример template class complex { T re, im; … template complex(const T1& from) : re(from.re), im(from.im) {} }; // Хотим задать преобразование // complex -> complex complex c1(1,2); complex c2 = c1; Генерируется конструктор complex (const complex & from) Язык С++17

Параметры - шаблоны Не будет на экзамене template class T > class abc { T x; T y; T z; … }; abc v; Язык С++18

Замечания Пишем код, который работает для разных типов. Называется: полиморфизм Статический полиморфизм По-моему опыту: Не старайтесь использовать сложные возможности шаблонов Легко запутаться Язык С++19

Еще об итераторах и контейнерах

value_type T::value_type – тип того, что содержится в контейнере Например, если T – это list, то T::value_type – это int И тоже для итераторов Если T – это list ::iterator, то T::value_type – это int Используется, в основном, в шаблонах Тут мы разбирали простой пример использования: шаблон функции, которая возвращает первый элемент любого последовательного контейнера. И обсудили типичные ошибки.

Разделяемые данные (В частности, разделяемая память и когда ее удалять) Язык С++22

Несколько указателей на один объект в динамической памяти Вспомним проблемы при копировании string: Меняем одну строку – меняются все Ну, допустим, мы не меняем строки (immutable objects) Оставшиеся проблемы одним предложением:непонятно, когда удалять Один из вариантов решения – счетчик указателей При объекте храним количество указателей, которые на него указывают Тогда можем сказать, когда можно удалить (когда счетчик уменьшился до 0) Язык С++23

Строки с разделяемым содержимым // Пример: shared_string s1 = abc; shared_string s2 = klm; s2 = s1; // klm освобождается. На abc – 2 указателя. shared_string s3 = pqr; s1 = s3; // На abc – 1 указатель. s2 = s3; // abc удаляется Где хранить счетчик? Мы не можем хранить в классе shared_string, его тоже надо разделять для нескольких shared_string Вариант (м.б. не лучший) – в первом байте строки. Но возможны и другие решения Язык С++24

Программы из нескольких исходных файлов Язык С++25

Программа из нескольких файлов -1 Схема a.cpp b.cpp компилируем... а.obj b.obj linker … a.exe (или a.dll) Как определить что-то в одном файле, а использовать в другом? a.cpp void f(int i) { … } b.cpp … f(56); … // f надо объявить

Программа из нескольких файлов -2 a.cpp void f(int i) { … } b.cpp void f(int i);... … f(56); … // ОК, так все работает, но: // обычно так не делают! Почему? Неудобно, особенно если файлов много При изменениях надо много где исправлять Легко забыть исправить.

Программа из нескольких файлов – обычно пишут так: Директива include: #include смысл: включить в это место текст из файла a.cpp void f(int i) { … } a.h void f(int i); b.cpp #include a.h... … f(56); … с.cpp #include a.h... … f(42); … В a.h – все, что другие должны знать о a.cpp (все необходимые объявления)

Как добавить в проект новые файлы? Пусть мы хотим добавить в проект новый cpp файл. В Visual Studio это делается так: В меню выберите Project + Add New Item… В форме выберите в списке «С++ File (.cpp)» и в поле Name введите имя файла. Чтобы добавить новый h файл надо сделать то же самое, но в списке выбрать «Header File (.h)» Если не будет получаться – пишите, я подскажу.

Задачи на 5 мая Язык С++30

Задачи на 5 мая «Разные фигурки» Написать программу типа Circles, которая позволяет задавать картинки из каких-нибудь трех видов фигур (например, кружки, квадраты и ромбы). Д.б. возможность добавлять и удалять. Перемещение можно не реализовывать. Как выбирать фигуру для добавления? Один вариант: в меню выбираeм "текущую фигуру". О работе с меню будет документ на сайте. За эту задачу 2 балла – один за добавление и один за удаление. 2. Опишите шаблон функции, которая для любого последовательного контейнера (списка, вектора, deque) ищет сумму входящих в него положительных элементов. Замечание: шаблон должен работать не только для контейнеров из целых чисел, но и для вещественных, rational и т.д. (Продолжение на следующем слайде) Язык С++31

Задачи на 5 мая – 2 3. Шаблон fixed_queue - очередь фиксированной длины (аналог stack, но first in – first out). // Пример использованмя queue q; q.push(3); q.push(7); q.push(11); cout

Задачи на 5 мая – 3 5. Написать функцию, которая для целого числа проверяет, совершенное оно или нет, и возвращает true или false. Справка: число называется совершенным, если оно равно сумме своих делителей. Например: 28 = Что для такой функции д.б. написано в cpp файле, и что в h файле? Дополнительное пожелание: Желательно, чтобы функция работала по возможности быстро.