Quote:
Originally Posted by d3pr1
Da ich mit dem anderen Thema in meinem Informatik kurs schon fertige habe hat der lehrer mir ne Aufgabe gegeben die ich zuhause lösen kann wenn ich möchte und ich möchte es tun
Aufgabe ist wiefolgt
Caesar Verschlüsslung wir sollen eigentlich nur eine machen nach wahl ich möchte aber wegen des lern effektes alle 3 machen
a) einfach ne verschiebung um x zeichen done
Code:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string myArray; //string deklaration
getline( cin, myArray ); //einlesen
cout<<"Schrittweite eingeben"<<endl;
int lol;
cin>>lol; //schrittweite einlsen
int a=myArray.length();
int schieb;
for (int i=0;i<myArray.length();i++) //schleife bis string länge
{
if (myArray[i]+lol>'z')
{
schieb='z'-static_cast<int>(myArray[i]);
myArray[i]='a'-1-schieb+lol; //wenn der bustabe plus die schieb zahl größer als z ist
//setze die formel ein
}
else if (myArray[i]<'a')
{ //wenn der bustabe kleiner als a ist wird er als leerzeile
myArray[i]=' '; //da wir nur kleinbustaben einlesen bzw leerstelen ist es richtig so
}
else if (myArray[i]>'z')
{ //wenn zeichden größer als z einfach auf leerstelle setzen
myArray[i]=' ';
}
else
{ //sonst standart formel
myArray[i]=myArray[i]+lol;
}
}
cout<<myArray<<endl;
cout<<"myArray hat "<<a<<" Elemente"<<endl; //wie viele elemente eingeben wurden
system("pause");
}
b eine vordefinierte zeichenreihe heißt a=l z=u usw
und da treten 1 fehler und ein problem auf
1. ich kapier str.replace befehl nicht ganz
2. ist es irgentwie möglich den abc string(der ja eigentlich auch nen array ist
durcheinader zu würfeln
problem liegt dabei eher in richtung wie checke ich ob er den bustaben schon vergeben hat
Code:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string abc;
for (int t=97;t<123;t++)
{
abc+=t; //a-z
}
string zdf;
cout<<abc<<" | ABC"<<endl;
for (int a=122;a>96;a--) //z-a
{
zdf+=a;
}
cout<<zdf<<" | Schluessel"<<endl;
cout<<"geben sie ihr zu Verschlüsselende Text ein"<<endl;
string text;
getline(cin,text); //Schlüssel einlesen
for (int z=0;z<=25;z++)
{
text.replace(text.find(abc[z]),text.find(abc[z]),abc[z],zdf[z]); //replace funktion die 1. den bustaben sucht und diesen dann
//durch den vorderfinierten Bustaben ersetzen bsp string a=abc string b=cba stringa[0]=a replace with string b[0] also c
}
cout<<text;
system("pause");
}
c ist man kann sein eigenes wort eingeben als beispiel elitepvpers dann
setz er das alphabet so um a=e b=l usw
denke wenn ich b kapiert habe das c dann nur noch coderei ist
ich bin für alle ansätze dankbar pseudo code teil code oder nen denkanstoß
mfg,
d3pr1
|
Ganz ehrlich, aber ich versteh gerade nicht was genau bei b zu tun ist, werde dir aber bei einem Problem helfen, dass ganz sicher auf dich zu kommen wird:
Wie überprüft man ob das Zeichen bereits ersetzt wurde und nicht nocheinmal ersetzt wird.
Bsp.
a=l, o=a, l=o
Würde man "Hallo" jetzt ganz "hirnlos" umwandeln lassen, so würde das so aussehen, die wichtige Stelle wird markiert:
Alle a's mit l's ersetzen:
Quote:
Alle o's mit a's erstezen:
Quote:
Alle l's mit o's ersetzen:
Quote:
So und schon hat man einen Fehler, denn wenn man das Wort wieder entschlüsselt, käme das bei raus:
Quote:
Und wozu string.replace? Das frisst doch nur zusätzlich Zeit, so gehts doch auch:
PHP Code:
#include <iostream>
#include <string>
using namespace std;
string Encode(string text,string normal_chars,string encoded_chars);
int main()
{
string encoded=Encode("Hallo","aol","lao");
cout<<"Encoded: "<<encoded<<"\n";
string decoded=Encode(encoded,"lao","aol");
cout<<"Decoded: "<<decoded<<"\n";
}
string Encode(string text,string normal_chars,string encoded_chars)
{
if (normal_chars.length()==encoded_chars.length())
{
for (long i=0;i<text.length();i++)
{
for (short i2=0;i2<normal_chars.length();i2++)
{
if (normal_chars[i2]==text[i])
{
text[i]=encoded_chars[i2];
break;
}
}
}
return text;
}
else return "";
}