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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.10.2014, 14:54
Deman1986 Deman1986 вне форума
Прохожий
 
Регистрация: 03.11.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию проблема с добавлением в список. Delphi7

Форумчане есть классы с их реализацией, появилась проблема не могу реализовать правильно добавление в список. вот код.
Код:
function TRam.AddSegment (const Segment: TSegment; Index: integer): integer;
var
  i,j,tmp: integer; // переменные локальные
begin
FCount:=GetCount+1; // увеличение счётчика
  if High(FRam) <= FCount+1 then setlength (FRam,FCount)
    else setlength(FRam,length(FRam) *2); // проверка возможности расширение массива в 2 раза
  for i:= 0 to FCount do
    if FRam[i].GetNum <> Segment.GetNum then Exit// проверка возможности добавления, если элемент существует выходим из процедуры
for i:=0 to GetCount do
  begin
    j:=i;
      tmp:=FRam[i];
  while (Index > 0) and (Index < GetCount) do begin// поиск места вставки
  for j:=0 downto Index do // внутренний цикл
   begin
   FRam[j+1]:=FRam[j];
       FRam[Index]:=Segment;
        Result:=Index;
          Exit;
            end;
              Result:=-1;
end;
вот что пишет преподаватель:
Ошибки в методе добавления:
- индексация в дин. массивах начинается с 0, что надо учитывать в циклах
- проверка необходимости расширения массива сделана неправильно (кстати, проверка именно НЕОБХОДИМОСТИ, а не ВОЗМОЖНОСТИ!)
- проверка существования элемента реализована неправильно (по заданию уникальность номеров сегментов не требуется)
- поиск места вставки и сдвиг элементов с помощью ВЛОЖЕННЫХ циклов реализованы неправильно - это должны быть ДВА ОТДЕЛЬНЫХ цикла.
Спасибо.
Ответить с цитированием
  #2  
Старый 07.10.2014, 15:55
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Как-то так
Код:
function TRam.AddSegment (const Segment: TSegment; Index: integer): integer;
var
  i,j,tmp: integer; // переменные локальные
begin
  Result:=-1;
  // контроль параметров
  if Index >= FCount then Exit; 
  if Index < 0 then Exit; 


// сначала проверка необходимости вставки
// это на случай, если нужны уникальные номера
// если не надо, то следующий цикл комментируем
  for i:= 0 to FCount-1 do begin
    if FRam[i].GetNum = Segment.GetNum then begin
      Result:=i;
      Exit;
    end;
  end;


// теперь посмотрим, есть ли место в массиве
  FCount:=GetCount+1; // увеличение счётчика
  if High(FRam) >= FCount then begin 
    //место есть, ничего делать не надо
  end else begin
    // надо увеличивать
    // расширение массива в 2 раза
    setlength(FRam,length(FRam) *2);
  end;

// сдвигаем
  for i:= FCount downto (Index+1) do
    FRam[i] := FRam[i-1]; 

// записываем 
  FRam[Index]:=Segment;
//выдаём - куда записали
  Result:=Index;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
Deman1986 (07.10.2014)
  #3  
Старый 07.10.2014, 19:38
Deman1986 Deman1986 вне форума
Прохожий
 
Регистрация: 03.11.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо большое. Еще один вопросик. У меня есть процедура загрузки из файла. Компилятор ругается на несовместимость типов. Как исправить незнаю.
Код:
procedure TRam.LoadFile (const FileName: string);
var
f: TextFile;
  s,st,st2,st3,name: string;
    i,cop,j,g: integer;
      Shelf: TSegment;
        Page: TPage;
          flag: Boolean;
begin
Clear;
  AssignFile(f,FileName); // открыли файл
    Reset(f);
      while not Eof(f) do // цикл сборки массива
begin
Readln(f,s);
  if s = ''then Continue;
      i:=AddSegment(StrToInt(s)); // вот тут ошибка.
      if i < 0 then Continue;
        Shelf:= FRam[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); // преобразуем тип
        Page:=TPage.Create(cop,true); // создали информационный объект
          Shelf.AddTPage(Page); // добавили его
          end;
              end;
CloseFile(f);  // закрыли файл
end;
Я поминаю, STrToInt преобразует число в строку, но грешу на то, что AddSegment с 2 входными параметрами Segment:TSegment - а это сегмент и Index:Integer - это число.

Последний раз редактировалось Deman1986, 07.10.2014 в 19:55.
Ответить с цитированием
  #4  
Старый 07.10.2014, 19:44
Deman1986 Deman1986 вне форума
Прохожий
 
Регистрация: 03.11.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

А поиск места вставки не нужен??
Ответить с цитированием
  #5  
Старый 08.10.2014, 01:14
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Первый раз вижу такой стиль оформления кода - ступенькой.
А ошибка у вас возникает из за пропущенного параметра.
Вот у вас описание как выглядит:
Код:
AddSegment (const Segment: TSegment; Index: integer): integer;
а вот так вызов:
Код:
i:=AddSegment(StrToInt(s)); 
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 08.10.2014, 09:38
Deman1986 Deman1986 вне форума
Прохожий
 
Регистрация: 03.11.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Так учили в колледже ))).Вот я думаю как вставить недостающий параметр.

Последний раз редактировалось Deman1986, 08.10.2014 в 09:41.
Ответить с цитированием
  #7  
Старый 08.10.2014, 11:01
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Deman1986
...Вот я думаю как вставить недостающий параметр.
Или ещё один TSegment нужно "заварить", либо
Код:
...
i:= AddSegment(Shelf, StrToInt(s)); 
...
Ответить с цитированием
  #8  
Старый 08.10.2014, 11:19
Deman1986 Deman1986 вне форума
Прохожий
 
Регистрация: 03.11.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Вставляю, Shelf компилятор пишет что cop:=0; ни где не задействован, добавляю ещё один Segment:TSegment; тоже самое. Вот из-за этого сижу думаю, пробовал так и так)).
Ответить с цитированием
  #9  
Старый 24.11.2014, 19:50
Deman1986 Deman1986 вне форума
Прохожий
 
Регистрация: 03.11.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

форумчане препод вернул, вот что пишет Добавление: что определяет параметр index? Если номер ячейки массива, то это неправильно.
Я уже писал что массив должен содержать номера сегментов, причем - в произвольном порядке.
Например: 23, 12, 44, 07, 10 ...
Поэтому номер сегмента не обязан совпадать с номером ячейки массива, где он хранится.
Надо организовать поиск сегмента с номером index (аналогично методу удаления), после чего сдвинуть ХВОСТОВУЮ часть вправо.

Совет по методам работы с файлами. Самое простое решение - построчное хранение: записали в строку число сегментов, потом в цикле в ОТДЕЛЬНЫЕ строки - номер сегмента, число страниц и данные о каждой странице (все - в отдельные строки). Это упрощает обратную загрузку, т.к. не требуется разбор строк на отдельные составляющие.

метод удаления:
Код:
function TRam.DelSegment (TSegment: integer): integer;
var
i,j: integer;
begin
  Result:=0;
    for i:=0 to GetCount-1 do
      if FRam[i].GetNum = TSegment then
begin
for j:=i to GetCount-1 do
  FRam[j]:= FRam[j+1];
    Dec(FCount);
      if FCount< Length(FRam) div 2 then
        SetLength(FRam,FCount);
           Result:= TSegment;
              Exit;
                end;
end;
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter