web四则运算
目录
1.coding.net地址
2.PSP
3.Information Hiding, Interface Design, Loose Coupling
4.计算模块接口的设计与实现过程
5.计算模块接口部分的性能改进
6.计算模块部分单元测试展示
7.计算模块部分异常处理说明
8.界面模块的详细设计过程
9.界面模块与计算模块的对接。
10.描述结对的过程
11.结对编程的优点和缺点
1.Codiing地址:https://git.coding.net/lzgy18/WEB-four_operation.git
web测试地址:http://119.29.189.249
2. PSP
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 |
3.(1)information Hiding
信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。
也就是说用一个类中封装其中的数据,方法,使得外界不可以随意访问与修改,提高了程序的安全性与健壮性。
在我们的项目中,要想使用这个类中的方法和变量,秩序调用此类即可,不需要知道这个类中的方法具体如何实现,不可以随意对类中的方法进行修改,只需要对此类进行调用使用是方法即可,也就是说,不需要知道他是怎么实现的,只要知道他是干什么的,调用即可。
(2) Interface Design , Loose Coupling
模块划分是一个比较常见的方式,而模块与模块之间则是通过接口设计将它们整合在一起的。总之,我觉得这两个方面是相辅相成的。既然有了松耦合,我又去查了一下,发现有相对的紧耦。我先看了一下什么是耦合性: 耦合性是指组件(在分布式系统中)互相依赖的程度。客户端与它们同其进行通讯的服务之间耦合的性质可能影响智能客户端设计的许多方面,包括互操作性、脱机功能、网络通讯性 能、部署以及维护注意事项。
紧 耦合系统通常提供直接的对象到对象通讯,并且客户端上的对象对远程对象具有详细的了解。这种紧耦合性可以防止对客户端或服务器进行单独更新。因为紧耦合系 统涉及直接的对象到对象通讯,所以对象通常比在松耦合系统中更为频繁地交互,这样,如果两个对象位于不同的计算机上并且由网 络连接分隔,则可能导致性能和 延迟问题。
松耦合系统通常是基于消息的系统,此时客户端和远程服务并不知道对方是如何实现的。客户端和服务之间的通讯由消息的架构支配。只要消息符合协商的架构,则客户端或服务的实现就可以根据需要进行更改,而不必担心会破坏对方。
( 推荐一个博客:https://www.cnblogs.com/laxcus/p/5681611.html)
在我们的项目中,模块划分主要分为计算模块,显示模块,控制模块(只要是用来链接显示模块与计算模块),对于计算模块,只需要调用其即可。
4.计算模块接口的设计与实现
我们的计算模块主要有四个类,分别用于产生题目,计算结果,选择文件并输出文件内容,写入文件。有15个方法。
5..计算模块接口部分的性能改进
(1)在设计过程中,改进了部分功能
我们发现有许多方法没有大的作用,而且,可以调用其他类中的一些方法实现,但没有删除,因此比较耗费
而且,有一个重复调用needing方法,来产生四则运算,使其重头开始重新计算,使得代码利用率不高,而且冗余,我们删除了一些重复调用的代码,比如:
刚开始,我们对于两个数相除产生分数的问题,只要除不尽,就在重新随机产生两个随机数,后来,通过改进例如x%y,只需要重新产生y的值即可。
(2)性能分析截图
6.计算模块部分单元测试展示
(一)部分测试代码
(1)Command测试
(2)inputFile中Inputfile测试
(3)inputFile中result测试
(4)needing方法测试
(5).arrayPractice中的测试
(二)命令行测试
(3)测试覆盖率
7.计算模块部分异常处理说明
(1)输入参数异常
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掌控不熟
web四则运算的更多相关文章
- 结对作业——web四则运算
目录: 一.Coding.net项目地址 二.PSP 三.接口设计 四.接口实现 五.性能分析 六.单元测试 七.异常处理 八.模块设计 九.模块对接 十.结对 十一.思考 十二.PSP 网站:htt ...
- 第三周结对项目--小学生四则运算CAI软件汇报及总结(UI/web)
前言: 这周是和我队友苏卫喜一起结对开发,我主要是写项目文档需求分析,她是通过我的需求文档来进行做思维导图,之后我们通过思维导图一起讨论用户界面设计. 以下就是我的需求分析1.0版本 1. 软件名 ...
- 四则运算4 WEB(结对开发)
在第三次实验的基础上,teacher又对此提出了新的要求,实现网页版或安卓的四则运算. 结对开发的伙伴: 博客名:Mr.缪 姓名:缪金敏 链接:http://www.cnblogs.com/miaoj ...
- 四则运算web版需求规格说明书
目录 1引言... 4 1.1 目的... 4 1.2 背景... 4 1.3 术语... 4 1.4 预期读者与阅读建议... 5 1.5 参考资料... 6 1.6 需求描述约定... ...
- 四则运算 WEB
coding.net:https://git.oschina.net/ysh0904/WEB.git 一.需求分析 记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算 ...
- 四则运算web最终版
经过若干时间的奋战,终于完成了web版四则运算程序.团队成员:井小普.张贺. 设计思想: 在之前的程序基础上两人结合开发web系统. 首先,进行登录注册界面的编写,不同用户,对应不同的错题库,答题记录 ...
- web窗体之四则运算
1,计算方法: namespace ASP.NET { public class JiSuan { public int S; public int Result { get { return S; ...
- 结对项目作业报告——四则运算web项目
成员:顾思宇2016011993 程羚2016012050 1.仓库地址:https://git.coding.net/DandelionClaw/WEB_Calculator.git 注: 本项 ...
- 结对项目:四则运算web
1)Coding.Net项目地址 https://git.coding.net/DandelionClaw/WEB_Calculator.git 注:本项目为web端,并且需要连接SQL Server ...
随机推荐
- TCP协议与UDP协议
网络通信协议规定了网络通信时,数据必须采用的格式.常见的协议有TCP协议,UDP协议. TCP协议 :(Transmission Control Protocol)传输控制协议. TCP是一种面向连接 ...
- 安装VMware,出现没有虚拟网络适配器的问题
遇到错误:安装VMware Workstation Pro这个软件,网络适配器中没有虚拟网卡,导致无法上网 解决方法:遇到这个问题,我就第一时间就去网上搜索解决方法,方案有很多,但是试了很多个还是不行 ...
- 你不知道的javaScript笔记(7)
异步:现在与将来 分块的程序 可以把JavaScript 程序写在单独的js 文件中,这个程序是由多个块组成的,这些块 中只有一个是现在执行,其余在捡来执行,最常见的块单位是函数. 例如: funct ...
- centos7编译安装Apache
一.安装 安装之前先将服务器的防火墙关掉. systemctl stop firewalld systemctl disable firewall 第一步: 安装apr 下载: wget -c ...
- (四)启用HTTPS
安全规范中有一条是要求尽量使用https而弃用http(新Chrome将标记非HTTPS网站为不安全),其实启用https和之前的ipv6改造一样,并不是什么高难度或者工作流繁多的的改造,只需将中间件 ...
- hdcms v5.7.0学习笔记
hdcms v5.7.0学习笔记 https://note.youdao.com/ynoteshare1/index.html?id=c404d63ac910eb15a440452f73d6a6db& ...
- POJ2739 Sum of Consecutive Prime Numbers 确定某个数以内的所有素数
参考:https://www.cnblogs.com/baozou/articles/4481191.html #include <iostream> #include <cstdi ...
- 介绍PHP的自动加载
昨天面试被问到了 PHP 的自动加载机制,因为很多概念模糊啦,没回答好,今天特意来总结一下. include 和 require 是PHP中引入文件的两个基本方法,但是每个脚本的开头,都需要包含(in ...
- Windows 10 下如何彻底关闭 Hyper-V 服务(翻外篇)
原文:Windows 10 下如何彻底关闭 Hyper-V 服务(翻外篇) windows禁用/启用hyper-V,解决hyper-V与模拟器同时启用时造成冲突 我是这样解决的,以管理员身份运行命令提 ...
- Markdown 基本用法
声明:引自 http://www.cnblogs.com/hnrainll/p/3514637.html ,感谢! 1. 标题设置(让字体变大,和word的标题意思一样)在Markdown当中设置 ...