caeser verschlüsslung in c++

Status
Für weitere Antworten geschlossen.

mertcan99

Cadet 4th Year
Registriert
Aug. 2017
Beiträge
98
Schreiben Sie eine C++ Funktion …
string caesar(string original_text, unsigned int v)
… welche eine einzeilige Zeichenkette text als String einliest und diese
Zeichenkette dann „durch Rechts-Verschiebung um v Positionen“
verschlüsselt wieder ausgibt.
Ihre Funktion soll eingefügt werden in eine .cpp Datei mit
Hauptprogramm, welche in Ilias zum Download vorgegeben ist. Dieses
Hauptprogramm führt auch einige Tests mit ihrer Funktion aus, so dass
Sie Hinweise bekommen, ob ihre Funktion korrekt zu funktionieren scheint
oder nicht.
Die Verschlüsselung durch Verschieben („Caesar-Verschlüsselung“ oder auch
„Caesar-Chiffre“) funktioniert dabei wie folgt:
Die Verschiebepositionen-Anzahl v legt fest, dass jeder Kleinbuchstabe
und jeder Großbuchstabe aus dem Originaltext ersetzt wird durch seinen
v-ten Nachfolger im Alphabet. Die Verschiebung wird dabei zyklisch
fortgesetzt, d.h. es erfolgt ein sogenannter Wrap-Around bei den
Kleinbuchstaben sowie bei den Großbuchstaben (man fängt vorne wieder an,
wenn man am Ende angekommen ist).
Lassen Sie sich durch den Begriff „verschieben“ nicht irritieren: Bei der
Caesar-Verschlüsselung bleibt jeder Buchstaben an seinem Platz. Aber der
Buchstabe wird ersetzt durch einen anderen Buchstaben, der sich durch
die Verschiebung des Alphabets um die angegebene Anzahl an Positionen
ergibt.
Beispiel: Bei einer Verschiebepositionen-Anzahl v von 2 würde der Text
apz als crb verschlüsselt, weil sich das c aus dem a durch Verschieben um
2 ergibt, das r aus dem p durch Verschieben um 2 und das b aus dem z
ergibt durch Verschieben um 2 (beim "Verschlüsseln" des Buchstabens z inklusive
Wrap-Around beim ersten Verschiebe-Schritt, d.h. aus dem z wird beim ersten
Verschiebe-Schritt ein a und aus diesem beim zweiten Verschiebe-Schritt ein b).
Alle Zeichen anders als Klein- und Großbuchstaben (z.B. Satzzeichen,
Leerzeichen) sollen unverändert in den verschlüsselten Text übernommen
werden.
Ihr Programm soll erst die Zeichenkette und dann die Anzahl der
Verschiebepositionen v als (positive) ganze Zahl einlesen. Die 0 (Null, d.h.
keine Verschiebung) ist als Eingabe erlaubt. Es sind auch Verschiebungen um
mehr als 26 Positionen erlaubt, d.h. größer als der Umfang des Alphabets,
siehe Testläufe. Der zu verschlüsselnde Originaltext darf auch leer sein.
Ihr Programm kann davon ausgehen, dass der Benutzer nur korrekte
Eingaben macht.

Die einzigen Änderungen in der Vorlage Datei sind die Zeilen 12 - 53.

// GIP-INF Praktikum, WiSe 2023/2024
//
// Datei: INF_04_01_caesar_vorgegebenes_main.cpp
//
#include <iostream>
#include <string>
using namespace std;
// Hier die von Ihnen programmierte Funktion einfügen ...
int Eingabe () {
string original_text = " ";
cout << "Bitte geben Sie den zu verschluesselnden Text ein: " << endl;
getline (cin, original_text);
int v = 0;
cout << "Bitte geben Sie die Anzahl der Verschiebepositionen ein";
cin >> v;
system("pause");
return(0);
}

string caesar(string original_text, unsigned int v)
{
// ... (von Ihnen zu programmieren) ...
string result = "";
for (char original_text_als_char : original_text) {
// Überprüfung, ob original_text_als_char ein Kleinbuchstabe ist
if (original_text_als_char >= 'a' && original_text_als_char <= 'z') {
char basis = 'a'; // Basis für Kleinbuchstaben
char verschiebung = (original_text_als_char - basis + v) % 26 + basis; // Caesar-Verschlüsselung
result += verschiebung;
}
// Überprüfung, ob original_text_als_char ein Großbuchstabe ist
else if (original_text_als_char >= 'A' && original_text_als_char <= 'Z') {
char basis = 'A'; // Basis für Großbuchstaben
char verschiebung = (original_text_als_char - basis + v) % 26 + basis; // Caesar-Verschlüsselung
result += verschiebung;
} else {
result += original_text_als_char; // Zeichen, die keine Buchstaben sind, bleiben unverändert
}
}
cout << "Verschluesselt:" << result << endl;
system("pause");
return (0);
}
bool assert_equal(string original_text, unsigned int v, string erwarteter_verschluesselter_text)
{
string berechneter_verschluesselter_text = caesar(original_text, v);
if (berechneter_verschluesselter_text != erwarteter_verschluesselter_text)
{
cout << "Verschluesselungs-Test fehlgeschlagen (test case failed)!\n Erwartet: "
<< erwarteter_verschluesselter_text << endl
<< " Berechnet: "
<< berechneter_verschluesselter_text << endl
<< " Originaltext: " << original_text << endl
<< " Anzahl Verschiebepositionen: " << v << endl;
return false;
}
else
{
cout << "Verschluesselungs-Test erfolgreich (test case passed)! "
<< original_text
<< " ==(" << v << ")==> "
<< berechneter_verschluesselter_text << endl;
return true;
}
}
bool do_testcases()
{
bool test_resultat = true;
test_resultat = assert_equal("abc", 2, "cde") && test_resultat;
test_resultat = assert_equal("ABC", 2, "CDE") && test_resultat;
test_resultat = assert_equal("abc.,!?", 4, "efg.,!?") && test_resultat;
test_resultat = assert_equal("apz", 2, "crb") && test_resultat;
test_resultat = assert_equal("xYz. ABC", 5, "cDe. FGH") && test_resultat;
test_resultat = assert_equal("., !?", 4, "., !?") && test_resultat;
test_resultat = assert_equal("abcXYZ!", 0, "abcXYZ!") && test_resultat;
test_resultat = assert_equal("", 7, "") && test_resultat;
test_resultat = assert_equal("aBxYz!", 26, "aBxYz!") && test_resultat;
test_resultat = assert_equal("aB!", 28, "cD!") && test_resultat;
test_resultat = assert_equal("aBxYz!", 52, "aBxYz!") && test_resultat;
test_resultat = assert_equal("aBxYz!", 78, "aBxYz!") && test_resultat;
test_resultat = assert_equal("aBxYz!", 99, "vWsTu!") && test_resultat;
test_resultat = assert_equal("abc def xyz!ABC XYZ?", 3, "def ghi abc!DEF ABC?") && test_resultat;
test_resultat = assert_equal("Abc Zyx!", 55, "Def Cba!") && test_resultat;
return test_resultat;
}
int main()
{
if (do_testcases())
{
string text = "";
unsigned int v = 0;
cout << "Bitte geben Sie den zu verschluesselnden Text ein: ? ";
getline(cin, text);
cout << "Bitte geben Sie die Anzahl Verschiebepositionen "
<< "ein (als positive ganze Zahl): ? ";
cin >> v;
cout << "Verschluesselt: " << caesar(text, v) << endl;
}
system("PAUSE");
return 0;
}


Da funktioniert garnichts und ich verstehe auch nicht warum. Die Testabteilung habe ich nicht angefasst und weiß auch garnicht was da passiert. Die main ähnelt meiner Eingabe Funktion.
 
Wenigstens leugnest du nicht, dass wir deine Hausaufgaben lösen sollen.
 
  • Gefällt mir
Reaktionen: BAGZZlash, BeBur, NJay und eine weitere Person
mertcan99 schrieb:
Da funktioniert garnichts und ich verstehe auch nicht warum
garnichts kann ich mir nicht vorstellen....das erste cout wird bestimmt ausgegeben!

ansonsten würde ich vorschlagen du schaust dir mal an wie du einen debugger nutzen kannst, dann ist das Problem sicher schnell gefunden.
 
  • Gefällt mir
Reaktionen: tollertyp
der Fehler befindet sich in der letzten Zeile deiner caesar Funktion
 
Google und Wikipedia.
Du solltest diese einfache Aufgabe schon selbst hinbekommen als angehender Sofrwareentwickler
 
hab seit gut 12 Jahren kein C++ mehr programmiert ... hat aber nur 2 Minuten gedauert das Problem zu finden :-)
 
Schließe dich doch mit Kommilitonen oder Tutoren zusammen. Als Einzelkämpfer wirst du, egal wie niedrig das Niveau im Studium mittlerweile ist, große Schwierigkeiten bekommen.
 
Als Softwareentwickler sieht man manchmal den Wald vor lauter Bäumen nicht ... alles andere an dem Code funktioniert ... bis auf die von mir genannte Zeile in der sich das Fehlerteufelchen versteckt...
 
Der Punkt ist halt: "Nichts funktioniert" ist falsch.
Wenn man die main() ausführt:
1699290217997.png


Aber nur die eine Zeile zu ändern wird den Murks nicht besser machen...
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben