ЛР3 - Меню
Лабораторная работа №3
Меню
Цель работы – овладение практическими навыками разработки пользовательских меню одно и многоуровневого типов.
1. Теоретическая часть
Современные программы взаимодействуют с пользователем через специальный интерфейс типа «меню», в котором пользователю предлагается выбрать один из пунктов.
Для реализации меню необходимо обрабатывать коды нажатия клавиш управления курсором (←,↑,→,↓), по которым обычно осуществляется переход на следующий пункт. Активизация пункта обычно выполняется нажатием клавиши Enter. После выполнения нужного пункта программа должна вновь выводить меню и продолжать работу с ним. Выход из программы осуществляется по выбору специального пункта «выход» или по нажатию клавиши Esc.
Для создания окон меню используется графический режим работы экрана. Управление экраном осуществляется с помощью ресурсов модуля Crt, базирующегося на понятии “окно”.
Окно – часть экрана прямоугольной формы. В момент получения программой управления весь экран считается окном 25х80 знакомест. Программист может определять на экране новые окна и управлять их цветом символов и фона окна, так и размещение информации в окне.
Рекомендуемые материалы
Вывод информации в текстовом режиме осуществляется стандартными процедурами Write и WriteLn текущими цветом символа и цветом фона. При выводе четыре символа интерпретируются особым образом:
#7 –звуковой сигнал,
#8 – перемещение курсора влево на один символ,
#10 – перемещение курсора на строку вниз,
#13 – перемещение курсора в начало текущей строки.
Для организации окон в ТР используется процедура Window(Х1,Y1,X2,Y2);
где: Х1,Y1 – координаты левого верхнего угла, X2,Y2 – координаты правого нижнего угла окна.
Пример 3.1.
Window(1,1,80,25) {окно – полный экран},
Window(19,7,59,16) {окно в центре экрана}.
После активизации процедуры Window модуль Crt формирует две специальные переменные WindMin и WindMax, в которых фиксируются размеры текущего окна. Значения этих переменных можно использовать в программе для формирования оконных систем. Например, для получения координат Х и У верхнего угла текущего окна можно использовать выражения:
X: = Lo(WindMin), Y:= Hi(WindMax).
Аналогичным образом можно получить координаты правого нижнего угла текущего окна. Особенности архитектуры модуля Crt требуют при работе с WindMin и WindMax использовать отсчет координат не с (1,1) , а с (0,0), что необходимо учитывать при организации оконных интерфейсов в программе.
На экране могут находиться несколько окон, но в каждый отдельный момент времени активным может быть только одно окно. Процедуры и функции Writeln, Write, Readln, Read, Window, GotoXY, ClrScr, InsLine, DelLine, WhereX, WhereY выполняют соответствующее их назначению действия относительно текущего окна. Работу с текстовыми окнами продемонстрируем на следующем примере:
Program DemoRandomWindow;
Uses Crt;
Var X,Y,I: byte;
Begin
NormVideo;
ClrScr;
for I:=1 to 40 do
begin
X:= Succ(Random(80));
Y:= Succ(Random(25));
Window (X, Y, X+Random(20), Y+Random(8));
TextBackGround(Random(8));
ClrScr;
Write(‘Вывод в окно’, ^G,I:); { ^G - подает звуковой сигнал}
Delay(300);
end
End.
Программа последовательно генерирует 40 окон, границы и фон выбирается случайным образом. В каждое окно выводится сообщение. Необходимо помнить, что Crt поддерживает только текущее окно, информация из предыдущих окон теряется для пользователя, если он сам об этом не позаботиться.
Для сохранения координат окон можно воспользоваться следующей структурой:
Type WinRecord – record
XUpLeft;
YUpLeft;
XLowRight;
YLowRight: byte;
end;
const MaxWin = 10;
Var WinMas: array[1..MaxWin] of WinRecord;
При включении данного фрагмента в пользовательскую программу можно сохранять координаты и устанавливать до 10 различных окон вывода.
Окна часто используются в программах для скроллинга (прокрутки) текстовой информации. Этот процесс проще всего реализовать с помощью процедур InsLine и DelLine.
Пример 3.2.
Program DemoInsLine;
Uses Crt;
Var I: byte;
Begin
Window (20,6,60,15);
ClrScr;
for I:=1 to 10 write (‘Вывод в окно’);
for I:=1 to 5 do
begin
GotoXY(1,1);
InsLine;
write(‘Вставка строки’);
Delay(500);
end
End.
2. Демонстрационные примеры
Пример 3.3. Разработать вертикальное меню из четырех пунктов:
New, open, save, exit. Окно меню синего цвета, названия пунктов должны быть выведены желтым цветом. Выделение пункта выполнить фиолетовым цветом фона. Реализовать выход по выбору пункта «exit ».
При разработке алгоритма программы выделим 2 подпрограммы:
· подпрограмму рисования пункта меню как окна с текстом внутри;
· подпрограмму рисования меню с выделенным пунктом.
В процессе работы основная программа вводит коды клавиш и организует работу меню. После завершения работы такая программа должна восстановить стандартное окно 25х80 и стандартные цвета символа и фона MS DOS.
Program ex;
Uses crt;
Var npos,i: integer;
ch1,ch2: char;
Type
win = record {описываем тип окон пунктов меню}
x1,y1,x2,y2: word; {координаты окна}
text: string [8]; {название пункта меню}
end;
{описываем массив окон пунктов меню}
const menu: array [1..4] of win =
((x1:5; y1:4; x2:15; y2:4; text: ‘new’),
(x1:5; y1:5; x2:15; y2:5; text: ‘open’),
(x1:5; y1:6; x2:15; y2:6; text: ‘save’),
(x1:5; y1:7; x2:15; y2:7; text: ‘new’));
{процедура рисования пункта меню}
Procedure DrawWin (w: win; attr: byte);
Begin
With w do
Begin
TextAttr:= attr; {устанавливаем атрибут окна пункта}
Windows (x1,y1,x2,y2); {устанавливаем окно пункта}
Clrscr; {высвечиваем окно пункта}
GotoXY(2,1); {устанавливаем курсор}
Write(text); {выводим название пункта меню}
End;
End;
{процедура рисования меню с выделением пунктов npos}
procedure DrawMenu ( npos: integer);
begin
clrscr;
for i:=1 to 4 do
if i = npos then DrawWin (menu[i],94) {выводим выделенный пункт}
else DrawWin (menu [i],30); {выводим невыделенный пункт}
end;
{основная программа}
begin
npos:= 1; {выделенный пункт меню}
DrawMenu (npos); {выводим меню}
Repeat
Ch1:= ReadKey; if ch1=#0 then ch1:=ReadKey;
Case ch1 of
#0: case ch2 of
#72: begin {стрелка вверх}
if npos > 1 then {если не верхний пункт}
begin
DrawWin(menu[npos], 30); {убираем выделение текущего пункта меню}
Npos:=Npos - 1; {переходим к предыдущему пункту}
DrawWin(menu[Npos],90); {выделяем новый пункт}
End;
End;
#80: begin
if Npos <4 then {если не нижний пункт}
begin
DrawWin(menu[npos],30); {убираем выделение текущего пункта}
Npos:=npos+1; {переходим к следующему пункту}
DrawWin (menu[npos],94); {выделяем новый пункт}
End;
End;
End; {case интерпретации расширенного кода}
#13: begin
Window(1,1,80,25);
TextAttr:=7;
ClrScr; {очищаем экран}
Case npos of
1: begin
Write (‘выполнен пункт ’, menu[npos].text);
Readln;
End;
2: begin
Write (‘выполнен пункт ’, menu[npos].text);
Readln;
End;
3: begin
Write (‘выполнен пункт ’, menu[npos].text);
Readln;
End;
End; {case}
DrawMenu (npos); {выводим меню}
End;
End; {case}
Until (ch1=#27) or (ch1=#13) and (npos=4));{код 27 соответствует клавише Esc}
Window(1,1,80,25); {код 13 соответствует клавише Enter}
TextAttr:=7;
ClrScr; {очищает экран}
End.
3.Задачи, для самостоятельного решения
Задача 1. Разработать программу исследования элементарных функций (y=sin x, y=cos x, e = tg x, e = ln x, e = eх), задаваемых пользователем. Обеспечить для каждой функции вывод таблицы значений на заданном интервале с заданным шагом, поиск корней и определение максимума и минимума. Взаимодействие пользователя и программы организуйте с использованием меню.
Задача 2. Разработать программу тестирования студентов обучающихся по теме «системы исчисления ». Тестируемому предлагаться 6 вопросов по данной теме, включая обычные вопросы с выбором ответа из нескольких и задачи на выполнение арифметических операций, когда необходимо ввести результат указанной операции. Вопросы должны случайным образом выбираться из списка, хранящегося в файле, и не повторяться. Для ответа на каждый вопрос дается две попытки. Предусмотреть, чтобы тестирующийся мог по желанию отказаться отвечать на данный вопрос и получить правильный вопрос. Оценку проводить по соотношению правильных и неправильных ответов.
Задача 3. Разработать вертикальное меню из четырех пунктов: new, open, save, exit. Окно меню синего цвета, названия пунктов должны быть выведены желтым цветом. Выделение пункта выполнить фиолетовым цветом фона. Реализовать выход по выбору пункта «exit ».
Задача 4. Разработать вертикальное меню из четырех пунктов: new, open, save, exit. Окно меню желтого цвета, названия пунктов должны быть выведены красным цветом. Выделение пункта выполнить фиолетовым цветом фона. Реализовать выход по выбору пункта «exit ».
Задача 5. Разработать программу, анализирующую файл, в котором размещены данные о пассажирах. Запись о пассажирах содержит следующие поля: Фамилия, количество вещей (мест), общий вес багажа. Программа позволяет сортировать пассажиров с максимальным весом багажа и максимальным количеством вещей. Создать меню со следующими пунктами: F1 =ввод данных, F2 – просмотр данных, F3 - выход.
Задача 6. Разработать вертикальное меню из 4-х пунктов: создать, открыть, сохранить, выход. Окна меню синего цвета, названия пунктов должны быть выделены желтым цветом фона. Реализовать выход по выбору пункта «Выход » или по нажатию клавиши «Esc ».
При разработке алгоритмов программы выделить 2 подпрограммы:
1. рисования пункта меню как окна с текстом внутри,
Рекомендация для Вас - 13 Нечёткие ассоциативные матричные правила.
2. рисования меню с выделенным пунктом.
В процессе работы основная программа вводит коды клавиш и организует работу с меню. После завершения работы такая программа должна восстановить стандартное окно 25х80 и стандартные цвета символа и фона MS DOS.
Задача 7. Разработать программу по выводу в выделенном окне нажатие специальных клавиш (Home, End, Delete, Insert, PageUp, PageDown, CapsLock, NumLock, ScrollLock, Esc, Break, F1,F2,F3..F12) , используя меню. Обеспечить наглядность решаемых задач с помощью пользовательского интерфейса, оконный интерфейс (опции меню, окна ответов, значение нажатых клавиш).
Задача 8. Разработать программу исследования элементарных функций: sin x, cos x, tg x, ln x, eх, arcsin x, ctg x, задаваемых пользователем. Обеспечить для каждой функции вывод таблицы значений на заданном интервале [0..1] с заданным шагом, поиск корней и определение максимума и минимума. Взаимодействие пользователя и программы организуйте с использованием 2-хуровнего меню (исследование функций, список операций).
Задача 9. Создать базу данных об учениках старших классов школы. Записи должны содержать следующие поля: класс, фамилия, имя, отечество, 4 предмета обучения, средний балл, оценка за поведение. Создать меню со следующими пунктами: F1 – ввод данных, F2 - просмотр, F3 - поиск, F4 – выход. База данных позволяет вывод данных в табличной форме (оконной форме). Пункты меню расположены горизонтально, на одной линии в верхней части экрана. При выводе, вводе, поиске, меню присутствует.
Задача 10. Разработать программу проигрывания 3-х простейших мелодий с помощью управления встроенным динамиком, используя меню выбора мелодий и их прерывания клавишей «Esc ».