Gå til innhold

Gjennomsnitt av en lagret verdi?


Anbefalte innlegg

Jeg driver å lager et program i VB 6.0 som er ment for å være til basketlaget jeg spiller på (er bare et skoleprosjekt). I programmet lagrer man hvilket lag man spilte mot, poeng på begge lag osv. Alle verdier og tekststrenger blir lagret i en .dat fil.

 

På forsiden er det en tabell som viser antall seiere og antall tap, men det skal også være gjennomsnittlig poeng pr. kamp. Poengene er lagret i "kamp.poeng" som er i typen "kamper". Hvordan kan jeg ta gjennomsnittet av alle verdiene (når de er lagt sammen)?

 

Litt vanskelig å forklare, men eksemplet på hva jeg mener er nedenfor:

Alle poengene lagt sammen delt på antall kamper spilt.

 

Noen som klarer å løse problemet for meg? Har prøvd løkker, men lykkes ikke :no:

 

På forhånd takk! :D

Endret av kjey
Lenke til kommentar
Videoannonse
Annonse

Her er modulen min:

Type kamper
   motstander As String * 30
   stillingHjemme As Integer
   stillingBorte As Integer
   kommentar As String * 150
   seier As Integer
   tap As Integer
End Type

Global kamp As kamper
Global sistepost As Integer
Global antallposter As Integer

 

Her er knappen som registrerer den nødvendige informasjonen som puttes inn i fila:

Private Sub cmdRegistrer_Click()

Dim hjemme As Integer
Dim borte As Integer

hjemme = txtBøler.Text
borte = txtMotstander.Text

If hjemme > borte Then
   kamp.seier = 1
   kamp.tap = 0
Else
   kamp.tap = 1
   kamp.seier = 0
End If

kamp.motstander = txtLag.Text
kamp.stillingHjemme = hjemme
kamp.stillingBorte = borte
kamp.kommentar = txtKommentarer.Text


   Put #1, sistepost, kamp
   sistepost = sistepost + 1
   
txtLag.Text = ""
txtBøler.Text = ""
txtMotstander.Text = ""
txtKommentarer.Text = ""
End Sub

 

Hvordan skal jeg da kunne hente opp alle "stillingHjemme", plusse dem sammen og dele på antall poster slik at den tar gjennomsnittet?

Lenke til kommentar

En ting: det er ikke noe poeng i å bruke Integer data type i VB6, bruk heller Long

 

Du må lese igjennom alle postene, summer tap og seier, og del på antallposter

 

gjennomsnittet bør lagres som single eller double for å få et desimaltall

Dim k As kamp

Dim gjennomsnitt As Single

Dim i As Long

Dim totalpoeng As Long

Seek #1, 0

For i = 0 To antallkamper - 1
 Get #1, , k
 totalpoeng = totalpoen + k.seier + k.tap
Next

gjennomsnitt = CSng(totalpoeng) / CSng(antallposter)

Lenke til kommentar

Det er bedre å ha all data liggende i en array, i RAM'en eller arbeidsminnet, for å så lagre informasjonen på et gitt intervall eller på brukerens kommando. Dette kan eksempelvis gjøres ved hjelp av følgende kode (som du helst bør legge i modulen):

 

' Array som inneholder alle kamper i nåværende fil

Public aFights() As kamper

 

Public Sub DeleteFight(ByVal Index As Long)

 

    Dim Tell As Long

   

    ' Flytt alle elementer ovenfor ett steg ned

    For Tell = Index + 1 To UBound(aFights)

   

        ' La elementet under tilsvare det ovenfor

        LSet aFights(Tell) = aFights(Tell + 1)

   

    Next

   

    ' Fjern overflødige elementer

    If UBound(aFights) <> LBound(aFights) Then

        ReDim Preserve aFights(LBound(aFights) To UBound(aFights) - 1)

    Else

        Erase aFights

    End If

   

End Sub

 

Public Sub AddFight(srcData As kamper, Optional ByVal Index As Long = -1)

 

    Dim Tell As Long

 

    ' Først, sjekk om kamp-arrayen er allokert

    If Not (Not aFights) Then

       

        ' Legg til et ekstra element

        ReDim Preserve aFights(LBound(aFights) To UBound(aFights) + 1)

       

    Else

           

        ' Om ikke, alloker nytt element

        ReDim aFights(1 To 1)

       

    End If

   

    ' Dersom indeksvariabelen er tom, skal den fylles med den reelle posisjonen

    If Index < LBound(aFights) Then

        Index = UBound(aFights)

    End If

   

    ' Gi plass til et nytt element i den angitte posisjonen

    For Tell = UBound(aFights) To Index + 1 Step -1

   

        ' Flytt element

        LSet aFights(Tell) = aFights(Tell - 1)

   

    Next

   

    ' Sett det nye elementet

    LSet aFights(Index) = srcData

   

End Sub

 

Public Sub LoadData(sFile As String)

 

    Dim Free As Long, lngNum As Long

 

    ' Først må vi verifisere at filen eksisterer

    If Dir(sFile) <> "" Then

   

        ' Finn ledig filhandlingsid

        Free = FreeFile

   

        ' Deretter kan filen åpnes

        Open sFile For Binary As #Free

   

            ' Hent antall elementer i array

            Get #Free, , lngNum

           

            ' Alloker array deretter

            ReDim aFights(1 To lngNum)

           

            ' Last inn all data

            Get #Free, , aFights

   

        ' Dealloker alle resurser/objekter knyttet til den åpnede filen

        Close #Free

   

    End If

 

End Sub

 

Public Sub SaveData(sFile As String)

 

    Dim Free As Long, lngNum As Long

   

    ' Finn ledig filhandlingsid

    Free = FreeFile

 

    ' Slett filen dersom den allerede eksisterer

    If Dir(sFile) <> "" Then

        Kill sFile

    End If

 

    ' Deretter kan filen åpnes

    Open sFile For Binary As #Free

 

        ' Lagre antall elementer i array

        Put #Free, , CLng(UBound(aFights))

 

        ' Lagre all data

        Put #Free, , aFights

 

    ' Dealloker alle resurser/objekter knyttet til den åpnede filen

    Close #Free

   

End Sub

 

For å legge til elementer/kamper, benytter du prosedyren AddFight:

 

Dim Test As kamper

 

' Sett informasjonen som skal legges til

With Test

    .motstander = txtLag.Text

    .stillingHjemme = hjemme

    .stillingBorte = borte

    .kommentar = txtKommentarer.Text

End With

 

' Legg til data i array

AddFight Test

 

Dersom du derimot vil at informasjonen bør legges inn som det første elementet i rekken, endrer du siste linje til følgende:

 

AddFight Test, 1

 

Tilsvarende bruker du DeleteFight for å slette en kamp, der Index er «post»nummeret til kampen du vil fjerne. Bruken av LoadData og SaveData burde være innlysende nok.

 

I tillegg kan du nå slippe å anvende strenger med statisk lengde. På den måten vil det ikke lenger være en praktisk grense på hvor lange kommentarene og motstandernavnene kan være. Endre følgende i modulen din:

 

Type kamper

  motstander As String

  stillingHjemme As Integer

  stillingBorte As Integer

  kommentar As String

  seier As Integer

  tap As Integer

End Type

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...