Arrays etc

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

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

    Amelie schrieb:

    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?


    Das Vorgehen ist nicht falsch. generell ist es nie falsch, wenn man es so machen möchte (und ja, das ist hier auch ein beliebtes Vorgehen bei solchen Dingen).
    Ich denke, du brauchst vor allem nochmal einen Groschen, der beim Grundgedanken fallen müsste:

    Wenn du eine Zahl hast, die definitiv kleiner ist als 10 -> weißt du, es handelt sich hier um "Einer". Das kann man getrost so stehen lassen.
    Ist die Zahl jedoch größer oder gleich 10, musst du mit "Zehnern" und "Einern" arbeiten.

    Jetzt nutzen wir das Wissen, dass eine zweistellige Zahl - zB. 24 - aus dem Zehner-Wert 20 und dem Einer-Wert 4 besteht. Er lässt sich also darauf aufteilen.


    Wenn wir nun den Wert 24 nehmen und einfach mal durch 10 teilen und als Ganzzahl speichern, wirst du hierin nur die 2 finden. Kommastellen werden dann abgeschnitten. Dann kannst du dieses zum Beispiel sehr gut dafür nutzen, um auf das entsprechende Zehner-Array zu verweisen.

    Und auch die Einerstelle kann man sehr schön ermitteln. Hierfür gibt es die Modulo-Operation oder zu Deutsch: Restwert-Teilung. Als Beispiel sei hier gegeben: 22 / 7 = 3,1428.... (usw). Man kann es auch in Brüchen ausdrücken. Also wären das 3 Ganze und 1/7. Oder wie man in der Schule häufig gelernt hat: 22/7 = 3 Rest 1.

    Nehmen wir nun an, du möchtest die "Einer" ermitteln, dann kannst du das ganze mittels der Rest-Wert-Teilung machen (Modulo). Hierbei müssen wir jedoch berücksichtigen, dass wir zur Basis 10 rechnen (weil es ja zehn Einer sind für einen Zehner) und auch, dass lediglich der Restwert zurückgegeben wird, nicht aber die Ganzzahl, die rauskommt..

    Teilen wir also 24 durch 10 mittels Modulo, so sollten 4 übrig bleiben:

    VB.NET-Quellcode

    1. Dim eigentlicheZahl As Integer = 24
    2. Dim Zehner As Integer
    3. Dim Einer As Integer
    4. Zehner = eigentlicheZahl / 10 'hierin sollte sich nun die 2 befinden
    5. Einer = eigentlicheZahl Mod 10 'hier sollte 4 drinstehen.
    6. 'nun könnte man die Arrays ansprechen mit Einer und Zehner


    Das Schöne an diesem Verfahren ist auch, dass man die Arrays genau so nutzen kann, wie du sie vorbereitet hast.

    VB.NET-Quellcode

    1. Dim Zehnerstelle As string
    2. Dim Einerstelle As string
    3. Zehnerstelle = _Zehner(Zehner)
    4. Einerstelle = _Einer(Einer)
    5. Dim GanzeUhr = Einerstelle & Zehnerstelle.


    Lediglich die Sonderfälle - wie du bereits erkannt hast - müssen hier rausgenommen werden und dürfen so nicht zurückgegeben werden. Aber alle anderen können über genau die Rechenweise ermittelt und aneinandergefügt werden.
    Und das wiederum kann man mittels einfacher Wenn-Dann-Logik machen.

    Ich denke, dein Vorhaben scheiterte nicht am Vorhaben selbst, sondern weil du dich mit diesen ganzen If-Else-Statements und auch den Bedingungen verhaspelt hast.

    Ich denke, das wichtigste hierbei ist, dass man erstmal verstehen muss, dass die Zahlen zusammengesetzt werden aus "Einern" und "Zehnern" und man dieses Verhalten 1-zu-1 in das Programm übernehmen kann.
    Und manchmal hilft auch ein Fingerzeig auf Funktionen, die bereits vorhanden sind :)

    Falls hierüber noch Verständnisfragen da sind, einfach melden :)

    Gruß Pascal
    @PadreSperanza Fang an mit Option Strict On :!:

    VB.NET-Quellcode

    1. Zehner = eigentlicheZahl / 10 'hierin sollte sich nun die 2 befinden
    Diese Zeile sollte dann markiert sein.
    Integer-Division gent in VB so:

    VB.NET-Quellcode

    1. Zehner = eigentlicheZahl \ 10

    @Amelie Ich versuche Dich nun schon eine Weile dazu zu bewegen, Dich mit Datentypen zu beschäftigen, aber dieses Thema ist Dir wohl nicht geheuer.
    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!
    @PadreSperanza

    Danke, gut erklärt aber leider bin ich etwas verwirrt. Naja liegt an meinem AA.
    Das mit den Teilen usw verstehe ich glaube ich.
    Muss ich nun für EINER und ZEHNER je eine eigene Funktion schreiben?

    @RodFromGermany

    Wäre das so besser? Ansonsten verstehe ich nicht was du meinst.

    VB.NET-Quellcode

    1. Dim now = DateTime.Now
    2. Dim h As String
    3. Dim m As String
    4. Dim s As String
    5. h = DateTime.Now.Hour.ToString()
    6. m = DateTime.Now.Minute.ToString()
    7. s = DateTime.Now.Second.ToString()


    ​Ich versuche ... Dich mit Datentypen zu beschäftigen, aber dieses Thema ist Dir wohl nicht geheuer.

    Ich lese und lese und &&& aber vieles fällt mir nicht leicht.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Private Sub uhranzeige()
    Dim now = DateTime.Now
    Dim h As String = (now.Hour.ToString())
    Dim m As String = (now.Minute.ToString())
    Dim s As String = (now.Second.ToString())
    lbl_std.Text = Zahlen.getStd(CInt(h))
    lbl_min.Text = Zahlen.getMin(CInt(m))
    lbl_sec.Text = Zahlen.getSec(CInt(s))
    End Sub


    Dein Zahlen.getXXX() erwartet als Eingabeparameter einen Wert vom Typ integer. DateTime.Now.Hour bzw. Minute und auch Second sind schon vom Typ integer.
    Es ist also einfach nur grober Unfug Dim h As String DateTime.Now.Hour als String zuzuweisen, weil du den Wert für dein Zahlen.getXXX dann wieder in einen integer wandelst.

    Mach einfach lbl_std.Text = Zahlen.getStd(DateTime.Now.Hour), du sparst dir die unnötigen Variablen und die absolut überflüssigen Typkonvertierungen von integer zu string und wieder zurück zu integer

    Amelie schrieb:

    Wäre das so besser?
    Nein, Du hast es leider nicht verstanden.

    VB.NET-Quellcode

    1. Dim now = DateTime.Now
    2. Dim h As Integer = DateTime.Now.Hour
    3. Dim m As Integer = DateTime.Now.Minute
    4. Dim s As Integer = DateTime.Now.Second
    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
    @PadreSperanza
    &&&

    Ich denke für die Sekunden-Anzeige habe ich es hinbekommen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_clock
    2. Dim Zahlen As New Zahlen
    3. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    4. uhranzeige()
    5. End Sub
    6. Private Sub frm_clock_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Timer1.Start()
    8. End Sub
    9. Private Sub uhranzeige()
    10. Dim now = DateTime.Now
    11. Dim h As Integer = DateTime.Now.Hour
    12. Dim m As Integer = DateTime.Now.Minute
    13. Dim s As Integer = DateTime.Now.Second
    14. 'lbl_std.Text = Zahlen.getSec(h)
    15. 'lbl_min.Text = Zahlen.getSec(m)
    16. lbl_sec.Text = Zahlen.getSec(s)
    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 aktlZiffer As Integer
    27. Public Zehner As Integer
    28. Public Einer As Integer
    29. Public Zehnerstelle As String
    30. Public Einerstelle As String
    31. Public Zeit As String
    32. Public Function getSec(aktlZiffer As Integer) As String
    33. Zehner = CInt(aktlZiffer \ 10)
    34. Einer = aktlZiffer Mod 10
    35. If aktlZiffer < 10 Or aktlZiffer > 19 Then
    36. Einerstelle = _Einer(Einer)
    37. ElseIf aktlZiffer > 9 And aktlZiffer < 20 Then
    38. aktlZiffer = 0 + (aktlZiffer - 10)
    39. Einerstelle = _Sonderzehner(Einer)
    40. End If
    41. If Zehner > 1 Then
    42. Zehnerstelle = " und " & _Zehner(Zehner)
    43. If aktlZiffer = 20 Or aktlZiffer = 30 Or aktlZiffer = 40 Or aktlZiffer = 50 Then
    44. Zehnerstelle = _Zehner(Zehner)
    45. End If
    46. Else
    47. Zehnerstelle = _Zehner(Zehner)
    48. End If
    49. Zeit = Einerstelle & Zehnerstelle
    50. Return Zeit
    51. End Function
    52. #End Region
    53. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Ich hab Deinen Code und Deinen Output noch ein wenig gehübscht:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Clock
    2. ReadOnly Zahlen As New Zahlen
    3. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    4. Uhranzeige()
    5. End Sub
    6. Private Sub Clock_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Timer1.Start()
    8. End Sub
    9. Private Sub Uhranzeige()
    10. Dim now = DateTime.Now
    11. Dim h As Integer = DateTime.Now.Hour
    12. Dim m As Integer = DateTime.Now.Minute
    13. Dim s As Integer = DateTime.Now.Second
    14. lbl_sec.Text = Zahlen.getSec(s)
    15. End Sub
    16. End Class
    17. Class Zahlen
    18. #Region "Arrys"
    19. Public _Einer As String() = {"", "Ein", "Zwei", "Drei", "Vier", "Fünf", "Sechs", "Sieben", "Acht", "Neun"}
    20. Public _Sonderzehner As String() = {"Zehn", "Elf", "Zwölf", "Dreizehn", "Vierzehn", "Fünfzehn", "Sechzehn", "Siebzehn", "Achtzehn", "Neunzehn"}
    21. Public _Zehner As String() = {"", "", "Zwanzig", "Dreißig", "Vierzig", "Fünfzig", "Sechzig"}
    22. #End Region
    23. #Region "Funktionen"
    24. Public aktlZiffer As Integer
    25. Public Zehner As Integer
    26. Public Einer As Integer
    27. Public Zehnerstelle As String
    28. Public Einerstelle As String
    29. Public Zeit As String
    30. Public Function getSec(aktlZiffer As Integer) As String
    31. Zehner = aktlZiffer \ 10
    32. Einer = aktlZiffer Mod 10
    33. If aktlZiffer = 0 Then
    34. Einerstelle = "Null"
    35. ElseIf aktlZiffer = 1 Then
    36. Einerstelle = "Eins"
    37. ElseIf aktlZiffer < 10 OrElse aktlZiffer > 19 Then
    38. Einerstelle = _Einer(Einer)
    39. ElseIf aktlZiffer > 9 And aktlZiffer < 20 Then
    40. aktlZiffer = 0 + (aktlZiffer - 10)
    41. Einerstelle = _Sonderzehner(Einer)
    42. End If
    43. If Zehner > 1 Then
    44. Zehnerstelle = "und" & _Zehner(Zehner).ToLower()
    45. If aktlZiffer = 20 OrElse aktlZiffer = 30 OrElse aktlZiffer = 40 OrElse aktlZiffer = 50 Then
    46. Zehnerstelle = _Zehner(Zehner)
    47. End If
    48. Else
    49. Zehnerstelle = _Zehner(Zehner)
    50. End If
    51. Zeit = Einerstelle & Zehnerstelle
    52. Return Zeit
    53. End Function
    54. #End Region
    55. End Class
    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!
    @VB1963
    Ja das hatte ich schonmal gesehen.
    @RodFromGermany

    Danke werde ich mir mal ansehen.

    Ich hatte so eine ähnliche Sache auf Youtube schonmal in VB6 mit ganz vielen ​Select // Case gesehen.

    Soweit ich mich erinnere war da für jede Zahl ein Case: ​Case 0 = "Null" , Case 1 = "Eins" usw. Das für jeden Einer / Zehner ...
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    ​Case 0 = "Null" , Case 1 = "Eins"
    Lasse die weg und lass Dein Programm länger als eine Minute laufen, dass Du alle Sekunden-Werte zu sehen bekommst.
    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 hatte und habe NICHT vor das mit diesen Select Case zu machen. Soviel habe ich dann doch schon gelernt das es mit wesentlich weniger Code geht.
    Habe es ja nun mit Hilfe von Euch geschafft.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    das es mit wesentlich weniger Code geht.
    Wie hast Du es denn gelöst?
    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 meinst du?
    Da kannst Du doch auch Deinen neuen Code posten.
    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

    Hat sich nicht mehr viel geändert. Ich mache gerade noch etwas mit Kalenderwoche etc..
    Wenn ich das alles habe hänge ich das Projekt hier an ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    So ich habe meine " Wortuhr " fertig.
    Wenn ich noch etwas übersehen habe oder etwas besser gemacht werden kann .. ;)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_clock
    2. Dim klass As New Funktion
    3. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    4. ausgabe()
    5. End Sub
    6. Private Sub frm_clock_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Timer1.Start()
    8. End Sub
    9. Private Sub ausgabe()
    10. Dim h As Integer = DateTime.Now.Hour
    11. Dim m As Integer = DateTime.Now.Minute
    12. Dim s As Integer = DateTime.Now.Second
    13. 'Deutsch
    14. Dim sekunden As String
    15. Dim minuten As String
    16. If klass.getWorte(s) = "Ein" Then
    17. sekunden = klass.getWorte(s) & "e" & " Sekunde"
    18. Else
    19. sekunden = klass.getWorte(s) & " Sekunden"
    20. End If
    21. If klass.getWorte(m) = "Ein" Then
    22. minuten = klass.getWorte(m) & "e" & " Minute und - "
    23. Else
    24. minuten = klass.getWorte(m) & " Minuten und - "
    25. End If
    26. lbl_std.Text = klass.getWorte(h) & " Uhr - " & minuten & sekunden
    27. lbl_kwdate.Text = "Heute ist: " & klass.getwochentag() & " Es ist Kalenderwoche: " & klass.getKW(klass.now)
    28. End Sub
    29. End Class
    30. Public Class Funktion
    31. Public now As Date = DateTime.Now
    32. #Region "Arrays"
    33. Public _Einer As String() = {"", "Ein", "Zwei", "Drei", "Vier", "Fünf", "Sechs", "Sieben", "Acht", "Neun"}
    34. Public _Sonderzehner As String() = {"Zehn", "Elf", "Zwölf", "Dreizehn", "Vierzehn", "Fünfzehn", "Sechzehn", "Siebzehn", "Achtzehn", "Neunzehn"}
    35. Public _Zehner As String() = {"", "", "Zwanzig", "Dreißig", "Vierzig", "Fünfzig"}
    36. #End Region
    37. #Region "Funktionen"
    38. Public aktlZeit As Integer 'Zahl (h,m,s) aus der aktl Zeit
    39. Public Zehner As Integer 'berechneter Zehnerwert aus der aktl Zeit
    40. Public Einer As Integer 'berechneter Einerwert aus der aktl Zeit
    41. Public Zehnerwort As String 'ermittelter Zehner aus den Arrays
    42. Public Einerwort As String 'ermittelter Einer aus den Arrays
    43. Public Gesamtwort As String 'fertiges Wort der aktl Zeit
    44. Public Function getWorte(aktlZeit As Integer) As String
    45. Zehner = aktlZeit \ 10
    46. Einer = aktlZeit Mod 10
    47. If aktlZeit = 0 Then
    48. Einerwort = "Null"
    49. ElseIf aktlZeit = 1 Then
    50. Einerwort = "Ein"
    51. ElseIf aktlZeit < 10 OrElse aktlZeit > 19 Then
    52. Einerwort = _Einer(Einer)
    53. ElseIf aktlZeit > 9 And aktlZeit < 20 Then
    54. aktlZeit = 0 + (aktlZeit - 10)
    55. Einerwort = _Sonderzehner(Einer)
    56. End If
    57. If Zehner > 1 Then
    58. Zehnerwort = "und" & _Zehner(Zehner).ToLower() 'zusammensetzen und kleinschreiben
    59. If aktlZeit = 20 OrElse aktlZeit = 30 OrElse aktlZeit = 40 OrElse aktlZeit = 50 Then
    60. Zehnerwort = _Zehner(Zehner)
    61. End If
    62. Else
    63. Zehnerwort = _Zehner(Zehner)
    64. End If
    65. Gesamtwort = Einerwort & Zehnerwort
    66. Return Gesamtwort
    67. End Function
    68. #End Region
    69. #Region "Datum und KW"
    70. 'Aktuelles Datum erstellen und Wochentags-Name ermitteln
    71. Public Function getwochentag() As String
    72. Dim DayName As String = MyDate.ToString("dddd")
    73. Dim TodayDatum As String = MyDate.ToString("dd MMMM yyyy", CultureInfo.CreateSpecificCulture("de-DE"))
    74. Return DayName & ", " & TodayDatum
    75. End Function
    76. 'Aktuelle Kalenderwoche ermitteln
    77. Public Function getKW(ByVal Datum As Date) As Short
    78. Dim CUI As New CultureInfo(CultureInfo.CurrentCulture.Name)
    79. Return CShort(CUI.Calendar.GetWeekOfYear(Datum, CUI.DateTimeFormat.CalendarWeekRule, CUI.DateTimeFormat.FirstDayOfWeek))
    80. End Function
    81. #End Region
    82. End Class

    Bilder
    • Uhr-1.jpg

      60,86 kB, 774×90, 104 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Erstelle ein neues Projekt und füge dort diesen Deinen Code ein.
    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:

    Warum ist das vorher nicht angezeigt worden?
    Keine Ahnung, ich kenne Dein Projekt nicht.
    Überlege:
    Was passiert, wenn Dein Programm über Nacht läuft?
    Wie oft rufst Du DateTime.New auf?
    Wie oft erstellst Du eine CultureInfo-Instanz?
    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

    ​Was passiert, wenn Dein Programm über Nacht läuft?
    Worauf willst du hinaus?
    Hatte extra um NULL Uhr geguggt was passiert aber da ist mir nichts aufgefallen, außer das mit dem was ich unter "Deutsch" eingebaut habe.
    ...
    Ja das mit dem Datum und der KW ... hmmm...
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: