|
|
Регистрация | << Правила форума >> | 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 - это не файл, это ФЭЙЛ Просто обратил внимание |