Поволжский Государственный Университет...
TRANSCRIPT
Поволжский Государственный Университет
Телекоммуникаций и Информатики
Факультет ИСТ
Кафедра ИВТ
Visual Prolog
ЛР
Автор-составитель: Акчурин Э.А. д.т.н., профессор
Рецензент: Тарасов В.Н. д.т.н., профессор
Самара
2012
2
Факультет информационных систем и технологий
Кафедра «Информатика и вычислительная техника»
Автор - д.т.н., профессор Акчурин Э.А.
Другие материалы по дисциплине Вы найдете на сайте
www.ivt.psuti.ru
3
Введение
Методическая разработка содержит лабораторные работы по логическому программированию с использованием ИСР Visual Prolog версии 7.3. Она может использоваться для магистров ИВТ.
Рекомендуемая литература:
1. Коста. Visual Prolog 7.1 для начинающих. Перевод с англ: И. Алексеев, Е.А. Ефимова. Prolog Development Center. 2008.
2. Visual Prolog 7.3 для начинающих. Встроенный в среду учебник. 3. Visual Prolog 7.3. Language Reference. Prolog Development Center. 2010 4. http://www.visual-prolog.com 5. Цуканова, Дмитриева. Логическое программирование на языке Visual
Prolog: уч. пособие для вузов – М: Горячая линия - Телеком, 2008 – 144 с. 6. Солдатова, Лёзина. Логическое программирование на языке Visual Prolog:
учебное пособие – Самара: СНЦ РАН, 2010 – 81.
Содержание отчета
Название работы.
Цель работы.
Задание в соответствии с вариантом.
Листинг программы.
Результаты исполнения.
Выбор варианта задания
Номер варианта задания = последняя цифра номера зачетной книжки. В неко-торых работах варианты выбираются по оговоренному правилу.
Сохранение кодов
Чтобы файлы разных студентов не перепутывались друг с другом, каждому студенту следует создавать индивидуальные папки. Рекомендуется такая иерархия вложенных друг в друга папок:
Диск пользователя (устанавливается администратором) Папка Users (пользователи) Папка группы (например, ПО_11) Папка студента (например, Дробышев) Папка проекта (например, Hello)
В дисплейных классах в папке студента на каждом занятии следует сохранять свои файлы (одно задание лабораторной работы – один проект). Рекомендует-ся при выполнении работы периодически сохранять незавершенные проекты в текущем состоянии, чтобы избежать потерь документов при сбоях.
4
1. ИСР Visual Prolog
1.1. Знакомство с ИСР Visual Prolog
Предмет исследования
Изучение ИСР Visual Prolog.
Контрольные вопросы:
1. Назначение ИСР Visual Prolog. 2. Версии ИСР Visual Prolog. 3. Вход в ИСР Visual Prolog. 4. Главное окно ИСР Visual Prolog. 5. Меню ИСР Visual Prolog. 6. Получение справки о ИСР Visual Prolog.
Пример выполнения.
При запуске ИСР отображается ее стартовая страница.
5
В центре может размещаться окно приглашения Visual Prolog, содержащее список ранее реализованных проектов и кнопки управления.
New Project – новый проект.
Open Project – открыть проект, выделенный в списке.
Browse – поиск и выбор каталога для проекта.
Help – справка. Открыть учебник, встроенный в ИСР.
Из этого окна можно выбрать проект для работы.
ИСР имеет две реализации:
Полная платная версия.
Сокращенная бесплатная версия. В ней в левой позиции имеется пункт Purchase (покупка), позволяющий при желании перейти к платной версии.
Главное окно. Окно содержит меню и панель инструментов.
6
Строка меню содержит следующие пункты:
File (файл)
Edit (правка)
View (вид)
Insert (ввести)
Project (проект)
Build (построить)
Debag (отладка)
Go to (идти к)
Tools (инструменты)
Web (Интернет)
Window (окно)
Help (справка)
Пункт File (файл).
7
Пункт File (файл) содержит команды работы с файлами:
Команда Описание
New in New Package. Создать новую тему в новом пакете.
New in Existing Package Создать новую тему в существующем пакете.
Add Добавить.
Close Закрыть.
Open Открыть.
Save as… Сохранить как …
Print … Печать…
Exit Выход из ИСР
Пункт Edit (правка)
8
Пункт Edit (правка) содержит команды редактирования:
Команда Описание
Undo Отменить операцию
Redo Восстановить операцию
Cut Вырезать выделение
Copy Копировать выделение
Paste Открыть.
Delete Удалить выделение
Copy Position Копировать позицию выделенного
Find… Найти…
Find Next… Найти следующее…
Find in Files… Найти в файлах…
Replace Заменить выделенное…
Upper Case Верхний регистр…
Lower Case Нижний регистр…
Toggle Case Переключить регистр…
Comment Lines Сделать выделенные строки комментарием
Uncomment Lines Сделать выделенные строки не комментарием
Select All Выделить все
10
Пункт View (вид) содержит команды просмотра:
Команда Описание
Project Window Окно проекта
Error/Warnings Window Окно ошибок/предупреждений
Messages Сообщения
Text Windows Текстовые окна
Resource Windows Окна ресурсов
System Information Системная информация
Code Expert Эксперт Кода
Group Members Члены группы
Run Stack Запуск стека
Variables for Current Clause Переменные для текущей Клаузы
Facts Факты
Breakpoints Точки останова
Threads Нити
Modules Модули
Last Search Results Window Окно результатов последнего ноиска
TODO Делать
Disassembly Дизассмблер
Disassembly from Current Line Дизассмблер из текущей строки
Registers Регистры
Memory Dump 0 Дамп памяти 0
Memory Dump 1 Дамп памяти 1
Memory Dump 2 Дамп памяти 2
Memory Dump 3 Дамп памяти 3
Zoom In Увеличить масштаб
Zoom Out Уменьшить масштаб
Zoom Nornal Нормальный масштаб
Change Font Изменить шрифт
11
Пункт Insert (ввести)
Пункт Insert (ввести) содержит команды ввода в файл компонент:
Команда Описание
Constant Константа
Domain Домен
Class Класс
Interface Интерфейс
Predicate Предикат
Fact Факт
Qualification Квалификация
Insert New GUID Ввести новый GUID
RGB Value Значение RGB
Font Name Имя шрифта
File Name Имя файла
Directory Name Имя каталога
Include File Включить файл
Date Stamp Дата
12
Пункт Project (проект)
Пункт Project (проект) содержит команды работы с проектом:
Команда Описание
New Новый
Open Открыть
Close Закрыть
Save Сохранить
Settings Установки
13
Пункт Build (построить)
Пункт Build (построить) содержит команды построения проекта:
Команда Описание
Compile Компилировать
Build Построить
Rebuild All Перестроить все
Step Building Пошаговое построение
Execute Запустить
Run in Windows Запустить в Windows
Script Preview Предварительный просмотр сценария
14
Пункт Debag (отладка)
Пункт Debag (отладка) содержит команды отладки проекта:
Команда Описание
Run Запуск
Stop Debugging Остановить отладку
Break Program Выйти из программы
Restart Запуск повторный
Attach Process Прикрепить процесс
Step Over Шаг без останова в процедуре
Step Into Шаг с заходом в процедуру
Step Out Of Шаг выхода из процедуры
Run to Cursor Прогон до позиции курсора
Go to Executing Predicate Source Перейти к запуску исходника предиката
Break on Exception Выход по Исключению
Toggle Breakpoint Переключить точку прерывания
Remove All Breakpoints Удалить все точки прерывания
15
ПунктGo to (идти к)
Пункт Go to (идти к) содержит команды перемещения по проекту:
Команда Описание
Source Browser Браузер исходника
Go to Declaration Идти к объявлению
Go to Definition Идти к определению
Go to Related Files Идти к связанным файлам
Go to Resource Editor Идти к редактору исходника
Go to Line Number Идти к строке номер
Go to Position on Clipboard Идти к позиции в буфере обмена
Go to Next Error (Warning) Идти к следующей ошибке (предупреждению)
Go to Previous Error (Warn-ing)
Идти к предыдущей ошибке (предупреждению)
Go Back Идти назад
Locate in Project Tree Локализация в дереве проекта
16
ПунктTools (инструменты)
Пункт Tools (инструменты) содержит команды выбора инструментальных средств:
Команда Описание
Memory Profilier Профилировщик памяти
Configure Tools Средства конфигурирования
Source Control Repository Репозитарий управления исходником
IDE Variables Переменные ИСР
Options Опции
17
ПунктWeb (Интернет)
Пункт Web (Интернет) содержит команды доступа в Интернет:
Команда Описание
Tutorials Учебники
Wiki Wiki
Discussion Forum Форум обсуждений
Check for Update Проверить обновление
Knowledge Base База знаний
My Registration Моя регистрация
Visual Prolog Visual Prolog
Prolog Development Center Центр разработки Prolog
18
ПунктWindow (окно)
Пункт Window (окно) содержит команды выбора представления окна.
Команда Описание
Cascade Каскадное
Horisontal Tile Рядом по горизонтали
Vertical Tile Рядом по вертикали
Arrange Icons размещение иконок
Lock All Editor Windows together
Связать все окна редакторов
Close All Editor Windows except Active
Закрыть все окна редакторов кроме активного
Prune Editor Windows Окна черновиков редакторов
19
Пункт Help (справка).
Пункт Help (справка) содержит средства получения справки (доступны при под-ключенном Интернете):
Команда Описание
Visual Prolog Help Visual Prolog справка
Context Help Контекстная справка
Language Reference (wiki) Языковая ссылка (wiki)
Language Reference (book) Языковая ссылка (книга)
Getting Started Начальное обучение
Send Bug Report Послать отчет о дефектах
Enter License Получить лицензию
Install Examples Установить примеры
Restore File Associations Переустановить ИСР
About О производителе ИСР
20
Внимание. При запуске готовой программы Вы увидите окно диалога, в кото-ром будет предложено зарегистрировать персональную версию программы или купить платную версию. Для активизации - кнопка Activate.
Используем всегда кнопку Cancel, чтобы отложить активизацию.
При этом Вы получите сообщение о недопустимости коммерческого использо-вания программы.
21
1.2. Создание проекта
Во всех работах используются правила создания проекта.
ИСР автоматически создает шаблоны проекта, которые включают набор фай-лов. Функциональность проекта включается только в файл реализации.
После задания функциональности компилятор ИСР создает объектные фай-лы, из которых компоновщик формирует исполняемый файл – это итог про-граммы. Этот файл может быть запущен в операционной системе и без ИСР.
Рассмотрим порядок создания проекта.
Выберем команду Project/New в меню задач. Затем заполним диалоговое окно Project Settings. В нем нужно определить:
Имя проекта – Project Name: имя проекта.
Тип проекта – Project Kind: Console или GUI.
Базовый каталог - Base Directory. Выбор осуществляется с помощью браузера Browse, вызывающего диалоговое окно файлов.
Подкаталог - Sub Directory. Задается автоматически.
Создание консольного приложения
22
Создание GUI приложения
Нажимаем OK. ИСР строит шаблон проекта.
Для проекта строится дерево, отображаемое в окне. В левой панели окна пока-зано дерево проекта, которое содержит системные шаблоны и встроенные библиотеки, а в правой – информационный браузер.
Стартовое дерево проекта включает системные компоненты, которые не надо редактировать (ИСР использует их при компиляции):
Проект - ProjectName.prj6.
Манифест для приложения - main.manifest.
Пакет для приложения - main.pack.
Подключаемые системные библиотеки - $(ProDir)\lib.
23
Теперь командой Build/Build осуществляется компиляция проекта, в дерево проекта добавляются файлы проекта без функциональности:
Шаблон класса - main.cl.
Шаблон проекта - main.ph.
Шаблон реализации приложения - main.pro.
Для задания функциональности щелчком мыши выбираем main.pro, в шаблон которого нужно добавить свои операции.
Другие автоматически созданные файлы трогать не надо.
В листинге шаблона программы отмечено место, куда надо добавить коды. Фраза комментария на английском языке:
% place your own code here
25
Во фрагменте заголовка (строка open core) открываем и класс консоли (con-sole), что позволяет в предикате run() ссылку на консоль не упоминать.
При запуске проекта командой Build/Execute сначала осуществляется повтор-ная компиляция, затем формируется и запускается исполняемый файл.
При наличии ошибок в исходнике выводится сообщения о них (номер ошибки, строка и символ в строке), в листинге делаются пометки ошибок подчеркива-нием красным цветом. К сожалению, в листинге нет нумерации строк.
При щелчке мышью по строке сообщения об ошибке курсор устанавливается на код с ошибкой.
Коды, введенные с ошибкой, выделяются красным цветом. Для правильных кодов применятся цветовая семантическая подсветка. Например, строки пока-зываются голубым цветом.
ИСР имеет интеллектуальный подсказчик. При наборе очередного символа кода отображается список возможных продолжений для выбора, что избавляет
26
программиста от запоминания и ручного набора предопределенных кодов. Если выбираемое продолжение кода имеет варианты, то они перечисляются во всплывающем окне справа.
Замечание. Подсказчику доступны идентификаторы, содержащиеся в классах проекта. По умолчанию выбирается только класс ядра core. Для работы с кон-солью следует добавить класс con sole, а для работы с математическими функциями класс math, Если это не сделано, то в коде перед идентификато-ром члена класса нужно добавлять имя класса и разделитель – двойное верти-кальное двоеточие.
27
2. Первые программы в Visual Prolog
Предмет исследования
Изучение ИСР Visual Prolog
Создание программы.
Исполнение.
Контрольные вопросы:
1. Что такое проект? 2. Построение проекта. 3. Компиляция проекта. 4. Исполнение проекта. 5. Консольное приложение 6. Графический интерфейс GUI.
Задания.
Создать программы.
Задача 1. Консольное приложение - приветствие Hello World.
Задача 2. Приложение с графическим интерфейсом GUI.
Варианты задания. Личные данные студента.
Примеры выполнения.
28
2.1. Hello console
Консольное приложение – проект HelloCons.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта HelloCons,
тип - console application.
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.
Добавляем в файл main.pro функциональность. Вставляем в файл команду ожидания ввода Enter,
_=readLine().
Кроме того, во фрагменте заголовка (строка open core) открываем и класс кон-соли (console), что позволяет в предикате run() ссылку на консоль не упоми-нать.
Листинг программы.
implement main open core, console % Открываем класс console
constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("Hello World and Россия от Акчурина!!"),nl,nl, write("Нажмите Enter”), _=readLine(). % ожидание Enter end implement main goal mainExe::run(main::run).
29
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
Появляется окно консоли с выведенным текстом,
Для завершения нажмите Enter.
30
2.2. Проект GUI
Создание проекта.
Выберем команду Project/New в меню задач.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта Prohect1
тип - GUI application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
31
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
На экране появится окно, содержащее:
Стандартное графическое окно со строками заголовка и главного меню, панелью инструментов. Меню и панель инструментов содержат компонен-ты по умолчанию.
Встроенную консоль сообщений Messages. Сюда компилятор выводит свои сообщения.
32
Чтобы выйти из программы, нужно нажать кнопку в виде крестика, которая находится в верхнем правом углу окна.
Для конкретных действий в проекте нужно создать тему. Для этого используем команду File/New in New Package (новый файл в новом пакете).
Генерируется окно создания темы Create Project Item. Можно создавать темы:
Package – встроенный пакет,
Class – класс,
Interface – интерфейс,
Dialog – диалог,
Form – форма,
Control – элемент управления,
Draw Control – элемент управления для рисования,
Toolbar – панель инструментов,
Menu – меню,
Bitmap – растровая картинка.
Icon – иконка,
Cursor - курсор,
33
TextFile – текстовый файл.
Например, выбираем форму с именем form1.
Нажимаем кнопку create, генерируется окно конструктора формы, которое со-держит встроенные окна:
Form1 -форма, в которую по умолчанию включены 3 часто употребляе-мые элементы управления (OK, Cancel, Help).
Properties – свойства,
34
Controls – доступные элементы управления, которые можно использовать в форме (путем копирования их туда),
Layout - средства управления положением компонент в форме.
35
Для регулирования поведения окна формы в дереве проекта нужно открыть поле TaskWindow.win.
Открывается окно эксперта диалога и окон Dialog and Window Expert (TaskWin-dow), содержащее эксперты для компонент:
Window –окно.
Menu – меню.
Scrollbar
Control – элемент управления.
Key – клавиша.
Mouse - мышь
Miscellaneous – разное.
36
В нем нужно изменить установки, которые по умолчанию запрещают некото-рые действия.
Для поля Windows нужно сделать доступными:
Destroy – уничтожение,
Show – показать,
Size – размер.
37
Для поля Menu нужно сделать доступными:
in_file_new – новый файл открыть,
in_file_exit – файл закрыть,
id_help_about – открыть справку.
Остальные поля менять не надо.
Поля без галочки выключены. Для включения пункта двойной щелчок по нему.
38
Чтобы открывалось окно формы, нужно разрешить открытие файла формы (по умолчанию это запрещено). Открываем TaskMenu двойным щелчком мышью по TaskMenu.mnu.
39
Открывается окно TaskMenu, в котором для &File\>&New\F7 нужно убрать га-лочку в Disable (недоступно).
40
При закрытии этого окна возникает запрос на сохранение сделанных измене-ний.
Выбираем Save – сохранить.
Осталось прописать ссылку на открываемый файл. Открываем файл TaskWin-dow,pro двойным щелчком по TaskWindow,pro.
41
Открывается файл TaskWindow,pro. Его содержимое создано автоматически при компиляции. Только не прописано правило реагирования на открытие но-вого файла –
clauses onFileNew…
43
Вносим туда правило отображения формы form1 с помощью конструктора формы.
Делаем повторную компиляцию и запуск командой Build/Execute. В результате отображается окно проекта без запущенной формы.
45
3. Класс Math
Предмет исследования
Встроенные функции класса Math. В классе определены группы функций.
Алгебраические.
Тригонометрические.
Базовые функции.
Контрольные вопросы:
1. Что такое ООП. 2. Что такое класс. 3. Поддерживаемые алгебраические функции. 4. Поддерживаемые тригонометрические функции. 5. Поддерживаемые базовые функции.
Задания:
Создать программы.
Задача 1. Консольное приложение - Алгебра.
Задача 2. Консольное приложение – Тригонометрия.
Задача 3. Консольное приложение – Базовые функции.
Задача 4. Консольное приложение – квадратное уравнение A*X*X+B*X+C=0.
Варианты задания. Аргументы для операций берутся из номера зачетной книжки. Первый - последняя пара цифр, второй - предпоследняя пара цифр.
Примеры выполнения.
46
3.1. Алгебра
Консольное приложение - Алгебра. Выполняются операции с операндами 5 и 7.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта algebra,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.
Другие автоматически созданные файлы трогать не надо.
Кроме того, во фрагменте заголовка (строка open core) открываем и класс кон-соли (console), что позволяет в предикате run() ссылку на консоль не упоми-нать.
Листинг программы.
implement main open core, console constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("X = "), X=read(), write("Y = "), Y=read(), nl, write("Исходные числа ",X," и ",Y), nl, nl, _=readLine(), write("Операции с числами: ",X," и ",Y), nl, _=readLine(), Z=X+Y, write("Сумма: ", X, " + ", Y, " = ", Z), _=readLine(), Z1=X-Y, write("Разность: ", X, " - ", Y, " = ", Z1), _=readLine(), Z2=X*Y, write("Произведение: ", X, " * ", Y, " = ", Z2), _=readLine(),
47
Z3=X/Y, write("Частное : ", X, " / ", Y, " = ", Z3), _=readLine(), Z4=X^Y, write("Степень : ", X, " ^ ", Y, " = ", Z4), nl, _=readLine(),
write("Деления с выделением целого и остатка: ",X," и ",Y), nl, _=readLine(),
Z5 = X div Y, write("Целая часть с округлением к минусу: ", X, " div ", Y, " = ", Z5), _=readLine(), Z6=X mod Y, write("Остаток с округлением к минусу: ", X, " mod ", Y, " = ", Z6), _=readLine(), Z7=X quot Y, write("Целая часть с округлением к 0: ", X, " quot ", Y, " = ", Z7), =readLine(), Z8=X rem Y, write("Остаток с округлением к 0: ", X, " rem ", Y, " = ", Z8), _=readLine(), nl, write("Конец, Нажмите : Enter"), _=readLine(). % Ждем Enter end implement main goal mainExe::run(main::run).
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
Появляется окно консоли с именем первого аргумента X= в первой строке. После его ввода нажмите Enter.
В следующей строке появляется имя второго аргумента Y=. После его ввода нажмите Enter.
Далее при каждом нажатии Enter в новой строке отображаются результаты.
Когда все показано, отображается строка с сообщением о конце вычислений..
49
3.2. Квадратное уравнение
Консольное приложение – решение квадратного уравнения A*X*X+B*X+C=0.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта kvadratUrav,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.
Другие автоматически созданные файлы трогать не надо.
Кроме того, во фрагменте заголовка (строка open core) открываем и класс кон-соли (console), что позволяет в предикате run() ссылку на консоль не упоми-нать.
В программе предусмотрен рекурсивный запуск run(), что позволяет повторять ее с новыми данными сколько угодно раз. Выход из программы – закрыть окно консоли.
Листинг программы.
implement main open core, console, math constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("Корни квадратного уравнения A*X*X+B*X+C=0 "),nl, write("Введите коэффициенты A,B.C"),nl, write("A="), A=read(), write("B="), B=read(), write("C="), C=read(), Z=B*B-4*A*C, if Z<0
50
then write("Корней нет"),nl else if Z>0 then X1= (-B+sqrt(B*B -4*A*C))/2/A, X2= (-B-sqrt(B*B -4*A*C))/2/A, write("Два корня"),nl,nl, write("X1 = ",X1),nl, write("X2 = ",X2),nl else X= (-B)/2/A, write("Один корень"),nl,nl, write("X = ",X),nl end if end if, nl, run(), _=readLine(). end implement main goal mainExe::run(main::run).
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
Появляется окно консоли с заголовком и приглашением ввести коэффициенты A,B,C. После ввода каждого нажмите Enter.
Далее отображаются результаты. Возможны 3 варианта: корней нет, корень 1, корней 2.
Когда все показано, для выхода надо закрыть окно консоли.
52
3.3. Тригонометрия
Консольное приложение - Тригонометрия. Выполняются прямые и обратные тригонометрические функции с операндом X в градусах.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта Trigonjm,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.
Другие автоматически созданные файлы трогать не надо.
Добавляем в файл main.pro функциональность. Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости команда-ми перехода к новой строке nl. В последней строке выводим сообщение о кон-це программы.
Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console) и класс математики math, что позволяет в предикате run() ссылки на консоль и math не упоминать.
Листинг программы.
implement main open core, console, math constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("X градусы = "), X0=read(), X=X0/180*pi, nl, % Перевод в радианы write("X в градусах и радианах ",X0," и ",X), nl, nl, _=readLine(), Z=sin(X), write("Синус от ",X0," градусов = ", Z), _=readLine(),
53
Z10=arcsin(Z), Z1=Z10*180/pi, % Перевод в градусы write("Арксинус от: ", Z, " = ", Z1, " градусов"), _=readLine(), Z2=cos(X), write("Косинус от ", X0, " градусов = ", Z2), _=readLine(), Z30=arccos(Z2), Z3=Z30*180/pi, % Перевод в градусы write("Арккосинус от ", Z2, " = ", Z3, " градусов"), _=readLine(), Z4=tan(X), write("Тангенс от ", X0, " градусов = ", Z4), _=readLine(), Z50 = arctan(Z4), Z5=Z50*180/pi, % Перевод в градусы write("Арктангенс от ", Z4, " = ", Z5, " градусов"), nl,nl, write("Конец. Нажмите Enter"), _=readLine(). end implement main goal mainExe::run(main::run).
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
Появляется окно консоли с именем аргумента X градусы в первой строке. По-сле его ввода нажмите Enter.
Далее при каждом нажатии Enter в новой строке отображаются результаты.
Когда все показано, отображается строка с сообщением о конце вычислений.
55
3.4. Базовые функции
Консольное приложение – Базовые функции. Выполняются базовые функции с отрицательным операндом X и положительным операндом Y.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта baseFunctions,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.
Другие автоматически созданные файлы трогать не надо.
Добавляем в файл main.pro функциональность. Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости команда-ми перехода к новой строке nl. В последней строке выводим сообщение о кон-це программы.
Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console) и класс математики math, что позволяет в предикате run() ссылки на консоль и math не упоминать.
Листинг программы.
implement main open core, console, math constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("Базовые функции класса math "), nl, nl, write("Отрицательное X = "), X=read(), write("Положительное Y = "), Y=read(), nl, write("Исходные числа ",X," и ",Y), nl, nl, _=readLine(), Z=abs(X),
56
write("Абсолютное значение abs(",X,") = ", Z), _=readLine(), Z1=sqrt(Y), write("Квадратный корень из ", Y, " = ", Z1), _=readLine(), Z2=sqr(X), write("Квадрат ", X, " = ", Z2), _=readLine(), Z3=max(X,Y), write("Максимальное max(", X, ",", Y, ") = ", Z3), _=readLine(), Z4=min(X,Y), write("Минимальное min(", X, ",", Y, ") = ", Z4), _=readLine(), Z5 = ln(Y), write("Натуральный логарифм ln(", Y, ") = ", Z5), _=readLine(), Z6=log(Y), write("Десятичный логарифм log(", Y, ") = ", Z6), _=readLine(), Z7=exp(X), write("Экспонента, exp(", X, ") = ", Z7), _=readLine(), nl, write("Конец. Нажмите Enter "), _=readLine(),nl. end implement main goal mainExe::run(main::run).
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
Появляется окно консоли с заголовком и приглашениями ввода отрицательно-го операнда X и положительного операндаY.
После каждого ввода нажмите Enter.
Далее при каждом нажатии Enter в новой строке отображаются результаты.
Когда все показано, отображается строка с сообщением о конце вычислений.
58
4. Логические операции
Предмет исследования
Встроенные операции Visual Prolog. В языке определены операции.
Отношения.
Логические.
Контрольные вопросы:
1. Что такое ООП. 2. Что такое класс. 3. Поддерживаемые операции отношения. 4. Поддерживаемые логические операции.
Задания:
Создать программы.
Задача 1. Консольное приложение - Операции отношения
Задача 2. Консольное приложение – Членство в списке.
Варианты задания. Аргументы для операций берутся из номера зачетной книжки. Первый - последняя пара, второй - предпоследняя пара.
Примеры выполнения.
59
4.1. Операции отношения
Консольное приложение - Операции отношения с числами X=12 , Y=23.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта logicOperations,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Листинг main.pro.
mplement main open core, console constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("Введите исходные числа X и Y"), nl, nl,
write("X = "), X=read(), write("Y = "), Y=read(), nl, write("Исходные числа ",X," и ",Y), nl, nl, _=readLine(), write("Проверка на равно "), nl, if X=Y then write(X, " равно ",Y) else write(X, " не равно ",Y) end if, nl, _=readLine(), write("Проверка на больше "), nl, if X>Y then write(X, " больше ",Y)
60
else write(X, " не больше ",Y) end if,
nl, _=readLine(), write("Проверка на меньше "), nl, if X<Y then write(X, " меньше ",Y) else write(X, " не меньше ",Y) end if, nl, _=readLine(), write("Проверка на больше или равно "), nl, if X>=Y then write(X, " не меньше ",Y) else write(X, " меньше ",Y) end if, nl, _=readLine(), write("Проверка на меньше или равно "), nl, if X<=Y then write(X, " не больше ",Y) else write(X, " больше ",Y) end if, nl, _=readLine(), write("Проверка на больше или меньше"), nl, if X<>Y then write(X, " не равно ",Y) else write(X, " равно ",Y) end if, nl, _=readLine(),
write("Проверка на меньше или больше"), nl, if X><Y
then write(X, " не равно ",Y) else write(X, " равно ",Y) end if, nl, nl, write("Конец. Нажмите Enter"), nl, nl, _=readLine(). % Ждем Enter end implement main goal mainExe::run(main::run).
61
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
62
4.2. Членство в списке
Консольное приложение – Членство в списке. Программа проверяет наличие числа в списке чисел.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта chlenSpiska,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
В проекте используется предикат объекта member. Его надо задавать в файле класса main.cl. Его реализация в файле main.pro.
Листинг main.cl. class main open core, console predicates classInfo : core::classInfo. predicates member : (integer, integer*) nondeterm (i,i) (o,i). run : core::runnable. end class main Листинг main.pro. implement main
open core, console constants className = "main". classVersion = "". clauses classInfo(className, classVersion). member(Number, [Number | _ ]). member(Number, [ _ | Tail]) :- member(Number,Tail). clauses run():- init(), write("Введите список в квадратных скобках с запятыми"), nl,nl,
63
write("Список -> "), List = read(), nl, % Список чисел write("Число -> "), Chislo = read(), nl, member(Chislo,List), !, % Проверка наличия числа в списке write(Chislo, " есть в списке ", List), nl, nl, _ = readchar(), write("Конец. Нажмите любую клавишу "), _ = readchar(). run() :- write("Числа в списке нет "), _=readchar(), nl, nl, write("Конец. Нажмите Enter"), _=readLine(). end implement main goal mainExe::run(main::run).Запуск программы.
При запуске проекта командой Build/Execute сначала осуществляется повтор-ная компиляция, формируется и запускается исполняемый файл.
Вариант, когда число в списке есть.
Вариант, когда числа в списке нет.
65
5. Работа со списками
Предмет исследования
Средства обработки списков. Определены группы операций.
Численные списки.
Строковые списки.
Иерархические списки.
Контрольные вопросы:
1. Что такое список. 2. Представления списков. 3. Вложенные списки. 4. Голова списка. 5. Хвост списка. 6. Иерархические списки.
Задания:
Создать программы.
Задача 1. Среднее значение списка - SredneeSpiska.
Задача 2. Консольное приложение – Сумма и произведение элементов списка.
Варианты задания. Аргументы для операций берутся из номера зачетной книжки. Длина списка LS – последняя пара цифр, стартовый номер фрагмента St - предпоследняя цифра, длина фрагмента списка L – последняя цифра,
Примеры выполнения.
66
5.1. Среднее списка
Консольное приложение – Среднее списка. Вычисляется среднее значение фрагмента численного списка, начинающегося со стартового номера St и име-ющего длину L.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта SredneeSpiska,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.
Другие автоматически созданные файлы трогать не надо.
В листинге шаблона программы отмечено место, куда надо добавить коды. Фраза комментария на английском языке: % place your own code here
Добавляем в файл main.pro функциональность. Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости команда-ми перехода к новой строке nl. В последней строке выводим сообщение о кон-це программы.
Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикате run() ссылки на консоль не упоминать.
Листинг программы.
implement main open core, console class predicates avg:(real*, real, integer, real) procedure (i, i, i, o). % предикат SredneeSpiska clauses classInfo("avg", "1.0"). avg([], S, L, S/L). % S - сумма, L - номер, Среднее списка S/L avg([X|Xs], S, L, A) :- avg( Xs, % X - Элемент списка X+S, % Сумма S=S+X L+1, % Увеличить номер на 1 A). % Среднее списка S/L
67
run():- init(), write("Введите список, в квадратных скобках с запятыми"), nl, write("Spisok="), List= read(), nl, % Ввод списка, в квадратных скобках с запятыми avg(List, 0, 0, A),% Вычислить среднее списка write("Среднее = ",A), nl, nl, % Вывод результата _= readLine(), write("Конец. Нажмите Enter"), _= readLine(). end implement main goal mainExe::run(main::run).
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
Появляется окно консоли с приглашением в первой строке и полем ввода спис-ка во второй. После его ввода нажмите Enter.
Появляется приглашение ввести стартовый номер и поле его ввода. После его ввода нажмите Enter.
Появляется приглашением ввести длину фрагмента и поле его ввода. После его ввода нажмите Enter.
В следующей строке появляется результат.
Когда все показано, отображается строка с сообщением о конце вычислений.
68
5.2. Сумма и произведение элементов списков
Консольное приложение – Сумма и произведение элементов списков. Второй список одноэлементный – число. Вычисляется сумма sum и произведение prod элементов численного списка Sp и числа N.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта SummaProizvedSpiska,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.
Другие автоматически созданные файлы трогать не надо.
Добавляем в файл main.pro функциональность.
Определяем домен pp2 процедурного типа с двумя вещественными аргумен-тами и вещественным результатом.
Определяем предикаты prod (произведение), sum (сумма), red (типа pp2 с пер-вым аргументом в виде списка).
Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl. В последней строке выводим сообщение о конце программы.
Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикате run() ссылки на консоль не упоминать.
Листинг программы.
implement main open core, console
domains pp2 = (real Argument1, real Argument2) -> real ReturnType. % вещ. числа clauses classInfo("main", "hi_order"). class predicates sum:pp2. prod:pp2. red:(pp2, real*, real, real) procedure (i, i, i, o).
69
clauses sum(X, Y)= Z :- Z=X+Y. prod(X, Y)= Z :- Z=X*Y. red(_P, [], A, A) :- !. red(P, [X|Xs], A, Ans) :- red(P, Xs, P(X, A), Ans). run():- init(), write("Введите список в квадратных скобках с запятыми"),nl, write("SP="), Sp = read(), nl, write("Введите число"),nl, write("N="), N = read(), nl, red(prod, Sp, N, X), write("Произведение="), write(X), nl, red(sum, Sp, N, X1), write("Сумма="), write(X1), nl, _=readLine(),nl, write("Конец. Нажмите Enter"), _=readLine(). end implement main goal mainExe::run(main::run).
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
Появляется окно консоли с приглашением в первой строке и полем ввода спис-ка во второй. После его ввода нажмите Enter.
Появляется приглашение ввести число и поле его ввода. После его ввода нажмите Enter.
В следующих строках появляются результаты: произведение и сумма.
Когда все показано, отображается строка с сообщением о конце вычислений.
71
5.3. Сумма произведений списков
Консольное приложение – Сумма произведений списков. Вычисляется точеч-ное (поэлементное) произведение Sp численных списков Sp1 и Sp2. Затем для списка Sp производится суммирование элементов.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта SummaProizvedSpiskov,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.
Определяем домен pp2 процедурного типа с двумя вещественными аргумен-тами и вещественным результатом.
Определяем предикаты:
prod (произведение),
sum (сумма),
red и zip (типа pp2 с первым аргументом в виде списка)
dotprodSum (точечное произведение и суммирование),
Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl. В последней строке выводим сообщение о конце программы.
Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикате run() ссылки на консоль не упоминать.
Листинг программы.
implement main open core, console domains pp2 = (real Argument1, real Argument2) -> real ReturnType. clauses classInfo("main", "1.0"). class predicates sum:pp2. prod:pp2.
72
red:(pp2, real*, real, real) procedure (i, i, i, o). zip:(pp2, real*, real*, real*) procedure (i, i, i, o). dotprodSum:(real*, real*, real) procedure (i, i, o). clauses sum(X, Y)= Z :- Z=X+Y. prod(X, Y)= Z :- Z=X*Y. zip(_P, [], _, []) :- !. zip(_P, _, [], []) :- !. % Точечное произведение списков с суммированием zip(P, [X|Xs], [Y|Ys], [Z|As]) :- Z= P(X, Y), zip(P, Xs, Ys, As). red(_P, [], A, A) :- !. red(P, [X|Xs], A, Ans) :- red(P, Xs, P(X, A), Ans). dotprodSum(Xs, Ys, D) :- zip(prod, Xs, Ys, Z), % Точечное произведение списков red(sum, Z, 0, D). % Суммирование списка run():- init(), write("Введите 2 списка, в квадратных скобках через запятые"),nl,nl, write("Sp1 -> "), Sp1=read(), nl, write("Sp2 -> "), Sp2=read(), nl, zip(prod, Sp1, Sp2, Sp), write("Sp=Sp1*Sp2 -> ",Sp),nl,nl, dotprodSum( Sp1, Sp2, S), write("Summa(Sp) -> ",Summa), nl,nl, write("Нажмите Enter"),nl,nl, _=readLine(), _=readLine(). end implement main goal mainExe::run(main::run).
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
73
Появляется окно консоли с приглашением в первой строке и полем ввода спис-ка Sp1 во второй. После его ввода нажмите Enter.
Появляется приглашение и полем ввода списка Sp2. После его ввода нажмите Enter.
В следующих строках появляются результаты: точечное произведение списков Sp1 и Sp2 и сумма списка sp=Sp1*Sp2.
Когда все показано, отображается строка с сообщением о конце вычислений.
74
6. Работа со строками
Предмет исследования
Средства обработки строк. Определены группы операций.
Численные списки.
Строковые списки.
Иерархические списки.
Контрольные вопросы:
1. Что такое символ. 2. Что такое строка. 3. Что такое слово. 4. Преобразование строки в список символов. 5. Преобразование списка символов в строку. 6. Разделение слов в строке.
Задания:
Создать программы.
Задача 1. Консольное приложение - Строка в список слов (Stroka_v_Spisok).
Задача 2. Консольное приложение – Форматирование строк (formatting).
Варианты задания. Аргументы для операций берутся из номера зачетной книжки. Слова строки – пары цифр.
Примеры выполнения.
75
6.1. Строка в список слов
Консольное приложение – Строка в список слов. Сначала строка преобразует-ся в список символов, затем группы символов, расположенные между пробе-лами, объединяются во вложенные списки символов слов. Наконец, каждый вложенный список преобразуется в слово.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта Stroka_v_Spisok,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.
Определяем домен pp2 процедурного типа с двумя вещественными аргумен-тами и вещественным результатом.
Определяем предикаты:
foldr:(function{L, B, B}, B, L*) -> B. % Выборка символа
hd:(L**) -> L*. % вложенный список -> список
tl:(L**) -> L**. % вложенный список -> вложенный список
tokens:(char*) -> char**. % Список символов -> список символов слов
Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl. В последней строке выводим сообщение о конце программы.
Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикате run() ссылки на консоль не упоминать.
Листинг программы.
implement main open core, console
class predicates foldr:(function{L, B, B}, B, L*) -> B. % Выборка символа
hd:(L**) -> L*. % вложенный список -> список tl:(L**) -> L**. % вложенный список -> вложенный список tokens:(char*) -> char**. % Формирование списков символов слов clauses
76
classInfo("main", "1.0"). foldr(_P, F, [])= C :- C= F. foldr(P, F, [X|Xs])= C :- C= P(X, foldr(P, F, Xs)). hd(Xs)= C :- if [X|_] = Xs then C=X else C= [] end if. tl(Xs)= C :- if [_|R]=Xs then C=R else C=[] end if. tokens(List_of_chars)= Words :- Wop= {(X, XSS) = C :- if list::isMember(X, [' ', '\n']) then C= [[]|XSS] else if list::isMember(X, [',', '.']) then C=[[],[X]|tl(XSS)] else C= [[X|hd(XSS)]|tl(XSS)] end if end if}, Words= foldr( Wop , [[]], List_of_chars). run():- init(), write("Введите строку текста в двойных кавычках"), nl, write("Моя строка -> "), MyString= read(), % Строка -> в список символов ListSymbols= string::toCharList(MyString), nl, write("Список символов строки -> "),nl, write(ListSymbols),nl,nl, % Формирование списков символов слов, разделитель - пробел S= tokens(ListSymbols), write("Список строки с вложенными списками символов слов -> "),nl, write(S),nl,nl, % Создать слова из списков символов слов Words= list::map(S, string::createFromCharList), write("Список слов строки текста"), nl,
77
write(Words), _=readLine(), _=readLine(). end implement main goal mainExe::run(main::run).
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
Появляется окно консоли с приглашением в первой строке и полем ввода стро-ки текста во второй. После его ввода нажмите Enter.
В следующих строках появляются результаты: список символов строки, список строки с вложенными спискакми символов слов Sp1 и список слов строки.
78
6.2. Форматирование строк
Консольное приложение – Форматирование строк Из строки удаляются симво-лы пробелов и табуляторов
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта formatting,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.
Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl. В последней строке выводим сообщение о конце программы.
Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикате run() ссылки на консоль не упоминать, а также класс string для подключения встроенных в ИСР предикатов обработки строк.
Листинг программы.
implement main open core, console, string clauses classInfo("main", "stringops"). % Подключение классов run():- init(), write("Введите строку с пробелами или табуляторами" ), nl, Str = readLine(),nl, T= trim(Str), % Удаление ведущих разделителей write("Удалены ведущие разделители" ), nl, write(T), nl,nl, T1= trimInner(T), % Удаление внутренних разделителей write("Удалены внутренние разделители" ), nl, write(T1), nl,nl, write(“Нажмите Enter”), nl,
79
_= readLine(). end implement main goal mainExe::run(main::run).
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
Появляется окно консоли с приглашением в первой строке и полем ввода стро-ки текста во второй. После его ввода нажмите Enter.
В следующих строках появляются результаты:
строка с удаленными ведущими разделителями,
строка с удаленными внутренними разделителями.
Когда все показано, отображается строка с сообщением о конце работы.
80
6.3. Семья
Консольное приложение – Семья. Программа анализирует пары персон, для которых задаются имена и родственные отношения (отец, дед, предок). По этим данным программа определяет имена персон, находящихся в определен-ных родственных отношениях. Программа сделана на английском языке, чтобы избежать падежных окончаний в русскоязычных именах.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта family,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Для задания функциональности щелчком мыши выбираем main.pro, в шаблон main.pro нужно добавить свои операции.
Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl. В последней строке выводим сообщение о конце программы.
Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикате run() ссылки на консоль не упоминать.
Листинг main.cl
class main open core predicates classInfo : core::classInfo. % @short Class information predicate. % @detail This predicate represents information predicate of this class. % @end predicates run : core::runnable. end class main
Листинг main.pro
implement main
81
open core, console constants className = "main". classVersion = "$JustDate: $$Revision: $". clauses classInfo(className, classVersion). domains gender = female(); male(). class facts - familyDB person : (string Name, gender Gender). parent : (string Person, string Parent). class predicates father: (string Person, string Father) nondeterm anyflow. % Отец clauses father(Person, Father) :- parent(Person, Father), person(Father, male()). class predicates grandFather : (string Person, string GrandFather) nondeterm anyflow. % Дед clauses grandFather(Person, GrandFather) :- parent(Person, Parent), father(Parent, GrandFather). class predicates ancestor : (string Person, string Ancestor) nondeterm anyflow. % Предок clauses ancestor(Person, Ancestor) :- parent(Person, Ancestor). ancestor(Person, Ancestor) :- parent(Person, P1), ancestor(P1, Ancestor). clauses person("Judith",female()). person("Bill",male()). person("John",male()). person("Pam",female()). parent("John","Judith"). parent("Bill","John").
82
parent("Pam","Bill"). clauses run():- init(), write("father test"),nl, father(X, Y), write(Y," is the father of ", X),nl, fail. run():- nl, write("grandFather test"),nl, grandFather(X, Y), write(Y," is the GrandFather of ", X),nl, fail. run():- nl, write("ancestor of Pam test"),nl, X = "Pam", ancestor(X, Y), write(Y," is the ancestor of ", X),nl, fail. run():- nl, write("End of test"), _=readLine(). end implement main goal mainExe::run(main::run).
84
7. Модульные проекты
Предмет исследования
Модульные проекты применяются для упрощения программирования. Опре-делены группы операций.
Создание класса.
Реализация класса.
Связь между классами.
Контрольные вопросы:
1. Зачем проект разбивается на модули 2. Что такое класс. 3. Определение класса.. 4. Реализация класса. 5. Связь между классами..
Задания:
Создать программы.
Задача 1. Консольное приложение Счетчик от Start до End..
Варианты задания. Start – последняя цифра номера зачетной книжки, End = Start+10.
Задача 2. Консольное приложение Возраст.
Варианты задания. Индивидуальные данные студента.
Примеры выполнения.
85
7.1. Счетчик
Консольное приложение – Счетчик. Программа реализует счетчик, начиная со стартового числа Start до конечного End, и выводит значения счетчика.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта counter,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Проект содержит классы, которые надо редактировать:
counter.cl. Здесь определяется предикат counter.
counter.pro. Здесь реализация предикат counter.
main.pro. Здесь реализация программы.
Для задания функциональности щелчком мыши выбираем нужный файл, в шаблон которого нужно добавить свои операции.
Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl.
Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикатах ссылки на консоль не упоминать.
Конечное значение нужно прописать в файле counter,pro как аргумент предика-та counter(Число), который содержит действия, выполняемые, когда значение счетчика на 1 больше End. Например, если End=10, то Число=11.
Листинг counter.cl
class counter open core, console predicates classInfo : core::classInfo. % @short Class information predicate. % @detail This predicate represents information predicate of this class. % @end count : (integer Number) procedure . end class counter
Листинг counter.pro
86
implement counter open core, console
constants
className = "counter". classVersion = "".
clauses
classInfo(className, classVersion).
count(11) :- nl, write("Это все!"), !. count(Number) :- write(Number),
nl, NextNumber = Number + 1, count(NextNumber).
end implement counter
Листинг main.pro
implement main open core, console
constants
className = "main". classVersion = "".
clauses
classInfo(className, classVersion). clauses
run():- init(), write("Start -> "), Start = read(),nl, counter::count(Start), _= readLine(), _= readLine(). end implement main goal
87
mainExe::run(main::run).
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
Появляется окно консоли с приглашением в первой строке ввести значение Start. После его ввода нажмите Enter.
В следующих строках появляются результаты:
88
7.2. Возраст
Консольное приложение – Возраст. Программа анализирует список персон, для которых задаются имя, группа и возраст. Сначала в консоль выводится список имен, затем список возрастов и а конце средний возраст персон.
Создание проекта.
Выберем команду Project/New в меню задач.
В нем задаем:
имя проекта Vozrast,
тип - console application..
Построение проекта. Нажимаем OK. ИСР строит шаблон проекта.
Компиляция проекта. Теперь командой Build/Build осуществляется компиля-ция проекта, в дерево проекта добавляются файлы проекта без функцио-нальности:
Для задания функциональности щелчком мыши выбираем нужный файл, в шаблон которого нужно добавить свои операции.
Каждую операцию вывода write() завершаем командой паузы _=readLine() и при необходимости командами перехода к новой строке nl.
Кроме того, во фрагменте заголовка (строка open core) открываем класс консо-ли (console), что позволяет в предикатах ссылки на консоль не упоминать.
Листинг person.cl person.cl class person : person
open core domains
name = string. группа = string.
age = integer. predicates
person : (name, группа, age) multi (o,o,o). % Студенты sumlist : (age*, age, integer) procedure(i,o,o). % Список их данных
predicates
classInfo : core::classInfo. % @short Class information predicate. % @detail This predicate represents information predicate of this class. % @end
89
end class person
Листинг person.pro
person.pro implement person open core constants className = "person". classVersion = "". clauses classInfo(className, classVersion). clauses % Пустой список, сумма возрастов Sum=0 и число студентов N=0 sumlist([],0,0). sumlist([H|T], Sum, N):- sumlist(T, S1,N1), % Вызов для очередного факта Sum=H+S1, % Копим сумму N=1+N1. % увеличиваем N на 1 % Список фактов person("Иванов", "П01в", 42). person("Петров", "П01в", 36). person("Сидоров", "П01в", 36). end implement person
Листинг main.cl
main.cl class main open core predicates classInfo : classInfo. % @short Class information predicate. % @detail This predicate represents information predicate of this class. % @end predicates run : runnable. end class main
Листинг main.pro
main.pro implement main
90
open core, console, person constants className = "main". classVersion = "". clauses classInfo(className, classVersion). clauses run():- init(), write("Список студентов "),nl, L1 = [ Name ||person(Name, _)], % Получить список write(N1),nl,nl, write("Их возраст"),nl, L2 = [ Age || person(_, Age)], % Получить список возрастов write(L1),nl,nl, % Получить из списка L2 сумму возрастов Sum и число студентов N sumlist(L2, Sum, N), Ave = Sum/N, % Средний возраст студентов write("Средний возраст=", Ave),nl,nl, write("Нажмите Enter"), _= readLine(). end implement main goal mainExe::run(main::run).
Запуск программы. При запуске проекта командой Build/Execute сначала осу-ществляется повторная компиляция, формируется и запускается исполняемый файл.
Появляется окно консоли с результатами: