Работа N 5. Обработка текстовых данных

 

На ЭВМ можно осуществлять обработку не только числовой информации, но и обрабатывать тексты. Для этого в PASCAL предусмотрены данные типа STRING. Эти данные позволяют представлять в программах тексты и производить над ними операции редактирования. Данные типа String рассматриваются как цепочка символов таблицы ASCII длина которой не превосходит 255 символов.

Описание данных типа string имеет вид

 

Var B: String [30]; {строка символов длина, которой не превосходит 30 } st: String; {длина строки 255 символов}

 

К любому символу в строке можно обратиться так же как к элементу одномерного массива.

Типичными действиями, которые необходимо выполнять при работе с текстами, являются следующие:

- выделить i-й символ из текста;

- найти позицию, в которой располагается заданный символ или цепочка символов;

- сжать текст, удалив из него символ или цепочку символов;

- раздвинуть текст, вставив в него заданную последовательность символов;

- сравнить символы или цепочки символов;

- сформировать новый текст из частей текста, удовлетворяющий заданному условию;

- выделить из текста число и преобразовать его в числовую форму;

- преобразовать число в символьную форму.

Реализация этих действий осуществляется с помощью описанных ниже процедур и функций.

 

Function Concat (s1 [, s2, ..., sn] : string): String

 

Связывает последовательность строк.

Например : WriteLn (Concat('ABC','DEF')); { 'ABCDEF' }

 

Function Copy(s : String; index : Integer; count : Integer) : String;

 

Возвращает подстроку из строки.

Например :

Var s : String;

Begin

s := 'ABCDEF';

WriteLn(Copy(s, 2, 3)) { 'BCD' }

End.

 

Function Length (s : String) : Integer;

 

Возвращает динамическую длину строки.

Например

s:='Welcome to Pascal';

WriteLn ('Длина = ', length(s)); {17}

 

function Chr(x : Byte) : Char;

 

Возвращает символ соответствующий указанному коду ASCII.

 

Function Pos(substr : String; s : String) : Byte;

 

Ищет подстроку в строке.

Например

Var s: String;

Begin

s := ' 123.5';

{ Преобразовать пробелы в нули }

While Pos(' ', s) > 0 do

s[Pos(' ', s)] := '0';

End.

 

Procedure Delete(Var s : String; index : Integer; count : Integer);

 

Удаляет подстроку из строки.

НапримерVar s: String;

Begin

s := 'Honest Abe Lincoln';

Delete(s,8,4);

WriteLn(s); { 'Honest Lincoln' }

End.

 

Procedure Insert(source : String; Var s : String; index : Integer);

 

Вставляет подстроку в строку.

Например

Var s: String;

Begin

s := 'Honest Lincoln';

Insert('Abe ', s, 8);

WriteLn(s); { 'Honest Abe Lincoln' }

End.

 

Procedure Str(x [:width [:decimals ]] ;Var s : String);

 

Преобразует в такое-же строковое представление, как это сделало бы Write.

 

Например :

Function IntToStr(i: Longint): String;

{ Преобразовать целое число в строку }

Var s: String[11];

Begin

Str(i, s);

IntToStr := s;

End;

Begin

WriteLn(IntToStr(-5322));

End.

 

Procedure Val(s :String; Var v; Var code : Integer);

 

Преобразует строковое значение в его числовое представление, как это делается при чтении при помощи Read. S - это строка содержащая преобразовываемое число в ASCII коде, v - переменная типа real или Integer, в которой возвращается результат, code - переменная типа Integer.

Например:

Var str : String;

i, code: Integer;

Begin

str:='123.456';

Val(str, i, code);

{ Ошибка преобразования в целое? }

If code <> 0 Then WriteLn('Ошибка в позиции: ', code)

Else WriteLn('Значение = ', i);

End.

 

В работе требуется составить программы решения задач с целью овладения практическими навыками работы со строковыми данными.

Задачи:

Последовательности символов, разделенные пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами.

 

1. Подсчитать количество слов в данном предложении.

 

2. Найти количество слов, начинающихся с буквы б.

 

3. Найти длину самого короткого слова.

 

4. Задана строка символов. Требуется преобразовать последовательность следующим образом. Удалить группы пробелов, которыми начинается и заканчивается последовательность, а также заменить каждую внутреннюю группу пробелов одним пробелом.

 

5. В данном предложении заменить каждое слово child словом children.

 

6. Даны два предложения. Найдите самое короткое из слов первого предложения, которого нет во втором предложении.

 

7. Среди слов данного предложения найдите такое, которое встречается наибольшее число раз.

 

8. Перечислите все слова данного предложения, которые состоят из тех же букв, что и первое слово предложения.

9. Заданы две строки. Найдите самую длинную их общую часть.

 

10. Найдите самое длинное общее слово двух заданных предложений.

 

11. Для каждого из слов заданного предложения укажите, сколько раз оно встречается в предложении.

11.

12. Напечатать слова данного предложения в алфавитном порядке.

 

13. Задано предложение. Напечатайте все различные слова, указав для каждого из них число его вхождений в предложение.

 

14. Задано предложение. Удалите из него повторные вхождения слов.

 

15. Задана последовательность слов. Напечатайте эту же последовательность слов в обратном порядке.

 

16. Удалить из предложения все слова, встречающиеся по одному разу.

 

17. Задана строка, состоящая из слов и пробелов. Переверните каждое слово, сохранив неизменным порядок слов в строке.

 

18. Напечатать все слова предложения, в которые входят буквы, входящие в слово шина.

 

19. Найти количество слов предложения (и напечатать) у которых первый и последний символы совпадают.

 

20. Найдите самое длинное симметричное слово заданного предложения.

 

21. В предложении все слова начинаются с различных букв. Напечатайте слова предложения в таком порядке, чтобы последняя буква каждого слова совпадала с первой буквой следующего слова.