Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочная информация по алгоритмам.doc
Скачиваний:
34
Добавлен:
20.06.2014
Размер:
399.87 Кб
Скачать

1. Обработка строк

Строка обычно представляет собой особый вид информации, которая хранится в виде вектора из элементов типа "символ" и рассматривается как единое целое. Для хранения символа используется либо 1 байт, либо 2 байта. Над элементами строки определены те же операции, что и над символами. Если в языке программирования выделается понятие строки, то обычно в нем предусмотрены дополнения, которые отличают строку от вектора символов, при этом используется один из двух способов представления строки:

1. вектор символов дополняется специальным символом, который является признаком конца строки. В Си - это символ с кодом 0;

2. В строке вместе с символами храниться особый элемент, значение которого определяет длину строки. Например, в Pascal - это символ с индексом 0, код которого равен числу символов в строке. Т.о. строковый тип в Pascal позволяет хранить строки длиной от 0 до 255 символов, которые занимают от 1 до 256 байт.

Можно сказать, что строка - вектор символов плюс информация о количестве символов, хранимая либо явно, либо с помощью особого признака – символа,отличного от всех возможных символов, использующихся в данном языке программирования.

1.1 Функции обработки строк

1. Создание строки.

Выделяется память в размере длины строки плюс 1. Затем посимвольно инициализируются элементы строки, и в конце записывается признак конца строки.

2. Тестирование элементов строки.

Обычно требуется определить, является элемент строки буквой, цифрой, разделителем, управляющим символом. Для этого в цикле просматриваются элементы строки до тех пор, пока не будет встречен символ конца строки.

3. Длина строки.

Если форма хранения строки предполагает наличие ее длины, то необходимо считать длину. В Pascal’е необходимо обратиться к элементу с индексом 0.

В Си:

char *S;

l=0;

while(*S++)l++;

4. Конкатенация (сцепление) строк.

Операндами этой функции являются 2 строки. Результатом является 1 строка, в которой последовательно записана первая строка без признака конца строки и вторая строка.

Алгоритм:

Отводится память l1+l2+1, где l1, l2– длины 1 и 2 строк.

Используется 2 счетчика:

1 – для индекса результата

2 – для индексов исходных строк

Организуется два цикла:

1 – с количеством итераций l1

2 – с количеством итераций l2+1

В каждом из циклов начальное значение 2-го счетчика равно 0, значение 1 счетчика обнуляется перед первым циклом. В каждом из циклов значение счетчика увеличивается на один. В теле цикла элементу строки результата присваивается значение исходной строки.

5. Нахождение подстроки в строке.

Аргументы: две строки; возвращаемое значение: 0 – вторая строка не встречается в первой, либо номер символа, начиная с которого вторая строка расположена в первой.

Алгоритм:

Заводится два счетчика. Первый – от номера первого элемента первой строки до длины первой строки, второй – до длины второй строки Для каждого значения первого счетчика второй счетчик в сумме с первым дает смещение в первой строке и используется как номер элемента второй строки. Строки поэлементно сравниваются. Если определено несовпадение, внутренний цикл прерывается. Если внутренний цикл пройден полностью, возвращается результат, сообщающий об отсутствии подстроки в строке.

int i,j,A;

#define N 7

#define M 4

char x[M], y[N];

i=0;

do{

j=0;

do{

A=x[j]==y[j+i];

j++;

}

while(A&&(j<M));

if(j==M)

return i;

i++;

}

while(!A&&(i<N-M));

return -1;