2017-09-22 6 views
0

Also für die Schule wurde ich beauftragt, einen einfachen PHP-Rechner zu erstellen, der 3 Variablen verwendete. Ich dachte, dass ich switch-Anweisungen verwenden würde, um alle Berechnungen für Funktionen durchzuführen, aber die Probleme im Zusammenhang mit Operationsreihen zu lösen. Nach mehreren Stunden und mehreren Versuchen muss ich zugeben, dass ich ratlos bin ... Irgendwelche Vorschläge?Wie man einen PHP-Rechner mit 3 Variablen erstellt

<?php 
// function to calculate and return result 
function calculate($x, $y, $op) { 
    // calculate $prod using switch (case) statement 
    switch($op1) { 
     case '+': 
      $prod1 = $x + $y; 
      break; 
     case '-': 
      $prod1 = $x - $y; 
      break; 
     case '*': 
      $prod1 = $x * $y; 
      break; 
     case '/': 
      if ($y == 0) {$prod1 = "&#8734";} 
      else {$prod1 = $x/$y;} 
    // return the result 
    return $prod1; 
    } 
} 
function calculate2($prod1, $z, $op2) { 
    // calculate $prod2 using switch (case) statement 
     switch($op2) { 
     case '+': 
      $prod2 = $prod1 + $z; 
      break; 
     case '-': 
      $prod2 = $prod1 - $z; 
      break; 
     case '*': 
      $prod2 = $prod1 * $z; 
      break; 
     case '/': 
      if ($z == 0) {$prod2 = "&#8734";} 
      else {$prod2 = $prod1/$z;} 
    } 
    // return the result 
    return $prod2; 
} 
function calculate3($x, $prod2, $op1) { 
    // calculate $prod using switch (case) statement 
     switch($op2) { 
     case '+': 
      $prod2 = $x + $prod1; 
      break; 
     case '-': 
      $prod2 = $x - $prod1; 
    } 
    // return the result 
    return $prod3; 
} 
function calculate4($y, $z, $op2) { 
    // calculate $prod using switch (case) statement 
     switch($op2) { 
     case '*': 
      $prod2 = $y * $z; 
      break; 
     case '/': 
      if ($z == 0) {$prod2 = "&#8734";} 
      else {$prod2 = $y/$z;} 
    } 
    // return the result 
    return $prod2; 
} 
// declare all variables 
$x = 0; 
$y = 0; 
$z = 0; 
$prod1 = 0; 
$prod2 = 0; 
$prod3 = 0; 
$op1 = ''; 
$op2 = ''; 


// grab the form values from $_GET hash 
extract($_GET); 

?> 

    <html> 

    <head> 
    <title>PHP Calculator Version 2.12</title> 
    </head> 

    <body> 

    <h3>PHP Calculator (Version 2.12)</h3> 

    <form method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>"> 

     x = <input type="text" name="x" size="5" value="<?php print $x; ?>" /> op1 = 
     <select name="op"> 
       <option value="+" <?php if ($op=='+') echo 'selected="selected"';?>>+</option> 
       <option value="-" <?php if ($op=='-') echo 'selected="selected"';?>>-</option> 
       <option value="*" <?php if ($op=='*') echo 'selected="selected"';?>>*</option> 
       <option value="/" <?php if ($op=='/') echo 'selected="selected"';?>>/</option> 
      </select> y = <input type="text" name="y" size="5" value="<?php print $y; ?>" /> op2 = 
     <select name="op2"> 
       <option value="+" <?php if ($op2=='+') echo 'selected="selected"';?>>+</option> 
       <option value="-" <?php if ($op2=='-') echo 'selected="selected"';?>>-</option> 
       <option value="*" <?php if ($op2=='*') echo 'selected="selected"';?>>*</option> 
       <option value="/" <?php if ($op2=='/') echo 'selected="selected"';?>>/</option> 
      </select> z = <input type="text" name="z" size="5" value="<?php print $z; ?>" /> 
     <input type="submit" name="calc" value="Calculate" /> 
    </form> 

    <?php 
     if(isset($calc)) { 
      // check that $x & $y are numeric 
      if (is_numeric($x) && is_numeric($y) && is_numeric($z)) { 
       // check PEMDAS 
       if ($op1 == '*' or '/') { 
        $prod1 = calculate($x, $y, $op1); 
        $prod2 = calculate2($prod1, $z, $op2); 
       } 
       else if ($op2 == '*' or '/') { 
        $prod2 = calculate4($y, $z, $op2); 
        $prod3 = calculate3($x, $prod2, $op1); 
       } 
       else 
        $prod1 = calculate($x, $y, $op1); 
        $prod2 = calculate2($prod1, $z, $op2); 

       // print the result 
       echo "<p>$x $op $y $op2 $z = $prod2 </p>"; 
      } 
      else { 
       // unaccepatable values 
       echo "<p>x, y, and z values are required to be numeric ... 
         please re-enter values</p>"; 
      } 
     } 
    ?> 
    </body> 

    </html> 
+0

Das letzte Argument der 'calculate()' ist '$ op' aber Ihre switch-Anweisung verwendet' $ op1'. Das wird nicht funktionieren. 'calculate3()' hat ein ähnliches Problem. Sie müssen diese grundlegenden Probleme lösen, bevor Sie aufgeben. –

+0

Ok, das habe ich behoben - aber das eigentliche Problem ist, dass in meinem if/else if-Anweisungen $ prod1 keinen Wert nach der Berechnung enthält(). Wenn ich also versuche, mit $ prod1 zu berechnen, ist es gleich 0 – Philip

+0

Ich bemerkte andere Fehler, wie '($ op1 == '*' oder '/')', das sollte sein: '(($ op1 == ' * ') oder ($ op1 =='/')) ', und es gibt eine zweite ähnliche. Lösen Sie zuerst alle Fehler, bevor Sie aufgeben. Testen Sie gründlich. Überprüfen Sie auch, ob alle '{' '' '' an den richtigen Stellen übereinstimmen. Ein Satz von '{' ... '} scheint zu fehlen. –

Antwort

1

Ihr Code ist nicht so schlecht für einen Anfänger, aber es braucht noch etwas Arbeit. Warum würden Sie mehrere Funktionen verwenden, die mehr oder weniger die gleiche Berechnung ausführen? Sie sind eine Ware, die Sie jede Funktion mehrere Male aufrufen können?

Dann überprüfen Sie Ihren Code. Sie haben viele variable Fehler, da Sie sie anders benennen.

Auch Ihre Variablennamen sind nicht so gut lesbar. Gib den Variablen Namen, damit du weißt, was sie sein sollen. Auf dieser kleinen Code-Ebene ist das kein großer Deal. Wenn Sie mit viel Code arbeiten, kann eine gute Benennung viel ausmachen!

Wenn Sie planen, an der Programmierung zu bleiben, möchten Sie sich selbst ausbilden, um diese Probleme früh zu überprüfen. Dies spart Ihnen viel Zeit in der Zukunft, da Sie automatisch dafür trainiert werden.

Ich habe Ihren Code mehr oder weniger korrigiert. Ich habe einige Kommentare geschrieben, um Teile und Korrekturen zu erläutern, damit Sie verstehen, was sich geändert hat und warum.

Wenn Sie Noten für dieses Rechner-Projekt erhalten, denken Sie daran, es gibt immer noch eine Menge Dinge, die Sie besser machen können. Zumindest wenn du die beste Note bekommen willst.

  • Überprüfen Sie Ihre Benennung.

  • Adressensicherheitsprobleme. (Wenn jemand sieht, dass Sie dies als Anfänger machen, werden Sie beeindruckt sein!)

  • Kommentieren Sie Ihren Code. Sie haben Kommentare, aber sie sind nicht genug. Kommentiere alles Mögliche, damit die Leute verstehen, was der Code macht, indem du einfach den Kommentar liest.

Einige korrigierten Code:

<?php 
// you only need one function. why would you need a lot of functions doing the same? 
function calculate($x, $y, $op) { 
    // calculate $prod using switch (case) statement 
    switch($op) { 
     case '+': 
      $prod = $x + $y; 
      break; 
     case '-': 
      $prod = $x - $y; 
      break; 
     case '*': 
      $prod = $x * $y; 
      break; 
     case '/': 
      if ($y == 0) {$prod = "&#8734";} 
      else {$prod = $x/$y;} 
      break; 
    } 

    // do return your result AFTER the switch. else you will not get any results in most cases 
    return $prod; 
} 

// you can do this, but keep in mind, this is more or less a security issue! 
// you may want to check how to work with $_GET variables. as it is for school work, it is not critical yet, 
// but if you plan to use php in future you may want to have a look at some ways to avoid problems. 
extract($_GET); 

// in this example is no need to predefine the variables as you had it, as wich each post the value get lost and it only uses the information from $_GET 

?> 
<html> 

    <head> 
    <title>PHP Calculator Version 2.12</title> 
    </head> 

    <body> 

    <h3>PHP Calculator (Version 2.12)</h3> 

    <form method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>"> 

     x = <input type="text" name="x" size="5" value="<?php print $x; ?>" /> op1 = 
     <select name="op1"> 
       <option value="+" <?php if ($op1=='+') echo 'selected="selected"';?>>+</option> 
       <option value="-" <?php if ($op1=='-') echo 'selected="selected"';?>>-</option> 
       <option value="*" <?php if ($op1=='*') echo 'selected="selected"';?>>*</option> 
       <option value="/" <?php if ($op1=='/') echo 'selected="selected"';?>>/</option> 
      </select> y = <input type="text" name="y" size="5" value="<?php print $y; ?>" /> op2 = 
     <select name="op2"> 
       <option value="+" <?php if ($op2=='+') echo 'selected="selected"';?>>+</option> 
       <option value="-" <?php if ($op2=='-') echo 'selected="selected"';?>>-</option> 
       <option value="*" <?php if ($op2=='*') echo 'selected="selected"';?>>*</option> 
       <option value="/" <?php if ($op2=='/') echo 'selected="selected"';?>>/</option> 
      </select> z = <input type="text" name="z" size="5" value="<?php print $z; ?>" /> 
     <input type="submit" name="calc" value="Calculate" /> 
    </form> 

    <?php 
     if(isset($calc)) { 
      if (is_numeric($x) && is_numeric($y) && is_numeric($z)) { 
       // if you use OR/AND or any other operator, make sure both sides have a counterpart to work with. 
       if ($op1 == '*' or $op1 == '/') { 
        // you can use the same function multiple times as seen below 
        $prod1 = calculate($x, $y, $op1); 
        $prod2 = calculate($prod1, $z, $op2); 
       } 
       else if ($op2 == '*' or $op2 == '/') { 
        $prod1 = calculate($y, $z, $op2); 
        $prod2 = calculate($x, $prod1, $op1); 
       } 
       else { 
        $prod1 = calculate($x, $y, $op1); 
        $prod2 = calculate($prod1, $z, $op2); 
       } 

       // make sure what you print does also exist! 
       echo "<p>$x $op1 $y $op2 $z = $prod2 </p>"; 
      } 
      else { 
       // unaccepatable values 
       echo "<p>x, y, and z values are required to be numeric ... 
         please re-enter values</p>"; 
      } 
     } 
    ?> 
    </body> 
    </html> 
1

Sie wirklich brauchen nur 1 Funktion, um die Berechnungen zu tun, hält x einen Wert auf Ihre nächste Berechnung und das Ergebnis Ihres bisherigen

<html> 
    <head> 
    <title>PHP Calculator Version 2.12</title> 
    </head> 
    <body> 
<?php 
function calculate($x, $y, $op) { 
    switch($op) { 
     case '+': 
      $result = $x + $y; 
      break; 
     case '-': 
      $result = $x - $y; 
      break; 
     case '*': 
      $result = $x * $y; 
      break; 
     case '/': 
      if ($y == 0) { 
       $result = "&#8734"; 
      } else { 
       $result = $x/$y; 
      } 
    } 
    return $result; 
} 

extract($_REQUEST); 

$x = calculate($x, $y, $op); 
?> 
    <body> 
    <form method="get""> 
     x = <input type="text" name="x" size="5" value="<?php print $x; ?>" /><br /> 
     op = <select name="op"> 
     <option value="+" <?php if ($op === '+') { echo 'selected="selected"'; } ?>>+</option> 
     <option value="-" <?php if ($op === '-') { echo 'selected="selected"'; } ?>>-</option> 
     <option value="*" <?php if ($op === '*') { echo 'selected="selected"'; } ?>>*</option> 
     <option value="/" <?php if ($op === '/') { echo 'selected="selected"'; } ?>>/</option> 
     </select><br /> 
     y = <input type="text" name="y" size="5" value="<?php print $y; ?>" /><br /> 
     <input type="submit" name="calc" value="Calculate" /><br /> 
    </form> 
    </body> 
</html> 

NOW, für Spaß, einen Bruchrechner schreiben! :)

+0

haben wir gerade gleich gemacht.Wenn ich wüsste, dass ich mir diese Arbeit ersparen könnte :) – natheriel

+0

haha, liebe deine Arbeit @natariel - ich habe die Notwendigkeit für op1 nicht verstanden _und_ op2, viel zu kompliziert für mich –

+0

hehe, ich musste auch darüber nachdenken . Es scheint nur, dass er versucht hat, es komplizierter aussehen zu lassen. Wenn Sie 2 + 2/2 haben, müssen Sie zuerst den zweiten Operator (2/2 = 1) verwenden, danach den ersten mit dem Ergebnis des zweiten (2 + 1 = 3), um das richtige Ergebnis zu erhalten. Klassische Mathe-Sachen wie Multiplizieren und Dividieren vor Plus- und Minus-Berechnung. – natheriel

Verwandte Themen