PHP -- four arithmetic operation

PHP 生成 简单四则运算。

Thanks for Open Source.

本代码基于 jiaych php四则运算计算函数 实现。

  1 <?php

  2     /*基于jiaych php四则运算计算函数

  3     http://download.csdn.net/user/jiaych 实现

  4     

  5     */

  6     class randmath

  7     { 

  8           //$num 数字个数,$nsize 数字位数

  9           public function creatmath($num, $nsize)

 10           { 

 11                 $str_num = rand(0, pow(10,$nsize));

 12                 for ($i = 1; $i < $num; $i++) {

 13                 $str_t=rand(0, pow(10,$nsize)); 

 14                   

 15                      $str_num = $this->rand_num($str_num, rand(0, pow(10,$nsize)));

 16  

 17                 }

 18                 return $str_num;

 19           }

 20           //生成四则运算符号

 21          function rand_num($str1, $str2)

 22           { 

 23                $s_num = rand(1, 4);

 24                 $str="";

 25                 switch ($s_num) {

 26                       case 1: //+

 27                             $str= $str1 . "+" . $str2;

 28                             break;

 29                       case 2: //-

 30                             $str= $str1 . "-" . $str2;

 31                             break;

 32                       case 3: //*

 33                             $str= $str1 . "*" . $str2;

 34                             break;

 35                       case 4: // /

 36                             $str= $str1 . "/" . $str2;

 37                             break; 

 38                             /* case 5: //()

 39                             echo "</br>" . $s_num;

 40                             return $str1."+".$str2;

 41                             break; */

 42                 }

 43                 return $str; 

 44           }

 45     }

 46     class math_rpn {

 47     

 48     function exp2rpn($expression){

 49 

 50         $_stack  = array('#');

 51         $_rpnexp = array();

 52         $_operator = array('(', '+', '-', '*', '/', ')');

 53         $_priority = array('#' => 0, '(' => 10, '+' => 20, '-' => 20, '*' => 30, '/' => 30);

 54         $data='';

 55         $len = strlen($expression);

 56         

 57         for($i = 0; $i < $len; $i++) {

 58             $char = substr($expression, $i, 1);

 59             

 60             if ($char == '(') {

 61                 $_stack[] = $char;

 62                 continue;

 63             } else if ( ! in_array($char, $_operator)) {

 64                 $data.=$char;

 65                 if($i+1<$len)

 66                 {

 67                     $next = substr($expression, $i+1, 1);

 68                     if(in_array($next, $_operator)||is_null($next))

 69                     {

 70                         $_rpnexp[] = $data;

 71                         $data=null;

 72                     }

 73                 }

 74                 else

 75                 {

 76                     $_rpnexp[] = $data;

 77                     $data=null;

 78                 }

 79                 continue;

 80             } else if ($char == ')') {

 81                 for($j = count($_stack); $j >= 0; $j--) {

 82                     $tmp = array_pop($_stack);

 83                     if ($tmp == "(") {

 84                         break;    

 85                     } else {

 86                         $_rpnexp[] = $tmp;

 87                     }

 88                 }

 89                 continue;

 90             } else if ($_priority[$char] <= $_priority[end($_stack)]) {

 91                 $_rpnexp[] = array_pop($_stack);

 92                 $_stack[]  = $char;

 93                 continue;

 94             } else {

 95                 $_stack[] = $char;

 96                 continue;

 97             }

 98         }

 99         

100         for($i = count($_stack); $i >= 0; $i--) {

101             if (end($_stack) == '#') break;

102             $_rpnexp[] = array_pop($_stack);

103         }

104         $mystack=array();    

105         foreach($_rpnexp as $ret)

106         {

107             if($ret=="+")

108             {

109                 $tmp_a=array_pop($mystack);    

110                 $tmp_b=array_pop($mystack);    

111                 $mystack[]=$tmp_a+$tmp_b;

112             }

113             else if($ret=="-")

114             {

115                 $tmp_a=array_pop($mystack);    

116                 $tmp_b=array_pop($mystack);    

117                 $mystack[]=$tmp_b-$tmp_a;

118             }

119             else if($ret=="*")

120             {

121                 $tmp_a=array_pop($mystack);    

122                 $tmp_b=array_pop($mystack);    

123                 $mystack[]=$tmp_b*$tmp_a;

124             }

125             else if($ret=="/")

126             {

127                 $tmp_a=array_pop($mystack);    

128                 $tmp_b=array_pop($mystack);    

129                 $mystack[]=$tmp_b/$tmp_a;

130             }

131             else

132             {

133                 $mystack[]=$ret;

134             }

135         }

136         return $mystack[0];    

137     }

138 }//测试实例

139 /*$expression = "(10.1+3)*(15)-1.4+5";

140 echo $expression."="; 

141 $mathrpn = new math_rpn();

142 echo $mathrpn->exp2rpn($expression)."</br>";

143 */

144   //  $rand_math = new randmath(); 

145   //  echo $rand_math->creatmath(4, 2);

146 ?>
randmath.php
 1  <?php

 2     header("Content-type: text/html; charset=utf-8");

 3     include("randmath.php");

 4  

 5     $mathrpn = new math_rpn();

 6     $rand_math  = new randmath();//生成随机式子

 7  

 8     $i=10;

 9     while($i>0)

10     {

11         $rand_formula = $rand_math->creatmath(4, 1);//生成随机式子方法($num 数字个数,$nsize 数字位数)

12         $math_result=$mathrpn->exp2rpn($rand_formula);

13         if(is_int($math_result)&$math_result>0)

14         {

15             $i--;

16             echo $rand_formula . "=" . $math_result."</br>";

17         }          

18     }

19 ?> 
ShowRPN.php

这样就能生成简单四则运算了。

你可能感兴趣的:(Opera)