![]() |
|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
![]() Используй очереди, или двунаправленные списки, там это реализовать гораздо проще. Если уж так надо массив, то не обессудьте.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#10
|
|||
|
|||
![]() Код:
кнопка "Удалить" при нажатии на которую должно происходить удаление одного выбранного элемента массива при условии что он доступен (true). я так понял, что в оригинальном заданиий про сдвигание ни слова нету, значит оно и не нужно: или используешь готовые классы-контейеры, или добавляешь флаг что удалён, или пустое значение типа const Udaleno = -MaxInt+42; или если в записи строка, то guid |