Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Удаление элемента из массива

48K
17 августа 2009 года
Alyonka89
7 / / 17.08.2009
Здравствуйте!
Помогите пожалуйста с удалением элементов из массива.
Нужно удалить из массива Х, состоящего из n элементов, первые четыре нулевых элемента.
Если использую for I := n downto 1 do удаляются 4 последних нулевых элемента,
а если использую for I := 1 to n do не удаляется 0, если он следует сразу за другим нулём.
Что нужно изменить? Заранее спасибо за помощь.

Код:
procedure TForm1.Button1Click(Sender: TObject);
type massiv=array [1..50] of real;
procedure del_mass(m, kol:integer; var y:massiv);
var i: integer;
begin
  for I := m to kol-1 do
    y:=y[i+1];
end;
var i, n, k: byte;
    x: massiv;
begin
  n:=strtoint(edit1.text);
  for I := 1 to n do
    x:=strtofloat(stringgrid1.Cells[i,0]);
  k:=0;
  for I := n downto 1 do
    begin
      if x=0 then
        begin
          if k>=4 then break
          else
            del_mass(i,n,x);
          k:=k+1;
        end;
    end;
  for I := 1 to n-k do
    stringgrid2.cells[i,0]:=floattostr(x);
end;
12K
17 августа 2009 года
Ghox
297 / / 26.07.2009
Цитата: Alyonka89
Здравствуйте!
Помогите пожалуйста с удалением элементов из массива.
Нужно удалить из массива Х, состоящего из n элементов, первые четыре нулевых элемента.
Если использую for I := n downto 1 do удаляются 4 последних нулевых элемента,
а если использую for I := 1 to n do не удаляется 0, если он следует сразу за другим нулём.
Что нужно изменить? Заранее спасибо за помощь.


Попробуйте вот так:

Код:
procedure TForm1.Button1Click(Sender: TObject);
type massiv=array [1..50] of real;
procedure del_mass(m, kol:integer; var y:massiv);
var i: integer;
begin
  for I := m to kol-1 do
    y:=y[i+1];
end;
var i, n, k: byte;
    x: massiv;
begin
  n:=strtoint(edit1.text);
  for I := 1 to n do
    x:=strtofloat(stringgrid1.Cells[i,0]);
  k:=0;
  for I := [COLOR="Red"]1 to n[/COLOR] do
    begin
      [COLOR="Red"]while[/COLOR] x=0 [COLOR="Red"]do[/COLOR]
        begin
          if k>=4 then break
          else
            del_mass(i,n,x);
          k:=k+1;
        end;
      [COLOR="Red"]if k>=4 then break;[/COLOR]
    end;
  for I := 1 to n-k do
    stringgrid2.cells[i,0]:=floattostr(x);
end;
303
17 августа 2009 года
makbeth
1.0K / / 25.11.2004
Это ж надо было умудриться на ровном месте наваять 3 (!) вложенных (!) цикла :)
А между тем, если немного подумать, то все это дело можно очень очень сильно упростить:
Код:
procedure TForm1.Button1Click(Sender: TObject);
type massiv = array [1..50] of real;
var i, n, k, cnt: byte;
    x: massiv;
begin
  n := strtoint(edit1.text);
  for i := 1 to n do
    x := strtofloat(stringgrid1.Cells[i,0]);
   
  i := 1;
  k := 1;
  cnt := 0;
  while i <= n do
  begin
    if i <> k then x[k] := x;
    if x[k] = 0 and (cnt < 4) then Inc(cnt)
    else Inc(k);
    Inc(i);
  end;
 
  for i := 1 to n - cnt do
    stringgrid2.cells[i, 0]:=floattostr(x);
end;
303
17 августа 2009 года
makbeth
1.0K / / 25.11.2004
А еще можно исключить лишнюю переменную cnt :)
Код:
procedure TForm1.Button1Click(Sender: TObject);
type massiv = array [1..50] of real;
var i, n, k: byte;
    x: massiv;
begin
  n := strtoint(edit1.text);
  for i := 1 to n do
    x := strtofloat(stringgrid1.Cells[i,0]);
   
  i := 1;
  k := 0;
  while i <= n do
  begin
    if k <> 0 then x[i - k] := x;
    if (x[i - k] = 0) and (k < 4) then Inc(k);
    Inc(i);
  end;
 
  for i := 1 to n - k do
    stringgrid2.cells[i, 0]:=floattostr(x);
end;
Только правда смысла в этом никакого нет...
48K
18 августа 2009 года
Alyonka89
7 / / 17.08.2009
Большое спасибо за помощь
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог