minimax
|
Sonic
|
|
|
|
Рег.: 29.10.2003
|
Сообщений: 725
|
Из: деревня:)
|
Рейтинг: 26
|
|
вопрос по программе
27.11.2008 14:24
|
|
|
Туплю уже около часа:( Суть вопроса: есть два массива 1-ый-[ 1,1,2,2,3] , 2-ой -[1,1,6,3,0]. Считаю кол-во одинаковых элементов в первом массиве, а во втором среднее между соответсвиями (эти массивы связаны), В итоге должно получиться следующее : для первого массива - [2,2,1], а для второго [(1+1)/2=1, (6+3)/2=4.5, 0/1=0] Вот сам код с которым мучаюсь (он уже успел вырасти:)) Не могу сделать так, чтоб корректно работал:( c-1-ый массив, d - второй
code:
Function Total(var c,d:array of Double):Tarray;
var
i,j,k,z:integer;
b,g,e:TArray;
begin
j:=0;
k:=0;
z:=0;
SetLength(b,j+1);
SetLength(g,j+1);
b[j]:=1;
for i:=0 to Length(c)-2 do
begin
if c[i]=c[i+1] then
begin
b[j]:=b[j]+1;
Inc(z);
SetLength(e,z);
e[z-1]:=d[i];
end
else
begin
Inc(j);
SetLength(b,j+1);
b[j]:=1;
Inc(k);
SetLength(g,k);
g[k-1]:=Mean(e);
z:=0
end;
Inc(z);
SetLength(e,z);
e[z-1]:=d[i+1];
end;
Inc(z);
SetLength(e,z);
e[z-1]:=d[i+1];
Inc(k);
SetLength(g,k);
g[k-1]:=Mean(e);
result:=b;
end;
Редактировал DarkGray (27.11.2008 17:10)
|
|
DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31415
|
|
Рейтинг: 8952
|
|
|
|
minimax
|
Sonic
|
|
|
|
Рег.: 29.10.2003
|
Сообщений: 725
|
Из: деревня:)
|
Рейтинг: 26
|
|
|
|
DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31415
|
|
Рейтинг: 8952
|
|
|
для начала сделай функцию AddItem(Array arr, int v), которая добавляет элемент в массив и все Inc();SetLength;[]=; замени на этот AddItem
|
|
DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31415
|
|
Рейтинг: 8952
|
|
|
а для самого начала дай нормальные имена массивам и переменным хотя бы что-нибудь типа: equalItemCounts, averages
|
|
Rad
|
delinquent guy
|
|
|
|
Рег.: 06.09.2005
|
Сообщений: 17291
|
Из: here and there
|
Рейтинг: 2232
|
|
|
я правильно понимаю, что ты на Delphi пишешь? В ответ на:
array of Double
если это тоже самое, что Tarray, то следует так и писать, а то у тебя получается open array parameter. Далее я бы сделал что-то типа такого (не читал код, поэтому пишу по словесному описанию):
code: const epsilon = 0.0001;
Function Total(c,d:Tarray):Tarray;
var i, j: integer; sum: double;
begin
j:=0;
sum:=d[0];
setlength(c, length(c));setlength(d, length(d));//это надо сделать чтобы не портить исходные массивы
for i:=1 to length(c)-1do begin
if abs(c[i]-c[j])<epsilon*abs(c[i]) //именно так следует сравнивать значения типа double
then begin
sum:=sum+d[i];
continue;
end;
d[j]:=sum/(i-j);
inc(j);
c[j]:=c[i];
end;
d[j]:=sum/(length(s)-1-j);
setlength(c, j+1);
setlength(d, j+1);
//что надо вернуть, не понял.
end;
ps: не проверял
|
|
|
minimax
|
Sonic
|
|
|
|
Рег.: 29.10.2003
|
Сообщений: 725
|
Из: деревня:)
|
Рейтинг: 26
|
|
Re: вопрос по программе
[re: Rad]
27.11.2008 15:14
|
|
|
Спасибо, но уже сделал:) При оптимизации кода обязательно учту, а пока надо срочно данные обработать:(
|
|
|
|