Arrays etc

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 50 Antworten in diesem Thema. Der letzte Beitrag () ist von Facebamm.

    Moin moin ;)

    Ich versuche mich in einer "analogen Uhr".

    Die Ausgabe funktioniert soweit bis auf die Zahlen "Zwanzig", "Dreißig", "Vierzig", "Fünfzig", "Sechzig" Da komme ich leider nicht weiter.

    Ich weis ich muss das irgendwie aus den "_Einer" und "_Zehner" zusammensaetzen....

    Desweiteren habe ich immer den Hinweis: Von der Funktion "getSec" wird nicht in allen Codepfaden ein Wert zurückgegeben.


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_clock
    2. Dim Zahlen As New Zahlen
    3. Private Sub frm_clock_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Timer1.Start()
    5. End Sub
    6. Private Sub uhranzeige()
    7. Dim now = DateTime.Now
    8. Dim h As String = (now.Hour.ToString())
    9. Dim m As String = (now.Minute.ToString())
    10. Dim s As String = (now.Second.ToString())
    11. lbl_std.Text = Zahlen.getStd(CInt(h))
    12. lbl_min.Text = Zahlen.getMin(CInt(m))
    13. lbl_sec.Text = Zahlen.getSec(CInt(s))
    14. End Sub
    15. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    16. uhranzeige()
    17. End Sub
    18. End Class
    19. Public Class Zahlen
    20. #Region "Arrys"
    21. Public _Einer As String() = {"", "Ein", "Zwei", "Drei", "Vier", "Fünf", "Sechs", "Sieben", "Acht", "Neun"}
    22. Public _Sonderzehner As String() = {"Zehn", "Elf", "Zwölf", "Dreizehn", "Vierzehn", "Fünfzehn", "Sechzehn", "Siebzehn", "Achtzehn", "Neunzehn"}
    23. Public _Zehner As String() = {"Zwanzig", "Dreißig", "Vierzig", "Fünfzig", "Sechzig"}
    24. #End Region
    25. #Region "Funktionen"
    26. Public Function getSec(Zaehler As Integer) As String
    27. If Zaehler < 10 Then
    28. Dim output As String = _Einer(Zaehler)
    29. Return output
    30. End If
    31. If Zaehler > 9 And Zaehler < 20 Then
    32. Zaehler = 0 + (Zaehler - 10)
    33. Dim output As String = _Sonderzehner(Zaehler)
    34. Return output
    35. End If
    36. 'If Zaehler > 19 And Zaehler < 60 Then
    37. ' Zaehler = 0 + ....ToDO ??
    38. ' Dim output As String = _Zehner(Zaehler)
    39. ' Return output
    40. 'End If
    41. End Function
    42. Public Function getMin(Zaehler As Integer) As String
    43. If Zaehler < 10 Then
    44. Dim output As String = _Einer(Zaehler)
    45. Return output
    46. End If
    47. If Zaehler > 9 And Zaehler < 20 Then
    48. Zaehler = 0 + (Zaehler - 10)
    49. Dim output As String = _Sonderzehner(Zaehler)
    50. Return output
    51. End If
    52. End Function
    53. Public Function getStd(Zaehler As Integer) As String
    54. If Zaehler < 10 Then
    55. Dim output As String = _Einer(Zaehler)
    56. Return output
    57. End If
    58. If Zaehler > 9 And Zaehler < 20 Then
    59. Zaehler = 0 + (Zaehler - 10)
    60. Dim output As String = _Sonderzehner(Zaehler)
    61. Return output
    62. End If
    63. End Function
    64. #End Region
    65. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:


    Desweiteren habe ich immer den Hinweis: Von der Funktion "getSec" wird nicht in allen Codepfaden ein Wert zurückgegeben.


    VB.NET-Quellcode

    1. Public Function getSec(Zaehler As Integer) As String
    2. If Zaehler < 10 Then
    3. Dim output As String = _Einer(Zaehler)
    4. Return output
    5. End If
    6. If Zaehler > 9 And Zaehler < 20 Then
    7. Zaehler = 0 + (Zaehler - 10)
    8. Dim output As String = _Sonderzehner(Zaehler)
    9. Return output
    10. End If
    11. 'If Zaehler > 19 And Zaehler < 60 Then
    12. ' Zaehler = 0 + ....ToDO ??
    13. ' Dim output As String = _Zehner(Zaehler)
    14. ' Return output
    15. 'End If
    16. ' <<<Hier fehlt ein weiteres RETURN>>>
    17. End Function


    Du hast in Deiner Funktion zwei IF-Abfragen die ein RETURN beinhalten. Wenn beide nicht zutreffen, dann erwartet VB das am Ende ein weiteres RETURN zu finden ist.
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    @Amelie Warum sind h, m, s vom Typ String?
    Warum geben nicht alle Code-Pfade einen Wert zurück?
    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!

    Amelie schrieb:

    Was soll denn da dann für ein Wert ausgegeben werden?????????????????????????????
    Setz einen Haltepunkt drauf und sieh Dir an, was an Input nicht konvertiert wird.
    Debuggen, Fehler finden und beseitigen
    ============
    Was verstehst Du nicht?
    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!
    @RodFromGermany

    OK das habe ich nun so bereinigt:

    VB.NET-Quellcode

    1. .....
    2. .........
    3. Return output
    4. End If
    5. Return CStr(Zaehler)
    6. End Function

    Jetzt werden, wenn die "Wörter" durchgelaufen sind wieder normale Zahlen angezeigt.
    Bilder
    • Uhr-1.jpg

      35,51 kB, 370×179, 150 mal angesehen
    • Uhr-2.jpg

      36,2 kB, 370×179, 149 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Dann setze die anderen Zahlen zusammen und feddich.
    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!

    Amelie schrieb:

    aber scheitere daran das ich "Out of Arry" bekomme...
    mit welchem Code?
    Testest Du überhaupt Deinen Code
    oder
    bist Du der Meinung, dass compilierender Code richtig ist? => Niemals :!:
    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!
    @RodFromGermany &&&

    Ich teste alles im Rahmen dessen was ich kann. Ich mache und lerne das alles als reines Hobby und habe keine Jahrelange Erfahrung.
    Ich versuche vieles allein umzusetzen aber stoße halt oft an Grenzen.
    Gerade jetzt wo mir so viele Tutorials nichts bringen weil die alle noch mit altem VB6 gefüllt sind.
    Wenn ich wüste wie ich mit dem Code weiterkomme bräuchte ich nicht fragen ;(
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Ich versuche mich in einer "analogen Uhr".
    Unter analog versteh ich aber eher sowas wie im Anhang - auch wenn das keine typische Zeitanzeige ist … :rolleyes:

    oobdoo schrieb:

    es ist noch kein Meister vom Himmel gefallen.
    Doch, schon einige. Aber keiner hat bisher den Aufprall überlebt …

    Aber dann doch nochmal: Mit welchem Code kommt einer Out Of Array-Geschichte?
    Und mit dem Zahlwort mit Zaehler zwischen 20 und 59: Erstmal den einer ermitteln, dann das Wort und und dann den Zehner ermitteln. Bei 30 natürlich nur den Zehner. Wie würdest Du also z.B. die 45 in den Zehner und den Einer aufteilen? Mit Code natürlich.
    Bilder
    • Analoguhr.png

      6,02 kB, 760×760, 156 mal angesehen
    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.
    @VaporiZed

    OK Dein Bild ist auch "analog" ;)

    So hier die eine Sache: Sekunden, Zählt in Worten bis zwanzig, dann dann springt es um auf dreißig usw.
    Wie hänge ich denn nun die "einer-Stellen" dadran? Oder ist diese Vorgehensweise falsch?

    VB.NET-Quellcode

    1. Public Function getSec(Zaehler As Integer) As String
    2. If Zaehler < 10 Then
    3. Dim output As String = _Einer(Zaehler)
    4. Return output
    5. End If
    6. If Zaehler > 9 And Zaehler < 20 Then
    7. Zaehler = 0 + (Zaehler - 10)
    8. Dim output As String = _Sonderzehner(Zaehler)
    9. Return output
    10. End If
    11. Zaehler = (CInt(Left(CStr(Zaehler), 1)) * 10)
    12. If Zaehler = 20 And Zaehler < 29 Then
    13. Zaehler = 0
    14. Dim output As String = _Zehner(Zaehler)
    15. Return output
    16. ElseIf Zaehler = 30 And Zaehler < 39 Then
    17. Zaehler = 1
    18. Dim output As String = _Zehner(Zaehler)
    19. Return output
    20. ElseIf Zaehler = 40 And Zaehler < 49 Then
    21. Zaehler = 2
    22. Dim output As String = _Zehner(Zaehler)
    23. Return output
    24. ElseIf Zaehler = 50 And Zaehler < 59 Then
    25. Zaehler = 3
    26. Dim output As String = _Zehner(Zaehler)
    27. Return output
    28. End If
    29. Return CStr(Zaehler)
    30. End Function
    Bilder
    • Uhr-3.jpg

      32,7 kB, 370×179, 157 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ich find das Vorgehen ziemlich verwirrend.
    Zaehler = (CInt(Left(CStr(Zaehler), 1)) * 10)
    Ich wusste, dass Du mit Strings arbeiten wirst. Aber es ist für den Moment ok. Aber: Warum heißt die Variable Zaehler? Das verwirrt total. Und dann noch diese Umrechnungen und Mehrfachbenutzungen. Denn

    VB.NET-Quellcode

    1. If Zaehler = 20 And Zaehler < 29 Then
    Ja wie jetzt? Wenn Zaehler 20 ist, kann es dann etwa größer als 29 sein? Die Bedingungen ergeben so keinen Sinn. Da verwirrst Du Dich nur selber.
    Wie wär's denn mit folgendem Pseudocode:

    Quellcode

    1. Einser = ErmittleEinserAus(aktuelleSekunde)
    2. Zehner = ErmittleZehnerAus(aktuelleSekunde)
    3. BearbeiteSonderfall, Wenn aktuelleSekunde = 1, 11, 12, 16, 17 *
    4. Sonst:
    5. Wenn Einser = 0 Dann nimm nur Wort von Zehner, aber nur, wenn Zehner nicht 00 ist.
    6. Sonst:
    7. Nimm Einserwort, dann das "Und" und das Zehnerwort; bei Zehnerwort "Zehn" lass das "und" weg

    * diese Zahlen fallen aus der Reihe. Die Standardwörter sind für die genannten Zahlen ja sonst anders:
    • eins - ein-und-vierzig
    • elf - ein-und-dreißig
    • zwölf - zwei-und-zwanzig
    • sechzehn - sechs-und-fünfzig
    • siebzehn - sieben-und-dreißig
    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.

    Amelie schrieb:

    VB.NET-Quellcode

    1. Zaehler = (CInt(Left(CStr(Zaehler), 1)) * 10)
    Angesichts dieser Schreckenszeile frage ich noch einmal:

    RodFromGermany schrieb:

    Warum sind h, m, s vom Typ String?
    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!