Шаг 69.
Основы логического программирования.
Создание меню при помощи окон

    На этом шаге мы рассмотрим создание меню при помощи окон.

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

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

    Основной модуль данной программы создает главное меню. Из этого меню, пользователь может выбрать: 0 - выход из меню (окончание программы), 1 - удалить файл, 2 - переименовать файл, 3 - создать файл, 4 - выход в операционную систему. Главное и каждое дочернее меню выводятся в отдельные окна. Каждое дочернее окно позволяет выполнить необходимое действие.

    Рассмотренную систему меню реализует программа МЕНЮ. Ее целевым утверждением является правило run_file_utility. Правило show_menu составляет главный модуль:

   show_menu:-
      repeat,
      makewindow(1,7,7,"Главное меню",4,10,16,36),nl,
      write("	Выберите действие:"),nl,nl,
      write("      0	выход из программы"),nl,
      write("      1	удалить файл"),nl,
      write("      2	переименовать файл"),nl,
      write("      3	создать файл"),nl,
      write("      4	выход в DOS"),nl,nl,
      write("Укажите номер:(0-4)  "),
      readint(X),
      X<5,
      process(X),
      X=0,
      !.

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

    Заметьте, что данное правило использует один из вариантов метода отката после неудачи. Предикат readint(X) считывает целочисленное значение и присваивает его переменной X. Правило X<5 проверяет, что введенное значение меньше 5.

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

    Каждое правило process содержит предикат makewindow и предикат write для вывода сообщения, идентифицирующего задачу и сообщения "Процесс будет реализован позднее". В окончательно написанной программе, предикат write, выполняющий вывод последнего сообщения, будет предикатом, реализующим выбранную задачу. Целью приведенной здесь программы является только иллюстрация разработки меню, а не выполнение каких-либо конкретных задач. Заметим, что каждая задача оканчивается удалением соответствующего окна.

    После того, как правило process заканчивается успешно, делается попытка выполнить остальные правила. Если X равно нулю, отсечение (!) препятствует откату к правилу repeat, и программа заканчивается.

   /* Программа М е н ю */
   /* Назначение. Иллюстрация создания меню при помощи окон. */
   predicates
      repeat
      process(integer)
      show_menu
      run_file_utility
   goal
      run_file_utility.
   clauses
      run_file_utility:-
         show_menu,
         nl,write("Нажмите клавишу ПРОБЕЛ"),
         readchar(_),
         exit. 
      repeat.
      repeat:-
         repeat. 
      show_menu:-
         repeat,
         makewindow(1,7,7,"Главное меню",4,10,16,36),nl,
         write("	Выберите действие"),nl,nl,
         write("      0	выход из программы"),nl,
         write("      1	удалить файл"),nl,
         write("      2	переименовать файл"),nl,
         write("      3	создать файл"),nl,
         write("      4	выход в DOS"),nl,nl,
         write("Укажите номер:(0-4)  "),
         readint(X),
         X<5,
         process(X),
         X=0,
         !.
      process(0):-
         nl,write(" Выбран выход из программы!"),nl. 
      process(1):-
         makewindow(2,7,7,"Удаление файла",12,36,10,36),
         write("Выбрано удаление файла."),nl,nl,
         write("Процесс будет реализован позднее."),nl, nl,
         write("Для продолжения нажмите пробел."),
         readchar(_),
         removewindow. 
      process(2):-
         makewindow(3,7,7,"Переименование файла",10,40,10,36),
         write("Выбрано переименование файла."), nl,nl,
         write("Процесс будет реализован позднее."),nl, nl,
         write("Для продолжения нажмите пробел."),
         readchar(_),
         removewindow. 
      process(3):-
         makewindow(4,7,7,"Создание файла",5,10,15,60),
         write("Выбрано создание файла."), nl,nl,
         write("Процесс будет реализован позднее."),nl, nl,
         write("Для продолжения нажмите пробел."),
         readchar(_),
         removewindow. 
      process(4):-
         makewindow(5,7,7,"Выход в DOS",10,40,10,35),
         write("Выбран временный выход в DOS."), nl,nl,
         write("Процесс будет реализован позднее."),nl, nl,
         write("Для продолжения нажмите пробел."),
         readchar(_),
         removewindow. 
        /*  К о н е ц  программы  */
Текст этой программы можно взять здесь.

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

    Результат работы программы при выборе, например, пункта меню 1- удалить файл можно посмотреть на рис. 1.


Рис. 1. Пример работы программы

    Со следующего шага мы начнем рассматривать графику.




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