Posted on 2 Comments

Programmieridee: Text in die Morsesprache übersetzen

Programmieridee: Text in die Morsesprache übersetzen

Die Morsesprache beschleunigte im 19. Jahrhundert gemeinsam mit dem Telegrafen die Kommunikation erheblich. Durch die Verlegung langer Leitungen war es mit diesem Gerät möglich, elektrische Impulse über eine Distanz von Hunderten Kilometern zu übertragen. Die Morsesprache erlaubte es, diese elektrischen Impulse in Wörter zu übersetzen. Auf diese Weise war es erstmals möglich, Nachrichten beinahe in Echtzeit zu übermitteln. Diese Technik stellte den ersten Schritt zu den heute verwendeten modernen Kommunikationssystemen dar.

C++ Programmieren für Einsteiger 14.99 € Verfügbar In den Warenkorb

Zwar spielt die Morsesprache in der modernen Technik keine Rolle mehr. Doch befassen sich auch heute noch viele Menschen mit dieser Übertragungsmethode. Nicht nur auf Pfadfinderlagern stellt es eine beliebte Aufgabe dar, Nachrichten mit der Morse-Technik zu übermitteln. Auch im Rahmen technischer Projekte in der Schule oder in anderen Organisationen ist es möglich, entsprechende Apparate für die Kommunikation zu erstellen. Diese ursprüngliche Form der Telekommunikation übt auf viele Menschen eine große Faszination aus.

Dies wollen wir nun als Programmierübung aufnehmen. Dabei erstellen wir ein Programm, das einen Text in die Morsesprache übersetzt. Diesen gibt es dann zunächst auf dem Bildschirm in den entsprechenden Schriftzeichen aus. Darüber hinaus erzeugt es die zugehörigen Töne. Diese Sound-Funktionen werden in den meisten Programmierkursen nicht behandelt. Daher üben Sie bei der Programmerstellung nicht nur, die bisher bekannten Befehle anzuwenden. Außerdem lernen Sie dabei wahrscheinlich auch eine interessante neue Funktion der Programmiersprache kennen.

Wenn Sie ein Lehrbuch gelesen oder einen Programmierkurs belegt haben, sollten Sie die meisten Befehle, die hierbei zum Einsatz kommen bereits kennen. Daher stellt es eine gute Übung dar, dieses Programm möglichst selbstständig zu entwickeln. Daher wird zu Beginn der einzelnen Abschnitte zunächst beschrieben, welche Aufgaben diese Bereiche jeweils erfüllen sollen. So können Sie probieren, das Programm Schritt für Schritt selbst zu entwickeln. Wenn Sie dabei einmal nicht weiterkommen oder wenn Ihre Programmierkenntnisse noch nicht so weit fortgeschritten sind, finden Sie anschließend jedoch auch eine ausführliche Erklärung und selbstverständlich den kompletten Code.

Eine passende Programmiersprache auswählen

Bei jedem Projekt, das Sie umsetzen, ist es zunächst notwendig, eine passende Programmiersprache auszuwählen. Bei diesem Beispiel bestehen jedoch viele verschiedene Möglichkeiten. Die meisten gängigen Programmiersprachen bieten die Funktionen, die wir für dieses Programm benötigen. Wenn Sie gerade dabei sind, eine bestimmte Programmiersprache erlernen, können Sie diese auch für die Umsetzung des Projekts verwenden.

Die grundsätzliche Struktur des Programms ist dabei stets die gleiche. Einige Unterschiede kann es bei der Verarbeitung von Zeichenketten geben. Auch die Art und Weise, wie Sie in der entsprechenden Programmiersprache Töne erzeugen können, ist nicht immer die gleiche. Hierfür ist jedoch nur eine einzige Funktion erforderlich. Mit einer kurzen Internetrecherche sollte es möglich sein, für jede gängige Programmiersprache herauszufinden, wie sich diese Aufgaben lösen lassen. Daher lässt sich dieses Projekt recht einfach in verschiedene Sprachen übertragen. Für unser Beispielprogramm verwenden wir die Sprache C++.

Die Umsetzung des Programms

Nun beginnen wir mit der Umsetzung des Projekts. Dazu ist es zunächst notwendig, sich zu überlegen, welche Struktur das Programm aufweisen soll und welche Aufgaben die einzelnen Teile erledigen sollen.

Zu Beginn ist es notwendig, den Ausgangstext zu ermitteln. Um unser Beispiel so einfach wie möglich zu halten, ermöglichen wir die Eingabe über die Konsole. Wenn Sie jedoch bereits mit der Bearbeitung von Dateien vertraut sind, stellt es auch kein Problem dar, den Text aus einer Datei einzulesen. Wenn Sie es wünschen, können Sie dies selbst umsetzen. Es wäre auch möglich, den Anwender zu Beginn zu fragen, ob er den Text über die Konsole eingeben will oder ob das Programm ihn aus einer Datei einlesen soll. Gegebenenfalls wäre es dann auch möglich, nach dem entsprechenden Dateinamen zu fragen.

Im nächsten Schritt müssen Sie den entsprechenden Text Buchstabe für Buchstabe durchgehen und ihn in Morsezeichen umwandeln. Zunächst bietet es sich an, hierfür ebenfalls Schriftzeichen zu verwenden – den Bindestrich für das lange Signal und den Punkt für das kurze Signal. Für die Pause zwischen den einzelnen Buchstaben kommt ein Leerzeichen zum Einsatz. Diese Symbole speichern wir in einer neuen Zeichenkette ab. Der letzte Schritt besteht schließlich darin, die zugehörigen Töne auszugeben. Dazu gehen wir die Zeichenkette Zeichen für Zeichen durch. Für jeden Punkt geben wir einen kurzen und für jeden Bindestrich einen längeren Signalton aus. Bei einem Leerzeichen fügen wir eine kurze Pause ein.

Die Vorbereitung: Texteingabe und Arrays für Schrift- und Morsezeichen

Bevor wir mit dem Erstellen der eigentlichen Programmfunktionen beginnen, ist es notwendig, einige Vorbereitungsmaßnahmen zu treffen. Hierfür müssen wir uns zunächst überlegen, auf welche Weise wir den Text übersetzen möchten. Hierfür wollen wir zwei Arrays verwenden. Das erste enthält alle Schriftzeichen die im Ausgangstexts vorkommen können. Das zweite Array nimmt die zugehörigen Morsezeichen auf. Dabei sollen die Positionen übereinstimmen. Wenn wir in beiden Arrays den gleichen Index vorgeben, gelangen wir daher stets zu einem korrekten Paar aus Schriftzeichen und Morsezeichen.

Im nächsten Schritt müssen wir uns überlegen, welche Schriftzeichen wir umwandeln möchten. Eine einfache Ausführung würde darin bestehen, lediglich gewöhnliche Buchstaben – ohne Umlaute und ohne das Eszett zu übersetzen. Bei Texten in deutscher Sprache würde das jedoch eine erhebliche Einschränkung darstellen. Daher nehmen wir auch diese Zeichen auf. Außerdem wollen wir die Ziffern zwischen 0 und 9 verwenden. Auch hierfür gibt es passende Morsezeichen. All diese Schriftzeichen müssen wir nun einzeln in einem Array abspeichern. Weitere Symbole wie Satz- und Sonderzeichen ignorieren wir hingegen, obwohl es auch hierfür in manchen Fällen geeignete Morsezeichen gäbe.

Da es im Morse-Alphabet keine Unterscheidung zwischen der Groß- und Kleinschreibung gibt, müssen wir sowohl Groß- als auch Kleinbuchstaben in das gleiche Morsezeichen übertragen. Zu diesem Zweck bietet es sich an, zwei Ausführungen für das Array mit den Buchstaben zu erstellen – eine mit Großbuchstaben und eine mit Kleinbuchstaben. Für Symbole, bei denen es keinen Unterschied zwischen Groß- und Kleinschreibung gibt – wie etwa beim Eszett oder bei Ziffern – könnten wir nun ein eigenes Array erstellen. Das wäre jedoch mit einem zusätzlichen Aufwand verbunden. Einfacher ist es, sie in beide Arrays in der gleichen Form einzufügen.

Darüber hinaus ist es notwendig, ein Array mit den Morsezeichen zu definieren. Wie bereits erwähnt, soll dabei der Index des entsprechenden Zeichens mit der Position des zugehörigen Buchstabens in den ersten beiden Arrays übereinstimmen. Dazu benötigen wir selbstverständlich ein Morse-Alphabet. Im Internet lässt sich dieses jedoch problemlos auffinden – beispielsweise unter https://de.wikipedia.org/wiki/Morsezeichen.

Wir beginnen damit, die beiden Arrays mit den einzelnen Zeichen zu erstellen. Besonders einfach ist es, wenn wir diese einfach als Zeichenkette eingeben. Dabei müssen wir darauf achten, dass wir hierbei das char-Array um eine Position größer definieren müssen, als es die Anzahl der Buchstaben eigentlich notwendig machen würde. Das liegt daran, dass hierbei noch ein weiteres Zeichen angebracht wird, das das Ende der Zeichenkette markiert. Wir beginnen die Zeichenkette mit dem Leerzeichen und fügen daraufhin alle Buchstaben in alphabetischer Reihenfolge und abschließend Umlaute, Eszett und Ziffern hinzu. Dabei erstellen wir jeweils eine Version für Groß- und für Kleinbuchstaben:

Hierbei ist es wichtig, darauf zu achten, dass wir Umlaute und das Eszett nicht in ihrer eigentlichen Form einfügen können. Stattdessen müssen wir den entsprechenden ASCII-Code verwenden.

Nun ist ein weiteres Array für die Morsezeichen notwendig. Jedes Morsezeichen besteht jedoch aus mehreren einzelnen Symbolen. Daher benötigen wir ein Array aus Zeichenketten. Dabei müssen wir genau die gleiche Reihenfolge verwenden wie bei den eben erstellten Arrays. Ganz zu Beginn tritt jedoch ein Sonderfall auf. Das Leerzeichen wollen wir nicht übersetzen. Daher tragen wir hierfür auch ein Leerzeichen in unser Array mit den Morsezeichen ein:

Abschließend definieren wir noch jeweils eine String-Variable für die Eingabe und für die Ausgabe. Während wir die Variable für die Ausgabe mit einer leeren Zeichenkette initialisieren, fragen wir für die Eingabe den Text vom Anwender ab. Dabei ist es wichtig, darauf zu achten, dass wir hierfür nicht den gewöhnlichen cin-Befehl verwenden können. Dieser nimmt den Wert nur bis zum ersten Leerzeichen auf. Für längere Texte ist die getline()-Funktion notwendig. Darüber hinaus deklarieren wir die Variable i als Zähler für die nachfolgende Schleife. Daher fügen wir die folgenden Codezeilen zum Programm hinzu:

Den Text in Morsezeichen umwandeln

Die nächste Aufgabe besteht darin, den Text in Morsezeichen umzuwandeln. Zu diesem Zweck gehen wir die Zeichenkette mit der Eingabe Schritt für Schritt durch. In dieser Schleife erstellen wir eine weitere Schleife. Darin ermitteln wir die Position des entsprechenden Zeichens in unseren beiden Arrays mit den Buchstaben und Ziffern. Haben wir diese gefunden, fügen wir das Morsezeichen, das an der entsprechenden Position steht, in unsere Zeichenkette für die Ausgabe ein. Nach jedem Buchstaben fügen wir außerdem ein Leerzeichen ein. Dadurch entsteht eine kurze Pause, die die Grenze zwischen zwei Buchstaben deutlich macht. Da wir das Leerzeichen auf die gleiche Weise behandeln wie einen gewöhnlichen Buchstaben, werden hierbei drei Leerzeichen hintereinander eingefügt. Das führt dazu, dass zwischen den einzelnen Wörtern später eine längere Pause entsteht.

Die Schleife muss die komplette Zeichenkette durchgehen, in der wir die Nutzereingabe aufgenommen haben. Als Zähler verwenden wir die Variable i. Die Zahl der Durchläufe ermitteln wir anhand der length()-Funktion, die wir auf die Variable eingabe anwenden. Daher leiten wir die Schleife folgendermaßen ein:

for(i = 0; i < eingabe.length(); i++)

Nun deklarieren wir die Variable j als Zähler für die innere Schleife und eine boolesche Variable mit der Bezeichnung weiter:

int j = 0;
bool weiter = true;

Im nächsten Schritt erzeugen wir die innere Schleife. Diese soll so lange fortgesetzt werden, bis wir entweder eine Übereinstimmung gefunden haben oder bis wir das komplette Array durchgegangen sind. Wenn wir eine Übereinstimmung finden, setzen wir später die Variable weiter auf false. Den Zähler j erhöhen wir mit jedem Durchgang um 1. Da die Arrays mit den Buchstaben jeweils 41 Einträge aufweisen, leiten wir die Schleife wie folgt ein:

while(weiter && j < 42)

Wenn der Buchstabe der Eingabe-Zeichenkette, den wir gerade überprüfen, weder mit der aktuellen Position im Array grossbuchstaben noch im Array kleinbuchstaben übereinstimmt, springen wir zur nächsten Position, indem wir den Zähler j um 1 erhöhen. Kommt es zu einer Übereinstimmung, bedeutet das, dass wir die Position des Zeichens gefunden haben. Sie entspricht dem Zähler j. Daher können wir die Schleife abbrechen, indem wir die Variable weiter auf false setzen:

Wenn wir eine Übereinstimmung gefunden haben, bedeutet das, dass der Zähler j kleiner als 42 ist. In diesem Fall gibt er die Position des Zeichens an. Daher verwenden wir ihn, um das Morsezeichen, das an der entsprechenden Position steht, zusammen mit einem Leerzeichen zu unserem Ausgabestring hinzuzufügen. Hat der Zähler hingegen den Wert 42 erreicht, ist das Zeichen nicht in unserem Array enthalten. Daher ignorieren wir es und führen keine Aktion durch:

Damit ist die Übersetzung in Morsezeichen abgeschlossen. Zur Überprüfung geben wir nach der Beendigung der Schleife den Eingabe-String auf dem Bildschirm aus. Der komplette Code für diesen Abschnitt sieht dann so aus:

Die Morsezeichen ausgeben

Zum Schluss wollen wir noch die Töne für die entsprechenden Morsezeichen ausgeben. Diese Funktion kennen Sie wahrscheinlich noch nicht, da sie nur in wenigen Lehrbüchern auftaucht. Mit einer kurzen Internetrecherche finden Sie aber sicher schnell eine passende Lösung. Dabei müssen Sie berücksichtigen, dass sich die entsprechenden Funktionen nicht nur bei verschiedenen Programmiersprachen unterscheiden können. Auch hinsichtlich des Betriebssystems kann es Unterschiede geben. Für unser C++-Programm können wir unter Windows beispielsweise die Funktion Beep() verwenden. Unter Linux müssen Sie jedoch darauf achten, dass diese hier mit einem Kleinbuchstaben beginnt: beep(). Darüber hinaus müssen Sie für beide Funktionen unterschiedliche Bibliotheken einbinden.

Das Programm soll an dieser Stelle die Zeichenkette ausgabe, die unseren Morsecode enthält, Zeichen für Zeichen durchgehen. Handelt es sich dabei um einen Punkt, soll ein kurzer Signalton erzeugt werden. Handelt es sich um einen Bindestrich, ist hingegen ein langer Signalton erforderlich. Bei einem Leerzeichen erzeugen wir eine Pause.

Um die Töne auszugeben, erstellen wir eine for-Schleife. Diese verwendet die Variable i als Zähler und die Zahl der Durchläufe richtet sich an der Länge der Zeichenkette für die Ausgabe aus. Da diese jedoch an der letzten Stelle immer ein Leerzeichen enthält, für das keine Pause mehr notwendig ist, können wir die Schleife wie folgt einleiten:

for(i = 0; i < ausgabe.length() - 1; i++)

Nun erzeugen wir eine Abfrage mit if und else if, in der wir für jedes der drei vorhandenen Zeichen einen passenden Ton beziehungsweise eine Pause einfügen. Wie bereits erwähnt, können wir einen Ton mit der Beep()-Funktion erzeugen. Deren Funktionsweise kann sich jedoch je nach Gerät unterscheiden. Viele Desktop-PCs verfügen über einen sogenannten Motherboard-Lautsprecher. Dieser benötigt keine Soundkarte und keine externen Lautsprecher. Er kann allerdings nur Pieptöne erzeugen. Für unseren Zweck ist dies aber ausreichend. Bei den meisten Laptops ist diese Funktion jedoch nicht integriert. In diesem Fall wird der Signalton über die gewöhnlichen Lautsprecher ausgegeben. Dabei müssen Sie außerdem berücksichtigen, dass Sie hierfür eine passende Bibliothek einbinden müssen. Unter Windows müssen Sie den folgenden Befehl ganz zu Beginn des Quellcodes einfügen:

#include <windows.h>

Diese Bibliothek gehört jedoch nicht zum C++-Standard. Sie ist abhängig vom verwendeten Betriebssystem. Verwenden Sie einen Linux- oder einen macOS-Rechner, müssen Sie daher andere Bibliotheken mit der entsprechenden Funktionsweise verwenden. Dabei kann es jedoch zu einigen Abweichungen hinsichtlich der verwendeten Bezeichnungen kommen.

C++ Programmieren für Einsteiger 14.99 € Verfügbar In den Warenkorb

Bei der Beep()-Funktion aus der Bibliothek windows.h geben wir an erster Stelle die gewünschte Frequenz ein. Hierbei wählen wir den Wert 600. Danach folgt die Dauer in Millisekunden. Der kurze Signalton soll eine Dauer von einer halben Sekunde haben:

Die Ausgabe für den langen Signalton ist beinahe identisch. Wir ändern dabei lediglich die Länge. Für das Leerzeichen erzeugen wir eine Pause. Hierfür verwenden wir die Funktion Sleep(). Dabei geben wir die Länge wieder in Millisekunden vor. Wir wählen für die Pause eine Dauer von einer Sekunde:

Die komplette Schleife für die Ausgabe der Töne sieht dann so aus:

Der komplette Programmcode

Mit diesen drei Schritten haben wir die wesentlichen Elemente des Programms für die Übersetzung eines Texts in die Morsesprache bereits abgeschlossen. Nun ist es nur noch notwendig, diese zusammenzufassen und in die allgemeinen Strukturen, die für jedes C++-Programm erforderlich sind, einzufügen. Zu diesem Zweck fügen wir die entsprechenden include-Befehle, die Angabe des Namensraums und die main()-Funktion hinzu.

Nun können wir das Programm auch einmal ausprobieren. Die Ausgabe auf dem Bildschirm, die wir hier als Screenshot darstellen können, ist dabei aber nur von relativ geringer Bedeutung. Allerdings sehen Sie auch hier, dass die Morsezeichen grafisch ausgegeben werden. Daran können Sie bereits erkennen, dass das Programm den Text richtig übersetzt hat. Wichtiger ist es, dass während der Ausführung ein Geräusch auftreten sollte – mit den Signaltönen, die dem Morse-Code entsprechen.

Zum Abschluss wird noch der komplette Programmcode ausgegeben. Auf diese Weise können Sie nochmals genau überprüfen, ob Sie alle Teile richtig zusammengesetzt haben.

Ähnliche Produkte

2 Kommentare zu “Programmieridee: Text in die Morsesprache übersetzen

  1. Hallo,

    bei mir in Visual Studio Community 2019 (Version 16.6.5) muss die Zeile 3 so lauten: #include

    ansonsten funktioniert “getline” nicht.

    Wenn dort (wie im Beispiel angegeben) #include steht bekommt man folgenden Fehler: E0020 Der Bezeichner “”getline”” ist nicht definiert.

    Grüße
    Peter

    1. Hallo Peter,

      Vielen Dank für Ihren Kommentar!

      Wir werden es überprüfen und ggf. anpassen.

      Mit freundlichen Grüßen,
      Ihr BMU Verlag Team

Schreibe einen Kommentar