C++ Verschlüsselung?

Destranix  30.10.2022, 16:28

Wie sieht dein Code derzeit aus?

McCallister 
Fragesteller
 30.10.2022, 16:29

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.

McCallister 
Fragesteller
 30.10.2022, 18:25

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.

1
iqKleinerDrache  31.10.2022, 05:12
@NackterGerd

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.

0
McCallister 
Fragesteller
 30.10.2022, 18:27

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

0

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
Woher ich das weiß:Studium / Ausbildung – Studium (M.Sc., Dr.) und mehrjährige Berufserfahrung
McCallister 
Fragesteller
 30.10.2022, 16:30

Ich danke, muss ich noch ein zweites Array also erstellen?

0
McCallister 
Fragesteller
 30.10.2022, 16:40
@FXG36

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?

0
FXG36  30.10.2022, 16:48
@McCallister

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;
0
McCallister 
Fragesteller
 30.10.2022, 17:00
@FXG36

Leider besteht das Problem immer noch

0
FXG36  30.10.2022, 17:02
@McCallister

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"):

https://www.onlinegdb.com/online_c++_compiler

0
McCallister 
Fragesteller
 30.10.2022, 20:01
@FXG36

Das Problem ist weg aber die Aufgabe macht mich immer noch fertig🤧

0
McCallister 
Fragesteller
 30.10.2022, 22:29
@FXG36

Ich danke, aber ich gebe es auf :( Ich kriege es nicht auf die Reihe

0
NackterGerd  31.10.2022, 07:09
@McCallister

Wenn du den Überlauf vereinfachen willst könntest du natürlich auch das Array 2 mal mit A bis Z füllen.

0
Destranix  30.10.2022, 16:30

Oder aber man unterscheidet nach Groß- und Kleinschreibung und verwendet ein Modulo sowie Addition zu den Char-Werten.

0
Destranix  30.10.2022, 16:42
@FXG36
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
 }
0
Destranix  30.10.2022, 16:47
@FXG36

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.

0
FXG36  30.10.2022, 16:51
@Destranix

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.

0
Destranix  30.10.2022, 16:52
@FXG36

Achso, ja als Pseudocode geht das, da macht das keine Probleme (meistens) ;-)

0