Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Процедуры обработки строк.






 

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

 

Рассмотрим задачу сравнения длин строк, сохраненных в файлах F1 и F2. Результат сравнения возвращается в переменной Result:

1, если строка в F1 короче;

2, если строка в F2 короче;

0, если строки равной длины.

 

Раздел проекта 1 [DP 1]

 

PROCEDURE Length(VAR F1, F2: TEXT; VAR Result: CHAR);

{Result 0, 1, 2 если длина F1 =, <, > длины F2 соответственно.



Фактические параметры, соответствующие F1 и F2 должны быть различными}

VAR

Ch1, Ch2: CHAR;

BEGIN {Length}

RESET(F1);

RESET(F2);

WHILE NOT EOF(F1) AND NOT EOF(F2)

DO

BEGIN

READ(F1, Ch1);

READ(F2, Ch2)

END

{Анализировать F1, F2 и установить Result

в соответствии с длиной}

END {Length}

 

Раздел проекта 1.1 [DP 1.1]

 

BEGIN {Анализировать F1, F2 и установить Result

в соответствии с длиной}

IF EOF(F1)

THEN {в F1 уже пусто}

IF EOF (F2)

THEN {и в F1 и в F2 пусто}

Result: = ‘0’

ELSE {в F1 пусто, в F2 еще есть символы}

Result: = ‘2’

ELSE {в F1 есть символы, а F2 уже пуст (из условия в WHILE)}

Result: = ‘1’

END

 

Лексикографический порядок строк – это их порядок появления как слов в словаре – алфавитный порядок, где алфавит – набор символов Паскаль-машины. Из двух строк различной длины, имеющих одинаковые последовательности символов, короткая предшествует. Например, †ABC† предшествует †ABCDEF†, но †XYZ† предшествует †YZ†.

Определять лексикографический порядок строк простое дело: сравнивать их символы попарно, пока не встретятся неравные символы или одна из строк не закончится. Хотя Lexico предназначена для использования с 1-строками, она может быть использована и для сравнения n-строк.

 

Раздел проекта 2 [DP2]

 

PROCEDURE Lexico(VAR F1, F2: TEXT; VAR Result: CHAR);

{Result 0, 1, 2 если лексикографический порядок F1 =, <, > чем F2 соответственно. Фактические параметры, соответствующие F1 и F2, должны быть различными}

VAR

Ch1, Ch2: CHAR;

BEGIN {Lexico}

RESET(F1);

RESET(F2);

Result: = ‘0’;

WHILE (NOT EOF(F1) AND NOT EOF(F2)) AND (Result = ‘0’)

DO

BEGIN

READ(F1, Ch1);

READ(F2, Ch2);

IF (Ch1 < Ch2) OR (EOF (F1))

THEN {Ch1 < Ch2 или F1 короче F2}

Result: = ‘1’

ELSE

IF (Ch1 > Ch2) OR (EOF (F2))

THEN {Ch1 > Ch2 или F2 короче F1}

Result: = ‘2’

END {WHILE}

END {Lexico}

 

Length и Lexico – полезные “кирпичики”, которые можно использовать при разработке приложений, работающих со строками. Программы SelectSort и SelectReverse, разработанные в разделе 4.2 также могут быть преобразованы в процедуры. Эти частицы могут быть преобразованы в библиотеку подпрограмм для работы со строками. Конкретный набор процедур для работы со строками - вопрос вкуса и опыта. По мере использования такой библиотеки и чем больше будет узнано о алгоритмах работы со строками, она может вырасти до мощного средства решения задач.

Когда процедуры из библиотеки будут использоваться в проекте, будет удобно включать их имена и комментарий. Комментарий к процедуре в библиотеке должен в основном отражать информацию о том, как используется процедура, т.е. что она делает не как, хотя можно упомянуть и о некоторых моментах реализации важных с точки зрения использования. Например, о том, что вызов процедуры потребует больших затрат процессорного времени. Комментарий должен быть достаточен для корректного использования каждой процедуры. Такой комментарий обычно называют комментарием включения (include comment). Например, если мы включаем в проект Lexico, комментарий может быть следующим:

 

{Включить PROCEDURE Lexico(VAR F1, F2: TEXT; VAR Result: CHAR);

Result 0, 1, 2 если лексикографический порядок F1 =, <, > чем F2 соответственно. Фактические параметры, соответствующие F1 и F2, должны быть различными}

 

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

В нашем случае подразумевается, что строки в файлах-параметрах не содержат маркеров строки, к входному файлу применяется RESET, но он не остается в этом состоянии по завершению процедуры, к выходному файлу применяется REWRITE, алиасинг фактических параметров не допускается.

 

PROCEDURE InString(VAR F1: TEXT);

{Создает строку в файле F1 из символов в INPUT до следующего маркера конца строки}

 

PROCEDURE OutString(VAR F1: TEXT);

{Печатает строку в файле F1 в OUTPUT, завершая ее маркером конца строки}

 

PROCEDURE CopyOpen(VAR F1, F2: TEXT);

{Копирует строку из F1 в F2 без выполнения RESET или REWRITE, F1 должен быть подготовлен для чтения, а F2 – для записи. Строка прошлого этих файлов может быть непустой}

 

PROCEDURE Sort(VAR F1, F2: TEXT);

{Помещает в F2 отсортированную строку символов из F1}

 

PROCEDURE Reverse(VAR F1, F2: TEXT);

{Помещает в F2 строку символов из F1 в обратном порядке}

 

PROCEDURE Concatenate(VAR F1, F2, F3: TEXT);

{Создает F3 из символов F1, за которыми следуют символы из F2}

 

Библиотечные процедуры часто используются при разработке других библиотечных процедур. Например, проект для Concatenate может быть:

 

PROCEDURE Concatenate(VAR F1, F2, F3: TEXT);

{Создает F3 из символов F1, за которыми следуют символы из F2}

 

{Включаем PROCEDURE CopyOpen(VAR F1, F2: TEXT);

Копирует строку из F1 в F2 без выполнения RESET или REWRITE, F1 должен быть подготовлен для чтения, а F2 – для записи. Строка прошлого этих файлов может быть непустой}

 

BEGIN {Concatenate}

RESET(F1);

RESET(F2);

REWRITE(F3);

CopyOpen(F1, F3);

CopyOpen(F2, F3)

END {Concatenate}

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.