Kleines Progrämmchen, was sagt ihr dazu?



  • Ich wette du hast schon mehrere programme geschrieben 😉 da ich selber noch anfänger bin wette ich das du schon andere testprogramme geschrieben hast.
    Wenn das aber wirklich dein erstes ist dann respeckt 😉



  • versuch mal, das programm so klein wie möglich zu kriegen. keine fehlerbehandlung. keine globalen variablen. ich fürchte, es wird hübscher als 6-zeiler aussehen. falls nicht, dann sollte dir kurze version trotzdem in mancherlei hinsicht vorbild sein.



  • wenn du schon globale variablen hast, dann tue sie mindestens in einen anonymen namespace. alles andere was mir auf den ersten blick aufgefallen ist, wurde schon gesagt.



  • Das erste das funktioniert und nicht aus irgendwelches Tuts ist.
    Ich mach mich dann mal ans Kleinschreiben. Aber 6 Zeilen? Ob das geht ..

    Welchen Vorteil bringt ein anonymer Namespace?



  • Panke schrieb:

    Welchen Vorteil bringt ein anonymer Namespace?

    Objekte, die sich in einem anonymen Namespace befinden, haben internes Linkage. D.h. dass sie nur von der Übersetzungseinheit angesprochen werden kann, die den Namespace definiert.
    Der anonyme Namespace hat den Vorteil, dass obwohl du innerhalb der ÜE ohne Qualifizierung auf Objekte, etc. in diesem Namensraum zugreifen kannst, diese von anderen ÜEs nicht angesprochen werden können.

    Gruß Caipi



  • Panke schrieb:

    Das erste das funktioniert und nicht aus irgendwelches Tuts ist.
    Ich mach mich dann mal ans Kleinschreiben. Aber 6 Zeilen? Ob das geht ..

    aber mach nicht den quelltext klein sondern sieh zu dass das was der compiler ausspuckt klein ist.



  • Hey Panke du bist ein Genie. 😮 👍



  • Panke schrieb:

    Das erste das funktioniert und nicht aus irgendwelches Tuts ist.
    Ich mach mich dann mal ans Kleinschreiben. Aber 6 Zeilen? Ob das geht ..

    Welchen Vorteil bringt ein anonymer Namespace?

    6 Zeilen find ich auch schwierig, ohne jeglichen Stil aufzugeben. Aber ohne Fehlerabfragen komm ich auf 8 Zeilen mit allem drum und dran 🙂



  • Taurin schrieb:

    6 Zeilen find ich auch schwierig, ohne jeglichen Stil aufzugeben. Aber ohne Fehlerabfragen komm ich auf 8 Zeilen mit allem drum und dran 🙂

    das ist eine einsparung von 96% 👍 .
    na, mal schauen, was Panke so schafft. und dann schauen, wie er das große programm mit ehlerabfragen und so zusammenklopfen mag. ich schätze mal, so 50% werden's.



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

    Tante Edith:

    Soo, gerade eben mal rumgetüftelt. Kleiner ist bei mir nicht drin:

    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    	cout << "Quelle: ";
    	string quelle;
    	cin  >> quelle;
    
    	ifstream in(quelle.c_str(), ios_base::binary);
    
    	cout << "Ziel: ";
    	string ziel;
    	cin >> ziel;
    
    	ofstream out(ziel.c_str(), ios_base::binary);
    
    	cout << "Key: ";
    	string key;
    	cin  >> key;
    
    	int i=0;
    	char c = in.get();
    	while(!in.eof())
    	{
    
    		c = c^key[i];
    		out << c;
    		if(i<=key.size())
    			++i;
    		else i=0;
    		c = in.get();
    	}
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • Panke schrieb:

    Soo, gerade eben mal rumgetüftelt. Kleiner ist bei mir nicht drin:

    uih! das ist aber hübsch geworden.

    #include <cstdlib> //weg
    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char *argv[]) //woziu die parameter?
    {
    	cout << "Quelle: ";
    	string quelle;
    	cin  >> quelle;
    
    	ifstream in(quelle.c_str(), ios_base::binary);
    
    	cout << "Ziel: ";
    	string ziel;
    	cin >> ziel;
    
    	ofstream out(ziel.c_str(), ios_base::binary);
    
    	cout << "Key: ";
    	string key;
    	cin  >> key;
    
    	int i=0; //aua
    	char c = in.get(); //aua
    	while(!in.eof())
    	{
    
    		c = c^key[i];
    		out << c;
    		if(i<=key.size())
    			++i;
    		else i=0;
    		c = in.get();
    	}
    
        system("PAUSE"); //weg
        return EXIT_SUCCESS;
    }
    

    irendwas an der schleife stört noch.
    sagen wir mal, i sei nötig. und daß wir nicht den modulo-operator wollen una uch kein ?: oder -=bool(...).
    dann ist

    if(i<=key.size())
    			++i;
    		else i=0;
    

    schon beinahe so gut wie

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

    beim enlesen nimmt man gerne

    while(!in.get(c))
    

    außerdem würde ichg nicht auf c rumschreiben, sondern einfach nur char(c^key[i]) ausgeben.

    schauste mal, ob was von meiner neuerlichen mecker einbauebar ist?

    und dann mußte halt schauen, ob du wirklich so stark reduzierten code gerne hast, oder leiber etwas mehr schreibst. vielleicht strebste ja auch mal eine stellung an, wo man nach anzahl der codezeilen entlohnt wird (soll's ja geben). oder willst spieleprogrammierer werden, da gehört codebloat zu den grundtugenden.



  • die 6 zeilen waren eine nicht sinnvoll erreichbare vorgabe. da hab ich etwas übertrieben, damit du in die richtige richtung läufst. 🕶



  • 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.


Anmelden zum Antworten