Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.09.2016, 23:42
WebManual WebManual вне форума
Прохожий
 
Регистрация: 22.09.2016
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Помогите с добавлялкой в список (ООП)

Здравствуйте, имеется такая задача: Нужна программа, в которую нужно забить информацию о файлам (Имя и размер), а эти файлы в свою очередь, были в контейнере, реализованном в виде адресного однонаправленного списка. Вот что получилось у меня:

Код:
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  
Старый 23.09.2016, 05:53
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,048
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

адресного - это в смысле связанного?
Тогда это делается немного не так.
Для начала здесь класс для файла не нужен.
Код:
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  
Старый 23.09.2016, 15:16
WebManual WebManual вне форума
Прохожий
 
Регистрация: 22.09.2016
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Огромнейшее вам спасибо... Постараюсь разобраться и применить ваш код к своему заданию... Преподаватель очень строгий, может придраться к любой непонятной ему вещи
Ответить с цитированием
  #4  
Старый 23.09.2016, 15:25
WebManual WebManual вне форума
Прохожий
 
Регистрация: 22.09.2016
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Проблема в том, что класс файлов преподаватель проверял и сказал что правильно... Работа
Ответить с цитированием
  #5  
Старый 23.09.2016, 15:27
WebManual WebManual вне форума
Прохожий
 
Регистрация: 22.09.2016
Сообщения: 4
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Проблема в том, что преподаватель проверял класс файлов и сказал, что отлично, работай над след юнитом... То есть там оформляй каталог... Быть может я вам скину задание и это как то сможет вам помочь лучше понять задание? Готов предоставить маленький презент за потраченное вами время...
Ответить с цитированием
  #6  
Старый 23.09.2016, 19:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,048
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Значит препод - дурак.
Классический подход к построению связанных списков - записи (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 - это не файл, это ФЭЙЛ Просто обратил внимание
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter