STUDENT....hvordan finne laveste verdien i en liste

Her postes alt som har med overnevnte teknologier.

STUDENT....hvordan finne laveste verdien i en liste

Innlegg ragnhildo » 04.05.2013 22:51

Jeg driver og lærer meg VB script i VisualStudio og har fått en oppgave som går ut på dette:

Jeg har en liste hvor jeg har lagt inn input fra bruker (1. textBox= Fornavn, 2. TextBox= Etternavn, 3. Textbox=tid(altså nummer)). Hver gang jeg trykker på en knapp lagres det som står i tekstboksene i en liste og deretter vises i en label (lblResultat) sammen med det som står der fra før. I en annen label (lblHigest) vil jeg at det vises den deltakeren med lavest tid. Dette skal altså oppdateres hver gang jeg trykker på knappen for å finne ut om den nye deltakeren har bedre resultet enn en av de som ligger i listen fra før. Altså det må loopes gjennom listen hver gang jeg trykker på knappen.

Spørsmålet er da hvordan jeg skal gjøre dette?

Min eksisterende kode i "Lagre"-knappen ser slik ut:

ResetLabelResultat()
If txbFornavn.Text <> "" And txbEtternavn.Text <> "" And txbRundetid.Text <> "" And IsNumeric(txbRundetid.Text) Then
Resultater.Add(New Deltaker(txbFornavn.Text, txbEtternavn.Text, Format(txbRundetid.Text, "fixed")))
For i As Integer = 0 To Resultater.Count - 1
lblResultat.Text = lblResultat.Text & Resultater(i).rundetid & " " & Resultater(i).fornavn & " " & Resultater(i).etternavn & vbCrLf
lblTotal.Text = "Totalt: " & i + 1
lblHigest.Text = "Best resultat: " &
Next i
Else : MsgBox("Du må skrive inn for- og etternavnet ditt og et tall i boksen 'rundetid'", , "Melding")
End If
End Sub


Til info har jeg laget en egen classe som heter "Deltaker" med egenskapene "Rundetid", "Fornavn" og "Etternavn".

Håper noen kan hjelpe meg. På forhånd takk :)
Brukerens avatar
ragnhildo
Nytt medlem
 
Innlegg: 13
Registrert: 11.10.2010 19:27

Re: STUDENT....hvordan finne laveste verdien i en liste

Innlegg Eikje3 » 05.05.2013 10:59

Må innrømme at eg ikkje kan VB Script, men dersom det "bare" er den beste du vil ha fram kan du vel køyre igjennom lista ein gong til?
Framgangsmåten eg ville ha gjort er då først sette ein ny variabel
Kode: Merk alt
best_tid = tida til den første deltakaren i lista
best_namn = namnet til den første deltakaren i lista

Gå igjennom heile lista som du gjere når du skal skriver ut alle
Inni denne for-løkka legger du til ein if-test

Kode: Merk alt
if best_tid > Resultater(i).rundetid
     best_tid = Resultater(i).rundetid
     best_namn = Resultater(i).fornavn & " " & Resultater(i).etternavn


Når då løkka er ferdig står du igjen med den beste tida og namnet til vedkommande
Då er det bare til å skrive det ut på rett plass.
Eikje3
Medlem
 
Innlegg: 162
Registrert: 22.12.2005 20:23

Re: STUDENT....hvordan finne laveste verdien i en liste

Innlegg ragnhildo » 05.05.2013 20:05

Hei og tusen takk for svar.

Skjønner litt hva du mener her og har fått til mye av det med din hjelp. TAKK :-). Men er ikke helt i mål. (Må visstnok ha det inn med teskje :? ) he he.

Nå har jeg lagt til denne koden:

Dim minst As Decimal = Resultater(0).rundetid
Dim minstNavn As String = Resultater(0).fornavn & Resultater(0).etternavn
For a As Integer = 0 To Resultater.Count - 1
If Resultater(a).rundetid < minst Then minst = Resultater(a).rundetid
lblHigest.Text = "Best resultat: " & minst & " " & minstNavn
Next


Det går veldig fint å få oppdatert "Resultater.Rundetid" den forandrer seg hvis jeg legger inn en mindre verd og forblir den minste hvis jeg legger inn en høyere verdi, men fornavnet og etternavnet forblir det første jeg skrev inn??? Hvordan skal jeg få med meg disse i "dansen"?

Takk igjen for hjelpen.
Brukerens avatar
ragnhildo
Nytt medlem
 
Innlegg: 13
Registrert: 11.10.2010 19:27

Re: STUDENT....hvordan finne laveste verdien i en liste

Innlegg Eikje3 » 06.05.2013 9:00

Kode: Merk alt
Dim minst As Decimal = Resultater(0).rundetid
Dim minstNavn As String = Resultater(0).fornavn & Resultater(0).etternavn
For a As Integer = 0 To Resultater.Count - 1
If Resultater(a).rundetid < minst Then
   minst = Resultater(a).rundetid
   minstNavn = Resultater(a).fornavn & Resultater(a).etternavn
End If
Next
lblHigest.Text = "Best resultat: " & minst & " " & minstNavn


Du må oppdatere namnet samtidig som du oppdaterer tida.
Eikje3
Medlem
 
Innlegg: 162
Registrert: 22.12.2005 20:23

Re: STUDENT....hvordan finne laveste verdien i en liste

Innlegg ragnhildo » 06.05.2013 20:58

Tusen takk altså....nå satt den :-)

Er mye å tenke på her og det går fort litt surr. Men går jo bedre og bedre.

Takk igjen for at du gadd å hjelpe.

Mvh Ragnhild :-)
Brukerens avatar
ragnhildo
Nytt medlem
 
Innlegg: 13
Registrert: 11.10.2010 19:27

Re: STUDENT....hvordan finne laveste verdien i en liste

Innlegg ragnhildo » 07.05.2013 22:08

En ting til....

Programmet skal komme med en feilmelding hvis brukeren taster inn et negativt tall i txbRundetid og hvis brukeren har en rundetid på mer enn 60 min.

Har plassert hvor feilmeldingene skal stå og det fungerer bra bortsett fra at selv om jeg får fanget opp om brukeren skriver inn et negativt tall eller et over 60 så legges verdien alikevel til i listen og vises i labelen sammen med de andre. Jeg vil jo da at dette negative tallet eller tallet over 60 ikke skal legges til i listen... men hvordan skal jeg få til det?


Her er den komplette koden i Lagre-knappen:

Dim Resultater As New List(Of Deltaker)

Private Sub btnLagre_Click(sender As System.Object, e As System.EventArgs) Handles btnLagre.Click

'lage feilmelding hvis/når bruker skriver inn noe feil i tekstboksene
If txbFornavn.Text <> "" And txbEtternavn.Text <> "" And txbRundetid.Text <> "" And IsNumeric(txbRundetid.Text) Then
Resultater.Add(New Deltaker(txbFornavn.Text, txbEtternavn.Text, Format(txbRundetid.Text, "fixed")))

'programmet skal gi en feilmelding hvs brukeren har en rundetid på under 0 eller mer enn 60
If txbRundetid.Text < 0 Then MsgBox("Du må skrive inn et positivt tall i boksen 'rundetid'", , "Melding") ---------> her ligger feilmeldingen
If txbRundetid.Text >= 60 Then MsgBox("Du har en rundetid på 60 eller mer og vil dermed bli diskvalfisert", , "Melding")---------> her ligger feilmeldingen

'Legge user input inn i listen for så å skrive den ut til labelen og beholde det som står i labelen fra før
For i As Integer = 0 To Resultater.Count - 1
lblResultat.Text = lblResultat.Text & Resultater(i).rundetid & " " & Resultater(i).fornavn & " " & Resultater(i).etternavn & vbCrLf
lblTotal.Text = "Totalt: " & i + 1
Next i

'finne den med lavest rundetid og skrive den ut til labelen denne labelen skal oppdatere seg for hvert gang man klikker på lagre-knappen hvis det er en med lavere rundetid
Dim minst As Decimal = Resultater(0).rundetid
Dim minstNavn As String = Resultater(0).fornavn & " " & Resultater(0).etternavn
For a As Integer = 0 To Resultater.Count - 1
If Resultater(a).rundetid < minst Then
minst = Resultater(a).rundetid
minstNavn = Resultater(a).fornavn & " " & Resultater(a).etternavn
End If
lblHigest.Text = "Best resultat: " & minst & " " & minstNavn
Next
' hvis man skriver inn noe feil i tekstboksene vil man få opp denne feilmeldingen
Else : MsgBox("Du må skrive inn for- og etternavnet ditt og et positivt tall i boksen 'rundetid'. Hvis du har en rundetid på 60 minutter eller mer vil du bli diskvalifisert.", , "Melding")
End If



btnTom.Enabled = True
ResetFornavn()
ResetEtternavn()
ResetRundetid()

End Sub
Brukerens avatar
ragnhildo
Nytt medlem
 
Innlegg: 13
Registrert: 11.10.2010 19:27

Re: STUDENT....hvordan finne laveste verdien i en liste

Innlegg Matsemann » 08.05.2013 9:20

Du må putte den delen der du legger til tallet inn i en else, slik at den kun utføres om ting er riktig.

Altså lignende
Kode: Merk alt
if txbRundetid.Text < 0 then
    //kode
else if txbRundetid.Text >= 60 then
    // kode
else
    // kode for å legge inn, blir kun kjørt om ingen av de to over er sanne
Master i Datateknikk, NTNU
Brukerens avatar
Matsemann
Moderator
 
Innlegg: 2133
Registrert: 05.02.2005 19:13

Re: STUDENT....hvordan finne laveste verdien i en liste

Innlegg ragnhildo » 08.05.2013 9:42

Hei sann....

Mener du da at jeg må legge det inn sammen med den øverste Ifen? Eller lage en ny If som er lik bare med ulike betingelser? (se kommentarer i koden under)

Her er den komplette koden i Lagre-knappen:

Dim Resultater As New List(Of Deltaker)

Private Sub btnLagre_Click(sender As System.Object, e As System.EventArgs) Handles btnLagre.Click

'lage feilmelding hvis/når bruker skriver inn noe feil i tekstboksene
If txbFornavn.Text <> "" And txbEtternavn.Text <> "" And txbRundetid.Text <> "" And IsNumeric(txbRundetid.Text) Then -----------> Skal jeg putte det inn her et sted?
Resultater.Add(New Deltaker(txbFornavn.Text, txbEtternavn.Text, Format(txbRundetid.Text, "fixed")))

'programmet skal gi en feilmelding hvs brukeren har en rundetid på under 0 eller mer enn 60
Eller lager jeg en helt ny if her som du har skrevt og legger inn det samme som over etter else (Resultater.Add(New Deltaker(txbFornavn.Text, txbEtternavn.Text, Format(txbRundetid.Text, "fixed"))))? Da må jeg vel også ha med For next en gang til osv?
If txbRundetid.Text < 0 Then MsgBox("Du må skrive inn et positivt tall i boksen 'rundetid'", , "Melding")
If txbRundetid.Text >= 60 Then MsgBox("Du har en rundetid på 60 eller mer og vil dermed bli diskvalfisert", , "Melding")

'Legge user input inn i listen for så å skrive den ut til labelen og beholde det som står i labelen fra før
For i As Integer = 0 To Resultater.Count - 1
lblResultat.Text = lblResultat.Text & Resultater(i).rundetid & " " & Resultater(i).fornavn & " " & Resultater(i).etternavn & vbCrLf
lblTotal.Text = "Totalt: " & i + 1
Next i

'finne den med lavest rundetid og skrive den ut til labelen denne labelen skal oppdatere seg for hvert gang man klikker på lagre-knappen hvis det er en med lavere rundetid
Dim minst As Decimal = Resultater(0).rundetid
Dim minstNavn As String = Resultater(0).fornavn & " " & Resultater(0).etternavn
For a As Integer = 0 To Resultater.Count - 1
If Resultater(a).rundetid < minst Then
minst = Resultater(a).rundetid
minstNavn = Resultater(a).fornavn & " " & Resultater(a).etternavn
End If
lblHigest.Text = "Best resultat: " & minst & " " & minstNavn
Next
' hvis man skriver inn noe feil i tekstboksene vil man få opp denne feilmeldingen
Else : MsgBox("Du må skrive inn for- og etternavnet ditt og et positivt tall i boksen 'rundetid'. Hvis du har en rundetid på 60 minutter eller mer vil du bli diskvalifisert.", , "Melding")
End If



btnTom.Enabled = True
ResetFornavn()
ResetEtternavn()
ResetRundetid()

End Sub
Brukerens avatar
ragnhildo
Nytt medlem
 
Innlegg: 13
Registrert: 11.10.2010 19:27

Re: STUDENT....hvordan finne laveste verdien i en liste

Innlegg Maritim » 29.11.2013 2:34

Hvordan gikk dette til syvende og sist? :)
Maritim
Nytt medlem
 
Innlegg: 2
Registrert: 29.11.2013 1:30
Bosted: Larvik


Gå til ASP / ASP.NET, C#, VB.NET, Silverlight, Azure

Hvem er i forumet

Brukere som leser i dette forumet: Ingen registrerte brukere og 2 gjester