Tabelle mit Zufallszahlen erzeugen



  • hi ihr freaks 😉

    ich habe folgendes Problem, ich komme mit der Sprache echt nicht zu Recht, muss das aber durch ziehen, weil das zur AUsbildung gehört....

    kann mir bitte eine/r dabei helfen, den richtigen Weg zu finden um den Queltext für eine Tabelle mit Zufallszahlen zu programmieren?!

    Die Aufgabenstellung lautet:

    Tabelle mit zum Beispiel 1000 Zufallszahlen erzeugen..
    es muss eine bestimmte Zahl gesucht werden, vom Benutzer...
    Ausgabe soll sein, die gesuchte Zahl kam in dem und dem Feld vor und kam x-Mal vor

    also zum Beispiel ich suche nach einer 5, bei 1000 Zufallszahlen, diese 5 kam in dem und dem Feld vor und wurde 15 mal erzeugt, die Aufageb ist mir klar, aber ich weiß echt nicht wo ich anfangen soll..

    ich kenn nur den Anfang mit #include... 😢

    und deklaration

    alles andere, da bleibt es schon hängen, ich weiß nur noch, dass das irgendwie mit arrays gemacht wird...

    könnt ihr mir bitte helfen?

    wäre echt super dankbar!

    Gruß

    Waldemar



  • Zufallszahlen erzeugen kannst du mit man: rand() (benötigt <cstdlib> und liefert Werte von 0 bis RAND_MAX), das solltest du allerdings bei Programmstart mit "srand(time(NULL));" initialisieren.

    Zum Werte speichern könntest du einen STL-Container (vector, list, multiset?) verwenden und dann dort durchgehen und Werte vergleichen.



  • Z.B. so:

    #include<iostream>
    #include<vector>
    #include<ctime>
    
    int main()
    {
        srand(time(0)); // Initialisieren von rand()
        std::vector<int> Tabelle; // Array
        for(int i = 0; i < 1000; i++) // Fülle das Array mit 1000 Werten
        {
            Tabelle.push_back(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;
        std::vector<int>::iterator iT = find(Tabelle.begin(), Tabelle.end(), GesuchteZahl); // Suche die Zahl
        if(iT == Tabelle.end()) // 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.end()) // Solange wir nicht am Ende sind
            {
                std::cout << iT - Tabelle.begin() + 1 << "\n"; // Gibt die Position der Zahl aus
                iT = find(iT + 1, Tabelle.end(), GesuchteZahl); // Sucht nach der nächsten
                Anzahl++;
            }
            std::cout << "Die Zahl kam insgesamt " << Anzahl << " mal vor." << std::endl;
        }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    mfg.



  • super gut hausaufgaben gelöst 👎

    naja, wenigstens kann er das programm nicht erklären 😉 wenn ihn jmd frägt

    hmm ist eine tabelle nicht ein 2d objekt?

    und warum schreibst du variablen teils gross? gefällt mir nicht.



  • ajax schrieb:

    super gut hausaufgaben gelöst 👎

    naja, wenigstens kann er das programm nicht erklären 😉 wenn ihn jmd frägt

    hmm ist eine tabelle nicht ein 2d objekt?

    Ja, ich wusste jetzt aber nicht was die da in der Aufgabenstellung meinen.

    und warum schreibst du variablen teils gross? gefällt mir nicht.

    Meinst du z.B. GesuchteZahl? Ich finde das kann man besser lesen als gesuchtezahl. Oder meinst du ich sollte gesuchteZahl schreiben?

    mfg.



  • hi ihr

    danke erst mal für die lösung, nur damit kann ich nur die hälfte anfangen..

    @ ajax, fragt schreibt man mit a und nicht ä

    was hausaufgaben angeht, wenn ich das nicht verstehe dann frage ich, und ich kopiere mir nicht einfach so den queltext, sondern passe meinen an, weil der lehrer ist ja uch nicht dumm und wird sehen, dass es nicht von mir kommt!

    danke @ joomoo erst mal

    ich probiere aus!



  • also, ich habe jetzt bisschen den quelcoe überarbeitet, mit den vctor kann ich nichts anfangen, wie kann man das programm weiter unkompliziert vervollständigen?

    mir fehlt so zusagen das gehirn beim programm..

    hier ist von mir erstellte quelcode:

    #include <iostream.h>
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    
    int main(void)
    {
    
    int iTabelle=[10];
    int i=0;
    int iGesuchteZahl=0;
    int iAnzahl=0;
    int iFeldnummer=0;
    
    cout<<\n Die Zufallszahen werden erzeugt";
    
    for (i=0; i<10; i++)
    
         {
           iTabelle[i]=(rand()%10);
           cout<<iTabelle[i]<<"\t";
          }
    
            cout<<"Bitte geben Sie eine Zahl ein, nach der gesucht werden soll:" ;
            cin>>iGesuchteZahl;
    
            //die Anweisung zum suchen fehlt mir?????
            //gitbs da eine einfachere Lösung, also ohne vector?
    
           cout<<"Die gewuenschte Zahl kam insgesamt "<<iAnzahl<<" mal vor und wurde in den Feldern"<<iFeldnummer<<" angezeigt";
    
           //kann man das so mit den Feldern einrichten?
    
           cour<<endl;
           cout<<endl;
    
      }
    
      getchar();
    
    }
    


  • Erstens heißt das "int iTabelle[10];" (ohne Gleichheitszeichen), wenn du unbedingt mit C Arrays arbeiten willst. Zweitens achte mal auf die Farben in deinem Quelltext - richtig, da ist ein String nicht richtig abgeschlossen (bzw. geöffnet) worden.

    Und drittens:

    for(i=0;i<10;++i)
      if(iTabelle[i]==iGesuchteZahl)
        //mach was - an Position i steht die richtige Zahl
    


  • 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