1.实验要求:
2.实验思路:使用jsp Javabean和servlet来实现,Javabean定义实体类,定义能根据设置的参数产生出对应的方法,jsp页面用来让用户选择参数,做题和查看历史记录,servlet根据jsp传的数据进行响应和处理。
首先有一个选择界面的jsp,如果选择做题就跳转到设置参数的jsp,设置好参数后,传到servlet,servlet根据传过来的参数产生题目,存储好以后,跳转到显示题目的jsp页面,用户可以输入答案,当交卷的时候会提交到判断的servlet,servlet根据传过的答案和正确答案进行比较,并输出做对和做错的题号,然后输出每道题和每道题的判断结果;如果选择的是查看历史记录,就会查看以前所做的题目。
3.实验代码:
//选择做题还是查询历史记录
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>请选择是做题还是查询历史记录</h1>
<hr>
<br>
<br>
<br>
<a href="setParam.jsp"><input type="button" value="开始做题"></a>
<a href="selectServlet"><input type="button" value="查询历史记录"></a>
</body>
</html>
//设置参数,比如是否要括号,做真分数还是整数等等
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>
span {
color:blue;
}
</style>
<script type="text/javascript">
$(function()
{
$('#formbackground').height($(window).height());
$('#formbackground').width($(window).width());
}
);
</script>
<script type="text/javascript">
function $(id)
{
return document.getElementById(id);
}
function check() {
var num=$("num").value;
var scope=$("scope").value;
$("numinfo").innerHTML="";
$("scopeinfo").innerHTML="";
if(num=="")
{
$("numinfo").innerHTML="题数不能为空,请输入题数";
$("num").focus();
return false;
}
if(scope=="")
{
$("scopeinfo").innerHTML="取值范围不能为空,请输入范围";
$("scope").focus();
return false;
}
return true;
}
</script>
<title>Insert title here</title>
</head>
<body>
<h1>请选择做题的类型</h1>
<br>
<form action="setParamServlet" method="post" onsubmit="return check()">
<table>
<tr>
<td>类型:</td>
<td>整数<input type="radio" name="type" value="2" checked="checked"></td>
<td>真分数<input type="radio" name="type" value="1"></td>
</tr>
<tr>
<td>题数:</td>
<td><input type="text" name="num" id="num"><span id="numinfo"></span></td>
</tr>
<tr>
<td>取值范围:</td>
<td><input type="text" name="scope" id="scope"><span id="scopeinfo"></span></td>
</tr>
<tr>
<td>是否含有括号</td>
<td>无<input type="radio" name="isBracket" value="2" checked="checked"></td>
<td>有<input type="radio" name="isBracket" value="1"></td>
</tr>
<tr>
<td><input type="submit" value="确认"> <input type="reset" value="取消"></td>
</tr>
</table>
</form>
</body>
</html>
设置参数jsp
//产生题目的servlet
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import util.publicUse;
/**
* Servlet implementation class setParamServlet
*/
@WebServlet("/setParamServlet")
public class setParamServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public setParamServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
publicUse P = new publicUse();
response.setContentType("text/html;charset=utf-8");
String type;//题目类型
int num;//题数
int scope;//范围
String isBracket;//是否含有括号
type=request.getParameter("type");
num=Integer.parseInt(request.getParameter("num"));
scope=Integer.parseInt(request.getParameter("scope"));
isBracket=request.getParameter("isBracket");
PrintWriter out = response.getWriter();
System.out.println(type+"\t"+num+"\t"+scope+"\t"+isBracket);
int choose1=Integer.parseInt(type);
int choose2=Integer.parseInt(isBracket);
try {
String rs[]=new String[2*num];
rs=P.operationAndStatistical(choose1, choose2, num,scope);
String []bds = new String[num];//存取表达式
String []rs1 = new String[num];//存取结果
for(int i=0;i<num;i++)
{
bds[i] = rs[i];
rs1[i] = rs[i + num];
}
request.getSession().setAttribute("bds", bds);
request.getSession().setAttribute("rs1", rs1);
request.getSession().setAttribute("num", num);
request.getRequestDispatcher("show.jsp").forward(request, response);
// response.sendRedirect(request.getContextPath()+"/show.jsp");
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
产生题目的servlet
//显示题目
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<script type="text/javascript">
function $(id) {
return document.getElementById(id);
}
function check(){
var result = document.getElementsByName('result');
for(var i = 0;i < result.length;i++)
{
if(result[i].value=="")
{
$("" + i).innerHTML = "请输入答案";
result[i].focus();
return false;
}
else{
$("" + i).innerHTML ="";
result[i].focus();
}
}
function init(){
}
return true;
}
</script>
</head>
<body>
<h1>请在此处答题:</h1>
<hr>
<%
%>
<form action="judgeServlet" method="post" onsubmit="return check()">
<table>
<%
int num=(Integer)request.getSession().getAttribute("num");
String []a=(String[])request.getSession().getAttribute("bds");
for(int i=0;i<num;i++)
{
%><tr>
<td>请作答第<%=i+1 %>道题:</td>
<td><%=a[i] %></td>
<td><input type="text" name="result" /><span id=<%=i %>></span></td>
</tr>
<%
}
%>
<tr>
<td><input type="submit" value="交卷"></td>
</tr>
</table>
</form>
</body>
</html>
做题页面jsp
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import entity.data;
import jdbc.insertsj;
import util.solve;
/**
* Servlet implementation class judgeServlet
*/
@WebServlet("/judgeServlet")
public class judgeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public judgeServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String []bds =(String[]) request.getSession().getAttribute("bds");//获取表达式
String []rs =(String[]) request.getSession().getAttribute("rs1");//获取正确结果
String []inputrs = request.getParameterValues("result");//获取输入的结果
solve s = new solve();
boolean[]sz = s.judgeIfTrue(rs, inputrs);//判断是否正确
int[] idnum = new int[rs.length];//存取题号
int[]count = s.zongjie(sz);
String[]qiq = s.qiq(sz);
String[]count1 = s.countexpression(bds, rs, inputrs, sz);
out.println("正确的题数"+count[0]+"<br>");
out.println("错误的题数"+count[1]+"<br>");
out.println(qiq[0]+"<br>");
out.println(qiq[1]+"<br>");
for(int i=0;i<rs.length;i++)
{
idnum[i]=i+1;
out.println(count1[i]+"<br>");
}
data []a = new data[rs.length];
for(int i=0;i<rs.length;i++)
{
a[i] = new data();
a[i].setId(idnum[i]);
a[i].setTitleexception(bds[i]);
a[i].setResult(rs[i]);
a[i].setInputrs(inputrs[i]);
a[i].setIftrue(sz[i]);
}
insertsj out1 =new insertsj();
try {
out1.cunchu(a);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// response.sendRedirect(request.getContextPath()+"/showResult.jsp");
// request.getRequestDispatcher("showResult.jsp").forward(request, response);
out.print("<a href='choose.jsp'>返回</a>");
}
}
判断是否正确,并将结果输出的servlet和和讲题目存档
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import entity.data;
import jdbc.insertsj;
import util.solve;
/**
* Servlet implementation class judgeServlet
*/
@WebServlet("/judgeServlet")
public class judgeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public judgeServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String []bds =(String[]) request.getSession().getAttribute("bds");//获取表达式
String []rs =(String[]) request.getSession().getAttribute("rs1");//获取正确结果
String []inputrs = request.getParameterValues("result");//获取输入的结果
solve s = new solve();
boolean[]sz = s.judgeIfTrue(rs, inputrs);//判断是否正确
int[] idnum = new int[rs.length];//存取题号
int[]count = s.zongjie(sz);
String[]qiq = s.qiq(sz);
String[]count1 = s.countexpression(bds, rs, inputrs, sz);
out.println("正确的题数"+count[0]+"<br>");
out.println("错误的题数"+count[1]+"<br>");
out.println(qiq[0]+"<br>");
out.println(qiq[1]+"<br>");
for(int i=0;i<rs.length;i++)
{
idnum[i]=i+1;
out.println(count1[i]+"<br>");
}
data []a = new data[rs.length];
for(int i=0;i<rs.length;i++)
{
a[i] = new data();
a[i].setId(idnum[i]);
a[i].setTitleexception(bds[i]);
a[i].setResult(rs[i]);
a[i].setInputrs(inputrs[i]);
a[i].setIftrue(sz[i]);
}
insertsj out1 =new insertsj();
try {
out1.cunchu(a);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// response.sendRedirect(request.getContextPath()+"/showResult.jsp");
// request.getRequestDispatcher("showResult.jsp").forward(request, response);
out.print("<a href='choose.jsp'>返回</a>");
}
}
判断是否正确,并将结果输出的servlet和和讲题目存档
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>历史记录页面</h1>
<%
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String s=(String)request.getSession().getAttribute("s1");
String []s1 = s.split(s);
if(s1.length==0)
{
%>你还没有历史记录<%
}
else
{
for(int i=0;i<s1.length;i++)
{
out.print(s1[i] + "<br>");
}
}
%>
<a href="choose.jsp">返回</a>
</body>
</html>
显示做题记录的jsp
我把需要用的方法和用调用的参数都已经分好类:
如下图:
entity用来存取实体类,也就是数据库对应的那些参数,一开始写了三个,最后只有一个用上了,内容如下:
package entity;
public class data {
private int id;//题号
private String titleexception;//表达式
private String result;//正确结果
private String inputrs;//输入结果
private boolean iftrue;//判断对错
public data()
{
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitleexception() {
return titleexception;
}
public void setTitleexception(String titleexception) {
this.titleexception = titleexception;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public String getInputrs() {
return inputrs;
}
public void setInputrs(String inputrs) {
this.inputrs = inputrs;
}
public boolean isIftrue() {
return iftrue;
}
public void setIftrue(boolean iftrue) {
this.iftrue = iftrue;
}
}
entity
第二个是jdbc,也就是连接数据库,查询和插入的方法:
package jdbc;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
import entity.data;
public class insertsj {
public void cunchu(data[]a) throws SQLException
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try
{
conn = (Connection) JdbcUtils.getConnection();
String sql = "insert into wzw3 (idnum,titleexception,result,inputrs,iftrue) values(?,?,?,?,?)";
ps = conn.prepareStatement(sql);
for(int k=0;k<a.length;k++)
{
ps.setInt(1, a[k].getId());
ps.setString(2, a[k].getTitleexception());
ps.setString(3, a[k].getResult());
ps.setString(4, a[k].getInputrs());
ps.setBoolean(5, a[k].isIftrue());
ps.executeUpdate();
}
}
finally
{
JdbcUtils.free(rs, ps, conn);
}
}
}
插入的
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public final class JdbcUtils {
private static String url = "jdbc:mysql://localhost:3306/wzw1";
private static String user = "wzw1";
private static String password = "121203";
private JdbcUtils()
{}
static {
try{
Class.forName("com.mysql.jdbc.Driver");
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException
{
return DriverManager.getConnection(url,user,password);
}
public static void free(ResultSet rs, Statement ps, com.mysql.jdbc.Connection conn) throws SQLException {
// TODO Auto-generated method stub
try{
if(rs!=null)
{
rs.close();
}
}
catch(SQLException e)
{
e.printStackTrace();
}
finally {
try{
if(ps!=null)
ps.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
finally {
if(conn!=null)
{
conn.close();
}
}
}
}
public static void free(ResultSet rs, PreparedStatement ps, com.mysql.jdbc.Connection conn) throws SQLException {
// TODO Auto-generated method stub
try{
if(rs!=null)
{
rs.close();
}
}
catch(SQLException e)
{
e.printStackTrace();
}
finally {
try{
if(ps!=null)
ps.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
finally {
if(conn!=null)
{
conn.close();
}
}
}
}
}
jdbc连接的工具类
package jdbc;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
public class select {
public static String selectbyIdTime() throws SQLException
{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
conn = (Connection) JdbcUtils.getConnection();
String sql="select * from wzw3";
ps = conn.prepareStatement(sql);
rs=ps.executeQuery();
String a1 = "";
while(rs.next())
{
a1+=rs.getInt("idnum")+rs.getString("titleexception")+rs.getString("result")+rs.getString("inputrs")+rs.getBoolean("iftrue") + "#";
}
return a1;
}
finally
{
JdbcUtils.free(rs, ps, conn);
}
}
}
查询
第三个是用来相应的servlet,在上面都已经展示过了
第四个是产生题目的方法,跟上一次写的差不多,但是因为太多,我把分成三个Java文件,还有一个是判断所做的体是否正确的方法:
package util;
public class integer {
//整数运算
public static String generateExpressionkh(int num,int scope)//产生带括号的整数表达式
{
publicUse u = new publicUse();
int a1[]=new int[num];
int a2[]=new int[num-1];
int a3[]=new int[num];
String[]a5=new String[num];
String[] a4={"+","-","*","/"};
for(int i=0;i<num;i++)
{
a1[i]=(int) (Math.random()*(scope-1)+1);
}
for(int i=0;i<num-1;i++)
{
a2[i]=(int) (Math.random()*4);
}
a3=u.chansheng(num);
for(int i=0;i<num;i++)
{
a5[i]="";
if(a3[i]<0)
{
int c=0-a3[i];
for(int j=0;j<c;j++)
{
a5[i]+=")";
}
}
else
{
for(int j=0;j<a3[i];j++)
{
a5[i]+="(";
}
}
}
String t="";
for(int i=0;i<num-1;i++)
{
if(a3[i]>0)
{
t+=a5[i]+" "+a1[i]+" "+a4[a2[i]];
}
else
{
t+=" "+a1[i]+" "+a5[i]+a4[a2[i]];
}
}
if(a3[num-1]>0)
{
t+=a5[num-1]+" "+a1[num-1]+" ";
}
else
{
t+=" "+a1[num-1]+" "+a5[num-1];
}
return t;
}
public static String generationexception(int num,int scope)//产生不带括号的表达式
{
int a1[]=new int[num];
int a2[]=new int[num-1];
int a3[]=new int[num];
String[] a4={"+","-","*","/"};
for(int i=0;i<num;i++)
{
a1[i]=(int) (Math.random()*(scope-1)+1);
}
for(int i=0;i<num-1;i++)
{
a2[i]=(int) (Math.random()*4);
}
String t="";
for(int i=0;i<num-1;i++)
{
if(a3[i]>0)
{
t+=" "+a1[i]+" "+a4[a2[i]];
}
else
{
t+=" "+a1[i]+" "+a4[a2[i]];
}
}
if(a3[num-1]>0)
{
t+=" "+a1[num-1]+" ";
}
else
{
t+=" "+a1[num-1]+" ";
}
return t;
}
}
产生整数的题目
package util;
public class properFraction {
//真分数运算
public static String properFractionExit(int num,int scope)//产生不含括号含有真分数的表达式
{
publicUse u =new publicUse();
int []r1=new int[2*num];//接受产生的数值
int []r2=new int[num-1];//接受符号
String[]r3={"+","-","*","/"};
String rs="";//接受含括号的和不含括号的表达式
char ch='z';
while(ch=='z')
{
int i=0;
for(;i<2*num;i++)
{
r1[i]=(int) (Math.random()*(scope-1)+1);
}
ch='y';
int j=0;
while(j<2*num)
{
if(r1[j]>=r1[j+1])
{
ch='z';
break;
}
j++;
j++;
}
}
for(int i=0;i<num-1;i++)
{
r2[i]=(int) (Math.random()*4);
}
int j=0;
while(j<2*num-2)
{
int commondivisor=u.maxyue(r1[j], r1[j+1]);
r1[j]/=commondivisor;
r1[j+1]/=commondivisor;
if(r1[j]==r1[j+1])
{
rs+=" "+1+" ";
}
else
{
rs+=" "+r1[j]+"/"+r1[j+1]+" "+r3[r2[(j+1)/2]];
}
j++;
j++;
}
int commondivisor1=u.maxyue(r1[2*num-2],r1[2*num-1]);
r1[2*num-2]/=commondivisor1;
r1[2*num-1]/=commondivisor1;
if(r1[2*num-2]==r1[2*num-1])
{
rs+=" "+1+" ";
}
else
{
rs+=" "+r1[2*num-2]+"/"+r1[2*num-1]+" ";
}
return rs;
}
public static String properFractionExithk(int num,int scope)//产生含括号含有真分数的表达式
{
publicUse u =new publicUse();
int []r1=new int[2*num];//接受产生的数值
int []r2=new int[num-1];//接受符号
String[]r3={"+","-","*","/"};
int []r4=new int[num];//接受随机产生的括号
String []r5=new String[2*num];//将接受的括号的个数,转成字符串
String rs="";//接受含括号的和不含括号的表达式
r4=u.chansheng(num);
char ch='z';
//产生数值
while(ch=='z')
{
for(int i=0;i<2*num;i++)
{
r1[i]=(int) (Math.random()*(scope-1)+1);
}
ch='y';
int j=0;
while(j<2*num)
{
if(r1[j]>=r1[j+1])
{
ch='z';
break;
}
j++;
j++;
}
}
//产生符号
for(int i=0;i<num-1;i++)
{
r2[i]=(int) (Math.random()*4);
}
//产生括号的数组
for(int i=0;i<2*num;i++)
{
r5[i]="";
if(i%2==0)
{
if(r4[i/2]>0)
{
for(int j=0;j<r4[i/2];j++)
{
r5[i]+="(";
}
}
else if(r4[i/2]<0)
{
for(int j=0;j<0-r4[i/2];j++)
{
r5[i]+=")";
}
}
}
}
//添加到一个String类型的表达式中
int j=0;
while(j<2*num-2)
{
int commondivisor=u.maxyue(r1[j], r1[j+1]);
r1[j]/=commondivisor;
r1[j+1]/=commondivisor;
if(r5[j].equals(""))
{
rs+=" "+r1[j]+"/"+r1[j+1]+" "+r3[r2[(j+1)/2]];
}
else if(r5[j].substring(0, 1).equals("("))
{
rs+=r5[j]+" "+r1[j]+"/"+r1[j+1]+" "+r3[r2[(j+1)/2]];
}
else
{
rs+=" "+r1[j]+"/"+r1[j+1]+" "+r5[j]+r3[r2[(j+1)/2]];
}
j++;
j++;
}
//算最后一个数
int commondivisor1=u.maxyue(r1[2*num-2],r1[2*num-1]);
r1[2*num-2]/=commondivisor1;
r1[2*num-1]/=commondivisor1;
if(r5[2*num-2].equals(""))
{
rs+=" "+r1[2*num-2]+"/"+r1[2*num-1]+" ";
}
else if(r5[2*num-2].substring(0, 1).equals("("))
{
rs+=r5[2*num-2]+" "+r1[2*num-2]+"/"+r1[2*num-1]+" ";
}
else
{
rs+=" "+r1[2*num-2]+"/"+r1[2*num-1]+" "+r5[2*num-2];
}
return rs;
}
}
产生真分书类型的题目
package util;
import java.sql.SQLException;
import java.util.Date;
import java.util.Random;
import java.util.Scanner;
import java.util.Stack;
public class publicUse {
// public static void main(String[] args) throws ClassNotFoundException, SQLException
// {
//
// System.out.println("请选择题目类型:1.真分数。2整数");
// int choose1=sc.nextInt();
// System.out.println("请输入产生题的个数");
// int num=sc.nextInt();
// System.out.println("请输入取值范围");
// int scope=sc.nextInt();
// System.out.println("请选择题目类型中是否有括号:1.有。2.没有");
// int choose2=sc.nextInt();
// String rs[]=new String[2*num];
// rs=operationAndStatistical(choose1, choose2, num,scope);
// for(int i=0;i<num;i++)
// {
// System.out.println(rs[i]+"="+rs[i+num]);
// }
// }
public static Scanner sc=new Scanner(System.in);
//真分数和整数都需要用到
public static int maxyue(int y,int x)//最大公约数
{
int r=y;
while(r!=0)
{
r=x%y;
x=y;
y=r;
}
return x;
}
public static char youxian(String f,String s)//计算两个符号的优先级
{
char a1[][]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}
};
String a="+-*/()#";
int a11=a.indexOf(f);
int a12=a.indexOf(s);
return a1[a11][a12];
}
static int [] chansheng(int num)//随机产生括号
{
int []b=new int[num];
for(int i=0;i<b.length;i++)
{
b[i]=0;
}
Random rd=new Random();
for(int i=2;i<num;i++)
{
for(int j=0;j<num-i+1;j++)
{
int t=rd.nextInt(2);
if(t==1)
{
if(b[j]>=0&&b[j+i-1]<=0)
{
int c=0;
for(int k=j;k<j+i;k++)
{
c+=b[k];
}
if(c==0)
{
b[j]++;
b[j+i-1]--;
}
}
}
}
}
return b;
}
//运算
public static String jisuanbh(String a)//表达式的运算
{
Stack <String>num=new Stack <String>();
Stack <String>fuhao=new Stack<String>();
a+="#";
fuhao.push("#");
char ch;
int i=0;
int s=0;
int y=0;
ch=a.charAt(i);
while(!(ch+"").equals("#") || !fuhao.peek().equals("#"))
{
if(ch==' ')//如果遇到字符为空,说明遇到数字
{
String rn="";//用来记录数据
while(true)
{
ch=a.charAt(++i);
if(ch==' ')
{
break;
}
rn+=ch;
}
if((i+1)<a.length()){
ch=a.charAt(++i);
}
num.push(rn);
}
else//遇到的是字符
{
char comp=youxian(fuhao.peek(),ch+"");//比较两个字符的优先级
if(comp=='='){//说明遇到右括号
fuhao.pop();
if((i+1)<a.length()){
ch=a.charAt(++i);
}
}
else if(comp=='>')//优先级高,弹出两个数和一个运算符,进行运算
{
String st1=num.pop();
String st2=num.pop();
String fuh1=fuhao.pop();
char fuh2=fuh1.charAt(0);//将String类型转为char类型
String []rs1=new String[2];
rs1=yunsuan2(st2, st1, fuh1);
if(rs1[1].equals("error"))//如果运算中有问题,就结束运算
{
return "error";
}
else
{
num.push(rs1[0]+"");//将两数结果压入栈中
}
}
else//优先级比较低,把运算符压入栈中
{
fuhao.push(ch+"");
if((i+1)<a.length())
{
ch=a.charAt(++i);
}
}
}
}
String rs=num.pop();
int wz=rs.indexOf("/");
if(wz!=-1)
{
String fb=rs.substring(0, wz);
String sb=rs.substring(wz+1,rs.length());
int fb1=Integer.parseInt(fb);
int sb1=Integer.parseInt(sb);
if(fb1>=sb1&&fb1%sb1==0)
{
rs=(fb1/sb1)+"";
}
else if(fb1<sb1&&fb1%sb1!=0)
{
int commondivisor=maxyue(fb1, sb1);
fb1/=commondivisor;
sb1/=commondivisor;
rs=fb1+"/"+sb1;
}
else
{
int commondivisor=maxyue(fb1, sb1);
fb1/=commondivisor;
sb1/=commondivisor;
rs=(fb1/sb1)+"'"+(fb1%sb1)+"/"+sb1;
}
}
return rs;
}
public static String[] tys(String fn,String sn,char c)//两个整数的运算
{
int a=Integer.parseInt(fn);
int b=Integer.parseInt(sn);
String []a1=new String [2];//a1[0]用来记录两数运算结果,a1[1]用来记录两数能否继续算下去
a1[0]=a1[1]="";
int d=0;//d用来短暂存取两数运算结果
int z=0;//除法中判断a1[0]是否需要加上d
if(c=='+')
{
d=a+b;
}
else if(c=='-')
{
if(a<b)
{
a1[1]="error";
return a1;
}
else
{
d=a-b;
}
}
else if(c=='*')
{
d=a*b;
}
else
{
if(a%b==0&&a>=b)
{
d=a/b;
}
else
{
z=1;
a1[0]=a+"/"+b;
}
}
if(z==0)
{
a1[0] = d+"";
}
return a1;
}
public static String[] yunsuan2(String fn,String sn,String e)//两个数运算,分数,整数均可
{
String rs[]=new String[2];
rs[0]=rs[1]="";
int location1=fn.indexOf("/");
int location2=sn.indexOf("/");
if(location1==-1&&location2==-1)//两个整数的运算
{
rs=tys(fn, sn, e.charAt(0));
}
else{
int a=0;
int b=0;
int c=0;
int d=0;
if(location1!=-1&&location2!=-1)//两个数都为真分数
{
String r1=fn.substring(0,location1);
String r2=fn.substring(location1+1,fn.length());
String r3=sn.substring(0,location2);
String r4=sn.substring(location2+1,sn.length());
a=Integer.parseInt(r1);
b=Integer.parseInt(r2);
c=Integer.parseInt(r3);
d=Integer.parseInt(r4);
}
else
{
if(location1==-1)
{
a=Integer.parseInt(fn);
b=1;
String r3=sn.substring(0,location2);
String r4=sn.substring(location2+1,sn.length());
c=Integer.parseInt(r3);
d=Integer.parseInt(r4);
}
else
{
c=Integer.parseInt(sn);
d=1;
String r1=fn.substring(0,location1);
String r2=fn.substring(location1+1,fn.length());
a=Integer.parseInt(r1);
b=Integer.parseInt(r2);
}
}
int f=0,g=0,h=0,t=0;
if(e.equals("+"))
{
if(b==d)
{
f=a+c;
g=b;
}
else
{
g=b*d/maxyue(b,d);
a=g/b*a;
c=g/d*c;
f=a+c;
}
}
else if(e.equals("-"))
{
if(b==d)
{
f=a-c;
if(f<=0)
{
rs[1]="error";
return rs;
}
g=b;
}
else
{
g=b*d/maxyue(b,d);
a=g/b*a;
c=g/d*c;
f=a-c;
if(f<0)
{
rs[1]="error";
return rs;
}
}
}
else if(e.equals("*"))
{
f=a*c;
g=b*d;
}
else
{
f=a*d;
g=b*c;
}
rs[0]=f+"/"+g;
}
return rs;
}
public static String[] operationAndStatistical(int ch1,int ch2,int num,int scope) throws ClassNotFoundException, SQLException//对结果进行操作并统计题数
{
properFraction p =new properFraction();
integer i1= new integer();
String rs="";
int i=0;
String saveexcep[]=new String[2*num];
while(i<num)
{
int n=(int) (Math.random()*3+2);
if(ch1==1&&ch2==1)
{
rs=p.properFractionExithk(n,scope);//产生含有括号的真分数表达式
}
else if(ch1==1&&ch2==2)
{
rs=p.properFractionExit(n,scope);//产生不含括号的真分数表达式
}
else if(ch1==2&&ch2==1)
{
rs=i1.generateExpressionkh(n,scope);//产生含括号的整数表达式
}
else
{
rs=i1.generationexception(n,scope);//产生不含括号的整数表达式
}
String judgers=jisuanbh(rs);//记录答案
if(judgers.equals("error"))
{
System.out.print("");
}
else
{
saveexcep[i]=rs;
saveexcep[i+num]=judgers;
i++;
}
}
return saveexcep;
}
}
整数和真分数都需要用到的方法
package util;
public class solve {
public boolean[] judgeIfTrue(String[] a,String[] b)//对传过来的两个数组进行比较,正确的数对应1返回
{
boolean judgers[] = new boolean [a.length];
for(int i=0;i<a.length;i++)
{
judgers[i]=false;
if(a[i].equals(b[i]))
{
judgers[i]=true;
}
}
return judgers;
}
public int[] zongjie(boolean[] judeger)
{
int[] statisticaltrue = new int[2];//用来计算正确和错误的题数
statisticaltrue[0]=0;
statisticaltrue[1]=0;//初始化
for(int i=0;i<judeger.length;i++)
{
if(judeger[i]==true)
{
statisticaltrue[0]+=1;
}
else
{
statisticaltrue[1]+=1;
}
}
return statisticaltrue;
}
public String[] qiq (boolean []judgers)
{
String []rs =new String[2];//分别用来记录正确和错误的题号
rs[0]="正确的题目题号如下:";
rs[1]="错误的题目题号如下:";
for(int i=0;i<judgers.length;i++)
{
if(judgers[i]==true)
{
rs[0]+=(i+1)+" ";
}
else
{
rs[1]+=(i+1)+" ";
}
}
return rs;
}
public String[]countexpression(String[]bds,String[]correctrs,String[]inputrs, boolean[]judgers)
{
String[]count1 = new String[judgers.length];
for(int i=0;i<judgers.length;i++)
{
if(judgers[i]==true)
{
count1[i]="第"+(i+1)+"道题:\t"+bds[i]+"="+correctrs[i]+"\t"+"回答正确";
}
else
{
count1[i]="第"+(i+1)+"道题:\t"+bds[i]+"="+inputrs[i]+"\t"+"回答错误,"+"正确答案是"+correctrs[i];
}
}
return count1;
}
}
判断题目是否正确
4.结果截图:
(1)选择查看还是做题
(2)选择做题:
(3)做题:
(4)判断正确:
查询历史记录:
这个查询界面做的还不算完善,后面会进行改进。。。
在其中加入了js的基本的判空
5.实验总结:通过对这个简单的程序的编写,能基本的使用jsp Javabean和servlet来实现一个最小的网页版的程序,在通过链接数据库,使用jdbc技术实现数据的存储和查询,
这是我对MVC框架有了一个更加深刻的认识,在通过加入js,是这个程序更加符合人们的需求,虽然我现在只是用了这个的皮毛,但是我以后越来越熟练地掌握,另外,我还准备
加上jquare和ajax来使界面更加合理,我会使我这个程序更加完善。
6.合作感受:两个人一起写时跟一个写是不一样的,我比较熟悉整体的结构,他比较细心,再设计页面和找错误方面比较擅长,通过这次练习找到我们自己的不足之处,我们
收货到了更多。
程序完成者: 王志伟 胡洋洋