|
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[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 这样就能生成简单四则运算了。 |
|
|