Студопедия

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

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

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






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






     

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

     

    Рассмотрим задачу сравнения длин строк, сохраненных в файлах 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 :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.