php实现网站四则运算。

1.设计思路:
  在index.php中建立两个表单,有两个提交,一个跳转到fourArithmeticOperation.php,这里保存用户输入的参数到config.txt中,留给main函数调出。界面跳转到main.php。main.php执行简单四则运算。main.php中调用exercise类中的randomNumber函数,将生成的习题和结果写入到txt,main.php再读出显示给用户,待用户输入结果后,再输出判断结果。并将当前执行次数写入到time.txt。然后再次执行main.php。当time中的参数达到用户定制数量要求时,界面跳转到quit.php中,此处有一个按钮,点击界面跳转到load.php,执行下载exercise.txt文件。
  另一个提交,跳转到multitermOperation.php,其思路与上面几乎相同,差别在main1.php调用的为exercise类中的randomFormula函数。
2.源代码
index.php
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <form method = "post" action = "fourArithmeticOperation.php"> 简单四则运算 <input type = "submit" name = "continue" value = "简单四则运算"></form> <form method = "post" action = "multitermOperation.php"> 多项运算 <input type = "submit" name = "continue" value = "多项运算"></form> <?php if(isset($_REQUEST["continue"])) { } ?> </html>

fourArithmeticOperation.php <!DOCTYPE html> <html> <head> <meta charset = "UTF-8"> <title></title> </head> <form method = "get" action = "fourArithmeticOperation.php"> 简单四则运算 <br> 习题数量 <input type = "text" name = "test1" > <br> 数值范围 <input type = "text" name = "test2" > <br> <input type = "submit"></form> <body> <?php if(isset($_REQUEST["test1"]) && (isset($_REQUEST["test2"]))) { $open1 = fopen("config.txt","w+" ); //config.txt用于存放用户在表单输入的参数。 fwrite($open1,$_REQUEST["test1"]." ".$_REQUEST["test2"]); fclose($open1); $open2 = fopen("time.txt","w+" ); //time.txt用于更新用户当前答题数量。 fwrite($open2,"0"); fclose($open2); $open3 = fopen("exercise.txt","w+" ); //exercise.txt用于存放本次程序所出试题,同时用于判断是否有重复。 fclose($open3); header("Refresh:0;url = main.php"); //配置完成后跳转到主程序页面。 } ?> </body> </html>

multitermOperation.php <!DOCTYPE html> <html> <head> <meta charset = "UTF-8"> <title></title> </head> <form method = "get" action = "multitermOperation.php"> 多项运算 <br> 习题数量 <input type = "text" name = "test3" > <br> 数值范围 <input type = "text" name = "test4" > <br> <input type = "submit"></form> <body> <?php if(isset($_REQUEST["test3"]) && (isset($_REQUEST["test4"]))) { $open1 = fopen("config.txt","w+" ); //config.txt用于存放用户在表单输入的参数。 fwrite($open1,$_REQUEST["test3"]." ".$_REQUEST["test4"]); fclose($open1); $open2 = fopen("time.txt","w+" ); //time.txt用于更新用户当前答题数量。 fwrite($open2,"0"); fclose($open2); $open3 = fopen("exercise.txt","w+" ); //exercise.txt用于存放本次程序所出试题,同时用于判断是否有重复。 fclose($open3); header("Refresh:0;url = main1.php"); //配置完成后跳转到主程序页面。 } ?> </body> </html>

main.php <?PHP static $flag = true; //用于标记是否出题,逻辑上的变量。 $open0 = file("config.txt"); $range = chop($open0[1]); //读取随机数大小上限。 if(!(isset($_REQUEST["answer"])) && $flag) //出现回答后不再运行。 { include("exercise.php"); $object = new exercise(); $object->randomNumber($range); $flag = false; } $open1 = fopen("exercise.txt",'r'); //读取exercise.txt的最后一行数据,即当前试题。 while($buf = fgets($open1)) { $res = $buf; } fclose($open1); echo $res; if(isset($_REQUEST["answer"])) //输出答案和输入结果。 { echo file_get_contents("result.txt")."<br>"."您的结果为:".$_REQUEST["answer"]."<br>"; } else { ?> <form method = "post"> <input type = "text" name = "answer"><br> <input type = "submit"></form> <?PHP } if(isset($_REQUEST["answer"])) //输入结果后进行判断。 { judge($_REQUEST["answer"]); } function judge($answer) { $result = file_get_contents("result.txt"); if($result == $answer) { echo "结果正确 "; } else { echo "结果错误 "; } $open2 = file("config.txt"); $timeMax = chop($open2[0]); //读取习题数量。 $open3 = file("time.txt"); $time = chop($open3[0]); //读取当前为第几题。 if($time < $timeMax - 1) //习题未出完时,当前题数加一,更新time.txt,重新运行main.txt { echo "(第".($time + 1)."/".($timeMax)."题)"; $time++; $open3 = fopen("time.txt","w+" ); fwrite($open3,"$time"); fclose($open3); ?> <form method = "post" action = "main.php"> <input type = "submit" value = "下一题"></form> <?PHP } else //否则跳转到退出界面。 { echo "答题完毕。"; header("Refresh:3;url = quit.php"); } }

main1.php
<?PHP static $flag = true; //用于标记是否出题,逻辑上的变量。 $open0 = file("config.txt"); $range = chop($open0[1]); //读取随机数大小上限。 if(!(isset($_REQUEST["answer1"])) && $flag) //出现回答后不再运行。 { include("exercise.php"); $object = new exercise(); $object->randomFormula($range); $flag = false; } $open1 = fopen("exercise.txt",'r'); //读取exercise.txt的最后一行数据,即当前试题。 while($buf = fgets($open1)) { $res = $buf; } fclose($open1); echo $res; if(isset($_REQUEST["answer1"])) //输出答案和输入结果。 { echo file_get_contents("result.txt")."<br>"."您的结果为:".$_REQUEST["answer1"]."<br>"; } else { ?> <form method = "post"> <input type = "text" name = "answer1"><br> <input type = "submit"></form> <?PHP } if(isset($_REQUEST["answer1"])) //输入结果后进行判断。 { judge($_REQUEST["answer1"]); } function judge($answer) { $result = file_get_contents("result.txt"); if($result == $answer) { echo "结果正确 "; } else { echo "结果错误 "; } $open2 = file("config.txt"); $timeMax = chop($open2[0]); //读取习题数量。 $open3 = file("time.txt"); $time = chop($open3[0]); //读取当前为第几题。 if($time < $timeMax - 1) //习题未出完时,当前题数加一,更新time.txt,重新运行main.txt { echo "(第".($time + 1)."/".($timeMax)."题)"; $time++; $open3 = fopen("time.txt","w+" ); fwrite($open3,"$time"); fclose($open3); ?> <form method = "post" action = "main1.php"> <input type = "submit" value = "下一题"></form> <?PHP } else //否则跳转到退出界面。 { echo "答题完毕。"; header("Refresh:3;url = quit.php"); } }

exercise.php
<?PHP class exercise { public $numberA; public $numberB; public $numberC; public $result; public function exercise() { $this->numberA = null; $this->numberB = null; $this->result = null; } public function randomFormula($a) { $symbolA = rand(0,3); $symbolB = rand(0,3); $this->numberA = rand(0,$a); $this->numberB = rand(0,$a); $this->numberC = rand(0,$a); $openA = fopen("exercise.txt","a" ); $openB = fopen("result.txt","w+" ); fwrite($openA,$this->numberA.symbol($symbolA).$this->numberB.symbol($symbolB).$this->numberC." = "." "); fwrite($openB,$this->result); if($symbolA == 0) { if($symbolB == 0) { $this->result = $this->numberB + $this->numberC; } if($symbolB == 1) { $this->result = $this->numberB - $this->numberC; } if($symbolB == 2) { $this->result = $this->numberB * $this->numberC; } if($symbolB == 3) { $this->result = $this->numberB / $this->numberC; } $this->result += $this->numberA; } if($symbolA == 1) { if($symbolB == 0) { $this->result = $this->numberA - $this->numberB + $this->numberC; } if($symbolB == 1) { $this->result = $this->numberA - $this->numberB - $this->numberC; } if($symbolB == 2) { $this->result = $this->numberA - $this->numberB * $this->numberC; } if($symbolB == 3) { $this->result = $this->numberA - $this->numberB / $this->numberC; } } if($symbolA == 2) { if($symbolB == 0) { $this->result = $this->numberA * $this->numberB + $this->numberC; } if($symbolB == 1) { $this->result = $this->numberA * $this->numberB - $this->numberC; } if($symbolB == 2) { $this->result = $this->numberA * $this->numberB * $this->numberC; } if($symbolB == 3) { $this->result = $this->numberA * $this->numberB / $this->numberC; } } if($symbolA == 3) { if($symbolB == 0) { $this->result = $this->numberA / $this->numberB + $this->numberC; } if($symbolB == 1) { $this->result = $this->numberA / $this->numberB - $this->numberC; } if($symbolB == 2) { $this->result = $this->numberA / $this->numberB * $this->numberC; } if($symbolB == 3) { $this->result = $this->numberA / $this->numberB / $this->numberC; } } fwrite($openB,$this->result); fclose($openA); fclose($openB); } public function randomNumber($a) { $case2 = "0"; $symbol = rand(0,3); $this->numberA = rand(0,$a); $this->numberB = rand(0,$a); $openA = fopen("exercise.txt","a" ); $openB = fopen("result.txt","w+" ); if($symbol == 0) { $this->result = $this->numberA + $this->numberB; $case1 = $this->numberA." + ".$this->numberB." = "." "; $case2 = $this->numberB." + ".$this->numberA." = "." "; if(isRepeat($openA,$case1,$case2)) { fwrite($openA,$this->numberA." + ".$this->numberB." = "." "); } } if($symbol == 1) { $this->numberB = rand(0,$this->numberA); $case1 = $this->numberA." - ".$this->numberB." = "." "; $this->result = $this->numberA - $this->numberB; if(isRepeat($openA,$case1,$case2)) { fwrite($openA,$this->numberA." - ".$this->numberB." = "." "); } } if($symbol == 2) { $case1 = $this->numberA." * ".$this->numberB." = "." "; $case2 = $this->numberB." * ".$this->numberA." = "." "; $this->result = $this->numberA * $this->numberB; if(isRepeat($openA,$case1,$case2)) { fwrite($openA,$this->numberA." * ".$this->numberB." = "." "); } } if($symbol == 3) { $this->numberB = rand(1,$a); $this->numberA = rand(1,$this->numberB); $case1 = $this->numberA." / ".$this->numberB." = "." "; $gcd = getGreatestCommonDivisor($this->numberA,$this->numberB); $this->result = ($this->numberA / $gcd)."/".($this->numberB / $gcd); if($this->result == "1/1") { $this->result = "1"; } if(isRepeat($openA,$case1,$case2)) { fwrite($openA,$this->numberA." / ".$this->numberB." = "." "); } } fwrite($openB,$this->result); fclose($openA); fclose($openB); } } function symbol($a) { $symbol = ""; switch($a) { case 0: $symbol = " + ";break; case 1: $symbol = " - ";break; case 2: $symbol = " * ";break; case 3: $symbol = " / ";break; } return $symbol; } function isRepeat($open1,$case1,$case2) { while($buf = fgets($open1)) { if($buf == $case1 || $buf == $case2) { header("Refresh:0;url = main.php"); return false; } else { continue; } } return true; } function getGreatestCommonDivisor($numberA,$numberB) { $n = 0; while($numberB > 0) { $n = $numberA % $numberB; $numberA = $numberB; $numberB = $n; } return $numberA; }

quit.php
<?php echo "欢迎再次使用!"; ?> <form method = "post" action = "load.php"> <input type = "submit" value = "下载习题">

load.php <?php $filename = "exercise.txt"; header('Content-Type‘txt'); //指定下载文件类型 header('Content-Disposition: attachment; filename="'.$filename.'"'); //指定下载文件的描述 header('Content-Length:'.filesize($filename)); //指定下载文件的大小 readfile($filename);//将文件内容读取出来并直接输出,以便下载

 3.结果截图

4.难点分析

  编码一开始难点就在如何使用表单中得到的值,如果提交到当前文件中,会使另一个文件中使用不了,即使提交到别的文件中,也很有局限性。所以实现一个数的运算及比较都花了很长时间。上网查了很多,后来发现可以存到txt中实现,虽然打开关闭的很麻烦,但好在逻辑上没错。后来在网上提问和web上机时,发现了session功能(还没有在php中尝试)。还有一些小问题也困扰过我,如不知道<?php ?>,if,else和表单之间的嵌套,不知道txt的读取打开方式和下载以及php中类的声明等等。

5.耗时

原文地址:https://www.cnblogs.com/shenshenxin/p/5375184.html