html,css,javascript,phpを使います

何日か試行錯誤した結果を記述します

未完成なので今後更新予定です

 

仕様

四則演算と()計算を実装

 

今後、負の計算と問題点を解決する予定

 

プログラミング初心者が考えたアルゴリズムなので無駄な記述がいっぱいあるかもしれない

( ;∀;)

 

 

<?php
 
/*
問題点
・()と入力すると0を返す
・数値が大きい場合の処理がない
・その他未確認
*/
function priority_ex($ar){
 if(array_search(')',$ar,true) !== false){
  $leftNum = count($ar) -1 - array_search('(',array_reverse($ar),true);
  $rightNum = array_search(')',$ar,true);
  
  $part_of_ex = array_splice($ar,$leftNum+1,$rightNum - $leftNum - 1);  
  $ar[$leftNum] = split_expression($part_of_ex);
  
  unset($ar[$leftNum + 1]);
  $ar = array_values($ar);
  //return $ar;
  return priority_ex($ar);
  
 }else{
  return split_expression($ar);
 }
}

function split_expression($ar){
 $num = "";
 foreach($ar as $value){
  if(($value === "+") || ($value === "-") || ($value === "×") || ($value === "÷")){
   $result_ex[] = intval($num);
   $result_ex[] = $value;
   $num = "";
  }else{
   if($num === ""){
    $num = $value;
   }else{
    $num .= $value;
   }
  }  
 }
 $result_ex[] = intval($num);
 return m_d_calcu($result_ex);
}
function m_d_calcu($ar){
 while(array_search("×",$ar,true)){
  
  $op_num = array_search("×",$ar,true);
  $ar[$op_num] = $ar[$op_num-1] * $ar[$op_num+1];
  unset($ar[$op_num-1],$ar[$op_num+1]);
  $ar = array_values($ar);
 }
 
 while(array_search("÷",$ar,true)){
  
   $op_num = array_search("÷",$ar,true);
   
   if($ar[$op_num+1] === 0){
    throw new Exception("0で割ることはできません。");
   }
   
   $ar[$op_num] = $ar[$op_num-1] / $ar[$op_num+1];
   unset($ar[$op_num-1],$ar[$op_num+1]);
   $ar = array_values($ar);
  }
 
 return a_s_calcu($ar);
}
function a_s_calcu($ar){
 while(count($ar) > 1){
  switch($ar[1]){
   case "+":
    $ar[0] = $ar[0] + $ar[2];
    unset($ar[1],$ar[2]);
    $ar = array_values($ar);
    break;
   case "-":
    $ar[0] = $ar[0] - $ar[2];
    unset($ar[1],$ar[2]);
    $ar = array_values($ar);
    break;
   default :
    break;
  }
 }
 return $ar[0];
}
if(($_SERVER['REQUEST_METHOD'] ?? null) === "POST"){
 $expression = preg_split("//u",$_POST["hidden_input"],-1,PREG_SPLIT_NO_EMPTY);
  
 try{
  $result = priority_ex($expression);
 }catch(Exception $e){
  $result = $e->getMessage();
 }
 
}
?>
<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>calculator</title>
 <style type="text/css">
  .button{
   color: #fff;
   background-color: #77b4fd;
   border: none;
   height: 100px;
   width: 100px;
   line-height: 100px;
   border-radius: 50%;
   font-size: 30px;
   
  }
  .button:active{
   background-color: #8393ca;
  }
  
  #result{
   font-size: 30px;
   height: 200px;
   line-height: 200px;
   text-align: center;
  }
 </style>
 <script>
  var siki='';
  var countFlag = 0;
  
  function value_out(num){
   if(siki === ''){
    siki=num;
   }else{
    siki+=num;
   } 
   document.getElementById("result").textContent=siki;
  }
  
  function ennzann(num){
   switch (siki.charAt(siki.length-1)){
    case "+":
     break;
    case "-":
     break;
    case "×":
     break;
    case "÷":
     break;
    case "":
     break;
    case "(":
     break;
    default:
     value_out(num);
     break;
   }
  }
  
  function kuuhaku(){
   siki = '';
   countFlag = 0;
   document.getElementById("result").textContent=siki;
  }
  
  function get_script_variable(){
   if(countFlag === 0){
    document.forms['input_form'].elements['hidden_input'].value = siki;
   }
  }
  
  function pair(str){
   if((countFlag === 0) && (str === ")")){
    document.getElementById("result").textContent=siki;
   }else{
    switch(str){
     case "(" :
      switch(siki.charAt(siki.length-1)){
       case "+":
        break;
       case "-":
        break;
       case "×":
        break;
       case "÷":
        break;
       case "(":
        break;
       case "":
        break;
       default:
        value_out("×");
        break;
       }
      countFlag++;
      break;
     case ")" :
      if(countFlag > 0){
       countFlag--;
      }
      break;
    }
    value_out(str);  
   }
  }
 </script>
 </head>
 <body>
  <div id="result">
  
  </div>
  <form method="post" action="" name="input_form" onsubmit="get_script_variable()">
   <p>
    <input type="button" name="zero" value="0" class="button" onclick="value_out('0')">
    <input type="button" name="one" value="1" class="button" onclick="value_out('1')">
    <input type="button" name="two" value="2" class="button" onclick="value_out('2')">
    <input type="button" name="three" value="3" class="button" onclick="value_out('3')">
    <input type="button" name="four" value="4" class="button" onclick="value_out('4')">
    <input type="button" name="five" value="5" class="button" onclick="value_out('5')">
    <input type="button" name="six" value="6" class="button" onclick="value_out('6')">
    <input type="button" name="seven" value="7" class="button" onclick="value_out('7')">
    <input type="button" name="eight" value="8" class="button" onclick="value_out('8')">
    <input type="button" name="nine" value="9" class="button" onclick="value_out('9')">
    <input type="button" name="clear" value="C" class="button" onclick="kuuhaku()">
    <input type="submit" name="equal" value="=" class="button" >
   </p>
   <p>
    <input type="button" name="tasu" value="+" class="button" onclick="ennzann('+')">
    <input type="button" name="hiku" value="-" class="button" onclick="ennzann('-')">
    <input type="button" name="kakeru" value="×" class="button" onclick="ennzann('×')">
    <input type="button" name="waru" value="÷" class="button" onclick="ennzann('÷')">
    <input type="button" name="1" value="(" class="button" onclick="pair('(')">
    <input type="button" name="2" value=")" class="button" onclick="pair(')')">
    <input type="hidden" name="hidden_input" value="">
   </p>
  </form>
  <?php
   if(($_SERVER["REQUEST_METHOD"] ?? null) === "POST"){
    echo $result;
   }
  ?>
  
 </body>
</html>