php四则运算出题器
要求
1.可以将出题结果导出到EXCEL文件
2.用户可以指定题目的数量
3.用户可指定操作数的数目(至少二个、至多四个),如果指定的操作数超过2个,应该随机出现括号用于改变运算顺序。
4.用户可以指定结果是否允许出现负数。
5.用户可以指定每个操作数的最大值
6.用户可以指定题目的类型(加、减、加减、乘除、加减乘除)
7.用户可以指定除法运算结果有余数还是保留小数点位数(只实现了2位的)
想法
(想法源于网络)
随机加括号问题
假设待去括号的表达式为 (m1 op1 n1) op (m2 op2 n2) 这里m1、n1、m2、m2可能自身就是个表达式,也可能是数字,op、op1、op2为运算符
1、若op为’/’,则 (m2 op2 n2)的括号必须保留;
2、若op为’*‘或’-’,如果op2为’+‘或’-’,则(m2 op2 n2)的括号必须保留;
3、若op为’*‘或’/’,如果op1为’+‘或’-’,则(m1 op1 n1)的括号必须保留;
4、 除此之外,去掉括号不影响表达式的计算顺序。
【这里整理的去括号法则来源于互联网】
1-num_max选一个数
m 1 = r a n d ( 1 , m1=rand(1, m1=rand(1,num_max);
余数
n u m = i n t v a l ( f l o o r ( num=intval(floor( num=intval(floor(m1/ m 2 ) ) . ′ . . . . . . ′ . m2)).'......'. m2)).′......′.m1%$m2;
随机计算符号
o
p
e
r
a
t
o
r
=
a
r
r
a
y
(
′
+
′
,
′
−
′
,
′
∗
′
,
′
/
′
)
;
s
h
u
f
f
l
e
(
operator=array('+','-','*','/'); shuffle(
operator=array(′+′,′−′,′∗′,′/′);shuffle(operator);
s
e
l
1
=
sel1=
sel1=operator[0];
负数
考虑减号影响
导出到EXCEL文件
if($_POST['file']=='是')
{
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename=test_data.xls");
}
计算
$result=eval(“return $str;”);
不导出时结果
页面不是很好看,优化指路: Bootstrap菜鸟教程.
第一个显示页面
1.php
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form name="form1" method="post" action="2.php">
是否包括导出:
<select name="file" id="answer">
<option value="是">是</option>
<option value="否">否</option>
</select>
<br />
是否包括答案:
<select name="answer" id="answer">
<option value="是">是</option>
<option value="否">否</option>
</select>
<br />
出题数量:
<input type="text" name="number" id="XH" />
<br />
操作数的数目:
<select name="operand" id="operand">
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<br />
结果是否允许出现负数
<select name="negative" id="negative">
<option value="是">是</option>
<option value="否">否</option>
</select>
<br />
操作数的最大值
<input type="text" name="number_max" id="XH" />
<br />
题目的类型:
<select name="type" id="type">
<option value="加">加</option>
<option value="减">减</option>
<option value="加减">加减</option>
<option value="乘除">乘除</option>
<option value="加减乘除">加减乘除</option>
</select>
<br />
有余数?保留小数点位数
<select name="deal" id="deal">
<option value="保留小数点位数">保留小数点位数</option>
<option value="有余数">有余数</option>
</select>
<br />
<br />
<input type='submit' name='sub'/>
</form>
</body>
</html>
2.php
代码片
.
<!DOCTYPE HTML>
<html>
<head>
<?php
if($_POST['file']=='是')
{
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename=test_data.xls");
}
$answer=$_POST["answer"];
$number=$_POST["number"];
$operand=$_POST["operand"];
$negative=$_POST["negative"];
$num_max=$_POST["number_max"];
$type=$_POST["type"];
$deal=$_POST["deal"];
if($type=='加')
{
$operator=array('+');
}
else if($type=='减')
{
$operator=array('-');
}
else if($type=='加减')
{
$operator=array('+','-');
}
else if($type=='乘除')
{
$operator=array('*','/');
}
else if($type=='加减乘除')
{
$operator=array('+','-','*','/');
}
if($operand==2)
{
for($i=0;$i<$number;$i++)
{
$m1=rand(1,$num_max);
$m2=rand(1,$num_max);
shuffle($operator);
$sel1=$operator[0];
if($sel1=="+")
{
$num=$m1+$m2;
}
else if($sel1=="-")
{
$num=$m1-$m2;
}
else if($sel1=="*")
{
$num=$m1*$m2;
}
else if($sel1=="/")
{
if($deal=='有余数')
{
$num=intval(floor($m1/$m2)).'......'.$m1%$m2;
}
else $num=$m1/$m2;
}
if($num<0&&$negative=='否')
{
echo $m2,$sel1,$m1,'=';
$num=$m2-$m1;
if($answer=='是')
{
echo $num;
}
echo '<br>';
}
else
{
echo $m1,$sel1,$m2,'=';
if($answer=='是')
{
echo $num;
}
echo '<br>';
}
}
}
if($operand==3)
{
for($i=0;$i<$number;$i++)
{
$m1=rand(1,$num_max);
$m2=rand(1,$num_max);
$m3=rand(1,$num_max);
shuffle($operator);
$sel1=$operator[0];
shuffle($operator);
$sel2=$operator[0];
if($sel1=='/'&&$m2!=$m3)
{
$str=(string)$m1.$sel1.'('.(string)$m2.$sel2.(string)$m3.')';
$result=eval("return $str;");
echo $str,'=';
if($answer=='是')
{
echo $result;
}
echo '<br>';
}
else if($sel1=='*'||$sel1=='-'&&$sel2=='+'||$sel2=='-'&&$m2!=$m3)
{
$str=(string)$m1.$sel1.'('.(string)$m2.$sel2.(string)$m3.')';
$result=eval("return $str;");
if($result<0&&$negative=='否')
{
if($sel1=='-')
{
$str='('.(string)$m2.$sel2.(string)$m3.')'.$sel1.(string)$m1;
$result=eval("return $str;");
}
else if($sel2=='-')
{
$str=(string)$m1.$sel1.'('.(string)$m3.$sel2.(string)$m2.')';
$result=eval("return $str;");
}
}
echo $str,'=';
if($answer=='是')
{
echo $result;
}
echo '<br>';
}
else
{
$str=(string)$m1.$sel1.(string)$m2.$sel2.(string)$m3;
$result=eval("return $str;");
if($result<0&&$negative=='否')
{
if($sel1=='-')$sel1='+';
if($sel2=='-')$sel2='+';
$str=(string)$m1.$sel1.(string)$m2.$sel2.(string)$m3;
$result=eval("return $str;");
}
echo $str,'=';
if($answer=='是')
{
echo $result;
}
echo '<br>';
}
}
}
if($operand==4)
{
for($i=0;$i<$number;$i++)
{
$m1=rand(1,$num_max);
$m2=rand(1,$num_max);
$m3=rand(1,$num_max);
$m4=rand(1,$num_max);
shuffle($operator);
$sel1=$operator[0];
shuffle($operator);
$sel2=$operator[0];
shuffle($operator);
$sel3=$operator[0];
if($sel2=='/'&&$m3!=$m4)
{
$str=(string)$m1.$sel1.(string)$m2.$sel2.'('.(string)$m3.$sel3.(string)$m4.')';
$result=eval("return $str;");
if($result<0&&$negative=='否')
{
$str=(string)$m2.$sel1.(string)$m1.$sel2.'('.(string)$m3.$sel3.(string)$m4.')';
$result=eval("return $str;");
}
echo $str,'=';
if($answer=='是')
{
echo $result;
}
echo '<br>';
}
else if($sel2=='*'||$sel2=='-'&&$sel3=='+'||$sel3=='-'&&$m3!=$m4)
{
$str=(string)$m1.$sel1.(string)$m2.$sel2.'('.(string)$m3.$sel3.(string)$m4.')';
$result=eval("return $str;");
if($result<0&&$negative=='否')
{
if($sel2=='-')
{
$str=(string)$m3.$sel3.(string)$m4.$sel2.'('.(string)$m1.$sel1.(string)$m2.')';
$result=eval("return $str;");
}
else
{
if($sel1=='-')$sel1='+';
if($sel3=='-')$sel3='+';
$str=(string)$m1.$sel1.(string)$m2.$sel2.'('.(string)$m3.$sel3.(string)$m4.')';
$result=eval("return $str;");
}
}
echo $str,'=';
if($answer=='是')
{
echo $result;
}
echo '<br>';
}
else if($sel2=='*'||$sel2=='/'&&$sel1=='+'||$sel1=='-')
{
$str='('.(string)$m1.$sel1.(string)$m2.')'.$sel2.(string)$m3.$sel3.(string)$m4;
$result=eval("return $str;");
if($result<0&&$negative=='否')
{
if($sel1=='-')$sel1='+';
if($sel3=='-')$sel3='+';
$str='('.(string)$m1.$sel1.(string)$m2.')'.$sel2.(string)$m3.$sel3.(string)$m4;
$result=eval("return $str;");
}
echo $str,'=';
if($answer=='是')
{
echo $result;
}
echo '<br>';
}
else
{
$str=(string)$m1.$sel1.(string)$m2.$sel2.(string)$m3.$sel3.(string)$m4;
$result=eval("return $str;");
if($result<0&&$negative=='否')
{
if($sel1=='-')$sel1='+';
if($sel2=='-')$sel3='+';
if($sel3=='-')$sel3='+';
$str=(string)$m1.$sel1.(string)$m2.$sel2.(string)$m3.$sel3.(string)$m4;
$result=eval("return $str;");
}
echo $str,'=';
if($answer=='是')
{
echo $result;
}
echo '<br>';
}
}
}
?>
</head>
</html>
第一次写,这个是web课的实验作业,有优化修改建议评价
代码已更新
注:
1.php和2.php要放在一个目录下面