
- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Композиция классов
- •Дружественные функции класса
- •Дружественный класс
- •Использование указателя this
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Использование класса (драйвер класса)
void main()
{ time t; //создание объекта t класса time
t.printtime(0; //00:00:00
t.settime(15, 20, 5);
t.printtime(); //15:20:05
t.settime(26, 80, 95);
t.printtime(); //00:00:00
}
Примечания.
Данные-элементы не могут получать начальные значения в теле класса, где они объявляются. Могут – в конструкторе и в функциях.
Функции-элементы имеют прямой доступ к данным-элементам, поэтому могут не иметь параметров. Часто они короче обычных функций благодаря достоверности данных.
Функция-элемент может быть определена в теле класса (вместо прототипа), если она короткая.
Для идентификации функций-элементов используется: <имя класса>::.
Обычно класс имеет деструктор ~time(), который также входит в интерфейсную часть. Он объявляет свободной память, занимаемую объектом.
Можно изменять реализацию класса до тех пор, пока не потребуется изменять интерфейс класса. Это значительно упрощает модификацию программ.
Принято отделять реализацию класса от его объявления, что способствует высокому качеству разработки программного обеспечения.
Доступ к элементам класса
void main()
{ time t, // создается объект t
*tptr=&t, // создается указатель tptr на объект t
&c=t; // создается ссылка c на объект t
t.settime(5, 12, 8); t.printtime(); // 05:12:08
c.settime(11, 3, 5); c.printtime(); // 11:03:05
tptr->settime(19, 26, 27); tptr->printtime();// 19:26:27
}
Примечания.
1) Переменные, объявленные в функции-элементе, известны только этой функции, и имеют область действия эту функцию. Если имя этой переменной совпадает с именем переменной в области действия класс (это имя данного-элемента) то данное-элемент доступно так: <имя_класса>::<имя_переменной>.
2) Доступ к закрытым данным-элементам должен контролироваться функциями доступа. Например, “получить” – int geth() {return h;}. Чтобы клиентам класса дать возможность изменять закрытые данные, класс должен иметь функцию “установить”- void seth(int);
Отделение интерфейса от реализации
Продавцы программного обеспечения поставляют заголовочные файлы и объектные модули (для скрытия информации). Исходных кодов в продаже нет. Это стимулирует продавцов программного обеспечения поставлять библиотеки классов для продажи или лицензирования.
При отделении интерфейса от реализации используются следующие директивы препроцессора:
#ifndef – проверка неопределенности идентификатора;
#endif – окончание условной директивы #ifndef;
#define – определение идентификатора или макроса:
#define имя_константы значение константы,
имя_константы – идентификатор макроса, значение_константы – замещающий_текст.
Макрос – это операция, обозначаемая символьными строками.
Заголовочный файл должен содержать только объявления классов, структур и функций. В нем нет исполняемых операторов. Можно включать только подставляемые функции (inline).
//----------------------------------------------------------------------------------------------
//TIME1_H
//Заголовочный файл. Содержит объявление класса.
#ifndef TIME1_H
#define TIME1_H
class time{
-----------
};
#endif
//----------------------------------------------------------------------------------------------
//TIME1_CPP
//Определение функций-элементов класса time
#include “time1.h”
…………………………………..
//----------------------------------------------------------------------------------------------
//TIME.CPP
//Драйвер класса time
#..........................
# include “time1.h”
void main()
{
…………..
}
//----------------------------------------------------------------------------------------------
Директива #ifndef совместно с директивой #endif позволяет организовать условную обработку текста программы.
В директиве #ifndef идентификатор проверяется условие – неопределен ли идентификатор, т.е. неопределен в директиве #define.
Объявление класса будет включено в программу, если неопределен идентификатор TIME1_H. Кроме того, директива является защитой от повторного включения файла с объявлением класса.
Повторное включение может произойти, если несколько файлов, в каждом из которых указано препроцессорное включение одного и того же файла, объединяются в общий текст программы. Такими средствами защиты снабжены все заголовочные файлы стандартной библиотеки.