średnica krocząca

0

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.

0
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;
0

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ć.

0

Cnt oraz tb muszą mieć zasięg globalny. W ostatnim wierszu brakuje nawiasów.

0

ś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 ?

0

Zawyżanie jest po dodaniu nawiasów, bez nawiasów nie zawyżało.

0

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.

0

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ą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1