Design part 2

ROCEDURE MergeSort1 (VAR Txt: TEXT);

VAR

Temp1, Temp2: TEXT;

Sorted, Ch: CHAR;

{включает в себя процедуру CopyOpen(VAR F1, F2: TEXT)

Копирует строку из F1 в F2 без выполнения RESET и REWRITE;

поэтому F1 должен быть открыт для чтения, а F2 для записи,

а строки прошлого в этих файлах могут не быть пустыми}

BEGIN {MergeSort1}

{присвоить переменной Sorted значение ‘Y’ если Txt отсортирован, иначе - ‘N’ };

{разделить n символов в Txt на n серий единичной длины, разделенные символом ‘ #’ };

WHILE Sorted = ‘N’

DO

BEGIN

{разделить n/k серий длины k из Txt в n/2k серий в файлах Temp1 и Temp2};

{соединить n/2k серий длины k из файлов Temp1 и Temp2 в n/2k серий длины 2k в файл Txt};

{присвоить переменной Sorted значение ‘Y’ если файл Txt отсортирован, иначе присвоить ‘N’};

END

END {MergeSort1}

10.2.2 Слияние серий.

Когда количество серий нечетно, он не могут быть просто разделен на 2 файла, например, rw#ac#ot# разделяется на rw#ot# и ac#. Таким образом, во время слияния после того, как один разделенный файл буд полностью считан, другой еще может содержать одну серию, которая должна быть скопирована в в объединенный файл без каких-либо сравнений.

Раздел проекта

{соединить n/2k серий длины k из файлов Temp1 и Temp2 в n/2k серий длины 2k в файл Txt};

будет спроектирован как вызов процедуры

MergeRuns(Temp1, Temp2, Txt)

объявленной как:

Design Part 2.1

PROCEDURE MergeRuns(VAR In1, In2, Result: TEXT);

{склеивает серии из In1 и In2 в Result }

VAR

Ch1, Ch2: CHAR;

BEGIN {MergeRuns}

{инициализируем параметры файлов}

WHILE NOT EOLN(In1) AND NOT EOLN(In2)

DO

BEGIN

{склеиваем серии из In1 и In2 в Result}

END

{копируем последнюю серию из In1 или In2 (если такая имеется) в Result};

{сбрасываем параметры файлов}

END{MergeRuns}

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

Design Part 2.1.1

BEGIN {копируем серии из In1 и In2 в Result}

READ(In1, Ch1);

READ(In2, Ch2);

WHILE (Ch1 <> ‘#’) AND (Ch2 <> ‘#’)

DO

{копируем меньший символ из Ch1 и Сh2 в Result и считываем

следующий символ из соответствующего файла};

{копируем остаток серии In1};

{копируем остаток серии In2};

WRITE(Result, ‘#’)

END



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: