Программирование
<<  Офисное программирование Модульное программирование  >>
Картинок нет
Картинки из презентации «Обобщенное программирование» к уроку информатики на тему «Программирование»

Автор: Aleksey Malov. Чтобы познакомиться с картинкой полного размера, нажмите на её эскиз. Чтобы можно было использовать все картинки для урока информатики, скачайте бесплатно презентацию «Обобщенное программирование.pptx» со всеми картинками в zip-архиве размером 152 КБ.

Обобщенное программирование

содержание презентации «Обобщенное программирование.pptx»
Сл Текст Сл Текст
1Обобщенное программирование. 29Требования Произвольные критерии сравнения
2Что такое обобщенное программирование? элементов массива Возможность выполнения
Парадигма программирования, заключающаяся сортировки по возрастанию и убыванию
в написании алгоритмов, которые можно Возможность упорядочивания объектов по
применять к различным типам данных. различным параметрам.
3Предпосылки использования. Различные 30Класс Comparator, задающий критерий
типы данных часто требуется обрабатывать сравнения элементов. Template <class
при помощи одних и тех же алгоритмов T> class ccomparator { public: bool
Сортировка и поиск Контейнеры для lessthan(t const& a, T const&
произвольного типа элементов b)const { return a < b; } }; //
Программирование на основе стратегий. специализация класс ccomparator для
4Шаблоны функций. сравнения указателей на char template
5Пример. Требуется разработать <> class ccomparator<const char
семейство функций maximum(a, b), *> { public: bool lessthan(const char *
возвращающую значение наибольшего из const& a, const char * const&
аргументов a и b Аргументы a и b могут b)const { return strcmp(a, b) < 0; } };
иметь произвольный тип int unsigned int 31Передача операций как параметров
double float. функций. Операцию сравнения (объект типа
6Простейший способ решения – перегрузка CComparator) будем передавать в качестве
функций. int maximum(int a, int b) { параметра в шаблонную функцию Sort Это
return (a > b) ? a : b; } unsigned int даст возможность использования различных
maximum(unsigned int a, unsigned int b) { критериев сравнения элементов одного и
return (a > b) ? a : b; } float того же массива Например, сортировать
maximum(float a, float b) { return (a > объекты по различным свойствам или менять
b) ? a : b; } double maximum(double a, порядок сортировки на противоположный.
double b) { return (a > b) ? a : b; }. 32Функция Sort. template <class T,
7Недостатки. Тело функции приходится class Comp> void sort(CArray<T>
писать несколько раз Усложнение процесса & arr, Comp const& comp) {
внесения изменений в реализацию функций unsigned n = arr.GetLength(); for
Ситуация усложняется, если различные (unsigned i = 0; i < n - 1; i++) { for
экземпляры одной и той же функции (unsigned j = n - 1; i < j; j--) { if
разнесены по различным файлам или модулям. (comp.LessThan(arr[j], arr[j-1])) { T temp
8Решение – использование шаблонов = arr[j]; arr[j] = arr[j-1]; arr[j-1] =
функций. Язык C++ имеет языковые средства, temp; } } } }.
позволяющие определить функцию-шаблон, 33Пример использования. Template
работающую с некоторыми абстрактными <class T> class ccomparator2 {
типами данных Термин «абстрактный» в public: bool lessthan(t const& a, T
данном случае не связан с наследованием, а const& b) const { return a > b; }
обозначает некоторый тип данных Шаблон }; int main() { carray<double>
задает поведение целого семейства функций doublearray; doublearray.Push(3.8);
и может быть в дальнейшем использован с doublearray.Push(5.1); // сортируем массив
некоторыми конкретными типами данных по убыванию элементов sort(doublearray,
Шаблонные функции широко используются для ccomparator2<double>());
реализации алгоритмов в библиотеке STL. assert(doublearray[0] == 5.1);
9Ограничения. Реализация (исходный код) assert(doublearray[1] == 3.8); return 0;
шаблонной функции должна быть доступна из }.
всех единиц компиляции, где она 34Шаблонные методы класса.
используется. 35Шаблонные методы класса. В любом
10Пример. // Объявляем шаблонную функцию классе (в том числе и шаблонном) можно
maximum, принимающую // аргументы объявить метод-шаблон Пример: В классе
некоторого типа T template <class T> CSimpleArray можно реализовать шаблонный
T maximum(t a, T b) { return (a > b) ? оператор присваивания, позволяющий
a : b; } int main() { int max1 = присваивать массивы разных типов и длины.
maximum(3, 5); float max2 = maximum(-3.7f, 36Исходный код: Template <typename T,
0.35f) double max3 = maximum(1.2, 7.4); size_t SIZE> class csimplearray {
std::string max4 = public: ... template <class T1, size_t
maximum(std::string(“hello"), SIZE1> csimplearray<t, SIZE>
std::string(“world")); return 0; }. & operator=(const csimplearray<t1,
11Шаблонные операторы. SIZE1> & other) { if ((void*)this
12Шаблонные операторы. Оператор – != (void*)&other) // защита от
частный случай функции, и он также может самоприсваивания { size_t const minsize =
быть шаблонным Пример – разработать для (SIZE < SIZE1) ? SIZE : SIZE1; for
класса «Счетчик» шаблонные операторы (size_t i = 0; i < minsize; ++i) {
<< и >> для работы с классами m_items[i] = static_cast<t
стандартных потоков STL. const&>(other[i]); } // заполняем
13Класс «счетчик». Конструктор может остаток массива (при его наличии)
быть помечен как явный при помощи значениями по умолчанию for (size_t i =
ключевого слова explicit , чтобы запретить SIZE1; i < SIZE; ++i) { m_items[i] =
возможность его неявного вызова в T(); } } return *this; } ... }. int
ситуациях, вроде следующих: CCounter main(int argc, char * argv[]) {
counter(20, 5); counter = 10; CSimpleArray<double, 8> doubleArray;
эквивалентно: CCounter counter(20, 5); CSimpleArray<int, 5> intArray(7);
counter = CCounter(10, 0); Class ccounter doubleArray = intArray; return 0; }.
{ public: explicit ccounter(unsigned 37Шаблоны и наследование.
maxvalue, counter = 0) 38Использование шаблонов при
:m_maxvalue(maxvalue), наследовании. Ограничений на использование
m_counter(counter){} unsigned шаблонов при наследовании нет: Шаблон
getvalue()const{return m_counter;} унаследован от простого класса Простой
unsigned getmaxvalue()const{return класс унаследован от шаблона Шаблон
m_maxvalue;} ccounter& operator++() { унаследован от шаблона С помощью шаблонов
++m_counter; if (m_counter >= можно создавать полные или частичные
m_maxvalue) { m_counter = 0; } return реализации некоторых интерфейсов В этом
*this; } ccounter const operator++(int) // случае шаблонный параметр выступает в
постфиксная форма инкремента { // создаем качестве родительского класса Сам
копию, выполняем предынкремент и шаблонный класс при этом используется как
возвращаем копию ccounter tmpcopy(*this); основа для создания конкретных классов.
++*this; return tmpcopy; } private: 39Наследование шаблона от простого
unsigned m_maxvalue, m_counter; }; класса. Данный тип наследования позволяет
14Перегрузка оператора вывода в поток решить проблему «разбухания» кода при
для класса «Счетчик». // Выводим инстанцировании шаблонов В этом случае в
информацию о счетчике в виде базовый класс выносится «тяжелая»
[counter/maxvalue] // в произвольный поток реализация, которой «облегченный» таким
вывода template <class T> образом шаблонный класс делегирует
std::basic_ostream<t>& выполнение своих методов.
operator<<( 40Пример – стек указателей. Указатели на
std::basic_ostream<t>& stream, разные типы данных хранятся в памяти
ccounter const& counter) { stream одинаковым образом Исключение – указатели
<< "[" << на члены класса Для каждого типа
counter.Getvalue() << "/« указателей, используемого в программе
<< counter.Getmaxvalue() << будет создана (инстанциирована) своя
"]"; return stream; }. версия класса CStack Разбухание двоичного
15Перегрузка оператора чтения из потока кода Решение проблемы – специализация
для класса «Счетчик». template <class шаблонов и наследование от полной
T> std::basic_istream<T>& специализации класса CStack для указателей
operator>>( типа void*.
std::basic_istream<T>& stream, 41Иерархия классов.
CCounter & counter) { std::streamoff 42Исходный код. // Первичный шаблон
pos = stream.tellg(); unsigned maxValue = template <typename T> class cstack {
0; unsigned currentValue = 0; if ( public: void push(t const& t) {…} T
(stream.get() == '[') && (stream gettop()const{…} void pop(){…} bool
>> currentValue) && isempty(){…} private: … }; // полная
(stream.get() == '/') && (stream специализация шаблона // для указателей на
>> maxValue) && void template <> class
(stream.get() == ']') ) { counter = cstack<void*> { public: void
CCounter(maxValue, currentValue); return push(void * p){…} void * gettop()const{…}
stream; } stream.seekg(pos); void pop(){} bool isempty()const{} }; //
stream.setstate(std::ios_base::failbit | Частичная специализация шаблона для //
stream.rdstate()); return stream; }. произвольных указателей template
16Пример использования перегруженных <typename T> class cstack<t*>
операций ввода-вывода. #Include : private cstack<void*> { private:
<iostream> #include “counter.H” int typedef cstack<void*> cbase; public:
main(int argc, char* argv[]) { ccounter void push(t * p) { cbase::push(p); } T *
c(10); // считывает данные о счетчике из gettop()const { return
стандартного ввода в формате: // static_cast<t*>(cbase::gettop()); }
[counter/maxvalue] std::cin >> c; // void pop() { cbase::pop(); } bool
выводит данные о счетчике в стандартный isempty()const { return cbase::isempty();
вывод в формате: // [counter/maxvalue] } };
std::cout << c; return 0; }. 43Наследование простых классов от
17Шаблоны классов. шаблонов. Задача – подсчет количества
18Шаблоны классов. Подобно шаблонам существующих экземпляров объектов
функций программисту может понадобиться некоторых классов Решение: Создать базовый
иметь шаблоны классов Они задают способы шаблонный класс, конструкторы (по
построения отдельных классов, подобно умолчанию и копирования) и деструктор
тому, как класс задает способ построения которого осуществляют инкремент/декремент
отдельных объектов Шаблонные классы широко счетчика В качестве параметра шаблона
используются в библиотеках STL и BOOST, будет выступать класс, для которого
например, для реализации контейнеров и необходимо вести подсчет экземпляров
умных указателей Исходный код методов Классы, для которых необходимо вести учет
шаблонного класса также должен быть количества экземпляров публично
доступен из всех единиц компиляции, где он наследуются от класса-счетчика.
используется. 44Иерархия классов.
19Пример – простейший шаблон массивов 45Исходный код. template <class T>
произвольной длины. template <class class CCountable { public: static size_t
T> class CArray { public: CArray(){...} GetInstanceCount() { return m_counter; }
virtual ~CArray(){...} unsigned protected: CCountable() { ++m_counter; }
GetLength()const{...} void Push(T CCountable(CCountable const& other) {
const& item){...} T& ++m_counter; } ~CCountable() {
operator[](unsigned index){...} T --m_counter; } private: static size_t
const& operator[](unsigned m_counter; }; template<class T>
index)const{...} void Resize(unsigned size_t CCountable<T>::m_counter = 0;
newSize){...} CArray(CArray class CSomeClass : public
const&){...} CArray operator=(CArray CCountable<CSomeClass> { public: };
const&){...} private: T * m_pItems; int main(int argc, char* argv[]) {
unsigned m_size; }; CSomeClass someObject; std::cout <<
20Продолжение. int main() { CSomeClass::GetInstanceCount() <<
CArray<int> intArray; "\n"; { CSomeClass
intArray.Push(3); intArray.Push(4); someOtherObject; std::cout <<
intArray[0] = 2; intArray.Resize(1); CSomeClass::GetInstanceCount() <<
CArray<std::string> stringArray; "\n"; } std::cout <<
stringArray.Push("Hello"); CSomeClass::GetInstanceCount() <<
stringArray.Push("World"); "\n"; return 0; }. Output: 1 2
stringArray[0] = ("Goodbye"); 1.
return 0; }. 46Пример 2 - иерархия фигур. Свойства:
21Параметры шаблонов, не являющиеся Цвет Площадь.
типами. 47Реализация без шаблонов. class Color
22Допустимые параметры шаблона, не {…}; class IShape { public: virtual Color
являющиеся типами. В качестве параметров GetColor()const=0 virtual void
шаблонов могут выступать не только типы SetColor(Color const& c)=0; virtual
данных, но и: Объекты интегрального или double GetArea()const=0; }; class
перечислимого типа Целые типы Перечислимые IRectangle : public IShape { … }; class
типы Тип bool Указатели на объект или ICircle : public IShape { … }; class
указатель на функцию Ссылки на объект или CCircle : public ICircle { public: …
ссылка на функцию Указатели на методы virtual Color GetColor()const { return
класса. m_color; } virtual Color SetColor(Color
23Пример: класс массивов фиксированной const& c) { m_color = c; } virtual
длины. int main(int argc, char * argv[]) { GetArea()const { return PI * m_radius *
CSimpleArray<std::string, 10> m_radius; } private: Color m_color; double
stringArray; try { stringArray[0] = m_radius; }; class CRectangle: public
"Hello"; // throws an exception IRectangle { public: … virtual Color
stringArray[10] = "World"; } GetColor()const { return m_color; }
catch (std::range_error const& e) { virtual Color SetColor(Color const& c)
std::cout << e.what(); } return 0; { m_color = c; } virtual GetArea()const {
}. template <typename T, size_t return m_width * m_height; } private:
SIZE> class CSimpleArray { public: Color m_color; double m_width, m_height;
CSimpleArray(T const& value = T()) { };
for (size_t i = 0; i < SIZE; ++i) { 48Устраняем дублирование кода. Создаем
m_items[i] = value; } } size_t абстрактный шаблонный класс CShapeImpl,
GetSize()const{return SIZE;} T& реализующий виртуальные функции для
operator[](size_t index) { if (index >= установки и получения цвета В качестве
SIZE) throw std::range_error("Index параметра шаблона будет выступать базовый
is out of range"); return класс: template <class Base> class
m_items[index]; } T const& CShapeImpl : public Base {…}; Класс
operator[](size_t index)const { if (index является абстрактным, т.к. класс не
>= SIZE) throw реализует метод вычисления площади Класс
std::range_error("Index is out of CCircle и CRectangle наследуются от
range"); return m_items[index]; } CShapeImpl В качестве шаблонного параметра
private: T m_items[SIZE]; }; выступают интерфейсы IСircle и IRectangle
24Примечания. Разработанный класс соответственно: class CCircle : public
CSimpleArray при всей своей простоте CShapeImpl<ICircle> {…};
обладает рядом преимуществ перед обычным 49Обновленная иерархия.
массивом При доступе к элементам массива 50Обновленная реализация. class Color
осуществляется проверка индексов Наличие {…}; class IShape { public: virtual Color
оператора присваивания и конструктора GetColor()const=0 virtual void
копирования Элементы массива всегда SetColor(Color const& c)=0; virtual
инициализированы значением конструктора по double GetArea()const=0; }; class
умолчанию для типа T Для встроенных типов IRectangle : public IShape { … }; class
происходит инициализация нулем. ICircle : public Ishape { … }; template
25Специализация шаблонов. <class Base> class CShapeImpl :
26Специализация шаблона. Наряду с общим public Base { public: … virtual Color
шаблоном бывает необходима некоторая GetColor()const { return m_color; }
специализированная версия этого же шаблона virtual Color SetColor(Color const& c)
При специализации на основе исходного { m_color = c; } private: Color m_color;
первичного шаблона реализуется его }; class CRectangle: public
специализированная версия для некоторых CShapeImpl<IRectangle> { public:
конкретных параметров Типы специализации virtual GetArea()const { return m_width *
Полная Конкретизированы все параметры m_height; } private: double m_width,
первичного шаблона Частичная m_height; }; class CCircle: public
Конкретизирована только часть параметров. CShapeImpl<ICircle> { public:
27Пример – функция maximum. // Первичный virtual GetArea()const { return PI *
шаблон функции нахождения максимума m_radius * m_radius; } private: double
template <class T> T maximum(t a, T m_radius; };
b) { return (a > b) ? a : b; } // 51Преимущества использования шаблонов.
специализация шаблонной функции maximum Повторное использование кода Меньше ручной
типом const char* template <> const работы Обобщенные контейнеры и алгоритмы
char* maximum<const char*>(const Умные указатели Возможность использования
char * s1, const char *s2) { return шаблонных реализаций интерфейсов при
(strcmp(s1, s2) > 0) ? s1 : s2; } int построении иерархий наследования.
main(int argc, char * argv[]) { std::cout 52Недостатки использования шаблонов.
<< maximum(2, 3) << Раздувание бинарного кода При
"\n"; // output: 3 std::cout использовании шаблонных функций и классов
<< maximum("world", компилятор генерирует код на этапе
"hello") << компиляции для всех использованных с
"\n"; // output: world return 0; данным шаблоном типов данных Увеличение
}. времени компиляции Не все распространенные
28Совместное использование шаблонных компиляторы поддерживают шаблоны в полной
классов и функций. мере Код, содержащий шаблоны сложнее
29Задача. Разработать функцию, анализировать Сложность анализа сообщений
выполняющую пузырьковую сортировку компилятора об ошибках компиляции.
шаблонных массивов CArray<T>
Обобщенное программирование.pptx
http://900igr.net/kartinka/informatika/obobschennoe-programmirovanie-191045.html
cсылка на страницу

Обобщенное программирование

другие презентации на тему «Обобщенное программирование»

«Операция в программировании» - Часть 3. Семафор. // Матрицы размера n на n double[][] a, b, c; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { c[i][j] = 0; for (int k = 0; k < n; k++) { c[i][j] += a[i][k] * b[k][j]; } } }. Поток-клиент ждет выполнения задания потоком-сервером. Примитивы синхронизации. Рекурсивный параллелизм.

«Объектно-ориентированное программирование» - Содержание. Зарплата 1. Вопрос 1. Применение иерархии классов делает управляемыми большие потоки информации. Фокусирование на объектах упрощает для нас понимание сложных вещей. Перечислите основные этапы развития технологии программирования. Этапы развития программирования. Такой механизм получения новых классов называется порождением.

«Курсы программирования» - Как работать с фильтрами? Создание открыток. Перспективы по окончанию курса. Трехмерная графика 3DMax. Углубление знаний основных типов данных (символы, массивы, записи, множества, файлы). Работа с текстом в Photoshop (ввод, редактирование форматирование символов и абзацев). Использование различных эффектов.

«Линейное программирование» - 1. Создадим область переменных. Один из создателей линейного программирования. Первое ограничение. В ячейках А11:А13 будем вычислять левые части ограничений в системе. Второе ограничение. 4. Вызовем окно диалога Поиск решения. Укажем ограничения 4) Нажимаем кнопку Добавить Появится окно Добавление ограничения.

«Язык программирования Паскаль» - Обучает хорошему стилю программирования, воспитывает дисциплину структурного программирования. Алгоритмический язык Паскаль. Язык программирования Паскаль. Блез Паскаль (1623 – 1662). Гибок и развит в отношении типов данных. назван в честь английского ученого Блеза Паскаля. ЯП Паскаль выбран как наиболее удовлетворяющий целям обучения:

«Классификация языков программирования» - Повтори способы записи алгоритма и виды программ переводчиков. Утилита для работы с библиотеками; встроенная справочная служба; отладочная программа. Словесную запись алгоритма; графическую запись алгоритма; программную запись алгоритма. Задание. Процедурным языкам; логическим языкам; объектно-ориентированным языкам.

Программирование

31 презентация о программировании
Урок

Информатика

130 тем
Картинки
900igr.net > Презентации по информатике > Программирование > Обобщенное программирование