myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   Zahl bereits vorhanden? (https://mygully.com/showthread.php?t=3278719)

depream 07.04.14 12:07

Zahl bereits vorhanden?
 
Hallo,
ich habe ein Problem mit einem C++ Programm.
Wollte überprüfen ob die Zahl bereits vorhanden ist.

Code:

#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
    vector<int> ziehung;
    int rand_zahl;
    bool ist_vorhanden;

    for (int i = 0; i < 20; i++) {
        rand_zahl = rand() % 20;               
        for (int j=0; j<20; j++) {
            if (rand_zahl==ziehung.at(j)) {
                ist_vorhanden = true;
            }
            else {
                ist_vorhanden = false;
            }
        }

        if (ist_vorhanden == false) {
            ziehung.push_back(rand_zahl);
        }
    }
}

Möchte folgendes erreichen:
Wenn die Zahl bereits vorhanden ist, soll er diese Zahl nicht reinschreiben, aber trotzdem insgesamt 20 Zahlen in den Vector packen.

Danke im Vorraus.

spartan-b292 07.04.14 12:49

Du überprüfst nicht alle Elemente in 'ziehung', du überprüfst immer nur das Element an der Stelle'j'.

EDIT: Außerdem ist das was du da machst relativ Sinnfrei da du 20 "zufällige" zahlen zwischen 0 und 19 generierst. Was zur Folge hat das jede Zahl einmal vorkommt.

depream 07.04.14 15:19

aber da ist doch eine for-schleife die hochzählt (eine zweite for-schleife).
ja dieses mit dem modulo war falsch, sollte 100 sein.. (zahlen von 0-100).
aber sollte eben nicht doppelt im vector vorkommen.

spartan-b292 07.04.14 15:38

In deiner for-Schleife überprüfst du ob an dieser stelle des Vektors deine Zahl 'rand_zahl' steht. Da der Vektor aber leer ist kann an dieser Stelle nicht deine Zahl stehen, also wird die Zahl auch immer an den Vektor angehängt.

depream 09.04.14 00:33

Habe meinen Code etwas erweitert und er funktioniert im bereich "Zahl bereits vorhanden?" ohne jegliche Probleme.

Meine nächste Frage wäre, ich möchte das es den Vector so lange füllt, bis der Vector X Zahlen hat.

Wenn ich bei "ziehung.size() <= 5" mache, füllt er mir jedoch 6 Zahlen auf.. Er macht also quasi immer meinen Wunsch + 1.

Code:

#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
    vector<int> ziehung;
   
    int rand_zahl;
    bool ist_vorhanden;
    bool is_greater;

    while (ziehung.size() <= 5) {
       
        rand_zahl = rand() % 100000;
       
        if (rand_zahl > 50) {
            is_greater = true;
        }
        else {
            is_greater = false;
        }
       
        for (int i = 0; i < ziehung.size(); i++) {
            if (ziehung.at(i) == rand_zahl) {
                ist_vorhanden = true;
            } else {
                ist_vorhanden = false;
            }
        }
        if (!ist_vorhanden && !is_greater) {
            ziehung.push_back(rand_zahl);
        }

    }
   
        for (int j = 0; j < ziehung.size(); j++) {
            cout << (ziehung.at(j)) << "  ";
        }
}


Zerafir 09.04.14 02:00

Er macht immer einen mehr als du willst, weil du ziehung.size() <= 5 abfragst.
Somit muss ziehung.size mindestens 6 zurückgeben, damit deine while-Schleife aufhört und in dem Moment befinden sich ja bereits 6 Zahlen in deinem Vector, da ziehung.size die aktuelle größe deines Vectors zurückgibt.

depream 09.04.14 10:57

wenn ich den int-Wert 5 als const deklarieren würde, müsste ich also "5-1" machen.

Code:

const int maximum_size = 5;
while (ziehung.size() <= (maximum_size - 1) { ... }

hätte ich eigentlich eine alternative dafür um es genau mit einem konstanten zu erledigen?

spartan-b292 09.04.14 11:03

Wenn ich nicht falsch verstanden habe was du willst, ist das rigendwie zu kompliziert was du da machst:

Code:

#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
        vector<int> ziehung;
        int rand_zahl=0;
        int count=0;
        srand((unsigned)time(NULL));
       
        while (count < 20) {
                rand_zahl = rand() % 100;
                if(!(find(ziehung.begin(), ziehung.end(), rand_zahl) != ziehung.end())) {
                        /*zahl noch nicht vorhanden*/
                        ziehung.push_back(rand_zahl);
                        count ++;
        }
}
return 0;
}

Das liefert dir 20 zufällige Zahlen.

cinq 09.04.14 14:06

Zitat:

Zitat von depream (Beitrag 25486302)
wenn ich den int-Wert 5 als const deklarieren würde, müsste ich also "5-1" machen.

Wieso schreibst du nicht einfach <5 , damit hättest du 5 Zahlen.
Bei Java fängt er immer bei 0 an ,wird bei C++ sicher nicht anders sein.
Das ist dann auch der Grund wieso du 6 Zahlen bekommst weil du ja schreibst
<= 5 somit hast 0,1,2,3,4,5 ; mit <5 bekommste 0,1,2,3,4 also deine 5 Zahlen.

Berlin1992 09.04.14 17:52

Zitat:

Zitat von cinq (Beitrag 25486739)
Bei Java fängt er immer bei 0 an ,wird bei C++ sicher nicht

Stimmt, weil Sun für Java die C-Syntax zu 100% abgekupfert hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:55 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.