Типичная операция над файлами копирует один файл в другой. Программа CopyTwice копирует INPUT в OUTPUT через промежуточный рабочий файл Chars. Первый шаг – копирование INPUT в Chars, второй шаг – копирование Chars в OUTPUT.
DP 1
PROGRAM CopyTwice (INPUT, OUTPUT);
{Копирует символы, предшествующие # из INPUT в OUTPUT
Программа выдаст ошибку, если в INPUT отсутствует #}
VAR
Ch: CHAR;
Chars: TEXT; {Рабочий файл}
BEGIN {CopyTwice}
{Копировать INPUT в Chars}
{Копировать Chars в OUTPUT}
END. {CopyTwice}
DP 1.1
BEGIN {Копировать INPUT в Chars}
REWRITE(Chars); {Готовим Chars для записи}
READ(INPUT, Ch);
WHILE Ch <> ‘#’
DO
BEGIN
WRITE(Chars, Ch);
READ(INPUT, Ch)
END;
WRITELN(Chars, ‘#’) {Закрыть Chars маркером конца строки}
END
DP 1.2
BEGIN {Копировать Chars в OUTPUT}
RESET(Chars); {Готовим Chars для чтения}
READ(Chars, Ch);
WHILE Ch <> ‘#’
DO
BEGIN
WRITE(OUTPUT, Ch);
READ(Chars, Ch)
END;
WRITELN(OUTPUT)
END
Без маркера конца входной последовательности, который DP 1.1 помещает в конец промежуточного файла, DP 1.2 не сможет остановить свое выполнение.
Собираем разделы проекта.
DP 1A
PROGRAM CopyTwice (INPUT, OUTPUT);
{Копирует символы, предшествующие # из INPUT в OUTPUT}
VAR
Ch: CHAR;
Chars: TEXT; {Рабочий файл}
BEGIN {CopyTwice}
BEGIN {Копировать INPUT в Chars}
REWRITE(Chars); {Готовим Chars для записи}
READ(INPUT, Ch);
WHILE Ch <> '#'
DO
BEGIN
WRITE(Chars, Ch);
READ(INPUT, Ch)
END;
WRITELN(Chars, '#') {Закрыть Chars маркером конца строки}
END
BEGIN {Копировать Chars в OUTPUT}
RESET(Chars); {Готовим Chars для чтения}
READ(Chars, Ch);
WHILE Ch <> '#'
DO
BEGIN
WRITE(OUTPUT, Ch);
READ(Chars, Ch)
END;
WRITELN(OUTPUT)
END
END. {CopyTwice}
Выполнение:
INPUT: ABCD#
OUTPUT: ABCD
INPUT: 1#ABCD
OUTPUT: 1
INPUT: Four score and seven years ago#
OUTPUT: Four score and seven years ago
[восемьдесят семь лет назад]
Комментарий, описывающий поведение программы CopyTwice
{Копирует символы, предшествующие # из INPUT в OUTPUT
Программа выдаст ошибку, если в INPUT отсутствует #}
ничего не говорит о файлах типа CHAR. Комментарий для всей программы должен описывать ее поведение доступное извне и не вдаваться в детали реализации, посколько он предназначен для того, кто планирует использовать программу а не разбираться как она работает. Далее комментарии освещают детали реализации. Этот обобщается в принципе написания комментариев:
Используйт е имена переменных в комментариях только после того как они были объявлены.
Соблюдающий это правило автоматически размещает информацию о том как работает программа за комментариями, предназначенными для того чтобы рассказать что она делает.
Частичная таблица выполнения показывает содержимое файлов во время выполнения.
После выполнения
Условие
INPUT
OUTPUT
Chars
Ch
REWRITE(Chars) READ(INPUT, Ch)
WHILE Ch <> ‘#’
BEGIN
WRITE(Chars, Ch)
READ(INPUT, Ch)
END
WHILE Ch <> ‘#’
BEGIN
WRITE(Chars, Ch)
READ(INPUT, Ch)
END
WHILE Ch <> ‘#’
WRITELN(Chars, '#')
RESET(Chars)
READ(Chars, Ch);
WHILE Ch <> ‘#’
DO
BEGIN
WRITE(OUTPUT, Ch)
READ(Chars, Ch)
END
WHILE Ch <> ‘#’
DO
BEGIN
WRITE(OUTPUT, Ch)
READ(Chars, Ch)
END
WHILE Ch <> ‘#’
WRITELN(OUTPUT)
END.