В этой статье я хотел бы поговорить о том, как можно удалить элементы массива путем смещения. Многие применяют технологию удаления — путем замены, удаляемых элементов например нулями или еще чем-то, а при выводе элементов массива их просто не выводят. Многие просто записывают в другой массив нужные элементы и потом выводят его, это не есть правильно, то есть фактически у нас же есть массив, значит мы в нем должны удалить элементы, а не переместить в другой, а если эти элементы не выводить, то они же фактически остаются там, и занимают место в памяти, что не есть хорошо. Алгоритм путем смещения очень простой, просто с элементы, которого надо удалить, например все «нули» начинается смещение элементов до конца массива, потом цикл начинается заново и до тех пор, пока не будет элементов в массиве, которые необходимо удалить. На форме у меня следующие компоненты, мы будет все это делать не в консольном режиме, в а графическом

  • TStringGrid
  • TButton

В TStringGrid свойстве Options-goEditing установить в True, в FixedCols, FixedRows установите в 0, в свойстве RowCount установите 1 (так как мы будем работать с одномерным массивом).

Далее на событие OnClick Button я написал следующий код

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 i,j:integer;
begin
   try
    j:=0;
    i:=0;
    while (i<=StringGrid1.ColCount-1) do
     begin
      if StringGrid1.Cells[i,0]='0' then
       begin
        for j:=i to StringGrid1.ColCount-1 do
         begin
          StringGrid1.Cells[j,0]:=StringGrid1.Cells[j+1,0];
         end;
        i:=i-1;
        StringGrid1.ColCount:=StringGrid1.ColCount-1;
       end;
      inc(i);
     end;
   except
    on e:Exception do
   end;
end;

Все, что говорил выше, все так  реализовано здесь. Только забыл сказать, что мы еще уменьшаем размерность массива, в нашем случае количество столбцов, ну раз мы удалили элемент, то и размер его поменяется ведь так? В следующий статьях про массивы мы рассмотрим — сортировки массива методом пузырька, методом минимального элемента, ну и другие разные задачки с массивами.

Кстати, насчет темы программирования — существует множество сред разработки, языков программирования, компиляторов, одним из популярных языков программировании в настоящее время является Java. Если Вы захотите научиться на нем программировать, то Вам просто необходимо будет скачать книгу Философия Java, которая поможет Вам узнать более новые приемы и методы программирования на данном языке.

Автор статьи — Andrey53

Метки: ,




К записи “Удаление элементов массива путем смещения” оставлено комментариев: 4.

  1. den:

    если stringgrid то проще сделать
    for x:=stringgrid1.row to stringgrid1.rowcount-1 do
    begin
    stringgrid1.rows[x].commatext:=stringgrid1.rows[x+1].commatext;
    end;
    stringgrid1.rowcount:=stringgrid1.rowcount-1;

  2. den:

    Правда это чтоб удалить выбранную строку в стринггриде

  3. Александр:

    помогите сделать два цикла один идет добавляет данные а второй если значение равно нулю то удаляет строку притом что они не должны мешать друг другу ,у меня что то как то криво получается

  4. dark:

    Помогите разобраться. Нужно что бы в combobox были имена всех дисков, кроме тех, что уже есть в listbox…

    procedure TForm1.FormCreate(Sender: TObject);
    var
    i, j, i_name, j_name: integer;

    drv_name: array [0..25] of string=('A:\', 'B:\', 'C:\', 'D:\', 'E:\', 'F:\',
    'G:\', 'H:\', 'I:\', 'J:\', 'K:\', 'L:\',
    'M:\', 'N:\', 'O:\', 'P:\', 'Q:\', 'R:\',
    'S:\', 'T:\', 'U:\', 'V:\', 'W:\', 'X:\',
    'Y:\', 'Z:\');

    begin
    CreateDrivesList(ListBox1.Items);

    i_name:= 0;
    j_name:= 0;

    for j:=j_name to ListBox1.Items.Count-1 do
    begin
    for i:= i_name to 25 do
    begin
    if drv_name[i] ListBox1.Items.Strings[j] then

    ComboBox1.Items.Add(drv_name[i]);
    i_name:= i_name+1;
    end;
    end;
    ListBox1.Refresh;
    ComboBox1.Refresh;

Оставить комментарий

Вы можете использовать следующие теги:

*