• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Одномерные Массивы

  • Автор темы Izekil
  • Дата начала
Статус
Закрыто для дальнейших ответов.
I

Izekil

Помогите пожалуйста с данной задачкой:
Одномерный массив а длиной М. Переместить нулевые элементы массива в конец, сдвинув остальные элементы влево.
Приведу то, что я сделал на данный момент:
настроил 2 стрингрида и
var
k:integer;
a:array[1..30] of integer;


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
k:=strtoint(edit1.Text);
if (k>0) and (k<=30) then
s1.ColCount:=k
else
ShowMessage('Введи размер массива >0 и <=30 ')

end;

procedure TForm1.Button3Click(Sender: TObject);
var
i,j,n:integer;
begin
for i:=1 to k do
a:=strtoint(S1.Cells[i-1,0]);

end;
 
S

Senset

два цикла
1) с постусловием проверяет что элементы (хотя бы один) были перемещены (флаг=1), флаг при каждом проходе цикла=0 (т.е. в начале цикла)
2) с предусловием от начала до конца цикла перебор элементов, в теле условие элемент=нуль и если попали по условию перестановку местами и флаг=1
 
S

sinkopa

Помогите пожалуйста с данной задачкой:
Одномерный массив а длиной М. Переместить нулевые элементы массива в конец, сдвинув остальные элементы влево.
Я не понял что там у Вас стриггриды делают и какое они вообще отношение к Вашему вопросу имеют... :)
Что касается сдвига ненулевых элементов влево - это проще всего (и быстрее) сделать через вспомогательный временный массив.
Код:
var
a:array[1..30] of integer;
implementation

{$R *.dfm}

procedure MoveZeroAtEnd(var a: array of Integer);
var
temp: Array of Integer;
i,n, Len: Integer;
begin
Len := Length(a);
SetLength(temp,Len); // выставляем длину временного массива "temp" равной длине массива "a"
n := 0;
for i := 0 to Len-1 do
begin
if (a[i] > 0) then // выкладываем в "temp" последовательно все ненулевые элементы
begin
temp[n] := a[i];
Inc(n);
end;
end;

for i := 0 to n-1 do // возвращаем в "a" ненулевые элементы (со сдвигом влево)
a[i] := temp[i];

for i := n to Len-1 do // заполяем остаток нулями
a[i] := 0;

SetLength(temp,0); // освобождаем память занятую "temp"
end;


procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
s: string;
begin
{ заполнение массива }
Randomize;
s := '';
for i := 1 to 30 do
begin
if (Random(2) > 0) then
a[i] := Random(100)+1
else
a[i] := 0;
s := s + IntToStr(a[i])+ #13;
end;
ShowMessage('Несортированный массив'+#13+s);

{ "выталкивание" нолей в конец массива }
MoveZeroAtEnd(a);

s := '';
for i := 1 to 30 do
s := s + IntToStr(a[i])+ #13;

ShowMessage('Cортированный массив'+#13+s);

end;
 
I

Izekil

Я не понял что там у Вас стриггриды делают и какое они вообще отношение к Вашему вопросу имеют... :)
Что касается сдвига ненулевых элементов влево - это проще всего (и быстрее) сделать через вспомогательный временный массив.
Код:
var
a:array[1..30] of integer;
implementation

{$R *.dfm}

procedure MoveZeroAtEnd(var a: array of Integer);
var
temp: Array of Integer;
i,n, Len: Integer;
begin
Len := Length(a);
SetLength(temp,Len); // выставляем длину временного массива "temp" равной длине массива "a"
n := 0;
for i := 0 to Len-1 do
begin
if (a[i] > 0) then // выкладываем в "temp" последовательно все ненулевые элементы
begin
temp[n] := a[i];
Inc(n);
end;
end;

for i := 0 to n-1 do // возвращаем в "a" ненулевые элементы (со сдвигом влево)
a[i] := temp[i];

for i := n to Len-1 do // заполяем остаток нулями
a[i] := 0;

SetLength(temp,0); // освобождаем память занятую "temp"
end;


procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
s: string;
begin
{ заполнение массива }
Randomize;
s := '';
for i := 1 to 30 do
begin
if (Random(2) > 0) then
a[i] := Random(100)+1
else
a[i] := 0;
s := s + IntToStr(a[i])+ #13;
end;
ShowMessage('Несортированный массив'+#13+s);

{ "выталкивание" нолей в конец массива }
MoveZeroAtEnd(a);

s := '';
for i := 1 to 30 do
s := s + IntToStr(a[i])+ #13;

ShowMessage('Cортированный массив'+#13+s);

end;

Спасибо большое! Разберусь =)
 
G

gpatron

можно и без вспомогательного массива.
да и как-то побыстрее будет работать чем с доп. массивом
:)

Код:
b:=true;
for i:=1 to M do
begin
if b and (a[i]=0) then begin
i1:=i;
b:=false;
end;
if not b and (a[i]<>0) then begin
a[i1]:=a[i];
a[i]:=0;
i1:=i1+1;
end;
end;
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!