Problem mit Einlesen mehrerer Zeichen



  • Moin,

    Ich habe ein Programm, in dem der Benutzer einen Buchstaben
    oder eine Zahl eingeben kann und daraufhin den entsprechenden Morsecode erhält.
    (Beispiel -> Eingabe: 'r' -> Ausgabe: '.-.')

    Nun habe ich folgendes Problem: Es kann so, wie es jetzt geschrieben ist, nur einen Buchstaben
    oder Zahl gleichzeitig verarbeiten, möchte jedoch dass mehrere möglich sind.
    (Beispiel -> Eingabe: 're' -> Ausgabe: '.-..')

    Hier ist mein Code:

    #include <iostream>
    #include <stdlib.h>
    #include <string>
    
    using namespace std;
    
    //------------------------------------------------------------------------------
    // Variablendeklarationen
    //------------------------------------------------------------------------------
    
    string eingabe;
    string ausgabe;
    
    
    class Morsen
    {
    
    public:
      string Morsezeichen(string eingabe)
      {
    
        //------------------------------------------------------------------------------
        // Definition der Morsezeichen
        //------------------------------------------------------------------------------
    
        string BuchstabenNormal[26] = {
          "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"
        };
    
        string ZahlenNormal[26] = {
          "0", "1", "2", "3",
          "4", "5", "6", "7",
          "8", "9"
        };
    
        string BuchstabenMorse[26] = {
          ".-",    "-...",   "-.-.",  "-..",
          ".",     "..-.",   "--.",   "....",
          "..",    ".---",   "-.-",   ".-..",
          "--",    "-.",     "---",   ".--.",
          "--.-",  ".-.",    "...",   "-",
          "..-",   "...-",   ".--",   "-..-",
          "-.--",  "--.."
        };
    
        string ZahlenMorse[26] = {
          "-----", ".----", "..---", "...--",
          "....-", ".....", "-....", "--...",
          "---..", "----."
        };
    
        //------------------------------------------------------------------------------
        // Schleife für Morseauswertung
        //------------------------------------------------------------------------------
    
        for (int i = 0; i < 26; i++)
        {
          if (eingabe == BuchstabenNormal[i])
          {
            ausgabe = BuchstabenMorse[i];
          }
          else if (eingabe == ZahlenNormal[i])
          {
            ausgabe = ZahlenMorse[i];
          }
        }
    
        return ausgabe; // Rückgabewert des Morsecodes
      }
    };
    
    
    
    int main()
    {
      cout << "Eingabe: (Bitte nur Kleinbuchstaben verwenden)" << endl;
      cin >> eingabe; // Benutzereinagbe
    
      Morsen *code = new Morsen;
      cout << "Der Code lautet: " << code->Morsezeichen(eingabe) << endl;
    
      //------------------------------------------------------------------------------
      // Wiederholung auf Benutzereingabe
      //------------------------------------------------------------------------------
    
      char repeat;
      repeat = getchar();
    
      cout << "Erneut? (j/n)" << endl;
      cin >> repeat;
    
      if (repeat == 'j')
      {
        main();
      }
      else
      {
        delete code;
        cout << "Programm wurde beendet." << endl;
      }
    }
    

    Ich habe bereits diverse Lösungsansätze versucht, als Beispiel mein letzter:

    for (int i = 0; i < 26; i++)
        {
          for (int j = 0; j < eingabe.length(); j++)
          {
            const char *BuchstabenNormalChar = BuchstabenNormal[i].c_str();
            const char *ZahlenNormalChar = ZahlenNormal[i].c_str();
    
            if (eingabe[j] == BuchstabenNormalChar[i])
            {
              ausgabe = BuchstabenMorse[i];
            }
            else if (eingabe[j] == ZahlenNormalChar[i])
            {
              ausgabe = ZahlenMorse[i];
            }
          }
        }
    
        return ausgabe; // Rückgabewert des Morsecodes
      }
    

    Kurzgesagt möchte ich gerne wissen, wie ich es schaffe, dass mehrere Zeichen eingelesen werden können. Würde mich über den ein oder anderen Tipp freuen ..



  • Ungetest:

    int main()
    {
      cout << "Eingabe: (Bitte nur Kleinbuchstaben verwenden)" << endl;
      std::string eingabe;
      cin >> eingabe; // Benutzereinagbe
    
      Morsen code;
      cout << "Der Code lautet: ";
      for( auto c: eingabe ) cout << code.Morsezeichen(c);
      cout << endl;
    

    Anmerkungen:
    Du darfst main nicht aufrufen. Verwende eine Schleife:

    do 
    {
    } while( repeat == 'j');
    

    Du brauchst kein new/delete. Verwende einfach Morsen code;.

    Verwende keine globalen Variablen. Du kannst eigabe direkt vor dem Einlesen definieren. ausgabe gehört dann auch in die Funktion.



  • Sieht ziemlich falsch aus.

    Erstelle eine einzige Tabelle, welches aus einem Paar von Zeichen und Morsecode besteht.

    Suche schlussendlich nach dem Zeichen in der Tabelle und addiere den zugehörigen Morsecode deinem ausgabe-string hinzu.

    #include <vector>
    #include <string>
    #include <algorithm>
    
    std::vector<std::pair<std::string, std::string>> morse_table = {
        {"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", "--.."},
        {"0", "-----"},
        {"1", ".----"},
        {"2", "..---"},
        {"3", "...--"},
        {"4", "....-"},
        {"5", "....."},
        {"6", "-...."},
        {"7", "--..."},
        {"8", "---.."},
        {"9", "----."}
    };
    
    
    std::string morse_encode(std::string s){
        decltype(morse_table)::iterator morse_it;
    
        for(auto it = s.begin(); it != s.end(); ++it){
            if(std::isalnum(*it)){
                *it = std::toupper(*it);
    
                morse_it = std::find_if(morse_table.begin(), morse_table.end(), [it](const auto& p){
                    return p.first == std::string{*it};
                });
    
                if(morse_it != morse_table.end()){
                    it = s.erase(it);
                    it = s.insert(it, morse_it->second.begin(), morse_it->second.end());
                    it += morse_it->second.size() - 1;
                }
            }
        }
    
        return s;
    }
    
    
    #include <iostream>
    
    int main(){
        std::cout << morse_encode("abcdef");
    }```


  • @manni66 Erstmal danke für die Anmerkungen, die hab ich auch erstmal so übernommen.
    Allerdings funktioniert das so noch nicht ganz, da er ja beim 'c' anmerkt, dass keine Konvertierung möglich ist ..



  • @spiri Danke für dein Beispiel, das funktioniert ja soweit auch bestens (:
    Ich würde dann einmal versuchen mich daran zu orientieren um dann was eigenes zu haben, sonst
    bringt mir das ja nichts 😉



  • @redsocat sagte in Problem mit Einlesen mehrerer Zeichen:

    @manni66 Erstmal danke für die Anmerkungen, die hab ich auch erstmal so übernommen.
    Allerdings funktioniert das so noch nicht ganz, da er ja beim 'c' anmerkt, dass keine Konvertierung möglich ist ..

    code.Morsezeichen({c});



  • @manni66 Danke, so gehts! 🙂