C++ Verschlüsselung?
Beim üben für meinen Informatik Test bin ich einer Herausforderung begegnet. Ich habe eine Übung gefunden, wo der Eingabetext mit dem Ceaser Verschlüsselungsverfahren verschlüsselt werden soll. Es soll der gewünschte Text/Buchstaben eingeben werden und die Anzahl an Verschiebungen. Das ganze soll das verschlüsselt ausgegeben werden. Bei mir hakt es mit der Schleife. Wie sollte die aussehen und welche soll ich am besten nehmen? Welche Bedingung muss dort erfüllt sein?
Mein Ansatz zu den Variablen:
Ein String Array für die Benutzereingabe (oder doch char?)
Die Variable für die Verschlüsselungsausgabe (string)
Anzahl der Verschiebungen als int.
und ein Zähler (int)
Wie sieht dein Code derzeit aus?
Soweit habe ich nur die Variablen und die Eingabemöglichkeiten erstellt. (Also kaum was gemacht).
2 Antworten
ich würde char* pointer nehmen, weil man da sich so verhalten kann wie bei byte
die verschiebungen als shortint.
wichtig ist dann noch zu wissen wie die ASCII kodierung ist, damit eben am Ende der Verschiebung wieder von vorne angefangen wird.
65-90 A-Z, 97-122 a-z
also eingabezeichen als char, interpretiert als byte, umgewandelt in shortint (eingabe über ASCII 127 nicht erlaubt)
dazu dann shortint (plus oder minus) versatz addieren
kommt man außerhalb der obigen bereiche dann eben von hinten lesen. also 64 wäre wieder 90, 91 wieder 65.
achja: versatz größer +25 oder kleiner -25 nicht erlaubt.
naja. c ohne pointer .. insb. char pointer ist doch kein c ;-) und shortint ist nicht so wichtig, da kann man auch normale int nehmen. ich wollte damit nur verdeutlichen dass der versatz darein passt. und man einen typ braucht der sowohl positiv als auch negativ sein kann. also int geht auch. aber char bzw. byte als versatztyp würde ein komplizierteres programm erfordern. das eben nicht nehmen.
Bis jetzt haben wir mit diesen Sachen zu tun gehabt:
For, do while, while Schleifen,
string, int, double, unsigned int, char
if, if else, else if, switch case
array
Du benötigst noch die Logik für die Verschlüsselung selbst. Das kann man z.B. mit einem Array machen, wo jeder Buchstabe seinen Index hat.
A (0), B (1) ... Z (25)
Beispiel: Willst du nun den Buchstaben X um 5 Stellen verschieben, muss anhand des Arrays überlaufen und von neu begonnen werden.
23, 24, 25, 0, 1, 2 - also C.
Die Logik für die Verschiebung ist folglich (Pseudo-Code):
if (IndexBuchstabe + AnzahlVerschiebungen > 25)
NeuerIndex = -26 + IndexBuchstabe + AnzahlVerschiebungen
else
NeuerIndex = IndexBuchstabe + AnzahlVerschiebungen
Oder aber man unterscheidet nach Groß- und Kleinschreibung und verwendet ein Modulo sowie Addition zu den Char-Werten.
if (IndexBuchstabe + AnzahlVerschiebungen > 25)
NeuerIndex = -26 + IndexBuchstabe + AnzahlVerschiebungen
else
NeuerIndex = IndexBuchstabe + AnzahlVerschiebungen
Gott, Oh, Gott, bring den Anfängern doch nicht bei, wie man seinen Code unordentlich schreibt.
Besser (insbesondere, da es hier auch noch einen Else-Case gibt):
if (IndexBuchstabe + AnzahlVerschiebungen > 25){
NeuerIndex = -26 + IndexBuchstabe + AnzahlVerschiebungen
}else{
NeuerIndex = IndexBuchstabe + AnzahlVerschiebungen
}
Naja, ohne ist es halt deutlich schlechter wartbar und fehleranfälliger. Beispiel:
if (IndexBuchstabe + AnzahlVerschiebungen > 25)
NeuerIndex = -26 + IndexBuchstabe + AnzahlVerschiebungen
callSomeFunctionHere();//We noticed we need this function for some reason
else
NeuerIndex = IndexBuchstabe + AnzahlVerschiebungen
print("Wenn ich das lese, bin ich im Else-Fall. Wichtig für Debugging!");
Und das geht eben mächtig schief und der arme Programmieranfänger verzweifelt.
Das war nur Pseudocode. Tatsächlich aber nicht-intentional in C++ kompilierbar :D
Aber klar: In C-Sprachen sollte man nach Möglichkeit die Curlys mit reinnehmen.
Ich danke, muss ich noch ein zweites Array also erstellen?
Ich danke. Ein Problem habe ich noch bei dieser Zeile:
char Benutzereingabe[100]
cout << “Geben Sie die Eingabe ein“;
cin.getline(Benutzereingabe, 100);
Fehlermeldung:
no matching function for call to ’getline(std::istream&, char [100])‘
Wissen Sie warum das so ist?
Die Anführungszeichen im cout sind offenbar falsch kodiert.
Nutze stattdessen:
"
Dann geht auch:
char Benutzereingabe[100];
cout << "Geben Sie die Eingabe ein: ";
cin.getline(Benutzereingabe, 100);
cout<<Benutzereingabe;
Merkwürdig.
Kopiere das mal
#include <iostream>
using namespace std;
int main()
{
char Benutzereingabe[100];
cout << "Geben Sie die Eingabe ein: ";
cin.getline(Benutzereingabe, 100);
cout<<Benutzereingabe;
}
hier hinein und klicke auf das Play-Symbol ("Run"):
Das Problem ist weg aber die Aufgabe macht mich immer noch fertig🤧
Ich danke, aber ich gebe es auf :( Ich kriege es nicht auf die Reihe
Wenn du den Überlauf vereinfachen willst könntest du natürlich auch das Array 2 mal mit A bis Z füllen.
Pointer hatten wir leider noch nicht im Unterricht. Den Datentyp shortint auch nicht. Ich möchte ungern diese Sachen verwendet weil sie vielleicht im Test als falsch gelten.