Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4. Текстовые файлы и циклическое выполнение.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
64 Кб
Скачать
☆

4.1.3. Копирование файлов

Типичная операция над файлами копирует один файл в другой. Программа 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.

TRUE

TRUE

FALSE

TRUE

TRUE

FALSE

AB#

AB#

AB#

AB#

AB#

AB#

AB#

AB#

AB#

AB#

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#_

AB#

_

_

_

_

_

_

_

_

_

_

_

_

_

_

_

_

_

_

_

A_

A_

A_

A_

A_

A_

AB_

AB_

AB_

AB_

AB/_

AB

_

_

_

_

A_

A_

A_

A_

A_

AB_

AB_

AB_

AB_

AB#/_

AB#/

AB#/

AB#/

AB#/

AB#/

AB#/

AB#/

AB#/

AB#/

AB#/

AB#/

AB#/

AB#/

AB#/

AB#/

AB#/

?

A

A

A

A

B B B B B #

#

#

#

#

A

A

A

A

A

B

B

B

B

B

B

#

#

#

#