Beste vorgehensweise für einen "Zeichenübersetzer"

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von vb-checker.

    Beste vorgehensweise für einen "Zeichenübersetzer"

    Hallo,
    ich stecke ein wenig fest mit einem Schulprojekt und hoffe ihr könnt mir einen Schubs in die richtige richtung geben.

    Ich soll einen "Morsezeichen-übersetzter" konstruieren. Dieser sollte folgendes können.

    1. Buchstaben in Moresezeichen umwandeln
    2. Morsezeichen in Buchstaben umwandeln
    3. die Morsezeichen als audio wiedergeben

    Ich weiß nun nicht welche Vorgehensweise die beste/einfachste wäre.

    ich glaube ich könnte das mit folgendem lösen:

    1. if than-statment (if "a" than "*-")
    2.
    mit arrays (ein array mit Buchstaben, ein mit morsezeichen und den
    "such den buchstaben, merk dir die Zahl des buchstabens und gebe den
    wert des Zweiten arrays aus der dem gleichen Wert entspricht.")
    3. mit einem case-statement?

    Ich würde mich sehr über Kommentare freuen. ^^

    Liebe Grüße
    Simone
    Hi
    ich würde es mit einem Dictionary(Of Char, MorseChar) und einem Dictionary(Of MorseChar, Char) machen. MorseCharacter ist eine Klasse oder Struktur, die das gesendete Morsezeichen codiert und das Dictionary als private statische Variable beinhaltet, sodass du über zwei statische Funktionen darauf zugreifen kannst: GetChar und GetMorseChar.
    Falls es eine Regel gibt, nach der die Morsezeichen aus den zugehörigen Buchstaben codiert werden, kannst du natürlich auch eine Funktion dafür schreiben.
    Für die einzelnen Teilzeichen eines Morsezeichens könntest du bspw. ein Enum verwenden, sodass sich MorseChar als Array von Enum-Einträgen darstellen lässt - oder aber eben als feste Zahl an Enum-Werten.

    Was für eine Ausgabe als Audio soll das übrigens genau sein? Möchtest du dafür zwei Wavedateien verwenden und den System.Media.SoundPlayer oder den Ton zur Laufzeit generieren?

    Gruß
    ~blaze~

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

    Vielen dank ~blaze~, jetzt habe ich ein Richtung in die ich arbeiten kann.

    Für die Audio wollte ich jedem morsezeichen eine abfolge von system.console.Beep zuweisen (ich habe insgeheim gedacht, man könnte es auf die gleiche Art machen wie die zeichenumwandlung, nur das statt andere Zeichen der output sound ist).
    Allerdings habe ich mich damit noch nicht weiter befasst. Ich bin erstmal froh wenn ich das mit den Zeichen zum funktionieren bringe. :S
    Hallo,

    das mit den Zeichen umwandeln habe ich hinbekommen aber ich habe keine ahnung wie das mit den system.console.beep gehen soll.

    Ich wollte:

    "*" = system.console.beep(264,400)
    "-" = system.console.beep(264,800)

    Kann mir jemand ein tip geben?


    EDIT:
    Falls jemand sich für meine bisherige lösung interressiert:

    VB.NET-Quellcode

    1. Public Class transformer
    2. Private CharToMorseDict As Dictionary(Of Char, String)
    3. Private MorseToCharDict As Dictionary(Of String, Char)
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. pCharToMorseDict()
    6. pMorseToCharDict()
    7. sound.Visible = False
    8. End Sub
    9. Public Sub pCharToMorseDict()
    10. CharToMorseDict = New Dictionary(Of Char, String)
    11. CharToMorseDict.Add(Chr(65), " *- ")
    12. CharToMorseDict.Add(Chr(66), " -*** ")
    13. CharToMorseDict.Add(Chr(67), " -*-* ")
    14. CharToMorseDict.Add(Chr(68), " -** ")
    15. CharToMorseDict.Add(Chr(69), " * ")
    16. CharToMorseDict.Add(Chr(70), " **-* ")
    17. CharToMorseDict.Add(Chr(71), " --* ")
    18. CharToMorseDict.Add(Chr(72), " **** ")
    19. CharToMorseDict.Add(Chr(73), " ** ")
    20. CharToMorseDict.Add(Chr(74), " *--- ")
    21. CharToMorseDict.Add(Chr(75), " -*- ")
    22. CharToMorseDict.Add(Chr(76), " *-** ")
    23. CharToMorseDict.Add(Chr(77), " -- ")
    24. CharToMorseDict.Add(Chr(78), " -* ")
    25. CharToMorseDict.Add(Chr(79), " --- ")
    26. CharToMorseDict.Add(Chr(80), " --- ")
    27. CharToMorseDict.Add(Chr(81), " --*- ")
    28. CharToMorseDict.Add(Chr(82), " *-* ")
    29. CharToMorseDict.Add(Chr(83), " *** ")
    30. CharToMorseDict.Add(Chr(84), " - ")
    31. CharToMorseDict.Add(Chr(85), " **- ")
    32. CharToMorseDict.Add(Chr(86), " ***- ")
    33. CharToMorseDict.Add(Chr(87), " *-- ")
    34. CharToMorseDict.Add(Chr(88), " -**- ")
    35. CharToMorseDict.Add(Chr(89), " -*-- ")
    36. CharToMorseDict.Add(Chr(90), " --** ")
    37. CharToMorseDict.Add(Chr(198), " *-*- ")
    38. CharToMorseDict.Add(Chr(216), " ---* ")
    39. CharToMorseDict.Add(Chr(229), " *--*- ")
    40. End Sub
    41. Public Sub pMorseToCharDict()
    42. MorseToCharDict = New Dictionary(Of String, Char)
    43. MorseToCharDict.Add(" *- ", Chr(65))
    44. MorseToCharDict.Add(" -*** ", Chr(66))
    45. MorseToCharDict.Add(" -*-* ", Chr(67))
    46. MorseToCharDict.Add(" -** ", Chr(68))
    47. MorseToCharDict.Add(" * ", Chr(69))
    48. MorseToCharDict.Add(" **-* ", Chr(70))
    49. MorseToCharDict.Add(" --* ", Chr(71))
    50. MorseToCharDict.Add(" **** ", Chr(72))
    51. MorseToCharDict.Add(" ** ", Chr(73))
    52. MorseToCharDict.Add(" *--- ", Chr(74))
    53. MorseToCharDict.Add(" -*- ", Chr(75))
    54. MorseToCharDict.Add(" *-** ", Chr(76))
    55. MorseToCharDict.Add(" -- ", Chr(77))
    56. MorseToCharDict.Add(" -* ", Chr(78))
    57. MorseToCharDict.Add(" --- ", Chr(79))
    58. MorseToCharDict.Add(" *--* ", Chr(80))
    59. MorseToCharDict.Add(" --*- ", Chr(81))
    60. MorseToCharDict.Add(" *-* ", Chr(82))
    61. MorseToCharDict.Add(" *** ", Chr(83))
    62. MorseToCharDict.Add(" - ", Chr(84))
    63. MorseToCharDict.Add(" **- ", Chr(85))
    64. MorseToCharDict.Add(" ***- ", Chr(86))
    65. MorseToCharDict.Add(" *-- ", Chr(87))
    66. MorseToCharDict.Add(" -**- ", Chr(88))
    67. MorseToCharDict.Add(" -*-- ", Chr(89))
    68. MorseToCharDict.Add(" --** ", Chr(90))
    69. MorseToCharDict.Add(" *-*- ", Chr(198))
    70. MorseToCharDict.Add(" ---* ", Chr(216))
    71. MorseToCharDict.Add(" *--*- ", Chr(229))
    72. End Sub
    73. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    74. rtb.Text = rtb.Text.ToUpper
    75. For Each bogstave As Char In CharToMorseDict.Keys
    76. Dim morse As String = CharToMorseDict.Item(bogstave)
    77. rtb.Text = rtb.Text.Replace((bogstave), morse)
    78. Next
    79. sound.Visible = True
    80. End Sub
    81. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    82. For Each tegn As String In MorseToCharDict.Keys
    83. Dim buchstabe As Char = MorseToCharDict.Item(tegn)
    84. rtb.Text = rtb.Text.Replace(tegn, buchstabe)
    85. Next
    86. sound.Visible = False
    87. End Sub
    88. Private Sub sound_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles sound.Click
    89. 'Hier fehlt ein befehl
    90. End Sub
    91. End Class
    @Shimoyo:: In VB werden Char's so dargestellt:

    VB.NET-Quellcode

    1. Dim a As Char = "a"c
    2. Dim b As Char = "b"c
    3. Dim c As Char = "c"c
    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!
    @faxe1008: Um's hin-und-her zu übersetzen?

    Was du aber machen könntest: Schreibe eine Methode, die ein Paar zugehöriger Buchstaben beiden Dictionaries hinzufügt. Es wäre außerdem geschickter, den Text durchzugehen und dort die Buchstaben aus dem Dictionary herauszufischen und nicht andersherum, finde ich. Dadurch verhinderst du ungültige Zeichen und du musst nicht auf Keys zurückgreifen. Effizienter wird's außerdem auch nochmal. Das könnte man dann anhand eines System.Text.StringBuilders machen.
    Für die Beeps gehst du einfach alle Morsezeichen durch und frägst ab, ob es sich um ein * oder ein - handelt und beepst das entsprechende. Laut MSDN wird die Methode übrigens nicht von 64-Bit-Systemen unterstützt.

    Gruß
    ~blaze~
    Ich bin blutige anfängerin und bin froh (und stolz) das ich überhaupt mit dictionaies arbeiten konnte.

    ich bin aber immer für verbesserungen zu haben. wie kann ich den das dictionary "rückwerts" verwenden?

    VB.NET-Quellcode

    1. for each element in dic.Items
    2. dim buchstaben as Char = morseToCharDict.key(element)
    3. rtb.Text = rtb.Text.Replace(element, buchstabe)


    ?(
    Vielleicht hilft dir das auch:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. MessageBox.Show(Translator.CharCode("..-.")) 'Gibt "F" wieder
    5. MessageBox.Show(Translator.MorseCode("F"c)) 'Gibt "..-." wieder
    6. End Sub
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. MessageBox.Show(String.Join(" ", TextBox1.Text.Select(Function(item) Translator.MorseCode(item)))) 'Gibt den Morsecode für das eingebene Wort in der Textbox wieder (Format: X Y Z)
    9. End Sub
    10. End Class
    11. Public Class Translator
    12. Shared Sub New()
    13. Dim CharCodes = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    14. Dim MorseCodes = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."}
    15. For items = 0 To CharCodes.Length - 1
    16. AddCharToMorse(CharCodes(items), MorseCodes(items))
    17. Next
    18. End Sub
    19. Public Shared ReadOnly Property MorseCode(ByVal input As Char) As String
    20. Get
    21. If Not codeToChar.ContainsKey(input) Then Return Nothing
    22. Return codeToChar(input)
    23. End Get
    24. End Property
    25. Public Shared ReadOnly Property CharCode(ByVal morseCode As String) As Char
    26. Get
    27. If Not codeToChar.ContainsValue(morseCode) Then Return Nothing
    28. Return codeToChar.Where(Function(item) item.Value = morseCode).FirstOrDefault.Key
    29. End Get
    30. End Property
    31. Public Shared Sub PlayAudio(ByVal morse As String)
    32. For Each item In morse
    33. Select Case item
    34. Case "."c
    35. 'Spiele kurzen Ton ab
    36. Case "-"c
    37. 'Spiele langen Ton ab
    38. End Select
    39. Next
    40. End Sub
    41. Protected Shared Sub AddCharToMorse(ByVal input As Char, ByVal morse As String)
    42. If codeToChar.ContainsKey(input) Then Return
    43. codeToChar.Add(input, morse)
    44. End Sub
    45. Protected Shared codeToChar As New Dictionary(Of Char, String)
    46. End Class
    ich hab doch auch sowas...

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Public Class frmMorser
    3. Private Sub AnyMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles TestToolStripMenuItem.Click
    4. Dim beeping = New Action(Of String)(AddressOf BeepCode)
    5. beeping.BeginInvoke(RichTextBox1.Text, AddressOf beeping.EndInvoke, Nothing)
    6. End Sub
    7. Private Sub BeepCode(code As String)
    8. Const timeUnit = 100
    9. For Each c In code
    10. Select Case c
    11. Case "."c
    12. Console.Beep(1000, timeUnit)
    13. Case "-"c
    14. Console.Beep(1000, 3 * timeUnit)
    15. Case "#"c
    16. Thread.Sleep(3 * timeUnit)
    17. End Select
    18. Thread.Sleep(timeUnit)
    19. Next
    20. End Sub
    21. End Class
    Dateien
    • Morser.zip

      (13,34 kB, 111 mal heruntergeladen, zuletzt: )

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

    Ich habe es geschaft!! :D

    (Auch wenn ich den sound selber nicht hören kann weil ich Linux als Betriebssystem habe. ^^ )

    Ach wenn Jemand der sich auskennt die Augen verdrehen würde, habe ich nur Teile verwendet die ich vollständig verstanden habe.

    Vielen dank für eure hilfe!
    Tipp: Das Morsealphabet passt super in einen Binärbaum, siehe dieses Bild: upload.wikimedia.org/wikipedia…c/ca/Morse_code_tree3.png (das ist die englische Version, das deutsche Alphabet hat auch noch ein paar Sonderzeichen, die in den Baum passen)

    Damit findest du den richtigen Buchstaben beim Lesen von Morsecode viel schneller als beim Durchlaufen einer Liste/eines Dictionaries.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Idealerweise hast du eine Klasse, die dir einen Binärbaum abbildet. Den fütterst du mit den Daten und er sagt dir dann das Ergebnis. Aber das wird zu aufwändig. Du kannst die Verzweigungen einfach mit IF-Verzweigungen nachbilden. Selbst dann ist das im Mittel kürzer als eine Liste.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vb-checker“ ()