Обработка текстовых данных

 

На ЭВМ можно осуществлять обработку не только числовой информации, но и обрабатывать тексты. Для этого в 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. Для каждого из слов заданного предложения укажите, сколько раз оно встречается в предложении.

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 


Работа N 6.

Работа с файлами

 

Под файлом понимают любой набор данных. В практике программирования часто встречаются задачи, при решении которых удобно хранить обрабатываемые данные на внешнем носителе. В этом случае данные оформляются в виде внешних файлов. В языке Pascal файл представляет собой последовательность элементов одного типа. Файловый тип данных состоит из линейной последовательности компонент, которые в свою очередь могут иметь любой тип за исключением файлового или структурного типа, содержащего компоненту с файловым типом. В отличие от массивов длина файла, т.е. количество элементов, не задается, место элемента не определяется индексом и каждый элемент становится доступным только после перебора всех предыдущих элементов.

Переменную файлового типа можно задать, например, следующим образом:

 

< идентификатор> file of <тип>

 

Например:

Var FT : file of char;

FileInp : file of real;

FileOut : text;

 

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

 

Пример:

Program File_Example;

var F1 : file of integer { входной файл }

F2 : text { файл для вывода }

R : integer;

st : string;

. . .

begin

Assign(F1, 'FileInp.dat');

Assign(F2, 'FileOut.dat');

Reset(F1); { Открытие файла F1 }

Rewrite(F2); { Открытие файла F2 }

.. .. .. ..

Read(F1,R); { Чтение из файла F1 }

 

.. .. .. ..

writeln(F2, St); { Запись в файл F2 }

 

.. .. .. ..

Close(F1); { Закрытие файлов }

Close(F2);

end.

 

 

Целью данной работы является получение практических навыков использования файловых структур данных.

 

ЗАДАНИЕ. Напишите программу решения задачи, с использованием операций над файлами.

 

ВАРИАНТЫ ЗАДАНИЙ.

1. Дан символьный файл F. Получить файл G, образованный из F заменой всех его прописных (больших) букв одноименными строчными (малыми).

 

2. Дан файл F, компоненты которого являются целыми числами. Получить файл G, образованный из файла F исключением повторных вхождений одного и того же числа.

 

3. Дан файл F, компоненты которого являются целыми числами. Никакая из компонент файла не равна нулю. Файл F содержит столько же отрицательных чисел, сколько положительных. Используя вспомогательный файл H, переписать компоненты файла F в файл G так, чтобы в файле G не было двух соседних

компонент с одним знаком.

 

4. Дан файл F, компоненты которого являются целыми числами. Никакая из компонент файла не равна нулю. Файл F содержит столько же отрицательных чисел, сколько положительных. Используя вспомогательный файл H, переписать компоненты файла F в файл G так, чтобы в файле G сначала шли положительные, потом отрицательные числа.

 

5. Дан файл F, компоненты которого являются целыми числами. Никакая из компонент файла не равна нулю. Файл F содержит столько же отрицательных чисел, сколько положительных. Используя вспомогательный файл H, переписать компоненты файла F в файл G так, чтобы в файле G числа шли в следующем по-

рядке: два положительных, два отрицательных, два положительных, два отрицательных и т.д. ( предполагается, что число компонент в файле делится на 4).

 

6. Дан символьный файл F. Предполагается, что число слов делится на 100. Подготовить файл для печати в две колонки по 50 строк на странице. Слова должны быть расположены в файле G в следующем порядке: 1-е слово, 51-е слово, 2-е слово, 52-е слово,...50-е слово, 100-е слово, затем (следующая

страница) 101-е слово, 151-е слово, 102-е слово, 152-е слово,..., 150-е слово, 200-е слово и т.д.

 

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

 

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

 

9. Дан символьный файл, содержащий произвольный текст длиной более 5000 слов. Слова в тексте разделены пробелами и знаками препинания. Получить 100 наиболее часто встречающихся слов и число из появлений.

 

10. Даны два символьных файла F1 и F2. Файл F1содержит произвольный текст. Слова в этом тексте разделены пробелами и знаками препинания. Файл F2 содержит не более 40 слов, которые разделены запятыми. Эти слова образуют пары: каждое первое слово считается заменяемым, каждое второе слово - заменяющим. Найти в файле F1 все заменяемые слова и заменить

их на соответствующие заменяющие. Результат поместить в файле G.

 

11. Сведения об ученике состоят из его имени и фамилии и названия класса (года обучения и буквы), в котором он учится. Дан файл F, содержащий сведения об учениках школы. Выяснить, имеются ли в школе однофамильцы, имеются ли однофамильцы в каком-нибудь классе.

 

12. Сведения об ученике состоят из его имени и фамилии и названия класса (года обучения и буквы), в котором он учится. Дан файл F, содержащий сведения об учениках школы. Выяснить, на сколько человек отличается число учеников в восьмых классах от числа учеников в десятых классах.

 

13. Сведения об ученике состоят из его имени и фамилии и названия класса (года обучения и буквы), в котором он учится. Дан файл F, содержащий сведения об учениках школы. Получить список учеников данного класса по образцу: фамилия имя.

 

14. Задан символьный файл, содержащий текст. Разбить этот текст на строки длиной не более 40 символов. Перенос на новую строку осуществлять на месте пробела (слова не переносить).

 

15. Задан символьный файл, содержащий текст. Строки текста содержат не более 50 символов. Равномерно вставить пробелы между словами, чтобы его длина составляла ровно 50 символов.

 

16. Дан файл F, компоненты которого являются целыми числами. Никакая из компонент файла не равна 0. Числа в файле идут в следующем порядке: 10 положительных, 10 отрицательных и т.д. Переписать компоненты файла F в файл G так, чтобы в файле G числа шли в следующем порядке: пять положительных, пять отрицательных и т.д.

 

16. Дан файл F, компоненты которого являются целыми числами. Никакая из компонент файла не равна 0. Числа в файле идут в следующем порядке: 10 положительных, 10 отрицательных и т.д. Переписать компоненты файла F в файл G так, чтобы в файле G числа шли в следующем порядке: двадцать положительных, двадцать отрицательных и т.д. (предполагается, что число компонент файла делится на 40).

 

17. Дан файл F, компоненты которого являются целыми числами. Записать в файл G наибольшее значение из первых 20 компонент, затем - следующих 20 компонент и т.д. Если в последней группе окажется менее 20 компонент, то последняя компонента файла G должна быть равна наибольшей из компонент файла F, образующих последнюю группу.

 

18. Дан текстовый файл. Удалить из файла лишние пробелы.

 

19. Дан текстовый файл. Найти самое длинное слово среди слов, вторая буква которых есть е. Если таких слов нет вообще, то сообщить об этом.

 

20. Даны символьные файлы F, G. Определить, совпадают ли компоненты файла F с компонентами файла G. Если нет, то получить номер первой компоненты, в которой файлы F и G отличаются между собой. В случае, когда один из файлов имеет N компонент (N>0) и повторяет начало другого (более длинного) файла, ответом должно быть число N+1.