Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2013, 22:47   #1
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию Удалить элемент массива

Можно как то удалить элемент динамического массива, оставив элементы в порядке каком были плюс уменьшив его размер
Вот например:
был массив
1,2,3,4,5,6,7,8,9

мне надо удалить 3
стал массив
1,2,4,5,6,7,8,9
_____________
Свойственно, есть задача к которой я придумал алгоритм, и пытаюсь реализовать, только вот не знаю как быть с проблемой которая выше.
Есть считалка, я ввожу количество слов, и игроков.
например:
8 слов и 5 игроков
___________________
слова :1 2 3 4 5 6 7 8
игроки: 1 2 3 4 5 2 3 4
____________________
4-й игрок выбывает
___________________
слова :1 2 3 4 5 6 7 8
игроки: 1 2 3 1 2 3 1 2
____________________
2-й игрок выбывает
_______________________
слова :1 2 3 4 5 6 7 8
игроки: 1 3 1 3 1 3 1 3
_____________________
3-й выбывает, остается 1-й игрок

Я думаю, что если таким образом удалять из массива тот или иной элемент(игроков) то останется один, который можно будет вывести в результат выигравшего игрока!

Что скажете?

Последний раз редактировалось viks1; 31.03.2013 в 22:51. Причина: Менял заглавие
viks1 вне форума Ответить с цитированием
Старый 31.03.2013, 23:41   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Можно удалить N-й элемент, сдвинув все элементы, начиная с (N+1)-го на одну позицию в сторону начала массива.
Можно уменьшить размер массива, выделив другой массив нужного размера, скопировав туда содержимое исходного и удалить исходный.
Можно совместить эти две операции, чтобы не копировать массив дважды.
Но в любом случае - это достаточно ресурсоемкая операция.

Кроме того, в Вашем примере, насколько я понимаю, Вы хотите удалять не один элемент, а несколько элементов, имеющих совпадающие идентификаторы.
Это тоже можно сделать за один проход цикла, если известно количество удаляемых элементов и за два - если заранее неизвестно.
Кроме того, можно держать массив максимальной длины и отдельно переменную, которая указывает, насколько он заполнен. Тогде описанная выше операция будет осуществляться за один проход.
s-andriano вне форума Ответить с цитированием
Старый 31.03.2013, 23:46   #3
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Можно удалить N-й элемент, сдвинув все элементы, начиная с (N+1)-го на одну позицию в сторону начала массива.
Можно уменьшить размер массива, выделив другой массив нужного размера, скопировав туда содержимое исходного и удалить исходный.
Можно совместить эти две операции, чтобы не копировать массив дважды.
Но в любом случае - это достаточно ресурсоемкая операция.

Кроме того, в Вашем примере, насколько я понимаю, Вы хотите удалять не один элемент, а несколько элементов, имеющих совпадающие идентификаторы.
Это тоже можно сделать за один проход цикла, если известно количество удаляемых элементов и за два - если заранее неизвестно.
У меня есть ограничение, 30000. Я думаю это не сильно много ресурсов займет.
Цитата:
Кроме того, можно держать массив максимальной длины и отдельно переменную, которая указывает, насколько он заполнен. Тогде описанная выше операция будет осуществляться за один проход.
этот момент немного не понял.

Последний раз редактировалось viks1; 31.03.2013 в 23:50.
viks1 вне форума Ответить с цитированием
Старый 01.04.2013, 07:39   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от viks1 Посмотреть сообщение
У меня есть ограничение, 30000. Я думаю это не сильно много ресурсов займет.
Если Вы пользуетесь 32-разрядным компилятором и один элемент не слишком велик (например, не содержит массив строк), то - вполне.
Цитата:
этот момент немного не понял.
Сокращение длины массива на 1 элемент - довольно затратная операция.
Но если Вам нужно использовать часть массива, вполне уместно хранить номер последнего элемента (который при необходимости менять - при добавлении или уничтожении части элементов).
s-andriano вне форума Ответить с цитированием
Старый 01.04.2013, 07:45   #5
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Если Вы пользуетесь 32-разрядным компилятором и один элемент не слишком велик (например, не содержит массив строк), то - вполне.
Сокращение длины массива на 1 элемент - довольно затратная операция.
Но если Вам нужно использовать часть массива, вполне уместно хранить номер последнего элемента (который при необходимости менять - при добавлении или уничтожении части элементов).
Смотрите какая есть еще идея, не обязательно удалять. Можно просто заменить нужный элемент.

Я пробовал, только не совсем корректно получалось. Да, оно заменяло нужный элемент, но я не знаю как перевести все это в функции и когда надо вызывать столько раз, сколько нужно. Я мог вызвать всего один раз!(и то не функцию, а просто процедуру на ButtonClick)
Код:
type
   mass = array of integer;

procedure TForm1.Button1Click(Sender: TObject);
var
igrmass:mass;
Code,i,j,n,m,b,k,p, slo, che,win, res:integer;
begin
   for i:=0 to slo-1 do
    begin
      for j := 1 to che do
       begin
        k:=k+1;
        p:=p+1;
        igrmass[p]:=k;
       end;
      if k=che then k:=0;
    end;
    res:=igrmass[i];
    for s := 0 to slo-1 do
      begin
       if igrmass[s]=res then
         begin
           for b:=0 to slo-1 do
              begin
                igrmass[s]:=igrmass[s+1];
                res:=igrmass[s];
              end;
            end
            else
           igrmass[s]:=igrmass[s];
      end;
      end;

 Label1.Caption:='выпадает игрок  '+IntToStr(res);
  win:=igrmass[s];

  Label2.Caption:='выиграет '+IntToStr(win);

end;
viks1 вне форума Ответить с цитированием
Старый 02.04.2013, 13:35   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Этот код не может корректно работать, т.к. в нем используются неинициализированные переменные.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить елемент из списка Pein95 Общие вопросы C/C++ 1 31.01.2013 03:08
Найти минимальний елемент массива. ПРием данних как указатель на начало масива , и как копию данных. galaxyblazer Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 17.04.2012 16:57
По массивам, SOS! из целочисленного массива удалить из массива элементы, встречающиеся менее 3-х раз prelest' Паскаль, Turbo Pascal, PascalABC.NET 1 23.05.2011 22:37
Удалить элемент массива pavel42 Помощь студентам 14 21.05.2009 08:52