logisches denken erforderlich



  • So zuerst die veorgeschichte:

    Ich habe eine seite (oder eine textdokument darin sind zahlen etwa so:)

    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    die erste Zeile [stelle 1] soll ein a sein, das heißt ich tue eine 13 in die variable a.
    stelle 2 soll in die variable b und so weiter...
    nun wähle ich ein wort zum beispiel hallo, dies wurde mit dieser liste verschlüsselt. und zwar so:
    H --> 8. Buchstabe im alphabet also in der liste h=20
    a --> 1. Buchstabe im alphabet --> a = 13
    und jetzt guck ich was 13 für ein buchstabe im alphabet ist also m.
    schlussendlich heißt das wort dann tmxxa.
    Jetzt will ich das aber wieder entschlüsseln, so das wollte ich so machen:
    die Stelle von t im alphabet ist 20 in der liste an achter stelle also h das heißt der erste buchstabe muss h sein.

    das ist aus dem mathematischen bereich ^^.
    um den letzten Schritt zu machen (die Stelle von t im alphabet ist 20 in der liste an achter stelle also h das heißt der erste buchstabe muss h sein.)
    hab ich den code (lese das textdokument vorher ein, ach ich zeig es einfach)

    for (;alphabet<=26;)
    {  
        easy = 1;
        zeile = zeile + 1;
        alphabet = alphabet + 1;
        lines = lines + 1;
        arrayhelper[1] = 0;    
    
                            string text; // Haupttext
        file.open(fileName.c_str());
                if(file)
                {
                            int zeilen = 0;
                            while(!file.eof())
                            {
                                        arrayhelper[1] = arrayhelper[1] + 1;
                                        string txt; // Buffer
                                        getline(file, txt);
                                        text = txt + "\n";
                                        buchstabe[arrayhelper[1]]=txt;
                                        zeilen++;
                                        cout<<text;
    
                                        if(zeile == 26) // gesuchte Zeile erreicht
                                        {
    
                                                    break; // Zeile gefunden, Einlesen abbrechen
                                        }
                                        inhalt[lines] = text;
                            }
    
                            file.close();
    
                }
    
              strm << text;
              strm >> letter;
              strm.clear();
    
              LET[alphabet]=letter;
              cout<<inhalt[1];
    
    }
    size3 = wholetext[0].size();
    easy = 0;
    int blub = 1;
    word = wholetext[0];
    cout<<"der decodierte Text ist:"<<"\n";
    for (;size3>0;)
    {
    
        partoser = partoser + 1;
        size3 = size3 - 1; 
        if(wholetext[0].substr((partoser-1),1)=="a"||wholetext[0].substr((partoser-1),1)=="A")
        {compint = 1;}
        if(wholetext[0].substr((partoser-1),1)=="b"||wholetext[0].substr((partoser-1),1)=="B")
        {compint = 2;}
        if(wholetext[0].substr((partoser-1),1)=="c"||wholetext[0].substr((partoser-1),1)=="C")
        {compint = 3;}
        if(wholetext[0].substr((partoser-1),1)=="d"||wholetext[0].substr((partoser-1),1)=="D")
        {compint = 4;}
        if(wholetext[0].substr((partoser-1),1)=="e"||wholetext[0].substr((partoser-1),1)=="E")
        {compint = 5;}
        if(wholetext[0].substr((partoser-1),1)=="f"||wholetext[0].substr((partoser-1),1)=="F")
        {compint = 6;}
        if(wholetext[0].substr((partoser-1),1)=="g"||wholetext[0].substr((partoser-1),1)=="G")
        {compint = 7;}
        if(wholetext[0].substr((partoser-1),1)=="h"||wholetext[0].substr((partoser-1),1)=="H")
        {compint = 8;}
        if(wholetext[0].substr((partoser-1),1)=="i"||wholetext[0].substr((partoser-1),1)=="I")
        {compint = 9;}
        if(wholetext[0].substr((partoser-1),1)=="j"||wholetext[0].substr((partoser-1),1)=="J")
        {compint = 10;}
        if(wholetext[0].substr((partoser-1),1)=="k"||wholetext[0].substr((partoser-1),1)=="K")
        {compint = 11;}
        if(wholetext[0].substr((partoser-1),1)=="l"||wholetext[0].substr((partoser-1),1)=="L")
        {compint = 12;}
        if(wholetext[0].substr((partoser-1),1)=="m"||wholetext[0].substr((partoser-1),1)=="M")
        {compint = 13;}
        if(wholetext[0].substr((partoser-1),1)=="n"||wholetext[0].substr((partoser-1),1)=="N")
        {compint = 14;}
        if(wholetext[0].substr((partoser-1),1)=="o"||wholetext[0].substr((partoser-1),1)=="O")
        {compint = 15;}
        if(wholetext[0].substr((partoser-1),1)=="p"||wholetext[0].substr((partoser-1),1)=="P")
        {compint = 16;}
        if(wholetext[0].substr((partoser-1),1)=="q"||wholetext[0].substr((partoser-1),1)=="Q")
        {compint = 17;}
        if(wholetext[0].substr((partoser-1),1)=="r"||wholetext[0].substr((partoser-1),1)=="R")
        {compint = 18;}
        if(wholetext[0].substr((partoser-1),1)=="s"||wholetext[0].substr((partoser-1),1)=="S")
        {compint = 19;}
        if(wholetext[0].substr((partoser-1),1)=="t"||wholetext[0].substr((partoser-1),1)=="T")
        {compint = 20;}
        if(wholetext[0].substr((partoser-1),1)=="u"||wholetext[0].substr((partoser-1),1)=="U")
        {compint = 21;}
        if(wholetext[0].substr((partoser-1),1)=="v"||wholetext[0].substr((partoser-1),1)=="V")
        {compint = 22;}
        if(wholetext[0].substr((partoser-1),1)=="w"||wholetext[0].substr((partoser-1),1)=="W")
        {compint = 23;}
        if(wholetext[0].substr((partoser-1),1)=="x"||wholetext[0].substr((partoser-1),1)=="X")
        {compint = 24;}
        if(wholetext[0].substr((partoser-1),1)=="y"||wholetext[0].substr((partoser-1),1)=="Y")
        {compint = 25;}
        if(wholetext[0].substr((partoser-1),1)=="z"||wholetext[0].substr((partoser-1),1)=="Z")
        {compint = 26;}
    letterstring = buchstabe[compint];
        // cancelled: cout<<letterstring;
        //letterstring = schiffrierzahl[stellungszahl]
        if (letterstring =="1")
        {cout<<"a";}
        if (letterstring =="2")
        {cout<<"b";}
        if (letterstring =="3")
        {cout<<"c";}
        if (letterstring =="4")
        {cout<<"d";}
        if (letterstring =="5")
        {cout<<"e";}
        if (letterstring =="6")
        {cout<<"f";}
        if (letterstring =="7")
        {cout<<"g";}
        if (letterstring =="8")
        {cout<<"h";}
        if (letterstring =="9")
        {cout<<"i";}
        if (letterstring =="10")
        {cout<<"j";}
        if (letterstring =="11")
        {cout<<"k";}
        if (letterstring =="12")
        {cout<<"l";}
        if (letterstring =="13")
        {cout<<"m";}
        if (letterstring =="14")
        {cout<<"n";}
        if (letterstring =="15")
        {cout<<"o";}
        if (letterstring =="16")
        {cout<<"p";}
        if (letterstring =="17")
        {cout<<"q";}
        if (letterstring =="18")
        {cout<<"r";}
        if (letterstring =="19")
        {cout<<"s";}
        if (letterstring =="20")
        {cout<<"t";}
        if (letterstring =="21")
        {cout<<"u";}
        if (letterstring =="22")
        {cout<<"v";}
        if (letterstring =="23")
        {cout<<"w";}
        if (letterstring =="24")
        {cout<<"x";}
        if (letterstring =="25")
        {cout<<"y";}
        if (letterstring =="26")
        {cout<<"z";}
    

    das geht aber nicht. zumindest nicht so wie ich will er soll dann hallo ausgeben aber er verschlüsselt immer noch munter weiter. also als wenn ich tmxxa nochmal verschlüssele. HILFE ich bin überfordert

    EDIT: ich werde mir wohl erst morgen ansehen was ich an antworten gekriegt hab *schnirch*



  • Autsch, das sieht ja umständlich aus. 😃

    Soweit ich das verstanden habe, soll das ein Caesar-Algorithmus werden?! Wäre nett, wenn du die Fehlermeldung angeben könntest, bzw. was genau passiert/nicht passiert.

    Aber erstmal noch ein paar Tipps zur Vereinfachung:

    - char-bibliothek "<cctype>" mit der Funktion toUpper() erleichtert das Umwandeln in Großbuchstaben

    - die einzelnen Buchstaben werden innerhalb von C durch eine Zahl mit ihrem ASCII-Äquivalent dargestellt: "MeinZeichen - 'A'" liefert also sozusagen die Stelle des Buchstabens im Alphabet (nullbasiert, bei Großbuchstaben)

    damit sparst du dir eine menge abfragen und damit auch jede menge fehlerquellen..
    - andersrum liefert "MeineVerschiebung + 'A'" den entsprechenden Buchstaben, wenn du das ganze in einem char abspeicherst

    - damit du nicht über den "Rand" der Buchstaben hinaus kommst, solltest du dir mal die rechenoperation modulo ansehen (in c++ durch das Prozentzeichen (%) dargestellt)


  • Administrator

    cerotidinon schrieb:

    Wäre nett, wenn du die Fehlermeldung angeben könntest, bzw. was genau passiert/nicht passiert.

    ACK

    cerotidinon schrieb:

    - char-bibliothek "<cctype>" mit der Funktion toUpper() erleichtert das Umwandeln in Großbuchstaben

    Ich würde nicht <cctype> nehmen, da du sonst eine Vermischung des C Locales mit dem C++ Locale hast. In C++ sollte man daher ganz auf <cctype> verzichten und das Äquivalent nehmen, nämlich <locale> :
    http://www.cplusplus.com/reference/std/locale/locale/

    Dort hat es auch eine Funktion toupper :
    http://www.cplusplus.com/reference/std/locale/toupper/

    cerotidinon schrieb:

    - die einzelnen Buchstaben werden innerhalb von C durch eine Zahl mit ihrem ASCII-Äquivalent dargestellt: "MeinZeichen - 'A'" liefert also sozusagen die Stelle des Buchstabens im Alphabet (nullbasiert, bei Großbuchstaben)

    Ich muss sagen, ich weiss nicht wie es in C ist, aber da wir im C++ Forum sind, ist das auch nicht so wichtig. In C++ ist dies jedenfalls nicht garantiert und ich würde mich auch nicht unbedingt zu stark auf sowas verlassen. Jedenfalls würde ich es keinem Neuling empfehlen.

    Eine std::map tut es hier genauso und ist sicherer:
    http://www.cplusplus.com/reference/stl/map/

    Als Alternative wäre im ersten Fall noch eine switch-Anweisung möglich. Dabei müsste man aber dies vereinfachen:

    wholetext[0].substr((partoser-1),1)
    

    Und zwar zu:

    char c = wholetext[0].at(partoser - 1);
    
    // Dann kann man nämlich machen:
    switch(c)
    {
    case 'a' :
    case 'A' :
      compint = 1;
      break;
    case 'b' :
    case 'B' :
      compint = 2;
      break;
      // ... usw ...
    }
    

    Braucht nicht weniger platz, ist aber sicherer und schneller.

    Der zweite Teil könnte man auch über eine Switch-Anweisung machen, dann müsste man aber entweder zuvor den String in eine Zahl umwandeln oder zwei Switch-Anweisungen schachteln. Eine std::map dürfte wohl schnell genug sein und auch leserlicher sein.

    cerotidinon schrieb:

    - andersrum liefert "MeineVerschiebung + 'A'" den entsprechenden Buchstaben, wenn du das ganze in einem char abspeicherst

    Wie gesagt, nicht garantiert.

    Grüssli



  • Ok, das mit <cctype> sehe ich ein...

    davon, dass meine Methode in C++ nicht sicher ist, habe ich allerdings noch nie etwas gehört. Zur Sauberheit könnte man vlt. schreiben:

    int stelle;
    char meinZeichen;
    stelle = static_cast<int>(meinZeichen) - 'A';
    

    ..oder wenn man es ganz exakt nimmt sogar minus 65 rechnen, aber empfehlenswerter finde ich an der stelle dennoch meine methode, da man niemandem empfehlen sollte, riesige switch's oder tausende if's einzubauen.

    Oder hast du noch irgendeine quelle, die widerlegt, dass das sicher ist?


  • Administrator

    cerotidinon schrieb:

    Oder hast du noch irgendeine quelle, die widerlegt, dass das sicher ist?

    Nein, aber genau das ist das Problem. Gibt mir eine Quelle, welche belegt, dass im C++ Standard der ASCII Zeichensatz benutzt wird. Am besten natürlich mit einem Auszug aus dem C++ Standard.
    Ich warn dich gleich einmal, du wirst nichts im C++ Standard zu ASCII finden, da dies nicht standardisiert und daher vom Kompiler abhängig ist. Also dass die Buchstaben 'a' bis 'z' und 'A' bis 'Z' in ihrem Wert hintereinander liegen, ist nicht mit Sicherheit gegeben. Da musst du zuerst im Kompilerhandbuch nachschauen gehen. Und wenn du den Code zu einem anderen Kompiler portierst, musst du daran denken, dies im neuen Kompiler wieder nachzuschauen. Anderer Kompiler kann auch einfach nur eine neue Version sein 😉

    Edit:
    Ha, ich trottel, hätte doch lieber nochmals den Standard durchblättern sollen. Es steht sogar explizit drin, dass es vom Kompiler abhängig ist 🙂
    C++ Standard 98
    Kapitel 2.2 Character sets
    Abschnitt 1

    The basic source character set consists of 96 characters: the space character, the control characters representing horizontal tab, vertical tab, form feed, and new-line, plus the following 91 graphical characters: 15)

    ...

    15) The glyphs for the members of the basic source character set are intended to identify characters from the subset of ISO/IEC 10646 which corresponds to the ASCII character set. However, because the mapping from source file characters to the source character set (described in translation phase 1) is specified as implementation-defined, an implementation is required to document how the basic source characters are represented in source files.

    Grüssli



  • Also mein Problem ist das ich nicht das gewünschte Resultat erreiche. Der Code funktioniert einwandfrei, aber jetzt fragt man sich wo ist mein Problem.. nun ja ich weiß nicht so genau. er sollte eigentlich bei der eingabe des textes ein "hallo" ausgeben (eben nach dem code unten), aber leider "fyjjm", genau das würde passieren wenn ich tmxxa mit dem schlüssel verschlüssele, aber ich will entschlüsseln aus tmxxa wieder hallo machen aber das geht mit dem code unten nicht. (groß klein schreibung hatte ich eigentlich von vornherein außen vor gelassen, das heißt alles klein, da bräuchte ich eigenlich kein ...=="A".)
    kann mir jemand sagen wie ich das hinkriege, dazu reicht mein grips nicht mehr aus, ich verhaspele mich immer wieder und warum das unten nicht funktioniert (also eher verschlüsselt als entschlüsselt :() weiß ich aucht nicht bzw kann ich nicht sagen. aber wenn mir jemand ein beispiel code dafür geben könnte wär ich sehr zu dank verpflichtet. Oder wenn man mir sagt was da falsch ist

    EDIT: ich wusste gar nicht das man sowas Ceasar Algorithmus nennt 😃 .Außerdem arbeite ich noch an einem weiteren system das mir die zugeordneten buchstaben (in anführungszeichen)"zufällig" aussucht (je nach eingegebener randint. aber das nur so am rande.


  • Administrator

    Ok, also ich wollte mich gerade ein wenig ablenken und habe deshalb die Lösung geschrieben (Zimmer putzen und aufräumen ist sowas von langweilig :)). Der Code ist nicht gerade perfekt, es fehlt zum Beispiel extrem viel an Fehlerbehandlung.

    #include <map>
    #include <string>
    #include <fstream>
    #include <iostream>
    
    #include <cassert>
    
    template<typename IterT>
    std::string remap(
    	IterT first,
    	IterT last,
    	std::map<char, char> const& codepage)
    {
    	std::string result;
    	std::map<char, char>::const_iterator codeIter;
    
    	for(; first != last; ++first)
    	{
    		codeIter = codepage.find(*first);
    
    		assert(codepage.end() != codeIter);
    
    		result += codeIter->second;
    	}
    
    	return result;
    }
    
    int main()
    {
    	std::size_t const ALPHABET_SIZE = 26;
    	char const* const ALPHABET = "abcdefghijklmnopqrstuvwxyz";
    
    	std::map<char, char> codepage;
    
    	std::cout << "Enter path to codepage file:" << std::endl;
    
    	std::string path;
    	std::getline(std::cin, path);
    
    	std::ifstream codepageFile(path.c_str());
    
    	int pos;
    
    	for(int i = 0; i < ALPHABET_SIZE; ++i)
    	{
    		codepageFile >> pos;
    		assert(codepageFile && pos > 0 && pos <= ALPHABET_SIZE);
    
    		// 0 basierte arrays
    		--pos;
    
    		codepage[ALPHABET[pos]] = ALPHABET[i];
    	}
    
    	codepageFile.close();
    
    	// Oki, doki ... los gehts
    
    	std::cout << "Enter text to decode: " << std::endl;
    
    	std::string text;
    	std::getline(std::cin, text);
    
    	text = remap(text.begin(), text.end(), codepage);
    
    	std::cout << "Result -> " << text << std::endl;
    
    	return 0;
    }
    

    Copy&Paste von der Konsole:

    Enter path to codepage file:
    C:\codepage.txt
    Enter text to decode:
    tmxxa
    Result -> hallo
    

    Das File "C:\codepage.txt" beinhaltet einfach die Zahlen, welche du zu Beginn hier angegeben hast.

    Ich hoffe der Code hilft dir weiter. Wenn Fragen bestehen, dann fühl dich frei zu fragen.

    Grüssli



  • VIELEN DANK damit hab ich ja jetzt nicht gerechnet.

    jetzt muss man den code erst mal verstehen. ^^ hmm ich setzt mich kurz damit auseinander und mal sehen ich poste nochmal bei ein paar Fragen.

    EDIT: AHHHH DAS IST GENIAL DANKE !!! (ich freu mich extrem, da ich seit 2 Wochen an einem decoder System arbeite und jetzt krieg ich den "einfach mal so")
    🙂 🙂

    ~jetzt macht mein encoder auch wieder sinn~
    jetzt werde ich nur noch mein encoder weiter verbessern und die verschlüsselund optimieren und sage schon jetzt voraus, dass ich noch einige Fragen haben werde (zum encoder).

    Edit: ich habe diese zeile hinzugefügt 😃 :

    std::cout << "Decoder by Dravere \n";
    


  • Hm, stellt sich die Frage, wieviel von dem dir gegebenen Code du auch tatsächlich verstehst...

    Da gleich ein Template reinzupacken ist schon etwas.. naja.. anfängerunfreundlich. 😛

    Egal, solange es hilft..



  • Naja um ehrlich zu sein hab ich nur SEHR wenig von verstanden, hauptsache er geht, auch wenn ich nicht behaupten kann er sei von mir.


  • Administrator

    Tim06TR schrieb:

    Edit: ich habe diese zeile hinzugefügt 😃 :

    std::cout << "Decoder by Dravere \n";
    

    Mach das lieber weg, bei solch schlechtem Code will ich keine Signatur drunter haben 🙂

    cerotidinon schrieb:

    Da gleich ein Template reinzupacken ist schon etwas.. naja.. anfängerunfreundlich. 😛

    Bewusst, nenne ich Hausaufgabenschutz. Wenn ein Student dies seinem Professor vorlegt, dann wird der seine Zweifel bekommen, dass der Student dies wirklich alleine gemacht hat und es verstanden hat. Ein paar weitere Fragen und der Student ist in die Falle gelaufen 😉

    Tim06TR schrieb:

    Naja um ehrlich zu sein hab ich nur SEHR wenig von verstanden, hauptsache er geht, auch wenn ich nicht behaupten kann er sei von mir.

    Das ist für mich ein Grund, dass nächste Mal wieder keine komplette Lösung anzugeben. Es wäre schon Sinn der Sache, wenn du den Code probieren würdest zu verstehen. Sonst lernst du schliesslich nie was und es sollte doch darum gehen, dass du etwas lernst, nicht? Wie gesagt, ich bin hier um die Fragen zu beantworten und bin mir sicher, dass andere im Forum auch helfen würden.

    Da hat meine Langeweile wohl mal wieder zu viel kaputt gemacht ... *seufz*

    Grüssli



  • nein nein nicht doch
    1. ich lerne es lieber langsam jeden tag max 1 "Vokabel" dazu (wenn man das so nennen darf) und das wär zu viel auf einmal zu verstehen ^^.

    2. mach ich das lernen alles ohne "grund" nur so aus langeweile mal C++ ein wenig gelernt, ganz ohne lehrer, buch etc. und es geht (bitte kein kommentar ^^).
    ~man muss mal davon absehen das mein "Spaghetti Code" sehr unordentlich ist~
    ~aber ich krieg das eben nicht besser hin (ordentlicher)~

    und bevor ich eine 1000 zeilen krüppel lösung nehme ... 😃
    (mein consolen tic tac toe hatte 2000 kaum schleifen kein switch case :x egal)

    Aber eines Tages wird es mir helfen (bsp beruf stdio ähhh studium ^^)


Anmelden zum Antworten