OOP berechnen und ausgeben?

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

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));
?>
 

Yaslaw

n/a
Moderator
Lieber Dirk. Kannst du bitte dein Script formatieren. So wie es da steht ist das nicht lesbar ohne Klammern zu zählen. Und wenn ich mit Klammern abzählen bin um herauszufinden was wo beginnt und was wo endet kann ich mich nicht auf denInhalt konzentrieren.
 

Brutos66735

Grünschnabel
Lieber Dirk. Kannst du bitte dein Script formatieren. So wie es da steht ist das nicht lesbar ohne Klammern zu zählen. Und wenn ich mit Klammern abzählen bin um herauszufinden was wo beginnt und was wo endet kann ich mich nicht auf denInhalt konzentrieren.
Hallo @Yaslaw,

ist es so besser?
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));
?>
 

Yaslaw

n/a
Moderator
Viel besser - merci.

Mache eine weitere Klasse für die Ware mit den Eigenschaften Name & Gewicht (und ev. weitere interessante Attribute).
Dann wird pro $wareX nicht nur eine Zahl definiert sondern eine Instanz der Klasse Ware.
Beim beladen übergibts du nicht nur ein Wert sondern die jeweiligen Instanzen und lädst diese im LKW in einen Array.
Somit kannst du später beim auswerten sehen, welche Ware du drin hast
 

Zvoni

Erfahrenes Mitglied
Nachtrag zu Yaslaw:
im konkreten Fall "LKW be-/entladen" hast du das LIFO-Prinzip (Last In - First Out), was von einem programmiertechnischen Standpunkt einem Stack entspricht, welches eine Alternative zum Array wäre
 

Brutos66735

Grünschnabel
@Yaslaw danke für deine Antwort aber irgendwie verwirrt es mich dennoch, hab jetzt eine Array erstellt und eine weitere Klasse, wie kann ich die beiden Klassen nun vergleichen? Oder ist mein Ansatz völlig falsch?

@Zvoni von dem LIFO Prinzip habe ich bisher noch nichts gehört, werde mir mal paar Sachen dazu durchlesen Danke!

Hier der neue Code
PHP:
<?php
$ware1 = 35000;
$ware2 = 7000;
$ware3 = 1500;


// Array
$ware = ['ware1' => $ware1, 'ware2' => $ware2, 'ware3' => $ware3];
//TEST
//var_dump($ware);


class ware
{
    private WARE $ware;
    const WARE1 = 10;
    const WARE2 = 10;
    const WARE3 = 10;
}

class LKW
{
    protected $frachtraum = 0;
    const FRACHTRAUM_MAX = 40000;

    public function __construct()
    {
        $this->typ = __Class__;
    }
    public function beladen($ware)
    {
         if (($this->frachtraum + $ware) > self::FRACHTRAUM_MAX) {
            echo $this->frachtraum + $ware - self::FRACHTRAUM_MAX;
             }
        
         else {
            $this->frachtraum += $ware;
        }
    }
    public function entladen()
    {
        $this->frachtraum = 0;
    }
}

// AUSGABE
$LKW1 = new LKW;
$ware = new ware;
$LKW1->beladen($ware1);
echo "<br>";
$LKW1->beladen($ware2);
echo "<br>";
$LKW1->beladen($ware3);

//var_dump($LKW1->beladen($ware3));
?>
 

Zvoni

Erfahrenes Mitglied
Zum LIFO-Prinzip/Stack:
Stell dir mal einen Stapel Teller vor (wie z.B. in einer Uni-Mensa):
Am Anfang ist der "Frachtraum" für die Teller leer.
Die Bedienung kommt hin und stellt den ersten Teller auf den "Frachtraum",
dann den zweiten oben drauf, den dritten oben drauf usw.

Jetzt kommt der Student, und will den "Frachtraum" entladen. Welchen Teller nimmt er?
Richtig, den obersten Teller, welches der Teller ist, welcher als letztes in den "Frachtraum" geladen wurde.

Bei einem LKW ist es dasselbe: Die erste Palette wird ganz nach vorne Richtung Fahrerkabine geschoben, die zweite dahinter usw. bis die Ladekante erreicht ist (LKW voll). Türen zu, versiegeln/plomben, losfahren.
Beim Entladen: Welches ist die erste Palette, welche entladen wird? Richtig, die die als letztes beladen wurde.

Last In - First Out

Das LIFO-Prinzip findet u.a. bei Container-Frachtschiffen Verwendung
Logistikbranche: Hafenlogistik
 

Yaslaw

n/a
Moderator
@Zvoni Stack ist glaub falsch. Was als letztes rein geht muss auch als erstes wieder raus. Normalerweise ist doch ein Stack, dass das Älteste als erstes rasukommt. Oder habe ich da ein Chaos?

@Brutos66735
Du machst da noch OOP-Chaos. Ich habe mal das Ding so programmiert wie ich meinte
PHP:
<?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;
    }
       
        protected function addToStack(Ware $iWare){
        $this->stack[] = $iWare;
    }
    public function getGesammtGewicht(){
        $sum = 0;
        foreach($this->stack as $ware){
            $sum += $ware->getGewicht();
        }
        return $sum;
    }
   
    public function getLadungsText() :string{
        //Der LKW hat folgende Ware geladen 35.000 von $ware1und 5.000 von $ware2 0 von $ware3
        $ladungen = array();
        foreach($this->stack as $ware){
            $ladungen[] = $ware->getGewicht().' von '.$ware->getName();
        }
        return 'Der LKW hat folgende Ware geladen: '.implode(', ' , $ladungen);
    }
   
    public function beladen($iWare) :bool{
        $voll = ($iWare->getGewicht() + $this->getGesammtGewicht() > $this->maxGewicht);
       
        if(!$voll){
            $this->addToStack($iWare);
        }else{
            echo "Der lkw ist voll<br />";
        }
        return $voll;
    }
    public function entladen(){
        $this->stack = array();
    }
}

$ware1 = new Ware("Bier", 35000);
$ware2 = new Ware("Schnaps", 7000);
$ware3 = new Ware("Tabak", 1500);

$lkw = new Lkw(43000);
$voll = false;

if(!$voll)  $voll = $lkw->beladen($ware1);
if(!$voll)  $voll = $lkw->beladen($ware2);
if(!$voll)  $voll = $lkw->beladen($ware3);
echo $lkw->getLadungsText();

?>
Code:
Der lkw ist voll
Der LKW hat folgende Ware geladen: 35000 von Bier, 7000 von Schnaps
 

Brutos66735

Grünschnabel
WOW !!!Vielen Dank @Yaslaw,

hätte nicht mit einem fertigen Script gerechnet, echt super lieb von dir!


Eins ist mir noch aufgefallen.
Sobald ein Wert auf 0 ist, also nicht verfügbar

Wie hier im Beispiel.

Werden nur 42.000 T Schnaps geladen, warum nimmt der LKW nicht noch 1.000 T Tabak mit?

Oder ist es Eigenbedarf für den Fahrer :-D


PHP:
$ware1 = new Ware("Bier", 0);
$ware2 = new Ware("Schnaps", 42000);
$ware3 = new Ware("Tabak", 2000);

$lkw = new Lkw(43000);

Code:
Der Lkw ist voll
Der LKW hat folgende Ware geladen: 0 von Bier, 42000 von Schnaps
 

Yaslaw

n/a
Moderator
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
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…