![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Форумчане есть классы с их реализацией, появилась проблема не могу реализовать правильно добавление в список. вот код.
Код:
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
|
|||
|
|||
|
Как-то так
Код:
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
|
|||
|
|||
|
Спасибо большое. Еще один вопросик. У меня есть процедура загрузки из файла. Компилятор ругается на несовместимость типов. Как исправить незнаю.
Код:
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;Последний раз редактировалось Deman1986, 07.10.2014 в 19:55. |
|
#4
|
|||
|
|||
|
А поиск места вставки не нужен??
|
|
#5
|
||||
|
||||
|
Первый раз вижу такой стиль оформления кода - ступенькой.
А ошибка у вас возникает из за пропущенного параметра. Вот у вас описание как выглядит: Код:
AddSegment (const Segment: TSegment; Index: integer): integer; Код:
i:=AddSegment(StrToInt(s)); |
|
#6
|
|||
|
|||
|
Так учили в колледже ))).Вот я думаю как вставить недостающий параметр.
Последний раз редактировалось Deman1986, 08.10.2014 в 09:41. |
|
#7
|
||||
|
||||
|
Цитата:
Код:
... i:= AddSegment(Shelf, StrToInt(s)); ... |