Kleines Progrämmchen, was sagt ihr dazu?



  • und wieviel zeilen sind sinnvoll?



  • ++i;
    if(i==key.size())
       i=0;
    

    Nutze ich denn da das letzte Zeichen des Strings?

    Wenn ich

    system("Pause");
    

    weglasse, schließt das Konsolenfenster immer sofort.
    Ist der Befehl so grausam, dass sich da etwas eigenes schreiben lohnt?

    Wenn deine If Abfrage funktioniert, könnt ich mir folgendes vorstellen, um das i lokaler zu halten:

    for(int i = 0; !in.get(c); ++i)
    {
        out << c^key[i];
        if(i==key.size()) //nicht eher i>key.size()?
            i=0;
    }
    

    Die Argumente stammen noch aus der Compilervorlage. Habe sie einfach nicht gelöscht.



  • ??????????? schrieb:

    und wieviel zeilen sind sinnvoll?

    Schätze mal, Programm ist klein, schnell und erfüllt den erdachten Zweck ohne an Lesbarkeit zu verlieren.

    Edit: Okay .. daneben



  • ??????????? schrieb:

    und wieviel zeilen sind sinnvoll?

    besonders schöne programme haben höchstens 250 zeilen, das weiß ja jeder. man kann zufälligerweise besonders schöne programme nie in mehrere kleinere dateien aufteilen, so daß sets eine kleine datei eine zeile weniger als eine andere kleine datei hat. aber man kann besonders schöne programme auf x verschiedene weisen in kleinere dateien mit der gleichen zeilenanzahl aufteilen, wobei x immer gerade ist. ist das nicht seltsam?
    das gesuchte programm ist ein besonders schönen programm. wenn ich dir nun sage, daß es auch besonders schöne programme gibt, die größer als das gesuchte programm sind und welche, die kleiner sind, isses klar, wieviele zeilen es hat.
    viel spaß beim knobeln.
    🤡



  • In Deiner Originalversion war genau an der Stelle ein Fehler den volkard korrigiert hat

    out << c^key[i];
     if(i<key.size())  // i <= key.size() wäre falsch
        ++i;
     else i=0;
    

    key[key.size()] ist wohl immer '\0' aber eigentlich nicht zulässig. Ausserdem macht das mit c^'\0' auch nicht so viel Sinn.

    volkard hat diesen Fehler mit korrigiert:

    out << c^key[i];
    ++i;
    if(i==key.size())
       i=0;
    

    Jetzt ist i immer kleiner key.size().

    Ausserdem ist

    i = (i + 1) % key.size();
    

    noch kürzer, erfüllt den Zweck und ist schlechter lesbar...



  • Das c++ strings \0 terminiert sind, wusste ich gar nicht ..
    Dann geht das natürlich so wie bei mir nicht, auch wenn es sich nicht wirklich ausgewirkt hat.

    i = (i + 1) % key.size();
    

    Dann doch lieber ein paar Zeilen mehr.



  • huhu,
    @Panke:
    womit hast du C++ gelernt/lernst du?



  • Bücher aus der örtlichen, allerdings schlecht bestückten Bücherei.
    Ich empfehle auf jeden Fall mehrere zu lesen, da sie unterschiedliche Bereiche unterschiedlich gut abdecken und ein bisschen Wiederholung sicherlich nicht schadet. Dann gibts hie und da noch ein paar Tuts und Ebooks (klick mal oben auf "Tutorials" 😉 ) die einem sicherlich auch bei bestimmten Problemen weiterhelfen. Bei den file streams z.B. musste ich auch erstmal bisschen Lesestoff zusammensuchen, damit's dann klappt.

    Edit: Ach ja, und jetzt versuche ich es, indem ich Sachen wie das hier programmiere und das Wissen, das mir dazu fehlt, einfach zusammensuche, wie ich es gerade brauche.



  • Panke schrieb:

    Das c++ strings \0 terminiert sind, wusste ich gar nicht ..

    das wußte bisher keiner. steht nichtmal im standard, so geheim war das.



  • zum code: anstatt jedesmal ein neues string-objekt zu erstellen, könntest du das alte auch einfach überschreiben.



  • niemand schrieb:

    key[key.size()] ist wohl immer '\0' aber eigentlich nicht zulässig.

    also erstens sind string nicht nullterminiert, wie volkard gerade schon gesagt hat, und zweitens wäre dann höchstens key[strlen(key) -1] == '\0'.



  • Ganz so einfach ist es nicht. Wenn schon dann Standard dann richtig:

    21.3.4 basic_string element access [lib.string.access]
    const_reference operator[](size_type pos) const;
    reference operator[](size_type pos);
    1 Returns: If pos < size(), returns data()[pos]. Otherwise, if pos == size(), the const version returns charT(). Otherwise, the behavior is undefined.

    C++ String müssen nicht 0-terminiert sein. Der Standard verlangt dies nicht. Allerdings besteht die Möglichkeit, das die STL Implementation Deiner Wahl, hinter den String ein '\0' macht. Damit ist die Implementation von string::c_str() sehr einfach, ausserdem lässt sich so obige Regel auch einfach erledigen. Damit besteht die Chance, dass s[s.size()] == '\0' ist, obwohl der Zugriff im nicht const-Fall undefiniert ist. Verlassen sollte sich keiner darauf. Aufgrund obiger (komplizierter) Regel würde ich s[s.size()] meiden (obwohl es nicht immer ein Fehler sein muss).

    EDIT: komma entfernt
    EDIT2: den beim entfernen eingebauten Tippfehler beseitigt



  • Danke!



  • du hast talent



  • Panke schrieb:

    Meint ihr alles in 8 Zeilen oder nur die Main Funktion?

    Alles mit drum und dran. Hab aber bei der Eingabe geschummelt 🙂

    1 #include <fstream>
    2 int main (int argc, char *argv[]) {
    3     std::ifstream in(argv[1]);    // erstes Argument:  Eingabedatei
    4     std::ofstream out(argv[2]);   // zweites Argument: Ausgabedatei
    5     unsigned counter = 0;         // aktuelle Position im key-string (mod strlen)
    6     char     ch = 0;              // aktuelles Zeichen
    7     while(in.get(ch)) out.put(ch ^ (argv[3])[(counter++)%strlen(argv[3])]); 
    8 }
    

    Aufruf mit: Progarmmname <input> <output> <key>



  • Nicht schlecht Panke, wie lange programmierst du schon?



  • Taurin: Hübsch 🙂 Wär für mich vor diesem Thread aber kaum lesbar gewesen.

    Neumann:
    Nicht lange. Zwei Monate? Vorher aber schon mit MSW Logo im Informatikunterricht gespielt.


Anmelden zum Antworten