Frage zu einfachem Verschlüsselungslgorithmus



  • #include <iostream>
    #include <string>
    #include <cctype>
    
    void verschluessele(std::ostream&, const std::string&);
    
    int main() {
    	std::string nachricht;
    	std::cin >> nachricht;
    	verschluessele(std::cout, nachricht);
    	return 0;
    }
    
    void verschluessele(std::ostream& out, const std::string& str) {
    	for(std::string::const_iterator iter = str.begin(); iter != str.end(); ++iter) {
    		const char c = *iter;
    
    		if (isupper(c)) {
    			out << static_cast<int>(c - 'A' + 1) << ", ";
    		}
    		else if (islower(c)) {
    			out << static_cast<int>(c - 'D') << ", ";
    		}
    		else {
                out << "?, ";
    		}
    	}
    	out << "\n";
    }
    

    Habs aber an meinen Programmierstyle angepasst 😛

    Viele Grüße,
    Patrick

    Edit: Ja, Ja... Mir ist eben noch was eingefallen 😃



  • Ich habe mir mal deinen Code angeschaut und da sind mir folgende Frage in den Sinn gekommen:

    Hat es irgendwelche Vorteile/Nachteile, wenn man/ wenn man nicht den "namespace std" benutzt, sondern immer ein std:: vor die einzelnen Funktionen schreibt?

    Was ist der Unterschied zwischen "cout" und "out"?



  • jawo3 schrieb:

    Hat es irgendwelche Vorteile/Nachteile, wenn man/ wenn man nicht den "namespace std" benutzt, sondern immer ein std:: vor die einzelnen Funktionen schreibt?

    Wie gesagt: Ich habe den Code meinem eigenen Programmierstyle angepasst. Und meiner Meinung nach gibt es namespaces nicht umsonst. Ich habe mir also angwöhnt immer std:: zu schreiben 🙂

    jawo3 schrieb:

    Was ist der Unterschied zwischen "cout" und "out"?

    Du hast immer geschrieben:

    verschluessele([b]std::cout[/b], nachricht);
    

    Und ich bin davon ausgegangen, dass du in der Funktion out mit cout verwechselt hast und habe das deswegen angepasst, so das der Parameter auch genutzt wird wie es vermutlich gewollt war 🙂

    Viele Grüße,
    Patrick



  • Bzgl. der Verwendung des 'namespace std' hat jeder Programmierer seine eigene Schreibweise. In Header-Dateien solltest du aber NIEMALS "using namespace std;" schreiben (da du damit die Namensbereiche aushebelst und wieder alle Namen global gemacht werden).
    In Source-Dateien kannst du auch alternativ einzelne Namen am Anfang benennen, um sie dann ohne 'std::' schreiben zu können:

    using std::string;
    using std::cout;
    // ...
    

    Eine weitere Alternative besteht dadrin, "using namespace std;" nur innerhalb von Funktionen zu verwenden:

    void printMyName()
    {
      using namespace std;
    
      string s("Hallo");
      cout << s << "Th!";
    }
    

    Und du hast bei dir zwar 'out' als Parameter übergeben, aber nicht verwendet (hatte ich vorhin gar nicht bemerkt), sondern immer auf die Konsole ausgegeben.
    Du könntest z.B. alternativ die Daten mithilfe eine ofstream-Objekts z.B. auch in eine Datei schreiben:

    ofstream of("Test.txt");
    verschluessele(of, nachricht);
    


  • Okay, vielen Dank.



  • und ganz generell: bei switch-case auch immer

    break;
    

    nach jedem block einfügen. sonst könnte die verschlüsselung sicherlich spassiger werden, als angedacht



  • Wird Switch nicht automatisch beendet wenn ein case eingetreten ist?



  • Nein.



  • Kommt drauf an, was du mit "beendet" meinst - der switch sucht die erste case-Marke, die zum Wert passt, und läuft von dort bis zum Blockende:

    int i=1;
    switch(i)
    {
    case 0: cout<<0;
    case 1: cout<<1;
    case 2: cout<<2;
    default:cout<<"unbekannt";
    }
    

    Die Ausgabe davon ist "12unbekannt"



  • Achso okay.

    Jetzt habe ich aber ein neues Problem:

    Ich würde gerne versuchen, ein Programm zuschreibn, was meine Verschlüsselung rückgängig macht.

    Es wird also eine Eingabe dieser Form erwartet z.B. 23, 12, 1, 1, 3, 5

    und daraus soll das entsprechende Wort ausgegeben werden.

    Mit meinem derzeitigen Programm ist das nicht möglich, da:

    1. ich nicht weiß wie man zwei Werte gleichzeitig überprüfen kann (also z.B 22 würde normalerweise als 2 und 2 behandelt werden)

    2. ich nicht weiß wie man den automatischen Abbruch umgeht, wenn ein eingegebenes Leerzeichen erreicht wird.

    Vielleicht könntet ihr mir einige Tipps oder Informationen zu nötigen Funktionen geben, mit denen ich ein solches Programm erstellen kann...

    Vielen Dank
    jawo3


Anmelden zum Antworten