"Перевести" код - PascalABC.NET
Формулировка задачи:
Нашел на сайте код стека, но он на турбо паскале 7.0
Подскажите, как его перевести в АBC.Net, а то я не бум-бум в паскале, но код нужен...
Спасибо
Решение задачи: «"Перевести" код»
textual
Листинг программы
Program Stek; uses crt; {Для использования readkey и clrscr} type Tinf=integer; {тип данных, который будет храниться в элементе стека} List=^TList; {Указатель на элемент типа TList} TList=record {А это наименование нашего типа "запись" обычно динамические структуры описываются через запись} data:TInf; {данные, хранимые в элементе} next:List; {указатель на следующий элемент} end; {Процедура добавляющая элемент в стек} procedure AddElem(var stek1:List;znach1:TInf); var tmp:List; begin new(tmp); //GetMem(tmp,sizeof(TList)); {выделяем в памяти место для нового элемента} tmp^.next:=stek1; {указатель на следующий элемент "направляем" на вершину стека} tmp^.data:=znach1; {добавляем к элементу данные} stek1:=tmp; {вершина стека изменилась, надо перенести и указатели на неё} end; {Процедура вывода стека} procedure Print(stek1:List); begin if stek1=nil then {проверка на пустоту стека} begin writeln('Стек пуст.'); exit; end; while stek1<>nil do {пока указатель stek1 не станет указывать в пустоту} begin {а это произойдёт как только он перейдёт по ссылке последнего элемента} Write(stek1^.data, ' '); {выводить данне} stek1:=stek1^.next {и переносить указатель вглубь по стеку} end; end; {Процедура освобождения памяти занятой стеком} Procedure FreeStek(stek1:List); var tmp:List; begin while stek1<>nil do {пока stek1 не станет указывать в "пустоту" делать} begin tmp:=stek1; {указатель tmp направим на вершину стека} stek1:=stek1^.next; {вершину стека перенесём на следующий за данной вершиной элемент} dispose(tmp); //FreeMem(tmp,SizeOf(Tlist)); {освободим память занятую под старую вершину} end; end; {Поиск элемента в стеке по значению} Function SearchElemZnach(stek1:List;znach1:TInf):List; begin if stek1<>nil then {если стек не пуст, то} while (Stek1<>nil) and (znach1<>stek1^.data) do {пока stek1 не укажет в "пустоту" или пока мы не нашли нужный нам элемент} stek1:=stek1^.next; {переносить указатель} SearchElemZnach:=stek1;{функция возвращает указатель на найденный элемент} end; {в случае если элемент не найден, она вернёт nil} {Процедура удаления элемента по указателю} Procedure DelElem(var stek1:List;tmp:List); var tmpi:List; begin if (stek1=nil) or (tmp=nil) then {если стек пуст или указатель никуда не указывает, то выходим} exit; if tmp=stek1 then {если мы удаляем элемент который является вершиной стека, то} begin stek1:=tmp^.next;{следует перенести вершину и} dispose(tmp); // FreeMem(tmp,SizeOf(TList)); {высвободить память из под элемента} end else {в случае, если удаляемый элемент не вершина стека, то} begin tmpi:=stek1; {ставим указатель на вершину стека} while tmpi^.next<>tmp do {доходим до элемента стоящего "перед" тем, который нам следует удалить} tmpi:=tmpi^.next; tmpi^.next:=tmp^.next; {указатель элемента переносим на следующий элемент за удаляемым} dispose(tmp); //FreeMem(tmp,sizeof(TList)); {удаляем элемент} end; end; {Процедура удаления элемента по значению} procedure DelElemZnach(var Stek1:List;znach1:TInf); var tmp:List; begin if Stek1=nil then {Если стек пуст, то выводим сообщение и выходим} begin Writeln('Стек пуст'); exit; end; tmp:=SearchElemZnach(stek1,znach1); {tmp указывает на удаляемый элемент} if tmp=nil then {если элемент не был найден, то выводим сообщение и выходим} begin writeln('Элемент с искомым значением ' ,znach1, ' отсутствует в стеке.'); exit; end; DelElem(stek1,tmp); {удаляем элемент из стека } Writeln('Элемент удалён.'); {сообщаем о выполнении действия} end; {Удаление элемента по порядковому номеру (вершина имеет номер 1)} Procedure DelElemPos(var stek1:List;posi:integer); var i:integer; tmp:List; begin if posi<1 then {проверка на ввод информации} exit; if stek1=nil then {если стек пуст} begin Write('Стек пуст'); exit end; i:=1; {будет считать позиции} tmp:=stek1; while (tmp<>nil) and (i<>posi) do {пока tmp не укажет в "пустоту" или мы не найдём искомый элемент} begin tmp:=tmp^.next; {переходим на следующий элемент} inc(i) {увеличиваем значение счётчика} end; if tmp=nil then {если элемента нет выводим соответствующие сообщения и выходим} begin Writeln('Элемента с порядковым номером ' ,posi, ' нет в стеке.'); writeln('В стеке ' ,i-1, ' элемента(ов).'); exit end; DelElem(stek1,tmp); {если мы не вышли, то элемент есть и его следует удалить} Writeln('Элемент удалён.'); {сообщаем о выполнении действия} end; {Процедура сортировки "пузырьком" с изменением только данных} procedure SortBublInf(nach:list); var tmp,rab:List; tmps:Tinf; begin new(tmp); //GetMem(tmp,SizeOf(Tlist)); {выделяем память для рабочего "буфера" обмена} rab:=nach; {рабочая ссылка, становимся на вершину стека} while rab<>nil do {пока мы не дойдём до конца стека делать} begin tmp:=rab^.next; {перейдём на следующий элемент} while tmp<>nil do {пока не конец стека делать} begin if tmp^.data<rab^.data then {проверяем следует ли менять элементы} begin tmps:=tmp^.data; {стандартная замена в 3 операции} tmp^.data:=rab^.data; rab^.data:=tmps end; tmp:=tmp^.next {переход к следующему элементу} end; rab:=rab^.next {переход к следующему элементу} end end; {Процедура сортировки "пузырьком" с изменением только адресов} procedure SortBublLink(nach:List); var tmp,pered,pered1,pocle,rab:List; {все рабочие ссылки} begin rab:=nach; {становимся на вершину стека} while rab<>nil do{пока не конец стека делать} begin tmp:=rab^.next; {переходим к следующему за сортируемым элементу} while tmp<>nil do {пока не конец стека делать} begin if tmp^.data<rab^.data then {если следует произвести замену, то} begin pered:=nach; {становимся в вершину стека} pered1:=nach; {становимся в вершину стека} if rab<>nach then {если мы не стоим на изменяемом элементе, то} while pered^.next<>rab do pered:=pered^.next; {станем на элементе перед изменяемым} while pered1^.next<>tmp do pered1:=pered1^.next; {станем на элементе перед изменяемым, который находится за первым изменяемым} pocle:=tmp^.next; {запоминаем адрес элемента после второго изменяемого} if rab^.next=tmp then {если элементы "соседи", то} begin tmp^.next:=rab; {меняем ссылки, тут если не понятно рисуйте на листочке} rab^.next:=pocle end else {в случае если элементы не соседи, то} begin tmp^.next:=rab^.next;{меняем ссылки, тут если не понятно рисуйте на листочке} rab^.next:=pocle; end; if pered1<>rab then{советую просмотреть на листочке} pered1^.next:=rab; if rab<>nach then{советую просмотреть на листочке} pered^.next:=tmp else{всё советую просмотреть на листочке} nach:=tmp; pered1:=tmp;{советую просмотреть на листочке} tmp:=rab;{советую просмотреть на листочке} rab:=pered1;{советую просмотреть на листочке} end; tmp:=tmp^.next; {переходим на следующий элемент} end; rab:=rab^.next;{переходим на следующий элемент} end; end; var Stk, {переменная, которая всегда будет указывать на "вершину" стека} tmpl:List; {рабочая переменная} znach:Tinf; {данные вводимые пользователем} ch:char; {для работы менюшки} begin Stk:=nil; repeat {цикл для нашего меню} clrscr; {очистка экрана, далее идёт вывод самого меню} Write('Программа для работы со '); Textcolor(4); Writeln('стеком.'); Textcolor(7); Writeln('Выберите желаемое действие:'); Writeln('1) Добавить элемент.'); Writeln('2) Вывод стека.'); Writeln('3) Удаление элемента по значению.'); Writeln('4) Удаление элемента по порядковому номеру.'); Writeln('5) Поиск элемента по значению'); Writeln('6) Сортировка стека методом "Пузырька", меняя только данные.'); Writeln('7) Сортировка стека с изменением адресов.'); Writeln('8) Выход.'); writeln; ch:=readkey; {ожидаем нажатия клавиши} case ch of {выбираем клавишу} '1':begin write('Введите значение добавляемого элемента: '); readln(znach); {считываем значение добавляемого нового элемент} AddElem(Stk,znach); end; '2':begin clrscr; {очистка экрана} Print(Stk); {вызов процедуры вывода} readkey; {ожидаем нажатия клавиши} end; '3':begin Write('Введите значение удаляемого элемента: '); readln(znach); {ввод значения удаляемого элемента} DelElemZnach(Stk,znach); {вызов процедуры удаления элемента по значению} readkey;{ожидаем нажатия клавиши} end; '4':begin Write('Введите порядковый номер удаляемого элемента: '); readln(znach); {ввод позиции удаляемого файла} DelElemPos(Stk,znach);{вызов процедуры удаления элемента по значению} readkey;{ожидаем нажатия клавиши} end; '5':begin write('Введите значение искомого элемента: '); readln(znach); {ввод искомого значения} tmpl:=SearchElemZnach(Stk,znach); {вызываем процедуру поиска элемента по значению} if tmpl=nil then {проверяем найден ли элемент и выводим соответствующие сообщения} write('Искомый элемент отсутствует в стеке') else write('Элемент ',tmpl^.data,' найден'); readkey;{ожидаем нажатия клавиши} end; '6':begin if Stk=nil then {проверяем не пустой ли стек} begin Write('Стек пуст.'); readkey{ожидаем нажатия клавиши} end else begin SortBublInf(Stk);{вызов процедуры сортировки стека с изменением данных} Write('Стек отсортирован.'); readkey;{ожидаем нажатия клавиши} end end; '7':begin if Stk=nil then{проверяем не пустой ли стек} begin Write('Стек пуст.'); readkey{ожидаем нажатия клавиши} end else begin SortBublLink(Stk);{вызов процедуры сортировки стека с изменением адресов} Write('Стек отсортирован.'); readkey;{ожидаем нажатия клавиши} end end; end; until ch='8'; FreeStek(Stk); {освобождаем память занятую стеком} end.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д