
- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Композиция классов
- •Дружественные функции класса
- •Дружественный класс
- •Использование указателя this
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Арифметические операции.
int x[10],*x1ptr,*x2ptr; // объявлен массив из целых и два указателя на целое.
Имя массива является также именем указателя, в котором находится адрес массива, т.е. адрес первого элемента массива – x[0]. Поэтому можно написать равнозначные операторы
x1ptr=x; или x1ptr=&x[0];
Значения указателей x1ptr, x2ptr можно изменять. Значение указателя x изменять нельзя, поскольку массив x сохраняет свое положение в памяти во время выполнения программы. Поэтому указатель x с именем массива является константным указателем, в отличие от указателей x1ptr и x2ptr, которые являются переменными указателями.
После выполнения операций - модификация указателя x1ptr+=2 и разыменование *x1ptr будет получен доступ к элементу массива x[2].
Примечание. Нельзя x+=2, поскольку x – константный указатель, всегда указывает на начало массива.
Для перехода на следующий элемент массива можно использовать для указателя операции инкремента: ++x1ptr, x1ptr++, а для перехода на предыдущий – операции декремента: --x1ptr, x1ptr--.
Переменные указатели можно вычитать один из другого: пусть x1ptr=&x[1]; x2ptr=&x[3]; тогда разность указателей x2ptr - x1ptr даст значение 2.
Присваивание указателей.
Это возможно, если указатели имеют один тип.
float* f1ptr, *f2ptr, x1, x2;
Объявлены указатели f1ptr, f2ptr на вещественное и переменные x1, x2 вещественного типа.
f2ptr=&x2; f1ptr=f2ptr;
Указателю на void* можно присвоить все типы указателей без приведения типа:
void* p; p=f1ptr;
Но указатель на void* нужно сначала привести к типу того указателя, которому он присваивается:
f1ptr=(float*)p;
Сравнение указателей.
Указатели можно сравнивать, если они указывают на элементы одного и того же массива:
if(x2ptr>x1ptr) ………;
Смещение и индексирование указателей.
После выполнения операций с указателем x1ptr - присваивания x1ptr=x; смещения x1ptr+2 и разыменования *(x1ptr+2) будет получен доступ к элементу массива x[2]. Здесь используется запись указатель-смещение, в отличие от записи x[2] – указатель-индекс.
Функции
Функция – это последовательность описаний (объявлений) и операторов, которой дано имя. Функция должна выполнять какое-то законченное действие.
Функция начинает выполняться в момент вызова. До этого она должна быть объявлена и определена. Объявлений может быть несколько, а определений – только одно. Объявление (прототип) должно предшествовать вызову, чтобы компилятор мог проверить правильность вызова.
Объявление функции (прототип)
[класс] тип имя([список параметров]);
В [] – необязательные параметры.
1) Модификатор [класс] – задает области видимости функции:
extern – глобальная видимость во всех модулях программы (по умолчанию);
static – видимость только в пределах модуля, в котором определена функция.
2) Тип возвращаемого функцией значения – может быть любым, кроме массива и функции (но может быть указателем на массив или функцию). Если функция не должна возвращать значения, тип – void.
3) Список параметров определяет величины, которые требуется передать в функцию при её вызове. Для каждого параметра следует обязательно указывать его тип.
Примечания. 1. В прототипе, определении и вызове функции количество, типы и порядок следования параметров должны совпадать.
2. Нельзя возвращать из функции указатель или ссылку на локальную переменную, поскольку память, выделенная под неё, освобождается при возврате из функции. Приведем пример.
int* f()
{ int a=5;
return &a; // нельзя, но можно, если static int a=5;
}
Тип возвращаемого значения и типы параметров совместно определяют тип (сигнатуру) функции.