Die kleinste von 8 Variablen löschen?



  • 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.



  • raii schrieb:

    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.

    Ich finde es gerade blöd, einen Anfänger zu sehr vor den grundlegen Prinzipien der Computerei abzuschirmen. Aber darüber gibt es ja verschiedene Ansichten.

    Ich vermute mal, dass alle Top-Coder ziemlich zu Anfang eine Phase hatten, in der sie sich ausgiebig mit LowLevel-Zeugs und Maschinensprache beschäftigten. Sicher kann man das auch später lernen, aber dann baut man IMHO nicht die Assoziationen auf, die für ein Tiefenverständnis wichtig sind.



  • wob schrieb:

    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.

    Echt? So richtig mit "alle nachfolgenden verschieben"?! Ist das die einzige Möglichkeit, etwas aus einem vector/array zu "löschen"?
    Deshalb vielleicht besser erstmal die Grundlagen lernen.
    Und wozu muss man die Größe mittracken?? Sie ist vorher 8 und nach dem "rauslöschen" 7. Fertig.
    Das hochkomplizierte Rauslöschen des Arrayelements an Position p geht übrigens mit

    arr[p]=arr[7];
    


  • volkard schrieb:

    Das hochkomplizierte Rauslöschen des Arrayelements an Position p geht übrigens mit

    arr[p]=arr[7];
    

    Kannst du das bitte erläutern?

    Demnach wäre arr[7] doch unlöschbar bzw. immer gelöscht.
    Ich kann deine Gedanken nicht nachvollziehen. 😞



  • Andromeda schrieb:

    volkard schrieb:

    Das hochkomplizierte Rauslöschen des Arrayelements an Position p geht übrigens mit

    arr[p]=arr[7];
    

    Kannst du das bitte erläutern?

    Demnach wäre arr[7] doch unlöschbar bzw. immer gelöscht.
    Ich kann deine Gedanken nicht nachvollziehen. 😞

    LOL, du bist wohl auch nicht so der "Freund kleiner, angepasster und ultraperformanter Lösungen". Ne, lass mal lieber ne If-Abfrage bei jeder Nutzung des Arrays einfügen. Du solltest wirklich mal einen Gang zurückschalten.



  • m.e. schrieb:

    LOL, du bist ...

    Nix LOL. Sag wie das funktioniert und lass mich nicht dumm sterben. 🙂



  • damit ist gemeint, dass du einfach das letzte element für ungültig erklärst.

    du hast also ein array arr mit den elementen arr[0]...arr[7], findest irgendwie heraus, dass bspw. arr[3] das kleinste ist und kopierst dann den wert von arr[7] nach arr[3].

    natürlich sollte das programm dann wissen, dass arr[7] ungültig ist, z.b. mit der zuweisung letztes_array_element=6;

    edit: die vector-klasse in c++ macht eigentlich nichts anderes.
    der unterschied ist einfach, dass sich da schonmal jemand die arbeit gemacht hat, dieses prinzip zu programmieren, damit sich andere leute nicht mehr damit beschäftigen müssen und gleich loslegen können.



  • HansKlaus schrieb:

    du hast also ein array arr mit den elementen arr[0]...arr[7], findest irgendwie heraus, dass bspw. arr[3] das kleinste ist und kopierst dann den wert von arr[7] nach arr[3].

    Okay, das funktioniert doch aber nur, wenn alle Werte unterschiedlich sind.

    Von dieser Einschränkung erwähnte der Fragesteller nichts, wie ich das in Erinnerung habe.



  • naja er erwähnte in seinem beispiel, dass eine der beiden kleinsten zahlen gelöscht werden soll. das wird dann im einfachsten fall diejenige sein, die weiter vorne steht.



  • HansKlaus schrieb:

    naja er erwähnte in seinem beispiel, dass eine der beiden kleinsten zahlen gelöscht werden soll. das wird dann im einfachsten fall diejenige sein, die weiter vorne steht.

    Er erwähnte in seinem Beispiel, dass alle Zahlen über "rand()%6+8" erzeugt werden. Dass alle Zahlen unterschiedlich sind, ist sehr unwahrscheinlich und im schlimmsten Fall können sogar alle gleich sein.


Anmelden zum Antworten