Зайцев М. Г. / Отчет по лабе№1
.docxМинистерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«Новосибирский государственный технический университет»
Лабораторная работа №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.