322e 发表于 2015-8-26 13:40:12

PHP

  PHP 生成 简单四则运算。
  Thanks for Open Source.
  本代码基于 jiaych php四则运算计算函数 实现。





1 <?php
2   /*基于jiaych php四则运算计算函数
3   http://download.iyunv.com/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) {
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;   
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  这样就能生成简单四则运算了。
页: [1]
查看完整版本: PHP