Инструменты пользователя

Инструменты сайта


examination:flp:question70

Содержание

writef

Предикат writef/*

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

[code]writef(FormatString, Arg1,Arg2,Arg3,…,ArgN) % (i,i,i,i, . ..,i)[/code]

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

[code]%-m.pf[/code]

Символы спецификаторов формата, следующие за знаком процента (%), являются необязательными и имеют значения, описанные в таблице 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)

Примеры форматированного вывода Следующая программа иллюстрирует действие различных спецификаторов формата при форматированном выводе с помощью 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

Пример, показывающий, как можно использовать 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

write

В Пролог включены три стандартных предиката для вывода.

Это:

  • предикат write;
  • предикат nl;
  • предикат writef.

Предикат write может быть вызван с произвольным числом аргументов:

 write(Param1,Param2,Param3,...,ParamN) % (i,i,i,...,i)

Эти аргументы могут быть либо константами из стандартных доменов, либо переменными. Если это переменные, то они должны быть входными параметрами.

Стандартный предикат nl (от англ. new line - новая строка) всегда используется вместе с предикатом write. Он обеспечивает переход на новую строку на экране дисплея. Например, следующие подцели:

pupil(PUPIL,CL),
write(PUPIL,"is in the",CL,"class"),
nl,
write("----------------------------").

могут привести к выводу на экран такого результата:

 Helen Smith is in the fourth class
 ------------------------------,

а цель:

 ....,
 write("List1=  ",L1,",List2=  ",L2)

может дать:

 Listl=[cow,pig,rooster],List2=[1,2,3].
   В свою очередь, если My_sentence связана с записью 
 sentence(subject(john),sentence_verb(sleeps)) 

то, выполняя следующую программу:

 domains
    sentence=sentence(subject,sentence_verb)
    subject=subject(symbol); .....	
    sentence_verb=sentence_verb(verb); ...... 
    verb=symbol	
clauses
    ......
    write( " SENTENCE= ",My_sentence).

вы сможете увидеть на дисплее:

 SENTENCE=sentence(subject(john),sentence_verb(sleeps))

Обратите внимание на наличие в строках обратного слэша (\). Это управляющий символ. Чтобы напечатать непосредственно символ \ (обратный слэш), вы должны ввести два обратных слэша подряд. Например, для порождения строки пути к файлу в DOS A:\PROLOG\MYPROJS\MYFILE.PRO в программе на Прологе нужно ввести a:\\prolog\\myprojs\\myfile.pro.

   За обратным слэшем может следовать какой-либо из специальных символов управления печатью: 

'n' - новая строка и возврат каретки; 't' - табуляция;

Также за обратным слэшем могут следовать до трех десятичных цифр, задающих специальный код ASCII. Однако не следует вставлять последовательность \0 в строку, если в этом нет необходимости. Пролог использует те же соглашения относительно строк, завершающихся нулем, что и язык С.

Предикат write сам по себе не предоставляет всю полноту функций управления печатью для таких сложных объектов, как, например, списки, но написать программы, которые вам их предоставят, просто. Следующие три небольших примера демонстрируют эти возможности.

writedevice

Предикат writedevice/1

Предикат writedevice либо назначает, либо позволяет получить имя current_ write_device (текущего устройства записи). Он имеет формат:

 writedevice(SymbolicFileName) % (i), (о)

Предикат writedevice переопределит устройство записи, если указанный файл открыт для записи или добавления. Если переменная SymbolicFileName свободна, writedevice присвоит ей имя текущего активного устройства записи.

Примеры открытия файла, записи в файл и закрытия файла:

1) Следующая последовательность открывает файл MYDATA.FIL для записи, затем направляет весь вывод, порождаемый операторами между двумя предикатами writedevice, в этот файл. MYDATA.FIL соответствует символическому имени destination, появляющемуся в описании домена file.

 domains
    file=destination
 goal
    openwrite(destination, "MYDATA.FIL"),
    writedevice(OldOut), % Получаем текущее устройство вывода
    writedevice(destination), % Перенаправляем вывод в файл
       :
       :
    writedevice(OldOut), % Восстанавливаем устройство вывода

2) Программа помещает символы, набранные наклавиатуре, в файл TRYFILE.ONE на текущем диске, использует стандартные предикаты read и write. Набираемые символы не выводятся на экран дисплея. Для вас будет хорошим упражнением написать программу, которая выводила бы эти символы и на экpaн. Файл закрывается при нажатии клавиши #.

 domains
    file=myfile
 predicates 
    readloop
 clauses
    readloop:-
       readchar(X),
      X<>'#',
      !,
      write(X),
      readloop.
    readloop.
 goal
    write("This program reads your input and writes it to"),nl,
    write("tryflie.one. For stop press #"),nl,
    openwrite(myfile,"tryfile.one") ,
    writedevice(myfile),
    readloop,
    closefile(myfile),
    writedevice(screen),
    write("Your input has been transferred to the file tryflie.one"),
    nl.
examination/flp/question70.txt · Последние изменения: 2014/01/15 12:17 (внешнее изменение)