Смекни!
smekni.com

Программирование и разработка приложений в Maple (стр. 94 из 135)

%{<Флажки>}{<Длина>}{.<Точность>}<Код>

Кроме параметра “Код” остальные параметры %-спецификации необязательны. В качестве значений для флажков используются символы, имеющие следующую смысловую нагрузку, а именно:

(+) - вывод числового значения с лидирующими знаками {+|-};

(-) - выравнивание выводимого значения по левому краю поля;

(пробел) - вывод значения с лидирующим пробелом в зависимости от знака; (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-процедура не производит автоматического перевода строки и возврата каретки. Поэтому для обеспечения данной операции следует в конце (или в нужном ее месте) форматирующей строки кодировать конструкцию следующего вида “&bsol;n”, определяющую данную операцию. Более того, вывод по printf-процедуре на экран не управляется screenwidth-параметром interface-процедуры, о котором шла речь выше. Следует также иметь в виду, что результаты использования значений %{o,x,X} код-параметра определяются используемым типом процессора и на разных ПК могут достаточно заметно различаться на значениях float-типа.

При наличии для printf-процедуры в качестве форматируемого выражения последовательности выражений (ПВ) каждому из них в форматирующей строке должен соответствовать свой %-спецификатор. В противном случае оставшиеся без %-спецификаторов выражения не выводятся. Исключение составляет спаренный %-символ, определяющий не спецификатор, а вывод %-символа. Между код-параметром %-спецификатора и следующим %-спецификатором (либо концом форматирующей строки) можно кодировать любую последовательность символов (при этом, символы кавычки «"» и «&bsol;» должны дублироваться), выводимую после соответствующего результата вычисления выражения из ПВ. Подобная возможность может быть весьма полезным подспорьем при оформлении вывода форматируемых конструкций, как это хорошо иллюстрирует следующий достаточно простой фрагмент:

> printf(`%s<Пример возможного вывода строки>&bsol;n`, ``); h:=`____`: k:=`|`: printf(`% 22s &bsol;n`, `Таблица возрастов`); h:=`____`: k:=`|`: printf(`% 22s &bsol;n`,

`Таблица возрастов`); printf(`%s%+4s%+4s_%+4s_%+4s_%+4s_%+4s_&bsol;n`, `___`, h, h, h, h, h, h); printf(`%s% 3s|% 4s|% 4s|% 4s|% 4s|%4s|&bsol;n`, k, V, G, S, Art, Kr, Arn); printf(`%s%+4s%+4s_%+4s_%+4s_%+4s_%+4s_&bsol;n`, `___`, h, h, h, h, h, h, h); printf(`%s%-3a|%-4a|%-4a|%-4a|%-4a|%-4a|&bsol;n`, k, 64, 59, 39, 17, 10, 44); printf(`%s%+4s%+4s_%+4s_%+4s_%+4s_%+4s_&bsol;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|&bsol;nПеренос: %m|%A|%%350|`, `Проверка функции`,

`G`, `AVZ1942`, sqrt(x), evalf(Pi), e^x);

Проверка функции: G| AVZ|x^(1/2)|

Перенос: $"+aEfTJ!"*|e^x|%350|