Schulprojekt (Textverschlüsselung)
-
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/).
-
anneXus schrieb:
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/).Danke beim 1. teil hab ich mit dem indexoperator gearbeitet. Wenn ich alles in einen string schreibe würde ich es hinbekommen das er vor jedes leerzeichen ay einfügt aber wie verschiebe ich die ersten 2 buchstaben nach hinten?
bsp. im string steht : "hallo wie gehts dir" über die for schleiche könnte ich ne if bedingung erstellen die vor jedem ' ' ein ay anhängt denk ich...
aber wie kann ich nach einem ' ' die ersten 2 zeichen die kommen vor das nächste ' ' setzten das ist mir nicht ganz bewusst wie ich das anstellen soll, weil ich ja mit dem operator immer nur auf ein zeichen zugreifen tue? bräuchte dafür nen ansatzokay dann probier ich es mal ohne ein array, mich würde aber trotzdem interessieren wie man ein dynamisches array anlegt
-
Geht´s hier noch um den Caesar Chiffre oder um den Pig-Latinizer?
Bitte bleib´ in einem Thread bei einem Thema und starte für ein neues Thema einen neuen Thread.Da du ganze Sätze in´s Schweinelatein übersetzen willst bieten sich dafür C++ streams an:
#include <string> #include <iostream> #include <sstream> #include <iterator> std::ostream& pig_latinize( std::ostream& os, const std::string& word ) { if( word.size() > 2 ) { // Wort ist länger als 2 Buchstaben: Wort ab Buchstabe 3 in den Ausgabestrom schreiben, // danach die ersten beiden Buchstaben des Worts in den Ausgabestrom schreiben // ostream_iterator<char> ginge auch std::copy( word.begin() +2, word.end() , std::ostream_iterator<std::string::traits_type::char_type>( os ) ); std::copy( word.begin() , word.begin() +2, std::ostream_iterator<std::string::traits_type::char_type>( os ) ); } else { // Wort ist kürzer als 2 Buchstaben: direkt in Ausgabestrom schreiben os << word; } // "ay" immer anhängen os << "ay "; return os; }
Dinge wie Groß- und Kleinschrift sowie das Zerlegen der Eingabe in Teilwörter bleibt dir überlassen
-
DocShoe schrieb:
Geht´s hier noch um den Caesar Chiffre oder um den Pig-Latinizer?
Bitte bleib´ in einem Thread bei einem Thema und starte für ein neues Thema einen neuen Thread.Da du ganze Sätze in´s Schweinelatein übersetzen willst bieten sich dafür C++ streams an:
#include <string> #include <iostream> #include <sstream> #include <iterator> std::ostream& pig_latinize( std::ostream& os, const std::string& word ) { if( word.size() > 2 ) { // Wort ist länger als 2 Buchstaben: Wort ab Buchstabe 3 in den Ausgabestrom schreiben, // danach die ersten beiden Buchstaben des Worts in den Ausgabestrom schreiben // ostream_iterator<char> ginge auch std::copy( word.begin() +2, word.end() , std::ostream_iterator<std::string::traits_type::char_type>( os ) ); std::copy( word.begin() , word.begin() +2, std::ostream_iterator<std::string::traits_type::char_type>( os ) ); } else { // Wort ist kürzer als 2 Buchstaben: direkt in Ausgabestrom schreiben os << word; } // "ay" immer anhängen os << "ay "; return os; }
Dinge wie Groß- und Kleinschrift sowie das Zerlegen der Eingabe in Teilwörter bleibt dir überlassen
Danke erstmal für die antwort allerdings verstehe ich nicht ganz was streams sind.
den ersten vorgang verstehe ich also std::copy(word.begin() +2, word.end() , den nächsten teil der anweißung allerdings nicht. und das mit dem "os << word" ; auch nicht genau. was ist dieses os? bisher kenne ich aber auch noch keine streams muss ich mir mal anschauen hab nur jetzt leider keine zeit aber werd ich die tage mal machenwenn ich mit "using namespace std" arbeite kann ich "std::" immer weglassen oder?
mein schulprojekt besteht aus 3 teilen caesar chiffre, pig latin und permutationscode und ich dachte ich mach daraus einen thread aber wenn es euch lieber ist könnte ich auch nen neuen aufmachen.