2017-09-22 28 views
0

因此對於學校來說,我的任務是創建一個使用3個變量的簡單PHP計算器。我認爲我會使用switch語句爲函數執行所有計算,但在處理操作順序時遇到問題。經過幾個小時和多次嘗試,我不得不承認我很難...有什麼建議嗎?如何製作一個帶有3個變量的PHP計算器

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

計算'的最後一個參數()''是$ op'但你的switch語句中使用'$ op1'。這是行不通的。 'calculate3()'有類似的問題。在放棄之前,你必須解決這些基本問題。 –

+0

好吧,我解決了這個問題 - 但真正的問題是,在我的if/else if語句中,$ prod1在計算()後沒有保存一個值。所以當我嘗試使用$ prod1進行計算時,它等於0 – Philip

+0

我注意到其他錯誤,比如'($ op1 =='*'或'/')',這應該是:'(($ op1 ==' *')或($ op1 =='/'))',還有第二個類似的。在放棄之前先解決所有**錯誤。徹底測試。同時檢查是否所有的'{'在正確的位置用'}'匹配。一套'{'...'}'似乎缺失。 –

回答

1

你的代碼對初學者來說並不是那麼糟糕,但它仍然需要一些工作。爲什麼你會使用多個函數進行或多或少的相同計算?你是一個軟件,你可以多次調用任何函數?

然後,檢查你的代碼。你有很多可變的錯誤,因爲你將它們命名爲不同的。

此外,您的變量命名不易讀。給變量名稱,讓你知道他們應該是什麼。在這個小代碼級別上,這不是什麼大問題。如果你使用很多代碼,一個好的命名可以彌補很多!

如果你打算繼續編程,你想訓練自己早點檢查這些問題。這將爲您節省大量的時間,因爲您將被訓練成自動執行此操作。

我已經或多或少的更正了你的代碼。我已經寫了一些評論來提示零件和修補程序,因此您瞭解發生了什麼變化以及原因。

如果你得到這個計算器項目的成績,請記住,還有很多東西你可以做得更好。至少如果你想獲得最好的成績。

  • 檢查您的命名。

  • 解決安全問題。 (如果有人看到你做這個初學者,他們會留下深刻的印象!)

  • 評論你的代碼。你有意見,但它們還不夠。評論任何可能的內容,以便人們通過閱讀評論來理解代碼的作用。

一些糾正代碼:

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

你真的只需要1個函數來完成計算,X持有價值,你的下一個計算,並將結果與​​以前的一個

<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> 

現在,爲了好玩,寫一個分數計算器! :)

+0

我們只是一樣。如果我知道我可以救了我那個工作:) – natheriel

+0

哈哈,喜歡你的工作@natheriel - 我不明白op1的需求_and_ op2,對我來說太複雜了 –

+0

呵呵,我也得考慮一下。他似乎試圖讓它看起來更復雜。如果你有2 + 2/2,你首先必須使用第二個操作符(2/2 = 1),然後第一個操作符以第二個(2 + 1 = 3)的結果得到正確的結果。經典數學的東西,如加減運算之前的乘法和除法。 – natheriel

相關問題