Morsecode Programmieren
-
Hallo,
bin gerade dabei ein Programm zu schreiben, das Text in Morsecode umwandelt und dabei einen Ton abspielt (did, daa).Mein Problem ist, dass sobald ich die Funktion für den Ton einfüge das Programm zwar richtig piepst, aber in der Ausgabe alles doppelt schreibt.
#include "stdafx.h" #include <ctype.h> #include <windows.h> #include <iostream> int main(int argc, char* argv[]) { int auswahlA, i; char eingabe; printf("MORSECODE\n\n"); printf("Welche Umwandlung moechten Sie durchfuehren?\n"); printf("Fuer Text - Morse druecken sie die 1\n"); printf("Fuer Morse - Text druecken Sie die 2\n"); do{ scanf ("%d", &auswahlA); fflush(stdin); if (auswahlA == 1) { char *morsecode[]={".- ",".- ","-... ","-... ","-.-. ","-.-. ","-.. ","-.. ",". ",". ","..-. ","..-. ","--. ","--. ",".... ",".... ",".. ",".. ",".--- ",".--- ","-.- ","-.- ", ".-.. ",".-.. ","-- ","-- ","-. ","-. ","--- ","--- ",".--. ",".--. ","--.- ","--.- ",".-. ",".-. ","... ","... ","- ","- ","..- ","..- ","...- ","...- ",".-- ",".-- ", "-..- ","-..- ","-.-- ","-.-- ","--.. ","--.. "," "}; char alphabet[]={'A','a','B','b','C','c','D','d','E','e','F','f','G','g','H','h','I','i','J','j','K','k','L','l','M','m','N','n','O','o','P','p','Q','q','R','r', 'S','s','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z',' '}; printf("Geben Sie hier ihren Text ein:\n"); fflush(stdin); while(eingabe= getchar()) { for (i=0; i<53; i++) // Zählt die Buchstaben ab { if(alphabet[i] == eingabe) // Wenn ein Element von alphabet mit eingabe übereinstimmt tue das { for ( int j=0; morsecode[i][j]; j++ ) // did-s und daa-s ausgeben... mit j den morsecode[i] ablaufen und nach - oder . überprüfen { if ( morsecode[i][j] == '-' ) // Wenn - mach daa { putchar('-'); daa(); } else // Wenn . mach did { putchar('.'); did(); } } putchar(' '); // ... und nach jedem Buchstaben ein Leerzeichen, p(); // bzw. eine akustische Pause. printf ("%s", morsecode[i]); // Buchstaben als Morsecode ausgeben } } } } else if (auswahlA == 2) { printf ("Morse-Text\n"); } else printf ("1 oder 2!\n"); }while (auswahlA>2); return 0; }
Hilfsfunktionen
#include "stdafx.h" #define BASIS (55) // 35 ... 100; default: 55 #define DAA (4*BASIS) #define DID (1*BASIS) #define PAUSE (4*BASIS) void daa(void) // lang { Beep(1000, DAA); Sleep(BASIS); } void did(void) // kurz { Beep(1000, DID); Sleep(BASIS); } void p(void) // BASIS { Sleep(PAUSE); }
Wie ich Morsecode in Text umwandeln soll weiß ich auch noch net.. aber das soll mal zweitrangig sein, wär cool wenns in einer Richtung wenigstens klappen würde..
Danke schonmal für die Hilfe
-
Was macht denn #include "stdafx.h" im Code?
Vielleicht solltest du als Erstes den Code formatieren. So blick keiner durch.
-
Hey,
was soll denn putchar machen? Doch wohl ein Zeichen ausgeben und printf auch.
Übrigens alles sehr C-lastig.
-
aah verdammt, klar.. hab des
printf ("%s", morsecode[i]);
rausgemacht und jetzt gehts, vielen dank dafür.Hättet ihr vielleicht nen kleinen, ich sag mal, denkanstoß, wie ich des Morsecode-Text hinbekommen kann?
-
Nur beim kurzen Überfliegen sind mir schon einige Fehler aufgefallen. Korrigier die erst mal.
Und dann kümmere dich um eine vernünftige Formatierung, so blick da ja kein Schwein durch.
-
Warum gibst du bei cout das Zeichen über putchar('-'); und nimmst nicht den Inhalt des aktuellen Array-Elements? Bei mir wird nach Eingabe von "a" ein ".-." und nicht ".-" ausgegeben...
Jockelx schrieb:
Übrigens alles sehr C-lastig.
C-lastig? Ich sehe hier nur C.
-
Ich habe vor nicht allzu langer Zeit einen Decoder geschrieben, der anhand der eingegangenen Morsetöne versucht, sinnvollen Text auszugeben (was oftmals sogar klappt
). Die interpretierten Zeichen (also '.' und '-') werden in einem std::string gespeichert und wenn einige Zeit kein Ton zu hören ist (Pause zwischen 2 Buchstaben), wird die Funktion des Decoders aufgerufen.
Wenn du das mit C++ programmieren möchtest (was eigentlich nur das Einbinden von iostream nahelegt), könntest du eine map (und zwar in beide Richtungen) verwenden. Damit wirds recht einfach:class MorseDecoder { public: typedef std::map<string, char> Morsecodes; MorseDecoder(); ~MorseDecoder(); char Decode(const string& input); private: Morsecodes m_mmap; }; MorseDecoder::MorseDecoder() { m_mmap[".-"] = 'a'; // die restlichen Initialisierungen } char MorseDecoder::Decode(const string& input) { Morsecodes::const_iterator p = m_mmap.find(input); if(p!=m_mmap.end()) return p->second; return '*'; }
Gerade habe ich alles von TCHAR nach char umgestellt, ich hoffe, ich habe nichts vergessen.
Anders herum könntest du ebenfalls eine Map nehmen. Da der Morsecode nicht zwischen Groß- und Kleinschreibung unterscheidet, reicht es, nur die Kleinbuchstaben zu speichern und die Eingaben mittelstolower
jeweils umzuwandeln.~Edit: Doch noch was vergessen~
-
[Rewind] schrieb:
Warum gibst du bei cout das Zeichen über putchar('-'); und nimmst nicht den Inhalt des aktuellen Array-Elements? Bei mir wird nach Eingabe von "a" ein ".-." und nicht ".-" ausgegeben...
Jockelx schrieb:
Übrigens alles sehr C-lastig.
C-lastig? Ich sehe hier nur C.
iostream ist C++ - wird zwar nur inkludiert und nicht verwendet, aber er verwendet wohl einen C++ Compiler
-
[Rewind] schrieb:
Bei mir wird nach Eingabe von "a" ein ".-." und nicht ".-" ausgegeben...
stimmt, aber wenn ich das leerzeichen im code wegmach passts..
also ".-" statt ".- "@yahendrik
Danke für den Tip, werd mich da mal bisschen reinlesen, schaut noch ziemlich fremd für mich alles aus
-
review schrieb:
[Rewind] schrieb:
Bei mir wird nach Eingabe von "a" ein ".-." und nicht ".-" ausgegeben...
stimmt, aber wenn ich das leerzeichen im code wegmach passts..
also ".-" statt ".- "@yahendrik
Danke für den Tip, werd mich da mal bisschen reinlesen, schaut noch ziemlich fremd für mich alles ausDu lernst nicht zufällig mit einem Buch, dessen Autor die Initialen J.W. hat?
-
Achso, noch etwas: du solltest die Schleifen so früh wie möglich verlassen, z.B. deine erste for-Schleife (mit
break
odercontinue
. Oft kann man bei verschachtelten Schleifenreturn
sehr sinnvoll einsetzen)
-
[Rewind] schrieb:
Was macht denn #include "stdafx.h" im Code?
Das ist bei den MS Compilern der Pre-Compiled Header.
Falls Pre-Compiled Header eingeschaltet ist muss dieses include Statement immer an erster Stelle in jeder Source Datei stehen. (Pre-Compiled Header kann global und / oder pro Source Datei ein- oder abgeschaltet werden.)