![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Здравствуйте, имеется такая задача: Нужна программа, в которую нужно забить информацию о файлам (Имя и размер), а эти файлы в свою очередь, были в контейнере, реализованном в виде адресного однонаправленного списка. Вот что получилось у меня:
Код:
unit FailU;
interface
type
TFail = class
private
NameFile:string;
SizeFile:integer;
Next:TFail;
public
constructor Create(aName:string; aSize:integer); //Создать файл
function GetName:string; //Получить имя файла
function GetSize:integer; // Получить размер файла
procedure SetName(aName:string); // Установить имя файла
procedure SetSize(aSize:integer); // Установить размер файла
function GetNext (Next:TFail); //Перейти к следующему файлу
procedure SetNext (aNext:TFail); //Установить следующий файл
end;
implementation
constructor TFail.Create(aname: string; asize: Integer);
begin
NameFile:=aName;
SizeFile:=aSize;
end;
procedure TFail.SetName(aname: string);
begin
NameFile:=aName;
end;
procedure TFail.SetSize(asize: Integer);
begin
SizeFile:=aSize;
end;
function TFail.GetName;
begin
result:=NameFile;
end;
function TFail.GetSize;
begin
result:=SizeFile;
end;
procedure TFail.SetNext(anext: TFail);
begin
next:=anext;
end;
function TFail.GetNext(next: TFail);
begin
result:=next;
end;
end.И Код:
unit Katalog;
interface
uses
Dialogs, FileU; //Используем модуль файлов
type
TKatalog = class
private
Name:string; //* Название каталога;
pFirst: TBuilding; //*Казатель на первый элемент
Count:integer;
public
Constructor Create(aName:string);
procedure SetName(aNameKatalog:string); //Установить имя
function GetName:string; //Получить имя
function TKatalog.SearchFile(anamefile:string):TFail;
procedure AddFile(aFile:TFile); //Добавить файл после нужного файла
function GetName: string; // получить название Каталога
procedure SetName(aName: string); // установить название Каталога
end;
implementation
constructor TKatalog.Create(Name:string);
begin
Name:=aName;
pFirst:=nil;
count:=0;
end;
function TKatalog.SearchFile(anamefile:string):TFail;
var pTemp:TFail;
begin
if Count=0 then ShowMessage('Поиск невозможен! Нет файлов для поиска!') else
begin
pTemp:=pFirst;
while (pTemp<>nil) do
if (pTemp.GetName = anamefile) then
begin
result:=pTemp;
break;
end
else pTemp:=pTemp.GetNext;
end;
end;
procedure AddFile(aFile:=TFile);
var pTemp:TFile;
Begin
if count=0 then
begin
aFile.SetNext(pFirst);
pFirst:=aFile;
Inc(count);
else
pTemp:=SearchFile(anamefile);
if (pTemp<>nil) then
aFile.SetNext()
End;
end.С контейнером у меня проблемы, (ЮНИТ2) не уверен, что правильно описан адрессный однонаправленный список и не знаю как реализовать добавлялки :-( Гуру, помогите пожалуйста новичку, хочется разобраться... |
|
#2
|
|||
|
|||
|
адресного - это в смысле связанного?
Тогда это делается немного не так. Для начала здесь класс для файла не нужен. Код:
type
PFileItem=^TFileItem;
TFileItem=record
Name : String;
Size : Integer;
Next : PFileItem;
end;Для каталога - можно и класс сделать, что бы инкапсулировать туда методы. Код:
type
TFileCatalog=class
private
FHead : PFileItem;
function GeHead : PFileItem;
public
constructor Create;
function Add(AFileName : String; AFileSize : Integer) : PFileITem;
property Head : PFileItem read GetHead;
end;
implementation
constructor TFileCatalog.Create;
begin
inherited;
FHead := Nil;
end;
function TFileCatalog.GeHead : PFileItem;
begin
Result := FHead;
end;
function TFileCatalog.Add(AFileName : String; AFileSize : Integer) : PFileITem;
var
NewHead : PFileItem;
begin
New(NewHead);
NewHead.Name := AFileName;
NewHead.Size := AFileSize;
NewHead.Next := FHead;
FHead := NewHead;
end;Здесь добавление идет с головы списка. Т.е. новый элемент вставляется в начало списка и станоеится его головой. Поиск - стандартная имлементация поиска по св. списку: Код:
function TFileCatalog.FindFile(AFileName : String) : TFileItem;
var
Buf : PFileItem;
begin
Result := Nil;
Buf := Head;
While Buf <> Nil Do
Begin
If CompareText(AFileName,Buf.Name) = 0 Then // CompareStr, если надо с учетом регистра
Begin
Result := Buf;
Break;
End;
Buf := Buf.Next;
End;
end;Последний раз редактировалось lmikle, 23.09.2016 в 05:58. |
|
#3
|
|||
|
|||
|
Огромнейшее вам спасибо... Постараюсь разобраться и применить ваш код к своему заданию... Преподаватель очень строгий, может придраться к любой непонятной ему вещи
![]() |
|
#4
|
|||
|
|||
|
Проблема в том, что класс файлов преподаватель проверял и сказал что правильно... Работа
|
|
#5
|
|||
|
|||
|
Проблема в том, что преподаватель проверял класс файлов и сказал, что отлично, работай над след юнитом... То есть там оформляй каталог... Быть может я вам скину задание и это как то сможет вам помочь лучше понять задание? Готов предоставить маленький презент за потраченное вами время...
|
|
#6
|
|||
|
|||
|
Значит препод - дурак.
Классический подход к построению связанных списков - записи (record в паскале, struct в C/C++). Классы используются только там, где нет других возможностей (Java, например; там все - классы). А вот контейнер - это уже должен быть класс (хотя в последних версиях можно сделать и с помощью записей, благо теперь появилась возможности делать методы в записях (хотя я и противник этого). Да, для нормального функционирования еще надо написать правильный деструктор, который освободит память, занятую списком. На самом деле сделаем 2 метода: очистку (clear) и сам деструктор: Код:
procedure TFileCatalog.Clear;
var
Item : PFileItem;
begin
While FHead <> Nil Do
Begin
Item := FHead;
FHead := FHead.Next;
Dispose(Item);
End;
end;
destructor TFileCatalog.Destroy; override;
begin
Clear;
inherited;
end;ЗЫ. TFail - это не файл, это ФЭЙЛ Просто обратил внимание ![]() |