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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.11.2011, 12:57
MichaelNV MichaelNV вне форума
Прохожий
 
Регистрация: 13.11.2011
Сообщения: 4
Репутация: 10
По умолчанию Удаление элементов из статического массива

Помогите решить такую задачу. Есть процедура заполняющая каждый следующий элемент массива данными при клике на кнопку "Добавить". Есть кнопка "Удалить" при нажатии на которую должно происходить удаление одного выбранного элемента массива при условии что он доступен (true). На доступность влияет сам пользователь. Как сделать так, чтобы недоступные элементы не меняли своего значения при удалении других доступных элементов?

Последний раз редактировалось MichaelNV, 13.11.2011 в 13:01.
Ответить с цитированием
  #2  
Старый 13.11.2011, 13:11
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

добавить флаг существует/удалён (true)
Ответить с цитированием
  #3  
Старый 13.11.2011, 13:13
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

попробую помочь.
Но неясно задание
Что значит "Удалить элемент"?
Поставить метку что он удален?
или сдвинуть остальные элементы массива чтобы закрыть дырку?
В первом случае- все примитивно.
Во втором случае надо применять не статич массив а динамический.
Ответить с цитированием
  #4  
Старый 13.11.2011, 16:59
MichaelNV MichaelNV вне форума
Прохожий
 
Регистрация: 13.11.2011
Сообщения: 4
Репутация: 10
По умолчанию

Нужно сделать так, чтобы свободные элементы сдвигались, тем самым закрыв дыру. А недоступные элементы остались при своих значениях.
Например есть такой массив [1,2,3,4] (красные - недоступные). Нужно чтобы после удаления, например, первого элемента стало так: [1,2,4]. При добавлении нового элемента он должен вставать по порядку так:[1,2,3,4,5,...].
Ответить с цитированием
  #5  
Старый 13.11.2011, 18:21
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

И опять неясно. Ты пишешь что удаляешь первый элемент но насамом деле-третий.
И теперь уже непонятно в чем разница между доступными и недоступными злементами.
Сделал как понял.
При удалении ставится метка об удалении
При добавлении длина массива увеличивается на 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  
Старый 13.11.2011, 19:14
MichaelNV MichaelNV вне форума
Прохожий
 
Регистрация: 13.11.2011
Сообщения: 4
Репутация: 10
По умолчанию

Спасибо! Буду разбираться Я имел в виду что, удаляя первый элемент, третий занимает его место и становится первым, т.е. доступные элементы могут менять значения и вставать по порядку, а не доступные не могут и удалению не подлежат. Если новые элементы добавляются, то они по умолчанию доступны и встают по порядку.
Ответить с цитированием
  #7  
Старый 13.11.2011, 19:41
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

Что должно произойти при удалении?
вариант 1 (что я сделал)
Все элементы поднимаются на 1 шаг и занимают места в том же порядке
вариант 2. Недоступные элементы привязаны к своим позциям и не перемещаются,а доступные сдвигаются на 1 шаг, при этом перескакивая через недоступные.
При этом их порядок следования нарушается

Так что же надо?

Здесь я использовал динамич массив. При бобавлении его размер увеличивается и новый встает последним
При удалении длина уменьшается на 1 запись.
Массив представляет собой массив записей, содержащих признаки удаления, доступности и данные (у меня integer но это не существенно)
Ответить с цитированием
  #8  
Старый 13.11.2011, 20:10
MichaelNV MichaelNV вне форума
Прохожий
 
Регистрация: 13.11.2011
Сообщения: 4
Репутация: 10
По умолчанию

Нужен второй вариант.
Например так было: [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  
Старый 13.11.2011, 20:26
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Используй очереди, или двунаправленные списки, там это реализовать гораздо проще. Если уж так надо массив, то не обессудьте.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #10  
Старый 14.11.2011, 05:44
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Код:
кнопка "Удалить" при нажатии на которую должно происходить удаление одного выбранного элемента массива при условии что он доступен (true).

я так понял, что в оригинальном заданиий про сдвигание ни слова нету, значит оно и не нужно: или используешь готовые классы-контейеры, или добавляешь флаг что удалён, или пустое значение типа
const Udaleno = -MaxInt+42; или если в записи строка, то guid
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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