Связные списки, переписать код с использованием Case - PascalABC.NET
Формулировка задачи:
Препода не устраивает "простыня" вот в этом куске. требует переписать кейсами, но как-то не ахти получается, выручите пожалуйста
Листинг программы
- procedure mousedown(x, y, mb: integer); // обработчик событий мыши(кнопки, операции, цвета и все все и меню)
- begin
- if ((x >= 0) and (x < 150) and (y >= 0) and (y < 30)) then
- begin
- op := 1;
- setpencolor(clred);
- drawrectangle(0, 0, 150, 30);
- setpencolor(clblack);
- drawrectangle(150, 0, 300, 30);
- drawrectangle(300, 0, 450, 30);
- drawrectangle(450, 0, 600, 30);
- drawrectangle(600, 0, 750, 30);
- drawrectangle(750, 0, 900, 30);
- end else
- if ((x >= 150) and (x < 300) and (y >= 0) and (y < 30)) then
- begin
- op := 2;
- setpencolor(clred);
- drawrectangle(150, 0, 300, 30);
- setpencolor(clblack);
- drawrectangle(0, 0, 150, 30);
- drawrectangle(300, 0, 450, 30);
- drawrectangle(450, 0, 600, 30);
- drawrectangle(600, 0, 750, 30);
- drawrectangle(750, 0, 900, 30);
- end else
- if ((x >= 300) and (x < 450) and (y >= 0) and (y < 30)) then
- begin
- op := 3;
- setpencolor(clred);
- drawrectangle(300, 0, 450, 30);
- setpencolor(clblack);
- drawrectangle(150, 0, 300, 30);
- drawrectangle(0, 0, 150, 30);
- drawrectangle(450, 0, 600, 30);
- drawrectangle(600, 0, 750, 30);
- drawrectangle(750, 0, 900, 30);
- end else
- if ((x >= 450) and (x < 600) and (y >= 0) and (y < 30)) then
- begin
- op := 4;
- setpencolor(clred);
- drawrectangle(450, 0, 600, 30);
- setpencolor(clblack);
- drawrectangle(150, 0, 300, 30);
- drawrectangle(300, 0, 450, 30);
- drawrectangle(0, 0, 150, 30);
- drawrectangle(600, 0, 750, 30);
- drawrectangle(750, 0, 900, 30);
- redrawall(head);
- op := 1;
- setpencolor(clred);
- drawrectangle(0, 0, 150, 30);
- setpencolor(clblack);
- drawrectangle(150, 0, 300, 30);
- drawrectangle(300, 0, 450, 30);
- drawrectangle(450, 0, 600, 30);
- drawrectangle(600, 0, 750, 30);
- drawrectangle(750, 0, 900, 30);
- setpencolor(clred);
- drawrectangle(5, 55, 45, 95);
- setpencolor(clblack);
- clr := clyellow;
- drawrectangle(5, 95, 45, 135);
- drawrectangle(5, 135, 45, 175);
- drawrectangle(5, 175, 45, 215);
- drawrectangle(5, 215, 45, 255);
- drawrectangle(5, 255, 45, 295);
- drawrectangle(5, 295, 45, 335);
- drawrectangle(5, 335, 45, 375);
- drawrectangle(5, 375, 45, 415);
- drawrectangle(5, 415, 45, 455);
- end else
- if ((x >= 600) and (x < 750) and (y >= 0) and (y < 30)) then
- begin
- op := 5;
- setpencolor(clred);
- drawrectangle(600, 0, 750, 30);
- setpencolor(clblack);
- drawrectangle(150, 0, 300, 30);
- drawrectangle(300, 0, 450, 30);
- drawrectangle(450, 0, 600, 30);
- drawrectangle(0, 0, 150, 30);
- drawrectangle(750, 0, 900, 30);
- deleteall(head);
- op := 1;
- setpencolor(clred);
- drawrectangle(0, 0, 150, 30);
- setpencolor(clblack);
- drawrectangle(150, 0, 300, 30);
- drawrectangle(300, 0, 450, 30);
- drawrectangle(450, 0, 600, 30);
- drawrectangle(600, 0, 750, 30);
- drawrectangle(750, 0, 900, 30);
- setpencolor(clred);
- drawrectangle(5, 55, 45, 95);
- setpencolor(clblack);
- clr := clyellow;
- drawrectangle(5, 95, 45, 135);
- drawrectangle(5, 135, 45, 175);
- drawrectangle(5, 175, 45, 215);
- drawrectangle(5, 215, 45, 255);
- drawrectangle(5, 255, 45, 295);
- drawrectangle(5, 295, 45, 335);
- drawrectangle(5, 335, 45, 375);
- drawrectangle(5, 375, 45, 415);
- drawrectangle(5, 415, 45, 455);
- end else
- if ((x >= 750) and (x <= 900) and (y >= 0) and (y < 30)) then
- ext else
- if ((x >= 5) and (x <= 45) and (y >= 55) and (y < 95)) then
- begin
- setpencolor(clred);
- drawrectangle(5, 55, 45, 95);
- setpencolor(clblack);
- clr := clyellow;
- drawrectangle(5, 95, 45, 135);
- drawrectangle(5, 135, 45, 175);
- drawrectangle(5, 175, 45, 215);
- drawrectangle(5, 215, 45, 255);
- drawrectangle(5, 255, 45, 295);
- drawrectangle(5, 295, 45, 335);
- drawrectangle(5, 335, 45, 375);
- drawrectangle(5, 375, 45, 415);
- drawrectangle(5, 415, 45, 455);
- end else
- if ((x >= 5) and (x <= 45) and (y >= 95) and (y < 135)) then
- begin
- setpencolor(clred);
- drawrectangle(5, 95, 45, 135);
- setpencolor(clblack);
- drawrectangle(5, 55, 45, 95);
- clr := clgreen;
- drawrectangle(5, 135, 45, 175);
- drawrectangle(5, 175, 45, 215);
- drawrectangle(5, 215, 45, 255);
- drawrectangle(5, 255, 45, 295);
- drawrectangle(5, 295, 45, 335);
- drawrectangle(5, 335, 45, 375);
- drawrectangle(5, 375, 45, 415);
- drawrectangle(5, 415, 45, 455);
- end else
- if ((x >= 5) and (x <= 45) and (y >= 135) and (y < 175)) then
- begin
- setpencolor(clred);
- drawrectangle(5, 135, 45, 175);
- setpencolor(clblack);
- drawrectangle(5, 55, 45, 95);
- drawrectangle(5, 95, 45, 135);
- clr := clblue;
- drawrectangle(5, 175, 45, 215);
- drawrectangle(5, 215, 45, 255);
- drawrectangle(5, 255, 45, 295);
- drawrectangle(5, 295, 45, 335);
- drawrectangle(5, 335, 45, 375);
- drawrectangle(5, 375, 45, 415);
- drawrectangle(5, 415, 45, 455);
- end else
- if ((x >= 5) and (x <= 45) and (y >= 175) and (y < 215)) then
- begin
- setpencolor(clred);
- drawrectangle(5, 175, 45, 215);
- setpencolor(clblack);
- drawrectangle(5, 55, 45, 95);
- drawrectangle(5, 95, 45, 135);
- drawrectangle(5, 135, 45, 175);
- clr := clsilver;
- drawrectangle(5, 215, 45, 255);
- drawrectangle(5, 255, 45, 295);
- drawrectangle(5, 295, 45, 335);
- drawrectangle(5, 335, 45, 375);
- drawrectangle(5, 375, 45, 415);
- drawrectangle(5, 415, 45, 455);
- end else
- if ((x >= 5) and (x <= 45) and (y >= 215) and (y < 255)) then
- begin
- setpencolor(clred);
- drawrectangle(5, 215, 45, 255);
- setpencolor(clblack);
- drawrectangle(5, 55, 45, 95);
- drawrectangle(5, 95, 45, 135);
- drawrectangle(5, 135, 45, 175);
- drawrectangle(5, 175, 45, 215);
- clr := clorange;
- drawrectangle(5, 255, 45, 295);
- drawrectangle(5, 295, 45, 335);
- drawrectangle(5, 335, 45, 375);
- drawrectangle(5, 375, 45, 415);
- drawrectangle(5, 415, 45, 455);
- end else
- if ((x >= 5) and (x <= 45) and (y >= 255) and (y < 295)) then
- begin
- setpencolor(clred);
- drawrectangle(5, 255, 45, 295);
- setpencolor(clblack);
- drawrectangle(5, 55, 45, 95);
- drawrectangle(5, 95, 45, 135);
- drawrectangle(5, 135, 45, 175);
- drawrectangle(5, 175, 45, 215);
- drawrectangle(5, 215, 45, 255);
- clr := clbrown;
- drawrectangle(5, 295, 45, 335);
- drawrectangle(5, 335, 45, 375);
- drawrectangle(5, 375, 45, 415);
- drawrectangle(5, 415, 45, 455);
- end else
- if ((x >= 5) and (x <= 45) and (y >= 295) and (y < 335)) then
- begin
- setpencolor(clred);
- drawrectangle(5, 295, 45, 335);
- setpencolor(clblack);
- drawrectangle(5, 55, 45, 95);
- drawrectangle(5, 95, 45, 135);
- drawrectangle(5, 135, 45, 175);
- drawrectangle(5, 175, 45, 215);
- drawrectangle(5, 215, 45, 255);
- drawrectangle(5, 255, 45, 295);
- clr := clcyan;
- drawrectangle(5, 335, 45, 375);
- drawrectangle(5, 375, 45, 415);
- drawrectangle(5, 415, 45, 455);
- end else
- if ((x >= 5) and (x <= 45) and (y >= 335) and (y < 375)) then
- begin
- setpencolor(clred);
- drawrectangle(5, 335, 45, 375);
- setpencolor(clblack);
- drawrectangle(5, 55, 45, 95);
- drawrectangle(5, 95, 45, 135);
- drawrectangle(5, 135, 45, 175);
- drawrectangle(5, 175, 45, 215);
- drawrectangle(5, 215, 45, 255);
- drawrectangle(5, 255, 45, 295);
- drawrectangle(5, 295, 45, 335);
- clr := clmagenta;
- drawrectangle(5, 375, 45, 415);
- drawrectangle(5, 415, 45, 455);
- end else
- if ((x >= 5) and (x <= 45) and (y >= 375) and (y < 415)) then
- begin
- setpencolor(clred);
- drawrectangle(5, 375, 45, 415);
- setpencolor(clblack);
- drawrectangle(5, 55, 45, 95);
- drawrectangle(5, 95, 45, 135);
- drawrectangle(5, 135, 45, 175);
- drawrectangle(5, 175, 45, 215);
- drawrectangle(5, 215, 45, 255);
- drawrectangle(5, 255, 45, 295);
- drawrectangle(5, 295, 45, 335);
- drawrectangle(5, 335, 45, 375);
- clr := clgold;
- drawrectangle(5, 415, 45, 455);
- end else
- if ((x >= 5) and (x <= 45) and (y >= 415) and (y < 455)) then
- begin
- setpencolor(clred);
- drawrectangle(5, 415, 45, 455);
- setpencolor(clblack);
- drawrectangle(5, 55, 45, 95);
- drawrectangle(5, 95, 45, 135);
- drawrectangle(5, 135, 45, 175);
- drawrectangle(5, 175, 45, 215);
- drawrectangle(5, 215, 45, 255);
- drawrectangle(5, 255, 45, 295);
- drawrectangle(5, 295, 45, 335);
- drawrectangle(5, 335, 45, 375);
- drawrectangle(5, 375, 45, 415);
- clr := clpurple;
- end else
- if ((x >= 855) and (x <= 895) and (y >= 55) and (y < 95)) then
- begin
- setpencolor(clred);
- drawrectangle(855, 55, 895, 95);
- setpencolor(clblack);
- mrkr := 1;
- drawrectangle(855, 95, 895, 135);
- drawrectangle(855, 135, 895, 175);
- drawrectangle(855, 175, 895, 215);
- drawrectangle(855, 215, 895, 255);
- end else
- if ((x >= 855) and (x <= 895) and (y >= 135) and (y < 175)) then
- begin
- setpencolor(clred);
- drawrectangle(855, 135, 895, 175);
- setpencolor(clblack);
- drawrectangle(855, 55, 895, 95);
- drawrectangle(855, 95, 895, 135);
- mrkr := 2;
- drawrectangle(855, 175, 895, 215);
- drawrectangle(855, 215, 895, 255);
- end else
- if ((x >= 855) and (x <= 895) and (y >= 215) and (y <= 255)) then
- begin
- setpencolor(clred);
- drawrectangle(855, 215, 895, 255);
- setpencolor(clblack);
- drawrectangle(855, 55, 895, 95);
- drawrectangle(855, 95, 895, 135);
- drawrectangle(855, 135, 895, 175);
- drawrectangle(855, 175, 895, 215);
- mrkr := 3;
- end else
- if ((x > 55) and (x < 845) and (y > 40) and (y < 490)) then
- if op = 1 then begin
- newnode(x, y, clr, mrkr);
- drawnode(p);
- end else
- if op = 2 then
- deletenode(x, y, head)
- else
- if op = 3 then
- movenode(x, y, head);
- end;
Решение задачи: «Связные списки, переписать код с использованием Case»
textual
Листинг программы
- uses GraphABC;
- var
- MouseX, MouseY : Integer;
- myProcedure : procedure;
- type
- /// Кнопка
- tButton = class
- private
- X, Y, Width, Height : Integer;
- Text : String;
- btnSelect : Boolean;
- proc : procedure;
- procedure Show;
- begin
- if btnSelect then
- begin
- Brush.Color := RGB(128, 128, 255);
- Font.Color := RGB(255, 255, 0);
- end
- else
- begin
- Brush.Color := RGB(192, 192, 192);
- Font.Color := RGB(255, 255, 0);
- end;
- Font.Style := fsBold;
- FillRectangle(X, Y, X + Width, Y + Height);
- DrawTextCentered(X + 1, Y + 1, X + Width - 1, Y + Height - 1, Text);
- end;
- constructor Create(X, Y, Width, Height : Integer; Text : String; proc : procedure);
- begin
- Self.X := X; Self.Y := Y; Self.Width := Width; Self.Height := Height;
- Self.Text := Text; btnSelect := False;
- Self.proc := proc;
- Show;
- end;
- procedure Select;
- begin
- btnSelect := Not btnSelect;
- Show;
- if btnSelect then
- myProcedure := proc;
- end;
- function MouseDown(mouseX, mouseY : Integer) := (mouseX > X) and (mouseX < X + Width) and (mouseY > Y) and (mouseY < Y + Height);
- end;
- procedure Slider;
- begin
- PutPixel(MouseX, MouseY, clBlack);
- end;
- procedure None;
- begin
- end;
- const
- btnsCount = 2;
- var
- btns : array [1..btnsCount] of tButton;
- procedure MouseDown(x, y, mb : Integer);
- begin
- // Может это кнопка?
- for var num := 1 to btnsCount do
- if btns[num].MouseDown(x, y) then
- begin
- btns[num].Select; // Эту включим
- for var i := 1 to btnsCount do
- if (i <> num) and btns[i].btnSelect then
- btns[i].Select; // Другие погасим
- Exit; // Событие отловлено. Другие не нужны
- end;
- // Обработка других событий
- end;
- procedure MouseMove(x, y, mb : Integer);
- begin
- MouseX := X;
- MouseY := Y;
- myProcedure;
- end;
- begin
- SetWindowSize(900, 500);
- myProcedure := None;
- btns[1] := New tButton( 2, 2, 180, 20, 'Создать маркер', Slider);
- btns[2] := New tButton(202, 2, 180, 20, 'Удалить маркер', None );
- OnMouseDown := MouseDown;
- OnMouseMove := MouseMove;
- end.
Объяснение кода листинга программы
- Объявлены переменные:
- MouseX, MouseY : Integer;
- myProcedure : procedure;
- btnsCount = 2;
- btns : array [1..btnsCount] of tButton;
- procedure MouseDown(x, y, mb : Integer);
- procedure MouseMove(x, y, mb : Integer);
- Создано описание класса tButton:
- tButton = class
- private
- X, Y, Width, Height : Integer;
- Text : String;
- btnSelect : Boolean;
- proc : procedure;
- procedure Show;
- constructor Create(X, Y, Width, Height : Integer; Text : String; proc : procedure);
- procedure Select;
- function MouseDown(mouseX, mouseY : Integer) := (mouseX > X) and (mouseX < X + Width) and (mouseY > Y) and (mouseY < Y + Height);
- public
- property X read X write X;
- property Y read Y write Y;
- property Width read Width write Width;
- property Height read Height write Height;
- property Text read Text write Text;
- property btnSelect read btnSelect write btnSelect;
- procedure Show;
- procedure Select; end;
- Инициализированы кнопки:
- btns[1] := New tButton( 2, 2, 180, 20, 'Создать маркер', Slider);
- btns[2] := New tButton(202, 2, 180, 20, 'Удалить маркер', None );
- Задана функция обратного вызова для событий мыши:
- procedure MouseDown(x, y, mb : Integer);
- procedure MouseMove(x, y, mb : Integer);
- Задана функция обратного вызова для события создания окна:
- procedure None;
- Задана функция обратного вызова для события закрытия окна:
- procedure None;
- Задана функция обратного вызова для события обновления окна:
- procedure None;
- Задана функция обратного вызова для события вставки текста:
- procedure None;
- Задана функция обратного вызова для события удаления текста:
- procedure None;
- Задана функция обратного вызова для события нажатия клавиши:
- procedure None;
- Задана функция обратного вызова для события прокрутки:
- procedure None;
- Задана функция обратного вызова для события изменения размера окна:
- procedure None;
- Задана функция обратного вызова для события закрытия консоли:
- procedure None;
- Задана функция обратного вызова для события нажатия кнопки мыши:
- procedure None;
- Задана функция обратного вызова для события перемещения мыши:
- procedure None;
- Задана функция обратного вызова для события изменения размера окна:
- procedure None;
- Задана функция обратного вызова для события обновления окна:
- procedure None;
- Задана функция обратного вызова для события изменения размера шрифта:
- procedure None;
- Задана функция обратного вызова для события изменения стиля шрифта:
- procedure None;
- Задана функция обратного вызова для события изменения цвета шрифта:
- procedure None;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д