![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Здравствуйте.)
Начинаю изучать Ооп, вот появилось задание написать программу "массив динамических стеков", массив и стек должны быть описаны своими классами. вот мой класс простого массива, в который, я думаю, нужно добавлять указатели стеков(пока только добавление). Код:
unit MyMass; //заголовок модуля(!)
interface
Uses Dialogs, classes, SysUtils, Unit1;
type
TMas = class //заголовок класса
mas1: array [1..20] of pCell;
i : integer;
private
public
constructor Create; overload;
procedure AddX;
procedure AddFD(X:integer);
procedure DelFD(x:integer);
procedure ShowMas;
end;
implementation
constructor TMas.Create;
begin
i:=0;
end;
procedure TMas.AddX;
begin
if i>19
then ShowMessage('Массив полон')
else i:=i+1;
end;
procedure TMas.AddFD(X:pCell);
begin
mas1[i]:=X; //входит из основной программы
end;Класс стека(только добавление): Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Dialogs;
type
PCell = ^TCell;
TCell = record
Num : Integer; // значение
Next : pCell; // указатель на следующий элемент
end;
TStack = class(TComponent) //класс
private
FDataPtr : PCell; //указатель на верхний элемент стека
public
constructor Create(AOwner : TComponent); overload; //
procedure Push(Val : Integer); //добавление элемента в стек
procedure Info(N:pCell); //отображение стека
end;
implementation
Uses MyMass;
constructor TStack.Create(AOwner : TComponent);
begin
inherited Create(AOwner); // вызываем конструктор предка
FDataPtr:=NIL;
end;
procedure TStack.Push(Val : Integer);
var
P : PCell;
str:string ;
FMas : TMas;
begin
New(P);
P^.Num:=Val;
P^.Next:=FDataPtr;
FDataPtr:=P;
Fmas.AddFd(FdataPtr); //добавляет в массив элемент
end;никак не могу разобраться с методами Set/Get... нужно ли их использовать и если да, то как? Подскажите, пожалуйста) |
|
#2
|
|||
|
|||
|
Динамических - это значит что размер меняется в зависимости от потребностей. Тебе помогут классы TList, TStringList, TObjectList.
Ну а массив - это уже просто. Тебе какие данные надо в стеке хранить? |
|
#3
|
|||
|
|||
|
> Тебе какие данные надо в стеке хранить?
целые числа (для простоты).. в задании об этом ничего не сказанно, поэтому я хочу сделать просто стек целых чисел. |
|
#4
|
|||
|
|||
|
Тады примерно так:
Код:
unit StackUnit;
interface
uses
Windows, SysUtils, Classes, Contnrs;
type
TStackItem = class
private
FData : Integer;
public
constructor Create(AData : Integer); virtual;
destructor Destroy; override;
property Data : Integer read FData;
end;
TStack = class
private
FItems : TObjectList;
public
constructor Create; virtual;
destructor Destroy; override;
function Pop : Integer;
procedure Push(AItem : Integer);
procedure Clear;
end;
implementation
{ TStackItem }
constructor TStackItem.Create(AData: Integer);
begin
inherited;
FData := AData;
end;
destructor TStackItem.Destroy;
begin
inherited;
end;
{ TStack }
procedure TStack.Clear;
begin
FItems.Clear;
end;
constructor TStack.Create;
begin
inherited;
FItems := TObjectList.Create(True);
end;
destructor TStack.Destroy;
begin
FItems.Free;
inherited;
end;
function TStack.Pop: Integer;
begin
If FItems.Count = 0
Then Raise Exception.Create('Стек пуст')
Else
Begin
Result := (FItems[0] As TStackItem).Data
FItems.Delete(0);
End
end;
procedure TStack.Push(AItem: Integer);
begin
FItems.Insert(0,TStackItem.Create(AItem));
end;
end.Класс TStackItem полезен для того, что бы было удобно работать, ну и для дальнейшего наращивания. |