Связные списки, переписать код с использованием Case - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Препода не устраивает "простыня" вот в этом куске. требует переписать кейсами, но как-то не ахти получается, выручите пожалуйста
Листинг программы
  1. procedure mousedown(x, y, mb: integer); // обработчик событий мыши(кнопки, операции, цвета и все все и меню)
  2. begin
  3. if ((x >= 0) and (x < 150) and (y >= 0) and (y < 30)) then
  4. begin
  5. op := 1;
  6. setpencolor(clred);
  7. drawrectangle(0, 0, 150, 30);
  8. setpencolor(clblack);
  9. drawrectangle(150, 0, 300, 30);
  10. drawrectangle(300, 0, 450, 30);
  11. drawrectangle(450, 0, 600, 30);
  12. drawrectangle(600, 0, 750, 30);
  13. drawrectangle(750, 0, 900, 30);
  14. end else
  15. if ((x >= 150) and (x < 300) and (y >= 0) and (y < 30)) then
  16. begin
  17. op := 2;
  18. setpencolor(clred);
  19. drawrectangle(150, 0, 300, 30);
  20. setpencolor(clblack);
  21. drawrectangle(0, 0, 150, 30);
  22. drawrectangle(300, 0, 450, 30);
  23. drawrectangle(450, 0, 600, 30);
  24. drawrectangle(600, 0, 750, 30);
  25. drawrectangle(750, 0, 900, 30);
  26. end else
  27. if ((x >= 300) and (x < 450) and (y >= 0) and (y < 30)) then
  28. begin
  29. op := 3;
  30. setpencolor(clred);
  31. drawrectangle(300, 0, 450, 30);
  32. setpencolor(clblack);
  33. drawrectangle(150, 0, 300, 30);
  34. drawrectangle(0, 0, 150, 30);
  35. drawrectangle(450, 0, 600, 30);
  36. drawrectangle(600, 0, 750, 30);
  37. drawrectangle(750, 0, 900, 30);
  38. end else
  39. if ((x >= 450) and (x < 600) and (y >= 0) and (y < 30)) then
  40. begin
  41. op := 4;
  42. setpencolor(clred);
  43. drawrectangle(450, 0, 600, 30);
  44. setpencolor(clblack);
  45. drawrectangle(150, 0, 300, 30);
  46. drawrectangle(300, 0, 450, 30);
  47. drawrectangle(0, 0, 150, 30);
  48. drawrectangle(600, 0, 750, 30);
  49. drawrectangle(750, 0, 900, 30);
  50. redrawall(head);
  51. op := 1;
  52. setpencolor(clred);
  53. drawrectangle(0, 0, 150, 30);
  54. setpencolor(clblack);
  55. drawrectangle(150, 0, 300, 30);
  56. drawrectangle(300, 0, 450, 30);
  57. drawrectangle(450, 0, 600, 30);
  58. drawrectangle(600, 0, 750, 30);
  59. drawrectangle(750, 0, 900, 30);
  60. setpencolor(clred);
  61. drawrectangle(5, 55, 45, 95);
  62. setpencolor(clblack);
  63. clr := clyellow;
  64. drawrectangle(5, 95, 45, 135);
  65. drawrectangle(5, 135, 45, 175);
  66. drawrectangle(5, 175, 45, 215);
  67. drawrectangle(5, 215, 45, 255);
  68. drawrectangle(5, 255, 45, 295);
  69. drawrectangle(5, 295, 45, 335);
  70. drawrectangle(5, 335, 45, 375);
  71. drawrectangle(5, 375, 45, 415);
  72. drawrectangle(5, 415, 45, 455);
  73. end else
  74. if ((x >= 600) and (x < 750) and (y >= 0) and (y < 30)) then
  75. begin
  76. op := 5;
  77. setpencolor(clred);
  78. drawrectangle(600, 0, 750, 30);
  79. setpencolor(clblack);
  80. drawrectangle(150, 0, 300, 30);
  81. drawrectangle(300, 0, 450, 30);
  82. drawrectangle(450, 0, 600, 30);
  83. drawrectangle(0, 0, 150, 30);
  84. drawrectangle(750, 0, 900, 30);
  85. deleteall(head);
  86. op := 1;
  87. setpencolor(clred);
  88. drawrectangle(0, 0, 150, 30);
  89. setpencolor(clblack);
  90. drawrectangle(150, 0, 300, 30);
  91. drawrectangle(300, 0, 450, 30);
  92. drawrectangle(450, 0, 600, 30);
  93. drawrectangle(600, 0, 750, 30);
  94. drawrectangle(750, 0, 900, 30);
  95. setpencolor(clred);
  96. drawrectangle(5, 55, 45, 95);
  97. setpencolor(clblack);
  98. clr := clyellow;
  99. drawrectangle(5, 95, 45, 135);
  100. drawrectangle(5, 135, 45, 175);
  101. drawrectangle(5, 175, 45, 215);
  102. drawrectangle(5, 215, 45, 255);
  103. drawrectangle(5, 255, 45, 295);
  104. drawrectangle(5, 295, 45, 335);
  105. drawrectangle(5, 335, 45, 375);
  106. drawrectangle(5, 375, 45, 415);
  107. drawrectangle(5, 415, 45, 455);
  108. end else
  109. if ((x >= 750) and (x <= 900) and (y >= 0) and (y < 30)) then
  110. ext else
  111. if ((x >= 5) and (x <= 45) and (y >= 55) and (y < 95)) then
  112. begin
  113. setpencolor(clred);
  114. drawrectangle(5, 55, 45, 95);
  115. setpencolor(clblack);
  116. clr := clyellow;
  117. drawrectangle(5, 95, 45, 135);
  118. drawrectangle(5, 135, 45, 175);
  119. drawrectangle(5, 175, 45, 215);
  120. drawrectangle(5, 215, 45, 255);
  121. drawrectangle(5, 255, 45, 295);
  122. drawrectangle(5, 295, 45, 335);
  123. drawrectangle(5, 335, 45, 375);
  124. drawrectangle(5, 375, 45, 415);
  125. drawrectangle(5, 415, 45, 455);
  126. end else
  127. if ((x >= 5) and (x <= 45) and (y >= 95) and (y < 135)) then
  128. begin
  129. setpencolor(clred);
  130. drawrectangle(5, 95, 45, 135);
  131. setpencolor(clblack);
  132. drawrectangle(5, 55, 45, 95);
  133. clr := clgreen;
  134. drawrectangle(5, 135, 45, 175);
  135. drawrectangle(5, 175, 45, 215);
  136. drawrectangle(5, 215, 45, 255);
  137. drawrectangle(5, 255, 45, 295);
  138. drawrectangle(5, 295, 45, 335);
  139. drawrectangle(5, 335, 45, 375);
  140. drawrectangle(5, 375, 45, 415);
  141. drawrectangle(5, 415, 45, 455);
  142. end else
  143. if ((x >= 5) and (x <= 45) and (y >= 135) and (y < 175)) then
  144. begin
  145. setpencolor(clred);
  146. drawrectangle(5, 135, 45, 175);
  147. setpencolor(clblack);
  148. drawrectangle(5, 55, 45, 95);
  149. drawrectangle(5, 95, 45, 135);
  150. clr := clblue;
  151. drawrectangle(5, 175, 45, 215);
  152. drawrectangle(5, 215, 45, 255);
  153. drawrectangle(5, 255, 45, 295);
  154. drawrectangle(5, 295, 45, 335);
  155. drawrectangle(5, 335, 45, 375);
  156. drawrectangle(5, 375, 45, 415);
  157. drawrectangle(5, 415, 45, 455);
  158. end else
  159. if ((x >= 5) and (x <= 45) and (y >= 175) and (y < 215)) then
  160. begin
  161. setpencolor(clred);
  162. drawrectangle(5, 175, 45, 215);
  163. setpencolor(clblack);
  164. drawrectangle(5, 55, 45, 95);
  165. drawrectangle(5, 95, 45, 135);
  166. drawrectangle(5, 135, 45, 175);
  167. clr := clsilver;
  168. drawrectangle(5, 215, 45, 255);
  169. drawrectangle(5, 255, 45, 295);
  170. drawrectangle(5, 295, 45, 335);
  171. drawrectangle(5, 335, 45, 375);
  172. drawrectangle(5, 375, 45, 415);
  173. drawrectangle(5, 415, 45, 455);
  174. end else
  175. if ((x >= 5) and (x <= 45) and (y >= 215) and (y < 255)) then
  176. begin
  177. setpencolor(clred);
  178. drawrectangle(5, 215, 45, 255);
  179. setpencolor(clblack);
  180. drawrectangle(5, 55, 45, 95);
  181. drawrectangle(5, 95, 45, 135);
  182. drawrectangle(5, 135, 45, 175);
  183. drawrectangle(5, 175, 45, 215);
  184. clr := clorange;
  185. drawrectangle(5, 255, 45, 295);
  186. drawrectangle(5, 295, 45, 335);
  187. drawrectangle(5, 335, 45, 375);
  188. drawrectangle(5, 375, 45, 415);
  189. drawrectangle(5, 415, 45, 455);
  190. end else
  191. if ((x >= 5) and (x <= 45) and (y >= 255) and (y < 295)) then
  192. begin
  193. setpencolor(clred);
  194. drawrectangle(5, 255, 45, 295);
  195. setpencolor(clblack);
  196. drawrectangle(5, 55, 45, 95);
  197. drawrectangle(5, 95, 45, 135);
  198. drawrectangle(5, 135, 45, 175);
  199. drawrectangle(5, 175, 45, 215);
  200. drawrectangle(5, 215, 45, 255);
  201. clr := clbrown;
  202. drawrectangle(5, 295, 45, 335);
  203. drawrectangle(5, 335, 45, 375);
  204. drawrectangle(5, 375, 45, 415);
  205. drawrectangle(5, 415, 45, 455);
  206. end else
  207. if ((x >= 5) and (x <= 45) and (y >= 295) and (y < 335)) then
  208. begin
  209. setpencolor(clred);
  210. drawrectangle(5, 295, 45, 335);
  211. setpencolor(clblack);
  212. drawrectangle(5, 55, 45, 95);
  213. drawrectangle(5, 95, 45, 135);
  214. drawrectangle(5, 135, 45, 175);
  215. drawrectangle(5, 175, 45, 215);
  216. drawrectangle(5, 215, 45, 255);
  217. drawrectangle(5, 255, 45, 295);
  218. clr := clcyan;
  219. drawrectangle(5, 335, 45, 375);
  220. drawrectangle(5, 375, 45, 415);
  221. drawrectangle(5, 415, 45, 455);
  222. end else
  223. if ((x >= 5) and (x <= 45) and (y >= 335) and (y < 375)) then
  224. begin
  225. setpencolor(clred);
  226. drawrectangle(5, 335, 45, 375);
  227. setpencolor(clblack);
  228. drawrectangle(5, 55, 45, 95);
  229. drawrectangle(5, 95, 45, 135);
  230. drawrectangle(5, 135, 45, 175);
  231. drawrectangle(5, 175, 45, 215);
  232. drawrectangle(5, 215, 45, 255);
  233. drawrectangle(5, 255, 45, 295);
  234. drawrectangle(5, 295, 45, 335);
  235. clr := clmagenta;
  236. drawrectangle(5, 375, 45, 415);
  237. drawrectangle(5, 415, 45, 455);
  238. end else
  239. if ((x >= 5) and (x <= 45) and (y >= 375) and (y < 415)) then
  240. begin
  241. setpencolor(clred);
  242. drawrectangle(5, 375, 45, 415);
  243. setpencolor(clblack);
  244. drawrectangle(5, 55, 45, 95);
  245. drawrectangle(5, 95, 45, 135);
  246. drawrectangle(5, 135, 45, 175);
  247. drawrectangle(5, 175, 45, 215);
  248. drawrectangle(5, 215, 45, 255);
  249. drawrectangle(5, 255, 45, 295);
  250. drawrectangle(5, 295, 45, 335);
  251. drawrectangle(5, 335, 45, 375);
  252. clr := clgold;
  253. drawrectangle(5, 415, 45, 455);
  254. end else
  255. if ((x >= 5) and (x <= 45) and (y >= 415) and (y < 455)) then
  256. begin
  257. setpencolor(clred);
  258. drawrectangle(5, 415, 45, 455);
  259. setpencolor(clblack);
  260. drawrectangle(5, 55, 45, 95);
  261. drawrectangle(5, 95, 45, 135);
  262. drawrectangle(5, 135, 45, 175);
  263. drawrectangle(5, 175, 45, 215);
  264. drawrectangle(5, 215, 45, 255);
  265. drawrectangle(5, 255, 45, 295);
  266. drawrectangle(5, 295, 45, 335);
  267. drawrectangle(5, 335, 45, 375);
  268. drawrectangle(5, 375, 45, 415);
  269. clr := clpurple;
  270. end else
  271. if ((x >= 855) and (x <= 895) and (y >= 55) and (y < 95)) then
  272. begin
  273. setpencolor(clred);
  274. drawrectangle(855, 55, 895, 95);
  275. setpencolor(clblack);
  276. mrkr := 1;
  277. drawrectangle(855, 95, 895, 135);
  278. drawrectangle(855, 135, 895, 175);
  279. drawrectangle(855, 175, 895, 215);
  280. drawrectangle(855, 215, 895, 255);
  281. end else
  282. if ((x >= 855) and (x <= 895) and (y >= 135) and (y < 175)) then
  283. begin
  284. setpencolor(clred);
  285. drawrectangle(855, 135, 895, 175);
  286. setpencolor(clblack);
  287. drawrectangle(855, 55, 895, 95);
  288. drawrectangle(855, 95, 895, 135);
  289. mrkr := 2;
  290. drawrectangle(855, 175, 895, 215);
  291. drawrectangle(855, 215, 895, 255);
  292. end else
  293. if ((x >= 855) and (x <= 895) and (y >= 215) and (y <= 255)) then
  294. begin
  295. setpencolor(clred);
  296. drawrectangle(855, 215, 895, 255);
  297. setpencolor(clblack);
  298. drawrectangle(855, 55, 895, 95);
  299. drawrectangle(855, 95, 895, 135);
  300. drawrectangle(855, 135, 895, 175);
  301. drawrectangle(855, 175, 895, 215);
  302. mrkr := 3;
  303. end else
  304. if ((x > 55) and (x < 845) and (y > 40) and (y < 490)) then
  305. if op = 1 then begin
  306. newnode(x, y, clr, mrkr);
  307. drawnode(p);
  308. end else
  309. if op = 2 then
  310. deletenode(x, y, head)
  311. else
  312. if op = 3 then
  313. movenode(x, y, head);
  314. end;

Решение задачи: «Связные списки, переписать код с использованием Case»

textual
Листинг программы
  1. uses GraphABC;
  2.  
  3. var
  4.   MouseX, MouseY : Integer;
  5.   myProcedure : procedure;
  6.  
  7. type
  8.   /// Кнопка
  9.   tButton = class
  10.   private
  11.     X, Y, Width, Height : Integer;
  12.     Text : String;
  13.     btnSelect : Boolean;
  14.     proc : procedure;
  15.    
  16.     procedure Show;
  17.     begin
  18.       if btnSelect then
  19.         begin
  20.           Brush.Color := RGB(128, 128, 255);
  21.           Font.Color := RGB(255, 255, 0);
  22.         end
  23.       else
  24.         begin
  25.           Brush.Color := RGB(192, 192, 192);
  26.           Font.Color := RGB(255, 255, 0);
  27.         end;
  28.       Font.Style := fsBold;
  29.  
  30.       FillRectangle(X, Y, X + Width, Y + Height);
  31.       DrawTextCentered(X + 1, Y + 1, X + Width - 1, Y + Height - 1, Text);
  32.     end;
  33.  
  34.     constructor Create(X, Y, Width, Height : Integer; Text : String; proc : procedure);
  35.     begin
  36.       Self.X := X; Self.Y := Y; Self.Width := Width; Self.Height := Height;
  37.       Self.Text := Text; btnSelect := False;
  38.       Self.proc := proc;
  39.       Show;
  40.     end;
  41.    
  42.     procedure Select;
  43.     begin
  44.       btnSelect := Not btnSelect;
  45.       Show;
  46.       if btnSelect then
  47.         myProcedure := proc;
  48.     end;
  49.    
  50.     function MouseDown(mouseX, mouseY : Integer) := (mouseX > X) and (mouseX < X + Width) and (mouseY > Y) and (mouseY < Y + Height);
  51.   end;
  52.  
  53. procedure Slider;
  54. begin
  55.   PutPixel(MouseX, MouseY, clBlack);
  56. end;
  57.  
  58. procedure None;
  59. begin
  60. end;
  61.  
  62. const
  63.   btnsCount = 2;
  64.  
  65. var
  66.   btns : array [1..btnsCount] of tButton;
  67.  
  68. procedure MouseDown(x, y, mb : Integer);
  69. begin
  70.   // Может это кнопка?
  71.   for var num := 1 to btnsCount do
  72.     if btns[num].MouseDown(x, y) then
  73.       begin
  74.         btns[num].Select; // Эту включим
  75.         for var i := 1 to btnsCount do
  76.           if (i <> num) and btns[i].btnSelect then
  77.             btns[i].Select; // Другие погасим
  78.         Exit; // Событие отловлено. Другие не нужны
  79.       end;
  80.      
  81.   // Обработка других событий    
  82. end;
  83.  
  84. procedure MouseMove(x, y, mb : Integer);
  85. begin
  86.   MouseX := X;
  87.   MouseY := Y;
  88.   myProcedure;
  89. end;
  90.  
  91. begin
  92.   SetWindowSize(900, 500);
  93.  
  94.   myProcedure := None;
  95.  
  96.   btns[1] := New tButton(  2, 2, 180, 20, 'Создать маркер', Slider);
  97.   btns[2] := New tButton(202, 2, 180, 20, 'Удалить маркер', None  );
  98.  
  99.   OnMouseDown := MouseDown;
  100.   OnMouseMove := MouseMove;
  101.  
  102. end.

Объяснение кода листинга программы

  1. Объявлены переменные:
    • 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);
  2. Создано описание класса 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;
  3. Инициализированы кнопки:
    • btns[1] := New tButton(  2, 2, 180, 20, 'Создать маркер', Slider);
    • btns[2] := New tButton(202, 2, 180, 20, 'Удалить маркер', None  );
  4. Задана функция обратного вызова для событий мыши:
    • procedure MouseDown(x, y, mb : Integer);
    • procedure MouseMove(x, y, mb : Integer);
  5. Задана функция обратного вызова для события создания окна:
    • procedure None;
  6. Задана функция обратного вызова для события закрытия окна:
    • procedure None;
  7. Задана функция обратного вызова для события обновления окна:
    • procedure None;
  8. Задана функция обратного вызова для события вставки текста:
    • procedure None;
  9. Задана функция обратного вызова для события удаления текста:
    • procedure None;
  10. Задана функция обратного вызова для события нажатия клавиши:
    • procedure None;
  11. Задана функция обратного вызова для события прокрутки:
    • procedure None;
  12. Задана функция обратного вызова для события изменения размера окна:
    • procedure None;
  13. Задана функция обратного вызова для события закрытия консоли:
    • procedure None;
  14. Задана функция обратного вызова для события нажатия кнопки мыши:
    • procedure None;
  15. Задана функция обратного вызова для события перемещения мыши:
    • procedure None;
  16. Задана функция обратного вызова для события изменения размера окна:
    • procedure None;
  17. Задана функция обратного вызова для события обновления окна:
    • procedure None;
  18. Задана функция обратного вызова для события изменения размера шрифта:
    • procedure None;
  19. Задана функция обратного вызова для события изменения стиля шрифта:
    • procedure None;
  20. Задана функция обратного вызова для события изменения цвета шрифта:
    • procedure None;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы