Zahl in 3er Schritten runden

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von lordknoblauch.

    Zahl in 3er Schritten runden

    Nabend Community,

    ich programmiere eine Hochsprung Simu und beim Hochsprung geht die Höhe immer in 3er Schritten.
    Folgendermaßen wird eine Zahl generiert:

    VB.NET-Quellcode

    1. ElseIf Disziplin.Text = "Hochsprung" Then
    2. If Name1.Enabled = True Then
    3. For a = 1 To 10000
    4. Dim resultat1 As New Random
    5. Dim zufall1 As Integer = resultat1.Next((Schnelligkeit1.Text ^ 1.6 + Technik1.Text ^ 2 + Form1.Text ^ 1.8 + Kraft1.Text ^ 1.5 + Ausdauer1.Text ^ 1.1) * 6.25, ((Schnelligkeit1.Text ^ 1.6 + Technik1.Text ^ 2 + Form1.Text ^ 1.8 + Kraft1.Text ^ 1.5 + Ausdauer1.Text ^ 1.1) * 8))
    6. Ergebnis1.Text = (700 + zufall1) / 10
    7. Next

    Im Grunde ist Einstiegshöhe: 1,78 oder 1,81 oder so und dann halt immer in 3cm stücken höher
    Hab leider keine Idee wie ich das lösen könnte.
    Vielen Dank schonmal im Vorraus.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MisterRieus“ ()

    MisterRieus schrieb:

    Nun möchte ich, dass Ergebnis1.text immer durch 3 teilbar ist
    Wie dividierst Du einen Text durch eine Zahl?
    Gib Deinem Projekt schleunigst Option Strict On.
    Trenne GUI und Daten.
    Nimm den Vorschlag von @Eistee: und mach Dir zunächst eine kleine Tabelle, damit Du siehst, wie das Snippet rundet.
    Fallas Du es anders möchtest, musst Du statt + 3 da einen anderen Wert eintragen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe mich nicht ganz richtig ausgedrückt.
    Folgende Höhen sollen nur möglich sein.
    178
    181
    184
    187
    190
    193
    196
    199
    202
    205
    208
    211
    214
    217
    220
    223
    226
    229

    Wenn das Ergebnis nun 201 ist soll das Ergebnis 202 sein , wenn Ergebnis 197 dann soll Ergebnis 199 sein usw.
    Und das verpackt in so wenig Code wie möglich.

    VB.NET-Quellcode

    1. Dim i As Integer = 201
    2. Do Until i Mod 3 = 0
    3. i += 1
    4. Loop


    So vllt?

    Edit: Ist nicht das kürzeste (siehe EdR) aber nachvollziehbar ;)
    Generell geht es, wie bereits erwähnt so i = Math.Ceiling(i / 3) * 3 am besten (kA ob die Funktion in VB auch Ceiling heißt :-S
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ThePlexian“ ()

    Hi, dein Code hat noch weitere Baustellen:

    VB.NET-Quellcode

    1. ElseIf Disziplin.Text = "Hochsprung" Then

    Schau dir mal Enums an. Falls Disziplin eine Combobox ist kannst du über einen kleinen Umweg die Enum daran 'binden', google mal nach "Combobox Enum", da erfährst du auch wie du den gewählten Wert wieder in eine Enum überführst.

    VB.NET-Quellcode

    1. For a = 1 To 10000
    2. Dim resultat1 As New Random

    Ganz böse: so kommen keine guten Zufallszahlen zustande. Deklariere resultat1 zumindest außerhalb der Schleife, am besten ist es wenn du nur eine Instanz davon hättest.

    VB.NET-Quellcode

    1. ..resultat1.Next((Schnelligkeit1.Text ^ 1.6..

    Rechnest du da etwa mit Strings?? Option Strict On! Ansonsten wunderst du dich später über Fehler, dessen Ursprung nur auf Strict Off zurückzuführen ist

    Die ersten beiden Posts sagen aber eigentlich alles Wichtige^^
    lg

    FreakJNS schrieb:

    Hi, dein Code hat noch weitere Baustellen:

    VB.NET-Quellcode

    1. ElseIf Disziplin.Text = "Hochsprung" Then

    Schau dir mal Enums an. Falls Disziplin eine Combobox ist kannst du über einen kleinen Umweg die Enum daran 'binden', google mal nach "Combobox Enum", da erfährst du auch wie du den gewählten Wert wieder in eine Enum überführst.

    VB.NET-Quellcode

    1. For a = 1 To 10000
    2. Dim resultat1 As New Random

    Ganz böse: so kommen keine guten Zufallszahlen zustande. Deklariere resultat1 zumindest außerhalb der Schleife, am besten ist es wenn du nur eine Instanz davon hättest.

    VB.NET-Quellcode

    1. ..resultat1.Next((Schnelligkeit1.Text ^ 1.6..

    Rechnest du da etwa mit Strings?? Option Strict On! Ansonsten wunderst du dich später über Fehler, dessen Ursprung nur auf Strict Off zurückzuführen ist

    Die ersten beiden Posts sagen aber eigentlich alles Wichtige^^
    lg


    Vielen Dank für dein Feedback.
    Mein Code ist sowieso eine riesige Baustelle ^^

    Enums werde ich mir mal genauer anschauen. Sieht auf jeden Fall brauchbar aus.
    Wenn ich das richtig verstanden habe, brauche ich dann nicht für jede Disziplin den kompletten Code machen sondern einmal nur für alle Disziplinen. Wäre genial ^^
    Bin mit den Zufallszahlen eigentlich zufrieden, aber ich prüfe das mal nach.

    Hab mein Problem jetzt auf jeden Fall so gelöst:

    VB.NET-Quellcode

    1. Ergebnis1.Text = Ergebnis1.Text - (Ergebnis1.Text Mod 3) + 1


    Vielen Dank nochmal an Eistee

    lordknoblauch schrieb:

    Wieso “+ 1“?

    MisterRieus schrieb:

    Folgende Höhen sollen nur möglich sein.
    Weil die Zielhöhen nicht durch 3 teilbar sind.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!