OOP berechnen und ausgeben?

Brutos66735

Grünschnabel
Hallo zusammen,
ich hätte mal paar Fragen zu oop bin schon richtig confused, und zwar habe ich einen LKW (40 Tonnen) der 3 mögliche Waren laden kann, die Ausgabe sollte folgendermaßen ablaufen.

Die Waren werden nacheinander geladen ware1 -> ware2 -> ware3.
Sobald der Frachtraum mit einer Ware vollbeladen ist, wird keine weitere Ware mehr geladen.

Text Ausgabe z. B.
Der LKW hat folgende Ware geladen 35.000 von $ware1und 5.000 von $ware2 0 von $ware3

Was würdet ihr mir als Tipp oder Rat geben?

Hier mal mein Script

Lg Dirk

PHP:
<?php
$ware1 = 35000;    
$ware2 = 7000;
$ware3 = 1500;

class LKW{
protected $frachtraum = 0;
const FRACHTRAUM_MAX = 40000;
public function __construct() 
{
$this->typ = __Class__; }   
public function beladen($last){
if(($this->frachtraum + $last) > self::FRACHTRAUM_MAX){
echo 'Soviel Ware kann der Frachtraum nicht laden'.(($this->frachtraum + $last) - self::FRACHTRAUM_MAX).' Einheiten passen nicht in den Frachtraum!';}
else {
$this->frachtraum  += $last;}}         
public function entladen(){ 
$this->frachtraum = 0;}}
                   
// AUSGABE
$LKW1 = new LKW;
$LKW1->beladen($ware1);
echo "<br>";
$LKW1->beladen($ware2);
echo "<br>";
$LKW1->beladen($ware3);

//var_dump($LKW1->beladen($ware3));
?>
 
Lösung
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()...
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:
Lösung
Zurück