Code vereinfachen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von simpelSoft.

    Code vereinfachen

    Hallo,
    bin gerade dabei für meine Tochter ein Programm zu entwickeln zum lernen der Vergangenheitsformen.
    Jetzt würde ich gerne aber noch eine Funktion einbauen, bei der sich die Pronomen (ich, du, er) zufällig generieren lässt.

    Der folgende Code funktioniert, aber er ist ewig lang, wenn ich das ganze für ca. 90 Wörter wiederholen müsste.

    VB.NET-Quellcode

    1. 'Zufallspronomen einfügen:
    2. '1 = ich
    3. '2 = du
    4. '3 = er
    5. '4 = wir
    6. '5 = sie (alle)
    7. Dim random As New Random
    8. My.Settings.Wort1 = random.Next(1, 6)
    9. My.Settings.Wort2 = random.Next(1, 6)
    10. My.Settings.Wort3 = random.Next(1, 6)
    11. If My.Settings.Wort1 = 1 Then
    12. Wort1_Pro1.Text = "ich"
    13. Wort1_Pro2.Text = "ich"
    14. Wort1_Pro3.Text = "ich"
    15. End If
    16. If My.Settings.Wort1 = 2 Then
    17. Wort1_Pro1.Text = "du"
    18. Wort1_Pro2.Text = "du"
    19. Wort1_Pro3.Text = "du"
    20. End If
    21. If My.Settings.Wort1 = 3 Then
    22. Wort1_Pro1.Text = "er"
    23. Wort1_Pro2.Text = "er"
    24. Wort1_Pro3.Text = "er"
    25. End If
    26. If My.Settings.Wort1 = 4 Then
    27. Wort1_Pro1.Text = "wir"
    28. Wort1_Pro2.Text = "wir"
    29. Wort1_Pro3.Text = "wir"
    30. End If
    31. If My.Settings.Wort1 = 5 Then
    32. Wort1_Pro1.Text = "sie"
    33. Wort1_Pro2.Text = "sie"
    34. Wort1_Pro3.Text = "sie"
    35. End If


    Wichtig zum Verständnis: Jede Spalte ist gleich aufgebaut:

    Label mit dem Wort (Name: Wort1), Pronomen1 (Wort1_Pro1), Textfeld, Pronomen2 (Wort1_Pro2), Textfeld, Pronomen3 (Wort1_Pro3), Textfeld

    Ich hoffe es ist zu verstehen und jemand kann mir helfen diesen Code oben zu vereinfachen.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Wort1_Pro1.text = GenerateRandomWord()
    3. Wort2_Pro2.text = GenerateRandomWord()
    4. Wort3_Pro3.text = GenerateRandomWord()
    5. End Sub
    6. Function GenerateRandomWord() As String
    7. Dim rnd As New Random
    8. Dim tmpInt As Integer
    9. tmpInt = rnd.Next(1, 6)
    10. Select Case tmpInt
    11. Case 1
    12. Return "ich"
    13. Case 2
    14. Return "du"
    15. Case 3
    16. Return "er"
    17. Case 4
    18. Return "wir"
    19. Case 5
    20. Return "sie (alle)"
    21. Case Else
    22. Return ""
    23. End Select
    24. End Function
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Der Code ist zu unvollständig, um da sinnvolle Tipps zu geben. Klar kann man hier schon optimieren.

    VB.NET-Quellcode

    1. Select Case My.Settings.Wort1
    2. Case 1: SetPronouns("ich")
    3. Case 2: SetPronouns("du")
    4. '…
    5. End Select
    6. '…
    7. Private Sub SetPronouns(Pronoun As String)
    8. Wort1_Pro1.Text = Pronoun
    9. Wort1_Pro2.Text = Pronoun
    10. Wort1_Pro3.Text = Pronoun
    11. End Sub

    Aber Sinn ergibt das so nicht. Wozu die Zufallswerte in den Settings speichern? Naja, und das mit der Wortauswahl könnte in der jetzigen Fassung auch ganz interessant (?) werden zu sehen.

    ##########

    Ja, das von asusdk ergibt etwas mehr Sinn als meins. Sind ja unterschiedliche Pronomen, nicht immer die gleichen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Sorry, das ich vorhin einfach Kommentarlos geantwortet habe, aber ich musste umgehend los, hätte ich meine Verbindung verpasst, wäre ich erst eine Stunde später zu Hause ^^. Es wäre toll, wenn du dein fertiges Lernprojekt am Ende hochlädst, evtl. können wir dir da auch noch mit Rat und Tat zur Seite stehen =)

    LG
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    @Anonymus123 Ganz doll sehr wichtiger Hinweis:

    asusdk schrieb:

    VB.NET-Quellcode

    1. Dim rnd As New Random
    Diese Zeile gehört nicht in die Prozedur, sondern in die Klasse!
    New Random darf nur ein Mal aufgerufen werden, sonst sind die Zufallszahlen nicht zufällig.
    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!
    Ich werd mal widersprechen präzisieren: Wenn Dim rnd As New Random zu schnell nacheinander aufgerufen wird, entstehen gleiche Zufallszahlfolgen, weil der Seed für die neu zu erstellende Random-Instanz gleich ist. Aber für @Anonymus123 dürfte dieses Hintergrundwissen wohl derzeit sekundär sein.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hey,
    für dieses Thema gibt es viele Lösungen.
    Eine davon wäre die Verwendung eines Stacks, dann ist es ein Einzeiler:

    C#-Quellcode

    1. return new Stack<string>(new List<string>() { "ich", "du", "er", "wir", "sie (alle)" }.OrderBy(w => rnd.Next()));


    Die Methode, die den String-Stack enthält, wird dann nur immer mit Pop aufgerufen und liefert.
    Die Liste könnte auch noch raus aus der Methode, dann wird nicht immer ein neues Objekt erzeugt.

    Hier zum Basteln in einer Konsolenanwendung (war zu faul, das in eine GUI zu packen):

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. namespace zufallsworte {
    5. class Program {
    6. private static Random rnd = new Random();
    7. static void Main() {
    8. Console.WriteLine(GetWord().Pop());
    9. Console.WriteLine(GetWord().Pop());
    10. Console.WriteLine(GetWord().Pop());
    11. Console.ReadKey();
    12. }
    13. private static Stack<string> GetWord() {
    14. return new Stack<string>(new List<string>() { "ich", "du", "er", "wir", "sie (alle)" }.OrderBy(w => rnd.Next()));
    15. }
    16. }
    17. }



    Geht vielleicht sogar noch ein bisschen kürzer ...

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

    Den Stack kann man sich sparen, ein String Array oder List<String>, einfach den Wert eines zufälligen Index zurückgeben. Spart man sich einige CPU Operationen.
    Die Natur ist bekanntermaßen knallhart, sie sortiert aus was sich nicht bewährt hat.(Harald Lesch, 2021)

    Demnach müssten wir bald dran sein...