%{<Флажки>}{<Длина>}{.<Точность>}<Код>
Кроме параметра “Код” остальные параметры %-спецификации необязательны. В качестве значений для флажков используются символы, имеющие следующую смысловую нагрузку, а именно:
(+) - вывод числового значения с лидирующими знаками {+|-};
(-) - выравнивание выводимого значения по левому краю поля;
(пробел) - вывод значения с лидирующим пробелом в зависимости от знака; (0) - заполнение поля выводимого значения нулями {слева|справа}; при наличии флажка (-) действие 0-флажка подавляется.
Параметр “Длина” %-спецификатора определяет целое число, задающее минимальное количество символов, отводимых под выводимый результат; если же вывод имеет меньшую длину, то производится дополнение его пробелами слева, или нулями при указании 0-флажка. Параметр “Точность” %-спецификатора определяет количество цифр, выводимых после десятичной точки числа, или максимальную длину поля вывода для строковых и символьных значений. Как "Длина", так и "Точность" могут задаваться (*)-символом, идентифицирующим тот факт, что значения для них должны браться на основе соответствующих значений элементов ПВ. Параметр “Код” определяет тип форматируемой конструкции и его допустимые значения определяются сводной табл. 14.
Таблица 14
Код | Тип форматируемой Maple-конструкции: |
d | десятичное целое число со знаком |
0 | целое 8-ричное число без знака |
{X|x} | целое 16-ричное число без знака; при {X|x}-значении для цифр используются соответственно буквенные обозначения {A÷F|a÷f} |
{E|e} | десятичное float-число в научной нотации; соответственно {E|e}-основание |
f | число float-типа с фиксированной десятичной точкой |
{G|g} | соответствует значению кода согласно форматируемого α-результата, формула вычисления которого представлена в [12] |
c | единственный символ, имеющий {string|symbol|name}-тип |
s | строка {string|symbol|name}-типа длины “Длина” ≤ L ≤ ”Точность”; “Длина” задает длину поля выводимой строки, а “Точность” - ее максимальную длину |
{a|A} | произвольная Maple-конструкция; если определены “Длина/Точность”-параметры, то производится усечение по длине аналогично случаю s-кода. Возврат производится в соответствии с Maple-синтаксисом; для %А-кода конструкция выводится без ограничивающих ее кавычек, даже если в исходном виде они были |
m | произвольный Maple-объект выводится в формате m-файла; сказанное относительно %{a|A}-кода имеет силу и для данного случая |
% | производится вывод %-символа; для него не требуется выражения в ПВ |
Так как по %A-коду производится опускание ограничивающих выражения апострофов и кавычек, даже если они и необходимы для их корректности, то использование данного кода форматирования требует внимательности. С другой стороны, %A-код весьма полезен при необходимости, в частности, помещения Maple-конструкций в файл с целью последующей их загрузки по read-предложению и автоматическим вычислением с непосредственным доступом к результатам, как это иллюстрирует следующий фрагмент:
> fprintf("C:/ARM_Book/Academy/Artur.17", `%A`, "AGN:=evalf(Pi + Catalan);"): close(0):
> read "C:/ARM_Book/Academy/Artur.17": AGN; ⇒ 4.057558248
> Z:= "Art:= proc() local k, S; S:= []: for k to nargs do S:= [op(S), args[k]] end do; if nops(S) <> nargs then RETURN(""Несоответствие между числом аргументов и длиной S- списка"", S, args) else S end if end proc;": F:= "C:/ARM_Book/Academy/Kristo.10": > fprintf(F,`%A`,Z): close(F): read(F): Art(64, 59, 39, 10, 17); ⇒ [64, 59, 39, 10, 17]
Описанным способом можно помещать в файл с возможностью последующей загрузки отдельные Maple-процедуры или их наборы, а также полностью Maple-программы, как это иллюстрирует последний пример фрагмента. В данном примере определение процедуры Art в строчном формате присваивается Z-переменной и по fprintf-функции сохраняется в заданном файле, из которого по read-предложению загружается, автоматически вычисляя определение процедуры в текущем сеансе и делая ее доступной.
Если форматируемое значение имеет hfarray-тип, то выводятся все элементы массива. В этом случае форматирование его отдельных элементов определяется значениями параметров "Длина" и "Точность" %-спецификатора.
При этом, следует иметь в виду, что printf-процедура не производит автоматического перевода строки и возврата каретки. Поэтому для обеспечения данной операции следует в конце (или в нужном ее месте) форматирующей строки кодировать конструкцию следующего вида “\n”, определяющую данную операцию. Более того, вывод по printf-процедуре на экран не управляется screenwidth-параметром interface-процедуры, о котором шла речь выше. Следует также иметь в виду, что результаты использования значений %{o,x,X} код-параметра определяются используемым типом процессора и на разных ПК могут достаточно заметно различаться на значениях float-типа.
При наличии для printf-процедуры в качестве форматируемого выражения последовательности выражений (ПВ) каждому из них в форматирующей строке должен соответствовать свой %-спецификатор. В противном случае оставшиеся без %-спецификаторов выражения не выводятся. Исключение составляет спаренный %-символ, определяющий не спецификатор, а вывод %-символа. Между код-параметром %-спецификатора и следующим %-спецификатором (либо концом форматирующей строки) можно кодировать любую последовательность символов (при этом, символы кавычки «"» и «\» должны дублироваться), выводимую после соответствующего результата вычисления выражения из ПВ. Подобная возможность может быть весьма полезным подспорьем при оформлении вывода форматируемых конструкций, как это хорошо иллюстрирует следующий достаточно простой фрагмент:
> printf(`%s<Пример возможного вывода строки>\n`, ``); h:=`____`: k:=`|`: printf(`% 22s \n`, `Таблица возрастов`); h:=`____`: k:=`|`: printf(`% 22s \n`,
`Таблица возрастов`); printf(`%s%+4s%+4s_%+4s_%+4s_%+4s_%+4s_\n`, `___`, h, h, h, h, h, h); printf(`%s% 3s|% 4s|% 4s|% 4s|% 4s|%4s|\n`, k, V, G, S, Art, Kr, Arn); printf(`%s%+4s%+4s_%+4s_%+4s_%+4s_%+4s_\n`, `___`, h, h, h, h, h, h, h); printf(`%s%-3a|%-4a|%-4a|%-4a|%-4a|%-4a|\n`, k, 64, 59, 39, 17, 10, 44); printf(`%s%+4s%+4s_%+4s_%+4s_%+4s_%+4s_\n`, `___`, h, h, h, h, h, h);
<Пример возможного вывода строки> Таблица возрастов --------------------------------------------------- | V | G | S | Art | Kr | Arn | --------------------------------------------------- | 64 | 59 | 39 | 17 | 10 | 44 | --------------------------------------------------- > printf(`%s<Комментарий>%s`, `Выражение_1`, `Выражение_2`); Выражение_1<Комментарий>Выражение_2 > printf(`Произвольный комментарий`); Произвольный комментарий > print(`Произвольный комментарий`); Произвольный комментарий > G:= "SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS”: > printf(%); ⇒ NULL SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS > nprintf(%); ⇒ NULL SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS > sprintf("Academy of Noosphere"): %; ⇒ "Academy of Noosphere" |
Строку можно выводить и по конструкции вида printf("%s<Строка>", ""). В случае определения a-кода в %-спецификаторе форматирующей строки не рекомендуется кодировать (если нет такой необходимости) значение параметра “Точность”, т.к. может произойти усечение выводимого результата. По процедуре printf("<Строка>") производится вывод произвольной Maple-строки, тогда как по вызову функции sprintf("<Строка>") - возврат произвольной Maple-строки, т.е. оба средства в этом случае аналогичны рассмотренной выше print-функции с очевидными отличиями. Для символов и строк по флажку {+|-} производится выравнивание выводимого результата по {правой|левой} границе поля. Ряд особенностей, присущих указанным средствам, рассматривается в [11,12]. Принцип действия printf-процедуры распространяется и на остальные функции группы sprintf и fprintf с очевидными отличиями, рассматриваемыми ниже.
По sprintf-функции результат форматирования возвращается в строчном представлении, а по fprintf-функции - в заданный своим спецификатором файл или приписанный ему логический канал ввода/вывода с возвращением числа переданных символов. Вызов printf(...) функции эквивалентен вызову fprintf(default,…). Здесь представлены только форматирующие возможности функции, полностью переносимые на выводимые в файл результаты. Функция nprintf аналогична sprintf-функции с тем лишь отличием, что возвращаемый ею результат может быть symbol-типа, если такого же типа является форматируемое значение, что представляется важным для возможности обеспечения последующих вычислений с данным результатом. Следующий комплексный пример иллюстрирует применение всех перечисленных форматирующих средств функций группы printf на примере простых Maple-выражений:
> printf(`%s: %c|% 4.3s|% 4X|%+12.8E|%08.3f|%+6.2G|`, `Проверка функции`, `G`,
`AVZ`, 39, evalf(Pi), 17, 350.65);
Проверка функции: G| AVZ| 27|+3.14159265E+00|0017.000|+3.51E+02|
> printf(`%s: %c|% 4.3s|% .7a|\nПеренос: %m|%A|%%350|`, `Проверка функции`,
`G`, `AVZ1942`, sqrt(x), evalf(Pi), e^x);
Проверка функции: G| AVZ|x^(1/2)|
Перенос: $"+aEfTJ!"*|e^x|%350|