Шаг 54.
Основы логического программирования.
Предикат writef

    На этом шаге мы рассмотрим предикат writef.

Предикат writef/*

    Предикат writef позволяет выполнить форматированный вывод; он имеет следующий формат:

   writef(FormatString, Arg1,Arg2,Arg3,...,ArgN) % (i,i,i,i, . ..,i)

    Аргументы Arg1,...,ArgN должны быть константами или связанными переменными, принадлежащими стандартным доменам. Сложные домены форматировать нельзя. Строка форматирования содержит обычные символы и форматные спецификаторы; обычные символы печатаются без модификации, а форматные спецификаторы имеют следующую форму:

   %-m.pf

    Символы спецификаторов формата, следующие за знаком процента (%), являются необязательными и имеют значения, описанные в таблице 1.

Таблица 1. Значения символов спецификаторов формата
Символ Значение
Дефис (-) Показывает, что поле выравнивается слева (по умолчанию выравнивается справа)
m поле Десятичное число, определяющее минимальную длину поля
p поле Десятичное число, описывающее либо точность представления с плавающей точкой, либо максимальное число символов, печатаемых в строке
f поле Описывает форматы, отличные от форматов, принятых по умолчанию для данного объекта. Например, поле f может описывать то, что целые числа должны быть напечатаны как беззнаковые или шестнадцатеричные числа

    Пролог распознает спецификаторы формата поля f, описанные в таблице 2.

Таблица 2. Спецификаторы формата поля f
Спецификатор формата Описание
f Вещественные в представлении с фиксированной точкой (типа 123.4 или 0.004321)
e Вещественные в экспоненциальном представлении (типа 1.234е2 или 4.321 е-3)
g Вещественные в формате f или е (формат по умолчанию)
d Целые, как знаковые десятичные числа
u Целые, как беззнаковые десятичные целые
x Целые, как шестнадцатеричные числа
X Целые, как шестнадцатеричные длинные числа
c Целые, как символы (char)
s Как строки (simbols и string)
R Как числа ссылки во внешних базах данных (только для домена ref)

Примеры форматированного вывода

  1. Следующая программа иллюстрирует действие различных спецификаторов формата при форматированном выводе с помощью writef.
       goal
          A=one,
          B=330.12,
          C=4.3333375,
          D="one two three",
          writef("A=  '%-7' \nB='%8.1e'\n",A,B),
          writef("A='%' \nB='%8.4e'\n",A,B) ,nl,
          writef("С ='%-7.7g' \nD = '%7.7' \n",C,D),
          writef("C='%-7.0f'  \nD =' %0 '\n",C, D),
          writef("char: %c,decimal: %d,hex: %x",'a','a','a','a').
    
        Текст этой программы можно взять здесь.

        После запуска эта программа создаст следующий вывод:

       А ='one'
       В ='3.3Е+02'
       А ='one'
       В ='3.3012Е+021'
       С ='4.3333375'
       D ='one two'
       С ='4'
       D ='one two three'
       char: a,decimal: 97, hex: 61
    
  2. Пример, показывающий, как можно использовать writef для форматного вывода, приведен в следующей программе.
       database
          person(string,integer,real)
       predicates
          run
       clauses
          person("Pete Ashton",20,11111.111).
          person("Marc Spiers",32,33333.333).
          person("Kim Clark",28,66666.666).
       run:-
          % Name   is left-justified, at least 15 characters wide
          % Age    is right-justified, 2 characters wide
          % Income is right-justified, 9 characters wide, with 2
          % decimal places, printed in fixed-decimal notation
          person(N, A, I),
          writef("Name= %-15, Age= %2, Income= $%9.2f \n",N,A,I),
          fail
          ;
          true.
       goal
          run.
    
        Текст этой программы можно взять здесь.

        Результат программы будет следующим:

       Name= Pete Ashton , Age= 20, Income= $ 11111.11
       Name= Marc Spiers , Age= 32, Income= $ 33333.33
       Name= Kim Clark , Age= 28, Income= $  66666.67
    

    На следующем шаге мы рассмотрим чтение.




Предыдущий шаг Содержание Следующий шаг