2017-09-22 44 views
0

学校では、3つの変数を使った簡単なPHP電卓を作成することになっていました。私はswitch文を使って関数のすべての計算を行うが、Order of Operationsを扱うときは問題にぶつかると思った。数時間と複数の試みの後、私は私が困惑していることを認めなければならない...どんな提案?あなたが本当に唯一の計算を行うために1つの機能を必要とする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つのセットが欠落しているようです。 –

答えて

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

は、xは以前の1 NOW

<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

haha​​、lovin 'あなたの仕事@natheriel - 私はop1 _and_ op2の必要性を理解できませんでした。私にとってはあまりにも複雑です –

+0

hehe、私もそれについて考える必要がありました。彼はそれをより複雑に見せようとしたようです。 2 + 2/2の場合は、最初に2番目の演算子(2/2 = 1)を使用し、2番目の演算子(2 + 1 = 3)の結果で正しい結果を得る必要があります。プラスとマイナス計算の前に乗算と除算のような古典的な数学のもの。 – natheriel

関連する問題