Задачи на 28 апреля презентация

Содержание

Задача 3: swp template void swp(T& x, T& y) { T tmp = x; x = y; y = tmp; } Замечание: T tmp; // Так хуже, чем T tmp

Слайд 1Задачи на 28 апреля


Язык С++


Слайд 2Задача 3: swp
template
void swp(T& x, T& y)
{
T tmp =

x;
x = y;
y = tmp;
}

Замечание:
T tmp; // Так хуже, чем T tmp = x;
tmp = x;
- Немного медленнее
- Более существенно, работает только если в классе есть конструктор по умолчанию (определение менее общее).


Язык С++


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

нашли, то удаляем
Перерисовываем


Язык С++


Слайд 4Задача 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) <= 100 ) { // Попали в круг?
m_circles.erase(p);
Invalidate();
break; // Больше не ищем
}
}
CView::OnRButtonDown(nFlags, point);
}
Перерисовать лучше только если куда-то попали
Кстати: тут после erase пользоваться p нельзя!


Язык С++


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


Язык С++


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

данных, и другой для их изображения

Слайд 7Архитектура Document-View
Данные хранятся не в окне, а в отдельном классе (C…Doc,

производный от CDocument)
Взаимодействие:
Из окна можно получить указатель на документ:
pDoc = GetDocument();
Можно обновить окно для документа (или окна, их может быть несколько):
UpdateAllViews(NULL);

Почему удобно использовать такую архитектуру?
Несколько окон для одного документа
Несколько способов просмотра
Вообще часто полезно разделять объект и его изображение
Примерно то же: MVC (model-view-controler).


Язык С++


Слайд 8Circles в архитектуре Document-View
m_circles - перенести в CCirclesDoc
class CCirclesDoc {

vector m_circles;
OnDraw: CCirclesDoc* pDoc= GetDocument();
for (int i = 0; i < pDoc->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);


Язык С++


Слайд 9Шаблоны классов


Язык С++


Слайд 10Пример: шаблон класса "стек"
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;
При использовании параметры надо указывать явно


Язык С++


Слайд 11Замечания
Методы можно описывать вне класса

template void stack::push(const T& x)
{

... }

В частности, конструктор:
template
stack::stack(): size(0)
{}


Язык С++


Слайд 12Еще возможности
Не типовые параметры:
template
class stack {

T stk[maxsize]; …
};
stack s;
Такие параметры м.б. только целые (и в некоторых случаях указатели)
При вызове д.б. константы
Внутри - как константы

Параметры по умолчанию template class stack { …

stack s; // To же, что stack


Язык С++


Слайд 13typename
Пусть в разных классах определен один вложенный тип.
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 и т.д.)?
Приходится подсказывать..


Язык С++


Слайд 14typename - продолжение
template
void f(T x)
{

typename T::mytype y;

}

typename

относится к выражению T::mytype
Означает: "мы обещаем, что при вызове это будет вложенный в T тип"




Язык С++


Слайд 15Специализация
Специализация шаблона

template
class stack {
// Что-то особенное
};

Специализация метода

template
void stack:: push(double

x) {
// Что-то особенное
};
Реальный пример из STL – vector


Язык С++


Слайд 16Частичная специализация
template
class stack {
// Что-то особенное
};

М.б. сложная система разных

специализаций
template
class abc { … };

template
class abc { … };

template
class abc { … };

template
class abc { … };

template
class abc { … };

Не во всех компиляторах! (Visual C++ после VS 2003)





Язык С++


Слайд 17Шаблон метода
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)


Язык С++


Слайд 18Параметры - шаблоны
Не будет на экзамене

template < template class T

>
class abc {
T x;
T y;
T z;

};

abc v;


Язык С++


Слайд 19Замечания
Пишем код, который работает для разных типов.
Называется: полиморфизм
Статический полиморфизм

По-моему опыту: Не

старайтесь использовать сложные возможности шаблонов
Легко запутаться


Язык С++


Слайд 20Еще об итераторах и контейнерах


Слайд 21value_type
T::value_type – тип того, что содержится в контейнере

Например, если T –

это list, то T::value_type – это int

И тоже для итераторов
Если T – это list::iterator, то T::value_type – это int
Используется, в основном, в шаблонах

Тут мы разбирали простой пример использования: шаблон функции, которая возвращает первый элемент любого последовательного контейнера. И обсудили типичные ошибки.

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

Язык С++


Слайд 23Несколько указателей на один объект в динамической памяти
Вспомним проблемы при копировании

string:
Меняем одну строку – меняются все
Ну, допустим, мы не меняем строки (immutable objects)

Оставшиеся проблемы одним предложением: “непонятно, когда удалять”
Один из вариантов решения – счетчик указателей
При объекте храним количество указателей, которые на него указывают
Тогда можем сказать, когда можно удалить (когда счетчик уменьшился до 0)


Язык С++


Слайд 24Строки с разделяемым содержимым
// Пример:
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
Вариант (м.б. не лучший) – в первом байте строки. Но возможны и другие решения


Язык С++


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


Язык С++


Слайд 26Программа из нескольких файлов -1
Схема

a.cpp
b.cpp
➔ компилируем...
а.obj
b.obj
➔ linker …
a.exe (или

a.dll)

Как определить что-то в одном файле, а использовать в другом?
a.cpp
void f(int i)
{

}

b.cpp
… f(56); …
// f надо объявить


Слайд 27Программа из нескольких файлов -2
a.cpp
void f(int i)
{

}

b.cpp
void f(int i); ...

f(56); …

// ОК, так все работает, но:
// обычно так не делают!

Почему?
Неудобно, особенно если файлов много
При изменениях надо много где исправлять
Легко забыть исправить.


Слайд 28Программа из нескольких файлов – обычно пишут так:
Директива 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 (все необходимые объявления)


Слайд 29Как добавить в проект новые файлы?
Пусть мы хотим добавить в проект

новый cpp файл. В Visual Studio это делается так:
В меню выберите Project + Add New Item…
В форме выберите в списке «С++ File (.cpp)» и в поле Name введите имя файла.

Чтобы добавить новый h файл надо сделать то же самое, но в списке выбрать «Header File (.h)»
Если не будет получаться – пишите, я подскажу.

Слайд 30Задачи на 5 мая


Язык С++


Слайд 31Задачи на 5 мая - 1
«Разные фигурки» Написать программу типа Circles,

которая позволяет задавать картинки из каких-нибудь трех видов фигур (например, кружки, квадраты и ромбы).
Д.б. возможность добавлять и удалять. Перемещение можно не реализовывать.
Как выбирать фигуру для добавления? Один вариант: в меню выбираeм "текущую фигуру". О работе с меню будет документ на сайте.
За эту задачу 2 балла – один за добавление и один за удаление.

Опишите шаблон функции, которая для любого последовательного контейнера (списка, вектора, deque) ищет сумму входящих в него положительных элементов. Замечание: шаблон должен работать не только для контейнеров из целых чисел, но и для вещественных, rational и т.д.
(Продолжение на следующем слайде)


Язык С++


Слайд 32Задачи на 5 мая – 2
Шаблон fixed_queue - очередь фиксированной

длины (аналог stack, но first in – first out).
// Пример использованмя
queue q;
q.push(3); q.push(7); q.push(11);
cout << q.pop(); // 3
cout << q.pop(); // 7
Реализовать shared_string
Надо реализовать: конструктор
деструктор, оператор=, конструктор
копирования, метод print.
При этом строчки не должны
никогда реально копироваться.

Надо только переставлять
указатели, подсчитывать их
количество, и удалять строки, на
которые уже никто не указывает.

За эту задачу тоже можно
заработать два балла. Один
балл для тех, кто напишет что-то
похожее на правильное решение,
и второй балл за совсем правильное
решение.
(Окончание на следующем слайде)



Язык С++


Слайд 33Задачи на 5 мая – 3
Написать функцию, которая для
целого числа проверяет,
совершенное

оно или нет, и
возвращает true или false.

Справка: число называется
совершенным, если оно равно сумме
своих делителей. Например:
28 = 1+2+4+7+14

Что для такой функции д.б.
написано в cpp файле, и что в h
файле?
Дополнительное пожелание:
Желательно, чтобы функция
работала по возможности быстро.



Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика