# Rabatt-Berechnung in If-Anweisung implementieren



## apa-most (19. Juni 2010)

Hey und zwar bin ich gerade an einem Buch lesen... zwecks Php un hab da ne Aufgaben Stellung bekommm weiß aber net mehr so richtig weiter...
erstmal den Code dazu den ich geschrieben habe


HTML-Datei-Eingabeformular das kein Problem....

```
<html>
<head>
    <title></title>
</head>
<body>
    <p>Bitte geben Sie Menge und Sorte ein:
    <br></br>
    
    <form action="ub17.php" method="post">
        <input name="liter"> Menge in Liter <br>
        <input name="sorte"> Sorte (S oder N) <br>
        <br>
        <input type="submit">
        <input type="reset">
    </form>
    
</body>
</html>
```


PHP-Auswertungsprogramm

```
<?php
$super  =   "1.15";
$normal =   "1.05";
// Anweisung und Berechnung
if ($sorte == "S")
    {
    $ergebniss = $_POST["liter"] * $super;
//Ausgabe
    echo $_POST["liter"] . " Liter Super kosten " . $ergebniss . " Euro";
    }
    
    else
    {
        $ergebniss1 =   $_POST["liter"] * $normal;
        
        echo $_POST["liter"] . " Liter Normal kosten " . $ergebniss1 . " Euro";
    }
?>
```

Das soll eine normale Berechnung darstellen mit IF Anweisung ob nun Super und Normal getankt.. wird.. wie man erkennen kann.... so nun die Aufgabe dazu... wo ich net weiterkomm.... ich soll zu diesem Skript... schreiben wenn mehr als 100Liter getankt werden dann soll auf das Endergebnis 2% Rabatt gegeben werden ohne eine globale Variable....und da komm ich ne weiter... mir ist klar das es dann mit....


```
if ($_POST["liter"] > 100;
```
....... dann berechne.... liter * preis(sorte) 
aber wie bekomm i in das Endergebniss die 2% Rabatt mit drauf das Versteh ich ne.. bzw. komm da nicht weiter würde mich über Hilfe freuen... das sicherlich nicht allzu schwer


----------



## timestamp (19. Juni 2010)

Hi

Um 2% abzurechnen gibt es doch jede Menge Möglichkeiten. Such dir eine aus 

```
$preis = 100;

$rabatt = $preis * 0.98;
$rabatt = $preis - ( ($preis/100) *2):
$rabatt = $preis - ($preis * 0.02);
```

Außerdem sollte deine erste IF-Abfrage glaube ich so aussehen:

```
if( $_POST["sorte"] == "S")
```


----------



## apa-most (19. Juni 2010)

super Sache...hmm

wie bekomm ich das aber noch hin weil da steht unabhängig von S oder N soll der Rabatt erst ab 100 Liter gegeben werden? allerdings müsste ich ja da 2 if abfragen shcreiben?! Aber des soll ich glaube net machen geht das auch noch anders?


----------



## tombe (19. Juni 2010)

Ohne eine zusätzliche IF Abfrage wirst du das nicht lösen können immerhin ist es ja vom Wert "Liter" abhängig.

Damit es innerhalb der Formal direkt berechnet wird, könntest du aber die Kurzschreibweise verwenden:


```
if ($sorte == "S") {
    $ergebniss = $_POST["liter"] * $super * $rabatt = ($_POST["liter"] > 100) ? 0.98 : 100;
     echo $_POST["liter"] . " Liter Super kosten " . $ergebniss . " Euro";
} else {
    $ergebniss1 =   $_POST["liter"] * $normal * $rabatt = ($_POST["liter"] > 100) ? 0.98 : 100;
    echo $_POST["liter"] . " Liter Normal kosten " . $ergebniss1 . " Euro";
}
```


----------



## timestamp (19. Juni 2010)

Warum denn zweimal aufschreiben? Programmierer sind doch schreibfaul 

```
$rabatt = ($_POST["liter"] > 100) ? 0.98 : 100;
if ($sorte == "S") {
    $ergebniss = $_POST["liter"] * $super * $rabatt;
     echo $_POST["liter"] . " Liter Super kosten " . $ergebniss . " Euro";
} else {
    $ergebniss =   $_POST["liter"] * $normal * $rabatt;
    echo $_POST["liter"] . " Liter Normal kosten " . $ergebniss . " Euro";
}
```


----------



## Maik (19. Juni 2010)

@apa-most: Sag mal, klemmt die Punkt-Taste auf deiner Tastatur? 

Nichts gegen drei Punkte am Satzende, wenn man damit ein offenes Ende für eine Aussage / einen Gedankengang  zum Ausdruck bringen möchte, aber deine inflationäre Zeichensetzung in jedem deiner Forenbeiträge mitten und am Ende eines Satzes ist einfach nur grausam anzusehen.

mfg Maik


----------



## apa-most (19. Juni 2010)

oh sorry das beachte ich garnicht so, sorry werd das in Zukunft unterlassen!



danke für die Tipps werd des mal weiter ausprobieren!


----------



## apa-most (20. Juni 2010)

@ Timestamp


```
$rabatt = ($_POST["liter"] > 100) ? 0.98 : 100;
```
Ist so eine funktion möglich oder geht sowas nur in einer If Abfrage?

weil hab des bisher noch net gesehen im Buch? Oder hat des einen Zusammenhang mit der IF Abfrage?


Bei dieser Schreibweise bekomm ich einen Parse-Error?


----------



## rd4eva (20. Juni 2010)

> Ist so eine funktion möglich oder geht sowas nur in einer If Abfrage?



Das ist der Ternary Operator.



> Der Ausdruck (ausdr1) ? (ausdr2) : (ausdr3)  gibt ausdr2 zurück, wenn ausdr1 TRUE zurückgibt und ausdr3, wenn ausdr1 FALSE zurückgibt.


----------



## apa-most (20. Juni 2010)

sorry hab den Parse Error beseitigt war mein Fehler, ich hab statt den doppelpunkt, ein Slash genommen als geteilt durch jetzt ersetzt durch den doppelpunkt dann geht es!


Hmm na rein theorethisch also laut den Buch muss das auch Ohne einen Operator gehen weil dieses Kapitel erst als nächstes kommt, hmm komisch naja abwarten so ich Probier das jetzt nochmal aus! 

Trotzdem danke!


----------



## rd4eva (20. Juni 2010)

Das ist wenn man so will nur eine kurz schreibweise einer if Anweisung. 

Also wie timestamp bereits sagte


> Programmierer sind doch schreibfaul



Wenn das auf dich nicht zutreffen sollte dann lass dich nicht davon abhalten es anders zu lösen.


----------



## apa-most (20. Juni 2010)

so ich hab das jetzt mal so geschrieben wie ich denke das funktioniert, allerdings komm ich net wirklich weiter also hier erst einmal der unvollständige Code


```
$super  =   "1.15";
$normal =   "1.05";



// Anweisung und Berechnung
if ( $_POST["sorte"] == "S")
    {
    $ergebniss = $_POST["liter"] * $super;
        if ( $_POST["liter"] > 100)
            {
                $ergebniss2 =  $_POST["liter"] * $super * 0.98;
                echo $_POST["liter"] . " Liter Super kosten " . $ergebniss2 . " Euro";
            }
    }

----------------------------------------------------------
DARUNTER HAB ICH KEINE EINFÄLLE
    
else
    {
        $ergebniss1 =   $_POST["liter"] * $normal;
        
        echo $_POST["liter"] . " Liter Normal kosten " . $ergebniss1 . " Euro";
    }
```

also das Funktioniert jetzt soweit, allerdings nur bei der Sorte S und über 100 und unter 100 Liter,
die Sorte N funktioniert noch net so richtig?! Ist das vom Code her soweit richtig?!

des Funktioniert doch nicht weil der nur die Ausgabe macht wenn er über 100 Liter hat.


----------



## timestamp (20. Juni 2010)

Hi

analysieren wir deinen Code doch mal Stück für Stück:

```
$super  =   "1.15";
$normal =   "1.05";
```

Am Anfang die Preise in einer Variablen festzulegen ist durchaus sehr sinnvoll. Wenn du das Thema Konstanten schon hattest könntest du für die Preise auch Konstanten nehmen, an sonsten sehr gut!



```
// Anweisung und Berechnung
if ( $_POST["sorte"] == "S")
    {
    $ergebniss = $_POST["liter"] * $super;
```
Soweit auch alles in Ordnung, wenn der Benutzer Super tanken möchte, wird auch der Super Preis genommen.


```
if ( $_POST["liter"] > 100)
            {
                $ergebniss2 =  $_POST["liter"] * $super * 0.98;
                echo $_POST["liter"] . " Liter Super kosten " . $ergebniss2 . " Euro";
            }
```
Wenn er mehr als 100 Liter tankt wird der Rabatt berechnet, auch dass ist richtig. Du hast jetzt hier eine Ausgabe getätigt, die allerdings *nur* ausgeführt wird, wenn der User mehr als 100 Liter tankt. Die Antwort auf deine Frage, warum du sonst keine Ausgabe erhälst sollte dir jetzt ein wenig näher gekommen sein 


```
else
    {
        $ergebniss1 =   $_POST["liter"] * $normal;
        
        echo $_POST["liter"] . " Liter Normal kosten " . $ergebniss1 . " Euro";
    }
```

Vom Prinzip her ist das doch das gleiche in grün. Du musst jetzt nur noch den Rabattcode von oben hier mit runter kopieren und dann funktioniert es.


----------



## rd4eva (20. Juni 2010)

```
Ist das vom Code her soweit richtig?!
```
Es ist syntaktisch zumindest mal nicht falsch.

Bisher gibt es aber nur folgende Fälle:
Sorte S und mehr als 100 Liter.
Sorte N egal wieviele Liter.

Es macht zwar afaik keinen Unterschied aber ich würde $super und $normal nicht als string übergeben.

```
//$super  =   "1.15";
$super = 1.15;
//$normal =   "1.05";
$normal = 1.05;
```


----------



## apa-most (20. Juni 2010)

gut ich probier das mal weiter, danke für die Tipps und Hilfen! 

Ziemlich kompliziert der Spaß eh, überall steht das es einfach ist aber nunja ich werde schauen ob es klappt!


----------



## timestamp (20. Juni 2010)

apa-most hat gesagt.:


> überall steht das es einfach ist



Jeder hat doch mal angefangen oder?


----------



## apa-most (20. Juni 2010)

wohl wahr das stimmt allerdings.

so nun gehts weiter mit den Schreiben, war de ganze Zeit unterwegs da konnt ich ne weiter arbeiten bzw. probieren!

sooo nun hab ich es hinbekommen also im Skript funktioniert es auf jedenfall erst einmal, ich schreib hier mal den Code hin vllt. habt ihr ja noch paar Verbesserungen oder so!



```
$super  =   1.15;
$normal =   1.05;



// Anweisung und Berechnung
if ( $_POST["sorte"] == "S")
    {
        if ( $_POST["liter"] > 100)
            {
                $ergebniss2 =  $_POST["liter"] * $super * 0.98;
                echo $_POST["liter"] . " Liter Super kosten " . $ergebniss2 . " Euro";
            }
        else
            {
                    $ergebniss = $_POST["liter"] * $super;
                    echo $_POST["liter"] . " Liter Super kosten " . $ergebniss . " Euro";
                
            }
    }
    
else
    {
            if ( $_POST["liter"] > 100)
                {
                    $ergebniss1 =   $_POST["liter"] * $normal *0.98;
                    echo $_POST["liter"] . " Liter Normal kosten " . $ergebniss1 . " Euro";

                }
            
            else
                {
                  $ergebniss1 =   $_POST["liter"] * $normal;
                  echo $_POST["liter"] . " Liter Normal kosten " . $ergebniss1 . " Euro";
                }
    }
```



danke dir timestamp


----------



## timestamp (20. Juni 2010)

Hi

du kannst den Variablen ruhig den selben Namen geben, da sie sich hier nicht überschreiben können. Außerdem kannst du die Ausgabe hinter die Bedingungen schreiben, da sie eigentlich die gleichen Variablen enthält (dann werden es auch gleich ein paar weniger Zeilen  )

```
$super  =   1.15;
$normal =   1.05;

// Anweisung und Berechnung
if ( $_POST["sorte"] == "S"){
  if ( $_POST["liter"] > 100){
    $ergebnis =  $_POST["liter"] * $super * 0.98;
  }
  else{
    $ergebnis = $_POST["liter"] * $super;
  }
  echo $_POST["liter"] . " Liter Super kosten " . $ergebnis . " Euro";            
}
else{
  if ( $_POST["liter"] > 100){
    $ergebnis =   $_POST["liter"] * $normal *0.98;
  }
  else{
    $ergebnis =   $_POST["liter"] * $normal;    
  }
  echo $_POST["liter"] . " Liter Normal kosten " . $ergebnis . " Euro";
}
```

Ich hoffe so ist das für dich noch verständlich geblieben =)


----------



## apa-most (20. Juni 2010)

jo klar bleibt trotzdem noch Verständlich für mich, hab des gerade mal alles gekürzt!
Das mit den Variablen z.B innerhalb von IF das diese sich nicht Überschreiben davon steht hier im Buch z.B garnix!


  

Tausend dank nochmal hehe!

Noch ne frage jetzt hab ich den ganzen Spaß ja mit eurer Hilfe hinbekommen hättest vllt. mal ne Idee was ich über so ein Eingabeformular und solchen IF-Abfragen nochmal von alleine Probieren kann?! Also könntest mir mal was vorgeben und ich versuch des zu schreiben!?


----------



## timestamp (20. Juni 2010)

Die Standardsachen wären ja zu prüfen ob ein eingebenes Datum gültig ist, ob ein Jahr ein Schaltjahr ist, eine Zahl eine Primzahl... Das würde mir jetzt spontan einfallen.


----------



## apa-most (21. Juni 2010)

ok weiß ich erst einmal bescheid!


----------

