Как вывести максимальный элемент списка - Free Pascal

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

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

Листинг программы
  1. Program Stek;
  2. uses
  3. crt; {Для использования readkey и clrscr}
  4. type
  5. Tinf=real; {тип данных, который будет храниться в элементе стека}
  6. List=^TList; {Указатель на элемент типа TList}
  7. TList=record это наименование нашего типа "запись" обычно динамические структуры описываются через запись}
  8. data:TInf; {данные, хранимые в элементе}
  9. next:List; {указатель на следующий элемент}
  10. end;
  11. { тип данных - указатель на результат поиска }
  12. pResult=^TResult;
  13. { тип данных - результат поиска }
  14. TResult=record
  15. Addr:List;
  16. Position:integer;
  17. end;
  18.  
  19. {Процедура добавляющая элемент в стек}
  20. procedure AddElem(var stek1:List;znach1:TInf);
  21. var
  22. tmp:List;
  23. begin
  24. GetMem(tmp,sizeof(TList)); {выделяем в памяти место для нового элемента}
  25. tmp^.next:=stek1; {указатель на следующий элемент "направляем" на вершину стека}
  26. // tmp^.data:=znach1; {добавляем к элементу данные}
  27. //randomize;
  28. tmp^.data:=random; {добавляем к элементу данные}
  29. stek1:=tmp; {вершина стека изменилась, надо перенести и указатели на неё}
  30. end;
  31. { функция поиска максимального элемента в списке
  32. выдает указатель на него и его позицию от начала }
  33. function FindMax(var PBegin:List):pResult;
  34. var
  35. q:List;
  36. Max:real;
  37. MaxIndex:integer;
  38. cnt:integer;
  39. begin
  40. if PBegin<>nil then
  41. begin
  42. q:=PBegin;
  43. Max:=q^.data;
  44. MaxIndex:=1;
  45. cnt:=1;
  46. while q^.next<>nil do
  47. begin
  48. q:=q^.next;
  49. cnt:=cnt+1;
  50. if Max<q^.data then
  51. begin
  52. Max:=q^.data;
  53. MaxIndex:=cnt;
  54. end;
  55. end;
  56. FindMax^.Addr:=q;
  57. FindMax^.Position:=MaxIndex;
  58.  
  59. end
  60. else FindMax:=nil;
  61. end;
  62.  
  63. {Процедура вывода стека}
  64. procedure Print(stek1:List);
  65. begin
  66. if stek1=nil then {проверка на пустоту стека}
  67. begin
  68. writeln('Стек пуст.');
  69. exit;
  70. end;
  71. while stek1<>nil do {пока указатель stek1 не станет указывать в пустоту}
  72. begin это произойдёт как только он перейдёт по ссылке последнего элемента}
  73.  
  74. Writeln(stek1^.data:2, ' '); {выводить данне}
  75. stek1:=stek1^.next; переносить указатель вглубь по стеку}
  76. end;
  77. //Writeln('Максимальное значение списка',a[m]:2);
  78. end;
  79. {Процедура освобождения памяти занятой стеком}
  80. Procedure FreeStek(stek1:List);
  81. var
  82. tmp:List;
  83. begin
  84. while stek1<>nil do {пока stek1 не станет указывать в "пустоту" делать}
  85. begin
  86. tmp:=stek1; {указатель tmp направим на вершину стека}
  87. stek1:=stek1^.next; {вершину стека перенесём на следующий за данной вершиной элемент}
  88. FreeMem(tmp,SizeOf(Tlist)); {освободим память занятую под старую вершину}
  89. end;
  90. end;
  91.  
  92. {Поиск элемента в стеке по значению}
  93. Function SearchElemZnach(stek1:List;znach1:TInf):List;
  94. begin
  95. if stek1<>nil then {если стек не пуст, то}
  96. while (Stek1<>nil) and (znach1<>stek1^.data) do {пока stek1 не укажет в "пустоту" или пока мы не нашли нужный нам элемент}
  97. stek1:=stek1^.next; {переносить указатель}
  98. SearchElemZnach:=stek1;{функция возвращает указатель на найденный элемент}
  99. end; случае если элемент не найден, она вернёт nil}
  100.  
  101. {Процедура удаления элемента по указателю}
  102. Procedure DelElem(var stek1:List;tmp:List);
  103. var
  104. tmpi:List;
  105. begin
  106. if (stek1=nil) or (tmp=nil) then {если стек пуст или указатель никуда не указывает, то выходим}
  107. exit;
  108. if tmp=stek1 then {если мы удаляем элемент который является вершиной стека, то}
  109. begin
  110. stek1:=tmp^.next;{следует перенести вершину и}
  111. FreeMem(tmp,SizeOf(TList)); {высвободить память из под элемента}
  112. end
  113. else случае, если удаляемый элемент не вершина стека, то}
  114. begin
  115. tmpi:=stek1; {ставим указатель на вершину стека}
  116. while tmpi^.next<>tmp do {доходим до элемента стоящего "перед" тем, который нам следует удалить}
  117. tmpi:=tmpi^.next;
  118. tmpi^.next:=tmp^.next; {указатель элемента переносим на следующий элемент за удаляемым}
  119. FreeMem(tmp,sizeof(TList)); {удаляем элемент}
  120. end;
  121. end;
  122. {Процедура удаления элемента по значению}
  123. procedure DelElemZnach(var Stek1:List;znach1:TInf);
  124. var
  125. tmp:List;
  126. begin
  127. if Stek1=nil then {Если стек пуст, то выводим сообщение и выходим}
  128. begin
  129. Writeln('Стек пуст');
  130. exit;
  131. end;
  132. tmp:=SearchElemZnach(stek1,znach1); {tmp указывает на удаляемый элемент}
  133. if tmp=nil then {если элемент не был найден, то выводим сообщение и выходим}
  134. begin
  135. writeln('Элемент с искомым значением ' ,znach1, ' отсутствует в стеке.');
  136. exit;
  137. end;
  138. DelElem(stek1,tmp); {удаляем элемент из стека }
  139. Writeln('Элемент удалён.'); {сообщаем о выполнении действия}
  140. end;
  141. {Удаление элемента по порядковому номеру (вершина имеет номер 1)}
  142. Procedure DelElemPos(var stek1:List;posi:integer);
  143. var
  144. i:integer;
  145. tmp:List;
  146. begin
  147. if posi<1 then {проверка на ввод информации}
  148. exit;
  149. if stek1=nil then {если стек пуст}
  150. begin
  151. Write('Стек пуст');
  152. exit
  153. end;
  154. i:=1; {будет считать позиции}
  155. tmp:=stek1;
  156. while (tmp<>nil) and (i<>posi) do {пока tmp не укажет в "пустоту" или мы не найдём искомый элемент}
  157. begin
  158. tmp:=tmp^.next; {переходим на следующий элемент}
  159. inc(i) {увеличиваем значение счётчика}
  160. end;
  161. if tmp=nil then {если элемента нет выводим соответствующие сообщения и выходим}
  162. begin
  163. Writeln('Элемента с порядковым номером ' ,posi, ' нет в стеке.');
  164. writeln('В стеке ' ,i-1, ' элемента(ов).');
  165. exit
  166. end;
  167. DelElem(stek1,tmp); {если мы не вышли, то элемент есть и его следует удалить}
  168. Writeln('Элемент удалён.'); {сообщаем о выполнении действия}
  169. end;
  170.  
  171. {Процедура сортировки "пузырьком" с изменением только адресов}
  172. procedure SortBublLink(nach:List);
  173. var
  174. tmp,pered,pered1,pocle,rab:List; {все рабочие ссылки}
  175. begin
  176. rab:=nach; {становимся на вершину стека}
  177. while rab<>nil do{пока не конец стека делать}
  178. begin
  179. tmp:=rab^.next; {переходим к следующему за сортируемым элементу}
  180. while tmp<>nil do {пока не конец стека делать}
  181. begin
  182. if tmp^.data<rab^.data then {если следует произвести замену, то}
  183. begin
  184. pered:=nach; {становимся в вершину стека}
  185. pered1:=nach; {становимся в вершину стека}
  186. if rab<>nach then {если мы не стоим на изменяемом элементе, то}
  187. while pered^.next<>rab do pered:=pered^.next; {станем на элементе перед изменяемым}
  188. while pered1^.next<>tmp do pered1:=pered1^.next; {станем на элементе перед изменяемым, который находится за
  189. первым изменяемым}
  190. pocle:=tmp^.next; {запоминаем адрес элемента после второго изменяемого}
  191. if rab^.next=tmp then {если элементы "соседи", то}
  192. begin
  193. tmp^.next:=rab; {меняем ссылки, тут если не понятно рисуйте на листочке}
  194. rab^.next:=pocle
  195. end
  196. else случае если элементы не соседи, то}
  197. begin
  198. tmp^.next:=rab^.next;{меняем ссылки, тут если не понятно рисуйте на листочке}
  199. rab^.next:=pocle;
  200. end;
  201. if pered1<>rab then{советую просмотреть на листочке}
  202. pered1^.next:=rab;
  203. if rab<>nach then{советую просмотреть на листочке}
  204. pered^.next:=tmp
  205. else{всё советую просмотреть на листочке}
  206. nach:=tmp;
  207. pered1:=tmp;{советую просмотреть на листочке}
  208. tmp:=rab;{советую просмотреть на листочке}
  209. rab:=pered1;{советую просмотреть на листочке}
  210. end;
  211. tmp:=tmp^.next; {переходим на следующий элемент}
  212. end;
  213. rab:=rab^.next;{переходим на следующий элемент}
  214. end;
  215. end;
  216.  
  217. {Процедура сортировки "пузырьком" с изменением только данных}
  218. procedure SortBublInf(nach:list);
  219. var
  220. tmp,rab:List;
  221. tmps:Tinf;
  222. begin
  223. GetMem(tmp,SizeOf(Tlist)); {выделяем память для рабочего "буфера" обмена}
  224. rab:=nach; {рабочая ссылка, становимся на вершину стека}
  225. while rab<>nil do {пока мы не дойдём до конца стека делать}
  226. begin
  227. tmp:=rab^.next; {перейдём на следующий элемент}
  228. while tmp<>nil do {пока не конец стека делать}
  229. begin
  230. if tmp^.data<rab^.data then {проверяем следует ли менять элементы}
  231. begin
  232. tmps:=tmp^.data; {стандартная замена в 3 операции}
  233. tmp^.data:=rab^.data;
  234. rab^.data:=tmps
  235. end;
  236. tmp:=tmp^.next {переход к следующему элементу}
  237. end;
  238. rab:=rab^.next {переход к следующему элементу}
  239. end
  240. end;
  241. var
  242. Stk, {переменная, которая всегда будет указывать на "вершину" стека}
  243. tmpl:List; {рабочая переменная}
  244. znach:Tinf; {данные вводимые пользователем}
  245. nn,ip:integer;
  246. ch:char; {для работы менюшки}
  247. MaxL1:pResult;
  248. begin
  249. Stk:=nil;
  250. repeat {цикл для нашего меню}
  251. clrscr; {очистка экрана, далее идёт вывод самого меню}
  252. Write('Программа для работы со ');
  253. Textcolor(4);
  254. Writeln('стеком.');
  255. Textcolor(7);
  256.  
  257. Writeln('Выберите желаемое действие:');
  258. Writeln('1) Добавить элемент.');
  259. Writeln('2) Вывод стека.');
  260. Writeln('3) Удаление элемента по значению.');
  261. Writeln('4) Удаление элемента по порядковому номеру.');
  262. Writeln('5) Поиск элемента по значению');
  263. Writeln('6) Сортировка стека методом "Пузырька", меняя только данные.');
  264. Writeln('7) Сортировка стека с изменением адресов.');
  265. Writeln('8) Выход.');
  266. ch:=readkey; {ожидаем нажатия клавиши}
  267.  
  268. case ch of {выбираем клавишу}
  269. '1':begin
  270. // write('Введите значение добавляемого элемента: ');
  271. write('Введите количество элементов для добавления в список: ');
  272. readln(nn); {считываем значение добавляемого нового элемент}
  273. randomize;
  274. for ip:= 1 to nn do
  275. begin
  276. AddElem(Stk,nn);
  277. end;
  278. MaxL1:= FindMax(Stk);
  279. writeln('L1 maximal element: ');
  280. writeln(MaxL1^.Addr^.data:2);
  281. readkey;{ожидаем нажатия клавиши}
  282. end;
  283. '2':begin
  284. clrscr; {очистка экрана}
  285. Print(Stk); {вызов процедуры вывода}
  286. readkey; {ожидаем нажатия клавиши}
  287. end;
  288.  
  289. '3':begin
  290. Write('Введите значение удаляемого элемента: ');
  291. readln(nn); {ввод значения удаляемого элемента}
  292. DelElemZnach(Stk,nn); {вызов процедуры удаления элемента по значению}
  293. readkey;{ожидаем нажатия клавиши}
  294. end;
  295.  
  296. '4':begin
  297. Write('Введите порядковый номер удаляемого элемента: ');
  298. readln(nn); {ввод позиции удаляемого файла}
  299. DelElemPos(Stk,nn);{вызов процедуры удаления элемента по значению}
  300. readkey;{ожидаем нажатия клавиши}
  301. end;
  302.  
  303. '5':begin
  304. write('Введите значение искомого элемента: ');
  305. readln(nn); {ввод искомого значения}
  306. tmpl:=SearchElemZnach(Stk,nn); {вызываем процедуру поиска элемента по значению}
  307. if tmpl=nil then {проверяем найден ли элемент и выводим соответствующие сообщения}
  308. write('Искомый элемент отсутствует в стеке')
  309. else
  310. write('Элемент ',tmpl^.data,' найден');
  311. readkey;{ожидаем нажатия клавиши}
  312. end;
  313. '6':begin
  314. if Stk=nil then {проверяем не пустой ли стек}
  315. begin
  316. Write('Стек пуст.');
  317. readkey{ожидаем нажатия клавиши}
  318. end
  319. else
  320. begin
  321. SortBublInf(Stk);{вызов процедуры сортировки стека с изменением данных}
  322. Write('Стек отсортирован.');
  323. readkey;{ожидаем нажатия клавиши}
  324. end;
  325. end;
  326. '7':begin
  327. if Stk=nil then{проверяем не пустой ли стек}
  328. begin
  329. Write('Стек пуст.');
  330. readkey{ожидаем нажатия клавиши}
  331. end
  332. else
  333. begin
  334. SortBublLink(Stk);{вызов процедуры сортировки стека с изменением адресов}
  335. Write('Стек отсортирован.');
  336. readkey;{ожидаем нажатия клавиши}
  337. end;
  338. end;
  339. end;
  340.  
  341. until ch='8';
  342. FreeStek(Stk); {освобождаем память занятую стеком}
  343. end.
Вроде после нажатия цифры 1,создается список и выводиться максимальный элемент.Только он не верный. И как мне в меню добавить скажем цифру 9 для поиска и вывода максимального элемента?

Решение задачи: «Как вывести максимальный элемент списка»

textual
Листинг программы
  1. program test;
  2.  
  3. type
  4.   RType = record
  5.     a: integer;
  6.     b: char;
  7.   end;
  8.   PType = ^RType;
  9. var
  10.   X: PType;
  11. begin
  12.   //new(X);
  13.   X^.a := 10;
  14.   X^.b := 'S';
  15.   //dispose(X);
  16. end.

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

В данном коде определен тип данных RType, который является записью (record) и содержит две поля: a типа integer и b типа char. Также определен указатель на тип RType — PType. Затем объявлена переменная X типа PType. В комментариях указано, что можно использовать оператор new для выделения памяти под переменную X, но в данном коде он не используется. Затем поля X^.a и X^.b присваиваются значения 10 и 'S' соответственно. Знак ^ используется для обращения к полям записи, удерживаемой указателем. В конце комментария указано, что можно использовать оператор dispose для освобождения памяти, выделенной под переменную X, но в данном коде он также не используется. Таким образом, код создает переменную X типа PType, заполняет ее поля значениями 10 и 'S', но не освобождает память после ее использования.

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


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

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

8   голосов , оценка 3.5 из 5

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

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

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