Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Зайцев М. Г. / Отчет по лабе№1

.docx
Скачиваний:
13
Добавлен:
03.01.2020
Размер:
21.74 Кб
Скачать

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«Новосибирский государственный технический университет»

Лабораторная работа №1

по дисциплине «Разработка программный приложений»

Выполнили:

Группа: ФБИ-22

Руководитель: Зайцев М.Г.

Новосибирск 2014

Цель: Сформировать практические навыки реализации абстрактных типов данных с помощью динамических информационных структур и классов Object Pascal.

program PNode;

{$APPTYPE CONSOLE}

uses

SysUtils,

//UNode in 'UNode.pas',

UNodeList in 'UNodeList.pas';

var L: TNodeList;

begin

{ TODO -oUser -cConsole Main : Insert code here }

L:=TNodeList.Create();

Writeln(L.ListString);

writeln('------------------');

L.AddL(0);

L.AddL(1);

L.AddR(2);

L.AddR(3);

L.AddR(4);

Writeln(L.ListString);

writeln('IsEmpty? ',L.IsEmpty);

writeln('------------------');

Writeln('Find: ',L.Find(3));

L.Delete(3);

Writeln('After Delete: ');

Writeln(L.ListString);

writeln('------------------');

Writeln('H: ',L.H);

Writeln(L.ListString);

Writeln('H_: ',L.H_);

Writeln(L.ListString);

writeln('------------------');

L.Empty;

Writeln(L.ListString);

L.Free;

readln;

end.

//-----------------------------------------------------

//Модуль UNode с описанием класса TNode.

unit UNode;

interface

uses SysUtils;

type

//-----------------------------------------------------

T = Longint;//Элемент списка

//-----------------------------------------------------

TNode = class//Узел списка

private

public

Fkey: T;//Элемент списка

Fnext: TNode;//Указатель на следующий узел списка

procedure InsertAfter(a: TNode);

//Вставить узел а после данного

function DeleteAfter: TNode;

//Удалить узел, следующий за данным

function Next: TNode;

//Указатель на следующий элемент

function ToStr: String;

//Возвращает строку жлементов списка, начиная с вызвавшего метод

constructor Create(k: T;p: TNode = nil);

end;

//-----------------------------------------------------

implementation

//-----------------------------------------------------

constructor TNode.Create;

begin

Fkey:= k;

Fnext:= p;

end;

//---------------------------------------------------

function TNode.Next:TNode;

//Возвращает указатель на следующий элемент

begin

if self = nil then begin result:= nil; exit; end;

result:= self.FNext;

end;

//---------------------------------------------------

procedure TNode.InsertAfter(a: TNode);

//Вставить узел а после данного (self).

begin

if self = nil then exit; //Нет узла

if self.FNext = nil then self.FNext:= a //Узел последний

else begin //Узел не последний

a.Fnext:= self.Fnext;

self.FNext:= a

end;

end;

//---------------------------------------------------

function TNode.DeleteAfter;

//Удалить узел, следующий за данным (за self).

var p: TNode;

begin

if self = nil then begin result:= nil; exit end; //Нет узла

if self.FNext = nil then begin result:= nil; exit end //Нет следующего элемента

else begin

p:= self.Fnext.Fnext;

result:= self.Fnext;

self.Fnext:= p;

end;

end;

//---------------------------------------------------

function TNode.ToStr: String;

//Возвращает строку элементов списка, начиная с данного (self)

var p: TNode;

begin

p:= self;

result:= '';

while p <> nil do begin

result:= result + IntToStr(p.Fkey) + ', ';

p:= p.Fnext

end;

end;

end.

//---------------------------------------------------

unit UNodeList;

interface

uses UNode,SysUtils;

type

EIndexOut = class (Exception)

//Исключительная ситуация возникшая при выходе

//индекса за границы диапазона индексов списка

end;

EListEmpty = class (Exception)

// Исключительная ситуация возникшая при попытке

//выполнения некоторых операций на пустом списке

end;

TNodeList = class

private

Fhead: TNode;//Указатель на первый узел списка

function GetItem(i: T):T;

//Возвращает элемент списка, имеющий

//индекс i. Элементы индексированы целыми

//числами, начиная с нуля.

public

property Items[i: Integer]: Integer read GetItem; default;

//Операция Элемент. Обеспечивает доступ к

//элементам списка по индексу.

function PredLast(var p:TNode): TNode;

//Возвращает указатели на последний р и

//последний узлы списка.

function Last: TNode;

//Возвращает указатель на последний узел списка.

procedure AddL(a: T);

//Операция ДобавитьСлева. Добавляет элемент

//к списку слева.

procedure AddR(a: T);

//Операция ДобавитьСправа. Добавляет элемент

//к списку справа.

function IsEmpty: Boolean;

//Операция СписокПуст. Возвращает true, если

//список пуст, False – в противном случае.

function Find(a: T): Integer;

//Операция Найти. Возвращает индекс элемента а в

//списке, (-1) – если а в списке найден.

function H: T;

//Операция Голова. Выделяет элемент находящийся

//в голове списка.

function H_: T;

//Операция ГоловаСправа. Выделяет элемент

//находящийся в голове списка справа.

function Number: Cardinal;

//Операция Элементов. Возвращает количество

//элементов в списке.

procedure Empty;

//Операция Опустошить. Опустошает список.

procedure Delete(a: T);

//Операция Удалить. Отыскивает и удаляет первое

//вхождение элементов а в списов.

function ListString: String;

//Операция СписокВСтроку. Формирует и возвращает

//строку, содержащую элементы списка.

constructor Create();

destructor Destroy; override;

end;

implementation

//-----------------------------------------------------

function TNodeList.GetItem(i: Integer):Integer;

//Возвращает элемента списка, имеющего индекс i.

//Элементы индексированы целыми числами,

//начиная с нуля.

var

c: integer;

p: TNode;

begin

if FHead = nil

then raise EListEmpty.Create('Ошибочный индекс элемента списка');

if i < 0

then raise EIndexOut.Create('Ошибочный индекс элемента списка');

p:= FHead;

for c:= 1 to i do

if p.Next <> nil then p:= p.Next

else raise EIndexOut.Create('Ошибочный индекс элемента списка');

result:= p.Fkey;

end;

//-----------------------------------------------------

function TNodeList.Last: TNode;

//Возвращает указатель на последний узел списка.

var p: TNode;

begin

p:= FHead;

result:= FHead ;

while p <> nil do

begin

result:= p;

p:= p.Next

end

end;

//-----------------------------------------------------

function TNodeList.PredLast(var p:TNode):TNode;

//Возвращает указатели на последний р и

//последние узлы списка.

begin

p:= FHead;

result:= FHead ;

if FHead = nil

then exit;//В списке нет элементов.

if FHead.next = nil

then exit;//В списке нет элементов.

while result.next <> nil do

begin

p:=result;

result:= p.next

end

end;

//-----------------------------------------------------

function TNodeList.ListString: String;

//Операция СписокВСтроку. Формирует и возвращает

//строку, содержащую элементы списка.

var p: TNode;

begin

p:= FHead;

Result:= 'Length: ' + IntToStr(Number) + ' Elements: ';

while p <> nil do

begin

result:= result + '| '+ IntToStr(p.Fkey);

p:= p.Next

end

end;

//------------------------------------------------------

procedure TNodeList.AddL(a: T);

//Операция ДобавитьСлева. Добавляет элемент

//к списку слева.

var p:TNode;

begin

if FHead=nil then

FHead:=TNode.Create(a)

else

begin

p:=FHead;

FHead:=TNode.Create(a);

FHead.Fnext:=p;

end;

end;

//------------------------------------------------------

procedure TNodeList.AddR(a: T);

//Операция ДобавитьСправа. Добавляет элемент

//к списку справа.

var p: TNode;

begin

if FHead = nil then

FHead:=TNode.Create(a)

else

begin

p:= Last;

p.FNext:=TNode.Create(a);

end;

end;

//------------------------------------------------------

function TNodeList.IsEmpty: Boolean;

//Операция СписокПуст. Возвращает true, если

//список пуст, False – в противном случае.

begin

if FHead=nil then result:=true

else result:=false;

end;

//------------------------------------------------------

function TNodeList.Find(a: T): Integer;

//Операция Найти. Возвращает индекс элемента а в

//списке, (-1) – если а в списке найден.

var p: TNode;

i: integer;

begin

i:=0;

result:=-1;

p:=FHead;

while (p<>nil) and (p.Fkey<>a) do

begin

p:=p.Next;

i:=i+1;

end;

if p<>nil then result:=i;

end;

//------------------------------------------------------

function TNodeList.H: T;

//Операция Голова. Выделяет элемент находящийся

//в голове списка.

var p:TNode;

begin

result:=FHead.Fkey;

p:=FHead.Next;

FHead.DeleteAfter;

FHead:=p;

end;

//------------------------------------------------------

function TNodeList.H_: T;

//Операция ГоловаСправа. Выделяет элемент

//находящийся в голове списка справа.

var p: TNode;

begin

result:=Last.Fkey;

PredLast(p);

p.DeleteAfter;

end;

//-------------------------------------------------------

function TNodeList.Number: Cardinal;

//Операция Элементов. Возвращает количество

//элементов в списке.

var p: TNode;

begin

result:=0;

p:=FHead;

while p<>nil do

begin

result:=result+1;

p:=p.Next;

end;

end;

//-------------------------------------------------------

procedure TNodeList.Empty;

//Операция Опустошить. Опустошает список.

var p: TNode;

begin

p:=PredLast(p);

while p<>FHead do

begin

p.DeleteAfter;

PredLast(p);

end;

Fhead:=nil;

end;

//--------------------------------------------------------

procedure TNodeList.Delete(a: T);

//Операция Удалить. Отыскивает и удаляет первое

//вхождение элемента а в список.

var p,q: TNode;

i: integer;

begin

if Find(a)<> -1 then

begin

if Find(a)=0 then H else

begin

p:=FHead;

for i:= 1 to Find(a)-1 do p:=p.Next;

if p.Next=nil then H_ else

q:=p.Next.Next;

p.DeleteAfter;

p.Fnext:=q;

end;

end;

end;

//--------------------------------------------------------

constructor TNodeList.Create;

begin

FHead:=nil;

end;

//--------------------------------------------------------

destructor TNodeList.Destroy;

begin

Empty;

end;

//--------------------------------------------------------

end.