Распечатать страницу

Лабораторна робота №20, Стандартні предикати введення/виведення

« Назад

Код роботи: 1128

Вид роботи: Лабораторна робота

Предмет: Технологія створення програмних та інтелектуальних систем

Тема: №20, Стандартні предикати введення/виведення

Кількість сторінок: 31

Дата виконання: 2016

Мова написання: українська

Ціна: 250 грн

Мета: Вивчити базові вбудовані предикати для читання і запису.

Хід роботи

У Visual Prolog включені три стандартних предиката для виводу:

- предикат write;

- предикат nl;

- предикат writef.

При використанні даних предикатів необхідно перед їх викликом прописати stdio (наприклад, stdio::nl).

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

write (Paraml, Param2, РагатЗ, ..., ParamN) % (i, i, i, ..., i)

Ці аргументи можуть бути або константами зі стандартних доменів, або змінними. Якщо це змінні, то вони повинні бути вхідними параметрами.

Стандартний предикат nl (new line — новий рядок) завжди використовується разом з предикатом write. Він забезпечує перехід на новий рядок на екрані дисплея.

Зворотний слеш (\) - це керуючий символ. Щоб надрукувати безпосередньо символ \ (зворотний слеш), необхідно ввести два зворотних слеша поспіль. Наприклад, для породження рядка шляху до файлу в

A:\PROLOG\MYPROJS\MYFILE.PRO в програмі на Visual Prolog

потрібно ввести

а:\\prolog\\myprojs\\myfile.pro.

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

- 'n' — новий рядок і повернення каретки;

- 't' —- табуляція;

- 'r' — повернення каретки.

Також за зворотним слешем можуть слідувати до трьох десяткових цифр, що задає спеціальний код ASCII. Однак не слід вставляти послідовність \ 0 в рядок, якщо в цьому немає необхідності. Visual Prolog використовує ті ж угоди щодо рядків, що завершуються нулем.

Будьте обережні з опцією \r. Вона встановлює поточну позицію виведення назад на початок поточного рядка, але, якщо ви випадково зробите це між печаткою двох різних рядків, це може відбутися так швидко, що перша з них буде стерта перш, ніж ви її помітите. Також, якщо ви друкуєте щось, що не вміщується на одному рядку, опція \r встановить курсор на початок того ж самого рядка, на якій цей вивід був розпочатий.

Предикат write сам по собі не надає всю повноту функцій управління печаткою для складних об'єктів, як, наприклад, списки. Наступні приклади демонструють ці можливості.

Приклад 1. Виведення списку

Програма друкує список без відкриваючих (і закриваючих) квадратних дужок.

Лістинг програми

Б1128, 1

Б1128, 2

Зверніть увагу, як ця програма використовує рекурсію для обробки списку.

Б1128, 3

Рис. 1. Результат виконання програми з прикладу 1

Приклад 2. Висновок елементів списку

У наступному прикладі програма виводить елементи списку не більше ніж по п'ять елементів у рядку.

Лістинг програми

Б1128, 4

Б1128, 5

Б1128, 6

Рис. 2. Результат виконання програми з прикладу 2

Предикат writef/*

Предикат writef дозволяє виконати форматований вивід; він має наступний формат:

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

Аргументи Argl, ..., Argn повинні бути константами або зв'язаними змінними, що належать стандартним доменам. Складні домени форматувати можна. Рядок форматування містить звичайні символи і форматні специфікатори; звичайні символи друкуються без модифікації, а форматні специфікатори мають наступну форму:

%-m.pf

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

Таблиця 1

Значення символів специфікаторів формату

Символ

Значення

Дефис (-)

Показує,   що   поле  вирівнюється  зліва   (за  замовчуванням вирівнюється праворуч)

m поле

Десяткове число, що визначає мінімальну довжину поля

р поле

Десяткове число, яке описує або точність представлення з плаваючою точкою, або максимальне число символів, що друкуються в рядку

f поле

Описує формати, відмінні від форматів, прийнятих за замовчуванням для даного об'єкта. Наприклад, поле f може описувати те, що цілі числа повинні бути надруковані як беззнакові або шістнадцяткові числа

Visual Prolog розпізнає специфікатори формату поля f, описані в таблиці 2.

Таблиця 2

Специфікатори формату поля f

Специфікатор формату

Опис

f

Форматувати як дійсне число з фіксованою комою (як 123.4).

e

Форматувати дійсне число в експоненційному записі (як 1.234e+002).

g

Форматувати або у форматі f, або у форматі e - запис буде коротшим.

d

Форматувати як знакове ціле.

u

Форматувати як беззнакове ціле.

x

Форматувати як шістнадцяткове число.

o

Форматувати як восьмирічне число.

c

Форматувати як символ.

B

Форматувати як двійковий тип Visual Prolog.

R

Форматувати як номер посилання бази даних.

P

Форматувати як параметр процедури

s

Форматувати як рядок.

Для цілих доменів заголовна буква в специфікаторами формату означає, що відповідний об'єкт належить типу long. Якщо літера формату не позначена, Visual Prolog автоматично підбере один з відповідних форматів.

Приклад 3. Використання предиката writef

Наступна програма ілюструє дію різних специфікаторів формату при форматованому виведенні за допомогою writef.

Лістинг програми

Б1128, 7

Б1128, 8

Рис. 3. Результат виконання програми з прикладу 3

Приклад 4. Використання предиката writef для форматного виводу

Наступна програма показує, як можна використовувати writef для форматного виводу. На екран виводиться інформація про людей з бази фактів: ім'я, вік, заробітна плата.

Лістинг програми

Б1128, 9

Б1128, 10

Б1128, 11

Рис. 4. Результат виконання програми з прикладу 4

Читання

Visual Prolog включає в себе декілька стандартних предикатів для читання. З них три основних:

- read — для читання будь-яких термів, включаючи складені об'єкти;

- readLine — для читання рядків;

- readChar — для читання символьних значень.

При використанні даних предикатів необхідно перед їх викликом прописати stdio (наприклад, X=stdio::read()).

Предикат readLine/1

Предикат readLine читає текстовий рядок, використовуючи формат:

Line =stdio::readLine() %     (о)

Домен для змінної Line повинен бути строкового типу. Перед тим як ви викличете readLine, змінна Line повинна бути вільна, readLine зчитує до 254 символів (плюс повернення каретки) з клавіатури і до 64 Кбайт з інших пристроїв. Якщо під час введення з клавіатури натиснути клавішу <Esc>, то readLine зазнає невдачі.

Предикати readChar/1

Предикат readChar зчитує один символ з поточного пристрою введення, використовуючи формат:

Simv=stdio::readChar() %    (о)

Перед викликом предиката readChar змінна Simv повинна бути вільною і належати домену char. Якщо поточним пристроєм введення є клавіатура, readChar чекає, поки буде натиснутий один символ, після чого повертає його. Якщо під час введення натиснути клавішу <Esc>, то readChar зазнає невдачі.

Предикат read/2

Предикат read зчитує будь терми. Він має наступний формат:

N=stdio::read()       %   (i, i)

Приклад 5. Використання предиката read

Наступна програма читає дані, введені з клавіатури і виводить їх на екран до тих пір, поки користувач не введе "y".

Лістинг програми

Б1128, 12

Б1128, 13

Б1128, 14

Б1128, 15

Рис. 5. Результат виконання програми з прикладу 5

Приклад 6. Використання предикатів readChar і readLine

Програма читає з клавіатури список з 5 рядків, введений користувачем, і виводить його на екран. Потім користувач вводить послідовність символів, програма створює список з перших п'яти введених символів і виводить його на екран.

Лістинг програми

Б1128, 16

Б1128, 17

Б1128, 18

Рис. 6. Результат виконання програми з прикладу 6

Завдання

Вивести вміст довідника або прайс-листа з лабораторної роботи № 3 у вигляді таблиці. Таблиця повинна мати шапку (заголовки стовпців таблиці).

Для малювання горизонтальних і вертикальних ліній використовувати символи (-, |)

Контрольні питання

1. Перерахуйте стандартні предикати виведення в Visual Prolog.

2. Назвіть правила використання зворотного слеша (\).

3. Для чого використовується предикат writef?

4. Для чого використовується предикат read?

5. Чим відрізняються предикати read / 1, readCharl / 1, readLine / 1?