Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.03;
Скачать: CL | DM;

Вниз

Вопрос о массиве.   Найти похожие ветки 

 
Chaynik   (2003-10-21 07:34) [0]

Здравствуйте, уважемые мастера. Возник вопрос, необходимо в динамическом массиве([1,2,3,0,1,0,0,5]) удалить все нулевые значения.


 
Нурик ©   (2003-10-21 07:42) [1]

Какого типа массив, если это цепь то нужно удалить промежуточные звенья и соединить остальные. Ну короче напиши мне на мыло, как нибудь помогу!


 
Chaynik   (2003-10-21 08:07) [2]

Нурик ты наверное меня не понял, массив целочисленный,([1,2,3,0,1,0,0,5]) и надо что бы в итоге получился ([1,2,3,1,5]) вот такой массив. А как не знаю.


 
MBo ©   (2003-10-21 08:13) [3]

Как объявлен массив?


 
Нурик ©   (2003-10-21 08:40) [4]

Помоему ты меня не понял, динамический массив может быть объявлен обычным способом либо в виде цыпочки. Лучше скажи как объявлен твой массив?


 
KSergey ©   (2003-10-21 08:43) [5]

Если бы он знал - неужели бы не сказал?


 
Chaynik   (2003-10-21 08:47) [6]

Массив обьявлен SetLength ( massiv, length);


 
KSergey ©   (2003-10-21 08:50) [7]

Это не объявление.
Хотя по этой строчке в принципе можно догадаться, как он объявлен.

PS
А домашние задания надо делать самому, а иначе и диплом (аттестат?) придется делить.


 
Chaynik   (2003-10-21 08:56) [8]

А как понять тогда объявление массива?


 
MBo ©   (2003-10-21 08:58) [9]

сдвиг=0
цикл по всем элементам
если элемент нулевой, увеличить сдвиг
иначе переписать элемент на нужное место


 
Нурик ©   (2003-10-21 09:00) [10]

Ну например
type
vector=array[1..10] of integer;
var
a:^vector;
...

У тебя есть такая фигня?


 
Chaynik   (2003-10-21 09:12) [11]

var
vector:=array of integer;
...
У меня такая фигня.

А потом SetLength ( vector, length) задаю размер масиву.


 
Chaynik   (2003-10-21 09:17) [12]

MBo © А как этот сдвиг то увеличить? Я делаю так
for i:=0 to length do
begin
if massiv[i]= 0 then
begin
{ Ноль как здесь удалить?}
end;
end;


 
Нурик ©   (2003-10-21 09:26) [13]

Может так лучше, объявляешь точно такой же массив (var v1:array of integer) но длину пока не задавай. Проходишь по первому массиву и проверяешь каждый элемент, если не ноль то то увеличиваешь размер v1 на один и туда запихываешь значение, а если ноль то пропускаешь. А потом забудь старый массив!!!


 
Brahman ©   (2003-10-21 09:30) [14]

Как вариант
Создать второй массив
Пройти в цикле по всем элементам, копируя во второй
только не нулевые.

Если нужно, то скопировать в первый и обрезать по длине второго


 
MBo ©   (2003-10-21 09:35) [15]

>Chaynik
Имя здесь сообщи, чтоб тебя, не дай бог, на работу не взяли ;)

j:=0;
for i:=0 to High(a) do
if a[i]=0 then
inc(j)
else
a[i-j]:=a[i];
setlength(a,length(a)-j);


 
Спрашивающий_   (2003-10-21 09:55) [16]

Вариант №2
procedure TForm1.Button1Click(Sender: TObject);
var
M1:array of integer;
M2:array of integer;
I,J:Word;
T:DWord;
begin
T:=GetTickCount;
Memo1.Lines.BeginUpdate;
Memo2.Lines.BeginUpdate;
J:=0;
SetLength(M1,1000);
SetLength(M2,Length(M1));
For I:=0 To Length(M1)Do
begin
M1[I]:=Random(10);
Memo1.Lines.Add(IntToStr(M1[I])); //Тест
If M1[I]<>0 Then
begin
M2[J]:=M1[I];
M1[J]:=M2[J];
Memo2.Lines.Add(IntToStr(M2[J])+"/"+IntToStr(M1[J])); //Тест
Inc(J);
end;

end;
SetLength(M1,J); //Result
SetLength(M2,0);
Memo1.Lines.EndUpdate;
Memo2.Lines.EndUpdate;
Text:= IntToStr(GetTickCount-T);//Тест скорости, "пойдет"
end;


 
Спрашивающий_   (2003-10-21 10:15) [17]

Поправка
For I:=0 To Length(M1)-1 Do


 
Чайник   (2003-10-22 06:49) [18]

Всем огромное спасибо


 
Донской ©   (2003-10-22 19:03) [19]

BeginUpdate is called AUTOMATICALLY by any property or method that changes the list of strings.



Страницы: 1 вся ветка

Текущий архив: 2003.11.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.019 c
3-8270
@le
2003-10-14 12:14
2003.11.03
BDE


8-8547
comintegrator
2003-06-27 19:00
2003.11.03
sound


1-8534
Инна
2003-10-23 10:56
2003.11.03
Ещё раз о создании компонента


1-8355
Endi
2003-10-22 22:22
2003.11.03
Запись и чтение в файл.


1-8489
ananimious
2003-10-23 22:00
2003.11.03
why?