Составить новый дек, записывая в него элементы исходного дека, изымая их поочередно слева и справа - Turbo Pascal
Формулировка задачи:
Дан дек строковых элементов. Составить новый дек, записывая в него элементы исходного дека, изымая их поочередно слева и справа.Помогите с подпрограммой.
Вот модуль
Листинг программы
- Unit IDeck;
- Interface
- type
- TUnsignedInt = word;
- TSignedInt = integer;
- tShortUnsignedInt = byte;
- TIndex1 = TUnsignedInt;
- TIndex2 = TUnsignedInt;
- TElem = char;
- pDec = ^cDec;
- cDec = Object
- Private
- nmax:TSignedInt;
- head,tail:TUnsignedInt;
- p:pointer;
- ERRORCODE:tShortUnsignedInt;
- z:integer;
- Public
- Constructor Init(n:TSignedInt);
- Constructor Copy(pq:Pdec);
- Destructor Done;
- Procedure makeEmpty;
- Function IsEmpty:boolean;
- function isFull:boolean;
- procedure Addl(x:Telem);
- procedure Addr(x:Telem);
- procedure RemoveL(var x:Telem);
- procedure RemoveR(var x:Telem);
- procedure SeeHead(var x:Telem);
- procedure SeeRight(var x:Telem);
- procedure ChangeHead(x:telem);
- procedure ChangeRight(x:telem);
- procedure writeDec(n:TSignedInt; var x:telem);
- procedure DelHead;
- procedure DelRight;
- // procedure Delete;
- end;
- Implementation
- {$Q+} {$R-}
- uses
- CRT;
- type
- tArr = array [0..0] of Telem;
- Parr = ^tArr;
- PBlock=^Tblock;
- Tblock = Record
- data:Telem;
- next:Pblock;
- end;
- Const
- SElem = sizeof (TElem) ;
- SegmentSize = 65520;
- Constructor cDec.Init(n:TSignedInt);
- var need:longInt; x:telem;
- begin
- need:=longint(n+2)*sizeOf(tElem);
- getmem(p,need);
- nmax:=n+1;
- head:=0;
- tail:=0;
- // x:= Pkey^[head];
- //x:=pblock(p)^.data;
- end;
- Constructor cdec.Copy(pq:Pdec);
- var need:longint; i:integer;
- begin
- need:=longint (pq^.nmax+1) * sizeof(Telem);
- getmem(p, need);
- nmax:=pq^.nmax;
- head:=pq^.head;
- tail:=pq^.tail;
- i:=head;
- while i<>tail do
- begin
- parr(p)^[i]:=parr(pq^.p)^[i];
- i:=(i+1) mod nmax;
- end;
- end;
- Destructor cDec.done;
- var need:longint;
- begin
- need:=longint(nmax)*sizeof(Telem);
- freemem(p,need);
- end;
- Procedure cDec.makeEmpty;
- begin
- head:=0;
- tail:=0;
- end;
- Function cDec.IsEmpty:boolean;
- begin
- isEmpty:=(head=tail);
- end;
- Function cDec.IsFull:boolean;
- begin
- isFull:=(head=(tail+1) mod nmax);
- end;
- procedure cDec.addl(x:Telem);
- begin
- if isFull then ErrorCode:= 2
- else
- begin
- ERRORCODE := 0;
- head:=((head-1)+nmax) mod nmax;
- Parr(p)^[head]:=x;
- end;
- end;
- procedure cDec.addr(x:Telem);
- begin
- if isFull then ErrorCode:= 2
- else
- begin
- ERRORCODE := 0;
- Parr(p)^[tail]:=x;
- tail:=(tail+1) mod nmax;
- end;
- end;
- procedure cDec.RemoveL(var x:tElem);
- begin
- if isEmpty then ErrorCode:=2
- else
- begin
- ErrorCode:=0;
- x:=parr(p)^[head];
- head:=(head+1) mod nmax;
- end;
- end;
- procedure cDec.RemoveR(var x:tElem);
- begin
- if isEmpty then ErrorCode:=2
- else
- begin
- ErrorCode:=0;
- x:=parr(p)^[tail-1];
- tail:=(tail-1) mod nmax;
- end;
- end;
- procedure cDec.SeeHead(var x:Telem);
- begin
- if isEmpty then ErrorCode:=2
- else
- begin
- ErrorCode:=0;
- x:=parr(p)^[head];
- end;
- end;
- procedure cDec.SeeRight(var x:Telem);
- begin
- if isEmpty then ErrorCode:=2
- else
- begin
- ErrorCode:=0;
- x:=parr(p)^[tail];
- end;
- end;
- procedure cDec.ChangeHead(x:Telem);
- begin
- if isEmpty then ErrorCode:=2
- else
- begin
- ErrorCode:=0;
- parr(p)^[head]:=x;
- end
- end;
- procedure cDec.ChangeRight(x:Telem);
- begin
- if isEmpty then ErrorCode:=2
- else
- begin
- ErrorCode:=0;
- parr(p)^[tail]:=x;
- end
- end;
- procedure cDec.DelHead;
- begin
- if isEmpty then ErrorCode:=2
- else
- begin
- ErrorCode:=0;
- head:=(head+1) mod nmax;
- end
- end;
- procedure cDec.DelRight;
- begin
- if isEmpty then ErrorCode:=2
- else
- begin
- ErrorCode:=0;
- tail:=(tail-1) mod nmax;
- end;
- end;
- procedure cDec.writeDec(n:TSignedInt; var x:telem);
- begin
- if isEmpty then ErrorCode:=2
- else
- begin
- ErrorCode:=0;
- x:=parr(p)^[tail-n];
- end;
- end;
- End.
Решение задачи: «Составить новый дек, записывая в него элементы исходного дека, изымая их поочередно слева и справа»
textual
Листинг программы
- uses IDeck;
- const n=10;
- var
- a, b: pDec; t: TElem;
- begin
- {...}
- b:=New(pDec,Init(n));
- repeat
- if not a.IsEmpty then begin a.RemoveL(t); b.AddR(t); end;
- if not a.IsEmpty then begin a.RemoveR(t); b.AddR(t); end;
- until False;
- {...}
- Dispose(b,Done);
- end.
Объяснение кода листинга программы
- В начале кода используется библиотека IDeck, которая представляет собой реализацию дека.
- Константа n определяет количество элементов в деках, которые будут использоваться в коде.
- Переменные a и b объявлены как pDec-переменные, которые представляют собой ссылки на объекты типа pDec.
- Переменная t объявлена как TElem-переменная, которая представляет собой элемент типа pDec.
- Строка кода b:=New(pDec,Init(n)); создает новый объект типа pDec и инициализирует его с n элементами.
- Цикл repeat используется для повторного выполнения блока кода до тех пор, пока условие False не станет истинным.
- Если переменная a не пуста (a.IsEmpty = False), то из нее удаляется левый элемент (a.RemoveL(t)) и добавляется правый элемент (b.AddR(t)) в дек b.
- Если переменная a не пуста (a.IsEmpty = False), то из нее удаляется правый элемент (a.RemoveR(t)) и добавляется левый элемент (b.AddR(t)) в дек b.
- Цикл повторяется до тех пор, пока условие False не станет истинным.
- По завершении работы с объектом b, он освобождается с помощью функции Dispose(b, Done).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д