alles over je Palm Treo smartphone of PalmOS pda
|
Registreer | FAQ | Ledenlijst | Kalender | Berichten van vandaag | Zoeken |
#1
|
|||
|
|||
[HB++] Grootste waarde vinden
Weet iemand hoe ik in HB++ uit een serie getallen de grootste waarde kan vinden. Dat kan natuurlijk met een hele lap 'If, Else en ElseIf' maar toen ging hij zeuren dat mijn form groter is dan 64kb (blijkbaar maximum).
En het moet vast in een paar regeltjes kunnen... |
#2
|
||||
|
||||
Hoe staan de waarden opgeslagen?
|
#3
|
|||
|
|||
Het wordt een programmatje voor een Online voetbal spelletje en ik sla de gegevens van mijn spelers op in een table.
Elke speler heeft verschillende vaardigheden zoals keepen (k) conditie (c) etc... Ik bereken middels volgende formules hun sterkte voor elke positie en stuur deze naar een betreffend veld (dus fldkeeper geeft de keepersterkte van de speler): FldKeeper.Text=1*k fldVerdediger.Text=0.1*c+0.03*p+0.87*v fldVVerdediger.Text=0.33*w+0.67*v fldMiddenvelder.Text=0.2*c+0.15*t+0.5*p+0.15*v fldVleugelspeler.Text=0.07*c+0.26*p+0.15*t+0.39*w+0.13*v fldAanvaller.Text=0.1*c+0.58*s+0.29*t+0.03*p Nu wil ik de vaardigheid met de grootste waarde (dus waarin de speler volgens deze formules het beste in is) vet gedrukt maken. aangezien ik in de help en op internet (misschien verkeerde zoektermen (?)) niet vond hoe dit moest, heb ik dit gedaan middels de welbekende if, else en elseif functies maar toen werd het dus te groot. Dat zag er dan ongeveer als volgt uit (en zal jullie de hele reeks besparen) If fldkeeper.Tekst>fldVerdediger.Tekst Then If fldkeeper.Tekst>fldVVerdediger.Tekst Then If fldkeeper.Tekst>fldMIddenvelder.Tekst Then If fldkeeper.Tekst>fldVleugelspeler.Tekst Then If fldkeeper.Tekst>fldAanvaller.Tekst Then fldkeeper.Font = hbFontBold 'keepers waarde is grootste Else fldAanvaller.Font = hb FontBold 'Aanvaller waarde is grootste EndIf ElseIf fldVleugelspeler.Tekst>fldAanvaller.Tekst Then fldVleugelspeler.Font = hbFontBold 'Vleugelspeler waarde is grootste Else fldAanvaller.Font = hbFontBold 'Aanvaller waarde is grootste EndIf etc... Het plan is om misschien nog 1 of 2 posities toe te voegen maar dan wordt het helemaal een onoverzichtelijke bende op deze manier (en dientengevolge ook nog meer data) |
#4
|
||||
|
||||
Ik weet niet hoe statisch die sterkte is, maar als je die in dezelfde tabel opslaat kun je met max werken.
Een andere mogelijkheid is om alle velden in een array zetten waar je makkelijk doorheen kunt lopen. |
#5
|
||||
|
||||
Een andere mogelijkheid is je algebraboek uit de kast te halen voor het vereenvoudigen en oplossen van x vergelijkingen met y onbekenden en het te berekenen.
Maar een subroutine die de waarde met de andere 5 vergelijkt zal wel het eenvoudigst zijn. bool sub (ref, a, b, c, d, e) if ref > a and ref > b and ref > c and ref > d and ref > e then ret true else ret false |
#6
|
||||
|
||||
Form > 64k: Op de Palm mag een resource (bijv een form) of een datablok niet groter zijn dan 64k. Daarom moet je je code een beetje verdelen en dit soort rekenregels niet in een form maar in een module zetten (die je dan weer een andere segmentnaam geeft). If then else is niet altijd fout of inefficient (HB++ zou het even efficient compileren als een ingewikkelde boolean constructie) maar ik heb ook het idee dat een max() fu¤
|
#7
|
|||
|
|||
dat is ook een idee natuurlijk. Maar heb bij nog andere functies nodig om een serie data uit mijn database te kunnen sorteren van groot naar klein dus dan zou ik alsnog van het if then else af moeten.
Ach en zo lang programmee rik nog niet met Basic en lange 'if-construsties' zijn wel bevordelijk voor het overzichtelijk programmeren dus het is zowieso niet voor niets geweest |
#8
|
|||
|
|||
Citaat:
Oorspronkelijk geplaatst door Bram
Ik weet niet hoe statisch die sterkte is, maar als je die in dezelfde tabel opslaat kun je met max werken.
Dim db as New tblSpelers db.OpenTable hbModeOpenExisting+hbModeReadOnly db.Max("vKeeper") Field1.Text=dbAuto.Naam db.Close Zo staat het ook (ongeveer) in de help file maar dan geeft hij niet de juiste waarde Laatst gewijzigd door djunclesam; 22 augustus 2006 om 15:39. |
#9
|
||||
|
||||
Waarom gebruik je ergens dbAuto?
|
#10
|
|||
|
|||
omdat ik (hopelijk) na db.Max de juiste speler heb en dan met dbAuto zijn naam uit de tabel kan halen. Maar heb het ook zonder dbAuto geprobeerd en met een message box zoals in de help staat en dan kwam er ook niet de goede waarde uit... Enige verschil dat zijn op recordset zoeken en ik op Table... dus misschien werkt db.Max alleen in een recordset??
|
#11
|
||||
|
||||
Met db.max heb je alleen de maximale waarde. Aan dbAuto wordt niets veranderd. Je moet nu nog zoeken welke naam bij die maximale waarde hoort.
|
#12
|
|||
|
|||
Zo werkt het wel
dim iMax as integer, iTemp as integer, iNamed1 as String iMax = 0 db.MoveFirst While Not db.EOF iTemp = db.vkeeper if iTemp > iMax then iNamed1 = db.Named if iTemp > iMax then iMax = iTemp db.MoveNext Wend Field1.Text=iNamed1 Nu eens kijken of we er dan ook de een na grootste uit kunnen krijgen |