[VB6] Jak zapętlić? oraz przetłumaczyć z C+...

0

Witam!
Zacznę od tego, że to moje pierwsze kroki z VB także proszę nie wieszać od razu na mnie psów jak coś napiszę źle itd...

Piszę program który będzie odczytywał plik tekstowy który sam wskażę, gdzie dane będą zapisane w nowych linijkach np.

1
2
3
i tak do konca ostatniej zapisanej linijki

a następnie program wyliczy średnią arytmetyczną z tych linijek i wyświetli wynik w tekstboxie..

Na chwile obecną mam już wybór pliku i odczytuje te wartości tylko nie wiem jak zrobić pętlę by te wartości zapisywał do jakichś kolejnych zmiennych a później dodał je wszystkie i podzeilił przez ich ilość ( wyliczył średnią arytmetyczną )

Kod:
Private Sub Command1_Click()

Dim oDlg As New Class1
Dim WindowHandle As Long
Dim strPath As String
Dim strExtension As String
Dim w As Double

WindowHandle = oDlg.GetWindowHandle("ThunderDFrame", Me.Caption)
strExtension = "Plik tekstowy(.txt)" & Chr(0) & ".txt"

strPath = Trim(oDlg.OpenDialog(WindowHandle, strExtension, 1, "Otwórz"))
If strPath = "" Then Exit Sub

Set oDlg = Nothing

Dim vTab() As String

OdczytPliku strPath, vTab

End Sub

Kod:

Sub OdczytPliku(strPlik As String, ByRef vTab() As String)

Dim i As Long
i = 0
'Otwieramy plik
Open strPlik For Input As #1

'odczytujemy w pętli dane z pliku
Do While Not EOF(1)
ReDim Preserve vTab(0 To i)
Input #1, vTab(i)
i = i + 1
Loop

Close #1

End Sub

Dalej potrzebuję przetłumaczyć te linijki z C+ do VB i włożyć do programu..

 double srednia(double tab[],int wielkosc)
{
       double suma=0;
       for(int i=0;i<wielkosc;i++)
          suma+=tab[i];
       suma=suma/wielkosc;
       return suma;
}

double sigma2(double tab[], int wielkosc, double srendia)
{
       double wynik=0;
       double roznica=0;
       for(int i=0;i<wielkosc;i++)
       {
          roznica=(int)srednia-tab[i];
          wynik+=pow(roznica,2);
       }
       wynik=wynik/wielkosc;
       return wynik;
}

Czy dobrze to robię? Ktoś może mi pomóc?

0

długość tablicy - ilość elementów w niej zawartych
niestety o VB6 pojęcia nie mam ale podejrzewam, że jak już tyle dałeś radę napisać to znajdziesz...

0

Szczerze niemam pojęcia jak to dalej ruszyć zeby mi te elementy zsumowalo i podzielilo przez ich ilosc.. Jest tu ktos kto ogarnia VB?

0

a może tak zacząłbyś od dokumentacji VB6?
tablice to jedna z podstaw "każdego" języka programowania...
np. tutaj

0

Liczby masz w tablicy: vTab

Teraz robisz:

For i = LBound(vTab) to UBound(vTab)
    suma = suma + vTab(i)
next i

podzielić przez ilość:

srednia = suma / UBound(vTab)
0

Dzięki - faktycznie to działa - tylko co z liczbami np 5,2 czy 5.5 - jak to zrobić by poprawnie zostawały odczytywane i obliczane?

0

A, nie zauważyłam, że masz tablicę stringów. W takim wypadku:

  1. deklarujesz sumę jako double
  2. deklarujesz srednia jako double
  3. dodawanie robisz tak:
suma = suma + CDbl(vTab(i))

Liczby muszą być zapisane z przecinkami (nie kropkami!) bo inaczej nie zostaną prawidłowo odczytane.

0
 Dim x As Integer, Srednia As Double, Suma As Double
Suma = 0: Srednia = 0

For i = LBound(vTab) To UBound(vTab)
     Suma = Suma + CDbl(vTab(i))
List1.AddItem vTab(i)
Next i

Srednia = Suma / i

List1.AddItem "Suma elementów = " & str(Suma)
List1.AddItem "Średnia arytmetyczna = " & Srednia
End Sub

Jak dam kropkę to się wykrzacza jak mówiłeś, ale jak dam przecinek to odczytuje to jakby to byla nastepna liczba czyli 5,5 a enter nizej 5 robi mi jako 5+5+5..

0

Być nie może. Zobacz taki kod:

Sub test()
    Dim Srednia As Double, Suma As Double
    Dim vTab(0 To 10) As String
    
    For i = LBound(vTab) To UBound(vTab)
         vTab(i) = "5,5"
    Next i
    
    For i = LBound(vTab) To UBound(vTab)
         Suma = Suma + CDbl(vTab(i))
    Next i
    
    Srednia = Suma / i
    
    MsgBox CStr(Suma)
    MsgBox CStr(Srednia)
End Sub

Jako suma daje 60,5, jako średnia 5,5 czyli ewidentnie dobrze. Zobacz pod debuggerem co masz w tablicy przed sumowaniem, może źle odczytujesz z pliku?

0

Właśnie najprawdopodobniej źle odczytuje, a odczytywanie mam zrobione w ten sposób:

 Sub OdczytPliku(strPlik As String, ByRef vTab() As String)
Dim NrPliku As Integer

Dim i As Long
i = 0

'Otwieramy plik
NrPliku = FreeFile
Open strPlik For Input As #NrPliku

'odczytujemy w pętli dane z pliku
Do While Not EOF(1)
    ReDim Preserve vTab(0 To i)
    Input #1, vTab(i)
    i = i + 1
Loop

Close #NrPliku

End Sub
0

Line Input #1, vTab(i)
i gitara ;)

0

Jejku ślicznie dziękuję ;)

Teraz jak wystosowac błąd w przypadku gdy pojawią się inne niż dozwolone znaki czyli 5.5 a nie z przecinkiem, lub tekst? Takie info jakieś żeby wyskakiwało z Errorem...

Potrzebuję jeszcze dopisać linijki które policzą mi takie wzory na podstawie tej średniej ( to jest to x z daszkiem ):
http://img525.imageshack.us/img525/7199/przechwytywanieom.png
i dalej
http://img255.imageshack.us/img255/6559/69048221.png

A te matematyczne wzorki w C++ wygladaja tak:

[code]double srednia(double tab[],int wielkosc)
{
double suma=0;
for(int i=0;i<wielkosc;i++)
suma+=tab[i];
suma=suma/wielkosc;
return suma;
}

double sigma2(double tab[], int wielkosc, double srendia)
{
double wynik=0;
double roznica=0;
for(int i=0;i<wielkosc;i++)
{
roznica=(int)srednia-tab[i];
wynik+=pow(roznica,2);
}
wynik=wynik/wielkosc;
return wynik;
}[/code]

Jesteś w stanie mi pomóc? ..

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