Объектная реализация контейнера на основе комбинированной структуры «Упорядоченный массив динамических стеков»

Автор: Пользователь скрыл имя, 20 Ноября 2012 в 13:07, курсовая работа

Описание работы

Цель работы: получение навыков разработки объектных программ, включая создание набора собственных взаимосвязанных классов для объектной реализации специализированного контейнера. Контейнер предназначен для хранения и обработки, данных некоторой информационной задачи. Контейнер представляет собой двухуровневую структуру данных, в которой уровни реализуются разными способами – один статически на базе массива (непрерывная реализация), другой – динамически с использованием адресных связей (связная реализация).
Выданная задача «Сеть библиотек»
* информационные объекты: книги (свойства – Название, Количество экземпляров)
* книги объединяются в рамках объекта Библиотека (свойство – Номер)
*библиотеки объединяются в рамках объекта-контейнера Библиотечная Сеть

Содержание

Постановка задачи 3
Описание основных понятий и механизмов ООП 4
Теоретическое описание используемых структур данных 10
Описание разработанных классов 10
Алгоритмы реализации основных операций 13
Описание демонстрационного модуля 16
Описание использованных стандартных компонентов 19
Описание структуры проекта 21
Листинги подпрограмм разработанной программы 22
Список использованной литературы 40

Работа содержит 1 файл

Объектно-ориентированное программирование.docx

— 246.56 Кб (Скачать)

  - Главный файл проекта, изначально называется Project1.dpr.

- Первый модуль программы /unit/, который автоматически появляется в начале работы. Файл называется Unit1.pas по умолчанию, но его можно назвать любым другим именем, вроде Main.pas.

- Файл главной формы, который по умолчанию называется Unit1.dfm, используется для сохранения информации о внешнем виде главной формы.

- Файл Project1.res содержит иконку для проекта, создается автоматически.

- Файл, который называется Project1.opt по умолчанию, является текстовым файлом для сохранения установок, связанных с данным проектом. Например, установленные Вами директивы компилятора сохраняются здесь.

- Файл Project1.dsk содержит информацию о состоянии рабочего пространства.

Здесь подразумевается что, если сохранить проект под другим именем, то изменят название и файлы с расширением *.res, *.opt и *.dsk.

После компиляции разработанной программы получаем файлы с расширениями:

Unit1.dcu – скомпилированные модули

Project1.exe – исполняемый файл

~PA, ~DP – backup файлы редактора.

В итоге разработанный проект состоит из следующих фалов:

- Project1.dpr – файл проекта Delphi.

- Project1.exe – исполняемый файл.

- Unit1.pas – файл с исходным кодом.

- Unit1.dfm – файл со значениями свойств формы и ее компонентов.

Так же в проект были включены модули:

- MeineClasse.pas – модуль, где реализованы классы TBook, TElement, TLibrary и TSomeLibrary.

- Стандарные модули Delphi (включаются в проект автоматически, в зависимости от используемых компонентов, процедур и функций) – Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, MeineClasse, ExtCtrls, Menus, XPMan, Buttons.

Листинги  подпрограмм разработанной программы

Листинг файла MeineClasse.pas

 

unit MeineClasse;

 

interface

 

uses

  SysUtils;

 

type

  TBook = class(TObject)

  private

    FName: string;

    FCopyi: integer;

  public

    constructor Create(const Name:string; Size: integer);

    function GetName: string;

    procedure SetName(const Value: string);

    function GetCopyi: integer;

    procedure SetCopyi(const Value: integer);

  end;

 

  TElement = class(TObject)

  private

    FBook: TBook;

    FNext: TElement;

  public

    constructor Create(const Book: TBook);

    destructor Destroy; override;

    function GetNext: TElement;

    procedure SetNext(const Value: TElement);

    function GetBook: TBook;

  end;

 

  TLibrary = class(TObject)

  private

    FFirst: TElement;

    FNum: integer;

  public

    constructor Create(const Num: integer);

    destructor Destroy; override;

    function GetFirst: TElement;

    function GetNum: integer;

    procedure SetNum(const Value: integer);

    procedure AddBook(const Book: TBook);

    function DelFirst: TElement;

    procedure Clear;

  end;

 

  TSomeLibrary = class(TObject)

  private

    FSome: array of TLibrary;

    FCount: integer;

    procedure Rise;

  public

    constructor Create(InitialCount: integer = 0);

    destructor Destroy; override;

    function GetLibrary(Index: integer): TLibrary;

    function GetCount: integer;

    function LibraryNo(No: integer): TLibrary;

    function AddSL(No: integer): integer;

    function DeleteSL(No: integer): integer;

    procedure Clear;

    procedure SaveFile(const FileName: string);

    procedure LoadFile(const FileName: string);

  end;

 

implementation

//****************** TBook *****************************************************

constructor TBook.Create(const Name:string; Size: integer);

begin

  inherited Create;              //при создании сразу инициализируем поля объекта

  FName := Name;

  FCopyi := Size;

end;

 

function TBook.GetName: string;

begin

  Result := FName;

end;

 

function TBook.GetCopyi: integer;

begin

  Result := FCopyi;

end;

 

procedure TBook.SetName(const Value: string);

begin

  FName := Value;

end;

 

procedure TBook.SetCopyi(const Value: integer);

begin

  FCopyi := Value;

end;

//****************** TElement **************************************************

constructor TElement.Create(const Book: TBook);

begin

  inherited Create;

  FNext := nil;

  FBook := Book;

end;

 

destructor TElement.Destroy;

begin

  FBook.Free;

  inherited Destroy;

end;

 

function TElement.GetNext: TElement;

begin

  Result := FNext;

end;

 

function TElement.GetBook: TBook;

begin

  Result := FBook;

end;

 

procedure TElement.SetNext(const Value: TElement);

begin

  FNext := Value;

end;

//****************** TLibrary **************************************************

constructor TLibrary.Create(const Num: integer);

begin

  inherited Create;

  FNum := Num;

  FFirst := nil;

end;

 

destructor TLibrary.Destroy;

begin

  Clear;

  inherited Destroy;

end;

 

procedure TLibrary.AddBook(const Book: TBook);

var

  New: TElement;

begin

  New := TElement.Create(Book);  // Создаём новый элемент, присваиваем его переменной New

  New.SetNext(FFirst);           // Ссылка на следующий элемент = голова стека

  FFirst:=New;                   // Голова стека = новый элемент

  end;

 

procedure TLibrary.Clear;

var

  Temp: TElement;

begin

  while Assigned(FFirst) do      // Пока Голова стека не nul, то

  begin

    Temp := FFirst;              // Временный элемент = голова стека

    FFirst := FFirst.GetNext;    // Голова стека = следующий елемент

    Temp.Free;                   // Уничтожаем временный элемент (цикл проходит по стеку и при каждой итерации удаляет элемент)

  end;

  FFirst := nil;

end;

 

function TLibrary.GetFirst: TElement;

begin

  Result := FFirst;

end;

 

function TLibrary.GetNum: integer;

begin

  Result := FNum;

end;

 

 

function TLibrary.DelFirst: TElement;

var

  Temp: TElement;

begin

Result:=nil;

if not Assigned(FFirst) then Exit;  // Если голова стека = nul, то выходим из процедуры

Temp := FFirst;                     // Временный элемент = голове стека

FFirst := FFirst.GetNext;           // Голова стека = следующий элемент

Result:= Temp;

Temp.Free;

end;

 

procedure TLibrary.SetNum(const Value: integer);

begin

  FNum := Value;

end;

 

//****************** TSomeLibrary **********************************************

function TSomeLibrary.AddSL(No: integer): integer;

var

  i, j: integer;

begin

  if GetCount = 0 then                   // если Библиотек не существует, создаем её и она становится первой

  begin

    Rise;

    FSome[0] := TLibrary.Create(No);

    Result := 0;

    Exit;

  end;

  for i := 0 to GetCount - 1 do       // если вводим уже имеющююся Библиотеку, то переходим к ней, выходим из процедуры

    if FSome[i].GetNum = No then

    begin

      Result := i;

      Exit;

    end;

  if No > FSome[GetCount - 1].GetNum then     // если не существует - создаем

  begin

    Rise;

    FSome[GetCount - 1] := TLibrary.Create(No);

    Result := GetCount - 1;

    Exit;

  end;

  for i := 0 to GetCount - 1 do         // цикл упорядочивания массива. Пр. есть 1,2,3,5. Добавляем 4, получаем 1,2,3,4,5.

    if FSome[i].GetNum > No then

    begin

      Rise;

      for j := GetCount - 1 downto i + 1 do

        FSome[j] := FSome[j - 1];

      FSome[i] := TLibrary.Create(No);

      Result := i;

      Exit;

    end;

  Result := -1;

end;

 

procedure TSomeLibrary.Clear;

var

  i: integer;

begin

  for i := 0 to GetCount - 1 do

    FSome[i].Free;

  SetLength(FSome, 0);

end;

 

constructor TSomeLibrary.Create(InitialCount: integer);

begin

  inherited Create;

  SetLength(FSome, InitialCount);

  FCount := 0;

end;

 

function TSomeLibrary.DeleteSL(No: integer): integer;

var

  i, j: integer;

  temp: TLibrary;

begin

  Result:=0;

  for i := 0 to GetCount - 1 do

    if FSome[i].GetNum = No then

    begin

      temp := FSome[i];

      for j := i to GetCount - 2 do

        FSome[j] := FSome[j + 1];

      Dec(FCount);

      if FCount < Length(FSome) div 2 then

        SetLength(FSome, FCount);

      temp.Free;

      Result:=No;

      Exit;

    end;

end;

 

destructor TSomeLibrary.Destroy;

begin

  Clear;

  inherited Destroy;

end;

 

function TSomeLibrary.GetLibrary(Index: integer): TLibrary;

begin

  if (Index < 0) or (Index >= GetCount) then Result := nil

    else Result := FSome[Index];

end;

 

function TSomeLibrary.GetCount: integer;

begin

  Result := FCount;

end;

 

procedure TSomeLibrary.Rise;   // увеличиваем число Библиотек (длинну массива)

begin

  Inc(FCount);

  if GetCount > Length(FSome) then

  begin

    if Length(FSome) <= 0 then SetLength(FSome, FCount)

      else SetLength(FSome, Length(FSome) * 2);

  end;

end;

 

function TSomeLibrary.LibraryNo(No: integer): TLibrary;

var

  i: integer;

begin

  for i := 0 to GetCount - 1 do

    if FSome[i].GetNum = No then

    begin

      Result := FSome[i];

      Exit;

    end;

  Result := nil;

end;

 

procedure TSomeLibrary.LoadFile(const FileName: string);

var

  f: TextFile;

  s,st,st2,st3,name: string;

  i, cop,j,g : integer;

  Shelf: TLibrary;

  Book: TBook;

  flag:boolean;

begin

  Clear;

  AssignFile(f, FileName);  // открыли файл

  Reset(f);

 

  while not Eof(f) do         // цикл сборки массива

  begin

    Readln(f, s);

    if s = '' then Continue;

    i := AddSL(StrToInt(s));

    if i < 0 then Continue;

    Shelf := FSome[i];

    while not Eof(f) do

    begin

      name:='';

      flag:=false;  // переменная введена для разбиения строки на "Название" и "Число экземпляров"

      st3:='';

      cop:=0;

      Readln(f, s);

      if s = '' then Break;

      for j := 1 to Length(s) do

        begin

          st:= copy(s, j, 1);  // копируем по одному символу из строки для дальнейшей обработки

          if st <> '*' then name:=name + st else begin flag:=true; break; end; // если символ не * (разделитель), то "собираем" Название

        end;

          if flag=true then begin  // flag = True -

          for g := j+1 to Length(s) do

            begin

              st2:= copy(s, g, 1);

              st3:=st3+st2;           // собираем строку: количество экземпляров

            end;  flag:=false end;

      cop:=strtoint(st3); // преобразуем тип

      Book := TBook.Create(name, cop); // создали информациооный обьект

      Shelf.AddBook(Book);        // добавили его

    end;

  end;

  CloseFile(f);     // закрыли файл

end;

 

procedure TSomeLibrary.SaveFile(const FileName: string);

var

  f: TextFile;

  i: integer;

  Element: TElement;

begin

  AssignFile(f, FileName);

  Rewrite(f);

  for i := 0 to GetCount - 1 do  // цикл прохода по структуре и сохранения элементов в файл

Информация о работе Объектная реализация контейнера на основе комбинированной структуры «Упорядоченный массив динамических стеков»