
- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Композиция классов
- •Дружественные функции класса
- •Дружественный класс
- •Использование указателя this
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Оператор switch (переключатель)
операторы
Пример (калькулятор на 4 действия)
#include <iostream.h>
void main()
{
int a, b, res;
char op;
cin>>a>>b>>op;
int f=1;
switch (op) {
case’+’: res=a+b; break;
case’-‘: res=a-b; break;
……………………….
default: cout<<”\nНеизвестная операция”;
f=0;
}
if(f) cout<<”\nРезультат: “<<res;
}
Динамические структуры данных
Наиболее часто в программах используются массивы, структуры и их сочетание, например, массивы структур, элементами (полями) которых являются массивы и структуры.
Память под такие данные выделяется либо на этапе компиляции (в этом случае необходимый объем памяти известен до начала выполнения программы, т.е. задан в виде константы), либо во время выполнения программы с помощью операции new или функции malloc (необходимый объем памяти должен быть известен до распределения памяти). В обоих случаях выделяется непрерывный участок памяти.
Если до начала работы с данными невозможно определить, сколько памяти потребуется для их хранения, т.е. объем данных неизвестен, то память выделяется по мере необходимости отдельными блоками, связываемыми друг с другом с помощью указателей. Такой способ организации данных называется динамическими структурами данных, поскольку их размер изменяется во время выполнения программы. В общем случае динамическая структура занимает несмежные участки ОП.
Из динамических структур чаще всего используются стеки, очереди, списки и бинарные деревья.
Элемент любой динамической структуры представляет собой структуру, содержащую как минимум два поля: для хранения данных и для указателя.
struct Node {
Data d; // тип данных должен быть определен ранее
Node* p;
};
В общем случае полей данных и указателей может быть несколько. Поля данных могут быть любого типа: основного, составного или типа указатель.
Стек
Добавление элементов и выборка элементов выполняется из вершины стека. Другие операции со стеком не определены. Можно ещё прочитать данные в элементе на вершине стека без выборки. При выборке элемент исключается из стека. Стек реализует принцип обслуживания LIFO (last in, first out – последним пришел, первым ушел).
Примечание. Область оперативной памяти под локальные переменные выделяется по принципу LIFO. Поэтому эта область и названа стеком. Стеки широко применяются в системном программном обеспечении, компиляторах, в рекурсивных алгоритмах.
Пример. Программа формирует стек из 5 чисел (1, 2, 3, 4, 5) и выводит его на экран. Функцию помещения в стек называют push (вталкивать), а выборки – pop (выталкивать). Указатель для работы со стеком (top) всегда ссылается на его вершину.
//--------------------------------------------------------------------------------------
#include <iostream.h>
struct Node{
int d;
Node* p;
};
//---------------------------------------------
Node* first(int d);
void push(Node** t, int d);
int pop(Node** t);
//----------------------------------------------
void main()
{ Node* top = first(1);
for(int i=2; i<6; i++) push(&top, i);
while(top)
cout<<pop(&top)<<’ ‘;
}
//------------------------------------------------
На экране: 5 4 3 2 1
//------------------------------------------------
//Начальное формирование стека
Node* first(int d){
Node* pv=new Node;
pv->d=d;
pv->p=0;
return pv;
}
//----------------------------------------------------------------------
// Занесение в стек
void push(Node** t, int d)
{ Node* pv=new Node;
pv->d=d;
pv->p=*t;
*t=pv;
}
0
//---------------------------------------------------------------------------------------
// Выборка из стека
int pop(Node** t)
{ int z=(*t)->d;
Node* pv=*t;
*t=(*t)->p;
delete pv;
return z;
}