Calculator in php

Asked

Viewed 28,928 times

4

How do I make a calculator in php? I made the code but does not display result.

<!DOCTYPE HTML>
<html lang = "pt-br">
    <head>
        <title> Exemplo</title>
        <meta charset = "UTF-8">
    </head>
    <body>
        <form action=calculadora.php" method="get" >
            Primeiro Numero: <input name="num1" type="text" />
            Segundo numero: <input name="num2" type="text" /> 
            Operacao (quatro operações):  <input name="operacao" type="text" /> 
            <input type="submit" value="Calcular" />     
    </form> 
    <?php
        $a = $_GET "num1";
        $b = $_GET "num2";
        $op =$_GET "operacao";
        $c = []
        if($op == "soma")
            $c = $a + $b;
            //echo $c = "resultado";
        else if($op == "subtracao")
            $c = $a - $b;
            //echo $c = "resultado";
        else if($op == "multiplicacao")
            $c = $a*$b;
            //echo $c = "resultado";
        else
            $c = $a/$b;
         echo "O resultado da operação é: $c";
    ?>      
    </body>
</html>

4 answers

9

Follow the code set at @lost’s suggestion, but using POST method and buttons. I tried to maintain the simplicity of the original, adding some small details to illustrate the use of value of Submit, and some more subtleties.

<!DOCTYPE HTML>
<html lang = "pt-br">
<head>
   <title>Exemplo</title>
   <meta charset = "UTF-8">
</head>
<body>
   <form action="" method="post" >
      Primeiro Numero: <input name="num1" type="text"><br>
      Segundo numero: <input name="num2" type="text"><br>
      <input type="submit" name="operacao" value="+">     
      <input type="submit" name="operacao" value="-">     
      <input type="submit" name="operacao" value="*">     
      <input type="submit" name="operacao" value="/">     
   </form> 
<?php

   $a = $_POST['num1'];
   $b = $_POST['num2'];
   $op= $_POST['operacao'];

   if( !empty($op) ) {
      if($op == '+')
         $c = $a + $b;
      else if($op == '-')
         $c = $a - $b;
      else if($op == '*')
         $c = $a*$b;
      else
         $c = $a/$b;

      echo "O resultado da opera&ccedil;&atilde;o &eacute;: $c";
   }

?>       
</body>
</html>

4

To access form values use the syntax below.

   $a = $_GET['nome_do_campo_html']

and not

 $a = $_GET "num1";

3

It is possible to do this with just one line:

echo call_user_func(['+' => 'bcadd', '-' => 'bcsub', '*' => 'bcmul', '/' => 'bcdiv'][$_POST['operacao']] ?? 'bcadd', $_POST['num1'], $_POST['num2'], 2);

You can use Bcmath in combination with call_user_func, that can call it, Bcmath has greater precision for multiplications.

The call_user_func allows calling any function by name. This can be dangerous if you allow the user to enter any value, because consequently the user can also call any PHP function. In this case, there is an array that defines which functions are allowed to be used, and will use the bcadd by default if another value is sent.


To make it a little easier to understand:

<?php

// Definimos os valores padrões do POST:
$_POST = array_replace(['op' => '+', 'a' => 0, 'b' => 0], $_POST);

// Definimos as operações suportadas e sua função no BCMath:
$ops = ['+' => 'bcadd', '-' => 'bcsub', '*' => 'bcmul', '/' => 'bcdiv', '**' => 'bcpow', '%' => 'bcmod'];

// Encontramos a função baseado na entrada do usuário. Caso não for suportado a operação, etnão o `+` será usado como padrão:
$op = $ops[$_POST['op']] ?? $ops['+'];   

// Fazemos chamamos a função usando os valores de A e B:
$resultado = call_user_func($op, $_POST['a'], $_POST['b'], 2);

?>
<!DOCTYPE HTML>
<html lang="pt-br">
<form action="#" method="post">
    <br>A: <input name="a" type="number" step="any"
                  value="<?= htmlentities($_POST['a'], ENT_QUOTES | ENT_HTML5, 'UTF-8') ?>">
    <br>B: <input name="b" type="number" step="any"
                  value="<?= htmlentities($_POST['b'], ENT_QUOTES | ENT_HTML5, 'UTF-8') ?>">
    <br><?php
    foreach ($ops as $n => $_) {
        echo '<input type="submit" name="op" value="' . $n . '">';
    }
    ?>
    <br> Resultado: <input readonly value="<?= $resultado ?>">
</form>
</html>

1

1º- We will use a FORM (HTML)

<!-- Método: $_POST | Action em branco porque executaremos na própria página -->
        <form method="post" action="">
            <!-- Input que receberá o primeiro valor a ser calculado -->
            <input type="text" name="v1" placeholder="Valor 1" />

            <!-- Select com o tipo de operação (Somar, Diminuir, Multiplicar ou Dividir -->
            <select name="operacao">
                <option value="soma">+</option>
                <option value="subtrai">-</option>
                <option value="multiplica">*</option>
                <option value="divide">/</option>
            </select>

            <!-- Input que receberá o segundo valor a ser calculado -->
            <input type="text" name="v2" placeholder="Valor 2" />

            <!-- Input que enviará os valores para a função de cálculo -->
            <input type="submit" name="doCalc" value="Calcular" />
        </form>

2º- The file . PHP with the calculation function

<?php
        # classe :: Calculadora
        class Calculadora {

            # Função "Calcular" para executar o cálculo dos valores (v1 e v2)
            public function Calcular() {

                # Se for setado algum valor ào submit (doCalc), executa a operação
                if (isset($_POST['doCalc'])) {

                    # Se a operação for soma (value = soma), então...
                    if ($_POST['operacao'] == "soma") {

                        # Armazena a soma de [v1 + v2] na variável $resultado
                        $resultado = $_POST['v1'] + $_POST['v2'];

                        # Exibe a variável $resultado com os valores já somados
                        return $resultado;

                        # Ou então, se a operação não for (value = soma), e sim (value = subtrai) então...
                    } elseif ($_POST['operacao'] == "subtrai") {
                        $resultado = $_POST['v1'] - $_POST['v2'];
                        return $resultado;
                    } elseif ($_POST['operacao'] == 'multiplica') {
                        $resultado = $_POST['v1'] * $_POST['v2'];
                        return $resultado;
                    } elseif ($_POST['operacao'] == 'divide') {
                        $resultado = $_POST['v1'] / $_POST['v2'];
                        return $resultado;
                    }
                }
            }

        }

        # Instancia a classe CALCULADORA()
        $calcular = new Calculadora();

        # Executa a função
        echo $calcular->Calcular();
        ?>

I know you have shorter, more objective ways to do it, but this is one of the simplest.

  • 1

    Could you include the explanation of your answer? The way it is, it has become 100% dependent on external sites. If they fall, goodbye response.

  • It was edited for analysis.

  • I believe it’s best to pass the values as an argument to calcular() pq it is not good to use global variables ($_POST/$_GET) directly in a method.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.