Константы стиля и толщины линий



МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ

 

Национальный технический университет

«Харьковский политехнический институт»

 

ПРОГРАММИРОВАНИЕ В СРЕДЕ Turbo Prolog 2.0

Лабораторный практикум по дисциплине «Алгоритмические языки

Систем искусственного интеллекта»

Для студентов специальности

"Интеллектуальные системы принятия решений"

 

 

Утверждено редакционно-издательским

советом университета,

протокол № 2 от 22.06.2006

 

 

Харьков НТУ “ХПИ” 2006


ПРОГРАММИРОВАНИЕ В СРЕДЕ Turbo Prolog 2.0. Лабораторный практикум по дисциплине «Алгоритмические языки систем искусственного интеллекта» для студентов специальности "Интеллектуальные системы принятия решений" / Сост.­ - Л.А. Никитина, А.Э. Заволодько, И.П. Хавина,. – Харьков: НТУ “ХПИ”, 2006. - 92с.

 

 

Авторы:           Л.А. Никитина,

А.Э. Заволодько,

И.П. Хавина.

 

Рецензент:       В.М. Поштаренко.

 

 

Кафедра “Системы информации”

 


Предисловие

 

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

Лабораторный практикум состоит из семи лабораторных работ, ориентированных на решение различных задач – от разработки базы данных и выполнения запросов к ней до рекурсивной обработки древовидных структур данных и текстовой информации.

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

В результате выполнения лабораторных работ студенты должны освоить принципы логического программирования, основные приемы программирования с использованием встроенных предикатов языка Turbo Prolog, уметь разрабатывать собственные предикаты для решения поставленных задач.

 

Лабораторная работа 1

Тема работы: ознакомление со средой программирования Turbo Prolog, организация ввода-вывода в Turbo Prolog.

Цель работы: получение практических навыков работы в среде программирования Turbo Prolog 2.0.

Темы для предварительной проработки

§ Среда программирования Turbo Prolog 2.0.

§ Структура Prolog-программы.

§ Типы данных.

§ Факты и предикаты Prolog-программы.

§ Предикаты ввода-вывода.

 

Постановка задачи: Для выполнения лабораторной работы необходимо написать простую программу на языке Turbo Prolog, реализующую индивидуальное задание, и протрассировать ее выполнение.

1.1. Порядок выполнения работы

1.Выбрать индивидуальное задание согласно номеру по журналу.

2.Разработать метод решения задачи и предикаты для его реализации на языке Turbo Prolog.

3.Используя Приложение 1Г, выбрать стандартные предикаты, требуемые для решения задачи.

4.Загрузить Turbo Prolog.

5.В окне редактора написать текст программы, отладить и выполнить ее.

6.С помощью средств трассирования просмотреть в окне трассировки результаты пошагового выполнения программы.

7.Определить, какие из используемых переменных являются входными и выходными.

8.Показать преподавателю результаты работы программы.

 

1.2. Содержание отчета

1. Тема лабораторной работы.

2. Цель работы.

3. Описание применяемых стандартных и разработанных предикатов.

4. Текст программы.

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

6. Выводы.

1.3. Индивидуальные задания

Знания о заданной предметной области представить в виде фактов, имеющих не менее трех параметров. Вывести факты на экран в виде таблиц.

Выбрать предметную область согласно номеру в списке журнала группы:

1. Студенты группы.

2. Книги.

3. Генеалогическое дерево.

4. Государства и столицы.

5. Автомобили.

6. Лекарства.

7. Штатное расписание организации.

8. Компьютерная техника.

9. Спортсмены.

10. Животные.

11. Птицы.

12. Военная техника.

13. Самолеты.

14. Сделки фирмы по продаже товаров.

15. Поставщики товаров.

16. Клиенты фирмы.

17. Спортивная одежда.

18. Косметика.

19. Пациенты поликлиники.

20. Web-сайты.

21. Мебель.

22. Автопарк.

23. Зеленые насаждения.

24. Мобильные телефоны.

25. Плейеры.

26. Фотоаппараты.

27. Склад продуктов питания.

28. Ведомость зарплаты.

29. Компоненты компьютера.

30. Учебные группы факультета.

1.4. Пример решения задачи

1. Тема работы: Ознакомление со средой программирования Turbo Prolog. Организация ввода-вывода в Turbo Prolog.

2. Цель работы: Получение практических навыков работы в среде программирования Turbo Prolog 2.0.

3. Индивидуальное задание: Знания о заданной предметной области представить в виде фактов. Вывести факты на экран в виде таблиц. Предметная область: предикаты ввода-вывода в языке Turbo Prolog.

4. Разработка метода решения задачи.

Знания о предикатах ввода-вывода (Приложение Г) представим с помощью фактов, имеющих имя IO_predicates. Вывод значений фактов на экран организуем с помощью предиката vivod. С помощью этого предиката будет выполнен полный перебор имеющихся фактов и вывод значений на экран в виде таблицы.

5. Описание предикатов, разработанных для реализации метода решения задачи на языке Turbo Prolog.

Для реализации метода решения задачи разработаны следующие предикаты:

IO_predicates(INTEGER номер_предиката, STRING имя_предиката,

STRING назначение_предиката)

Предикат представляет знания о предикатах ввода-вывода Пролога. В скобках указан тип параметра и его смысл.

vivod       Предикат vivod будет иметь две формулировки –

правило vivod для обращения к базе фактов и вывода на экран значений аргументов очередного факта, и факта vivod, который ничего не значит, но обращение к нему всегда завершается успехом.

header     Вывод заголовка таблицы

6. Стандартные предикаты, используемые для решения задачи:

Предикат Цель использования
fail Выполнение возврата и перебора всех значений базы фактов
makewindow Создание окна для вывода значений
writef Форматированный вывод
readchar Ввод символа

7. Текст программы.

predicates

 IO_predicates(integer, string, string)

 vivod

 header

clauses

 IO_predicates(1,"readln(string)","Ввод строки символов").

 IO_predicates(2,"readreal(real)","Ввод вещественного числа").

 IO_predicates(3,"readint(integer)","Ввод целого числа"). 

 IO_predicates(4,"readchar(char)","Ввод одного символа").

 IO_predicates(5,"file_str(string,string)","Преобр. файла в строку или строки в файл").

 IO_predicates(6,"write(спис_знач)","Вывод значений на экран").

 IO_predicates(7,"writef(формат,спис_знач)","Форматированный вывод").

 IO_predicates(8,"nl","Перевод курсора на новую строку").

 

 header:-write("№пп\t Предикат  \t Назначение"),

      write("\n-----------------------------------------------------------\n").

      

 vivod:-IO_predicates(X,Y,Z),

     writef(" %-3%-25\t%s\n",X,Y,Z),

     fail.

 vivod.

goal

 makewindow(1,120,2,"Предикаты ввода-вывода",2,2,15,75),

 header,vivod,write("-------------------------------------------------------"),

 readchar(_).

8. Результаты выполнения программы.

------------------------------------Предикаты ввода-вывода-------------------------------------------

| №пп   Предикат                Назначение                                                    |

| ----------------------------------------------------------------------------------------------------------------|

| 1    readln(string)               Ввод строки символов                                 |

| 2    readreal(real)           Ввод вещественного числа                         |

| 3    readint(integer)       Ввод целого числа                                        |

| 4    readchar(char)        Ввод одного символа                                   |

| 5    file_str(string,string)   Преобр. файла в строку или строки в файл    |

| 6    write(спис_знач)     Вывод значений на экран                                

| 7    writef(формат,спис_знач)                                                                        Форматированный вывод     |

| 8    nl                                    Перевод курсора на новую строку            |

| ----------------------------------------------------------------------------------------------------------------|

9. Результаты трассировки программы.

Для выполнения трассировки программы следует вставить в первую строку программы вызов предиката trace. Фрагмент трассировки программы:

CALL:     goal()

CALL:     makewindow(1,120,2,"Предикаты ввода-вывода",2,2,15,75)

RETURN: makewindow(1,120,2,"Предикаты ввода-вывода",2,2,15,75)

CALL:     header()

  write("№пп Предикат           Назначение"),

  write("\n------------------------------------------------------------\n")

RETURN: header()

CALL:     vivod()

  io_predicates(_,_,_)

  write(1)

  write(“readln(string)”)

  write(“Ввод строки символов”)

REDO:     *io_predicates(_,_,_)

Звездочкой помечается точка возврата на дереве решения.

10. Выводы

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

§ Среда программирования Turbo Prolog 2.0.

§ Структура Prolog-программы.

§ Типы данных.

§ Факты и предикаты Prolog-программы.

§ Предикаты ввода-вывода.

Контрольные вопросы

1. Назначение разделов программы.

2. Что такое факт и что такое правило? Какова разница между ними?

3. В каком разделе программы могут размещаться предикаты?

4. Что такое унификация переменных?

5. Что такое анонимная переменная?

6. Что такое бэктрекинг?

7. Как получить значения всех фактов, имеющихся в программе?

8. Что такое дерево решения?

9. Что такое машина логического вывода Пролога?

10. Какие стандартные предикаты используются для ввода информации?

11. Какие стандартные предикаты используются для вывода информации?

12. Как перенаправить входной/выходной потоки данных?

13. Объясните правила использования предикатов для работы с окнами.


Приложение 1А

Среда программирования Turbo Prolog 2.0

Таблица 1А.1 – Основные команды Turbo Prolog 2.0

Цель Действие Горячие клавиши
Запуск среды Turbo Prolog 2.0 Tprolog\BIN\prolog.exe  
Переход в режим редактирования программы Esc ->Edit  
Компиляция программы Esc -> Compile  
Выполнение программы Esc -> Run  
Загрузка программы Esc -> Files -> Load F3
Отображение в окне редактора текста программы, которая уже была загружена в текущем сеансе работы   Esc -> Files -> Pick  
Сохранение программы под текущим именем Esc -> Files -> Save F2
Сохранение программы под новым именем Esc -> Files -> Write to  
Смена текущего каталога Esc -> Files -> Directory  
Завершение работы Esc -> Files -> Quit Alt-X

Таблица 1А.2 – Команды работы с блоками текста при редактировании программы

Цель Действие
Начало отметки блока текста Ctrl-K-B
Завершение отметки блока текста Ctrl-K-К
Копирование выделенного блока текста Ctrl-K-С
Перемещение выделенного блока текста Ctrl-K-V

Продолжение табл. 1А.2

Цель Действие
Удаление выделенного блока текста Ctrl-K-Y
Копирование блока текста из Pick-файла Ctrl-K-R Выбрать имя файла из списка, выделить блок и нажать Enter
Запись выделенного блока текста в файл Ctrl-K-W

Приложение 1Б

Структура Prolog-программы

Пролог-программа может состоять из ряда разделов (секций), ни один из которых не является обязательным. Каждый раздел озаглавливается. В качестве заголовков разделов выступают DOMAINS, CLAUSES, PREDICATES, CONSTANTS, GOAL.

DOMAINS – объявление областей определения (доменов). Объявления нескольких доменов не разделяются никакими знаками.

Способы объявления областей определения:

1. имя_домена = d

где d – область определения. Областью определения может являться один из стандартных типов – char, string, symbol, integer, real.

Пример:

i=integer

s=string

2. имя_домена = d*

где d – область определения. Знак * означает, что такой домен определяет список.

Примеры:

ii = integer* % Определяет список целых чисел;

список_строк = string* % Определяет список строк.

3. имя_домена=имя_выражения1(арг1_1,арг1_2,…);

имя_выражения2(арг2_1,арг2_2,…)

Такое объявление используется для объявления областей определения составных объектов.

Пример:

oбъект=цел(integer);стр(string)

pol=left;right

4. file=имя1, имя2, …

Задаются символические имена файлов, которые в программе будут связаны с физическими именами.

Пример:

file=in_file, out_file

CONSTANTS – объявление констант, используемых в программе.

DATABASE – объявление оперативной базы данных. Факты объявленной базы данных будут оперативно читаться во время выполнения программы, например, из файла. Типы аргументов всех читаемых фактов должны соответствовать объявлению. Предикаты, объявленные в этом разделе, не должны объявляться в разделе PREDICATES.

Пример:

mybase(integer,string,integer*)

Здесь объявляется база данных mybase. Первый аргумент имеет целый тип, второй – строковый, третий – список целых чисел.

PREDICATES –объявление предикатов. Указываются имена всех предикатов с областями определения их аргументов.

Пример:

любит(string,string)

p1(i,s) % В данном случае i и s воспринимаются

% как объявленные ранее домены

CLAUSES – запись всех предикатов, т.е. фактов и правил. Этот раздел представляет собой базу знаний Пролога или тело программы. Особенностью записи базы знаний является то, что одноименные факты и правила должны быть сгруппированы.

GOAL –раздел, который инициирует выполнение всей программы. В нем через запятую перечисляются все главные цели программы. Раздел завершается точкой. 

Если раздел GOAL отсутствует, то после нажатия клавиши Esc и выбора команды Run в меню в стандартном диалоговом окне появляется слово Цель:. В этом случае Пролог ждет от пользователя вопроса. Вопрос задается путем ввода выражений загруженной Пролог-программы, и Пролог пытается найти ответ, если он существует.

Приложение 1В

Стандартные типы данных (предопределенные домены)

Тип Описание
char Один знак в двойных кавычках
string Последовательность знаков в двойных кавычках размером до 64К
symbol Последовательность знаков без кавычек, начинающаяся с маленькой буквы, или последовательность знаков в двойных кавычках. Типы symbol и string отличаются тем, что имеют различное внутреннее представление. Для типа symbol есть таблицы указателей, обеспечивающие быструю обработку этих данных, но требующие больших объемов памяти. При считывании данных типа symbol из файла эти данные следует заключать в двойные кавычки
real Вещественные числа из диапазона ±(1Е-307 ÷ 1Е+308)
integer Целые числа из диапазона –32768 ÷ +32768
file Текстовый файл
dbasedom Сгенерированный домен для термов внешней базы данных
bt_selector Возвращаемый селектор двоичного дерева
db_selector Селекторы внешней базы данных, определенной пользователем
place Домен размещения, принимающий значения in_memory – в памяти; in_ems – в расширенной памяти; in_file – в файле
reg Домен процессорных регистров reg(AX,BX,CX,DX,SI,DI,DS,ES)
bgi_ilist Список целых чисел, используемый в BGI-предикатах

Составные типы данных (структуры) составляются на основе стандартных или на основе других составных типов.


Приложение 1Г

Предикаты ввода-вывода

Таблица 1Г.1 – Предикаты ввода

Предикат Описание
readdevice(символическое_имя)                  (file):(i)(o) Устанавливается текущее устройство ввода с заданным символическим именем или возвращается символическое имя текущего устройства ввода. По умолчанию – readdevice(keyboard). Если устройством ввода назначается файл, то он должен быть открытым для чтения или модификации.
readint(целое_число)            (integer):(o) Ввод целого числа с текущего устройства ввода.
readreal(вещественное_число)            (real):(o) Ввод вещественного числа с текущего устройства ввода.
readchar(знак)            (char):(o) Ввод символа с текущего устройства ввода.
readln(строка)            (string):(o) Ввод строки символов с текущего устройства чтения.
file_str(имя_файла,строка)            (string,string):(i,o)(i,i) Ввод символов (до 64К) из файла с указанным именем, в строку до EOF, или пишет из строки в файл.
inkey Считывание символа с клавиатуры
keypressed Ожидание нажатия клавиши клавиатуры

 

Таблица 1Г.2 – Предикаты вывода

Предикат Описание
writedevice(символическое_имя)                            (file):(i)(o) Устанавливается текущее устройство вывода с заданным символическим именем или возвращается символическое имя текущего устройства вывода. По умолчанию – writedevice(screen).

Продолжение табл. 1Г.2

Предикат Описание
  Если устройством ввода назначается файл, то он должен быть открытым для записи или модификации.
write(Х1,Х2,...) (переменные и константы):            (i,i,...) Вывод значений переменных и констант на текущее устройство вывода
nl Перевод курсора на новую строку
writef(формат_строка,Х1,Х2,...) (string, переменные и            константы):            (i,i,i,...) Форматный вывод значений констант и переменных. Формат_строка задается в виде “%-m.pw”, где: % – признак форматного вывода; - – знаки в поле вывода будут выравниваться по левому краю; m – указание длины поля вывода; p – при выводе чисел указывается количество цифр после точки; w – указание нотации чисел:       Х – длинное целое (строки, указатели базы данных);       х – шестнадцатеричный формат (данные типа char,integer);       s – строки;       с – символы (данные типа char,integer);       g – вещественное число в коротком формате;       f – вещественное число в форме с фиксированной точкой;       e – вещественное число в экспоненциальном виде; \n  – перевод курсора на новую строку; \t   – табулирование курсора; \nnn – вывод символа с кодом nnn

 


Продолдение прил. 1Г

Таблица 1Г.3 - Система окон

Предикат Описание
attribute(Атрибут) Устанавливает или возвращает значение атрибута для всех позиций вывода: Атрибут=Ф+Т, где Ф – номер цвета фона; Т – номер цвета текста. Возможные значения Ф: 0 – черный;      72 – розовый; 8 – серый;        80 – лиловый; 16 – синий;      88 – малиновый; 32 – зеленый;  96– коричневый; 40 – салатный; 104 – желтый; 48 – бирюзовый;           112 – белый; 64 – красный; 120– ярко-белый. Возможные значения Т: 0 – черный;      4 – красный; 1 – синий;         5 – лиловый; 2 – зеленый;    6 – коричневый; 3 – голубой;    7 – белый
makewindow(№_окна,Атрибут,                     Рамка,Заголовок,                     Строка,Столбец,                     Высота,Ширина)        (integer,integer,integer,            string,integer,integer,            integer,integer) - (i,i,i,i,i,i,i,i)        (o,o,o,o,o,o,o,o) Создается окно с параметрами: №_окна – номер окна; Атрибут – атрибут экрана (см. предикат attribute); Рамка – номер цвета рамки; 0 – рамки нет; Заголовок – заголовок окна, если есть рамка; Строка,Столбец – координаты верхнего левого угла окна (номер строки и столбца); Высота,Ширина – количество строк и столбцов в окне
shiftwindow(№_окна)            (integer) - (i) (o) Установить текущим окно с заданным номером или получить номер текущего окна

 


Продолжение табл. 1Г.3

Предикат Описание
existwindow(№_окна)                            (integer) - (i) Предикат завершается успехом, если окно с указанным номером существует
removewindow Удаляет текущее окно
removewindow(№_окна,Обнов)            (Integer,Integer) – (i,i) Удаляет текущее окно с заданным номером. Параметр Обнов задает режим обновления окна: Обнов=0 Фон под окном не обновляется; Обнов=1 Фон под окном обновляется
clearwindow Текущее окно очищается

 

Лабораторная работа 2

Тема работы: элементы логического программирования в среде Turbo Prolog, работа с внутренней базой данных

Цель работы: ознакомление с приемами логического программирования; создание базы данных во внешнем файле, освоение возможностей использования предикатов работы с базой данных; разработка простых запросов к базе данных в среде Turbo Prolog 2.0.

Темы для предварительной проработки

§ Логика предикатов первого порядка.

§ Факты и правила Пролог-программ.

§ Предикаты для работы с внутренней базой данных.

§ Идентификация и связывание переменных.

Постановка задачи: написать программу на языке Prolog, содержащую факты и правила для загрузки базы данных и выполнения запросов к ней; отладить и выполнить программу.

2.1. Порядок выполнения работы

1. Выбрать индивидуальное задание согласно номеру по журналу.

2. Загрузить Turbo Prolog.

3. Создать базу данных во внешнем текстовом файле.

4. Загрузить базу данных в оперативную память. Вывести любую таблицу на экран, добавить и удалить из нее факты. Проверить результат добавления и удаления фактов.

5. Разработать предикаты для выполнения запросов.

6. Определить, какие переменные, используемые в предикатах, являются входными и выходными.

7. Показать преподавателю результаты работы программы.

2.2. Содержание отчета

1. Тема лабораторной работы.

2. Цель работы.

3. Описание применяемых стандартных и разработанных предикатов.

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

2.3. Индивидуальные задания

Создать базу данных (Приложение 2А), выполнить операции удаления и добавления записей в таблицы. Проверить результат. Выполнить запрос к базе данных. Запрос выбрать согласно номеру фамилии в журнале группы из списка, приведенного ниже.

1. Какую должность занимает сотрудник, имя которого вводится с клавиатуры?

2. Вывести фамилии и должности сотрудников, работающих в отделе, номер которого вводится с клавиатуры.

3. Ввести с клавиатуры фамилию сотрудника, определить его должность и оклад.

4. Ввести с клавиатуры фамилию сотрудника, определить, в каких проектах он участвует.

5. Ввести номер проекта и вывести фамилии и должности всех его участников.

6. Ввести фамилию сотрудника и номер проекта, определить его должность и задания, которые он выполняет в данном проекте.

7. Определить номера отделов, сотрудники которых участвуют в заданном проекте.

8. Определить, какие ресурсы и в каком количестве задействованы в заданном проекте.

9. Определить фамилию начальника заданного отдела.

10. Ввести фамилию руководителя отдела и вывести фамилии и должности его подчиненных.

11. Ввести фамилию сотрудника и определить, какие ресурсы он использует.

12. Определить, какие должности задействованы в заданном проекте.

13. Определить, какие задания выполняют в проектах инженеры.

14. В какие сроки и в каком количестве задействован заданный ресурс?

15. Какие отделы используют названный ресурс?

16. Какие сотрудники участвуют в проектах в заданный период времени?

17. Вывести фамилии и должности сотрудников, имеющих оклад более 500.

18. Вывести номера проектов, в которых заданный ресурс используется в количестве более 5.

19. Вывести оклады и должности сотрудников, участвующих в проекте.

20. Вывести названия Ресурсов, задействованных в проектах в заданный период времени.

21. Какие ресурсы используются механиками?

22. В каких заданиях участвуют операторы?

23. Какие оклады имеют операторы, участвующие в заданном проекте?

24. В каких проектах ресурс заказан в большем количестве, чем есть в наличии?

25. Какие ресурсы и в каком количестве освобождаются после даты 06.30.06?

26. Какие ресурсы использует заданный отдел?

27. Какие отделы не участвуют в заданном проекте?

28. Какие сотрудники заканчивают выполнение заданий после даты 06.30.06?

29. Какие оклады имеют сотрудники, выполняющие задания начиная с даты 06.30.06?

30. Вывести фамилии и должности сотрудников, использующих заданный ресурс.

2.4. Пример решения задачи

8.1. Тема работы: Элементы логического программирования в среде Turbo Prolog. Работа с внутренней базой данных

8.2. Цель работы: Ознакомление с приемами логического программирования. Создание базы данных во внешнем файле. Освоение предикатов работы с базой данных. Разработка простых запросов к базе данных в среде Turbo Prolog 2.0.

8.3. Индивидуальное задание: Создать базу данных (Приложение 2А), выполнить операции удаления и добавления записей в таблицы. Проверить результат. Выполнить запрос к базе данных: вывести фамилии и должности сотрудников, использующих заданный с клавиатуры ресурс.

8.4. Разработка метода решения задачи.

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

При выполнении запроса необходимо последовательно обращаться к таблицам базы данных с целью унификации неизвестных переменных по известным значениям других переменных.

8.5. Описание предикатов, разработанных для реализации метода решения задачи на языке Turbo Prolog.

Предикат Цель использования
sotr(string,integer,            integer,string) Таблица Сотрудники
shtat(integer,integer,            string,integer,integer) Таблица Штатное расписание
proj(integer,string,integer,            string,string,integer,integer) Таблица Проекты
res(integer,string,integer) Таблица Ресурсы
zapros Инициация запроса
opr_res(string)            (i) – название ресурса Определение номера ресурса по названию
viv(integer)            (i) – номер ресурса Идентификация и вывод значений
viv_tabl Вывод значений таблицы Сотрудники

8.6. Стандартные предикаты, используемые для решения задачи:

Предикат Цель использования
retractall(_) Удаление всех фактов из оперативной памяти
consult Загрузка таблиц базы данных
makewindow Создание окна
retract Удаление конкретного факта
readchar Ввод символ с клавиатуры
assertz Добавление факта в конец таблицы

8.7. Текст программы.

domains

i=integer                            % Домен целых чисел

s=string             % Домен строк

ss=s*                  % Домен списка строк

database

 sotr(s,i,i,s)        % Таблица Сотрудники

 shtat(i,i,s,i,i)     % Таблица Штатное расписание

 proj(i,s,i,s,s,i,i) % Таблица Проекты

 res(i,s,i)            % Таблица Ресурсы

predicates

 zapros               % Инициация запроса

 viv(i)                  %Идентификация и вывод значений

 opr_res(s)        % Определение ид.номера ресурса по названию

 viv_tabl             % Вывод значений таблицы Сотрудники

clauses

 zapros:-

makewindow(2,124,1,"Использование ресурса",2,2,15,60),

findall(X,res(_,X,_),S),          %Составляется список названий ресурсов

write("Введите название ресурса из списка:\n"),

write(S,"\n"),

readln(N), % Считывается название ресурса

opr_res(N).

 opr_res(N):- % Эта версия предиката работает, если ресурс есть

res(Y,N,_), % По названию ресурса N определяется его номер Y

write("Ресурс ",N," используют: \n"),

viv(Y).     % Поскольку ресурс существует, вызывается предикат viv

 opr_res(_):-

write("Такого ресурса нет!"). % Эта версия предиката работает, если

% ресурса нет

 viv(Y):-

proj(P,Id,_,_,_,Y,_), % По номеру ресурса определяется проект и

% ИД_сотрудника

sotr(Id,D,_,F),        % По ИД_сотрудника определяется его №_должности

% и ФИО

shtat(_,D,D1,_,_),  % По №_должности определяется название

% должности

writef("%-10s %-15s в проекте %d\n",D1,F,P),

fail.                          % Обеспечивает возврат и поиск новых решений

 viv(_).                      % Позволяет завершить предикат viv после вывода

% всех значений

 viv_tabl:-                 % Выводит все значения фактов табл. Сотрудники

sotr(X,Y,Z,F),

writef("%3s %3d %3d, %-15s\n",X,Y,Z,F),

fail.

 viv_tabl.

goal

 retractall(_),            % Очищает оперативную память

 consult("prim_lb2.pro"),        % Загружает таблицы базы данных

 makewindow(1,126,1,"Сотрудники фирмы",2,2,20,60),

 viv_tabl,                   % Выводит табл. Сотрудники на экран

 write("\nВведите ид.номер записи для удаления: "),

 readln(ID),

 retract(sotr(ID,_,_,_)), % Удаляет запись о сотруднике из табл. Сотрудники

 viv_tabl,                   % Выводит табл. Сотрудники на экран

 readchar(_),            % Задержка до нажатия любой клавиши

 write("\nВведите ид.номер, ид.должности, №отдела, ФИО нового сотрудника\n"),

 readln(I),readint(D),readint(T),readln(F),

 assertz(sotr(I,D,T,F)), % Добавление новой записи в табл. Сотрудники

 viv_tabl,                   % Выводит табл. Сотрудники на экран

 readchar(_),

 zapros,write("\nКонец вывода").   

В файле prim_lb2.pro хранятся факты таблиц базы данных в следующем виде:

sotr("s1",1,1,"Петров")

sotr("s2",2,1,"Коломоец")

sotr("s3",5,1,"Панова")

sotr("s4",5,2,"Рузин")

sotr("s5",3,2,"Лещенко")

sotr("s6",3,2,"Лашина")

sotr("s7",1,2,"Крокодилов")

sotr("s8",1,3,"Харченко")

sotr("s9",1,3,"Абрамович")

sotr("s10",2,3,"Путинский")

sotr("s11",2,3,"Кочубеев")

sotr("s12",4,3,"Капустина")

sotr("s13",5,3,"Хаханов")

shtat(1,1,"инженер1",3,700)

shtat(1,2,"оператор1",3,450)

shtat(1,5,"нач_отдела",1,1250)

shtat(2,3,"механик",2,650)

shtat(2,6,"инженер2",2,750)

shtat(2,5,"нач_отдела",1,1100)

shtat(3,4,"экономист",1,800)

shtat(3,7,"оператор2",3,550)

shtat(3,5,"нач_отдела",1,1000)

proj(1,"s1",1,"01.03.06","03.06.06",1,1)

proj(1,"s2",2,"01.01.06","01.04.06",2,1)

proj(1,"s3",3,"01.03.06","01.04.06",1,2)

proj(2,"s1",1,"05.02.06","01.07.06",2,3)

proj(2,"s5",1,"06.15.06","08.10.06",3,2)

proj(2,"s6",3,"02.01.06","05.20.06",2,2)

proj(2,"s12",2,"04.15.06","08.30.06",1,3)

proj(3,"s11",1,"03.15.06","09.15.06",3,1)

proj(3,"s12",1,"07.01.06","09.30.06",2,1)

proj(3,"s10",2,"11.01.06","12.30.06",1,3)

proj(3,"s9",2,"09.01.06","12.30.06",3,1)

proj(3,"s8",3,"08.01.06","12.30.06",2,1)

proj(3,"s7",3,"03.01.06","19.30.06",1,3)

res(1,"станок_сверл",10)

res(2,"станок_деревообр",5)

res(3,"компьютер",20)

8.8. Результаты выполнения программы.

Приведем возможные результаты выполнения запроса.

Тест 1.

Введите название ресурса из списка:

["станок_сверл","станок_деревообр","компьютер"]

компьютер

Ресурс компьютер используют:

механик  Лещенко      в проекте 2

оператор1 Кочубеев    в проекте 3

инженер1 Абрамович в проекте 3

Конец вывода

Тест 2.

Введите название ресурса из списка:

["станок_сверл","станок_деревообр","компьютер"]

доильный аппарат

Такого ресурса нет!

Конец вывода

8.9. Выводы

В ходе выполнения лабораторной работы были изучены возможности создания базы данных во внешнем текстовом файле и предикаты для выполнения запросов к базе данных.

Контрольные вопросы

1. Что такое предикат, факт, правило?

2. Как создать базу данных во внешнем текстовом файле?

3. Как загрузить таблицы базы данных в оперативную память во время выполнения программы?

4. Назовите способы добавления новых фактов в оперативную память.

5. Как удалить факты из оперативной памяти?

6. Как очистить от фактов оперативную память?

7. Как сохранить во внешнем файле факты, находящиеся в оперативной памяти?

8. Как объявить в программе об использовании базы данных?

9. Как можно просмотреть все факты базы данных?

Приложение 2А

База данных Сотрудники фирмы

Таблица 2А.1 - Сотрудники

№сотрудника №должности №отдела Фамилия
s1 1 1 Петров
s2 2 1 Коломоец
s3 5 1 Панова
s4 5 2 Рузин
s5 3 2 Лещенко
s6 3 2 Лашина
s7 1 2 Крокодилов
s8 1 3 Харченко
s9 1 3 Абрамович
s10 2 3 Путинский
s11 2 3 Кочубеев
s12 4 3 Капустина
s13 5 3 Хаханов

Продолжение прил. 2А

Таблица 2А.2 – Штатное расписание

№ отдела № должности Название должности Количество штатных единиц Оклад
1 1 инженер1 3 700
1 2 оператор1 3 450
1 5 нач_отдела 1 1250
2 3 механик 2 650
2 6 инженер2 2 750
2 5 нач_отдела 1 1100
3 4 экономист 1 800
3 7 оператор2 3 550
3 5 нач_отдела 1 1000

Таблица 2А.3 – Проекты

№ про-екта № сотруд-ника № задания Начало выполнения задания Завершение выполнения задания № ресурса Коли-чество единиц ресурса
1 s1 1 01.03.06 03.06.06 1 1
1 s2 2 01.01.06 01.04.06 2 1
1 s3 3 01.03.06 01.04.06 1 2
2 s1 1 05.02.06 01.07.06 2 3
2 s5 1 06.15.06 08.10.06 3 2
2 s6 3 02.01.06 05.20.06 2 2
2 s12 2 04.15.06 08.30.06 1 3
3 s11 1 03.15.06 09.15.06 3 1
3 s12 1 07.01.06 09.30.06 2 1
3 s10 2 11.01.06 12.30.06 1 3

Продолжение табл. 2А.3

№ про-екта № сотруд-ника № задания Начало выполнения задания Завершение выполнения задания № ресурса Коли-чество единиц ресурса
3 s9 2 09.01.06 12.30.06 3 1
3 s8 3 08.01.06 12.30.06 2 1
3 s7 3 03.01.06 19.30.06 1 3

Таблица 2А.4 – Ресурсы

№ ресурса Название ресурса Наличие единиц ресурса
1 станок_сверл 10
2 станок_деревообр 5
3 компьютер 20

Приложение 2Б

Предикаты для работы с внутренней базой данных

Предикат Назначение
consult(Имя_Файла)    (string) - (i) Загрузка в оперативную память всех баз данных, хранящихся в файле
consult(Имя_Файла, Имя_БД)    (string, Имя_БД) - (i,i) Загрузка в оперативную память указанной базы данных, хранящейся в файле
save(Имя_Файла)    (string) - (i) Сохранение в файле всех баз данных, находящихся в оперативной памяти
save(Имя_Файла, Имя_БД) (string, Имя_БД) - (i,i) Сохранение в файле указанной базы данных, находящейся в оперативной памяти
assert( Факт )    (Факт_БД) - (i) Добавление в оперативную память нового факта указанной БД
asserta(Факт)    (Факт_БД) - (i) Добавление в оперативную память нового факта указанной БД. Факт помещается перед всеми фактами БД.
assertz(Факт)    (Факт_БД) - (i) Добавление в оперативную память нового факта указанной БД. Факт добавляется после всех фактов БД.

Продолжение прил. 2Б

Предикат Назначение
retract( Факт )    (Факт_БД) - (_) Удаление указанного факта БД. При задании факта можно использовать анонимные переменные в качестве параметров. В этом случае удаляются все факты по указанному шаблону комбинации аргументов.
retractall(_, Факт_БД )    (_,Имя_БД) - (_,i) Удаление из оперативной памяти всех фактов указанной базы данных.
retractall(_)    (Имя_БД) - (_) Удаление из оперативной памяти всех фактов всех баз данных.
findall(Переменная,Предикат, Имя_списка) Строится список из указанных аргументов предиката

 

Лабораторная работа 3

Тема работы: Выполнение сложных запросов к базе данных в среде Turbo Prolog

Цель работы: ознакомление с приемами выполнения запросов к базе данных в среде Turbo Prolog 2.0

Темы для предварительной проработки

§ Логика предикатов первого порядка.

§ Факты и правила Пролог-программ.

§ Операции возврата и отсечения.

§ Использование рекурсии.

 

Постановка задачи: написать на языке Prolog программу, содержащую базу данных, и правила, выполняющие запросы к базе данных; отладить и выполнить программу.

1.1. Порядок выполнения работы

1.Загрузить Turbo Prolog.

2.Подготовить файл, содержащий факты базы данных. В окне редактора создать программу, содержащую правила, выполняющие запросы к базе данных.

3.Определить, какие из используемых переменных являются входными, и какие – выходными.

4.Отладить и выполнить программу.

5.Показать преподавателю результаты работы программы.

1.2. Содержание отчета

1. Тема лабораторной работы.

2. Тема лабораторной работы.

3. Описание применяемых стандартных и разработанных предикатов.

4. Текст программы.

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

6. Выводы.

1.3. Индивидуальные задания

Выбрать предметную область согласно номеру фамилии в списке журнала группы.

Для выполнения заданий 1–7 использовать базу данных «Поставщики–Детали–Проекты» (Приложение 3А).

1. Подсчитать количество деталей красного цвета.

Вывести названия и количество всех проектов, в которых участвует поставщик Смит.

2. Подсчитать количество деталей, используемых в проекте Консоль.

Вывести имена поставщиков, живущих в том же городе, где изготавливаются поставляемые ими детали.

3. Подсчитать количество проектов в Лондоне.

Вывести сведения о проектах, для которых поставляются красные винты, и об общем количестве винтов.

4. Подсчитать количество всех деталей, которые поставляет поставщик Кларк.

Вывести имена поставщиков, живущих в тех же городах, где разрабатываются проекты, для которых они поставляют детали. Подсчитать количество таких поставщиков.

5. Подсчитать количество поставщиков, которые поставляют детали для проекта Перфоратор.

Вывести названия и суммарный вес всех деталей, используемых в проекте Терминал.

6. Определить суммы капиталов поставщиков, живущих в Париже.

Определить название детали голубого цвета, имеющей минимальный вес.

7. Определить цвет и название детали, которая используется в проекте J4 в максимальном количестве.

Вывести сведения о всех проектах, для которых поставляет детали поставщик S1.

Для выполнения заданий 8–14 использовать базу данных «Запасные части самолета» (Приложение 3Б)

8. По введенному названию детали посчитать, сколько таких деталей имеется в наличии.

Какая деталь используется в наибольшем количестве в самолете заданного типа?

9. Каких деталей имеется больше всего в наличии в Бостоне?

Сколько всего деталей имеется в наличии в Бостоне?

10. Посчитать суммарное количество деталей в узле заданного типа.

Какая деталь входит в узел заданного типа в наименьшем количестве?

11. В каком городе больше всего имеется в наличии заданных деталей?

Посчитать количество наименований деталей, входящих в заданный узел.

12. Сколько всего деталей заданного типа используется во всех самолетах?

Достаточно ли деталей 211 для Боинга 707 имеется в наличии?

13. Сколько всего кресел требуется для всех самолетов?

Сколько всего деталей имеется в наличии в Нью-Йорке?

14. В каком городе суммарное количество деталей больше – в Бостоне или Чикаго?

Сколько всего чехлов требуется для самолетов Боинг 707 и Боинг 727?

Для выполнения заданий 15–21 использовать базу данных "Продавцы–Заказчики–Покупки" (Приложение 3В)

15. Подсчитать сумму всех покупок, выполненных 3 октября.

Подсчитать число различных ненулевых значений поля city в таблице Заказчики.

16. Выбрать наименьшую сумму покупки для каждого заказчика.

Вывести имя заказчика с максимальным рейтингом в городе, название которого вводится с клавиатуры.

17. Вывести номер покупки, номер продавца и сумму комиссионных продавца для этой покупки.

Вывести имя заказчика с минимальным рейтингом в городе, название которого вводится с клавиатуры.

18. Вывести номера покупок и имена заказчиков, выполнивших покупки.

Подсчитать количество всех покупок, выполненных 3 октября.

19. Вывести имена всех заказчиков, обслуживаемых продавцом с комиссионными выше 12 % . Выведите имена заказчика и продавца и ставку комиссионных продавца.

Определить количество продавцов, живущих в Лондоне.

20. Вычислить сумму комиссионных продавцов для каждой покупки заказчиков с рейтингом выше 100.

Вывести все пары продавцов, живущих в одном и том же городе. Исключите комбинации продавцов друг с другом, а также дубликаты строк, выводимых в обратном порядке.

21. Вывести все покупки, выполненные заказчиком, имя которого вводится с клавиатуры.

Подсчитать общую сумму всех покупок, оформленніх продавцом, имя которого вводится с клавиатуры.

Для выполнения заданий 22–31 использовать базу данных "Самолеты–Пилоты–Рейсы" (Приложение 3Г)

22. Какие самолеты находятся в Париже и имеют более 300 мест? Подсчитать их количество.

Определить самолет, имеющий максимальное количество мест.

23. Какие самолеты находятся в Париже или имеют более 300 мест? Подсчитать их количество.

Определить самолет, имеющий минимальное количество мест.

24. Вывести имена и количество пилотов, пилотирующих самолет с номером 100.

Определить общее количество мест во всех самолетах AIRBUS.

25. Для каждого пилота получить его имя, адрес номера пилотируемых им самолетов и их количество.

Определить, какой рейс является наиболее продолжительным.

26. Получить имена пилотов, пилотирующих самолеты, вылетающие из Парижа. Определить количество таких пилотов.

Определить, сколько времени в общей сложности проводит в воздухе пилот SERGE.

27. Получить имена пилотов, пилотирующих самолеты типа "AIRBUS", и определить их количество.

Получить номера пилотов, пилотирующих все самолеты компании.

28. Получить имена пилотов, пилотирующих все самолетах типа "AIRBUS".

Подсчитать, сколько рейсов вылетает из города PARIS.

29. Получить имена пилотов, не осуществляющих рейсы из Парижа, и определить их количество.

Какие пункты назначения обслуживаются пилотами, чьи номера больше номеров пилотов JEAN и CLAUDE.

30. Получить имена пилотов, пилотирующих самолеты, которые пилотирует и пилот номер 2.

Для каждого самолета, вылетающего из Тулузы, вывести его номер и количество пилотов, которые его пилотируют.

31. Получить номера самолетов, которые пилотируют несколько пилотов.

Подсчитать, сколько самолетов пилотирует пилот, имя которого задается с клавиатуры.

1.4. Пример решения задачи

1. Тема работы: выполнение сложных запросов к базе данных в среде Turbo Prolog.

2. Цель работы: освоение приемов программирования для выполнения запросов к базе данных в Turbo Prolog 2.0.

3. Индивидуальное задание: используя табл. 3Г.1, табл. 3Г.2, табл. 3Г.3 Приложения 3Г, подсчитать, сколько самолетов пилотирует пилот, имя которого задается с клавиатуры.

4. Разработка метода решения задачи.

Для решения задачи следует использовать таблицы Пилоты и Рейсы Приложения 3Г. Таблицы Пилоты и Рейсы базы данных создадим в текстовом файле prim_lb3.pro в каталоге Prolog\BIN.

Предикат viv по введенному имени пилота в таблице Пилоты определяет его идентификационный номер и вызывает предикат kol. Если пилота с заданным именем нет, то обращение к таблице Пилоты завершается неуспехом и выводится соответствующее сообщение.

Для подсчета количества самолетов, которые пилотирует пилот, необходимо использовать переменную-счетчик С с начальным значением 0. Для подсчета количества самолетов разработаем предикат kol, который будет иметь две формулировки: рекурсивное правило kol и факт kol (условие завершения рекурсии). Приращение счетчика С будет выполняться при определенных условиях на прямом ходу рекурсии. Обработанный факт таблицы Рейсы будем удалять из оперативной памяти. Рекурсия завершится, когда будут обработаны и удалены все факты о рейсах, пилотируемых пилотом. При завершении рекурсии текущее значение счетчика будет переписано в переменную С1. Выполняется возврат в предикат viv и вывод результата.

5. Описание предикатов, разработанных для реализации метода решения задачи на языке Turbo Prolog.

Таблица 3.1 – Разработанные предикаты

Предикат Назначение
pilot(integer, string, string) Факты таблицы Пилоты
race(string, integer, integer, string,            string, integer, integer) Факты таблицы Рейсы
viv(s) Нахождение и вывод номера пилота. Вызов предиката kol

Продолжение табл. 3.1.

Предикат Назначение
kol(integer, integer, integer)            (i,i,o) Подсчет количества самолетов, на которых летает пилот Первый параметр – номер пилота, входная переменная Второй параметр – текущее значение счетчика, входная переменная Третий параметр – результирующее значение счетчика, выходная переменная

6. Стандартные предикаты, используемые для решения задачи:

Предикат Цель использования
makewindow Создание окна для вывода значений
write Вывод констант и значений переменных на экран
readln Ввод строковой переменной
retractall Удаление фактов из оперативной памяти
consult Загрузка фактов базы данных из файла в оперативную память

7. Текст программы.

domains s=string i=integer

database 

pilot(i,s,s)      % Объявление таблицы Пилоты как части базы данных

race(s,i,i,s,s,i,i) % Объявление таблицы Рейсы как части базы данных

predicates

kol(i,i,i)

viv(s)

clauses

 kol(N,C,C1):-             % Рекурсивное правило

race(_,N,_,_,_,_,_),   % Обращение к таблице Рейсы

C2=C+1,                    % Приращение счетчика

retract(race(_,N,_,_,_,_,_)),      % Удаление факта из таблицы Рейсы

kol(N,C2,C1).                            % Рекурсивный вызов с новым значением счетчика

 kol(_,C,C).                 % Условие завершения рекурсии

 viv(Name):-

pilot(N,Name,_),       % Если пилот существует, то определяется его номер

kol(N,0,C),                % и вызывается предикат kol с начальным

% значением счетчика, равным 0

write("Пилот ",Name," пилотирует ",C," самолетов          ").       %Вывод результата

 viv(Name):-                %Это правило работает, когда пилота нет в таблице

% Пилоты

write("Пилота ",Name," нет в списке!"). %Вывод результата

goal

 makewindow(1,120,2,"Сведения о пилоте",2,2,15,75),       % Создание окна

 retractall(_),consult("prim_lb3.pro"),       % Удаление всех фактов

 write("Введите имя пилота: \n"), 

 readln(Name),                           % Ввод имени пилота

 viv(Name).                 % Вызов предиката viv

 

Файл prim_lb3.pro:

pilot(1,"SERGE","NICE")

pilot(2,"JEAN","PARIS")

pilot(3,"CLAUDE","GRENOBLE")

pilot(4,"ROBERT","TOULOUSE")

pilot(5,"MICHEL","PARIS")

pilot(6,"PAUL","PARIS")

pilot(7,"PIERRE","TOULOUSE")

race("IT100",1,100,"NICE","PARIS",7,8)

race("IT101",2,100,"PARIS","NICE",11,12)

race("IT102",1,101,"PARIS","TOULOUSE",12,13)

race("IT103",1,102,"TOULOUSE","GRENOBLE",15,16)

race("IT104",3,103,"TOULOUSE","PARIS",9,10)

race("IT105",2,104,"TOULOUSE","NICE",6,7)

race("IT106",4,104,"PARIS","TOULOUSE",14,15)

race("IT107",6,105,"PARIS","NICE",8,9)

race("IT108",2,105,"NICE","TOULOUSE",12,13)

race("IT109",1,105,"TOULOUSE","PARIS",20,21)

race("IT110",1,102,"GRENOBLE","TOULOUSE",17,18)

race("IT111",1,104,"NICE","PARIS",10,11)

race("IT112",1,103,"PARIS","TOULOUSE",12,14)

race("IT113",1,106,"PARIS","NICE",23,24)

race("IT114",3,106,"NICE","PARIS",10,11)

8. Результаты выполнения программы.

Тест 1

Введите имя пилота:

SERGE

Пилот SERGE пилотирует 8 самолетов

Тест 2

Введите имя пилота:

JEAN

Пилот JEAN пилотирует 3 самолетов

Тест 3

Введите имя пилота:

FEDYA

Пилота FEDYA нет в списке!

9. Выводы

В ходе выполнения работы были изучены приемы использования операций возврата и отсечения. В программе разработаны и использованы рекурсивные правила. Была создана база данных во внешнем файле и использованы предикаты для работы с ней.

Контрольные вопросы

1. Что такое рекурсия?

2. Назовите известные виды рекурсии.

3. Какое правило считается рекурсивным?

4. Что называют условием завершения рекурсии?

5. Может ли рекурсия быть бесконечной?

6. В каком разделе программы объявляется база данных?

7. Как вывести факты таблицы базы данных на экран?

8. Что такое унификация и бэктрекинг?

Приложение 3А

Реляционная база данных «Поставщики–Детали–Проекты»

Таблица 3А.1 – Поставщики

№ поставщика Фамилия поставщика Состояние поставщика Место проживания поставщика
S1 Смит 20 Лондон
S2 Джонс 10 Париж
S3 Блейк 30 Париж
S4 Кларк 20 Лондон
S5 Адамс 30 Афины

Таблица 3А.2 – Детали

№ детали Название детали Цвет детали Вес детали Город, где производится деталь
P1 гайка красный 12 Лондон
P2 болт зеленый 17 Париж
P3 винт голубой 17 Рим
P4 винт красный 14 Лондон
P5 кулачок голубой 12 Париж
P6 штифт красный 19 Лондон

Таблица 3А.3 – Проекты

№ проекта Название проекта Место разработки проекта
J1 Сортировщик Париж
J2 Перфоратор Рим
J3 Считыватель Афины
J4 Консоль Афины
J5 Сортировщик Лондон

Продолжение табл. 3А.3

№ проекта Название проекта Место разработки проекта
J6 Терминал Осло
J7 Лента Лондон

Таблица А.4 – Сводная

№ поставщика № детали № проекта Количество
S1 P1 J1 200
S1 P1 J4 700
S2 P3 J1 400
S2 P3 J2 200
S2 P3 J3 200
S2 P3 J4 500
S2 P3 J5 600
S2 P3 J6 400
S2 P3 J7 800
S2 P5 J2 100
S3 P3 J1 200
S3 P4 J2 500
S4 P6 J3 300
S4 P6 J7 300
S5 P2 J2 200
S5 P2 J4 100
S5 P5 J5 500
S5 P5 J7 100
S5 P6 J2 200
S5 P1 J4 100
S5 P3 J4 200
S5 P4 J4 800
S5 P5 J4 400
S5 P6 J4 500

 


Приложение 3Б

База данных «Запасные части самолета»

Таблица 3Б.1 – Детали узла

№ Детали № Узла Название детали
211 0 Кресло
2114 211 Чехол
2116 211 Привязной ремень
21163 2116 Пряжка ремня
21164 2116 Крепление ремня
318 21164 Болт
206 0 Верхняя панель
2061 206 Кнопка вызова
2066 206 Выключатель освещения
2088 206 Вентилятор

Деталь №2114 (чехол) входит в узел №211. В свою очередь, узел №211 (кресло) является деталью узла 0. Значение 0 в столбце № узла означает, что данная деталь не входит ни в какой другой узел.

Таблица 3Б.2 – Использование

№ узла Тип самолета Количество
211 707 86
211 727 134
2114 707 86
2114 727 134
2116 707 244
2116 727 296
21164 707 488
21164 727 592

Таблица Использование определяет количество узлов каждого типа в самолете.

Таблица 3Б.3 – Наличие

№ узла Адрес Количество
211 Нью-Йорк 106
211 Бостон 28
211 Чикаго 77
2114 Нью-Йорк 8
2114 Чикаго 28
2116 Бостон 341
2116 Чикаго 29
21164 Атланта 31391

Таблица Наличие определяет количество деталей каждого типа в ремонтных мастерских, расположенных в различных городах.

ПРИЛОЖЕНИЕ 3В

База данных "Продавцы–Заказчики–Покупки"

Таблица 3В.1 – Продавцы

SNUM SNAME CITY COMM
1001 Peel London 0.12
1002 Serres San Jose 0.13
1004 Motika London 0.11
1007 Rifkin Barcelona 0.15
1003 Axelrod New York 0.10

 

snum – идентификационный номер продавца;

sname – имя продавца;

city                    – место проживания продавца;

comm – комиссионные продавцов от суммы сделки (в десятичной форме).

Таблица 3В.2 – Заказчики

CNUM CNAME CITY RATING SNUM
2001 Hoffman London 100 1001
2002 Giovanni Rome 200 1003
2003 Liu SanJose 200 1002
2004 Grass Berlin 300 1002
2006 Clemens London 100 1001
2008 Cisneros SanJose 300 1007
2007 Pereira Rome 100 1004

 

cnum – уникальный номер, назначенный каждому заказчику;

cname – имя заказчика;

сity    – расположение заказчика (город);

rating – код, указывающий уровень предпочтения данного заказчика перед другими;

snum – номер продавца, обслуживающего данного заказчика.

Таблица 3В.3 – Покупки

ONUM AMT DATE CNUM SNUM
3001 18.69 10/03/1990 2008 1007
3003 767.19 10/03/1990 2001 1001
3002 1900.10 10/03/1990 2007 1004
3005 5160.45 10/03/1990 2003 1002
3006 1098.16 10/03/1990 2008 1007
3009 1713.23 10/04/1990 2002 1003
3007 75.75 10/04/1990 2004 1002
3008 4723.00 10/05/1990 2006 1001
3010 1309.95 10/06/1990 2004 1002
3011 9891.88 10/06/1990 2006 1001

 

onum – уникальный номер покупки;

amt   – сумма покупки;

оdate – дата покупки;

cnum – номер заказчика, сделавшего покупку;

snum – номер продавца, оформившего покупку.

Приложение 3Г

База данных "Самолеты–Пилоты–Рейсы"

Таблица 3Г.1 – Самолеты

AV# AVNAME CAP LOC
100 AIRBUS 700 NICE
101 B707 250 PARIS
102 AIRBUS 300 TOULOUSE
103 CARAV 200 TOULOUSE
104 AIRBUS 350 TOULOUSE
105 AIRBUS 150 PARIS
106 CARAV 250 PARIS

Таблица Самолеты описывает номер (AV#), тип (AVNAME), вместимость (CAP) и место приписки (LOC) самолета.

Таблица 3Г.2 - Пилоты

PL# PLNAME ADDR
1 SERGE NICE
2 JEAN PARIS
3 CLAUDE GRENOBLE
4 ROBERT TOULOUSE
5 MICHEL PARIS
6 PAUL PARIS
7 PIERRE TOULOUSE

Таблица Пилоты описывает номер (PL#), имя (PLNAME) и адрес (ADDR) пилота.

Таблица Г.3 – Рейсы

VOL# PL# AV# VD VA HD HA
IT100 1 100 NICE PARIS 7 8
IT101 2 100 PARIS NICE 11 12
IT102 1 101 PARIS TOULOUSE 12 13
IT103 1 102 TOULOUSE GRENOBLE 15 16
IT104 3 103 TOULOUSE PARIS 9 10
IT105 2 104 TOULOUSE NICE 6 7
IT106 4 104 PARIS TOULOUSE 14 15
IT107 6 105 PARIS NICE 8 9
IT108 2 105 NICE TOULOUSE 12 13
IT109 1 105 TOULOUSE PARIS 20 21
IT110 1 102 GRENOBLE TOULOUSE 17 18
IT111 1 104 NICE PARIS 10 11
IT112 1 103 PARIS TOULOUSE 12 14
IT113 1 106 PARIS NICE 23 24
IT114 3 106 NICE PARIS 10 11

Таблица Рейсы описывает номер рейса (VOL#), номера пилота и самолета (PL# и AV#), пункт отправления и назначения (VD и VA), время отправления и прибытия (HD и HA) рейса.

 

 

Лабораторная работа 4

Тема работы: работа со списками в среде Turbo Prolog

Цель работы: ознакомление с основными операциями над списками в среде Turbo Prolog 2.0 и освоение основных приемов обработки списков.

Темы для предварительной проработки

§ Понятие списков в Прологе.

§ Выполнение рекурсии в Прологе.

 

Постановка задачи: написать программу на языке Prolog, содержащую правила для выполнения задания по обработке списков, отладить и выполнить программу.

 

4.1. Порядок выполнения работы

1. Загрузить Turbo Prolog.

2. В окне редактора создать программу, определяющую правила для выполнения определенных в задании операций над списками.

3. Определить, какие из используемых переменных являются входными и выходными.

4. С помощью трассировки отладить и выполнить программу.

5. Показать преподавателю результаты работы программы.

4.2. Содержание отчета

1. Тема лабораторной работы.

2. Цель работы.

3. Описание применяемых стандартных и разработанных предикатов.

4. Текст программы.

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

4.3. Индивидуальные задания

1. Для заданного списка целых чисел определить произведение индексов двух самых больших элементов.

2. Определить сумму индексов максимального и минимального элементов списка целых чисел.

3. Поменять местами максимальный и минимальный элементы списка целых чисел.

4. Переписать исходный список L1 в два списка – L2 и L3, в список L2 записать первые n элементов списка L1 (число n ввести с клавиатуры), в список L3 – остаток исходного списка. Объединить полученные списки в списке L4:

n n+1

 

5. Определить, является ли список симметричным относительно краев.

6. Произвести циклический сдвиг списка k раз.

7. Преобразовать исходный список по правилу: в левой части сгруппировать отрицательные элементы, в правой – положительные.

8. Из исходного списка L сформировать список L1, куда поместить все элементы списка L, больше суммы первых k элементов списка L (число k ввести с клавиатуры).

9. Вычислить среднее арифметическое элементов списка, которые меньше 0, начиная с k-го элемента (число k ввести с клавиатуры).

10. Вывести сумму элементов списка с номерами от k до n (числа k и n ввести с клавиатуры).

11. В списке целых чисел вычислить сумму элементов, находящихся между максимальным и минимальным элементами.

12. Определить произведение двух максимальных и сумму двух минимальных элементов списка целых чисел.

13. Если максимальный элемент списка имеет четный номер, дописать его после n-го элемента списка (число n ввести с клавиатуры), иначе – исключить из списка.

14. Вычислить сумму максимального и минимального элементов списка целых чисел. Сформировать новый список из элементов, больших, чем эта сумма.

15. Из 2 списков L1 и L2 удалить одинаковые элементы, поместив их в список L3.

16. Из исходного списка целых чисел L сформировать список L1, поместив в него положительные элементы, имеющие четные номера.

17. Из исходных списков целых чисел L1 и L2 сформировать список L3, в котором элементы должны быть выстроены в порядке возрастания.

18. Из исходных списков целых чисел L1 и L2 сформировать список L3, куда поместить несовпадающие элементы списков L1 и L2.

19. Определить, имеются ли в исходном списке два подряд идущие элемента с одинаковыми значениями. Если такие элементы есть, удалить их из списка.

20. Найти сумму элементов списка, кратных числу Х (это число ввести с клавиатуры). Сравнить полученную сумму с максимальным элементом списка.

21. Заменить отрицательные элементы списка их порядковыми номерами.

22. Ввести номер элемента списка с клавиатуры, удалить элементы, стоящие справа от него.

23. Удалить из списка элементы с заданными номерами.

24. Из исходного списка сформировать два: в первый поместить четные элементы, во второй – нечетные.

25. Из исходного списка удалить все отрицательные элементы.

26. Все отрицательные элементы списка заменить положитель-ными, равными отрицательным по модулю.

27. Все положительные элементы списка поместить в его конец.

28. Все элементы списка, равные заданному числу N, поместить в начало списка.

29. Выполнить циклический сдвиг элементов списка целых чисел n раз (число n ввести с клавиатуры).

30. В списке поменять местами элементы, имеющие четные и нечетные номера.

4.4. Пример решения задачи

1. Тема работы: работа со списками в среде Turbo Prolog.

2. Цель работы: знакомство с основными операциями над списками в среде Turbo Prolog 2.0 и получение практических навыков выполнения обработки списков.

3. Индивидуальное задание: заменить в списке два подряд идущие одинаковые значения их порядковыми номерами.

4. Разработка метода решения задачи.

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

· Если второй параметр является пустым списком, то третий параметр также является пустым списком.

· Если первые два элемента списка равны, то на обратном ходу рекурсии в голову результирующего списка нужно дописать текущее значение счетчика элементов и значение на единицу больше. В рекурсивном вызове в качестве хвоста списка передать полученный список (второй аргумент), но без первых двух элементов.

· Во всех остальных случаях разделить второй параметр-список на голову и хвост, увеличить значение счетчика на единицу, на обратном ходу рекурсии добавить голову к результирующему списку. В рекурсивном вызове в качестве второго параметра передать хвост списка (второго аргумента).

5. Описание предикатов, разработанных для реализации метода решения задачи на языке Turbo Prolog.

Предикат Цель использования
search(integer,ii,ii) (i,i,o) – (счетчик,исх_список,рез_список) Замена парных элементов списка их порядковыми номерами

6. Стандартные предикаты, используемые для решения задачи:

Предикат Цель использования
clearwindow Очистка экрана
write Вывод значения на экран

 

7. Текст программы.

domains i=integer ii=i*

predicates

 search(i,ii,ii)

clauses

 search(C,[X,X|Y],[C,C1|L]):-

C1=C+1,C2=C+2,

search(C2,Y,L).

 search(C,[X|Y],[X|L]):-

C1=C+1,

search(C1,Y,L).

 search(_,[],[]).

goal

 clearwindow,

 S=[6,6,6,5,5,2,1,1],

 search(1,S,L),

 write(”Исходный список: ”,S,”\n”),

.write(”Результирующий список: ”,L).

8. Результаты выполнения программы.

Исходный список: [6,6,6,5,5,2,1,1]

Результирующий список: [1,2,6,4,5,2,7,8]

9. Выводы

В ходе выполнения лабораторной работы были усвоены понятия списка в Прологе и основные операции над списками.

Контрольные вопросы

1. Что такое список?

2. Что такое домен? Назовите стандартные домены.

3. Объясните понятия головы и хвоста списка.

4. Какими типами данных могут быть элементы списка?

5. Можно ли работать со списком, элементами которого являются списки?

6. Как объявить домен типа «список»?

7. Что такое «конкатенация» списков? Как выполняется конкатенация списков?

8. Как вывести на экран все элементы списка?

9. Как ввести данные в список?

10. Как подсчитать количество элементов списка?

11. Что такое «прямой» и «обратный» ход рекурсии?

Лабораторная работа 5

Тема работы: работа со строками в среде Turbo Prolog

Цель работы: изучение основных предикатов обработки строк в среде Turbo Prolog 2.0 и получение навыков работы со строками

Темы для предварительной проработки

§ Встроенные предикаты для работы со строками в языке Prolog.

§ Выполнение рекурсии и отсечения в языке Prolog.

 

Постановка задачи: написать программу на языке Prolog, содержащую правила для выполнения поставленного задания для обработки строк, отладить и протестировать программу.

5.1. Порядок выполнения работы

1. Выбрать индивидуальное задание согласно номеру фамилии в журнале группы.

2. Разработать метод решения задачи и предикаты для его реализации на языке Turbo Prolog.

3. Используя приложение 5А, выбрать стандартные предикаты, требуемые для решения задачи.

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

5. Загрузить Turbo Prolog.

6. В окне редактора написать текст программы, отладить и выполнить ее.

7. С помощью средств трассирования просмотреть в окне трассировки результаты пошагового выполнения программы.

8. Определить, какие из используемых переменных являются входными и выходными.

9. Показать преподавателю результаты работы программы.

5.2. Содержание отчета

1. Тема лабораторной работы.

2. Цель работы.

3. Описание применяемых стандартных и разработанных предикатов.

4. Текст программы.

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

6. Выводы.

5.3. Индивидуальные задания

1. Во введенном предложении определить прилагательные.

2. Ввести число (целое), написать это число прописью.

3. По написанному прописью числу написать цифровое его представление.

4. Построить гистограмму длин слов введенного предложения.

5. В предложении выделить группу самых коротких слов. Вывести на экран слова, начинающиеся и заканчивающиеся на одну и ту же букву.

6. Определить, являются ли самые длинные слова предложения словами-перевертышами (например: "комок").

7. Определить, является ли введенное предложение предложением-перевертышем (например: "А роза упала на лапу Азора").

8. Выбрать из предложения самое длинное слово. Построить из букв этого слова другие возможные слова. Предусмотреть в программе возможность запоминания сформированных слов.

9. Упорядочить слова введенного предложения по алфавиту. Вывести полученное предложение на экран.

10. Упорядочить слова введенного предложения по длинам. Вывести полученное предложение на экран.

11. Дату, введенную в виде 01.10.99, записать словами: первое октября 1999 года.

12. Ввести в произвольном порядке слова, например: "Идет Федя быстрый". Расставить слова в следующем порядке: прилагательное, существительное, глагол.

13. Исключить из введенного предложения все прилагательные.

14. Исключить из введенного предложения все глаголы.

15. Ввести повествовательное предложение. Задать вопросы пользователю по введенному предложению.

16. Ввести текст, состоящий из нескольких предложений. Заменить в тексте заданное слово на другое заданное слово.

17. Вставить во введенное предложение перед каждым именем собственным слово "хороший".

18. Перед каждым прилагательным во введенном предложении вставить слово "очень".

19. Перед каждым глаголом, входящим в предложение, вставить слово "смело".

20. Ввести текст, состоящий из нескольких предложений. Поменять местами предложение 1 и предложение с заданным номером.

21. Подсчитать количество букв в n-ом слове предложения (число n ввести с клавиатуры). Вывести это слово «наоборот».

22. Ввести предложение. Поменять в нем местами слова с заданными номерами.

23. Посчитать, сколько слов предложения имеют заданную длину. Вывести эти слова на экран.

24. Ввести текст, состоящий из нескольких предложений. Посчитать количество предложений.

25. Ввести текст, состоящий из нескольких предложений. Посчитать количество вопросительных предложений.

26. Во введенном предложении определить самое длинное слово, оканчивающееся на гласную букву.

27. Ввести текст, состоящий из нескольких предложений. Посчитать, в каком предложении больше всего слов заданной длины.

28. SQL - запрос преобразовать в текст Пролог-программы.

29. Ввести SQL-запрос. Преобразовать его в предложение на естественном языке.

30. Ввести предложение. Удалить из слов предложения все приставки «не», если такие есть. Если таких приставок нет, вывести сообщение об этом

5.4. Пример решения задачи

1. Тема работы: работа со строками в среде Turbo Prolog.

2. Цель работы: получение практических навыков в использовании основных предикатов обработки строк в среде Turbo Prolog 2.0.

3. Индивидуальное задание: Ввести предложение. Удалить из слов предложения все приставки «не», если такие есть. Если таких приставок нет, вывести сообщение об этом.

4. Разработка метода решения задачи.

Для решения задачи следует циклически выполнять следующие действия: выделить первое слово предложения, проверить, имеет ли оно приставку «не», если не имеет, то присоединить это слово к результирующему предложению, если имеет, – удалить приставку и присоединить его к результирующему предложению.

5. Описание предикатов, разработанных для реализации метода решения задачи на языке Turbo Prolog.

Для решения задачи целесообразно разработать рекурсивный предикат zam(integer,string,string).

Параметры предиката zam имеют следующий смысл:

первый параметр – флаг, сигнализирующий об удалении приставки «не»; принимает значение 0, приставка не была встречена ни разу, 1 – если была встречена хотя бы одна приставка «не» и была выполнена замена слова;

второй параметр – исходная строка;

третий параметр – строка-результат.

Предикат zam имеет четыре формулировки:

· Флаг остался равным нулю и достигнут конец строки – это означает, что приставка «не» не встретилась в предложении ни разу.

· Флаг стал равен единице и достигнут конец строки – это означает, что приставка «не» встретилась в предложении хотя бы один раз.

Первая и вторая формулировки предиката zam являются условиями завершения рекурсии. На дне рекурсии, т.е. когда исходная строка пуста, строка-результат получает свое начальное значение – пустую строку.

· В третьей формулировке предиката zam выделяется первое слово строки и в нем – первые два символа; выполняется проверка того, являются ли эти два символа символами «не»; выполняется рекурсивный вызов с остатком строки. На обратном ходу рекурсии к строке-результату присоединяется текущее слово без приставки «не».

· Четвертая формулировка предиката zam выполняется тогда, когда не выполняются первые три формулировки. В четвертой формулировке предиката zam выделяется первое слово строки и выполняется рекурсивный вызов с остатком строки. На обратном ходу рекурсии к строке-результату присоединяется текущее слово.

6. Стандартные предикаты, используемые для решения задачи:

Предикат Цель использования
fronttoken(Строка,Перв_слово,Ост_строки) (i,o,o) Выделяет первое слово строки
frontstr(Длина,Вх_строка,            Нач_строки,Ост_строки) (i,i,o,o) Выделяет из исходной строки переднюю строку длиной n и остаток строки
concat(Стр1,Стр2,Стр3) (o,i,i) В строку Стр3 помещает соединение строк Стр1 и Стр2

 

7. Текст программы.

domains s=string i=integer

predicates

zam(i,s,s)

clauses

zam(0,"",""): –           % Условие завершения рекурсии

 write("Замен не было!").

zam(1,"",""). % Условие завершения рекурсии

zam(_,S,R): –

                                    fronttoken(S,T,S1),  % Выделение первого слова предложения

frontstr(2,T,K1,K),      % Выделение первых двух символов слова

K1="не",                      % Если первые два символа слова – «не»,

                                           % то выполняется остальная часть предиката

zam(1,S1,R1),             % Рекурсивный вызов

concat(K,R1,RR),      % На обратном ходу рекурсии к строке

                                           % присоединяется текущее слово без приставки

                                           % «не»

concat(" ",RR,R).       % На обратном ходу рекурсии к строке

                                           % присоединяется пробел

zam(F,S,R): –

fronttoken(S,T,S1),    % Выделение первого слова предложения

zam(F,S1,R1),            % Рекурсивный вызов

concat(T,R1,RR),

concat(" ",RR,R). 

goal

 clearwindow,

 S="нелепо, смешно, неуклюже шли пингвины неспешным шагом",

% S="мама мыла раму",

 zam(0,S,N), % Первый и второй параметры являются входными,                            % третий – выходным.

 write("\nИсходная строка: \n",S),

 write("\nПолучена строка: \n",N).

8. Результаты выполнения программы.

Тест 1

Исходная строка:

нелепо, смешно, неуклюже шли пингвины неспешным шагом

Получена строка:

лепо, смешно, уклюже шли пингвины спешным шагом

 

Тест 2

Замен не было!

Исходная строка:

мама мыла раму

Получена строка:

мама мыла раму

9. Выводы

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

Контрольные вопросы

1. Что такое строковый тип данных?

2. Чем отличается строковый тип данных в Прологе от строкового типа данных в процедурных языках программирования?

3. Назовите характеристики машины логического вывода Пролога.

4. Как выделить первый символ текста?

5. Как выделить первое слово текста?

6. Как выполнить конкатенацию строк текста?

7. Какую роль играет унификация переменных при выполнении операций над строками?

8. Как разделить текст на несколько подстрок?

9. Какова роль рекурсии при обработке строк?

10. Какие стандартные типы данных используют в Прологе?

11. Как выполнить преобразование типов данных?


Приложение 5А

Предикаты для работы со строками и преобразование типов

Таблица 5А.1 – Предикаты для работы со строками

Предикат Назначение
frontchar(Строка,                  Перв_символ,                  Ост_строки) (string,char,string) – (i,o,o) (i,i,o) (i,o,i) (i,i,i) (o,i,i) В зависимости от конкретизации переменных выполняет действия: (i,o,o) – строку разделяет на первый символ и отстаток строки; (i,i,o) – если Перв_символ является первым символом строки Строка, то выделяется остаток строки; (i,o,i) – если Ост_строки является остатком строки Строка, то выделяется первый символ Перв_символ; (i,i,i) – проверяет, является ли соединение символа Перв_символ и остаток строки Ост_строки строкой Строка; (o,i,i) – соединяет Перв_символ и Ост_строки и возвращает строку Строка
fronttoken(Строка,Токен,                            Ост_строки)            (string,string,string) –            (i,o,o) (i,i,o) (i,o,i) (i,i,i) (o,i,i) В зависимости от конкретизации переменных выполняет действия: (i,o,o) – Строка разделяется на Токен (слово) и остаток строки Ост_строки; (i,i,o) – если первое слово строки равно Токену, то выделяется остаток строки Ост_строки; (i,o,i) – если остаток строки Ост_строки равен остатку строки Строка, то выделяется первое слово Токен; (i,i,i) – проверяет, равно ли соединение Токена и Ост_строки Строке; (o,i,i) – соединяет Токен и Ост_строки и возвращает Строку

Продолжение табл. 5А.1

Предикат Назначение
frontstr(Длина,Вх_строка,      Нач_строки,Ост_строки)            (integer,string,string,string) –            (i,i,o,o) Из входной строки Вх_строка выделяет начальную часть Нач_строка длиной Длина и остаток строки Ост_строки
concat(Стр1,Стр2,Стр3)             (string,string,string) –            (i,i,o) (i,o,i) (o,i,i) (i,i,i) В зависимости от конкретизации переменных выполняет действия: (i,i,o) – Стр3 = Стр1 + Стр2; (i,o,i) – если Стр3 имеет начало, равное Стр1, то выделяется остаток строки, равный Стр2; (o,i,i) - если Стр3 имеет остаток Стр2, то выделяется начало строки, равное Стр1; (i,i,i) – выполняется проверка, может ли Стр3 состоять из Стр1 и Стр2
str_len(Строка,Длина)            (string,integer) – (i,i) (i,o) В зависимости от конкретизации переменных выполняет действия: (i,i) – определяет, имеет ли Строка заданную Длину; (i,o) – определяет Длину Строки

 

Таблица 5А.2 - Преобразование типов

Предикат Назначение
char_int(Символ,Код)            (char,integer) - (i,o) (o,i) (i,i) В зависимости от конкретизации переменных выполняет действия: (i,o) – определяет Символ по Коду; (o,i) – определяет Код по Символу; (i,i) – определяет, соответствует ли Код Символу
str_int(Строка,Ц_Число)            (string,integer) - (i,o) (o,i) (i,i) В зависимости от конкретизации переменных выполняет действия: (i,o) – преобразует строку из цифр в целое число; (o,i) – преобразует целое число в строку из цифр; (i,i) – определяет, соответствует ли целое число строке из цифр

Продолжение табл. 5А.2

Предикат Назначение
str_char(Строка,Символ)            (string,char) - (i,o) (o,i) (i,i) В зависимости от конкретизации переменных выполняет действия: (i,o) – преобразует строку в символ; (o,i) – преобразует символ в строку; (i,i) – определяет, соответствует символ строке
str_real(Строка,В_Число)            (string,real) - (i,o) (o,i) (i,i) В зависимости от конкретизации переменных выполняет действия: (i,o) – преобразует строку из цифр в вещественное число; (o,i) – преобразует вещественное число в строку из цифр; (i,i) – определяет, соответствует ли вещественное число строке из цифр
upper_lower(Строка_прописные , Строка_строчные)            (string,string) - (i,i) (i,o) (o,i) В зависимости от конкретизации переменных выполняет действия: (i,o) – преобразует прописные буквы в строке Строка_прописные в строчные в строке Строка_строчные; (o,i) – преобразует строчные буквы в строке Строка_строчные в прописные в строке Строка_прописные; (i,i) – проверяет, совпадают ли прописные и соответствующие строчные буквы в строках

 

Лабораторная работа 6

Тема работы: работа с графикой в среде Turbo Prolog

Цель работы: ознакомление с использованием основных предикатов BGI-графики в среде Turbo Prolog 2.0, приобретение практических навыков создания графических объектов с использованием BGI-графики.

Темы для предварительной проработки

§ Встроенные предикаты для работы с BGI-графикой в Turbo Prolog.

§ Рекурсия.

 

Постановка задачи: написать программу на языке Turbo Prolog, содержащую встроенные предикаты для работы с графикой и правила, реализующие поставленное индивидуальное задание.

6.1. Порядок выполнения работы

1. Разработать метод решения индивидуального задания и предикаты для его реализации на языке Turbo Prolog.

2. Используя Приложение 6А, выбрать стандартные предикаты, требуемые для решения задачи.

3. Загрузить Turbo Prolog.

4. В окне редактора написать текст программы.

5. Отладить программу и выполнить ее.

6. Определить, какие из используемых переменных являются входными и какие – выходными.

7. Показать преподавателю результаты работы программы.

6.2. Содержание отчета

1. Тема лабораторной работы.

2. Цель работы.

3. Описание метода решения задачи.

4. Описание применяемых стандартных и разработанных предикатов.

5. Текст программы.

6. Выводы.

6.3. Индивидуальные задания

1. Ввести с клавиатуры предложение. Посчитать количество слов одинаковой длины. Построить круговую диаграмму слов одинаковой длины, закрасив секторы стандартными и собственными шаблонами заполнения. Рядом с каждым сектором вывести соответствующие слова.

2. Ввести с клавиатуры предложение. Посчитать количество слов одинаковой длины. Построить гистограмму слов одинаковой длины, закрасив прямоугольники стандартными и собственными шаблонами заполнения. Под каждым прямоугольником вывести соответствующие слова.

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

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

5. По экзаменационным ведомостям группы по математике за пять семестров подсчитать средний балл группы в каждом семестре. Построить линейный график изменения среднего балла по семестрам.

6. Изобразить раскачивающийся маятник.

7. Изобразить раскачивающуюся игрушку-неваляшку.

8. Нарисовать квадрат с диагоналями. Вписать в квадрат окружность. Закрасить все фрагменты рисунка разными цветами, используя стандартные и собственные шаблоны заполнения.

9. Нарисовать окружность и вписать в нее квадрат с диагоналями. Закрасить все фрагменты рисунка разными цветами, используя стандартные и собственные шаблоны заполнения.

10. Выполнить циклическое отображение появляющихся окружностей, имеющих произвольные координаты центров, радиусы, цвета контуров, цвета и стили заполнения.

11. Выполнить циклическое отображение появляющихся овалов, имеющих произвольные координаты центров, радиусы, цвета контуров, цвета и стили заполнения.

12. Выполнить циклическое отображение появляющихся треугольников, имеющих произвольные координаты центров, радиусы, цвета контуров, цвета и стили заполнения.

13. Выполнить циклическое отображение появляющихся концентрических разноцветных окружностей. При появлении новой окружности площадь предыдущих должна увеличиваться.

14. Нарисовать оси координат и выполнить циклический вывод графиков функций у1=sin(x) и у2=2sin(x+30). Получающиеся при пересечении графиков замкнутые контуры закрасить.

15. Изобразить подпрыгивающего человечка.

16. Изобразить вращающийся закрашенный квадрат.

17. Изобразить движущийся теннисный шарик, отскакивающий от стенок экрана.

18. Изобразить автомобиль, движущийся на фоне деревьев.

19. Изобразить циклически вспышки салюта, возникающие в произвольных местах экрана. Вспышку салюта изобразить как разноцветные линии разной длины, исходящие по окружности из одной точки.

20. Выполнить циклическое отображение появляющихся разноцветных прямоугольников с центрами в центре экрана. При появлении нового прямоугольника площадь предыдущих должна увеличиваться.

21. Выполнить циклическое отображение появляющихся разноцветных овалов с центрами в центре экрана. При появлении нового прямоугольника площадь предыдущих должна увеличиваться.

22. Выполнить циклическое отображение появляющихся разноцветных треугольников с центрами в центре экрана. При появлении нового треугольника площадь предыдущих должна увеличиваться.

23. Нарисовать циферблат механических часов с движущейся секундной стрелкой.

24. Вывести свое имя, «плавающее» по экрану. При соприкосновении букв с границами экрана имя должно «отскакивать» и менять цвет.

25. Выполнить изображение вращающегося закрашенного овала.

26. Изобразить покачивающийся на морских волнах кораблик.

27. Изобразить раскачивающийся звенящий колокольчик.

28. Изобразить светофор и выполнить циклическое переключение его цветов. Рядом с текущим цветом выполнить вывод его названия.

29. Отобразить на экране автомобильную трассу и движущийся по ней автомобиль.

30. Вывести значения текущих параметров графического режима различными стилями шрифтов. Вывести окружность и закрасить ее с использованием собственного шаблона заполнения. Вывести линии с использованием стандартного и собственного шаблонов стиля. Вывести шестиугольник. Сформировать и вывести изображения «пляшущего» человечка. Организовать звуковое сопровождение для «пляшущего» человечка.

6.4. Пример решения задачи

1. Тема работы: работа с графикой в среде Turbo Prolog

2. Цель работы: ознакомление с использованием основных графических предикатов в среде Turbo Prolog 2.0 и приобретение практических навыков создания графических объектов с использованием BGI-графики

3. Индивидуальное задание:

Инициализировать графический режим с параметрами по умолчанию. Вывести значения параметров различными стилями шрифтов. Вывести окружность и закрасить ее с использованием собственного шаблона заполнения. Вывести линии с использованием стандартного и собственного шаблонов стиля. Вывести шестиугольник. Сформировать и вывести изображения «пляшущего» человечка. Организовать звуковое сопровождение для «пляшущего» человечка.

4. Разработка метода решения задачи.

Задача разбивается на три подзадачи:

1) Вывод значений параметров графического режима различными стилями шрифтов.

2) Вывод и закрашивание окружности, линий и шестиугольника.

3) Формирование и вывод изображения «пляшущего» человечка со звуковым сопровождением.

Для решения первой подзадачи разработан беспараметрический предикат gr, подцелями которого являются вызовы стандартных предикатов. Значение параметра Driver выводится вертикально рукописным шрифтом, значение параметра Mode выводится горизонтально готическим шрифтом. Перед выводом значений выполняется их преобразование к строковому типу данных

Вторую подзадачу решает предикат gr1, в котором формируется шаблон заполнения замкнутых геометрических фигур (рис. 6.1, а) и шаблон стиля линии (рис. 6.1, б). Код задается в 16-ричном виде и формирует фрагмент экрана размером 8х8 пикселей. Кроме этого в предикате gr1 формируются изображения окружности, линий и шестиугольника.

                16-ричный код                  
                1F                  
                03  

16-ричный код: 44

                05         б)        
                09                  
                11                  
                20                  
                40                  
                00                  
                                   

                           а)

Рисунок 6.1 – Формирование шаблона заполнения и шаблона стиля линии

Для решения третьей подзадачи формируются изображения двух кадров пляшущего человечка на двух видеостраницах (предикаты ris1 и ris2) и выполняется циклическое переключение видеостраниц до нажатия любой клавиши клавиатуры (предикат gr2).

5. Описание предикатов, разработанных для реализации метода решения задачи на языке Turbo Prolog.

Предикат Назначение
gr Переход в графический режим и вывод текста
gr1 Формирование шаблона заполнения фигур и стиля линии. Вывод графических примитивов на экран
gr2 Циклическое переключение видеостраниц
ris1 Формирование кадра изображения на видеостранице 0
ris2 Формирование кадра изображения на видеостранице 1
р Установка графического режима, стиля линии и цвета фона

6. Стандартные предикаты, используемые для решения задачи:

Стандартные предикаты BGI-графики и значения параметров взяты из прил. 6А.

7. Текст программы.

predicates

gr gr1 gr2 ris1 ris2 p

clauses

gr:-

detectgraph(Gd,Gm), % Получение текущих значений графического

                                 % драйвера и режима

initgraph(Gd,Gm,_,_,""),     % Инициализация графического режима

setcolor(5),             % Устанавливается текущий цвет - лиловый

moveto(180,50),     % Перемещение указателя по заданным

                                 % координатам

outtext("Работает графический режим!"),      % Вывод текста

readchar(_),            % Задержка до нажатия клавиши

setbkcolor(7),         % Задание цвета фона

moveto(20,100),     % Перемещение указателя

settextstyle(5,1,5),  % Установка параметров шрифта – рукописный

                                 % стиль, вертикальная ориентация, размер 5

str_int(D,Gd),         % Преобразование целого числа (типа драйвера)

                                 % в строку

concat("Driver=",D,Dr), % Соединение текста и строки

outtext(Dr),              % Вывод текста

moveto(100,200),   % Перемещение указателя

settextstyle(4,0,25), % Установка параметров шрифта – готический    % стиль, горизонтальная ориентация, размер 25

setcolor(4), 

outtext(" Mode="),

str_int(M,Gm),

outtext(M),

readchar(_),gr1.

 gr1:-

cleardevice,            % Очистка экрана

setbkcolor(9),         % Установка цвета фона

setlinestyle(4,$44,3), % Задание шаблона линии

line(300,100,400,100), % Рисование линии

setfillpattern([$1F,$03,$05,$09,$11,$20,$40,$00],5),         % Задание шаблона

                                 % заполнения

setlinestyle(0,1,3),  % Задание шаблона линии – сплошная линия

setcolor(6),

circle(90,40,40),      % Вывод окружности

floodfill(90,40,6),    % Закрашивание окружности

line(200,100,200,50),

readchar(_),

%Продолжение программы

cleardevice,

circle(100,40,40),

floodfill(90,40,6),

setcolor(1),

line(200,100,200,150),

setcolor(6),

line(200,100,200,150),

readchar(_),

cleardevice,

circle(110,40,40),

floodfill(90,40,6),

readchar(_),

cleardevice,

circle(120,40,40),

floodfill(90,40,6),    % Задание вершин координат замкнутого контура –

                                 % шестиугольника и вывод его на экран

drawpoly([100,100, 150,130, 150,170 ,100,200, 50,170,50,130,100,100]),

readchar(_),closegraph.

gr2:-inkey(_).

gr2:-

setvisualpage(0),   %Установка видимой видеостраницы

sound(50,50),         % Задание частоты и длительности звука

setvisualpage(1),

sound(50,100),!,

gr2.

ris1:-

setactivepage(0),   % Установка активной видеостраницы

clearviewport,         % Очистка видеопорта

setbkcolor(11),

setcolor(1),

circle(320,140,50),

circle(305,125,10), circle(335,125,10),

circle(320,150,7),arc(320,140,240,300,35),

setfillstyle(1,3),

floodfill(305,125,1),floodfill(335,125,1),

rectangle(290,190,350,300),

line(290,210,240,210),line(350,210,400,210),

line(300,300,290,330),line(340,300,350,330),

line(290,330,310,360),line(350,330,330,360),

readchar(_).

ris2:-

setactivepage(1),

clearviewport,

setbkcolor(11),

setcolor(1),

circle(320,140,50),

circle(305,125,10), circle(335,125,10),

circle(320,150,7),arc(320,140,240,300,35),

setfillstyle(1,4),floodfill(320,140,1),

setfillstyle(1,0),

%Продолжение программы

floodfill(305,125,1),floodfill(335,125,1),

rectangle(290,190,350,300), % Вывод прямоугольника

line(290,210,240,170),line(350,210,400,170),

line(300,300,300,360),line(340,300,340,360).

p:-

initgraph(4,1,_,_,""), % Установка драйвера EGA64 м графического

                                 % режима EGAHi - 640x350, 16 цветов, 2 страницы

setbkcolor(9),

setlinestyle(0,0,3),

ris1,ris2, gr2.

goal

gr, p,

write("The end").

8. Выводы

При выполнении лабораторной работы ознакомились с особенностями использования предикатов BGI-графики и констант драйверов. Для реализации индивидуального задания были разработаны рекурсивные предикаты.

Контрольные вопросы

1. Как выполнить инициализацию графического режима?

2. Как завершить работу графического режима?

3. Какие примитивы графических объектов используются в BGI-графике?

4. Какие предикаты реализуют графические примитивы?

5. Что такое видеостраница, чем она характеризуется? Как организовать переключение видеостраниц?

6. Что такое цветовая палитра? Назовите цветовые палитры, используемые в BGI-графике.

7. Что такое шаблон заполнения? Охарактеризуйте стандартные шаблоны заполнения в BGI-графике.

8. Как создать собственный шаблон заполнения?

9. Как закрасить графический объект?

10. Как создать собственный стиль линии?

11. Назовите стандартные стили линий в BGI-графике.

12. Как в графическом режиме вывести на экран текстовую информацию?

13. Что такое пиксель, чем он характеризуется?

14. Как получить текущие координаты курсора?

15. Как переместить курсор в нужную позицию?


Приложение 6А

Предикаты BGI-графики и константы драйверов

В Турбо-Прологе 2.0 содержится целый набор весьма эффективных предикатов, типов данных и констант для работы с графическими изображениями. Турбо-Пролог 2.0 имеет в своем составе ряд программ драйверов для наиболее распространенных видеоадаптеров. Эти драйверы хранятся в файлах с расширением .BGI (Borland Graphic Interface). Для шрифтов используются файлы описаний .CHR.

Таблица 6А.1 – Предикаты для работы с графикой

Предикат Назначение
arc(X,Y,StAngle,EndAngle,Radius) (integer,integer,integer,integer,    integer) – (i,i,i,i,i) Рисует дугу окружности с центром (X,Y), радиусом Radius от угла StAngle до угла EndAngle линией текущего цвета от горизонтальной оси против часовой стрелки
bar(Left,Top,Right,Bottom) (integer,integer,integer,integer) –    (i,i,i,i) Рисует закрашенный прямо-угольник с координатами левого верхнего угла (Left,Top) и правого нижнего (Right,Bottom)
bar3d(Left,Top,Right,Bottom,Depth,        Topflag) (integer,integer,integer,integer,intege           r,integer) –    (i,i,i,i,i,i) Рисует закрашенный паралле-лепипед с параметрами: Left,Top – координаты левого верхнего угла; Right,Bottom – координаты правого нижнего угла; Depth – глубина; Topflag –верхняя грань (0 – отсутствует, 1 – присутствует)
circle(X,Y,Radius)    (integer,integer,integer) – (i,i,i) Рисует окружность с координатами центра (X,Y) и радиусом Radius
Cleardevice Очистка графического экрана. Указатель текущей позиции переносится в точку с координатами (0,0)  

Продолжение табл. 6А.1

Предикат Назначение
clearviewport Очистка текущего графического окна
closegraph Завершение работы в графическом режиме
detectgraph(Graphdriver,                            Graphmode)    (integer,integer) – (o,o) Проверка аппаратных средств и определение графического драйвера
drawpoly(PolyPointsList)    (bgi_ilist) – (i) Рисование многоугольника по заданному списку координат
ellipse(X,Y,StAngle,EndAngle,            Xradius,YRadius) (integer,integer,integer,integer,    integer,integer) – (i,i,i,i,i,i) Эллиптическая дуга с центром (X,Y) от начального угла StAngle до конечного угла EndAngle, Xradius – горизонтальный радиус, Yradius – вертикальный радиус
fillellipse(X,Y,Xradius,YRadius) (integer,integer,integer,integer) – (i,i,i,i) Закрашенный эллипс с центром (X,Y), Xradius – горизонтальный радиус, Yradius – вертикальный радиус
fillpoly(PolyPointsList)    (bgi_ilist) – (i) Рисование закрашенного многоугольника по заданному списку координат
floodfill(X,Y,Border)    (integer,integer,integer) – (i,i,i) Закрашивает фигуру, контур которой нарисован цветом Border; X,Y – точка внутри контура
getarccoords(X,Y,Xstart,Ystart,            Xend,Yend) (integer,integer,integer,integer,    integer,integer) – (o,o,o,o,o,o) Возвращает параметры последнего использования предиката arc
getaspectratio(Xasp,Yasp)    (integer,integer) – (o,o) Возвращает эффективную разрешающую способность графического экрана Xasp – по горизонтали, Yasp – по вертикали
getbkcolor(BkColor)    (integer) – (o) Возвращает номер текущего цвета фона BkColor

Продолжение табл. 6А.1

Предикат Назначение
getcolor(Color)    (integer) – (o) Возвращает номер текущего цвета линии Color
getdrivername(DriverName)    (string) – (o) Возвращает строку с именем текущего графического драйвера
getdefaultpalette(DefaultPalette)    (bgi_ilist) – (o) Возвращает список значений, определяющий текущую палитру
getfillpattern(PatternList)    (bgi_ilist) – (o) Возвращает список значений, определяющий текущий шаблон закрашивания
getfillsettings(FillPattern,FillColor)    (integer,integer) – (o,o) Возвращает номера текущих стандартного шаблона и цвета заполнения
getgraphmode(GraphMode)    (integer) – (o) Возвращает текущее значение графического режима
getimage(Left,Top,Right,Bottom,                            BitMap) (integer,integer,integer,integer,string) –       (i,i,i,i,o) Копирует прямоугольный участок видеопамяти с координатами Left,Top,Right,Bottom в буфер BitMap
getlinesettings(LineStyle,Upattern,            Thickness)    (integer,integer,integer) – (o,o,o) Возвращает текущий стиль и толщину линии
Getmaxcolor(MaxColor)    (integer) – (o) Возвращает наибольшее значение цвета используемой палитры
getmaxx(X)    (integer) – (o) Возвращает максимальную координату по горизонтали
getmaxy(Y)    (integer) – (o) Возвращает максимальную координату по вертикали
getmaxmode(MaxMode)    (integer) – (o) Возвращает максимальный номер допустимого режима для загруженного графического драйвера
Getmodename(DriverMode,            ModeName) (integer,string) – (i,o) Возвращает строку ModeName с именем по заданному графическому режиму DriverMode

Продолжение табл. 6А.1

Предикат Назначение
getmoderange(Graphdriver,Lomode,                            Himode) (integer,integer,integer) – (i,o,o) Возвращает значения наименьшего и наибольшего номеров графических режимов, допустимых для заданного драйвера
getpalette(PaletteList)            (bgi_ilist) – (o) Возвращает список значений текущей палитры
getpalettesize(PaletteSize)            (integer) – (o) Возвращает размер таблицы цветов текущей палитры
getpixel(X,Y,Color) (integer,integer,integer) – (i,i,o) Возвращает цвет пикселя с координатами X,Y
gettextsettings(Font,Direction,            CharSize,Horiz,Vert) (integer,integer,integer,integer,    integer) – (o,o,o,o,o) Возвращает текущий шрифт текста Font, направление Direction, размер CharSize и параметры выравнивания текста по горизонтали и вертикали Horiz,Vert
getviewsettings(Left,Top,Right,            Bottom,Clip) (integer,integer,integer,integer,    integer) – (o,o,o,o,o) Возвращает параметры текущего графического окна, режим отсечения изображения
getx(X)    (integer) – (o) Возвращает координату Х текущей позиции относительно начала окна
gety(Y)            (integer) – (o) Возвращает координату Y текущей позиции относительно начала окна
graphdefaults Устанавливает все параметры графической системы в исходное состояние, т.е. устанавливает параметры по умолчанию
imagesize(Left,Top,Right,Bottom,                            Size) (integer,integer,integer,integer,            integer) – (i,i,i,i,o) Возвращает размер Size (в байтах) для сохранения участка видеопамяти прямоугольника, заданного координатами (Left,Top), (Right,Bottom). Если требуется больше 64К памяти, то возвращается 0.

Продолжение табл. 6А.1

Предикат Назначение
initgraph(Graphdriver,Graphmode,            NewDriver,NewMode,            Pathtodriver) (integer,integer,integer,integer,string) – (i,i,o,o,i) Инициализирует графическую систему и переключает монитор в графический режим. Graphdriver – номер драйвера. Graphmode – режим работы. Pathtodriver – путь к папке, хранящей файл драйвера. Параметры драйвера и режима работы см. в прил. 6Б. NewDriver,NewMode
line(X0,Y0,X1,Y1) (integer,integer,integer,integer) – (i,i,i,i) Рисует линию от точки (X0,Y0) до точки (X1,Y1). Положение указателя не меняется
linerel(Dx,Dy)            (integer,integer) – (i,i) Рисует линию от текущего положения указателя до точки со смещением Dx,Dy относительно текущего положения указателя. Указатель перемещается и позиционируется по заданному смещению
lineto(X,Y)            (integer,integer) – (i,i) Рисует линию от текущего положения указателя до точки с координатами (X,Y). Указатель перемещается в точку с заданными координатами
moverel(Dx,Dy)            (integer,integer) – (i,i) Перемещает указатель в точку со смещением (Dx,Dy) относительно его текущих координат
Moveto(X,Y)            (integer,integer) – (i,i) Перемещает указатель в точку с координатами (Dx,Dy)
Outtext(Textstring)            (string) – (i) В текущей позиции курсора выводит на экран строку Textstring,. Выравнивание текста выполняется в соответствии с параметром, установленным предикатом SetTextJustify

Продолжение табл. 6А.1

Предикат Назначение
outtextxy(X,Y,Textstring) (integer,integer,string) – (i,i,i) В позиции курсора (X,Y) выводит на экран строку Textstring. Указатель текущей позиции не меняется. Выводимая строка обрезается по границам экрана.
pieslice(X,Y,Stangle,Endangle,                            Radius) (integer,integer,integer,integer,            integer) – (i,i,i,i,i) Рисует и заполняет сегмент круга радиусом Radius с центром в точке X,Y от угла Stangle до угла Endangle
putimage(X,Y,Bitmap,Op) (integer,integer,string,integer) – (i,i,i,i) Содержимое буфера Bitmap выводится на участок видеопамяти, начиная от левого верхнего угла (X,Y). Op – тип двоичной операции копирования (прил. 6Б). Если изображение не помещается, оно не выводится
putpixel(X,Y,Pixelcolor) (integer,integer,integer) – (i,i,i) В точке (X,Y) рисуется пиксель цветом Pixelcolor
rectangle(Left,Top,Right,Bottom) (integer,integer,integer,integer) – (i,i,i,i) Рисует прямоугольник с координатами левого верхнего (Left,Top) и правого нижнего угла (Right,Bottom). Рисование выполняется линией со стилем и цветом, заданными до вызова данного предиката
Restorecrtmode Восстанавливает видеорежим, установленый до инициализации графикки
setactivepage(Page)            (integer) – (i) Устанавливает активную страницу Page для вывода графической информации
setallpalette(PaletteList)            (bgi_ilist) – (i) Заменяет все цвета палитры цветами, заданными списком PaletteList. Первый параметр списка – размер палитры, остальные – значения цветов палитры

Продолжение табл. 6А.1

Предикат Назначение
setaspectratio(Xasp,Yasp)            (integer,integer) – (i,i) Изменяет текущие значения разрешающей способности экрана на Xasp и Yasp
setbkcolor(Color)            (integer) – (i) Устанавливает текущий цвет фона Color, используя цвета текущей палитры
setcolor(Color)            (integer) – (i) Устанавливает текущий цвет Color для рисования, используя цвета текущей палитры
setfillpattern(UpatternList,Color)            (bgi_ilist,integer) – (i,i) Устанавливает задаваемый пользователем образец UpatternList и цвет Color для закрашивания фигур
setfillstyle(Pattern,Color)            (integer,integer) – (i,i) Устанавливает один из стандартных образцов закрашивания фигур Pattern и цвет закрашивания Color
setgraphmode(Mode)            (integer) – (i) Переводит видеосистему в заданный графический режим Mode и очищает экран
setgraphbufsize(BufSize)            (integer) – (i) Изменяет размер буфера BufSize для попиксельного и сплошного заполнения фигур
setlinestyle(Linestyle,Upattern,            Thickness) (integer,integer,integer) – (i,i,i) Устанавливает стандартный стиль Linestyle или пользовательский шаблон Upattern для рисования линии. Thickness задает толщину линии
setpalette(Index,Actual_color)            (integer,integer) – (i,i) Заменяет указанный цвет палитры Index другим цветом Actual_color
settextjustify(Horiz,Vert)            (integer,integer) – (i,i) Устанавливает способ выравнивания текста по горизонтали Horiz и по вертикали Vert
settextstyle(Font,Direction,Charsize) (integer,integer,integer) – (i,i,i) Устанавливает шрифт Font, направление вывода Direction и размер символов Charsize

Продолжение табл. 6А.1

Предикат Назначение
setusercharsize(Multx,Divx,Multy,                            Divy) (integer,integer,integer,integer) – (i,i,i,i) Изменяет ширину и высоту в штриховых шрифтах Multx/Divx – коэффициент увеличения ширины символов; Multy/Divy - коэффициент увеличения высоты символов
setviewport(Left,Top,Right,Bottom,                            Clip) (integer,integer,integer,integer,            integer) – (i,i,i,i,i) Устанавливает текущую область изображения окна (Left,Top,Right,Bottom) для вывода графической информации, Clip – условие вывода изображения при превышении размеров окна
setvisualpage(Pagenum)            (integer) – (i) Делает видимой указанную видеостраницу.Pagenum
setwritemode(WriteMode)            (integer) – (i) Устанавливает режим WriteMode занесения в память при рисовании линий
textheight(Textstring,Height)            (string,integer) – (i,o) Возвращает высоту Height строки Textstring в пикселях
textwidth(Textstring,Width)            (string,integer) – (i,o) Возвращает ширину Width строки Textstring в пикселях

Приложение 6Б

Константы BGI-графики

Константы типа драйвера

Detect     = 0;

CGA        = 1;

MCGA    = 2;

EGA        = 3;

EGA64    = 4;

EGAMono = 5;

IBM9614 = 6;

HercMono = 7;

ATT400  = 8;

VGA        = 9;

PC3270  = 10;

CurrentDriver   = 128 (передается в предикат GetModeRange)

Константы режимов драйвера

Для каждого драйвера существуют свои режимы и константы режимов.

CGAC0 = 0 320x200           палитра 0; светло-зеленый, светло-красный, желтый; 1 страница;

CGAC1 = 1 320x200           палитра 1; светло-голубой, светло-пурпурный, белый; 1 страница;

CGAC0 = 2 320x200           палитра 2; зеленый, красный, коричневый; 1°страница;

CGAC0 = 3 320x200           палитра 3; голубой, пурпурный, светло-серый, 1 страница;

CGAН = 4 640x200           1 страница;

 

MCGAC0:MCGAHi =0..5  - 320x200;

 

EGALo                    = 0     – 640x200, 16 цветов, 4 страницы;

EGAHi                     = 1     – 640x350, 16 цветов, 2 страницы;

HercMonoHi          = 0     – 720x348, 2 страницы;

ATT400:ATT400Hi = 0..5 – 320x200;

VGALo                    = 0     – 640x200, 16 цветов, 4 страницы;

VGAMed                = 1     – 640x350, 16 цветов, 2 страницы;

VGAHi                    = 2     – 640x480, 16 цветов, 1 страница;

Константы цветов

черный                       = 0;

синий                          = 1;

зеленый                      = 2;

голубой                      = 3;

красный                     = 4;

лиловый                     = 5;

коричневый               = 6;

светло-серый            = 7;

темно-серый             = 8;

светло-синий            = 9;

светло-зеленый        = 10;

светло-голубой        = 11;

светло-красный       = 12;

светло-лиловый       = 13;

желтый                       = 14;

белый                          = 15;

мерцание символа  = 128.

Константы стиля и толщины линий

( для предикатов GetLineStyle, SetLineStyle)

Значения параметра Linestyle:,Upattern,Thickness

0 – сплошная линия;

1 – точечная линия;

2 – штрих-пунктирная линия;

3 – пунктирная линия;

4 – стиль линии определяется пользователем;

 

Значения параметра Upattern задаются в виде списка 16-ричных кодов. Этот параметр работает только тогда, когда параметр Linestyle=4.

 

Значения параметра Thickness:

1 – толщина в один пиксель;

3 – толщина в три пикселя.

Константы типа шрифта

(задаются в предикате settextstyle ( Font , Direction , Charsize ))

Константы для параметра Font:

0         – точечный шрифт 8х8 элементов;

1         – тройной шрифт (триплекс) – файл TRP.CHR;

2         – штриховой шрифт уменьшенный – файл LITT.CHR;

3         – штриховой шрифт прямой – файл SANS.CHR;

4         – штриховой шрифт готический – файл GOTH.CHR;

 

Константы для параметра Charsize:

0         – размеры букв задаются пользователем

 

Константы для параметра Direction:

0         – слева направо;

1         – сверху вниз


Дата добавления: 2021-11-30; просмотров: 22; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!