Cäsar verschlüsslung



  • Hallo allerseits,

    ich muss eine Cäsar Verschlüsslung machen. Ich weiß das ich schleifen und strings benutzten muss. Doch ich weiß nicht wie ich das umsetzten soll.



  • Dann wirst du wohl eine schlechte Note für deine Hausaufgabe erhalten.



  • #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	int i, zaehlung = 0, lenght, verschiebung;
    	string eingabe;
    
    	cout << "Bitte geben Sie den zu verschluesselten Text ein: ";
    	getline(cin, eingabe);
    
    	cout << "Bitte geben Sie die Anzahl der Verschiebungspositionen ein (als positive ganze Zahl): ";
    	cin >> verschiebung;
    
    	for (i = 0; i < eingabe.length(); i++)
    	{
    		for (isalpha)
    		int a = int (eingabe.at(i));
    
    		if (a >= 65 && a <= 90)
    		{
    			a += verschiebung;
    			a = char(a);
    
    		}
    
    		else if (a >= 97 && a <= 122)
    		{
    			a += verschiebung;
    			a = char(a);
    		}
    
    		cout << char(a);
    
    	}
    
    	/*int verschlüsselter_intwert_des_chars = int(eingabe[0]);
    	verschlüsselter_intwert_des_chars += verschiebung;
    	cout << char(verschlüsselter_intwert_des_chars);*/
    
    	cout << endl;
    
    	system("PAUSE");
    	return 0;
    
    }
    

    also es geht zum teil, es muss ja nur die Buchstaben enthalten also Buchstaben groß und klein aber in einem Zyklus, doch wie kriege ich den hin? Ich hab etwas von

    for(isalpha...)
    

    gehört aber wie wende ich das an?


  • Mod

    Paradox schrieb:

    also es geht zum teil, es muss ja nur die Buchstaben enthalten also Buchstaben groß und klein aber in einem Zyklus, doch wie kriege ich den hin? Ich hab etwas von

    for(isalpha...)
    

    gehört aber wie wende ich das an?

    Wie wäre es mit if(isalpha(a)) ? Aber prinzipiell hast du das doch bereits erledigt durch deine jetzigen if-Abfragen und brauchst das gar nicht.

    Was aber wahrscheinlich wichtiger ist: Überläufe. So etwas wie 'w' + 7 ist kein Buchstabe mehr. Das sollst du höchstwahrscheinlich zurückfalten, so dass es 'd' ergibt. Dein jetziges a = char(a); leistet das nicht. Tatsächlich tut diese Zeile sogar überhaupt nichts.

    Ich kann mir auch gut vorstellen, dass die Aufgabenstellung noch Vereinfachungen enthält, die dieses Problem vereinfachen, z.B. dass du alles in Großbuchstaben umwandeln darfst. Aber ich kenne die Aufgabenstellung nicht.



  • isalpha kennst du ja, bzw. auch nicht, wenn man sieht, wie du es anwendest.

    (a >= 65 && a <= 90) ist umständlich für isupper(a)

    Und ja, islower gibt es auch.

    Hast du dich schon von den anderen Beiträgen zur Cäsarverschlüsselung in diesem Forum inspirieren lassen?



  • Strings benutzen:

    #include <string>
    // ...
    std::string str;  // leerer string
    std::cin >> str;  // str einlesen
    for (char& c : str) { // über jedes Zeichen im str iterieren.
        c = c % 2 ? 'H' : 'A'
    }
    std::cout << str;  // Ausgabe
    

    Achja, eines ist noch wichtig: Wenn du verschiebst und unterhalb vom 'a' bzw. 'A' landest oder überhalb vom 'z' bzw 'Z' landest, musst du um +26 bzw. -26 (26 Buchstaben im Alphabet) verschieben, damit du ein "wrap around" erziehlst, d.h. Z+1 = A und A-1 = Z. Du musst auch aufpassen wegen overflows, denn wenn du einen signed char hast und z.B. das kleine z (122) um 6 nach rechts verschiebst, wird nicht 128 rauskommen, denn das passt nicht in einen signed char mit 1 Byte.

    Am Ende sieht das c.a. so aus (grober Pseudocode):

    // überprüfen ob ch ein Buchstabe ist, sonst ch einfach übernehmen
    A = 'a' oder 'A', je nachdem ob ch groß/klein ist
    Z = 'z' oder 'Z', je nachdem ob ch groß/klein ist
    ch verschieben um n%26 (modulo 26, damit die Korrektur für alle n richtig funktioniert)
    wenn ch < A ch += 26
    wenn ch > Z ch -= 26
    

Log in to reply