brute force programm schreiben



  • 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