Автор: Пользователь скрыл имя, 20 Ноября 2012 в 13:07, курсовая работа
Цель работы: получение навыков разработки объектных программ, включая создание набора собственных взаимосвязанных классов для объектной реализации специализированного контейнера. Контейнер предназначен для хранения и обработки, данных некоторой информационной задачи. Контейнер представляет собой двухуровневую структуру данных, в которой уровни реализуются разными способами – один статически на базе массива (непрерывная реализация), другой – динамически с использованием адресных связей (связная реализация).
Выданная задача «Сеть библиотек»
* информационные объекты: книги (свойства – Название, Количество экземпляров)
* книги объединяются в рамках объекта Библиотека (свойство – Номер)
*библиотеки объединяются в рамках объекта-контейнера Библиотечная Сеть
Постановка задачи 3
Описание основных понятий и механизмов ООП 4
Теоретическое описание используемых структур данных 10
Описание разработанных классов 10
Алгоритмы реализации основных операций 13
Описание демонстрационного модуля 16
Описание использованных стандартных компонентов 19
Описание структуры проекта 21
Листинги подпрограмм разработанной программы 22
Список использованной литературы 40
- Главный файл проекта, изначально называется 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(
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 // цикл прохода по структуре и сохранения элементов в файл