Schulprojekt (Textverschlüsselung)
-
Hallo,
wie das Thema schon sagt beschäftige ich mich zurzeit in der Schule mit dem Thema Kryptologie und ein Teil meiner Arbeit ist, das erstellen von kleinen Programmen die eingegebene Texte verschlüsst wiedergeben. (Programm in C++ so einfach wie möglich)Ich hab minimale Kenntnisse im Programmieren... bisher nur mit Siemens S7 und ich möchte jetzt auch nicht unbedingt alle basics in c++ lernen sondern eben grob nur das verstehen was ich für die kleinen Programme brauche.
Ich habe es schon geschafft Grad einzugeben und in Fahrenheitumgewandelt wieder ausgeben zu lassen (um meinen Stand im programmieren zu beschreibenAnfangen wollte ich mit dem Ceasar Chiffre. und zwar sollte das so sein das ich in so einer win32 anwendung einen text eingebe und dieser dann vom programm verschlüssselt wird und wieder ausgegeben wird und zwar soll aus a bc = d ef werden also immer 3 buchstaben weiter im alphabet und aus z wird c => das heißt immer drei buchstaben weiter. Mein größtes problem ist wie ich die einzelnen Buchstaben des Textes der Variablen bearbeiten kann einfach kein plan.
also falls jemand zeit und lust hat mir ein bisschen unter die arme zu greifen würde ich mich freuen. falls ich irgendwelche infos vergessen haben sollte fragt einfach.
vielen dank im voraus
gruß
-
Hier das unter die Arme greifen:
Egal welche Verschlüsselung du nutzen willst, du solltest dich mit std::string vertraut machen (sofern noch nicht geschehen).
std::string ist auch nur ein Container; du kannst also mit dem Index-Operator die Zeichen durchgehen:ein_string[zeichenpos] //Auf das Zeichposte Zeichen in ein_string zugreifen
Wenn du einen C++11-Compiler hast, kannst du auc einfach
for(char c in ein_string) //Jedes Zeichen c in ein_string durchgehen { //machwas mit c }
schreiben.
Zeichen sind auch nur Zahlenwerte, also kannst du einfach 3 addieren. Um den Überlauf z -> c zu managen kannst du einfach solange 26 Abziehen bis das Ergebnis wieder im Bereich von a - z liegt.
Zur Vereinfachung kannst du auch mit tolower und toupper jeweils in Klein-/Großbuchstaben umwandeln
-
#include <iostream> #include <vector> #include <algorithm> #define POSITION_CHIFFRE 3 void CaesarCrypt( char &Letter ) { Letter += POSITION_CHIFFRE; } int main( ) { char Buffer = 0; std::vector< char > Text; // Eingabe while( Buffer != '\n' ) { Buffer = getchar( ); Text.push_back( Buffer ); } // Verarbeitung for_each( Text.begin( ), Text.end( ), CaesarCrypt ); // Ausgabe std::copy( Text.begin( ), Text.end( ), std::ostream_iterator< char >( std::cout, "\n" ) ); }
-
Vll. hilft das dir weiter,
http://www.c-plusplus.net/forum/294984Gruss,
|Z
-
Wenn schon vorkauen, dann bitte korrekt.
Kóyaánasqatsi schrieb:
#include <iostream> #include <vector> #include <algorithm> #define POSITION_CHIFFRE 3 ///so macht man das in C++ nicht void CaesarCrypt( char &Letter ) { Letter += POSITION_CHIFFRE; ///falsch } int main( ) { char Buffer = 0; std::vector< char > Text; ///dafür gibt es std::string // Eingabe ///dafür gibt es std::getline while( Buffer != '\n' ) { Buffer = getchar( ); Text.push_back( Buffer ); } // Verarbeitung for_each( Text.begin( ), Text.end( ), CaesarCrypt ); // Ausgabe std::copy( Text.begin( ), Text.end( ), std::ostream_iterator< char >( std::cout, "\n" ) ); }
-
okay schon mal vielen dank an euch ich werds mir morgen mal anschauen und mich danach sicherlich noch mal zu wort melden.
schönen Abend
-
okay also mit der Hilfestellung komm ich bis her noch nicht klar...
mein Programm sieht bisher so aus:
#include "stdafx.h" #include "iostream" #include "string" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { string Eingabe; string Ausgabe; cout<<" Verschluesselungsprogramm" << endl; cout<<" Caesar Chiffre [1]" << endl; cout<<" Pig Latin [2]" << endl; cout<<" Permutationscode [3]" << endl; int Auswahl; switch(Auswahl) { case 1: cout<< " Texteingabe für Caesar Chiffre: "; cin>> Eingabe; // funktioniert wohl nicht, da bei gleicher ausgabe nur das erste wort noch da ist getchar(); break; default: cout<< endl; cout<< "Ungueltige Eingabe"; getchar(); } return 0;
damit ich quasi über den switch befehl später zwischen den verfahren auswählen kann. (korrigiert mich falls das falsch ist) ich muss jetzt bei case eins die Verarbeitung für das Caesar Chiffre eingeben?
Ich habe festgestellt das die Eingabe so nicht funktionieren kann da die eingabe nur ohne leerzeichen funktioniert... und ich weiß auch noch nicht wie ich den eingebenen text verarbeiten kann habe die for(char) probiert und auch die andere aber irgendwie klappt es nicht...
ich arbeite mit microsoft visual 10 falls es was damit zu tun hat...
danke für weitere Hilfe
-
cin>> Eingabe;
=>std::getline(Eingabe, std::cin);
-
Hallo...
@Yassocool
Schau dir die obigen Beispiele genau an.
1.
Die Includierungen sind nicht ganz richtig.
Beispiele:
#include <iostream>
#include <string>2.
Ich weiss jezt nicht ob das der fertige Code sein soll, aber ein
C++ Programm startet kurz gesagt mit der main Funktion (in deinem Fall wäre _tmain falsch)3.
Es wird keine Eingabe für die int Variable Auswahl gemachtGruss,
|Z
-
@|Z: _tmain() ist Microsoft-Spezifisch. Im Prinzip dient es nur zur Unterscheidung des "normalen" main von der Variante wo statt char** TCHAR** verwendet wird (TCHAR ist je nach Zeichensatzeinstellung ein typedef auf wchar_t (bei Unicode) oder char (bei Multibyte-Zeichensatz)). Ist nicht Standardkonform, aber der MS-Compiler frissts anstandslos.
-
Jonas OSDever schrieb:
@|Z: _tmain() ist Microsoft-Spezifisch. Im Prinzip dient es nur zur Unterscheidung des "normalen" main von der Variante wo statt char** TCHAR** verwendet wird (TCHAR ist je nach Zeichensatzeinstellung ein typedef auf wchar_t (bei Unicode) oder char (bei Multibyte-Zeichensatz)). Ist nicht Standardkonform, aber der MS-Compiler frissts anstandslos.
Ja hab ich nachher noch nachgeschaut.
Danke für ErklärungGruss,
|Z
-
Hallo Leute tut mir leid das ich mich so lange nicht mehr gemeldet habe...
Hatte die letzten tage leider keine zeit mich mit c++ zu beschäftigenhab mich aber jetzt wieder dahinter geklemmt die Eingabe in den String konnte ich nun über "getline" verwirklichen
allerdings weiß ich nicht was cin.ignore() macht aber ohne überspringt er mir den befehl getline einfach
hier mein Programm
int _tmain(int argc, _TCHAR* argv[]) // wenn ich hier nur _main() schreibe bringt er mir beim debugging fehler { string Eingabe; string Ausgabe; cout<<" Verschluesselungsprogramm" << endl; cout<<" Caesar Chiffre [1]" << endl; cout<<" Pig Latin [2]" << endl; cout<<" Permutationscode [3]" << endl; int Auswahl; cin >> Auswahl; switch(Auswahl) { case 1: cout<< " Texteingabe fuer Caesar Chiffre: "; cin.ignore() ; getline ( cin, Eingabe ) ; //soweit funktioniert alles :) nun muss ich jedoch auf die einzelnen Zeichen zugreifen for( char c in ein_string ) // kann ich so leider nicht eingeben warum? akzeptiert er hier nicht... MV 2010 express verwende ich { // hier müsste ich dann das c doch in eine Zahl umwandeln oder kann ich einfach 3 addieren und er spuckt mir dann f aus? // wenn ich das verstanden hab gibt es eine möglichkeit diese Operation auf alle Buchstaben auf einmal auszuführen? } cout<< Eingabe ; // nur für mich zum testen verwendet worden :D getchar(); break; default: cout<< endl; cout<< "Ungueltige Eingabe"; } return 0; }
jetzt kommt die verarbeitung meiner Eingabe dazu muss ich ja auf die Zeichen einzeln zugreifen und dann muss ich diese ja verändert und dazu bräuchte ich nochmal einen genaueren Ansatz warum der for befehl oder die Eingabe[c] nicht funktioniert und wie ich dann die verschiebung umsetzen kann...
ich bin anstrengend ich weiß
aber würde mich immernoch über hilfe freuen
grüße
-
Eine for-Schleife macht man in C++ folgendermaßen:
for(<Initialisierung>; <Bedingung>; <Inkrement>) <Anweisung>;
...
Wenn du nun also den String Zeichen für Zeichen durchlaufen willst,
benutzefor(int i; i < Eingabe.length(); i++) { Eingabe[i] = Eingabe[i]+verschiebung; // so? Hier müsste man noch eine Verzweigung eingeben, für den Fall, dass die resultierende Verschiebung das Ganze über z hinaus verschiebt... }
Hoffe, geholfen zu haben,
whitecosmos :xmas1:
-
Statt .length() einfach .size() benutzen, da kürzer und äquivalent zu den anderen Standardcontainern.
Mit C++11 übrigens:
for(char c : ein_string)
-
Hi leute tut mir leid, dass ich mich nur so sporadisch melde,
ich hab in letzter zeit einfach so viel zu tun und c++ ist wie ich meine sehr zeitaufwendig...Also mein Caesar chiffre funktioniert soweit eigentlich recht gut
d.h. mit kleinbuchstaben keine probleme
allerdings wenn ich mit groß und kleinschreibung arbeiten will steh ich vor einem problem...for(i = 0; i < Eingabe.length(); i++) { if(Eingabe[i] == ' ') { Speicher.push_back( Eingabe[i] = ' ') ; } else { if( Eingabe[i] + Verschiebung > 'z' ) { Speicher.push_back( Eingabe[i] + Verschiebung - 26 ) ; } else if( Eingabe[i] + Verschiebung > 'Z' ) { Speicher.push_back(Eingabe[i] + Verschiebung - 26 ) ; } else { Speicher.push_back(Eingabe[i] + Verschiebung ) ; } } }
ich hab mich soweit informiert dass ich mittlerweile weiß woran es liegt
das problem ist das alphabet von A-Z entspricht den ordinalwerten dez: 65-90 das kleine allerdings 97-122...deshalb kann die if-bedingung für 'Z' nicht nur mit größer gemacht werden da sonst alle kleinbuchstaben auch betroffen wären...
=> ich müsste in der if bedingung einen bereich nennen wie z.b. > Z < a allerdings will er das nicht verwenden und ich könnte dann auch nur um maximal 6 buchstaben verschieben...
hätte jemand dafür ne lösung?
der rest würde sonst soweit funktionierenauserdem hätte würde ich mich freuen wenn mir jemand den unterschied von einem string zu einem const string erklären könnte
dankeschön
-
Yassocool schrieb:
Hi leute tut mir leid, dass ich mich nur so sporadisch melde,
ich hab in letzter zeit einfach so viel zu tun und c++ ist wie ich meine sehr zeitaufwendig...Also mein Caesar chiffre funktioniert soweit eigentlich recht gut
d.h. mit kleinbuchstaben keine probleme
allerdings wenn ich mit groß und kleinschreibung arbeiten will steh ich vor einem problem...for(i = 0; i < Eingabe.length(); i++) { if(Eingabe[i] == ' ') { Speicher.push_back( Eingabe[i] = ' ') ; } else { if( Eingabe[i] + Verschiebung > 'z' ) { Speicher.push_back( Eingabe[i] + Verschiebung - 26 ) ; } else if( Eingabe[i] + Verschiebung > 'Z' ) { Speicher.push_back(Eingabe[i] + Verschiebung - 26 ) ; } else { Speicher.push_back(Eingabe[i] + Verschiebung ) ; } } }
ich hab mich soweit informiert dass ich mittlerweile weiß woran es liegt
das problem ist das alphabet von A-Z entspricht den ordinalwerten dez: 65-90 das kleine allerdings 97-122...deshalb kann die if-bedingung für 'Z' nicht nur mit größer gemacht werden da sonst alle kleinbuchstaben auch betroffen wären...
=> ich müsste in der if bedingung einen bereich nennen wie z.b. > Z < a allerdings will er das nicht verwenden und ich könnte dann auch nur um maximal 6 buchstaben verschieben...
hätte jemand dafür ne lösung?
der rest würde sonst soweit funktionierenauserdem hätte würde ich mich freuen wenn mir jemand den unterschied von einem string zu einem const string erklären könnte
dankeschön
Versuch mal vll. das so zu lösen...
if (static_cast<int>(Eingabe[i]) >= 65 && static_cast<int>(Eingabe[i]) <= 90) { // Anweisung (für Grossbuchstaben) }
if (static_cast<int>(Eingabe[i]) >= 97 && static_cast<int>(Eingabe[i]) <= 122) { // Anweisung (für Kleinbuchstaben) }
Gruss,
anneXus
-
Danke für die schnelle Antwort ich habs jetzt bei großbuchstaben verwendet
allerdings hab ichs so verwendet für mich einfacher zu verstehen
if(Eingabe[i] + Verschiebung >= 91 && Eingabe[i] + Verschiebung <= 96)
hab halt am anfang ne begrenzung von max 6 für Verschiebung eingeben für meine mittel reicht das
so nun kommt aber der zweite teil und zwar "pig latin" was sich wohl schwieriger gestallten wird, aber ich probier jetzt mal selbst anzufangen und falls ich fragen habe würde ich mich melden
wird wahrscheinlich schneller passieren als mir lieb ist
-
anneXus schrieb:
if (static_cast<int>(Eingabe[i]) >= 65 && static_cast<int>(Eingabe[i]) <= 90) { // Anweisung (für Grossbuchstaben) }
if (static_cast<int>(Eingabe[i]) >= 97 && static_cast<int>(Eingabe[i]) <= 122) { // Anweisung (für Kleinbuchstaben) }
wieso denn? -.-
if(Eingabe[i] >= 'a' && Eingabe[i] <= 'z')
(analog für Großbuchstaben)
ist wohl zu leserlich?
-
unskilled schrieb:
anneXus schrieb:
if (static_cast<int>(Eingabe[i]) >= 65 && static_cast<int>(Eingabe[i]) <= 90) { // Anweisung (für Grossbuchstaben) }
if (static_cast<int>(Eingabe[i]) >= 97 && static_cast<int>(Eingabe[i]) <= 122) { // Anweisung (für Kleinbuchstaben) }
wieso denn? -.-
if(Eingabe[i] >= 'a' && Eingabe[i] <= 'z')
(analog für Großbuchstaben)
ist wohl zu leserlich?ich meinte nur das ich nicht weiß was (static_cast<int> ist und als ich es weggelassen habe hats immernoch funktioniert, deshalb wollte ich es nicht verwenden... (ich bin schüler und brauch die programme für ein schulprojekt und die sollten für mich einfach verständlich sein und die muss ich anderen auch erklären können die nichts mit c++ am hut haben, da ist es so verständlicher anzuschauen finde ich.
okay also pig latin soll so aussehen das er bei jedem wort die ersten zwei ziffern ans ende stellt und dann noch ay anhängt. bsp:
Hallo wie gehts = Llohaay ewiay htsgeay
-
wäre es möglich das über ein string array zu verwirklichen? so bekomme ich es zumindest hin an jedes wort hinten ay anzuhängen
cout<<" Pig Latin" << endl << endl ; cout<<"Texteingabe fuer Pig Latin: " << endl ; cin>> array[0] >> array[1] >> array[2] >> array[3] >> array[4] ; Ausgabe = array[0] + "ay " + array[1] + "ay " + array[2] + "ay " + array[3] + "ay " + array[4] + "ay" ; cout<< Ausgabe ;
meine eingabe ist echt umständlich war auch nur mal kurz als test ob es funktionieren würde. es gibt doch bestimmt eine möglichkeit das ganze kürzer einzugeben und auch kürzer zusammenfügen zu lassen in den String Ausgabe.
sehe ich das richtig das ich die array größe vorher definieren muss die passt sich nicht variabel an meine eingabe an.ich wollte jedes wort in einen eigenen string schreiben weil ich nicht weiß wie ich es anders lösen könnte ist sicherlich nicht die beste lösung aber für den anfang mal nicht schlecht denk ich
wenn ich ein wort in einem string habe, mit welchem befehl kann ich die ersten 2 buchstaben ans ende verschieben?
-
Yassocool schrieb:
sehe ich das richtig das ich die array größe vorher definieren muss die passt sich nicht variabel an meine eingabe an.
Ja. Die Grösse eine Arrays muss bei der Übersetzungszeit bekannt sein (auser due legst sie dynamisch an).
Naja, ich denke hier ist ein String-Array nicht nötig.
Du könntest einen einzigen String nehmen, darin Text einlesen und diesen danach verarbeiten. Du könntest beispielsweise überprüfen ob dieser Leerzeichen enthält und so die einzelnen Wörter nacheinander verarbeiten/verschlüsseln. Auf die einzelnen Zeichen im String, kannst du entweder über den Indexoperator (http://www.cplusplus.com/reference/string/string/operator[]/) zugreifen oder über Iteratoren (http://www.cplusplus.com/reference/string/string/begin/).