
- •Конспект лекций по курсу Программирование на языке высокого уровня.
- •Часть I. Структурное программирование
- •Автор: доцент Шустова л.И.
- •Часть II. Структуры данных 16
- •Часть III. Методы сортировки 97
- •Понятие системы программирования
- •Типы и назначение файлов
- •Директива#include
- •Директива #define
- •Директива условной генерации
- •Основы ввода/вывода
- •Вывод данных
- •Ввод данных
- •Определение и использование функций
- •Функция вычисления факториала числа.
- •Функция возведения вещественного числа в целую степень
- •Функция, меняющая местами значения двух параметров
- •Описание массива
- •Пример программы с использованием массива целых чисел
- •Абстрактные структуры данных
- •Определение
- •Базовые структуры данных
- •Очереди и стеки
- •Деревья
- •Внутренние структуры данных
- •Векторы
- •Отображение абстрактных структур данных на внутренние
- •Строка-вектор
- •1. Функция сцепления двух строк.
- •2. Функция поэлементного сравнения двух строк.
- •3. Функция разбиения строки.
- •4. Функция нахождения подстроки в строке.
- •Строка-список
- •1. Сцепление двух строк.
- •2. Поэлементное сравнение двух строк.
- •3. Разбиение строки на несколько частей.
- •4. Функция нахождения подстроки в строке.
- •Стек-вектор
- •Стек-список
- •Очереди
- •Очередь-вектор
- •Очередь-список
- •Деревья
- •Классификация таблиц
- •Способ работы с таблицей
- •Способ доступа к таблице
- •Просматриваемые таблицы
- •Просматриваемая таблица-вектор
- •Статическая просматриваемая таблица-вектор
- •Динамическая просматриваемая таблица-вектор
- •Просматриваемая таблица-список
- •Упорядоченные таблицы
- •Упорядоченная таблица-вектор
- •Динамическая упорядоченная таблица-вектор
- •Перемешанные таблицы
- •Открытое перемешивание
- •Перемешивание сцеплением
- •Деревья поиска
- •Бинарное дерево
- •Многоходовые деревья
- •Структура вершины в-дерева
- •Операция вставки
- •Удаление элемента
- •Перераспределение элементов
- •Сцепление вершин
- •Операция включения
- •Удаление элемента
- •Методы сортировки
- •Введение
- •Классификация методов внутренней сортировки
- •Быстрая сортировка
- •Распределительные сортировки
- •Сортировка поразрядным группированием
- •Сортировка вычислением адреса
1. Функция сцепления двух строк.
Результатом данной функции является строка, в начале которой размещены символы первой строки, а за ними – символы второй строки. При реализации данной функции возникает вопрос о том, где будет размещена результирующая строка. Возможны два способа реализации операции:
а) функция формирует новую строку; память для результирующей строки может выделяться вне функции и передаваться ей с помощью соответствующего аргумента или внутри функции, и тогда функция в качестве своего результата возвращает значение указателя на выделенную память;
б) функция модифицирует первую строку, добавляя в ее конец символы второй строки; в этом случае память, выделенная для первой строки, должна иметь достаточный размер для формирования результата; такой подход применен в библиотечной функции сцепления строк strcat(). Эта функция в качестве результата возвращает указатель на первый символ результирующей (первой) строки.
Рассмотрим возможный способ реализации библиотечной функции сцепления строк (текст функции приводится ниже и в файле Programs/stringv.cpp).
char * concat(char *first, char *second)
{
char *tmp;
/* вычислим значение указателя на последний символ (нуль-байт) первой строки;
* в дальнейшем он будет заменен первым символом второй строки.
*/
for(tmp = first; *tmp; tmp ++)
;
/* копирование символов второй строки в результирующую; как только будет
* скопирован нуль-байт, цикл завершится. Результирующая строка также будет
* нуль-ограниченной.
*/
while(*tmp ++ = *second ++)
;
return first;
}
Следует отметить, что функция не может проверить достаточность выделенной памяти под результирующую строку; ответственность за это несет вызывающая функция, в которой первая строка должна иметь достаточную память для размещения еще и символов второй строки.
2. Функция поэлементного сравнения двух строк.
Строки представляют собой символьные нуль ограниченные строки; результат сравнения:
0, если строки одинаковые,
< 0, если первая строка "меньше" второй (в лексикографическом смысле, т.е., первый несовпадающий символ первой строки предшествует в алфавитном порядке соответствующему символу второй строки);
> 0, если первая строка "больше" второй в лексикографическом смысле.
Текст функции приводится ниже и в файле Programs/stringv.cpp.
int compare(char *first, char *second)
{
while(*first && *first == *second)
first++, second++;
return *first - *second;
}
Доступ к элементам строки, представленной вектором, осуществляется при помощи указателей.
В заголовке цикла записано выражение, обеспечивающее выполнение цикла, пока строки равны (символы строк совпадают) и еще не закончились. В теле цикла в выражении использован оператор запятая, что позволило записать только одно предложение и поэтому не использовать фигурные скобки (для обозначения составного предложения; эквивалентной записью было бы {first ++; second ++;}).
Цикл завершится, если нарушается хотя бы одно из двух условий:
найдены несовпадающие символы (*first != *second); это означает, что строки не равны, и результат функции определяется как разность между кодами двух не совпавших символов;
символы строк совпадают (*first == *second) и равны нулю (*first == 0, а, следовательно, и*second == 0); следовательно, результатом функции будет 0.