OOP berechnen und ausgeben?

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
Ach so. Jetzt habe ich dich verstanden.
Ja, i.d.R. gibt es noch ein Objekt, welches den Stack selbst repräsentiert, und die üblichen Methoden (Push, Pop, Peek) zur Verfügung stellt.
Falls du Interesse hast, kann ich dir ja mal den Stack schicken, welchen ich in VBA geschrieben habe (sehr rudimentär!)
 
Weil das nicht geprüft wird. Wie in deinem Script.
Das ist eine andere Anforderung. Du musst es halt anpassen, dass die Differenz berechnet wird und dazu gerechnet wird. Dann musst du aber auch den Rest, der kein Platz hat zurückgeben. Sonst weiss man nicht, was nicht mitfährt

Wie in etwa müsste denn die Anforderung aussehen? Und diese müsste dann sicherlich in Zeile 49 geprüft werden?
 
Mit dieser Struktur ist das schwer. Wie willst du aus der Klasse zurückgeben, wieviel kein Platz hat?
Kann man logisch einfach eine Menge aufteilen? "Dann versenden wir halt nur 99 von den 100, weil grad nicht mehr Platz ist".
Du brauchst eine Liste aller Waren die in den LKW sollten. Dann muss der LKW eine Liste haben was alles drin ist. Zu guter Letzt brauchst du nochmals eine Liste mit allem, was keinen Platz hatte.

PHP:
<pre>
<?php
class Ware{
    protected string $name;
    protected int $gewicht;
    public function __construct(string $iName, int $iGewicht){
        $this->name = $iName;
        $this->gewicht = $iGewicht;
    }
    public function getName() :string{return $this->name;}
    public function getGewicht() :int{return $this->gewicht;}
}

class Lkw
{
    protected int $maxGewicht= 0;
    protected $stack = array();
   
    public function __construct(int $iMaxGewicht = 40000){  $this->maxGewicht = $iMaxGewicht;}       
    public function getStack() :array{                      return $this->stack;}
   
    /**
     * Lädt eine einzelen Ware
     * @param Ware      $iWare
     * @return int      Restmenge, die kein Platz hatte
     */
    protected function addToStack(Ware $iWare) :int{
        $rest = 0;
        $platz = $this->maxGewicht - $this->getGesammtGewicht();
       
        if($platz >= $iWare->getGewicht()){
            $this->stack[] = $iWare;
        }else{
            $this->stack[] = new Ware($iWare->getName(), $platz);
            $rest = $iWare->getGewicht() - $platz;
        }
        return $rest;
    }
   
    public function getGesammtGewicht(){
        return array_reduce($this->stack, function($sum, $ware){
            $sum += $ware->getGewicht();
            return $sum;
        });
    }
   
    /**
     * Fügt eine Liste von Waren in den LKW und gibt eine Liste mit den Restwaren die kein Platz hatten zurück
     * @param array<Ware>   $iWaren
     * @return array<Ware>
     */
    public function beladen(array $iWaren) :array{
        $restWaren = $iWaren;
        //Abarbeiten bis entweder keine Waren mehr da sind oder der LKW voll ist.
        do  {
            $ware = array_shift($restWaren);            //Erste Ware herausnehmen
            if(is_null($ware)) break;                   //Wenn nix mehr im Stack war, abbrechen  
            $restGewicht = $this->addToStack($ware);    //Ware in den LKW laden
            //Wenn ein Rest bleibt, dann den Rest wieder an den ANfang der Liste setzen
            if($restGewicht > 0) array_unshift($restWaren, new Ware($ware->getName(), $restGewicht));
        } while($restGewicht == 0);
        return $restWaren;
    }
   
    public function entladen(){$this->stack = array();}
}

$waren = array();

$waren[] = new Ware("Bier", 35000);
$waren[] = new Ware("Schnaps", 7000);
$waren[] = new Ware("Tabak", 1500);


$lkw = new Lkw(40000);
$restWaren = $lkw->beladen($waren);

echo("<h3>Alle Waren</h4>");
print_r($waren);
echo("<h3>Waren im LKW</h4>");
print_r($lkw->getStack());
echo("<h3>Restliche Waren</h4>");
print_r($restWaren);
?>
</pre>
Code:
[HEADING=2]Alle Waren[/HEADING]
Array
(
    [0] => Ware Object
        (
            [name:protected] => Bier
            [gewicht:protected] => 35000
        )

    [1] => Ware Object
        (
            [name:protected] => Schnaps
            [gewicht:protected] => 7000
        )

    [2] => Ware Object
        (
            [name:protected] => Tabak
            [gewicht:protected] => 1500
        )

)
[HEADING=2]Waren im LKW[/HEADING]
Array
(
    [0] => Ware Object
        (
            [name:protected] => Bier
            [gewicht:protected] => 35000
        )

    [1] => Ware Object
        (
            [name:protected] => Schnaps
            [gewicht:protected] => 5000
        )

)
[HEADING=2]Restliche Waren[/HEADING]
Array
(
    [0] => Ware Object
        (
            [name:protected] => Schnaps
            [gewicht:protected] => 2000
        )

    [1] => Ware Object
        (
            [name:protected] => Tabak
            [gewicht:protected] => 1500
        )

)
 
Zuletzt bearbeitet:
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
Zurück