Morsezeichen rekursiv

  • VB.NET

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

    Morsezeichen rekursiv

    Liebe Leute,
    Problem:
    Alle Morsenachrichten einer festen Länge z.B. 5 sollen erzeugt werden. Strich - hat Breite 2 und der Punkt . die Breite 1
    Zwei Prozeduren habe ich entwickelt, sollten dasselbe liefern, tun sie aber nicht. Warum? - In Delphi/Pascal hatte ich das Problem nicht.
    Gruß
    Delphi-Umsteiger

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub BtStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtStart.Click
    3. Dim Laenge As Double = TbGesLaenge.Text
    4. Dim Kombinationen As String = ""
    5. LbAnzeige.Items.Clear()
    6. MorseWort(Kombinationen, Laenge)
    7. LbAnzeige.Items.Add(" Methode mit Stringanweisungen: ")
    8. MorseWort2(Kombinationen, Laenge)
    9. End Sub
    10. Sub MorseWort(ByVal Kombis As String, ByVal laenge As Double)
    11. If laenge <= 0 Then LbAnzeige.Items.Add(Kombis)
    12. If laenge >= 2 Then MorseWort(Kombis & "- ", laenge - 2)
    13. If laenge >= 1 Then MorseWort(Kombis & ". ", laenge - 1)
    14. End Sub
    15. Sub MorseWort2(ByRef Kombis As String, ByVal laenge As Double)
    16. If laenge <= 0 Then LbAnzeige.Items.Add(Kombis)
    17. If laenge >= 2 Then
    18. Kombis &= "- "
    19. laenge = laenge - 2
    20. MorseWort2(Kombis, laenge)
    21. End If
    22. If laenge >= 1 Then
    23. Kombis &= ". "
    24. laenge = laenge - 1
    25. MorseWort2(Kombis, laenge)
    26. End If
    27. End Sub
    28. End Class
    @DelphiUmsteiger Ich habe Deinen Code bei mir reinkopiert und bekomme da eine ganz merkwürdige Fehlermeldung:

    Kannst Du das aufklären :?:
    Mach mal aus

    VB.NET-Quellcode

    1. If ...
    2. If ...
    3. If ...
    4. ' bzw.
    5. If ...
    6. If ...
    7. End If
    8. If ...
    9. End If
    dies:

    VB.NET-Quellcode

    1. If ...
    2. ElseIf ...
    3. ElseIf ...
    4. End If
    Dann machst Du aus Double => Integer
    und aus der TextBox ein NumericUpDown.

    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!
    Lieber Erfinder d. R.
    Ich habe byval und byRef ausprobiert: dieselbe Differenz
    Der erste Algorithmus ist sicher richtig. (Frühe Erfahrungen mit Pascal)
    Aber wenn meine Schüler mir den zweiten vorschlagen, weiß ich nicht,was ich antworten soll.
    Danke für die quicke Antwort!

    An RedfromG:
    Woher die "Rouladen mit Rotkohl" kommen ist sicher Dein Geheimnis. Bei mir kommen sie nicht vor.
    Elseif auch schon ausprobiert, liefert nur eine Morse Nachricht, und das aus gutem Grund.
    Die anderen Hinweise liefern erwartungsgemäß keine Änderung, sind sicher sinnvoll.

    Macht Spaß mit Euch zu reden!
    habs:

    VB.NET-Quellcode

    1. Sub MorseWort2(ByVal Kombis As String, ByVal laenge As Double)
    2. If laenge <= 0 Then LbAnzeige.Items.Add(Kombis)
    3. If laenge >= 2 Then
    4. Kombis &= "- " ' hier wird Kombis verlängert - mit Auswirkung aufs 2. If
    5. laenge = laenge - 2 ' hier wird laenge verkürzt - mit Auswirkung aufs 2. If
    6. MorseWort2(Kombis, laenge)
    7. End If
    8. If laenge >= 1 Then
    9. Kombis &= ". "
    10. laenge = laenge - 1
    11. MorseWort2(Kombis, laenge)
    12. End If
    13. End Sub
    14. Sub MorseWort(ByVal Kombis As String, ByVal laenge As Double)
    15. If laenge <= 0 Then LbAnzeige.Items.Add(Kombis)
    16. If laenge >= 2 Then MorseWort(Kombis & "- ", laenge - 2) ' hier gelangen Kombis und laenge unverändert ins 2. If
    17. If laenge >= 1 Then MorseWort(Kombis & ". ", laenge - 1)
    18. End Sub
    (Und Rod soll seines Rätsels Lösung selber sagen ;) )

    Ach - und setze mal in MorseWort die Kombis byRef - dann funzt das auch nicht mehr "richtig".

    Ach - Ach - und der Algo ist falsch (zumindest ists keine vollständige Permutation): bei laenge=4 scheinen mir Kombis zu fehlen, wie:

    VB.NET-Quellcode

    1. . .
    2. - - .
    3. - - - -
    und weitere.
    Aber vlt. ist das ja beabsichtigt - ich kenn mich mit morsen nicht so aus.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    DelphiUmsteiger schrieb:

    Woher die "Rouladen mit Rotkohl" kommen ist sicher Dein Geheimnis. Bei mir kommen sie nicht vor.
    Mach gaaaaaaaaaaaaaaaaaaaanz schnell Option Strict On.

    DelphiUmsteiger schrieb:

    Elseif auch schon ausprobiert, liefert nur eine Morse Nachricht, und das aus gutem Grund.
    Was soll denn rauskommen?
    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!
    "Rouladen mit Rotkohl"?? Da schau nochmal genau: Es sind "Rouladen mit Klößen"!

    Und ich sag jetzt doch mal vor: Die kommen daher, dass Rod halt "Rouladen mit Klößen" in die Textbox eingegeben hat - so einfach ist das.
    Und das ist das Problem: Nämlich wie einfach es ist, Anwendungen zum Absturz zu bringen, die Option Strict Off programmiert wird.
    Weiterführendes dazu findste hier: Visual Studio - Empfohlene Einstellungen
    @ErfinderDesRades [OT]Die dienstjungen Kollegen kennen uns halt noch nicht. :D [/OT]
    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!

    DelphiUmsteiger schrieb:

    Aber wenn meine Schüler mir den zweiten vorschlagen, weiß ich nicht,was ich antworten soll.


    Auch wenns leicht OffTopic ist:
    Was, wenn die Schüler diesen Thread finden und lesen diese Aussage? Wenn ich etwas Unterrichte, sollte man davon ausgehen das ich den Stoff beherrsche ;)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich finds eiglich nicht schlecht, wenn ein Lehrer auch mal nicht so tut, als sei er Dr. Allwissend.

    Und das Problem ist durchaus knifflig - bin ich auch nur nach einigem Suchen drauf gekommen.

    Aber hast schon recht: Meist untergräbt das die Autorität bei den Schülern, wie es überhaupt leider immer Autorität untergräbt, wenn einer Schwäche zeigt.
    Da beisst sich Katze Schwanz: Weil alle Lehrer tun als ob sie allwissend seien, wird genau das auch von ihnen erwartet - sonst Mobbing.

    Hmm - ich widersprech mir aber auch selbst.
    Weil sonst bin ich der allererste, der sich über inkompetentes Lehrpersonal aufregt. Nur findich das Algorithmus-Problem nicht unbedingt ein Zeichen von Inkompetenz.
    Wohl aber, dass hier Option Strict Off geproggt wird.
    Diese Unart sollte man keinesfalls an seine Schüler multiplizieren dürfen!
    Visual Studio - Empfohlene Einstellungen - unerhört wichtig!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @mrMo @ErfinderDesRades Jou.
    Das mit den Schülern ist mir durch die Lappen gegangen. :whistling:
    Ich erwarte von einem Lehrer, dass er zu einem Problem eine vollständige Frage formulieren kann.
    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 gebe seit über 5 Jahren Schulungen in der Softwarebranche (nicht programmieren) und möchte hier kein Lehrer bashing betreiben. Immerhin beschäftigt sich dieser hier am Wochenende mit Aufgaben die er seinen Schülern stellen möchte (vermutlich). Sehr löblich und zeugt ganz sicher nicht von inkompetenz sondern von engagement.

    Was ich aus meiner Erfahrung sagen kann ist, dass wenn der Lehrer unzureichend Ahnung vom Thema hat, wird es jemanden geben der das merkt und den Lehrer dann "auseinander nehmen". Und das im schlimmsten Fall auf fachlicher Ebene.

    Daher sollte man sich seines Themas sicher sein, bevor man vor eine Gruppe von Leuten tritt um diesen etwas bei zu bringen. Hier einige Beispiele aus diesen Thread:

    1. Wissen was Fehlermeldungen bedeuten und woher sie kommen (Screenshot von Rod mit der Roulade)
    2. Auswirkungen Option Strict Off/On (sonst wäre 1. gar nicht passiert)
    3. Umgang mit If/ElseIf (Alles mit If machen ist suboptimal da, unnötigerweise jede Prüfung ausgeführt wird)
    4. Auf dem möglichst aktuellen Stand der Sprache bleiben laenge = laenge - 1 -> laenge -= 1
    5. Umgang mit Controls (TextBox/NumericUpDown)
    6. Datentypen (siehe 2./1.)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Liebe Freunde,
    Nach einem Tag Abstand habe ich eure Unterhaltung gern gelesen.
    Zur Klärung meine ursprüngliche Frage, warum die beiden Routinen was verschiedenes liefern, hat ErfinderdesRades beantwortet.
    Übrigens war das eine Frage, die kein Schüler gestellt hat, sondern ich mir selber. Und da gibt es noch viele mehr offene Fragen.
    Ein Lehrer, der vor seinen Schülern Fehler zugibt, wirkt echter und kommt besser an.
    Zu meinem ungenauen Umgang mit den Datentypen:
    Ich habe vor 40 Jahren in BASIC, danach Turbo(Borland)-Pascal, Prolog, Logo, und vor allem in Delphi programmiert, mir alles selber beigebracht. Das berufsbegleitende Studium hatte es kaum mit Programmieren zu tun. Inzwischen bin ich 75 J.
    Nun wurde ich vor 11 Jahren Jahren gebeten, in der Oberstufe eines Gymnasiums Informatik zu unterrichten, weil es einfach kaum Lehrer dafür gibt.
    Dort hatten der bisher unterrichtende Profi, ein Programmierer von Beruf, VB eingeführt. Weil er die Anfängerkurse unterrichtete musste ich vor 4 Jahren auf VB zu meinem Leidwesen umwechseln. Zu meinem Entsetzen übernahm der VB - Compiler die Typenkonvertierung. Er schluckte fast alles. Ich habe vergebliche Mühe aufgewandt, die Sch. zu exaktem Denken zu erziehen, wie ich es von Delphi an meiner früheren Schule gelehrt hatte.
    Von Strict on/off erfuhr ich als Autodikakt ich nichts.
    - Ich bin Euch dankbar, und werde die nächste Sch.-Gruppe wieder richtig "zwiebeln". ;)
    Es grüßt Euch
    Delphi-Umsteiger (Nomen est omen, kein Wunder)

    DelphiUmsteiger schrieb:

    Zu meinem Entsetzen übernahm der VB - Compiler die Typenkonvertierung. Er schluckte fast alles.
    Das gefällt mir, dass dir Option Strict Off auf den Geist ging, noch bevor dir der Begriff ühaupt bekannt war! :thumbsup:

    DelphiUmsteiger schrieb:

    Autodikakt
    Ist IMO nicht hinreichend - jdfs. wenn damit "learning by doing" (alias: "rumprobieren") gemeint ist.
    Die Sprache ist so hoch entwickelt und so komplex, und auf die besten Konzepte kommt man mit rumprobieren nie Leben.
    Also entweder echt viel im INet sich umgucken, gute SampleCodes downloaden etc., und / oder sich ein gut Buch zur Brust nehmen.

    Hier noch Grundlagen-Tuts mit Themen, die IMO an Anfänger-Schüler rangelabert werden sollten:
    Grundlagen: Fachbegriffe
    VisualStudio-Video
    Video-Tut: Welchen Datentyp hat das Objekt?
    Layout in WinForms
    Alles über Events

    Anschließend kann man Fortgeschritteneren dann auch mit Datenmodellierung und Databinding kommen - das ist nochmal eine annere Welt (kann ich auch Tuts zu ansagen, bei Interesse).