
- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Композиция классов
- •Дружественные функции класса
- •Дружественный класс
- •Использование указателя this
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Стандартная библиотека функций языка с
Функции и макросы проверки и преобразования символов находятся в файле ctype.h. Приведем некоторые из них.
int isalnum(int c); -дает значение не нуль, если c – код буквы или цифры (A..Z, a..z, 0..9), и нуль - в противном случае.
int isalpha(int c); - дает значение не нуль, если c – код буквы (A..Z, a..z), и нуль – в противном случае.
int isdigit(int c); - дает значение не нуль, если c – цифра (0..9) в коде ASCII, и нуль – в противном случае.
Функции для работы со строками находятся в файлах string.h, stdlib.h. Приведем некоторые из них.
unsigned strlen(const char* str); - вычисляет длину строки str – количество символов, предшествующих ’\0’.
int strcmp(const char* str1, const char* str2); - сравнивает строки str1 и str2. Результат отрицателен, если str1<str2; равен нулю, если str1==str2, и положителен, если str1>str2 (сравнение беззнаковое).
char* strcpy(char* sp, const char* si); - копирует байты строки si в строку sp.
char* strcat(char* sp, const char* si); - приписывает строку si к строке sp (конкатенация строк).
char* strtok(char* str1, const char* str2); - ищет в строке str1 лексемы, выделенные символами из второй строки.
double atof(const char* str); - преобразует строку str в вещественное число типа double.
int atoi(const char* str); - преобразует строку str в целое число типа int.
long atol(const char* str); - преобразует строку str в целое число типа long.
char* itoa(int v, char* str, int baz); - преобразует целое v в строку str. При изображении числа используется основание baz (2 ≤ baz ≤ 36). Для отрицательного числа и baz=10 первый символ “минус” (-).
char* ltoa(long v, char* str, int baz); - преобразует длинное целое v в строку str. При изображении числа используется основание baz (2 ≤ baz ≤ 36).
char* ultoa(unsigned long v, char* str, int baz); - преобразует беззнаковое длинное целое v в строку str.
double strtod(const char* str, char** endptr); - преобразует символьную строку str в число двойной точности. Если endptr не равен NULL, то *endptr возвращается как указатель на символ, при достижении которого прекращено чтение строки str.
long strtol(const char* str, char** endptr, int baz); - преобразует символьную строку str к значению “длинное число” с основанием baz (2 ≤ baz ≤ 36). Если endptr не равен NULL, то *endptr возвращается как указатель на символ, при достижении которого прекращено чтение строки str.
Пример использования функции strtok():
char str[]=”Это предложение содержит пять лексем”;
char* p;
p=strtok(str,” “);
while(p!=0)
{ cout<<p<<endl;
p=strtok(str,” “);
}
Результат:
Это
предложение
содержит
пять
лексем
Примечание. При каждом вызове функции возвращается указатель на текущую лексему.
Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
При чтении из файла (ввод данных в программу с диска) данные помещаются в буфер (динамически выделяемый участок памяти), а затем побайтно или определенными порциями передаются программе. При опустошении буфера в него передается следующая порция данных.
При выводе данных из ОП в файл они накапливаются в буфере, а при его заполнении записываются в виде блока на диск за одно обращение к диску.
Пересылки между буферами ввода-вывода и программой происходят быстрее, чем обмен данными программы с диском.
Файл вместе со средствами буферизации называют потоком.
Обмен данными программы с файлами на уровне потока поддерживают функции библиотеки ввода-вывода (файл stdio.h). Они могут:
1)открывать и закрывать потоки (связывать указатели на потоки с конкретными файлами);
2)вводить и выводить: символ, строку, форматированные данные, порцию данных определенной длины;
3)анализировать ошибки потокового ввода-вывода и условие достижения конца потока (конца файла);
4)управлять буферизацией потока и размером буфера;
5)получать и устанавливать указатель (индикатор) текущей позиции в потоке (файле).