
- •Лекция 1 Основы алгоритмизации
- •1.1 Языки программирования
- •1.2 Этапы решения задач на компьютере
- •1.3 Понятие алгоритма и его свойства
- •1.4 Графическое описание алгоритмов. Схемы алгоритмов
- •Блоки для изображения схем алгоритмов и программ
- •1.5 Типы алгоритмов
- •Лекция 2 Начальные сведения о языке
- •2.3 Компиляция и выполнение программы
- •Лекция 3 Имена, переменные и константы
- •3.1 Имена
- •3.2 Переменные
- •3.3 Константы
- •Лекция 4 Операции и выражения
- •4.1 Выражения
- •4.2 Операция присваивания
- •4.3.1 Арифметические операции
- •4.3.2 Операции сравнения
- •4.4 Порядок вычисления выражений
- •Лекция 5 Операторы
- •5.1 Что такое оператор
- •5.1.1 Операторы-выражения
- •5.1.2 Объявления имен
- •5.1.3 Операторы управления
- •5.1.3.1 Условные операторы
- •5.1.3.2 Операторы цикла
- •5.1.3.3 Оператор возврата
- •5.1.3.4 Оператор перехода
- •Лекция 6 Функции
- •6.1 Вызов функций
- •6.2 Имена функций
- •6.3 Необязательные аргументы функций
- •6.4 Рекурсия
- •Лекция 7 Встроенные типы данных
- •7.1 Общая информация
- •7.2 Целые числа
- •7.3 Вещественные числа
- •7.4 Логические величины
- •7.5 Символы и байты
- •7.6 Кодировка, многобайтовые символы
- •7.7 Наборы перечисляемых значений
- •Лекция 8 Классы и объекты
- •8.1 Понятие класса
- •8.2 Определение методов класса
- •8.3 Переопределение операций
- •8.4 Подписи методов и необязательные аргументы
- •8.4.1 Запись классов
- •Лекция 9 Производные типы данных
- •9.1 Массивы
- •9.2 Структуры
- •9.2.1 Битовые поля
- •9.3 Объединения
- •9.4 Указатели
- •9.4.1 Адресная арифметика
- •9.4.2 Связь между массивами и указателями
- •9.4.3 Бестиповый указатель
- •9.4.4 Нулевой указатель
- •9.5 Строки и литералы
- •Лекция 10 Распределение памяти
- •10.1 Автоматические переменные
- •10.2 Статические переменные
- •10.3 Динамическое выделение памяти
- •10.4 Выделение памяти под строки
- •10.5 Рекомендации по использованию указателей и динамического распределения памяти
- •10.6 Ссылки
- •10.6 Распределение памяти при передаче аргументов функции
- •10.6.1 Рекомендации по передаче аргументов
- •Лекция 11 Производные классы, наследование
- •11.1 Виртуальные методы
- •11.1.1 Виртуальные методы и переопределение методов
- •11.2 Преобразование базового и производного классов
- •11.3 Внутреннее и защищенное наследование
- •11.4 Абстрактные классы
- •11.5 Множественное наследование
- •11.5.1 Виртуальное наследование
- •15.2 Проблема использования общих функций и имен
- •15.3 Использование включаемых файлов
- •15.4 Препроцессор
- •15.4.1 Определение макросов
- •Условная компиляция
- •15.4.2 Дополнительные директивы препроцессора
- •Лекция 16 Определение, время жизни и области видимости переменных в больших программах
- •16.1 Файлы и переменные
- •16.1.1 Общие данные
- •16.1.2 Глобальные переменные
- •16.1.3 Повышение надежности обращения к общим данным
- •16.2 Область видимости имен
- •16.3 Оператор определения контекста namespace
- •Лекция 17 Обработка ошибок
- •17.1 Виды ошибок
- •17.2 Возвращаемое значение как признак ошибки
- •17.3 Исключительные ситуации
- •17.3.1 Обработка исключительных ситуаций
- •17.3.2 Примеры обработки исключительных ситуаций
- •Лекция 18 Bвод-вывод
- •18.1 Потоки
- •18.3 Манипуляторы и форматирование ввода-вывода
- •18.4 Строковые потоки
- •18.5 Ввод-вывод файлов
- •Лекция 19 Шаблоны
- •19.1 Назначение шаблонов
- •19.2 Функции-шаблоны
- •19.3 Шаблоны классов
- •19.3.1 "Интеллигентный указатель"
- •19.3.2 Задание свойств класса
- •Список использованных источников
- •Содержание
19.3.2 Задание свойств класса
Одним из методов использования шаблонов является уточнение поведения с помощью дополнительных параметров шаблона. Предположим, мы пишем функцию сортировки вектора:
template <class T>
void sort_vector(vector<T>& vec)
{
for (int i = 0; i < vec.size() -1; i++)
for (int j = i; j < vec.size(); j++) {
if (vec[i] < vec[j]) {
T tmp = vec[i];
vec[i] = vec[j];
vec[j] = tmp;
}
}
}
Эта функция будет хорошо работать с числами, но если мы захотим использовать ее для массива указателей на строки (char*), то результат будет несколько неожиданный. Сортировка будет выполняться не по значению строк, а по их адресам (операция "меньше" для двух указателей – это сравнение значений этих указателей, т.е. адресов величин, на которые они указывают, а не самих величин). Чтобы исправить данный недостаток, добавим к шаблону второй параметр:
template <class T, class Compare>
void sort_vector(vector<T>& vec)
{
for (int i = 0; i < vec.size() -1; i++)
for (int j = i; j < vec.size(); j++) {
if (Compare::less(vec[i], vec[j])) {
T tmp = vec[i];
vec[i] = vec[j];
vec[j] = tmp;
}
}
}
Класс Compare должен реализовывать статическую функцию less, сравнивающую два значения типа T. Для целых чисел этот класс может выглядеть следующим образом:
class CompareInt
{
static bool less(int a, int b)
{ return a < b; };
};
Сортировка вектора будет выглядеть так:
vector<int> vec;
sort<int, CompareInt>(vec);
Для указателей на байт (строк) можно создать класс
class CompareCharStr
{
static bool less(char* a, char* b)
{ return strcmp(a,b) >= 0; }
};
и, соответственно, сортировать с помощью вызова
vector<char*> svec;
sort<char*, CompareCharStr>(svec);
Как легко заметить, для всех типов, для которых операция "меньше" имеет нужный нам смысл, можно написать шаблон класса сравнения:
template<class T> Compare
{
static bool less(T a, T b)
{ return a < b; };
};
и использовать его в сортировке (обратите внимание на пробел между закрывающимися угловыми скобками в параметрах шаблона; если его не поставить, компилятор спутает две скобки с операцией сдвига):
vector<double> dvec;
sort<double, Compare<double> >(dvec);
Чтобы не загромождать запись, воспользуемся возможностью задать значение параметра по умолчанию. Так же, как и для аргументов функций и методов, для параметров шаблона можно определить значения по умолчанию. Окончательный вид функции сортировки будет следующий:
template <class T, class C = Compare<T> >
void sort_vector(vector<T>& vec)
{
for (int i = 0; i < vec.size() -1; i++)
for (int j = i; j < vec.size(); j++) {
if (C::less(vec[i], vec[j])) {
T tmp = vec[i];
vec[i] = vec[j];
vec[j] = tmp;
}
}
}
Второй параметр шаблона иногда называют параметром-штрих, поскольку он лишь модифицирует поведение класса, который манипулирует типом, определяемым первым параметром.
Список использованных источников
Конспект лекций составлен в основе по материалам Интернет-Университета информационных технологий «ИНТУИТ» www.intuit.ru.
Государственный образовательный стандарт высшего профессионального образования. Направление подготовки дипломированного специалиста 654600 – Информатика и вычислительная техника. Квалификация – инженер. Москва, 2000.
И.Г.Гоулд, Дж.С.Тутилл. Терминологическая работа IFIP (Международная федерация по обработке информации) и ICC (Международный вычислительный центр) // Журн. вычисл. матем. и матем. физ., 1965, #2. - С. 377-386.
Г.Майерс. Надежность программного обеспечения. - М.: Мир, 1980.
Ian Sommerville. Software engineering. - Addison-Wesley Publishing Company, 1992.
Э. Дейкстра. Заметки по структурному программированию / У. Дал, Э. Дейкстра, К. Хоор. Структурное программирование. - М.: Мир, 1975. - С. 7-97.
Criteria for evaluation of software. - ISO TC97/SC7 #367 (Supersedes Document #327).
С.И. Ожегов. Словарь русского языка. - М.: Советская энциклопедия, 1975.
Ф.Я. Дзержинский, И.М. Калиниченко. Дисциплина программирования Д: концепция и опыт реализации методических средств программной инженерии. - М.: ЦНИИ информации и технико-экономических исследований по атомной науке и технике, 1988.
В. Турский. Методология программирования. - М.: Мир, 1981.
Г. Буч. Объектно-ориентированное проектирование с примерами применения. - М.: Конкорд, 1992.
Е.А. Жоголев. Система программирования с использованием библиотеки подпрограмм / Система автоматизация программирования. - М.: Физматгиз, 1961. - С. 15-52.
Ф.П. Брукс, мл. Как проектируются и создаются программные комплексы. - М.: Наука, 1979.
R.C. Holt. Structure of computer programs: A Survey // Proceedings of the IEEE, 1975, 63(6). - P. 879-893.
Дж. Хьюз, Дж. Мичтом. Структурный подход к программированию. - М.: Мир, 1980.
Е.А. Жоголев. Технологические основы модульного программирования // Программирование, 1980, #2. - С. 44-49.
Б. Боэм, Дж. Браун, Х. Каспар и др. Характеристики качества программного обеспечения. - М.: Мир, 1981.
В.В. Липаев. Качество программного обеспечения. - М.: Финансы и статистика, 1983.
Б. Шнейдерман. Психология программирования. - М.: Радио и связь, 1984.
Revised version of DP9126 - Criteria of the evaluation of software quality characteristics. ISO TC97/SC7 #610. Part 6.
В.Ш. Кауфман. Языки программирования. Концепции и принципы. - М.: Радио и связь, 1993.
Требования и спецификации в разработке программ. - М.: Мир, 1984.
В.Н. Агафонов. Спецификация программ: понятийные средства и их организация. - Новосибирск: Наука (Сибирское отделение), 1987.
В.В. Липаев, Е.Н Филиппов. Мобильность программ и данных в открытых информационных системах. - М.: Научная книга, 1997.
Шауцукова Л.3. Информатика: Учеб. пособие для 10 - 11 кл. общеобразоват. учреждений / Л.З. Шауцукова. – М.: Просвещение, 2000.
Островейковский В.А. Информатика: Учебник для вузов. – М.: Высш. шк., 2000.
Николаев В.И., Чалов Д.В., Сибирев В.Н. Информатика. Теоретические основы: Учеб. пособие. – СПб.: СЗТУ, 2002.
ГОСТ 19.701–90 (ИСО 5807–85) «Единая система программной документации».
Белов М.П. Основы алгоритмизации в информационных системах: Учеб. пособие. – СПб, СЗТУ, 2003. – 85 с.
Дж.Хьюз, Дж. Мичтом. Структурный подход к программированию. М.: Мир, 1980. - С. 29-71.
В. Турский. Методология программирования. - М.: Мир, 1981. - С. 90-164.
Е.А. Жоголев. Технологические основы модульного программирования // Программирование, 1980, #2. - С. 44-49.
R.C. Holt. Structure of Computer Programs: A Survey // Proceedings of the IEEE, 1975, 63(6). - P. 879-893.
Г. Майерс. Надежность программного обеспечения. М.: Мир, 1980. - С. 92-113.
Я. Пайл. АДА - язык встроенных систем. М.: Финансы и статистика, 1984. - С. 67-75.
М. Зелковец, А. Шоу, Дж. Гэннон. Принципы разработки программного обеспечения. М.: Мир, 1982. - С. 65-71.
А.Л. Фуксман. Технологические аспекты создания программных систем. М.: Статистика, 1979. С. 79-94.