sPrEw.d Ввод осуществляется так же, как для кола F. Основная форма поля вывода имеет вид 0.y1···ydEz1···zm где перед первым нулем и после буквы Е может стоять знак минус, если он нужен, а значение m достаточно для размещения максимального порядка, даже если для данного числа это не нужно. Если текущее значение масштабирующего множителя равно q, то вещественная часть основной формы умножается на 10q, а порядок уменьшается ка q единиц. При q > 0 будет q цифр слева от точки и max(d − q + 1, 0) цифр справа от нее: при q ≤ 0 слева от точки будет стоять нуль, а справа d + q цифр[27]. Так же как и код F, код Е — несамозавершающийся, а спецификация масштабирующего множителя sP и коэффициент повторения r могут отсутствовать.
sPrGw.d Ввод, а также интерпретация спецификаций sP и r осуществляется так же, как для кода F. Для вывода по коду G в зависимости от величины выводимого числа выбирается один из кодов F и Е. Пусть М — выводимое значение, причем 10k−1 ≤ М < 10k, где 0 ≤ k ≤ d, тогда вывод производится как для кода F(w − 4).(d − k), 4X; в противном случае используется код Ew.d. Отметим, что масштабирующий множитель игнорируется в случае, когда для вывода выбирается код F. Код G несамозавершающийся.
Тема. Создайте пакет программ форматного ввода/вывода для вашей ЭВМ. В общем случае он будет иметь ряд входных точек, доступных для пользователя (в роли которого, как правило, выступает сгенерированная компилятором объектная программа), а также ряд внутренних подпрограмм, которые должны быть защищены от доступа со стороны пользователя. Среди пользовательских входов должны быть: вход для инициализации с параметрами, определяющими операцию ввода или вывода, канал ввода/вывода и формат; входы для каждого типа переменных (вещественной, целой, логической и еще любой из них, используемой для представления текстовых данных), а также вход для терминирования ввода/вывода. Внутреннее представление данных может иметь вид, принятый на вашей ЭВМ, или вид, описанный в гл. 25 для ЭВМ УМ-1. Проведите основательное тестирование своих программ и убедитесь, что округление и обработка особых случаев выполняется правильно, а в случае ошибок выдаются соответствующие сообщения.
Указания исполнителю. Наиболее трудная часть задачи — составить ясное представление о поведении вещественных чисел на вашей ЭВМ. Преобразование данных текстового, целого и логического типов выполняется легко, а для сканирования формата и поддержания буферов годятся весьма простые методы. Однако вы, вероятно, обнаружите, что для реализации вполне правильного округления придется серьезно поразмыслить, а, быть может, и немного поэкспериментировать. Обязательно включите в свои тесты значения чуть больше и чуть меньше степеней 10, чуть меньше 10−d и т. д. Не поддавайтесь соблазну выделять все увеличивающееся количество частных случаев с целью исправить допущенные ранее в работе промахи, попытайтесь вместо этого найти какой-то другой подход. Одной из наших досаднейших программистских неудач был пакет форматного ввода/вывода, разросшийся наподобие Топси до свыше 3000 строк на языке ассемблера. Как непросто теперь заменить его более ясной и эффективной программой примерно в 1000 строк, написанной еще кем-нибудь! С какой радостью мы бы навсегда избавились от этого монстра!
Инструментовка. Это одна из тех задач, для которых можно порекомендовать язык ассемблера. Пакеты форматного ввода/вывода должны быть достаточно эффективными, и к тому же они принадлежат к числу программ, время выполнения которых не концентрируется в нескольких компактных циклах, а сильно размазано (для большинства программ на 10% текста приходится 90% времени выполнения). Кроме того, языки более высокого уровня скрывают от программиста тонкости специфической работы с данными, необходимые для реализации форматного ввода/вывода. Если в вашем распоряжении имеется такой язык, как BLISS или PL/360 (или, быть может, XPL), то это самые лучшие кандидаты, поскольку они допускают достаточно хороший контроль над машиной и свободны от недостатков языка ассемблера.
Длительность исполнения. Одному исполнителю на 5 недель.
Развитие темы. Имеется масса возможностей расширить форматы. Можно добавлять новые коды. Например:
'x···x' То же самое, что nHX···x. Апостроф представляется парой подряд стоящих кавычек.
Bw, Ow, Zw Ввод и вывод соответственно в двоичном, восьмеричном и шестнадцатеричном коде. В этом случае внутреннее представление элемента данных воспринимается как цепочка битов, прижатая к правому краю.
Tn Переместиться в n-ю позицию текущей записи. Такое передвижение может привести к повторному чтению или записи части вводного или выводного файла.