web四则运算
目录
1.coding.net地址
2.PSP
3.Information Hiding, Interface Design, Loose Coupling
4.
5.
6.
7.
8.
9.
10.
http://119.29.189.249
PSP |
任务内容 |
计划时间(min) |
完成时间(min) |
Planning |
计划 |
30 |
60 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
30 |
60 |
Development |
开发 |
4300 |
6940 |
Analysis |
需求分析 |
50 |
50 |
Design Spec |
生成文档 |
0 |
0 |
Design Review |
设计复审 |
120 |
150 |
Coding Standard |
代码规范 |
30 |
60 |
Design |
具体设计 |
60 |
120 |
Coding |
具体编码 |
3800 |
5760 |
Code Review |
代码复审 |
180 |
600 |
Test |
测试 |
30 |
700 |
Reporting |
报告 |
160 |
840 |
Test Report |
测试报告 |
120 |
240 |
Size Measurement |
计算工作量 |
30 |
45 |
Postmortem & Process Improvement Plan |
事后总结, 并提出过程改进计划 |
30 |
60 |
(2)inputFile中Inputfile测试
(3)inputFile中result测试
(4)needing方法测试
(5).arrayPractice中的测试
(二)命令行测试
(3)测试覆盖率
if(args[r].equals("-n") ){ try { n = Integer.parseInt(args[++r]);//命令行输入 if (n<0||n>10000) System.out.println("n必须输入正整数"); } catch (Exception e) { System.out.println("n输入格式不正确"); } } else if(args[r].equals("-m")){ try { lower= Integer.parseInt(args[++r]); upper= Integer.parseInt(args[++r]); if(lower>=upper){ System.out.println("lower不能大于等于upper"); } }catch (Exception e){ System.out.println("lower,upper,输入不合法"); } } else if(args[r].equals("-o")){ try { opNum= Integer.parseInt(args[++r]); if (opNum>10||opNum<1) System.out.println("opNum取值为1-10"); } catch (Exception e) { System.out.println("opNum输入格式不正确"); } }
(2)上传文件异常
if (file.exists() && file.isFile()) { try { BufferedReader input = new BufferedReader(new FileReader(file)); String text; while ((text = input.readLine()) != null) list.add(text); } catch (IOException ioException) { System.err.println("File Error!"); } }
(3)写入文件异常
try { BufferedWriter bw = new BufferedWriter(new FileWriter(path)); for(String con:content){ bw.write(con); bw.newLine(); } bw.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }
(4)文件格式不正确
System.out.println("测试获取文件的后缀:"+str); if(!(str.equals(".txt"))){ PrintWriter out = response.getWriter(); out.print("<script language='JavaScript'>alert('The file format is wrong!!');window.location.href='../upload.jsp';</script>"); }
8.模块设计
对于后台界面
(1)计算模块有产生四则运算式子,计算结果,上传文件,输出文件内容等类
(2)设计jsp页面,文件上传页面,选择相应的文件,传送path,调用inputFile方法,输出文件内部的内容
public static List<String> InputFile(String path) { File file = new File(path); LinkedList<String> list = new LinkedList<String>(); if (file.exists() && file.isFile()) { try { BufferedReader input = new BufferedReader(new FileReader(file)); String text; while ((text = input.readLine()) != null) list.add(text); } catch (IOException ioException) { System.err.println("File Error!"); } }
(3)输出文件内容后通过调用result方法,获得文件的计算结果,与用户输入结果作比较,得出正确与否
public static String result(String arrayList) { String a=""; try { a= String.valueOf(js.eval(arrayList)); //System.out.println(al); } catch (ScriptException e) { // TODO Auto-generated catch block e.printStackTrace(); } return a; }
(4)生成题目online页面,将参数传递给servlet,servlet通过调用needing方法,返回jsp页面生成题目算式,然后,再将算式显示出来,计算比较
public String needing(int lower, int upper, int opNum, boolean haveMS, boolean haveKuo){//产生四则运算并计算出结果 String[] arr={"+","-","*","/"}; String s=""; Random r=new Random(); int a=r.nextInt(opNum)+2 ;//生成3—4随机数 int[] b=new int[a]; //System.out.println("产生的随机运算数的个数"+a); int[] number=new int[a]; for(int j=0;j<a;j++) { number[j]=r.nextInt(upper) ; } if(opNum==1) { int op = r.nextInt(2); int v1 = r.nextInt(upper); s += v1 + arr[op]; } else { for (int j = 0; j < a-1; j++) { b[j]= r.nextInt(4);//生成0——4的随机数 if(haveMS) { if (haveKuo){ int a1 = r.nextInt(upper); int a2 = r.nextInt(upper); if (a1 > a2) { s += "(" + a1 + "-" + a2 + ")" + "*" + "(" + number[j] + "-" + number[j + 1] + ")" + "-";} else s += number[j + 1] + "/" + "(" + "(" + a1 + "+" + a2 + ")" + "*" + number[j] + ")" + "+"; } else s += number[j] + arr[b[j]]; } else { int t = r.nextInt(2); s += number[j] + arr[t]; } if (j >= 1) b[j] = same(j, b); } } s+=number[a-1]; arrayPractice c=new arrayPractice();//调用类计算结果 List<String> list=c.result1(s); List<String> list2=c.InfixToPostfix(list); int re=c.doCal(list2,upper); if(re!=-1){ if(re>upper) return needing(lower,upper,opNum,haveMS,haveKuo);} else return needing(lower,upper,opNum,haveMS,haveKuo); return s; }
int n= Integer.parseInt(request.getParameter("quesNum")); int max= Integer.parseInt(request.getParameter("maxNum")); int min= Integer.parseInt(request.getParameter("minNum")); int o= Integer.parseInt(request.getParameter("operScope")); boolean c= Boolean.parseBoolean(request.getParameter("multi")); boolean b= Boolean.parseBoolean(request.getParameter("bracket" )); Producing p=new Producing(); ArrayList<String> s=new ArrayList<String>(); for(int i=0;i<n;i++){ s.add(p.needing(min,max,o,c,b)); }
(5)将生成的算式在逐个输出,进行计算,并判断对错,此处与上传文件,输出文件内容并判断对错相似
对于前台页面
前台的设计主要由div+css布局实现,由小组的另一位成员翁梦蕾主要设计。
模块功能主要有,导航栏,上传及答题,在线生成题目(即定制服务)跳转答题,计时及输出正确题目数量。
模块的设计由小组的两位成员共同进行交流设计,商讨而出。最初暂定三个界面,商讨过后最终决定产生四个界面,来实现上述所有的功能。设计过程中版式的设计由二人共同制定,初定模型后,进行细化的功能及板块设定,最终由小组的另一成员制作而成。在设计之初,我们二人共同商讨了页面的功能模块名称。
实现的界面代码模块设计主要如下
实现了多语言选择,通过1,2,3,分别选择不同的语言
$(document).ready(function() { var lang = $.cookie("lang"); switch (lang) { case '1': lang1(); break; case '2': lang2(); break; case '3': lang3(); break; default: lang1(); break; } })
//答题功能及计时,输出正确数量
<div class="output"> <div class="output_answer"> <ul> <li> 题目 </li> <li> 答案 </li> <li> 对错 </li> </ul> <div class="answer_scroll"> <form method="get"> <table> <% String path = String.valueOf(request.getAttribute("path")); int countR=0; int countL=0; InputFile inputFile=new InputFile(); List<String> s1=inputFile.InputFile(path); String[] answer=new String[s1.size()]; for(int i=0;i<answer.length;i++){ //String ss=inputFile.result(s2); answer[i]=(inputFile.result(s1.get(i))); } request.setAttribute("answer",answer); %> <input type="hidden" id="right_answer" value="<%=answer %>"/> <% for (String s:s1) { %> <tr> <td> <%=s %> </td> <td> <input type="text" name="answer" class="get_answer"/> </td> <td> <span class="gou"> </span> </td> </tr> <% } %> </table> </form> </div> <input type="submit" value="提交" id="aa" onclick="yesOrNo()"/> </div> <div class="output_judge"> <div class="judge_clock"> <button type="button" onclick="start()"><img src="img/play.png"/></button> <button type="button" onclick="stop()"><img src="img/stop.png"/></button> <button type="button" onclick="Reset()"><img src="img/over.png"/></button> <input type="text" id="timetext" value="00时00分00秒" readonly><br/> </div> <div class="judge_number"> <ul> <li> <span>本次题目一共有</span> </li> <li> <input type="text" id="total_number" value="<%=answer.length %>" READONLY/> </li> <li> <span>正确的题目一共有</span> </li> <li> <input type="text" id="right_number" READONLY/> </li> </ul> </div> </div>
9.界面模块与计算模块的对接
UI模块的设计由两个人共同商讨,具体需要为界面美观及功能性强
界面美观需要的有两点:
1.结构清晰,美观
2.色彩不冲突
功能性需要的主要为以下几点:
1.用户制定
2.上传文件
3.获取题目并且答题
4.计时
5.判断正确错误且输出正确题目数量
6.实现多语言(英语,中文,日文的选择)
界面美观由小组中的另一位成员实现,功能性由二人合作完成,共同商讨且实时交流
其中上传文件并计算处理得出答案由我实现,计时及判断正误由小组中另一位成员实现
两个模块的交互
另一名成员规划出页面的模块布局之后,添加jsp代码,将需要的数据传到页面中
需要的数据主要为:
1.题目 为一个list集合
2.题目的数量 为list对象的size
3.正确答案 为一个数组
实现为:
使用了循环输出,jstl标签,以及基本的jsp代码
(1)上传文件页面upload.jsp,上传文件,通过servlet获取文件的路径,然后调用inputFile方法(上面有代码),逐个输出文件的内容,并通过result方法,获得内容答案,传给js,然后利用js,将用户输入的值与正确答案作比较,判断对错,斌输出正确,错误题数和总题数,并通过计时功能,计时
form action="upload" method="post" enctype="multipart/form-data"> <div class="file"> <input type="file" name="file" class="file-btn"/> <span>选择文件</span> </div> <input type="submit" value="上传"/> </form>
(2)online.jsp页面,生成题目并上传到文件前台页面用户输入参数,传给servlet,然后调用needing方法,生成计算式,通过servlet调用writting方法保存到指定文件中,
servlet再将path返回给online2.jsp页面,输出文件内容到页面,通过js获取输入内容,与upload相似,得到题目正确与否
10.描述结对的过程,提供非摆拍的两人在讨论的结对照片。
结对的过程:
- 商讨项目的制作过程,包括使用的代码,技术规范,页面的框架,实现的功能等
- 计划分工及功能的实现,进行PSP的初期规划
- 正式开始进行项目的制作,计算模块与界面模块同时进行
- 进行页面的交互,并且同时不断修改代码
- 进行测试
- 发布项目
- 撰写博客
11.说明结对编程的优点和缺点。同时指出结对的每一个人的优点和缺点在哪里 (要列出至少三个优点和一个缺点)。
结对编程的优缺点
- 优点
- 能实时更新项目进度,交流密切,方便项目实施
- 对于懒惰的一方有督促的作用
- 集思广益,相同的问题两个人更好解决
- 分工明确,减少工作量
- 缺点
- 对于两个人的配合有较高的要求
- 对于两个人的时间和经历有较高的要求
- 容易产生分歧
结对的每一个人的优缺点
刘卓锦
- 优点
- 代码能力强
- 耐心
- 细心
- 缺点
- 不爱写注释
翁梦蕾
- 优点
- 有设计风格
- 细心
- 耐心
- 缺点
- 对于java掌控不熟