Главная  Терминология Хоора 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [ 21 ] 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

end {writereal}

Программа 1.4. Печать вещественного числа.

щественные числа из десятичного в произвольное внутреннее представление и наоборот. (Константы в заголовках связаны с особенностями формата чисел с плавающей запятой Б вычислительной машине CDC 6000: 11-разрядный двоичный порядок и 48-разрядная мантисса. Функция ехро(х) означает порядок х).

1.11.4. Программа редактирования файлов

В качестве примера применения последовательной структуры мы приведем следующую задачу, которая одновременно продемонстрирует методику разработки и пояснения программ. Этот метод называется методом поэтапного уточнения (1.4, 1.6], мы будем использовать его в этой книге при разборе многих алгоритмов.

Задача состоит в том, чтобы разработать программу, которая редактирует текст х, превращая его в текст у. Редактирование означает исключение или замену определенных строк или включение новых строк. Редактированием управляет последовательность команд редактирования, представленных стандартным текстом input. Эти команды имеют такой вид:

I, т. Вставка в текст после /п-й строки.

D, т, п. Исключение строк от т до п. R, т, п. Замена строк от т до п.

E. Окончание редактирования.

Каждая команда занимает одну строку в стандартном файле Щи1, который мы называем файлом команд, т и п - десятичные номера строк, а вставляемые тексты должны непосредственно следовать за командами I и R. Они заканчиваются пустой строкой.

Мы требуем, чтобы номера строк в командах редактирования шли в строго возрастающем порядке. Это правило Обеспечивает строго последовательную обработку входного Текста X. Очевидно, что состояние работы определяется теку-

begin writeif, -); e := -e

Ш else writeif, +); el := e * 205 div 2048; e2 := e - 10*el; £0 := el * 205 div 2048; el := el - 10*60;, writeif, ehr(eQ+z), chi(el+2), chr(e2+2))



щей позицией х, т. е. номером строки, которая рассматр, вается в данный момент.

Предположим, что программа редактирования работа в интерактивном режиме и что, следовательно, файл кома, представляет собой, например, данные, вводимые с терцц! нала. В таком режиме работы весьма желательно, 4toCj пользователь имел некоторую обратную связь. Подходящ^, и полезная форма обратной связи - это распечатка щ строки, на которую продвинулся процесс редактирования посл] выполнения последней команды. Мы назовем эту строку тец щей строкой. Вследствие нового требования, чтобы посл; выполнения каждой команды текущая строка выводилась ц| печать, нужно иметь явную переменную, в которой эта строк; будет храниться после чтения из х и перед записью в у. Это] прием называется заглядыванием знеред . Теперь можнс представить программу редактирования следующим образом

program editor (х,у, input, output),

\at Ino: integer; [номер текущей cmpom\

cl : line; [текущая строка]

x,y: text; bestead instruction;

repeat interpret instructions write line; read instruction

until instruction - E end.

Попробуем теперь более подробно определить некоторы! операторы. Уточняя читать команду и выполнить комт ду , мы обращаем внимание, что команда обычно состоит из трех частей: кода команды и двух параметров. Поэтому ми вводим три переменные: code, т и п - для обмена межд! этими двумя операторами.

var code,ch: char; т,п: integer

Читать команду:

read(cbde,cK);

if ch == V i\)Sinread(]n,ch) else m := Ino; (1.58 if ch = V then read(jt) else n := m;

Эта формулировка допускает команды с О, 1 или 2 параме рами, так как для пропущенных спецификаций подстав' ляются значения по умолчанию.



Зыйолнить команду: copy;

if code Г then begiaputtine;

*f insert;

end else

Л

if code => D then skip else (1.69)

if code = R then begin insert}

skip end else

; *f fo ~- E then copj/resf else Error

Ha следз^ этапе уточнения мы выразим операторы сору (копировать .{fsfft (вставить) и skip (пропустить), использованные в (1.59),1 омощью операций с отдельными строками getline и putline. Их бшим свойством является цикличность структуры. Сору служит aI?. переписи строк из X в у, начиная с текущей и кончая /п-й строкой. ViP читает строки из x до п-й строки, не переписывая их в у.

Серу: while Ью < т до begin putline; getline

Skip: y/bih Ino < n йо getline Insert: readline;

while noend do (1.60)

Ъеputline; readline end; getline;

Copyrest: yMe-\eof(x) йо

begin putline; getline end; putline

Ha третьем, посиеднем этапе уточнения мы выражаем операции getline, putline, readline и writeline с помощью операций с отдельными символами. Мы видим, что до сих пор все действия касались исключительно целых строк и не делалось никаких специальных предположений о детальной структуре строки. Мы знаем, что строки являются последовательностями символов. Было бы заманчиво описать переменную




1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [ 21 ] 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133