php - 生成算术测试
问题描述
我已经在 php 中编写了代码来生成测试,但它有两个问题:它不计算标记并且它说它遇到了非数值。我试过强制转换,is_numeric 函数仍然不起作用。我在这个 Q 上已经一个多星期了,我知道这对你来说可能很简单。有人有想法可以帮助我吗?
这些是错误:
警告:在第 63 行
的 C:\xampp\htdocs\TMA.php 中遇到非数字值警告:在第 63 行的 C:\xampp\htdocs\TMA.php 中遇到非数字值
警告:非数字在第 67 行
的 C:\xampp\htdocs\TMA.php 中遇到的值 警告:在第 67 行的 C:\xampp\htdocs\TMA.php 中
遇到的非数字值 警告:在 C:\ 中遇到的非数字值第 71 行的 xampp\htdocs\TMA.php
警告:第 71 行的 C:\xampp\htdocs\TMA.php 中
遇到的非数字值 警告:C:\xampp\htdocs\TMA 中的非数字值。第 75 行的 php
警告:第 75 行的 C:\xampp\htdocs\TMA.php 中遇到的非数字值警告:第 75 行的 C:\xampp\htdocs\TMA.php 中
除以零
<?php
if(isset($_POST['start'])) {
$_POST['add'] = "+";
$_POST['sub'] = "-";
$_POST['mul'] = "x";
$_POST['div'] = "/";
$num1 = rand(0, 100);
$num2 = rand(0, 100);
$num3 = rand(0, 100);
$num4 = rand(0, 100);
$num5 = rand(0, 10);
$num6 = rand(0, 10);
$num7 = rand(1, 100);
$num8 = rand(1, 100);
while($num1 % 10 + $num2 % 10 >= 10) {
$num1 = rand(0, 100);
$num2 = rand(0, 100);
}
while($num4 % 10 > $num3 % 10 || $num4 > $num3) {
$num3 = rand(0, 100);
$num4 = rand(0, 100);
}
while($num8 > $num7 || ($num7 % $num8 != 0)) {
$num7 = rand(1, 100);
$num8 = rand(1, 100);
}
$_POST['o1'] = $num1;
$_POST['o2'] = $num2;
$_POST['op1'] = $num3;
$_POST['op2'] = $num4;
$_POST['op3'] = $num5;
$_POST['op4'] = $num6;
$_POST['op5'] = $num7;
$_POST['op6'] = $num8;
} else {
$_POST['o1'] = "";
$_POST['o2'] = "";
$_POST['op1'] = "";
$_POST['op2'] = "";
$_POST['op3'] = "";
$_POST['op4'] = "";
$_POST['op5'] = "";
$_POST['op6'] = "";
$_POST['add'] = "";
$_POST['sub'] = "";
$_POST['mul'] = "";
$_POST['div'] = "";
}
$mark = 0;
if(isset($_POST['Mark'])) {
if(($_POST['o1'] + $_POST['o2'] == ($_POST['ans2'])
$mark = $mark + 2.5;
else
$mark = 0;
if(($_POST['op1'] - $_POST['op2']) == $_POST['ans2'])
$mark = $mark + 2.5;
else
$mark = 0;
if(($_POST['op3'] * ($_POST['op4']) == ($_POST['ans3'])
$mark = $mark + 2.5;
else
$mark = 0;
if(($_POST['op5'] / $_POST['op6']) == $_POST['ans4'])
$mark = $mark + 2.5;
else
$mark = 0;
}
?>
<html>
<head>
<title>Simple Math Quiz</title>
<head>
<body>
<h3>Your mark is <?php echo $mark; ?></h3>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<legend><strong><h1 'text-align:center '>Welcome To the math Quiz</h1> </strong></legend>
</br>
<label><strong>First Question :</strong></label></br>
<input type="text" name="o1" value="<?php echo $_POST['o1']; ?>"/> <input type="text" name="add" width="10" value="<?php echo $_POST['add']; ?>"/> <input type="text" name="o2"
value="<?php echo $_POST['o2']; ?>"/>
</br>
<p>Answer :</p>
<input type="text" name="ans"/>
</br>
</br>
<label><strong>Second Question :</strong></label></br>
<input type="text" name="op1" value="<?php echo $_POST['op1']; ?>"/> <input type="text" name="sub" value="<?php echo $_POST['sub']; ?>"/> <input type="text" name="op2"
value="<?php echo $_POST['op2']; ?>"/>
</br>
<p>Answer :</p>
<input type="text" name="ans2"/>
</br>
</br>
<label><strong>Third Question :</strong></label></br>
<input type="text" name="op3" value="<?php echo $_POST['op3']; ?>"/> <input type="text" name="mul" value="<?php echo $_POST['mul']; ?>"/> <input type="text" name="op4"
value="<?php echo $_POST['op4']; ?>"/>
</br>
<p>Answer :</p>
<input type="text" name="ans3"/>
</br>
</br>
<label><strong>Fourth Question :</strong></label></br>
<input type="text" name="op5" value="<?php echo $_POST['op5']; ?>"/> <input type="text" name="div" value="<?php echo $_POST['div']; ?>"/> <input type="text" name="op6"
value="<?php echo $_POST['op6']; ?>"/>
</br>
<p>Answer :</p>
<input type="text" name="ans4"/>
</br>
</br>
<button type="submit" name="Mark">Mark</button>
<button type="submit" name="start">Start</button>
</form>
</body>
</html>
解决方案
我的解决方案可能不是最好的代码,因为它缺少很多东西,比如验证字段等等,但是对于纯粹的教育目的来说,它很容易理解。
原始代码有几个问题:格式,额外的括号,变量命名,有点奇怪的组织if else statements
,失去它的价值的标记
一般来说,变量命名应该更好,更独特,因为它可以更容易地在代码中跟踪它们,但同样出于教育目的,我并没有做得太独特。
一般来说,格式可能会有所不同,但总的来说,保持代码行短是一种很好的做法。
额外的括号实际上来自格式化位和 PHP 运算符优先级。可以在此处找到有关 PHP 运算符优先级的指南。使用本指南可以让您在一定程度上摆脱多余的刹车。
我稍微改进了 if 语句的组织,再次使逻辑更易于理解。我认为不需要两个单独的if
语句,并用一个if
, else if
,else
语句代替它 - 它实现了与原始语句相同的逻辑。
为了解决标记值丢失的问题,我在表单中添加了一个额外的隐藏字段来保留当前标记值。$_POST
出于同样的原因,我还必须添加一个额外的。这是教育目的的短期解决方案,但它应该有效
我还添加了一些非常基本的参数验证。isset($_POST['op1'])
检查答案字段op1
是否填充了某些内容。is_numeric($_POST['op1'])
检查提供的值op1
是否实际上是一个数字。
我修复了上述主要问题并创建了一个可行的示例解决方案。然而,该解决方案缺少一些重要的东西,对于初学者来说可能很难获得。
我的解决方案的代码是:
<?php
if(isset($_POST['start']))
{
$mark=0;
$_POST['add']="+";
$_POST['sub']="-";
$_POST['mul']="x";
$_POST['div']="/";
$num1=rand(0,100);
$num2=rand(0,100);
$num3=rand(0,100);
$num4=rand(0,100);
$num5=rand(0,10);
$num6=rand(0,10);
$num7=rand(1,100);
$num8=rand(1,100);
while($num1%10+$num2%10>=10)
{
$num1=rand(0,100);
$num2=rand(0,100);
}
while($num4%10>$num3%10 || $num4>$num3)
{
$num3=rand(0,100);
$num4=rand(0,100);
}
while($num8>$num7 || ($num7%$num8!=0))
{
$num7=rand(1,100);
$num8=rand(1,100);
}
$_POST['op1']=$num1;
$_POST['op2']=$num2;
$_POST['op3']=$num3;
$_POST['op4']=$num4;
$_POST['op5']=$num5;
$_POST['op6']=$num6;
$_POST['op7']=$num7;
$_POST['op8']=$num8;
$_POST['mark']=0;
}
else if(isset($_POST['Mark']))
{
$mark=(float)$_POST['mark'];
if(
(isset($_POST['op1']) && is_numeric($_POST['op1']))
&& (isset($_POST['op2']) && is_numeric($_POST['op2']))
&& (isset($_POST['op3']) && is_numeric($_POST['op3']))
&& (isset($_POST['op4']) && is_numeric($_POST['op4']))
&& (isset($_POST['op5']) && is_numeric($_POST['op5']))
&& (isset($_POST['op6']) && is_numeric($_POST['op6']))
&& (isset($_POST['op7']) && is_numeric($_POST['op7']))
&& (isset($_POST['op8']) && is_numeric($_POST['op8']))
&& (isset($_POST['ans1']) && is_numeric($_POST['ans1']))
&& (isset($_POST['ans2']) && is_numeric($_POST['ans2']))
&& (isset($_POST['ans3']) && is_numeric($_POST['ans3']))
&& (isset($_POST['ans4']) && is_numeric($_POST['ans4'])))
{
if(($_POST['op1']+$_POST['op2'])==$_POST['ans1'])
$mark=$mark+2.5;
else
$mark=0;
if(($_POST['op3']-$_POST['op4'])==$_POST['ans2'])
$mark=$mark+2.5;
else
$mark=0;
if(($_POST['op3']*$_POST['op4'])==$_POST['ans3'])
$mark=$mark+2.5;
else
$mark=0;
if(($_POST['op5']/$_POST['op6'])==$_POST['ans4'])
$mark=$mark+2.5;
else
$mark=0;
}
$_POST['mark']=$mark;
}
else
{
$_POST['op1']="";
$_POST['op2']="";
$_POST['op3']="";
$_POST['op4']="";
$_POST['op5']="";
$_POST['op6']="";
$_POST['op7']="";
$_POST['op8']="";
$_POST['add']="";
$_POST['sub']="";
$_POST['mul']="";
$_POST['div']="";
$_POST['mark']=0;
}
?>
<html>
<head>
<title>Simple Math Quiz</title>
<head>
<body>
<h3>Your mark is <?php echo $_POST['mark'];?></h3>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
<legend><strong><h1 'text-align:center '>Welcome To the math Quiz</h1> </strong></legend>
</br>
<label><strong>First Question :</strong></label>
</br>
<input type="text" name="op1" value="<?php echo $_POST['op1']; ?>"/>
<input type="text" name="add" width="10" value="<?php echo $_POST['add']; ?>"/>
<input type="text" name="op2" value="<?php echo $_POST['op2']; ?>"/>
</br>
<p>Answer :</p>
<input type="text" name="ans1" />
</br>
</br>
<label><strong>Second Question :</strong></label></br>
<input type="text" name="op3" value="<?php echo $_POST['op3']; ?>"/>
<input type="text" name="sub" value="<?php echo $_POST['sub']; ?>"/>
<input type="text" name="op4" value="<?php echo $_POST['op4']; ?>"/>
</br>
<p>Answer :</p>
<input type="text" name="ans2" />
</br>
</br>
<label><strong>Third Question :</strong></label></br>
<input type="text" name="op5" value="<?php echo $_POST['op5']; ?>"/>
<input type="text" name="mul" value="<?php echo $_POST['mul']; ?>"/>
<input type="text" name="op6" value="<?php echo $_POST['op6']; ?>"/>
</br>
<p>Answer :</p>
<input type="text" name="ans3" />
</br>
</br>
<label><strong>Fourth Question :</strong></label></br>
<input type="text" name="op7" value="<?php echo $_POST['op7']; ?>"/>
<input type="text" name="div" value="<?php echo$_POST['div']; ?>"/>
<input type="text" name="op8" value="<?php echo $_POST['op8']; ?>"/>
</br>
<p>Answer :</p>
<input type="text" name="ans4" />
</br>
</br>
<input type="hidden" name="mark" value="<?php echo $_POST['mark']; ?>" />
<button type="submit" id="Mark" name="Mark">Mark</button>
<button type="submit" name="start">Start</button>
</form>
</body>
</html>
推荐阅读
- matlab - 在多个功能块之间共享大型结构
- marklogic - JSON 文档的模式验证
- javascript - 警告:flatten 不是函数使用 --force 继续
- sql - 如何在 SQL Server 中发送带有屏蔽正则表达式的查询?
- java - 获取排除测试依赖项的 Maven 依赖项列表
- python - 如何在动态生成数字时命名列表?
- visual-studio - WinAppDriver 连续抛出一个错误为“未知错误,操作超时”
- php - Ubuntu CLI,PHP 和 php.ini 的新路径
- tensorflow-datasets - 无法让 model.fit 函数接受 tensorflow 数据集。维度的一些问题
- kvm - Libvirt 5.9.0 的滞后