Tabelle mit Zufallszahlen erzeugen



  • Die find Funktion funktioniert auch für C-Arrays:

    #include<iostream>
    #include<algorithm> /* Für std::find */
    #include<ctime>
    
    int main()
    {
        srand(time(0)); // Initialisieren von rand()
        int Tabelle[1000]; // C-Array
        for(int i = 0; i < 1000; i++) // Fülle das Array mit 1000 Werten
        {
            Tabelle[i] = rand() % 10; // Zufallszahl von 0 bis 9
            std::cout << Tabelle[i] << "\t"; // Das ganze wird am Anfang einmal ausgegeben
        }
        std::cout << "\nBitte geben sie eine Zahl ein, nach der gesucht werden soll: ";
        int GesuchteZahl;
        std::cin >> GesuchteZahl;
        int *iT = std::find(Tabelle, Tabelle + 1000, GesuchteZahl); // Suche die Zahl
        if(iT == Tabelle + 1000) // Wenn sie nicht enthalten ist
        {
            std::cout << "Diese Zahl ist nicht enthalten.";
        }
        else // Wenn sie mindestens einmal enthalten ist
        {
            int Anzahl = 0;
            std::cout << "Diese Zahl ist enthalten und wurde an folgenden Stellen gefunden:\n";
            while(iT != Tabelle + 1000) // Solange wir nicht am Ende sind
            {
                std::cout << iT - Tabelle + 1 << "\n"; // Gibt die Position der Zahl aus
                iT = std::find(iT + 1, Tabelle + 1000, GesuchteZahl); // Sucht nach der nächsten
                Anzahl++;
            }
            std::cout << "Die Zahl kam insgesamt " << Anzahl << " mal vor." << std::endl;
        }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    mfg.



  • Ist das jetzt einfacher oder komplizierter ?

    #include <algorithm>    // generate_n, count
    #include <cstdlib>      // rand
    #include <ctime>        // time
    #include <iostream>
    #include <iterator>     // back_inserter, distance
    #include <vector>
    
    using namespace std;
    
    template< unsigned N >
    struct ZufallsGenerator  // generiert zufällige int-Zahlen im Intervall von [0,N)
    {
        ZufallsGenerator() { srand( unsigned(time(0)) ); }
        int operator()()
        {
            return int( (double( rand() ) * N) / RAND_MAX );
        }
    };
    
    int main()
    {  
        vector< int > zz;
        // erzeugt 1000 Zufallszahlen im Bereich 0-700 und stecke sie in den vector 'zz'
        generate_n( back_inserter( zz ), 1000, ZufallsGenerator< 700 >() );
    
        for( int z; cout << "\nEine Zahl bitte (beenden mit 'x'): ", cin >> z; ) // Lese 'z'
        {
            // zähle (count) alle Zahlen in 'zz', die 'z' sind, und gib das Ergebnis aus
            cout << "Die Zahl " << z << " kommt " << int(count( zz.begin(), zz.end(), z )) << " mal vor" << endl;
            // Laufe über alle Zahlen in 'zz', finde eine Zahl 'z' und gebe den Index aus
            for( vector< int >::iterator i = zz.begin(); i = find( i, zz.end(), z ), i != zz.end(); ++i )
                cout << "  an " << int(distance( zz.begin(), i )) << "'ter Stelle " << endl;
        }
        return 0;
    }
    

    Gruß
    Werner



  • @Werner Saloman

    Ich hab mal eine Frage am Rande: Wo ist jetzt eigentlich der Unterschied, ob ich N als templete paramter oder als Parameter des Konstruktors übergebe??



  • linux_ubuntu schrieb:

    @Werner Saloman

    Ich hab mal eine Frage am Rande: Wo ist jetzt eigentlich der Unterschied, ob ich N als templete paramter oder als Parameter des Konstruktors übergebe??

    Als Template-Paramter ist N eine Konstante, die zur Compilezeit feststeht; bzw. feststehen muss. Übergibst Du sie als Parameter im Konstruktor, musst Du eine Winzigkeit mehr Code schreiben, wird ggf. eine Winzigkeit mehr Speicher benötigt - oder auch nicht.
    Und ansonsten ist das Geschmackssache und hängt davon ab, was man ansonsten noch mit der Klasse 'ZufallsGenerator' vor hat.

    Gruß
    Werner



  • hi ihr..

    also ich bedanke mich erst ein mal für eure schnelle hilfe...

    also was euren queltext angeht, bis zum vector ist noch alles klar, aber mit vector habe ich noch nie gearbeitet, geht das auch anders?



  • waldemator schrieb:

    also was euren queltext angeht, bis zum vector ist noch alles klar, aber mit vector habe ich noch nie gearbeitet, geht das auch anders?

    Warum willst Du es anders machen? Ich bin der Meinung, mit std::vector ist es gerade für Anfänger einfacher. Das gilt noch mehr für std::string versus char*; aber das ist ein anderer Thread, der hier gerade läuft.

    Gruß
    Werner



  • ganz einfach, weil wir noch nichts mit vector gemacht haben, ich kenne die funktion icht von vector, wir sind bei den arrays und da haben wir die aufgabe bekommen, also ich gehe nicht davon aus, dass der fachlehrer das so von uns haben will, weil er halt weiß, dass wir mit dem vector noch nichts gemacht haben, ich werde aber versuchen das programm so zum laufen zu bringen, und melde mich noch ein mal!

    danke noch mal!

    gruß



  • Ich hab doch eine Lösung ohne Vectors gepostet????? 😕

    mfg.



  • hi ihr, habe den queltext bissle angepasst, habe nur ein paar fragen....

    hier der quelcode:

    #include<iostream.h>
    #include <stdio.h>
    #include<algorithm> /* Für find */
    #include<time.h>
    
    int main()
    {
      int iTabelle[10];
      int iGesuchteZahl=0;
      int iAnzahl = 0;
    
        srand(time(0));
    
        for(int i = 0; i < 10; i++)
        {
            iTabelle[i] = rand() % 10; // Zufallszahl von 0 bis 9
            cout << iTabelle[i] << "\t"; // Das ganze wird am Anfang einmal ausgegeben
        }
            cout << "\nBitte geben sie eine Zahl ein, nach der gesucht werden soll: ";
    
         cin >> iGesuchteZahl;
        int *iT = find(iTabelle, iTabelle + 10, iGesuchteZahl); // Suche die Zahl
        if(iT == iTabelle + 10) // Wenn sie nicht enthalten ist
        {
            cout << "Diese Zahl ist nicht enthalten.";
        }
        else // Wenn sie mindestens einmal enthalten ist
        {
    
            cout << "Diese Zahl ist enthalten und wurde an folgenden Stellen gefunden:\n"; 
            while(iT != iTabelle + 10) // Solange wir nicht am Ende sind
            { 
                cout << iT - iTabelle + 1 << "\n"; // Gibt die Position der Zahl aus
                iT = find(iT + 1, iTabelle + 10, iGesuchteZahl); // Sucht nach der nächsten
                iAnzahl++;
            } 
            cout << "Die Zahl kam insgesamt " << iAnzahl << " mal vor." << endl;
        } 
         system("PAUSE"); 
        return EXIT_SUCCESS;
    }
    

    jetzt die fragen

    1. was bedeutet diese zeile konkret und wo war sie deklariert?
    -->int *iT = find(iTabelle, iTabelle + 10, iGesuchteZahl);

    weil wir deklarieren immer erst alles am anfang! wollte int *IT=find weg nehmen, aber es funzte dann nicht?! kann man das auch anders nennen? oder muss das *iT=find sein?

    2. ich schätze mal, das ist der teil, wo die kurze pause kommt und danach, drücken sie eine beliebige taste, oder?

    ist dieser Befehl fest oder kann man den auch verändern?

    oder was bedeutet diese beiden zeilen? --> system("PAUSE");
    return EXIT_SUCCESS;

    sonst läuft das programm wie geschmiert!

    wusste nicht wie ich das mit feldern und der genauen anweisung mache, eigenmtlich das wichtigste ....

    aber danke trotzdem!



  • waldemator schrieb:

    1. was bedeutet diese zeile konkret und wo war sie deklariert?
    -->int *iT = find(iTabelle, iTabelle + 10, iGesuchteZahl);

    Du deklarierst 'iT' als "Pointer to int" und weißt ihm gleich das Ergebnis des find()-Aufrufes zu (find nimmt drei Parameter: Start und Ende des Suchbereiches sowie gesuchter Wert)

    system("PAUSE");

    Hält das Programm an, bis der User auf die Enter-Taste drückt (das ist eine Option um zu verhindern, daß sich das Konsolenfenster bei Programmende sofort wieder schließt - bessere Lösungen findest du in der Konsolen-FAQ)

    return EXIT_SUCCESS;

    Beendet die aktuelle Funktion - in deinem Fall main() und damit das Programm und gibt den Wert EXIT_SUCCESS (=0) an den Aufrufer (Betriebssystem) zurück.



  • ich hab vor jahren auchmal sowas gemacht!(als übung)
    aber achtung, da sind höchstwahrscheinlich fehler drinne, und nen guter stil isses garantiert auch nicht! (aber als EINFACHER ansatz kann es ja dienen)

    int array[10][10];
    namespace own
    {
    void init()
    {
     time_t t;
     srand((unsigned)time(&t));
    
     for(int i=0;i<10;i++)
     {
      for(int j=0;j<10;j++)
      {
       array[i][j]=rand()%100;
      }
     }
    }
    }
    
    int main(int argc, char* argv[])
    {
    
     own::init();
     int summe=0;
     int zahl;
     bool exit = false;
     while(exit==false)
     {
     cin>>zahl;
     summe=0;
     if(zahl==0)
     {
      exit=true;
      break;
     }
     for(int i=0;i<10;i++)
     {
      for(int j=0;j<10;j++)
      {
       if(array[i][j]==zahl)
        {
         cout<<"Zahl gefunden in Koordinate "<<i<<":"<<j<<endl;
         summe++;
        }
      }
     }
    cout<<"Gefundene Zahlen:"<<summe<<endl;
    }
    cout<<"Beendet"<<endl;
    getch();
    
            return 0;
    }
    

    poste das nur, weil es eben eine 2d version ohne vector ist!


Anmelden zum Antworten