Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2013, 01:54   #1
Igor922
Новичок
Джуниор
 
Регистрация: 27.03.2013
Сообщений: 3
По умолчанию проблема с ооп

Здраствуйте,
Нужна помощь по ООП ,в частности по программной реализации методов класса и дем. модулю: не получается правильно реализовать функцию поиска в массиве и удаление элемента из массива по названию(не по индексу)-если не трудно исправьте другие найденные ошибки если они есть.
Сама структура - динамическая очередь упорядоченных массивов.
Заранее большое спасибо.

Привожу кусок проблемного кода(класса) на котором я застрял:
Код:

Unit Section; 

interface

uses
  News,SysUtils;

const
  MaxNews = 10;

type
  MyArray = array [1..MaxNews] of TNews;

TSection=class 
  public    
    constructor Create(_SectionName:string;_NewsName:string);
    function AddNews(_News: TNews): boolean;
    function DeleteNews(_NewsName: string): boolean;
    function FindNews(_NewsName: string): string;
    procedure SetSectionName(_SectionName: String);
    function GetSectionName: String;
    procedure SetNextSection(_Section: TSection); 
    function GetNextSection: TSection; 
    function GetMyArray: MyArray;
    function GetCount: integer;
  private      
    NewsArray: MyArray; 
    SectionName: String; 
    NextSection: TSection; 
    Count: Integer; 
end;


implementation

constructor TSection.Create;   
begin
  NextSection := nil;
  Count := 0;
end;

function TSection.AddNews(_News: TNews): boolean;      
var
  i,j: integer;   

begin
  if Count < MaxNews then
  begin
    Inc(Count);  
    if Count = 1 then NewsArray[Count] := _News
    else
      for i:=1 to Count-1 do
        if NewsArray[i].GetTitleName > _News.GetTitleName then
        begin
          for j:=Count downto i do NewsArray[j] := NewsArray[j-1];
          NewsArray[i]:=_News;
          Break;
        end
        else if i = Count-1 Then NewsArray[i+1]:=_News;
    Result := True;
  end
  else Result := False;
end;

function TSection.FindNews(_NewsName: string):string;  //проблема
var
 i:byte;
begin
  for i:=1 to GetCount do
    if NewsArray[i].GetTitleName = _NewsName Then
    begin
      Result :=i;
      Exit;
    end;
  Result := 0;
end;


function TSection.DeleteNews(_NewsName:string): boolean;  // и здесь тоже
var
  i,tmp: Byte;
begin
  Result := False;
  if count <> 0 then
  begin
   tmp := FindNews(_NewsName:string);
    if tmp <> 0 then 
    begin
      for i:=tmp to Count-1 do NewsArray[i] := NewsArray[i+1];
      NewsArray[Count] := nil;
      Dec(Count);    
      Result := True;
    end;
  end;
 end;

procedure TSection.SetSectionName(_SectionName: String);   
begin
  SectionName := _SectionName;
end;

function TSection.GetSectionName: String;   
begin
  Result := SectionName;
end;

procedure TSection.SetNextSection(_Section: TSection);
begin
  NextSection := _Section;
end;

function TSection.GetNextSection: TSection;
begin
  Result := NextSection;
end;

function TSection.GetMyArray: MyArray;
begin
  Result := NewsArray;
end;

function TSection.GetCount: integer;
begin
  Result := Count;
end;

end.
Вложения
Тип файла: zip rp.zip (7.7 Кб, 5 просмотров)

Последний раз редактировалось Igor922; 28.03.2013 в 04:24.
Igor922 вне форума Ответить с цитированием
Старый 28.03.2013, 07:51   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Igor922 Посмотреть сообщение
не получается правильно реализовать функцию поиска в массиве и удаление элемента из массива по названию(не по индексу)
Поиск по упорядоченному массиву разумнее всего вести методом деления пополам (бинарный поиск), а в неупорядоченном - перебором.
Удаление по названию делается в 2 этапа:
- поиск (получаем индекс),
- удаление по индексу (сжимаем массив к началу).
s-andriano вне форума Ответить с цитированием
Старый 28.03.2013, 11:45   #3
Igor922
Новичок
Джуниор
 
Регистрация: 27.03.2013
Сообщений: 3
По умолчанию

Проблема в том что мне нужно реализовать удаление по названию элемента,а НЕ по индексу(в этом вся проблема )

Последний раз редактировалось Igor922; 28.03.2013 в 11:48.
Igor922 вне форума Ответить с цитированием
Старый 28.03.2013, 12:26   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Цитата:
Сообщение от Igor922 Посмотреть сообщение
Проблема в том что мне нужно реализовать удаление по названию элемента,а НЕ по индексу(в этом вся проблема )
Захотел пользователь удалить по имени - вызвал функцию. А как она удаляет, это уже её дело. Пример: прораб говорит, снесите овощную лавку. Приходите на улицу - там 5 домов. Нашли овощную лавку - оказалась 3 домом. Снесли. {Остальные дома продвинули }
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.03.2013, 13:16   #5
Igor922
Новичок
Джуниор
 
Регистрация: 27.03.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Захотел пользователь удалить по имени - вызвал функцию. А как она удаляет, это уже её дело. Пример: прораб говорит, снесите овощную лавку. Приходите на улицу - там 5 домов. Нашли овощную лавку - оказалась 3 домом. Снесли. {Остальные дома продвинули }
Как происходит удаление из массива и смещение массива влево я понимаю)
Но у меня не получается правильно реализовать поиск и удаление по названию:
Код:
function TSection.FindNews(_NewsName: string):string;  //проблема
var
 i:byte;
begin
  for i:=1 to GetCount do
    if NewsArray[i].GetTitleName = _NewsName Then
    begin
      Result :=i;
      Exit;
    end;
  Result := 0;
end;


function TSection.DeleteNews(_NewsName:string): boolean;  // и здесь тоже
var
  i,tmp: Byte;
begin
  Result := False;
  if count <> 0 then
  begin
   tmp := FindNews(_NewsName:string);
    if tmp <> 0 then 
    begin
      for i:=tmp to Count-1 do NewsArray[i] := NewsArray[i+1];
      NewsArray[Count] := nil;
      Dec(Count);    
      Result := True;
    end;
  end;
 end;
в принципе можно сделать через TStringList ,но как это сделать не совсем понимаю

Последний раз редактировалось Igor922; 28.03.2013 в 13:59.
Igor922 вне форума Ответить с цитированием
Старый 29.03.2013, 13:04   #6
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

Код:
function TSection.FindNews(_NewsName: string):string;  
var
 i:byte;
begin
  for i:=1 to GetCount do
    if NewsArray[i].GetTitleName = _NewsName Then
    begin
      Result :=i;
      Exit;
    end;
  Result := 0;
end;
Не замечаете ничего странного?


Код:
function TSection.DeleteNews(_NewsName:string): boolean;  
var
  i,tmp: Byte;
begin
  Result := False;
  if count <> 0 then
  begin
   tmp := FindNews(_NewsName:string); //<-- зачем это?
    if tmp <> 0 then 
    begin
      for i:=tmp to Count-1 do NewsArray[i] := NewsArray[i+1];
      NewsArray[Count] := nil;
      Dec(Count);    
      Result := True;
    end;
  end;
 end;
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ООП на С++ dimys1237 Общие вопросы C/C++ 5 18.12.2012 22:28
ООП на Си intmain Общие вопросы C/C++ 10 13.12.2012 00:42
Проблема с ООП _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 1 06.06.2010 11:45
Паскаль ООП. Примеры программ с использованием ООП SeЯgey Помощь студентам 5 13.05.2009 21:55