大家好,这是我们对这次结对作业的思路与感悟,感谢您的阅读与支持!
一、任务概述
完成一个带界面的四则运算出题软件,这个软件会为用户提供如下特色功能:
- 定制出题要求。每次出题时用户都可以在界面上定制如下参数:题目数量,算式数值范围(仅包括原始题目与最终结果的绝对值的数值范围),题目中最多有多少个运算符,题目中是否包含乘除法,题目中是否包含括号。在点击相应出题按钮后将生成题目文件(不包含答案)。参考界面如下所示:
- 做题功能。出题后,用户可以开始答题
- 判题功能。用户答题过程中或者全部完成后可以判断对错,并统计分数和时间。
- 请同学们在结对两人中选择一个更优秀的项目作为项目的起点,在其基础上进行增量修改,根据以上修改自己的四则运算软件。
- 本次界面可以用网页版或客户端任何一种形式完成。
二、我们的思路
对于本次项目,我们首先挑选出了我们当中写的较为清晰的基础代码,并决定用网页版来实现。首先写好了前端页面,然后将后端的代码修改,最后用Jsp读取txt文本文档实现。
三、项目结构
四、部分源代码
后端核心:
import java.util.*;
import java.lang.String;
import java.io.*;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.script.*;
public class Main {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要生成的题目数量:");
int t = scanner.nextInt();
String path = "E:\\calculat\\result.txt";//输出路径
String word = "Your four operations test:";
BufferedWriter out = new BufferedWriter(//将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
new OutputStreamWriter(new FileOutputStream(path,false)));
out.write(word+"\r\n");
out.write("\r\n");
for(int j = 0;j<t;j++) {//循环输出n道题目
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("js");
String sum = "";
double result1 = -1;
double result2 = 1;
int result3;
while(result2!=0) {//result2为结果的小数部分,只有当其为零的题目才符合输出。
sum = "";
for (int i = 0; i < 5 + (int) Math.random() * (3); i++) {//随机运算符 Math.random()返回一个double类型的0.0-1.0之间的数值,包括0,不包括1,这个数值*3,再强制转换,那范围就是0-2
int g;
String m = "";
int x;
x = (int) (+Math.random() * (100));
String sx = String.valueOf(x);
g = (int) (+Math.random() * (4));
switch (g) {
case 0:
m = "+";
break;
case 1:
m = "-";
break;
case 2:
m = "*";
break;
case 3:
m = "/";
break;
}
sum = sum + m + sx;
}
sum = sum.substring(1);
Double result = null;
try {
result = Double.parseDouble(engine.eval(sum).toString());//eval函数
} catch (ScriptException e) {
e.printStackTrace();
}
result1 = result;
result2 = result1 - (int) result1;
if (result2 == 0)
result1 = (int) result1;
}
if(result1<0){
j--;
continue;
}
result3 = (int)result1;
System.out.println(sum+"="+result3);
out.write(sum+"="+result3+"\r\n");
out.write("\r\n");
}
out.close();//关闭输出流
}
}
前端页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta charset="UTF-8">
<title>出题程序</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
<link type="text/css" rel="styleSheet" href="../css/basic.css" />
<script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
</br></br></br></br>
<div class="container">
<h2 style="color:#4169E1"> Four mixed operations</h2>
</br></br>
<div class="row">
<div class="col-md-1" >
</div>
<div class="col-md-5" style="background-color: #dedef8;">
</br></br>
<div class="row">
<div class="col-md-3">
<h4> 数值范围</h4>
</br></br>
<h4> 题目数量</h4>
</br></br>
<h4> 符号上限</h4>
</div >
<div class="col-md-9">
<div class="row">
<div class="col-md-6">
<select class="form-control">
<option value ="1">1</option>
<option value ="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
</select>
</br>
<div style="margin-top:10px;">
<input type="text" class="form-control" placeholder="单行输入" id="userName">
</div>
</br>
<div >
<select class="form-control" style="margin-top:-14px;">
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
</select>
</div>
</div>
<div class="col-md-6">
<select class="form-control">
<option value ="1">1</option>
<option value ="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
</select>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4" style="background-color: #dedef8;">
<h4> </h4>
<div class="row">
<div class="col-md-6" style="margin-top:-3px;">
</br></br>
<h4> 是否包含乘除法</h4>
</br></br>
<h4> 是否包含括号</h4>
</br></br></br>
</div>
<div class="col-md-6" style="margin-top:18px;">
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-primary">
<input type="radio" name="options" id="option1"> 包含
</label>
<label class="btn btn-primary">
<input type="radio" name="options" id="option2"> 不包含
</label>
</br></br></br></br>
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-primary">
<input type="radio" name="options" id="option1"> 包含
</label>
<label class="btn btn-primary">
<input type="radio" name="options" id="option2"> 不包含
</label>
</div>
</div>
</div>
</div>
<div class="col-md-2" >
</div>
</div>
</div>
</div>
<div class="container" >
<div class="row" style="margin-top:-2.5px;">
<div class="col-md-1">
</div>
<div class="col-md-9" style="background-color: #dedef8;">
<div class="row">
<div class="col-md-5">
</div>
<div class="col-md-2" >
<div class="btn-group">
</br>
<button type="button" class="btn btn-default" onclick="javascrtpt:window.location.href='test.jsp'">点击出题</button>
</br> </br> </br>
</div>
</div>
<div class="col-md-5">
</div>
</div>
</div>
<div class="col-md-2">
</div>
</div>
<div>
</body>
</html>
读取txt文件代码:
<%
//String filePath = request.getSession().getServletContext().getRealPath("/")+"JSP_Ajax"+"\\";
//System.out.println("filePath=="+filePath);
String path ="E:\\calculat\\"; // 这边文件目录需改成相对路径
File file = new File(path,"result.txt");
FileReader fr = new FileReader(file); //字符输入流
BufferedReader br = new BufferedReader(fr); //使文件可按行读取并具有缓冲功能
StringBuffer strB = new StringBuffer(); //strB用来存储jsp.txt文件里的内容
String str = br.readLine();
while(str!=null){
strB.append(str).append("<br>"); //将读取的内容放入strB
str = br.readLine();
}
br.close(); //关闭输入流
%>
五、主页面展示
六、PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间(h) | 实际完成需要的时间(h) |
Planning | 计划 | 20 | 48 |
· Estimate | · 估计这个任务需要多少时间,并规划大致工作步骤 | 20 | 48 |
Development | 开发 | 74 | 105 |
· Analysis | · 需求分析 (包括学习新技术) | 5 | 10 |
· Design Spec | · 生成设计文档 | 2 | 6 |
· Design Review | · 设计复审 (和同事审核设计文档) | 1 | 6 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 2 | 3 |
· Design | · 具体设计 | 10 | 12 |
· Coding | · 具体编码 | 36 | 39 |
· Code Review | · 代码复审 | 5 | 9 |
· Test | · 测试(自我测试,修改代码,提交修改) | 13 | 20 |
Reporting | 报告 | 6 | 5 |
· Test Report | · 测试报告 | 2 | 2 |
· Size Measurement | · 计算工作量 | 1 | 1 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 3 | 2 |
七、小组感悟
本次作业设计的非常有趣,我们小组的两个人都比较有兴趣。首先是项目基础,我们对比了我俩的代码,选择了一个较好的项目作为项目的起点;其次是分工,我们一个人写前端,一个人写后端,然后一起在网上学习了bootstrap前端框架,最后一起结合了前后端,真正感受到了一个小型小组在项目里的分工合作。中途也遇到了非常多的BUG,有时为了改一个很小的BUG,也要花几个小时...但是看到最后我们的成果,觉得之前的一切辛勤劳动都是值得的。作为程序员,还有很长的路要走,加油吧!