
- •Конспект лекций по курсу Программирование на языке высокого уровня.
- •Часть I. Структурное программирование
- •Автор: доцент Шустова л.И.
- •Часть II. Структуры данных 16
- •Часть III. Методы сортировки 97
- •Понятие системы программирования
- •Типы и назначение файлов
- •Директива#include
- •Директива #define
- •Директива условной генерации
- •Основы ввода/вывода
- •Вывод данных
- •Ввод данных
- •Определение и использование функций
- •Функция вычисления факториала числа.
- •Функция возведения вещественного числа в целую степень
- •Функция, меняющая местами значения двух параметров
- •Описание массива
- •Пример программы с использованием массива целых чисел
- •Абстрактные структуры данных
- •Определение
- •Базовые структуры данных
- •Очереди и стеки
- •Деревья
- •Внутренние структуры данных
- •Векторы
- •Отображение абстрактных структур данных на внутренние
- •Строка-вектор
- •1. Функция сцепления двух строк.
- •2. Функция поэлементного сравнения двух строк.
- •3. Функция разбиения строки.
- •4. Функция нахождения подстроки в строке.
- •Строка-список
- •1. Сцепление двух строк.
- •2. Поэлементное сравнение двух строк.
- •3. Разбиение строки на несколько частей.
- •4. Функция нахождения подстроки в строке.
- •Стек-вектор
- •Стек-список
- •Очереди
- •Очередь-вектор
- •Очередь-список
- •Деревья
- •Классификация таблиц
- •Способ работы с таблицей
- •Способ доступа к таблице
- •Просматриваемые таблицы
- •Просматриваемая таблица-вектор
- •Статическая просматриваемая таблица-вектор
- •Динамическая просматриваемая таблица-вектор
- •Просматриваемая таблица-список
- •Упорядоченные таблицы
- •Упорядоченная таблица-вектор
- •Динамическая упорядоченная таблица-вектор
- •Перемешанные таблицы
- •Открытое перемешивание
- •Перемешивание сцеплением
- •Деревья поиска
- •Бинарное дерево
- •Многоходовые деревья
- •Структура вершины в-дерева
- •Операция вставки
- •Удаление элемента
- •Перераспределение элементов
- •Сцепление вершин
- •Операция включения
- •Удаление элемента
- •Методы сортировки
- •Введение
- •Классификация методов внутренней сортировки
- •Быстрая сортировка
- •Распределительные сортировки
- •Сортировка поразрядным группированием
- •Сортировка вычислением адреса
3. Функция разбиения строки.
Данная функция может иметь следующий прототип:
int split(char *string, char *a[], char fs);
Для разбиения заданной строки stringна несколько частей необходимо указать правило разбиения и место размещения результата.
В качестве правила разбиения в рассматриваемой функции задается некоторый символ - разделитель полей (fs); сам этот символ в результирующие строки не записывается.
Функция создает и возвращает в качестве результата массив указателей на выделенные фрагменты строки (a). Поскольку количество разбиений неизвестно, функция сначала определяет его (подсчитывает, сколько раз в строке встречается символ-разделитель), затем выделяет необходимую память и формирует результат.
В результате разбиения строки исходная строка будет замещена выделенными строками. Это достигается путем замены символа-разделителя в строке нуль-байтом.
В качестве результата функция возвращает количество разбиений исходной строки.
Алгоритм функции представлен на рис. II-15.
Рис. II‑15.
Текст функции приводится ниже и в файле Programs/stringv.cpp.
int split(char *string, char *a[], char fs)
{
int i, cnt;
char *ptr;
/* прежде всего, надо определить количество разбиений строки*/
for(ptr = string, cnt = 0; *ptr; ptr++)
if(*ptr == fs){
cnt++;
*ptr = '\0';
}
/* возможно, есть еще один – последний фрагмент строки:
* после символаfsв строке до нуль-байта есть другие символы
*/
if(*(ptr-1))
cnt++;
/* теперь выделим необходимую память под указатели на фрагменты строк */
a = new (char *)[n];
/* наконец, формируем указатели на фрагменты строк */
for(i = 0, ptr = string; i < cnt; i++){
a[i] = ptr;
/* пропускаем символы строки до очередного нуль байта */
while(*ptr++)
;
}
return cnt;
}
4. Функция нахождения подстроки в строке.
Прототип функции может иметь следующий вид:
char * substr(char *string1, char *string2);
Функция возвращает указатель на первое вхождение подстроки string2в строкуstring1, илиNULL, если подстрокаstring2не входит в строкуstring1. Схема алгоритма функции приведена на рис.II-16.
Нужно обратить внимание на следующее: так как внутренний цикл может закончиться по любому из двух условий (блоки D2 – найден конец строки2 или D3 – обнаружены несовпадающие символы строк), на выходе требуется дополнительная проверка (блок E2). Если цикл закончился по условию обнаружения конца строки2, это означает, что все символы строки2 совпадали с соответствующими символами строки1, а следовательно, строка2 является подстрокой строки1, и функция завершается. Если же внутренний цикл закончился по другому условию, значит, нужно продолжать проверку.
Можно было сократить количество итераций внешнего цикла, если проверять не просто нуль-байт в конце первой строки, а учитывать длину второй строки; тогда, если вторая строка окажется длиннее первой, цикл не будет выполнен ни разу (такой вариант функции, конечно, предпочтительнее).
Рис. II‑16.
Текст функции приводится ниже и в файле Programs/stringv.cpp.
char *substr(char *string1, char *string2)
{
int len = strlen(string2), i;
char *ptr1;
for(ptr1 = string1; ptr1 < string1 - len; ptr1++){
for(i = 0; string2[i] && ptr1[i] == string2[i]; i++)
;
if(!string2[i])
return ptr1;
}
return NULL;
}