brute force programm schreiben



  • hallo, ich bin ein anfänger in c++ und habe in der letzen zeit die basics angeschaut. Ich wollte ein einfaches brute force programm schreiben, das die zahlen von 1-10 ausprobiert. Ich habe keine ahnung wie ich anfangen soll.
    Hoffe, dass ihr mir helfen könnt.

    mfg tori


  • Mod

    tori1117 schrieb:

    Ich wollte ein einfaches brute force programm schreiben, das die zahlen von 1-10 ausprobiert. Ich habe keine ahnung wie ich anfangen soll.

    for(int i = 1;
    

    Den Rest bekommst du selber hin.



  • void probiereAus(int zahl){
    	//probiere irgendwas mit zahl aus
    }
    
    int main(){
    	for (int i = 1; i <= 10; i++)
    		probiereAus(i);
    }
    


  • tori1117 schrieb:

    Ich habe keine ahnung wie ich anfangen soll.
    Hoffe, dass ihr mir helfen könnt.

    a) Acht verschachtelte Schleifen. Aber das machen eigentlich nur kackboons, weil sich die Passwortlänge nicht einfach vergörßern läßt.
    b) Rekursiv. Das ergibt aber meistens eine wahrlich seltsame Kombination aus Speicherbesitzverhältnissen und Renschreibrechten, außerdem passieren leicht globale Variablen, z.B. für die Internetverbindung, weil man sich fürchtet, die durch alle Rekursionsebenen runterzureichen.
    c) Wie einen Kilometerzähler. http://www.sternzeit-107.de/modules.php?name=News&file=article&sid=378 So würde ich es auch machen.



  • Ich bin dafür volkard die Modrechte zu entziehen.



  • Wieso?



  • tori1117 schrieb:

    hallo, ich bin ein anfänger in c++ und habe in der letzen zeit die basics angeschaut. Ich wollte ein einfaches brute force programm schreiben, das die zahlen von 1-10 ausprobiert. Ich habe keine ahnung wie ich anfangen soll.
    Hoffe, dass ihr mir helfen könnt.

    mfg tori

    Hallo tori,

    Willkommen im C++.

    Du hast vergessen zu erwähnen, was Du mit Deinem Programm überhaupt bezwecken willst. Ansonsten ist der Tipp von volkard 'wie einen Kilometerzähler' goldrichtig. Der Unterschied liegt darin, dass letzterer die Ziffern 0 bis 9 anzeigt, aber mit den Zahlen 1 bis 10 geht es genauso:

    #include <algorithm> // copy, any_of
    #include <iostream>
    #include <iterator> // ostream_iterator
    #include <vector>
    
    template< typename T, int W >
    struct Fix // Zweck von Foxis Bruder ist, das Gezappele bei der Ausgabe zu unterdrücken
    {
        Fix( const T& wert ) : wert_( wert ) {}
        const T& wert_;
    };
    template< typename T, int W >
    std::ostream& operator<<( std::ostream& out, Fix< T, W > i2 )
    {
        out.width( W );
        return out << i2.wert_;
    }
    
    int main() 
    {
        using namespace std; 
        const int MINI = 1;
        const int MAXI = 10;
        vector< int > zahlen( 6, MINI ); // N mal MINI ist die Startkombination
        do
        {
            copy( begin( zahlen ), end( zahlen ), ostream_iterator< Fix<int,2> >( cout << "  \r", " " ) );
    
            // --   auf auf; zum nächsten Kilometer...
            for( auto i = begin( zahlen ); i != end( zahlen ); ++i )
            {
                if( ++(*i) <= MAXI ) // MAXI ist der Maximalwert eines Elements in 'zahlen'
                    break;
                *i = MINI; // falls der eine Wert das Maximum erreicht, Überlauf zur nächsten Stelle
            }
        }
        while( any_of( begin( zahlen ), end( zahlen ), [MINI]( int z ) { return z != MINI; } ) ); // stopp, wenn alle Zahlen wieder das Minimum erreicht haben
        cout << endl;
    
        return 0;
    }
    

    Die Anzahl der Stellen habe ich mal auf 6 gesetzt (s. Zeile 24), kannst natürlich auch andere Werte eintragen.

    Gruß
    Werner



  • tori1117 schrieb:

    hallo, ich bin ein anfänger in c++ und habe in der letzen zeit die basics angeschaut.

    Ich bezweifele, dass unter Basics Templates/Klassen/Iteratoren/Algorithmen fallen... 🙄



  • Werner Salomon schrieb:

    while( any_of

    Ich würde links noch ein unsichtbares Rad anbringen, und wenn es sich zum erstenmal dreht, ist die Feier gelaufen.



  • irgendwie verstehe ich nur bahnhof muss mir nochmal die basics anschauen.
    Hatte vor, dass man eine zahlenkombination eingibt und das programm alles ausprobiert bis er es raus hat.


  • Mod

    tori1117 schrieb:

    irgendwie verstehe ich nur bahnhof muss mir nochmal die basics anschauen.
    Hatte vor, dass man eine zahlenkombination eingibt und das programm alles ausprobiert bis er es raus hat.

    😕

    #include <iostream>
    int main()
    {
     using namespace std;
     cout << "Zahl: ";
     unsigned int zahl;
     cin >> zahl;
     cout << "Suche nach " << zahl << '\n';
     for(unsigned i = 0; ; ++i)
     {
       cout << "Probiere " << i << " ... ";
       if (i == zahl)
       {
         cout << "Gefunden!\n";
         return 0;
       }
       else
         cout << "daneben\n";
     }
    }
    

    Dies ist eines der merkwürdigsten Programme, die ich je geschrieben habe 🕶



  • SeppJ schrieb:

    Dies ist eines der merkwürdigsten Programme, die ich je geschrieben habe 🕶

    Fehlt nur noch Fehlerbehandlung einer falschen Eingabe, aktuell wird dann immer '0' gefunden.

    Ausserdem wäre hier std::flush und std::endl angebracht, sonst meint der Nutzer noch, das Inkrementieren geht viel länger als das Probieren.


  • Mod

    xXxbennixXx schrieb:

    SeppJ schrieb:

    Dies ist eines der merkwürdigsten Programme, die ich je geschrieben habe 🕶

    Fehlt nur noch Fehlerbehandlung einer falschen Eingabe, aktuell wird dann immer '0' gefunden.

    Ausserdem wäre hier std::flush und std::endl angebracht, sonst meint der Nutzer noch, das Inkrementieren geht viel länger als das Probieren.

    Oh ja (ungetestet):

    #include <iostream>
    #include <unistd.h>
    
    int main()
    {
     using namespace std;
     cout << "Zahl: ";
     unsigned int zahl;
     if (cin >> zahl)
     {
      cout << "Suche nach " << zahl << '\n';
      for(unsigned i = 0; ; ++i)
      {
        cout << "Probiere " << i << flush;
        for (int i = 0; i < 5; ++i)
        {
          cout << '.' << flush;
          usleep(100000);  // 0.1 Sekunden
        }
        if (i == zahl)
        {
         cout << "Gefunden!\n";
         return 0;
        }
        else
         cout << "daneben\n";
      }
     }
     else
      cout << "Das war keine Zahl.\n";
    }
    


  • ich bekomme zwei fehlermeldungen

    #include <unistd.h> kann nicht geöffnet werden
    usleep ist nicht definiert



  • Du nutzt Windows? Dann musst du stattdessen windows.h inkludieren und Sleep nutzen, wobei Sleep nur im Millisekundenbereich arbeitet.



  • ja hat funktioniert. Wenn ich eine Zahl eingebe steht da: probiere 0.



  • tori1117 schrieb:

    ja hat funktioniert. Wenn ich eine Zahl eingebe steht da: probiere 0.

    Nicht immer so ungeduldig sein. Nach 100000 Millisekunden (knapp 2 min) probiert er 1. Ich würde das sleep ganz rausnehmen.


Anmelden zum Antworten