![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Помогите решить такую задачу. Есть процедура заполняющая каждый следующий элемент массива данными при клике на кнопку "Добавить". Есть кнопка "Удалить" при нажатии на которую должно происходить удаление одного выбранного элемента массива при условии что он доступен (true). На доступность влияет сам пользователь. Как сделать так, чтобы недоступные элементы не меняли своего значения при удалении других доступных элементов?
Последний раз редактировалось MichaelNV, 13.11.2011 в 13:01. |
|
#2
|
|||
|
|||
|
добавить флаг существует/удалён (true)
|
|
#3
|
|||
|
|||
|
попробую помочь.
Но неясно задание Что значит "Удалить элемент"? Поставить метку что он удален? или сдвинуть остальные элементы массива чтобы закрыть дырку? В первом случае- все примитивно. Во втором случае надо применять не статич массив а динамический. |
|
#4
|
|||
|
|||
|
Нужно сделать так, чтобы свободные элементы сдвигались, тем самым закрыв дыру. А недоступные элементы остались при своих значениях.
Например есть такой массив [1,2,3,4] (красные - недоступные). Нужно чтобы после удаления, например, первого элемента стало так: [1,2,4]. При добавлении нового элемента он должен вставать по порядку так:[1,2,3,4,5,...]. |
|
#5
|
|||
|
|||
|
И опять неясно. Ты пишешь что удаляешь первый элемент но насамом деле-третий.
И теперь уже непонятно в чем разница между доступными и недоступными злементами. Сделал как понял. При удалении ставится метка об удалении При добавлении длина массива увеличивается на 1 и новый элемент добавляется в конец Уплотнение происходит так Все элементы ниже индекса поднимаются вверх на 1 позицию тем самым закрывая дырку. Длина массива уменьшается на 1 Код:
type
TArr=array of record
Enabled,Deleted:boolean;
Data:integer;
end;
{-------------------------------------------
процедура ставит метку удаления
на строке Index
Возвращает индекс удаленного элемента
Если удаление запрещено- то -1
---------------------------------------------}
function DeleteRec(var Arr:TArr;Index:integer):integer;
begin
if Arr[Index].Enabled then
begin
Arr[Index].Deleted:=true;
Result:=Index
end
else Result:=-1;
end;
{------------------------------------------------
процедура сдвигает хвост массива на строку Index
уменьшает длину массива на 1
--------------------------------------------------}
procedure ShiftRec(var Arr:TArr;Index:integer);
var
i:integer;
begin
if Index <0 then Exit
else
begin
for i:=Index+1 to High(Arr) do
Arr[i]:=Arr[i+1];
SetLength(Arr,Length(Arr)-1);
end;
end;
{----------------------------------------------------
процедура добавляет запись в конец массива
увеличивает длину массива на 1
-----------------------------------------------------}
procedure AddRec(var Arr:TArr;Dat:integer;Enabl:boolean);
begin
SetLength(Arr,Length(Arr)+1);
Arr[High(Arr)].Data:=Dat;
Arr[High(Arr)].Enabled:=Enabl;
end; |
|
#6
|
|||
|
|||
|
Спасибо! Буду разбираться
Я имел в виду что, удаляя первый элемент, третий занимает его место и становится первым, т.е. доступные элементы могут менять значения и вставать по порядку, а не доступные не могут и удалению не подлежат. Если новые элементы добавляются, то они по умолчанию доступны и встают по порядку. |
|
#7
|
|||
|
|||
|
Что должно произойти при удалении?
вариант 1 (что я сделал) Все элементы поднимаются на 1 шаг и занимают места в том же порядке вариант 2. Недоступные элементы привязаны к своим позциям и не перемещаются,а доступные сдвигаются на 1 шаг, при этом перескакивая через недоступные. При этом их порядок следования нарушается Так что же надо? Здесь я использовал динамич массив. При бобавлении его размер увеличивается и новый встает последним При удалении длина уменьшается на 1 запись. Массив представляет собой массив записей, содержащих признаки удаления, доступности и данные (у меня integer но это не существенно) |
|
#8
|
|||
|
|||
|
Нужен второй вариант.
Например так было: [1,2,3,4,5,6,7,8,9,10], удалили 1 элемент - [1,2,3,4,5,6,7,8,10], удалили 5 элемент - [1,2,3,4,5,6,7,10], удалили 6 элемент - [1,2,3,4,5,7,10] . А при добавлении новых они будут вставать по порядку так: [1,2,3,4,5,6,7,8,9,10]. Удалять можно будет до тех пор пока все зеленые не удалятся. |
|
#9
|
||||
|
||||
|
Используй очереди, или двунаправленные списки, там это реализовать гораздо проще. Если уж так надо массив, то не обессудьте.
|
|
#10
|
|||
|
|||
|
Код:
кнопка "Удалить" при нажатии на которую должно происходить удаление одного выбранного элемента массива при условии что он доступен (true). я так понял, что в оригинальном заданиий про сдвигание ни слова нету, значит оно и не нужно: или используешь готовые классы-контейеры, или добавляешь флаг что удалён, или пустое значение типа const Udaleno = -MaxInt+42; или если в записи строка, то guid |