Составить новый дек, записывая в него элементы исходного дека, изымая их поочередно слева и справа - Turbo Pascal

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

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

Дан дек строковых элементов. Составить новый дек, записывая в него элементы исходного дека, изымая их поочередно слева и справа.Помогите с подпрограммой. Вот модуль
Листинг программы
  1. Unit IDeck;
  2. Interface
  3. type
  4. TUnsignedInt = word;
  5. TSignedInt = integer;
  6. tShortUnsignedInt = byte;
  7. TIndex1 = TUnsignedInt;
  8. TIndex2 = TUnsignedInt;
  9. TElem = char;
  10. pDec = ^cDec;
  11. cDec = Object
  12.  
  13. Private
  14. nmax:TSignedInt;
  15. head,tail:TUnsignedInt;
  16. p:pointer;
  17. ERRORCODE:tShortUnsignedInt;
  18. z:integer;
  19. Public
  20. Constructor Init(n:TSignedInt);
  21. Constructor Copy(pq:Pdec);
  22. Destructor Done;
  23. Procedure makeEmpty;
  24. Function IsEmpty:boolean;
  25. function isFull:boolean;
  26. procedure Addl(x:Telem);
  27. procedure Addr(x:Telem);
  28. procedure RemoveL(var x:Telem);
  29. procedure RemoveR(var x:Telem);
  30. procedure SeeHead(var x:Telem);
  31. procedure SeeRight(var x:Telem);
  32. procedure ChangeHead(x:telem);
  33. procedure ChangeRight(x:telem);
  34. procedure writeDec(n:TSignedInt; var x:telem);
  35. procedure DelHead;
  36. procedure DelRight;
  37. // procedure Delete;
  38. end;
  39. Implementation
  40. {$Q+} {$R-}
  41. uses
  42. CRT;
  43. type
  44. tArr = array [0..0] of Telem;
  45. Parr = ^tArr;
  46. PBlock=^Tblock;
  47. Tblock = Record
  48. data:Telem;
  49. next:Pblock;
  50. end;
  51. Const
  52. SElem = sizeof (TElem) ;
  53. SegmentSize = 65520;
  54. Constructor cDec.Init(n:TSignedInt);
  55. var need:longInt; x:telem;
  56. begin
  57. need:=longint(n+2)*sizeOf(tElem);
  58. getmem(p,need);
  59. nmax:=n+1;
  60. head:=0;
  61. tail:=0;
  62. // x:= Pkey^[head];
  63. //x:=pblock(p)^.data;
  64. end;
  65. Constructor cdec.Copy(pq:Pdec);
  66. var need:longint; i:integer;
  67. begin
  68. need:=longint (pq^.nmax+1) * sizeof(Telem);
  69. getmem(p, need);
  70. nmax:=pq^.nmax;
  71. head:=pq^.head;
  72. tail:=pq^.tail;
  73. i:=head;
  74. while i<>tail do
  75. begin
  76. parr(p)^[i]:=parr(pq^.p)^[i];
  77. i:=(i+1) mod nmax;
  78. end;
  79. end;
  80. Destructor cDec.done;
  81. var need:longint;
  82. begin
  83. need:=longint(nmax)*sizeof(Telem);
  84. freemem(p,need);
  85. end;
  86. Procedure cDec.makeEmpty;
  87. begin
  88. head:=0;
  89. tail:=0;
  90. end;
  91. Function cDec.IsEmpty:boolean;
  92. begin
  93. isEmpty:=(head=tail);
  94. end;
  95. Function cDec.IsFull:boolean;
  96. begin
  97. isFull:=(head=(tail+1) mod nmax);
  98. end;
  99. procedure cDec.addl(x:Telem);
  100. begin
  101. if isFull then ErrorCode:= 2
  102. else
  103. begin
  104. ERRORCODE := 0;
  105. head:=((head-1)+nmax) mod nmax;
  106. Parr(p)^[head]:=x;
  107. end;
  108. end;
  109. procedure cDec.addr(x:Telem);
  110. begin
  111. if isFull then ErrorCode:= 2
  112. else
  113. begin
  114. ERRORCODE := 0;
  115. Parr(p)^[tail]:=x;
  116. tail:=(tail+1) mod nmax;
  117. end;
  118. end;
  119. procedure cDec.RemoveL(var x:tElem);
  120. begin
  121. if isEmpty then ErrorCode:=2
  122. else
  123. begin
  124. ErrorCode:=0;
  125. x:=parr(p)^[head];
  126. head:=(head+1) mod nmax;
  127. end;
  128. end;
  129. procedure cDec.RemoveR(var x:tElem);
  130. begin
  131. if isEmpty then ErrorCode:=2
  132. else
  133. begin
  134. ErrorCode:=0;
  135. x:=parr(p)^[tail-1];
  136. tail:=(tail-1) mod nmax;
  137. end;
  138. end;
  139.  
  140. procedure cDec.SeeHead(var x:Telem);
  141. begin
  142. if isEmpty then ErrorCode:=2
  143. else
  144. begin
  145. ErrorCode:=0;
  146. x:=parr(p)^[head];
  147. end;
  148. end;
  149. procedure cDec.SeeRight(var x:Telem);
  150. begin
  151. if isEmpty then ErrorCode:=2
  152. else
  153. begin
  154. ErrorCode:=0;
  155. x:=parr(p)^[tail];
  156. end;
  157. end;
  158. procedure cDec.ChangeHead(x:Telem);
  159. begin
  160. if isEmpty then ErrorCode:=2
  161. else
  162. begin
  163. ErrorCode:=0;
  164. parr(p)^[head]:=x;
  165. end
  166. end;
  167. procedure cDec.ChangeRight(x:Telem);
  168. begin
  169. if isEmpty then ErrorCode:=2
  170. else
  171. begin
  172. ErrorCode:=0;
  173. parr(p)^[tail]:=x;
  174. end
  175. end;
  176. procedure cDec.DelHead;
  177. begin
  178. if isEmpty then ErrorCode:=2
  179. else
  180. begin
  181. ErrorCode:=0;
  182. head:=(head+1) mod nmax;
  183. end
  184. end;
  185. procedure cDec.DelRight;
  186. begin
  187. if isEmpty then ErrorCode:=2
  188. else
  189. begin
  190. ErrorCode:=0;
  191. tail:=(tail-1) mod nmax;
  192. end;
  193. end;
  194. procedure cDec.writeDec(n:TSignedInt; var x:telem);
  195. begin
  196. if isEmpty then ErrorCode:=2
  197. else
  198. begin
  199. ErrorCode:=0;
  200. x:=parr(p)^[tail-n];
  201. end;
  202. end;
  203. End.

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

textual
Листинг программы
  1. uses IDeck;
  2. const n=10;
  3. var
  4.   a, b: pDec; t: TElem;
  5. begin
  6.   {...}
  7.   b:=New(pDec,Init(n));
  8.   repeat
  9.     if not a.IsEmpty then begin a.RemoveL(t); b.AddR(t); end;
  10.     if not a.IsEmpty then begin a.RemoveR(t); b.AddR(t); end;
  11.   until False;
  12.   {...}
  13.    Dispose(b,Done);
  14. end.

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

  1. В начале кода используется библиотека IDeck, которая представляет собой реализацию дека.
  2. Константа n определяет количество элементов в деках, которые будут использоваться в коде.
  3. Переменные a и b объявлены как pDec-переменные, которые представляют собой ссылки на объекты типа pDec.
  4. Переменная t объявлена как TElem-переменная, которая представляет собой элемент типа pDec.
  5. Строка кода b:=New(pDec,Init(n)); создает новый объект типа pDec и инициализирует его с n элементами.
  6. Цикл repeat используется для повторного выполнения блока кода до тех пор, пока условие False не станет истинным.
  7. Если переменная a не пуста (a.IsEmpty = False), то из нее удаляется левый элемент (a.RemoveL(t)) и добавляется правый элемент (b.AddR(t)) в дек b.
  8. Если переменная a не пуста (a.IsEmpty = False), то из нее удаляется правый элемент (a.RemoveR(t)) и добавляется левый элемент (b.AddR(t)) в дек b.
  9. Цикл повторяется до тех пор, пока условие False не станет истинным.
  10. По завершении работы с объектом b, он освобождается с помощью функции Dispose(b, Done).

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


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

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

11   голосов , оценка 3.909 из 5

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

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

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