Morsecode



  • Hi
    ich muss ein programm schreiben das eine textzeile von der tastatur einliest und sie im Morsecode am bildschirm ausgibt und das ganze noch umgekehrt.
    also ich habe bis jetzt:

    #include <iostream>
    #include <stdio.h>
    #define TEXTLEN 100
    
    const char* uebersetze(char ch)
    {
      switch(ch)
      {
               case 'A' : printf(".-");
                    break;
                case 'b' :
                case 'B' : printf("-...");
                    break;
                case 'c' :
                case 'C' : printf("-.-.");
                    break;
                case 'd' :
                case 'D' : printf("-..");
                    break;
                case 'e' :
                case 'E' : printf(".");
                    break;
                case 'f' :
                case 'F' : printf("..-.");
                    break;
                case 'g' :
                case 'G' : printf("--.");
                    break;
                case 'h' :
                case 'H' : printf("....");
                    break;
                case 'i' :
                case 'I' : printf("..");
                    break;
                case 'j' :
                case 'J' : printf(".---");
                    break;
                case 'k' :
                case 'K' : printf("-.-");
                    break;
                case 'l' :
                case 'L' : printf(".-..");
                    break;
                case 'm' :
                case 'M' : printf("--");
                    break;
                case 'n' :
                case 'N' : printf("-.");
                    break;
                case 'o' :
                case 'O' : printf("---");
                    break;
                case 'p' :
                case 'P' : printf(".--.");
                    break;
                case 'q' :
                case 'Q' : printf("--.-");
                    break;
                case 'r' :
                case 'R' : printf(".-.");
                    break;
                case 's' :
                case 'S' : printf("...");
                    break;
                case 't' :
                case 'T' : printf("-");
                    break;
                case 'u' :
                case 'U' : printf("..-");
                    break;
                case 'v' :
                case 'V' : printf("...-");
                    break;
                case 'w' :
                case 'W' : printf(".--");
                    break;
                case 'x' :
                case 'X' : printf("-..-");
                    break;
                case 'y' :
                case 'Y' : printf("-.--");
                    break;
                case 'z' :
                case 'Z' : printf("--..");
                    break; 
      default: return "0 ";
      }
    return 0;}
    
    int main()
    {
    
      char text[TEXTLEN+1];
      printf("Text eingeben, maximal %d Zeichen:",TEXTLEN);
      scanf("&s",text);
      printf("Morse-Text:\n");
      for(int i=0;i<strlen(text);++i)
        printf("uebersetzentext[i])");
    
    return 0;
    }
    

    aber ich bekomme so komische fehler. kann mir da einer vielleicht helfen??
    und was muss ich machen damit wenn man einen morsecode eingibt ein text am bildschirm erscheint??
    muss ich dann einfachen zum beispiel
    case '--.-' : printf("Q");
    noch in die const char* uebersetze(char ch) funktion unten drunter einfügen
    oder??

    mfg Jambe66



  • aber ich bekomme so komische fehler. kann mir da einer vielleicht helfen??

    Mal ganz ernsthaft: WIE DENN?! "so komische fehler" - aha, dann wird wohl der Mond schuld sein.

    Bitte erst mitdenken, dann Fragen stellen.



  • Du müsstest deine Funktion mal aufrufen. Momentan gibst du in der Schleife ja nur den Text "uebersetzentext[i])" aus.
    Und warum soll deine Funktion const char* zurück geben?
    Das ist sowieso bei deinem default falsch. Dort wird ein Zeiger auf eine Zeichenkette zurück gegeben, die nach dem Beenden der Funktion ungültig ist.



  • Jambe66 schrieb:

    und was muss ich machen damit wenn man einen morsecode eingibt ein text am bildschirm erscheint??
    muss ich dann einfachen zum beispiel
    case '--.-' : printf("Q");
    noch in die const char* uebersetze(char ch) funktion unten drunter einfügen
    oder??

    Entweder du baust dir deinen Ausgabestring in deiner Funktion zusammen (anstelle der printf()-Aufrufe kannst du die Einzelzeichen per strcat() aneinanderhängen - denk daran, genug Platz einzuplanen) und gibst ihn per return an die Hauptfunktion zurück, ODER du gibts die Ausgabe direkt aus (aber dann kannst du die Funktion auch als void deklarieren).

    PS: Übrigens solltest du darüber nachdenken, std::string's und iostreams zu verwenden.



  • #include <iostream>
    #include <string>
    
    using namespace std;
    
    string uebersetzen (string eingabe);
    
    int main ()
    {
        string morsecode=uebersetzen ("Ich bin ein Text");
    
        cout<<morsecode<<'\n';
    }
    
    string uebersetzen (string eingabe)
    {
        string ausgabe;
    
        for (int i=0; i<eingabe.length (); i++)
        {
            switch (toupper (eingabe [i]))
            {
            case 'A':
                ausgabe+=".-";
                break;
            case 'B':
                ausgabe+="-...";
                break;
            //etc.
            default:
                ausgabe+=eingabe [i]; /*Das Zeichen wird 1:1 in den Morsecode übernommen.
                                        Kann man auch weglassen oder nur für Leerzeichen nehmen.*/
            }
        }
    
        return ausgabe;
    }
    

    Müßte funktionieren.
    (Gibt es eigentlich eine Alternative zu toupper?)



  • NES-Spieler schrieb:

    (Gibt es eigentlich eine Alternative zu toupper?)

    Ja, tolower() 😃

    Also ich würde die Übersetzung über ein String-Array erledigen lassen:

    string uebersetzen(const string& eingabe)
    {
      string out="";
      string vals[] = {".-","-...",...};
    
      for(int i=0;i<eingabe.length();++i)
      {
        if(isalpha(eingabe[i])
          out+=vals[toupper(eingabe[i])-'A'];
        else
          out+=eingabe[i];
      }
      return out;
    }
    

    (wobei man das Array 'vals' auch global definieren könnte - für die Verarbeitung der Gegenrichtung)



  • danke für die antworten 🙂
    @NES-Spieler

    ich muss selber einen text eingben können. wie muss ich das dann machen??
    einfach statt dem "ICH BIN EIN TEXT" ein scanf einbauen oder??

    string morsecode=uebersetzen ("Ich bin ein Text");
    

    und was bedeuted das

    ausgabe+=
    

    und das

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

    eingabe.length???
    kannst du mir noch einen ansatz geben wie man einen morsecode in ein text umwandelt?? wie und wo muss ich das einbauen??

    mfg Jambe66



  • Der uebersetzen()-Funktion ist es egal, ob du eine Konstante oder eine Variable übergibst:

    string text;
    getline(cin,text);//Textzeile einlesen
    string code = uebersetzen(text);//und übersetzen
    

    Btw, "+=" ergibt eine String-Verkettung und mit der for()-Schleife arbeitest du dich zeichenweise durch den Eingabestring durch.

    Für die umgekehrte Richtung mußt du stückweise deine Morsefolge nach den einzelnen Buchstabencodes abscannen und dann übersetzen. Allerdings ist das nicht eindeutig, wenn du keine Trennzeichen festlegst (z.B. kann ".---" sowohl für "m" als auch für "aj" stehen).



  • #include <iostream.h>
    
    int main()
    {
        int i, j;
        char *morse[] = {".- ","-... ","-.-. ","-.. ",". ","..-. ","--. ",".... ",".. ",".--- ","-.- ",".-.. ","-- ","-. ","--- ",".--. ","--.- ",".-. ","... ","- ","..- ","...- ",".-- ","-..- ","-.-- ","--.. ",".- ","-... ","-.-. ","-.. ",". ","..-. ","--. ",".... ",".. ",".--- ","-.- ",".-.. ","-- ","-. ","--- ",".--. ","--.- ",".-. ","... ","- ","..- ","...- ",".-- ","-..- ","-.-- ","--.. "}; //Pool der Morse-Zeichen
        char alpha[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; // Pool des Alphabets
        char eingabe[256];
        cin.getline(eingabe, 256); //Einlesen der gesamten Zeile
        for (j=0; j<257; j++) 
         for (i=0; i<63; i++)
         if (eingabe[j]!='\0') //Überprüft, ob das Ende erreicht wurde
           if (eingabe[j]==alpha[i])
            cout << morse[i];
    
        return 0;
    }
    

    so ich habe es mal so versucht. er wandelt es mir von text in morsecode um. muss ich jetzt zwei einzelne funktionen schreiben. die eine für text zu morse und die andere für morse zu text und dann die prototypen in main?? und bei morse zu text einfach nur diese zeilen vertauschen??

    if (eingabe[j]==alpha[i])
            cout << morse[i];
    

    sprich statt das alpha[i] morse[i] schreiben und umgekehrt??



  • Probiers doch mal aus.



  • hab ich. ich bekomme dann 53 fehler angezeigt



  • Da dein Feld morse ein char*[] ist musst du hier eine andere Vergleichsoperation verwenden. Hier hilft dir strcmp. Besser ist es aber, du verwendest gleich ein Array auf string.

    if (strcmp(eingabe,morse[i]) == 0)
            cout << alpha[i];
    

    Vorausgesetzt, dass eingabe den Morsecode für ein Zeichen enthält.



  • hab zurzeit auch dieses morseprojekt auf. hab da auch schon paar zeilen zusammen aber bei mir hängt es mit dem logischen verständniss bzw. schon beim grundwissen.
    [code="cpp"]
    mein text sieht so aus:
    #include <iostream>
    #include <cstdlib>
    #include <windows.h>
    #include <conio.h>
    #include <string.h>
    using namespace std;
    int main ()
    {
    system ("color f0");

    cout << "a oder b ";
    char k='k';
    cin>>k;
    string text;
    cin >>text;
    getline(cin,text);
    for(k=0;k<text;k++)
    {
    if (k=='a'||k=='A') {cout << ".- ";}
    if (k=='b'||k=='B') {cout << "-... ";}
    if (k=='c'||k=='C') {cout << "-.-. ";}
    if (k=='d'||k=='D') {cout << "-.. ";}
    if (k=='e'||k=='E') cout << ". "<<endl;
    if (k=='f'||k=='F') cout << "..-. "<<endl;
    if (k=='g'||k=='G') cout << "--."<<endl;
    if (k=='h'||k=='H') cout << "...."<<endl;
    if (k=='i'||k=='I') cout << ".."<<endl;
    if (k=='j'||k=='J') cout << ".---"<<endl;
    if (k=='k'||k=='K') cout << "-.-"<<endl;
    if (k=='l'||k=='L') cout << ".-.."<<endl;

    verurteilt mich bitte nicht gleich deswegen ....
    mein genaues problem liegt derzeit bei dem for()
    der fehler heißt "no match for 'operand<' in 'k<text"



  • Wenn du c++ programmieren möchtest, warum die Header aus C? Versuche ohne diese auszukommen. Wenn du sie doch brauchst, überlege gibt es keinen eleganteren C++ Weg.

    wella_black schrieb:

    #include <iostream>
    #include <cstdlib>		// es kann ja sein das du diesen und die folgenden Header brauchst, wenn nicht weg damit
    #include <windows.h>
    #include <conio.h>
    #include <string.h>
    using namespace std;
    
    int main ()
    {
    	system ("color f0");
    
    	cout << "a oder b ";	
    	char k='k';
    	cin>>k;
    	string text;		// hier sagst du text soll ein String sein
    	cin >>text;
    	getline(cin,text);
    	for(k=0;k<text;k++)	// Was soll text hier sein???
    	{
    		if (k=='a'||k=='A') {cout << ".- ";}
    		if (k=='b'||k=='B') {cout << "-... ";}
    

    Für bunten Quelltext hast du den "Schlußcode" vergessen. Oder den ganzen Quelltext markieren und dann auf den C++ Button klicken.



  • mit dem "text" in for ()
    hatte ich gehofft das es k solange übersetzt solange es kleiner ist als das textende.
    ich weiß einfach nicht wie ich in dem for () sage wie lange es übersetzten soll.


  • Mod

    wella_black schrieb:

    mit dem "text" in for ()
    hatte ich gehofft das es k solange übersetzt solange es kleiner ist als das textende.
    ich weiß einfach nicht wie ich in dem for () sage wie lange es übersetzten soll.

    Entweder zählst du Indizes:

    for(size_t k = 0; k < text.size(); ++k)
    {
      verarbeite(text[k]);
    }
    

    Oder du nutzt Iteratoren:

    for (std::string::const_iterator it=text.begin(); it!=text.end(); ++it)
    {
      verarbeite(*it);
    }
    

    Oder am allereinfachsten:

    for(auto k : text)
    {
      verarbeite(k);
    }
    

    Oder eine von 1000 anderen Möglichkeiten. Warum dein jetziger Ansatz Quatsch ist, ist dir klar? Du vergleichst Buchstaben mit Zeichenketten und deine Buchstaben haben nicht einmal etwas mit der Zeichenkette zu tun.



  • ja, das irgendwas daran nicht stimmen kann weiß ich.
    sizeof (text) müsste ja so viel heißen wie größe von text.

    also compilern macht es erstmal. . . aber nicht übersetzen.
    hab auch die bibliotheken rausgenommen die ich nicht mehr brauch. . .
    aber irgendwo muss ja immernoch ein riesen fehler sein...

    #include <iostream>
    #include <cstdlib>
    #include <string>
    using namespace std;
    int main ()
    {
      system ("color f0");
        cout << "geben sie ihren text ein !  ";
        char k='k';
        cin>>k;
        string text;
        cin >>text;
        getline(cin,text);
        for(k=0;k<sizeof(text);k++)
        {
            if (k=='a'||k=='A') cout << ".- ";
    


  • wella_black schrieb:

    cout << "geben sie ihren text ein !  ";
        char k='k';
        cin>>k;         // du willst hier ein Zeichen eingeben?
        string text;
        cin >>text;     // und hier einen Text
        getline(cin,text);  // und hier noch was
        for(k=0;k<sizeof(text);k++)
        {
            if (k=='a'||k=='A') cout << ".- ";
    

    Vielleicht solltest du dich auf eine Eingabe hier erst mal beschränken. Wähle aber die für diese Aufgabe richtige.


  • Mod

    wella_black schrieb:

    ja, das irgendwas daran nicht stimmen kann weiß ich.
    sizeof (text) müsste ja so viel heißen wie größe von text.

    Liest du überhaupt mit? Wer hat denn irgendwas von sizeof gesagt? sizeof hat hier überhaupt gar nichts zu suchen, das hat eine ganz andere Bedeutung.



  • lesen ist anscheinend nicht so meine stärke... ...
    aber so wie es jetzt ist sollte es doch funktionieren

    #include <iostream>
    #include <cstdlib>
    #include <string>
    using namespace std;
    int main ()
    {
      system ("color f0");
        cout << "geben sie ihren text ein !  " <<endl;
        char k='k';  // hier muss ich doch k deklarieren ?! 
        string text;
        getline(cin,text); // hier liest es alles ein 
        //cout << text; // hier kann es auch wieder alles ausgeben 
        for(k=0;k<text.length()-1;k++) // und das ist die bedingung
            if (k=='a'||k=='A') cout << ".-";
    

    compiler sagt auch nix aber übersetzen will es nicht -.-


Log in to reply