Design Part 2.1.2

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

IF EOLN(In1) AND EOLN(In2)

THEN

WRITELN(In1);

ELSE

IF NOT EOLN(In1)

THEN {копируем оставшуюся серию из In1 (если такая имеется) в Result}

CopyOpen(In1, Result)

ELSE {копируем оставшуюся серию из In2 (если такая имеется) в Result}

CopyOpen(In2, Result)

END

10.2.3 Разделение серий.

Процедура также скрывает детали разделения одного файла на два. Часть

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

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

SplitIntoRuns(Txt, Temp1, Temp2)

Design Part 2.2

PROCEDURE SplitIntoRuns(VAR FileIn, Result1, Result2: TEXT)

{разделяем серии из FileIn в серии в каждом из файлов Result1 и Result2}

VAR

Switch, Ch: CHAR;

BEGIN {SplitIntoRuns}

RESET(FileIn);

REWRITE(Result1);

REWRITE(Result2);

{копируем серии попеременно в Result1 и Result2}

WRITELN(Result1);

RESET(Result1);

WRITELN(Result2);

RESET(Result2)

END {SplitIntoRuns}

Процедура SplitIntoRuns требует 2 символьные переменные: Ch для копирования символов и Switch для запоминания файла, в который происходит копирование в настоящий момент.

Design Part 2.2.1

BEGIN {копируем серии попеременно в Result1 и Result2}

Switch:= ‘1’;

WHILE NOT EOLN(FileIn)

DO

BEGIN

Read(FileIn, Ch);

{копируем Ch в Result1, если Switch=’1’, иначе – в Result2}

{Если встречен конец серии (Ch = ‘#’), то переключаем Switch на другой файл}

END

END

Завершение MergeSort1

Склеенный файл проверяется в двух местах программы, для того, чтобы определить, является он отсортированным или нет, поэтому эта проверка является естественным кандидатом для оформления в виде оператора процедуры:

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

будет оформлено в

CheckIfSorted(Txt, Sorted)

Процедура CheckIfSorted устанавливает Sorted в ‘Y’, если в файле существует только одна серия (т.е. если за первым встреченным символом # сразу же следует символ конца строки).


Design Part 2.3

PROCEDURE CheckIfSorted(VAR FileIn: TEXT; VAR Sorted: Char);

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

VAR

Ch, EndRun: CHAR;

BEGIN {CheckIfSorted}

RESET(FileIn);

IF EOLN(FileIn)

THEN {пустой файл отсортирован по определению}

Sorted:= ‘Y’

ELSE

{установить Sorted=’Y’, если в файле есть всего одна серия, и ‘N’ в противном случае}

END {CheckIfSorted}

И, наконец, для того, чтобы начать процесс разделения-слияния, Txt разделяется на односимвольные серии, разделенные символом #. С этой целью мы добавляем новую переменную Ch символьного типа к локальным переменным процедуры MergeSort1.


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



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