пока не оконч := страница хороша (f, чтение);
строчка окончена (f) Л не оконч
цк (и (испр строчка из f) (f) I настроить (f, чтение); нов строчка (f)) кц;
не оконч *
конец;
проЬ ^страница хороша = (имя файл f, лог чтение) лог: начало лог не оконч;
пока не оконч := файл хорош (f, чтение);
страница окончена (f) Л не оконч
цк (-; (испр страница из f) (f) I настроить (f, чтение); нов страница (f)) кц;
не оконч конец;
проц '’-файл хорош = (имя файл f, лог чтение) лог: начало лог не оконч := истина;
пока настроить (f, чтение);
не оконч Л
(чтение I лог файл окончен! физ файл окончен) (f) цк не оконч := (чтение I испр лог файл из f I испр физ файл из f) (f) кц;
не оконч конец;
проц ^настроить = (имя файл f, лог чтение) пуст: (чтение I настроить на чтение (f) I настроить на запись (f) );
проц установить = (имя файл f, цел р, 1, с) пуст: если ~I открыт из f V
,возм установка (f) то не определено иначе лог чтение = (для чтения из f I истина
I : для записи из f I ложь I не определено; пропуск) ; имя позиция тпоз = тпоз из f, ппоз = заполн из книга из f;
позиция раб тпоз = тпоз;
если (тпоз := (р, 1, с)) вне ппоз если тпоз := ппоз;
(“1 (испр лог файл из f) (f) I не определено); настроить (f, чтение)
инее позиция границы = границы книги (f);
р < 1V р > р из границы + 1 V 1
< 1V1 > 1 из границы + 1 V с<1/с>сиз границы + 1 то тпоз := раб тпоз; не определено
все все;
проц (имя файл, цел, цел, цел) пуст set = установить;
проц уст нач = (имя файл f) пуст:
есл! открыт из f V -)возм уст нач (f) то не определено иначе
имя лог (для чтения из f) := ~1 возм вывод (f);
имя лог (для записи из f) := Й возм ввод (f);
имя лог (для литер из f) := ~івозм двоичн (f);
имя лог (для двоичн из f) := ложь;
имя позиция (тпоз из f) := (1,1,1) все;
проц (имя файл) пуст reset = уст нач;
проц уст номер литеры = (имя файл f, цел с) пуст:
если открыт из f то не определено
иначе имя имени позиция тпоз = тпоз из f;
пока с из тпоз ф с
цк
если с<1/с>сизграницы книги (f) + 1
то не определено инее с > с из тпоз то вперед (f) иначе назад (f) все
кц
все;
проц (имя файл, цел) пуст set char number =
уст номер литеры;
Значения для обмена
Процедуры преобразования.
'{Процедуры целое, фикс и плав предназначены для использования с процедурами бесформатного обмена вывод, печ и зап в тех случаях, когда требуется небольшое добавочное управление над порождаемым расположением. Каждая из этих процедур имеет параметр разрядность, абсолютная величина которого задает длину строки, порождаемой преобразованием предъявляемого арифметического значения V. И фикс, и плав имеют параметр после, задающий число цифр, требуемых после десятичной точки, а параметр порядок в плав задает разрядность, отводимую для порядка. Если V нельзя выразить строкой в пределах заданного разрядность, - даже за счет уменьшения значения после, если оно есть, — то вместо этого вырабатывается строка, заполненная литерами литера ошибки (10.2.1 .t).
Знак включается обычным образом, и начальные нули заменяются пробелами. Однако пользователь может указать, задавая отрицательную разрядность, чтобы знак включался только для отрицательных значений. Если задана разрядность нуль, то вырабатывается кратчайшая возможная строка, в которую, согласно остальным параметрам, можно преобразовать V. Следующие примеры иллюстрируют некоторые из этих возможностей:
печ (целое (і, —4)), которое может печатать”—— —0”, ”——99”, ”——99”, „9999” или, если і было больше, чем 9999, „****”, где — выдача литера ошибки;
печ (целое (і, 4)), которое будет печатать .+ 99”, а не — 99”;
печ (целое (і, 0)), которое может печатать „0”, „99”, „—99”, „9999” или „99999”;
печ (фикс (х, —6, 3)),
которое может печатать „2.718”, „27.183”,
или „271.83” (в последнем случае пожертвовано одним местом после десятичной точки, чтобы приспособиться к данному числу);
печ (фикс (х, 0, 3)), которое может печатать „2.718”, „27.183” или „271.828”;
печ (плав (х, 9, 3,2)),
которое может печатать 2.71810+0”> „+2.7181О—1”
или „+2.7210 +11” (в последнем случае пожертвовано
одним местом после десятичной точки, чтобы освободить пространство для неожиданно большого порядка) .J
вид *-число = об (< Д вещ >, < Д цел >);
проц целое = (число V, цел разрядность) строк:
выб V в
< (Д цел х) :
(цел длина := абс разрядность - (х < Д 0V разрядность >0 111 0), Д цел п := абс х;
если разрядность = 0 то
Д цел m := п; длина := 0;
покат+:=Д10; длина+:=1; т=#=Д0
цк пропуск кц все;
строк s := предст целого (п, длина);
если длина = 0 V
литера в строке (литера ошибки, лок цел, s)
то абс разрядность X литера ошибки
иначе
(х<Д 0 I ”—”1 : разрядность>0 1’’+”1 ” ”) прип s;
(разрядность #= 01
(абс разрядность - вегр s) X ”. ” прип s);
S все) >, < (Д вещ х) : фикс (х, разрядность, 0) >
быв;
проц (число, цел) строк whole = целое;
проц фикс = (число V, цел разрядность, после) строй: выб V в
(Д вещ х) :
если цел длина := абс разрядность —
(х < Д О V разрядность > О 111 0); после > 0 Л
(длина > после V разрядность = 0)
то Д вещ у = абс х;
если разрядность = 0
то длина := (после =01110);
пока у + Д.5 X Д .1 t после > Д 10 t длина
цк длина +:= 1кц;
длина +:= (после = 0 101 после + 1)
все;
строк s := предст рационального (у, длина, после); если -. литера в строке (литера ошибки,док цел, s) то (длина > вегр s Ду < Д 1.0 I ”0” прип s);
(х < Д 0 I ” I : разрядность > 0 I ”+” I ” ”) прип s; (разрядность ¥= 0 I
(абс разрядность — вегр s) X ”г” прип s);
s
инее после >0
то фикс (v, разрядность, после — 1) иначе абс разрядность X литера ошибки все
иначе не определено; абс разрядность X литера ошибки все >,
(Д цел х): фикс (Д вещ (х), разрядность, после) > быв;
проц (число, цел, цел) строк fixed = фикс;
проц плав = (число v, цел разрядность,
после, порядок) строк:
выб V в
< (Д вещ х) :
если цел прежде = абс разрядность — абс порядок — (после Ф 0 I после + 1 I 0) - 2;
знак прежде + знак после > 0
то строк s, Д вещ у := абс х, цел р := 0;
Д нормализовать (у, прежде, после, р);
s :=
фикс (знак х X у, знак разрядность X
(абс разрядность - абс порядок - 1), после) + „до” + целое (р, порядок);
если порядок = 0 V литера в строке (литера ошибки,лок цел, s)
то
плав (х, разрядность, (после Ф О I после — 1 I 0), (порядок > 0 I порядок + 1 I порядок - 1))
иначе s
все
иначе не определено; абс разрядность X литера ошибки все >,
< (Д цел х): плав (Д вещ (х), разрядность, после, порядок) > быв;
проц (число, цел, цел, цел) строк float = плав;
проц *-предст у! авление у! целого =
(число V, цел разр) строк:
у! вырабатывает строку с максимальной длиной 'разрядность, содержащую десятичное представление положительного целого числа V (і выб V в
< (Д цел х):
начало строк s, Д цел п := х;
пока цифру в литеру (С (п мод ДЮ)) прип s;
П-? :=Д 10; п=#=Д0
цк пропуск кц;
(вегр s > разр І разр X литера ошибки I s) конец >
, быв;
проц *- пре дет 0 авление 0 рационального =
(число V, цел разр, после) строк:
у! вырабатывает строку с максимальной длиной 'разр ядность, содержащую округленное десятичное представление положительного вещественного числа V; если 'после'больше нуля, эта строка содержит десятичную точку, за которой следует 'после' цифру!
выб V в
< (Д вещ х):
начало строк s, цел прежде := 0;
Д вещ у := х + Д.5 X Д.1 t после;
проц подб 0 ор циф у! ры у! = (имя Д вещ у) лит : цифру в литеру ( (цел с := С целч (у X := Д 10.0);
(с > 9 I с := 9); у-:= У с; с));
пока у > Д 10.0 t прежде цк прежде +:= 1 кц; і
у/:=Д 10.0 t прежде;
до прежде цк s плюспр подб циф (у) кц;
(после > 0 I s плюспр ” . ”);
до после цк s плюспр подб циф (у) кц;
(вегр s > разр І разр X литера ошибки I s)
конец >
быв;
проц нормализовать = (имя Д вещ у, цел прежде, после, имя цел р)
пуст: 0приспосабливает значение 'у' к тому, чтобы
оно могло подвергаться обмену согласно формату ф п (прежде) d . п (после) d ф;
'р' устанавливается таким, чтобы у X 10 t р равнялось первоначальному значению у' ft
начало
Д вещ g = Д 10.0 Т прежде; Д вещ h = g X Д.1;
пока у>g цк у X:= Д.1; р+:=1кц;
(у =# Д 0.0 I пока у <h цк у X := Д 10.0; р —:= 1 кц);
(у + Д.5 X Д.1 t после > g I у :=h; р +:= 1)
конец;
проц *-цифру в литеру = (цел х) лит:
,,0123456789abcdef” [х + 1J;
проц ^строку в Д цел = (строк s, цел основание,
имя Д цел і) лог:
0 вырабатывает истина, если абсолютное значение результата не больше Д макс цел fi
начало
Д цел 1г = У основание; лог безопасно := истина;
Д цел п := Д 0, Д цел m = Д макс цел -г 1г;
Д цел ml = Д макс цел — m X 1г;
для і от 2 до вегр s
пока Д цел циф = Y литеру в цифру (s [і]);
безопасно := n<mVn-mAциф<ml
цк n := n X lr + циф кц;
если безопасно то і := (s [1] =”+” Ini —п);истина
иначе ложь все
конец;
проц ^строку в Д вещ = (строк s, имя Д вещ г) лог: i/i вырабатывает истина, если абсолютное значение результата не больше, чем Д макс вещ 0
начало
цел е := вегр s + 1;
литера в строке (”ю”> е> s) '■>
цел р := е; литера в строке (”. ” р, s);
цел j := 1, длина := 0, Д вещ х := Д 0.0;
fl пропуск начальных нулей: 0
для і от 2 до е — 1
пока s [i] =”0”Vs [і] = ” . ”Vs [і] =”r”
цк j := і кц;
для ioTj + Ідое — 1 пока длина <