Wer wird Millionär in C++

scooter010 schrieb:
Ich muss gestehen, ich habe keine Lust jetzt noch die "Fleißarbeit" der richtigen Initialisierung der Funktionen und Deklaration Namensräume sowie benötigter include zu machen. Einfach mal http://www.cplusplus.com/reference/cstdlib/srand/ schauen.
Ergänzung ()

Kleiner Fehler:
C++:
int naechsteFrage(int* gestellteFragen){
    int gewuerfelteFrage = srand%40;
    for(int i = 0; i<15; i++){
        if(gestellteFragen[i] != gewuerfelteFrage)
        else
            gewuerfelteFrage = naechsteFrage(gestellteFragen); // <-- Änderung
    }
    return gewuerfelteFrage;
}


Vielen Dank, schaue mir das alles an, aber wie gesagt ich verstehe was du da geschrieben hast. Mein Problem ist einfach im Moment, dass ich ich nicht drauf komme die Sachen so umzusetzen.

C++:
int naechsteFrage(int* gestellteFragen){
    int gewuerfelteFrage = rand() % 40;
  srand( static_cast<unsigned int>(time(NULL)));
    for(int i = 0; i<15; i++){
        if(gestellteFragen[i] != gewuerfelteFrage)
        {
            else
               gewuerfelteFrage = naechsteFrage(gestellteFragen);
            
    return gewuerfelteFrage;
}


Hoffe das funktioniert so mit dem srand.
 
Das S in srand steht für seed. Der seed in einen Pseudozufallsgenerator bestimmt die zahlen Sequenz deswegen wird rand() beim ersten call immer die gleiche zahl liefer. es ist normal srand() einmal am Anfang in der main() zu callen. sonst könntest du einfach nur die Zeit nehmen. zum testen und entwickeln bietet es sich an immer die gleichen Zahlen zu nutzen also srand(1) und später srand(time());

Klammern treten immer paarweise auf.

Das ist C code kein C++ code.
int naechsteFrage(..){...}

c++11 hat library eine function std::shuffle und std::sample in c++17. ich empfehle dir eine dieser function nach zu programmieren. wenn dein Fragen array gemischt ist kannst du einfach die ersten 15 fragen nehmen.

Grundsätzlich solltest du erst in einer Reference zur Sprache nachlesen und wenn es dir dann noch unklar ist fragen, nicht andersherum.

https://en.cppreference.com
http://www.cplusplus.com/reference/
https://docs.microsoft.com/en-us/cpp/cpp/cpp-language-reference?view=vs-2017
 
  • Gefällt mir
Reaktionen: my1096, BeBur und new Account()
Gibt zwei praktikable Lösungsansätze für das Problem:
1. Das Array zufällig vermischen (shuffle) und dann die ersten 15 Fragen ziehen.

2. immer rand() % array::size verwenden und dann eine gestellte Frage aus dem Array mittels list::splice entfernen. Dadurch wird das Array sozusagen solange "verzehrt", bis die Abbruchbedingung erfüllt sind (15 Fragen, Fragekatalog leer, etc.)
 
  • Gefällt mir
Reaktionen: new Account(), my1096 und BeBur
Wie schön, das die letzten zwei Antworten hier stehen und bisschen was dazu sagen.

Neben der inhaltlichen Korrektheit gibt es einige Dinge, auf die man an dieser Stelle gerne achten möchte. Lesbarkeit und Wartbarkeit stehen ganz weit oben.
CPU Cycles einsparen oder Compiler-Optimierungen ermöglichen (bzw. darauf hoffen) steht nichtmal auf dieser Liste drauf, von daher solltest du nichts in dieser Richtung machen/übernehmen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: my1096
Guten Morgen erstmal,

also ich denke, dass mit dem srand habe ich soweit verstanden und werde es auch damit versuchen.

Aber was mir im Code noch unverständlich ist:

if (gestellteFragen != gewuerfelteFrage)
{
// Hier müsste doch noch ne Anweisung stehen? Sprich, wenn die gestellte Frage ungleich die gewürfelte Frage ist...
}

Müsste dann die gestelle Frage nicht gleich nächste Frage sein?
 
Gute Ansätze. Array durchmischen kannte ich noch gar nicht als Funktion. Wieder was gelernt. Ich bin eben kein Programmierer sondern Maschinenbauer :) @my1096 Nein.
if(gestellteFragen != gewuerfelteFrage) // Ist die gewurfelte Frage !nicht! im Array der bereits gestellten Fragen enthalten
{}//mache nichts
else {// Hat er wieder erwarten doch einen Treffer, also die Frage wurde bereits gestellt
gewuerfelteFrage = naechsteFrage(gestellteFragen); //Rufe die Funktion erneut auf
}
Wenn nach if bzw. else nur eine einzige Anweisung kommt, kann man sich die {} jeweils sparen.
 
my1096 schrieb:
Müsste dann die gestelle Frage nicht gleich nächste Frage sein?
Vielleicht ist der Code in der folgenden Form leichter verständlich:
Code:
int naechsteFrage(int* gestellteFragen)
{
    int gewuerfelteFrage = rand() % 40;
    for (int i = 0; i < 15; i++)
    {
        if (gestellteFragen[i] == gewuerfelteFrage)
        {
            return naechsteFrage(gestellteFragen);
        }
    }
    return gewuerfelteFrage;
}
Es wird einfach so lange gewürfelt, bis man eine Frage erwischt, die noch nicht gestellt wurde.
Das funktioniert zwar, ist aber nicht besonders elegant.
 
Zuletzt bearbeitet:
Zurück
Oben