一,程序设计思路
在详细的查看了观察《冀教版数学二年级上册口算练习》文档之后,可以发现:1. 算式中每个数不能超过 100,运算结果不能超过 100.2. 运算结果必须得是正整数,除法不能出现余数.3. 乘法算式的范围在 9 X 9 乘法表内,除法算式同样.4. 可以出现一部分混合运算,但仅限于加减法而且不带括号优先级.
根据上述规则,可以采用如下方式产生算式:
首先可以明确,在一定范围内,随机数的产生结果不会有大规模的重复现象,查重很耗费时间.
操作符通过 1-4 的随机数产生,一个数对应一个操作符.
对于加法算式,第一个操作数 opre1 直接在 1-99 内生成,第二个操作数在 100-opre1 到 1 之间生成.
对于减法算式,第一个操作数 opre1 直接在 1-99 内生成,第二个操作数在 opre1 到 1 之间生成.
对于乘法,两个操作数均在 1-9 内产生.
对于除法,先产生两个 1-9 之间的随机数 opre1,opre2,然后让 opre1 = opre1*opre2,opre2 不变,opre1 作为算式的答案.
对于三个操作数的混合运算,原理同上.
由于要改成网页版,所以按照 MVC 的框架模式来划分:
视图(View)有三个界面,首页获取小孩儿输入的题目数量(用 JavaScript 脚本检验输入数据的合法性),将这个题目数量发送到题目展示界面 proshow.jsp,这个界面会使用 GradeTwo 中产生算式的静态方法,并产生答案.在这个界面上要输入计算结果,点击提交后将答案发送到 Servlet 中判断结果.Servlet 处理后会将结果信息发送到 result.jsp 中显示.
模型(Model)就是 GradeTwo 这个类,这个类中有好几个静态变量的集合,分别储存算式,答案,结果.在每次重新产生算式时,三个集合清空.这个类中还有产生表达式的方法,判断答案对错的方法,供外界调用.
控制(Control)就是 Servlet,主要就是把 proshow.jsp 传递过来的结果进行验证,并把结果集传递给 result.jsp 中显示,没有其他的流程了.
二,源代码
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.Vector;
public class GradeTwo {
private static String opera = "+-*/";
public static Vector<String> pro = new Vector<String>();
public static Vector<String> key = new Vector<String>();
//public static Vector<String> key1 = new Vector<String>();
public static String[]result1;
public static int[]end = new int[3];
public static void solve(String[]list) {
result1 = new String[list.length];
for(int i = 0;i<list.length;++i)
result1[i]= list[i];
}
public static void clear() {
pro.clear();
key.clear();
}
public static int isInteger(int c1, int c2, char opera) {
int result = 0;
int result1 = 0;
switch (opera) {
case '+':
result = c1 + c2;
break;
case '-':
result = c1 - c2;
break;
case '*':
result = c1 * c2;
break;
case '/':
result = c1 / c2;
result1 = c1 % c2;
break;
}
if (result >= 0 && result <= 100 && result1 == 0)
return result;
else
return -1;
}
public static String getPoly() {
String poly = "";
// Random random = new Random();
//
// int c1;
// int c2;
// int result;
// char operac;
// boolean flag = true;
// do {
// c1 = random.nextInt(100) + 1;
// c2 = random.nextInt(100) + 1;
// operac = opera.charAt(random.nextInt(4));
// if (operac == '*')
// poly = c1 + " × " + c2 + " = ";
// if (operac == '/')
// poly = c1 + " ÷ " + c2 + " = ";
// if (operac == '+')
// poly = c1 + " + " + c2 + " = ";
// if (operac == '-')
// poly = c1 + " - " + c2 + " = ";
// /*for (int i = 0;i<pro.size();++i) {
// if (poly.equals(pro.get(i))) {
// flag = false;
// break;
// }
// }*/
// } while (!flag || (result = isInteger(c1, c2, operac)) < 0);
// pro.add(poly);
// key.add(String.valueOf(result));
Random random = new Random();
//产生0.9的两位运算,0.1的三位运算
char operate;
char operate1;
int operand1 = 0;
int operand2 = 0;
int operand3 = 0;
int result;
int percent = random.nextInt(100)+1;
if(percent<=90) {
operate = opera.charAt(random.nextInt(4));
switch(operate) {
case '+':
operand1 = random.nextInt(100);
operand2 = random.nextInt(100-operand1);
poly = operand1+" + "+operand2+" = ";
break;
case '-':
operand1 = random.nextInt(100)+1;
operand2 = random.nextInt(operand1);
poly = operand1+" - "+operand2+ " = ";
break;
case '*':
operand1 = random.nextInt(9)+1;
operand2 = random.nextInt(9)+1;
poly = operand1+" × "+operand2+ " = ";
break;
case '/':
operand1 = random.nextInt(9)+1;
operand2 = random.nextInt(9)+1;
operand1 = operand1*operand2;
poly = operand1+" ÷ "+operand2+ " = ";
break;
}
result = isInteger(operand1, operand2, operate);
key.add(String.valueOf(result));
}else {
operate = opera.charAt(random.nextInt(2));
operate1 = opera.charAt(random.nextInt(2));
if(operate=='+') {
operand1 = random.nextInt(100);
operand2 = random.nextInt(100-operand1);
if(operate1=='+') {
operand3 = random.nextInt(100-operand1-operand2);
poly = operand1+" + "+operand2+" + "+operand3+" = ";
}else {
operand3 = random.nextInt(operand1+operand2);
poly = operand1+" + "+operand2+" - "+operand3+" = ";
}
}else {
operand1 = random.nextInt(100)+1;
operand2 = random.nextInt(operand1);
if(operate1=='+') {
operand3 = random.nextInt(100-operand1+operand2);
poly = operand1+" - "+operand2+" + "+operand3+" = ";
}else {
operand3 = random.nextInt(operand1-operand2);
poly = operand1+" - "+operand2+" - "+operand3+" = ";
}
}
result = isInteger(operand1, operand2, operate);
result = isInteger(result, operand3, operate1);
key.add(String.valueOf(result));
}
pro.add(poly);
return poly;
}
public static void End(String[]list){
//int[]result = new int[3];
end[0] = 0;
end[1] = 0;
end[2] = 0;
int len = list.length;
for(int i = 0;i<len;++i) {
if(key.get(i).equals(list[i]))end[0]++;
else {
if(list[i].equals(""))end[2]++;
else end[1]++;
}
}
return;
}
public static void main(String[]args) {
Scanner s = new Scanner(System.in);
System.out.print("输入题目数量:");
int num = s.nextInt();
String str = null;
for(int i = 1;i<=num;++i) {
str = GradeTwo.getPoly();
System.out.println(str);
}
}
}
import CC.GradeTwo;
import javax.servlet.http.HttpServlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GradeServlet extends HttpServlet{
public void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
String method = req.getParameter("method");
if(method.equals("end"))end(req,resp);
}
public void end(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
String[]keys = req.getParameterValues("list");
//req.setAttribute("result",GradeTwo.end(keys));
GradeTwo.End(keys);
for(int i = 0;i<keys.length;++i)
if(keys[i].equals(""))keys[i] = "未答";
GradeTwo.solve(keys);
//req.setAttribute("result1",keys);
//req.getRequestDispatcher("").forward(req, resp);
resp.sendRedirect("../result.jsp");
return;
}
}
import javax.servlet.http.HttpServlet;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class KeyFilter implements Filter{
protected FilterConfig filterConfig;
@Override
public void destroy() {
// TODO 自动生成的方法存根
filterConfig = null;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO 自动生成的方法存根
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
HttpSession session = req.getSession();
String flag = (String)session.getAttribute("online");
String reqURL = req.getServletPath();
if(!reqURL.equals("/index.jsp")&&flag==null) {
resp.sendRedirect("index.jsp");
return;
}
chain.doFilter(request,response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO 自动生成的方法存根
this.filterConfig = filterConfig;
}
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>小学二年级算式计算</title>
<style type="text/css">
body{
font-family:微软雅黑;
background-repeat: no-repeat;
background-size:100%;
}
#t1{
position:absolute;
width:400px;
height:260px;
left:0;
right:0;
top:0;
bottom:0;
margin:auto;
color:#FFFFFF;
background-color:#000000;
opacity:0.4;
box-shadow:0px 0px 10px #777777;
border-radius:10px 10px 10px 10px;
}
#t2{
position:absolute;
width:400px;
height:25px;
top:15px;
font-size:25px;
}
#t3{
position:absolute;
width:400px;
height:180px;
top:70px;
}
</style>
</head>
<script type="text/javascript">
function check(form){
str = form.num.value;
if(str==""){
alert("题目数量不能为空!");
return false;
}
for(i=0;i<str.length;++i)
if(str[i]<'0'||str[i]>'9'){
alert("请输入合法的数字!");
return false;
}
num = parseInt(str);
if(num<=0||num>60){
alert("题目数量请固定在1到60之间");
return false;
}
return true;
}
</script>
<div align="center"><%@ include file="./music.jsp" %></div>
<body background="timg.jpg">
<div id = "t1">
<div id="t2" align="center">小学二年级算式计算</div>
<div id="t3" align="center">
<p align="center">本页仅供二年级的小同学测试使用,100以内加减乘除算式计算题,每道题限时8秒钟.</p>
<%session.setAttribute("online", "true"); %>
<form name="form1" action="proshow.jsp" method="post" onsubmit="return check(form1)">
<p><label>输入题目数量:</label><label><input type="text" name="num"></label></p>
<p><label ><input type="submit" value="确定"></label></p>
</form>
</div>
</div>
</body>
</html>
<%@page import="CC.GradeTwo" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src=JS/jquery.min.js charset="GBK"></script>
<script type="text/javascript" src=JS/jrj6out.js charset="GBK"></script>
<script type="text/javascript" src=JS/prefixfree.min.js charset="GBK"></script>
<script type="text/javascript" src=JS/three.min.js charset="GBK"></script>
<script type="text/javascript" src=JS/TweenMax.min.js charset="GBK"></script>
<link href="CSS/style.css" rel="stylesheet">
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="refresh" content="text/html; charset=UTF-8">
<script type="text/javascript">
var num = <%=request.getParameter("num")%>
var maxtime = 8*parseInt(num);
function CountDowm(){
if(maxtime>=0){
minutes = Math.floor(maxtime/60);
seconds = Math.floor(maxtime%60);
if(seconds>=10)
msg = "剩余时间:"+minutes+":"+seconds;
else
msg = "剩余时间:"+minutes+":0"+seconds;
document.all["timer"].innerHTML = msg;
--maxtime;
}
else{
document.forms("form1").submit();
}
}
timer = setInterval("CountDowm()",1000);
</script>
<style>
form{
background-color: rgba(255,255,255,0);
}
.wrapper{
display: absolute;
top:0;
right:0;
width:100%;
}
</style>
<title>小学二年级算式计算</title>
</head>
<%
String str = null;
int num = Integer.parseInt(request.getParameter("num"));
%>
<body>
<%
request.setCharacterEncoding("utf-8");
%>
<div class="intro-container">
<div style="overflow: auto">
<jsp:include flush="true" page="inc.jsp">
<jsp:param name="color" value="blue" />
<jsp:param name="title" value="小学二年级" />
<jsp:param name="body" value="数学口算题" />
</jsp:include>
<%@ include file="./music.jsp" %>
<div id="timer"></div>
<form name="form1" action="${pageContext.request.contextPath}/Servlet/GradeServlet?method=end" target="_self" method="post">
<table align="center" style="color:white">
<tr><th colspan="3">共<%=num %>题,注意用时</th></tr>
<% GradeTwo.clear();
for(int i = 1;i<=num;++i) {
str = GradeTwo.getPoly();
%>
<tr><td>第<%=i %>题</td><td><%=str %></td><td><input type="text" name="list"></td></tr>
<%
}
%>
<tr><td colspan="3" align="center"><input type="submit" value="提交"></td></tr>
</table>
</form>
</div>
</div>
<script type="text/javascript" src=JS/index.js charset="GBK"></script>
</body>
</html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@page import="CC.GradeTwo" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src=JS/jquery.min.js charset="GBK"></script>
<script type="text/javascript" src=JS/jrj6out.js charset="GBK"></script>
<script type="text/javascript" src=JS/prefixfree.min.js charset="GBK"></script>
<script type="text/javascript" src=JS/three.min.js charset="GBK"></script>
<script type="text/javascript" src=JS/TweenMax.min.js charset="GBK"></script>
<link href="CSS/style.css" rel="stylesheet">
<title>答案</title>
</head>
<body>
<div class="intro-container">
<div style="overflow: auto">
<%@ include file="./music.jsp" %>
<h3 align="center" style="color:red">答题结果</h3>
<%
int[]end = GradeTwo.end;
String str[] = GradeTwo.result1;
%>
<table align="center" border="1">
<tr><th>答对:</th><td><%=end[0] %></td></tr>
<tr><th>答错:</th><td><%=end[1] %></td></tr>
<tr><th>未答:</th><td><%=end[2] %></td></tr>
</table><p>
<p align="center" style="color:red">答题情况</p>
<table align="center" border="1">
<tr><td>题目</td><td>提交答案</td><td>正确答案</td></tr>
<%
String color = "";
int num = GradeTwo.key.size();
for(int i = 0;i<num;++i){
if(GradeTwo.key.get(i).equals(str[i])){
%>
<tr><td><%=GradeTwo.pro.get(i) %></td><td style="color:green"><%=str[i] %></td><td><%=GradeTwo.key.get(i) %></td></tr>
<%}
else{
%>
<tr><td><%=GradeTwo.pro.get(i) %></td><td style="color:red"><%=str[i] %></td><td><%=GradeTwo.key.get(i) %></td></tr>
<%
}
}
%>
</table>
<div align="center"><input type="button" value="再来一次" onclick="window.location.href='<%=request.getContextPath()%>/index.jsp'" /></div>
</div>
</div>
<script type="text/javascript" src=JS/index.js charset="GBK"></script>
</body>
</html>
三,验证截图
来源: http://www.bubuko.com/infodetail-2474120.html