Die kleinste von 8 Variablen löschen?



  • Hallo,

    Ich möchte ein Kleines Spiel programmieren. Dafür möchte ich gerne 8 zufällige Zahlen erzeugen und die kleinste davon soll ermittelt werden und nicht weiter benutzt werden.

    Mein Frage: Könnt ihr mir einen Tipp geben wie man das elegant lösen kann? Mir fällt nur eine Lösung ein wo ich unglaublich viele if oder else if Bedingungen machen müsste.

    Beispiel:

    int a,b,c,d,e,f,g,h;

    a = (rand()%6)+1+7;
    b = (rand()%6)+1+7;
    c = (rand()%6)+1+7;
    d = (rand()%6)+1+7;
    e = (rand()%6)+1+7;
    f = (rand()%6)+1+7;
    g = (rand()%6)+1+7;
    h = (rand()%6)+1+7;

    Das Ergebnis:

    a= 9
    b= 9
    c= 11
    d= 13
    e= 8
    f= 11
    g= 10
    h= 8

    Hier soll dann e oder h rausgeschmissen werden. Ich habe das hier absichtlich so gewählt das 2 Variablen den minimal Wert hat da das durch aus passieren kann.

    Schon mal danke 🙂



  • Hi

    Ich würde da ein Array verwenden, die 8 Werte reinschreiben, das Array sortieren und dann die ersten 7 Werte verwenden.

    PS. Hier noch ein getestetes Beispiel:

    int value[8];
    
    	// array füllen
    	for(int i = 0; i < 8; i++)
    		value[i] = (int)rand() % 100;
    
    	// array sortieren
    	for(int i = 0; i < 7; i++)
    	{
    		for(int y = i + 1; y < 8; y++)
    		{
    			if(value[i] < value[y])
    			{
    				int v = value[i];
    				value[i] = value[y];
    				value[y] = v;
    			}
    		}
    	}
    
    	// in value[0] steht jetzt der größte und in value[7] der kleinste Wert
    

    Gruß
    Franz



  • Nimm einen Vector, da kannst du die Werte richtig entfernen.



  • Wie wärs mit C++11-Style random?

    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <random>
    #include <vector>
    
    using namespace std;
    
    int main() {
        mt19937 random_gen((random_device())());
        vector<int> random_values;
        generate_n(back_inserter(random_values), 8,
                [&random_gen]() {
                    uniform_int_distribution<int> d(8, 13);
                    return d(random_gen);
                });
        random_values.erase(min_element(random_values.begin(), random_values.end()));
        copy(random_values.begin(), random_values.end(), ostream_iterator<int>(cout, "\n"));
    }
    


  • Danke Leute,

    ich denke mal ich neheme erst mal das mit der Array, programmiere noch nicht so lange und muss mir das mit den Vektoren erst noch aneignen 🙂



  • Mit Array ist es tendenziell komplizierter als mit einem vector. Da du hier im C++-Forum bist, würde ich dir raten, erst vector zu lernen und C-Style Arrays zunächst völlig zu ignorieren. Denn ansonsten lernst du eher C als C++.



  • wob schrieb:

    Mit Array ist es tendenziell komplizierter als mit einem vector. Da du hier im C++-Forum bist, würde ich dir raten, erst vector zu lernen und C-Style Arrays zunächst völlig zu ignorieren. Denn ansonsten lernst du eher C als C++.

    Unfug.



  • Welcher Teil davon soll Unfug sein? Begründung?

    Begründung von mir:
    zu "Mit Array ist es tendenziell komplizierter als mit einem vector.":

    Bei einem Array musst du von Hand die Größe mittracken und vor allem nach dem Löschen des kleinsten Elementes alle nachfolgenden verschieben. v.erase() ist wesentlich einfacher.

    zu: "Da du hier im C++-Forum bist, würde ich dir raten, erst vector zu lernen und C-Style Arrays zunächst völlig zu ignorieren. Denn ansonsten lernst du eher C als C++."

    Man darf in C++ auch sehr gerne Klassen und insbesondere auch die STL benutzen. Benutzt man weder Klassen noch die STL, kann man auch gleich C nehmen.

    Und gerade Anfänger müssen sich bei variabel großen Arrays auch noch um Speichermanagement kümmern -> all das braucht man bei vector nicht. Es ist also wesentlich einfacher.

    Ich sehe daher keinen Grund, ein Array statt eines std::vectors zu nehmen (höchstens ein std::array, aber darum ging es hier ja nicht).



  • wob schrieb:

    Welcher Teil davon soll Unfug sein? Begründung?

    Begründung von mir:
    zu "Mit Array ist es tendenziell komplizierter als mit einem vector.":

    Gar nicht. Musst das Array ein Mal durchrattern, bei jedem Schritt den Wert mit dem bisher gespeicheten Kleinsten vergleichen und falls er kleiner ist, Wert und Array-Index merken. Und am Schluss dann den Wert auf den der gespeicherte Index zeigt auf 'gelöscht' setzen.

    Das ist eine einfache kleine Funktion. 🙂



  • Andromeda schrieb:

    Gar nicht. Musst das Array ein Mal durchrattern, bei jedem Schritt den Wert mit dem bisher gespeicheten Kleinsten vergleichen und falls er kleiner ist, Wert und Array-Index merken. Und am Schluss dann den Wert auf den der gespeicherte Index zeigt auf 'gelöscht' setzen.

    Das ist eine einfache kleine Funktion. 🙂

    was bedeutet "auf 'gelöscht' setzen"? Wie soll das konkret bei eine C-Array aussehen?

    Man könnte natürlich smart pointer verwenden. Dann muss man aber wiederum bei jedem Aufruf prüfen, ob der Wert gültig ist. Klingt für mich nach übertriebenem Overkill.



  • daddy_felix schrieb:

    was bedeutet "auf 'gelöscht' setzen"? Wie soll das konkret bei eine C-Array aussehen?

    Man nehme einen Wert ausserhalb der Menge der gültigen Werte.



  • Diskutiert ihr jetzt ernsthaft darüber, ob man bei einem Container mit variabler Anzahl von Elementen ein Vector nimmt oder ein Array mit 'ich setze Werte die zZ nicht gültig sind'?



  • Jockelx schrieb:

    Diskutiert ihr jetzt ernsthaft darüber, ob man bei einem Container mit variabler Anzahl von Elementen ein Vector nimmt oder ein Array mit 'ich setze Werte die zZ nicht gültig sind'?

    Sieht ganz so aus. 🙂



  • Andromeda schrieb:

    Jockelx schrieb:

    Diskutiert ihr jetzt ernsthaft darüber, ob man bei einem Container mit variabler Anzahl von Elementen ein Vector nimmt oder ein Array mit 'ich setze Werte die zZ nicht gültig sind'?

    Sieht ganz so aus. 🙂

    Klang für mich übrigens ziemlich contra Array.



  • raii schrieb:

    Klang für mich übrigens ziemlich contra Array.

    Du bist also eher nicht so der Freund kleiner, angepasster und ultraperformanter Lösungen, sondern legst mehr Wert auf Universallösungen.

    Deine Meinung sei dir gegönnt. 🙂

    Ich stehe eher auf dem Standpunkt eines Users hier, der in seiner Sig folgenden Spruch hat/hatte: "die dümmsten Programmierer schreiben die dicksten Programme".

    Das lässt sich sogar noch auf die Spitze treiben, wie ein Freund von mir zu sagen pflegt: "die beste Software ist keine Software".



  • Nun ja, im nächsten Fall, in dem wir dann alle eine Funktion brauchen, die aus 8 Zahlen mit beschränkten Gültigkeitswerten die kleinsten Werte auf ungültige Werte setzt, können wir ja dann alle ein Array verwenden.

    Obwohl, ich glaub nicht mal dann wäre es mir die "Performance" wert.



  • raii schrieb:

    Nun ja, im nächsten Fall, in dem wir dann alle eine Funktion brauchen, die aus 8 Zahlen mit beschränkten Gültigkeitswerten die kleinsten Werte auf ungültige Werte setzt, können wir ja dann alle ein Array verwenden.

    Wieso "alle ein Array verwenden"?
    Du nimmst einfach das, was am besten zu den Anforderungen passt.



  • Andromeda schrieb:

    Das lässt sich sogar noch auf die Spitze treiben, wie ein Freund von mir zu sagen pflegt: "die beste Software ist keine Software".

    Also im vorliegenden Fall: "Generier nur sieben Zahlen."



  • Generatorix schrieb:

    Andromeda schrieb:

    Das lässt sich sogar noch auf die Spitze treiben, wie ein Freund von mir zu sagen pflegt: "die beste Software ist keine Software".

    Also im vorliegenden Fall: "Generier nur sieben Zahlen."

    Oder: "achte beim Erzeugen darauf, dass die kleinste Zahl nur ein Mal vorkommt". 🙂



  • Andromeda schrieb:

    Wieso "alle ein Array verwenden"?
    Du nimmst einfach das, was am besten zu den Anforderungen passt.

    Ja ich schon. OP auch? Vermutlich nicht.
    Daher ist der Vorschlag erstmal einen vector zu benutzen für einen Anfänger völlig richtig und nachvollziehbar. Zumal es sogar in den unwahrscheinlichen Fällen, dass ein Array ohne zusätzliche, lästige Aufgaben verwendet werden kann, immer noch völlig korrekt und sauber ist, ein vector oder ähnliches als container zu verwenden.


Log in to reply