witam, zastanawiam sie jak napisać najprościej obliczanie średniej ruchomej, która co cykl Timera dostaje nowa wartość zmiennej, i oblicza z tablicy 5 odczytów, jak zrobić dodawanie nowej wartości i kasowanie ostatniej, prosiłbym o jakiś przykład kodu, aczkolwiek najlepiej bez jakiś gotowych bibliotek gdyż generalnie będę musiał to i tak przepisac do VB.
Tb:array[0..4]of Double;
Cnt:Integer;
procedure Add(V:Double);
begin
Tb[Cnt mod 5]:=V;
Inc(Cnt);
end;
function Avg:Double;
begin
Result:=(Tb[0]+Tb[1]+Tb[2]+Tb[3]+Tb[4])/5;
end;
Ewentualnie:
Tb:array[0..4]of Double;
Val:Double;
Cnt:Integer;
function Next(V:Double):Double;
var P:Integer;
begin
P:=Cnt mod 5;
Val:=Val+V-Tb[P];
Tb[P]:=V;
Inc(Cnt);
Result:=Val;
end;
aktualnie w VB mam takie coś
Dim tb() As Double
Dim Cnt As Integer
ReDim tb(0 To 4)
tb(Cnt Mod 5) = newvalue
Cnt += 1
Label1.Text = tb(0) + tb(1) + tb(2) + tb(3) + tb(4) / 5
niestety cały czas cnt=1, niestety w Vb nie ma funkcji zwiększania, lecz +=1 powinno działać.
Cnt oraz tb muszą mieć zasięg globalny. W ostatnim wierszu brakuje nawiasów.
średnia jest zawyżona, od razu po odpaleniu funkcji, średnia jest zawyżona, nawet nie zapisze wszystkich wyników,
tb(Cnt Mod 5) = newvalue
Cnt += 1
z tego co się domyślam tak czy owak if cnt = 6 then cnt = 1
, zeby to działało ?
Zawyżanie jest po dodaniu nawiasów, bez nawiasów nie zawyżało.
Dodaj jeszcze warunek:
jeżeli Cnt<5 to Label1.Text = "N/A"
w przeciwnym przypadku Label1.Text = ( tb(0) + tb(1) + tb(2) + tb(3) + tb(4) ) / 5
Wtedy zobaczysz gdzie masz błąd.
problemem jest to że jesli wpisujemy tb(0)=wartosc , jest ok w momencie gdy wpisujemy tb(1)=wartosc to tb(0) nagle staje sie puste, itd. ta tablica wyglada jakby nie była tabilcą.