Практическая работа 24-09-24


Задание:

Повторить теоретический материал Тема «Полноэкранные программы» п.2.11.

Составить программы:


1. Программа из учебника movehello.pas. Набрать и отладить программу


2. Программа из учебника movingstar.pas. Набрать и отладить программу


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



uses crt;
Type
   MenuType = (Vertical, Horizontal);

const
   width = 9; { Максимальная длина элементов (букв) меню }

   Items1 = 5; { Количество элементов меню 1 }
   optText1: array [0..Items1-1] of string =
   ('Сложение',
    'Вычитание',
    'Деление',
    'Умножение',
    'Выход');

   Items2 = 3; { Количество элементов меню 2 }
   optText2: array [0..Items2-1] of string = (
    'item 1',
    'item 2',
    'item 3'
    );

   optNormal = LightGray; { цвет невыделенных элементов меню }
   optSelected = Yellow;  { цвет выделенных элементов меню }

var
   X, Y,
   selected,  { Индекс элемента, который будет подсвечиваться в начале
                программы }
   row: integer;
   _style: menuType;  { Указывает на тип меню: вертикальный (Vertical)
                        или горизонтальный (Horizontal) }


{ Эта процедура используется процедурой MenuOption для построения меню }
procedure MakeMenu (optText: array of string; MaxItems: integer);
var
   i, _X: byte;
begin
     Y := row;
     _X := X;
     for i := 0 to MaxItems-1 do
     begin
          GoToXY (_X, Y);
          if i = selected then
             TextColor (optSelected)
          else
             TextColor (optNormal);
          write (optText[i]);

          If _style = Horizontal Then
            inc (_X, width + 1)
          Else
            inc (Y, 2);
     end;
end;

{ выбираем нужный элемент меню этой функцией }
function MenuOption (optText: array of string; MaxItems: integer): byte;
var
   ch: char;
begin
     selected := 0;

     If _style = Vertical then begin
       X := (80 - width) div 2;
       row := (25 - MaxItems) div 2;
     End
     Else
     Begin
       X := (80 - MaxItems * width) div 2;
       row := 2; { строчка, в которой будет находиться горизонтальное меню }
       GotoXY(1, row); ClrEol; { ... а для горизонтального - только строку
                                 где будет меню. }
     End;

     repeat
           MakeMenu (optText, MaxItems);

           ch := readkey;
           if ch = #0 then
              ch := readkey;

           case ch of
           #80, #77: {Down/Right}
           begin
                inc (Selected);
                if Selected = MaxItems then
                   Selected := 0;
                MakeMenu (optText, MaxItems);
           end;

           #72, #75: {Up/Left}
           begin
                dec (Selected);
                if Selected < 0 then
                   Selected := MaxItems-1;
                MakeMenu (optText, MaxItems);
           end;
           end;
     until ch = #13; {Enter}

     MenuOption := Selected + 1;

     TextColor (optNormal);
     If _style = Vertical Then
        clrscr;
end;

procedure Add;
begin
end;

procedure Subtract;
begin
end;

procedure Divide;
begin
end;

procedure Multiply;
begin
end;

var
  Option: byte; { номер выбранного пункта }

begin
     clrscr;

     _style := Vertical; { вертикальное меню }
     Option := MenuOption (optText1, Items1);

     case option of
     1: Add;       { сложить числа }
     2: Subtract;  { вычесть числа }
     3: Divide;    { поделить числа }
     4: Multiply;  { умножить числа }
     5: exit;      { Выйти из программы }
     end;

     { вывести (если нужно) номер выбранного пункта }
     writeln ('Номер пункта: ', option);
     readln;

     _style := Horizontal; { горизонтальное меню }
     Option := MenuOption (optText2, Items2);

end.