Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на ЯВУ.doc
Скачиваний:
3
Добавлен:
11.11.2018
Размер:
1.17 Mб
Скачать

15. Программы обработки строк символов (текстов)

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

Для работы с символьной информацией в стандартном Паскале используются уже известные нам данные символьного типа: Char. Причем одна переменная такого типа представляет собой всего один символ. В Турбо Паскале, как отмечалось ранее, имеются данные строкового типа (String).

Символы в ЭВМ, как известно, представляются двоичными кодами длиной в 1 байт. Поэтому отношение вида Sim1 < Sim2 имеет смысл. Причем оно соответствует отношению Ord(Sim1) < Ord(Sim2).

15.1. Простейшие алгоритмы и программы обработки строк

В Турбо Паскале, как отмечалось выше, определены данные строкового типа - String.

Пример определения переменных строкового типа:

Var

str : String;

line : String[80];

После слова String может указываться длина строки (максимальная). Если длина не указана, то считается, что она переменная и определяется числом символов, записанных на место переменной типа String при вводе или присваивании. Это число хранится в нулевом байте соответствующей переменной.

Важно, что в переменной строкового типа доступен каждый отдельный символ. Обращение к нему производится путем указания его номера (индекса). Конечно, индекс символа не должен быть больше длины строки.

Для работы со строками в Паскале имеется несколько процедур и функций. Наиболее распространенные из них приведены ниже.

1. Операция «Объединение строк» изображается символом + .

Пример. Пусть переменные s1, s2 и s3 имеют тип String. Тогда в результате выполнения операции

s3 := s1 + s2;

получим строку s3, являющуюся объединением строк s1 и s2.

Если, например, s1 имела значение 'СамГТУ,', а s2 – значение ' ФАИТ', то s3 получит значение 'СамГТУ, ФАИТ'.

2. Функция Copy (исходная_строка, начальный_номер, длина) – выделение подстроки заданной "длины" из "исходной строки", начиная с символа, определенного "начальным_номером".

Если параметр "длина" больше остатка строки, то выделяется остаток;, если параметр "начальный_номер" превышает длину строки, то результатом будет пустая строка.

Пример.

. . . . . .

s1 := 'СамГТУ';

s2 := Copy(s1,4,3);{Результат: s2 получит значение 'ГТУ'}

3. Процедура Delete(исх_строка, номер, длина) – удаляет из "исходной строки" подстроку заданной "длины", начиная с заданного "номера":

Пример

. . . . .

S := 'СамГТУ, ФАИТ';

Delete(S,4,5);{Результат: S получит новое значение 'СамФАИТ'}

. . . . .

4. Функция Length(строка) – возвращает длину строки (количество символов в ней).

5. Функция POS(подстрока, строка) – возвращает номер символа, начиная с которого "подстрока" встречается в "строке" (если не встречается, то функция возвращает ноль). Прописные и строчные буквы считаются различными.

Пример

. . . .

N := Pos('ра', 'Абракадабра'); {N получит значение 3}

M := Pos('Ра', 'Абракадабра'); {M получит значение 0}

Рассмотрим примеры простейших программ обработки строк символов на примере одной строки. Тексты большей длины могут быть представлены в виде массива строк, каждая из которых обрабатывается аналогично.

Пример 1. Ввести в ЭВМ предложение длиной не более 80 символов и подсчитать количество слов в нем и количество букв "а". Будем считать, что одно слово от другого отделяется одним пробелом.

Алгоритм

1. Количество_слов =0; Количество_а=0.

2.1. Ввести предложение.

2.2. n=Длина (предложения).

2.3. Для номера символа (i) от 1 до n выполнить

2.3.1. Если символ =' ' (пробел), то

Количество_слов = Количество_слов +1

Иначе

Если символ ='а', то

Количество_а = Количество_а +1

3. Вывести Количество_слов и Количество_а.

4. Закончить.

Программа для этого алгоритма будет иметь вид

Program Predl;

Var

Pr : String;

i, n, Ks, Ka : Integer;

Begin

Ks := 0{kol-vo slov}; {п.1}

Ka := 0{kol-vo ‘a’};

Write('Введите предложение'); { п.2.1 }

Readln(Pr);

n := Length(Pr); { п.2.2 } {Длина предложения}

{ п.2.3 }

For i := 1 to n do

If Pr[i] = ' ' Then

Ks:= Ks + 1

Else

If Pr[i] = 'a' Then

Ka := Ka + 1;

If Pr[n]<> ' ' Then

Ks:=Ks+1; {если в конце предложения нет пробела}

{ п.3 }

Writeln('Количество слов в предложении равно ',Ks,

'количество букв а - ',Ka);

End.