目录

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.描述结对的过程,提供非摆拍的两人在讨论的结对照片。

结对的过程:

  1. 商讨项目的制作过程,包括使用的代码,技术规范,页面的框架,实现的功能等
  2. 计划分工及功能的实现,进行PSP的初期规划
  3. 正式开始进行项目的制作,计算模块与界面模块同时进行
  4. 进行页面的交互,并且同时不断修改代码
  5. 进行测试
  6. 发布项目
  7. 撰写博客

11.说明结对编程的优点和缺点。同时指出结对的每一个人的优点和缺点在哪里 (要列出至少三个优点和一个缺点)

结对编程的优缺点

  • 优点

    • 能实时更新项目进度,交流密切,方便项目实施
    • 对于懒惰的一方有督促的作用
    • 集思广益,相同的问题两个人更好解决
    • 分工明确,减少工作量
  • 缺点
    • 对于两个人的配合有较高的要求
    • 对于两个人的时间和经历有较高的要求
    • 容易产生分歧

结对的每一个人的优缺点

刘卓锦

  • 优点

    • 代码能力强
    • 耐心
    • 细心
  • 缺点
    • 不爱写注释

翁梦蕾

  • 优点

    • 有设计风格
    • 细心
    • 耐心
  • 缺点
    • 对于java掌控不熟

web四则运算的更多相关文章

  1. 结对作业——web四则运算

    目录: 一.Coding.net项目地址 二.PSP 三.接口设计 四.接口实现 五.性能分析 六.单元测试 七.异常处理 八.模块设计 九.模块对接 十.结对 十一.思考 十二.PSP 网站:htt ...

  2. 第三周结对项目--小学生四则运算CAI软件汇报及总结(UI/web)

    前言: 这周是和我队友苏卫喜一起结对开发,我主要是写项目文档需求分析,她是通过我的需求文档来进行做思维导图,之后我们通过思维导图一起讨论用户界面设计. 以下就是我的需求分析1.0版本 1.   软件名 ...

  3. 四则运算4 WEB(结对开发)

    在第三次实验的基础上,teacher又对此提出了新的要求,实现网页版或安卓的四则运算. 结对开发的伙伴: 博客名:Mr.缪 姓名:缪金敏 链接:http://www.cnblogs.com/miaoj ...

  4. 四则运算web版需求规格说明书

    目录 1引言... 4 1.1  目的... 4 1.2  背景... 4 1.3  术语... 4 1.4  预期读者与阅读建议... 5 1.5  参考资料... 6 1.6  需求描述约定... ...

  5. 四则运算 WEB

    coding.net:https://git.oschina.net/ysh0904/WEB.git 一.需求分析 记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算 ...

  6. 四则运算web最终版

    经过若干时间的奋战,终于完成了web版四则运算程序.团队成员:井小普.张贺. 设计思想: 在之前的程序基础上两人结合开发web系统. 首先,进行登录注册界面的编写,不同用户,对应不同的错题库,答题记录 ...

  7. web窗体之四则运算

    1,计算方法: namespace ASP.NET { public class JiSuan { public int S; public int Result { get { return S; ...

  8. 结对项目作业报告——四则运算web项目

    成员:顾思宇2016011993 程羚2016012050   1.仓库地址:https://git.coding.net/DandelionClaw/WEB_Calculator.git 注: 本项 ...

  9. 结对项目:四则运算web

    1)Coding.Net项目地址 https://git.coding.net/DandelionClaw/WEB_Calculator.git 注:本项目为web端,并且需要连接SQL Server ...

随机推荐

  1. 序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询

    查询窗口中可以设置很多查询条件 表单中输入的内容转为datagrid的load方法所需的查询条件向原请求地址再次提出新的查询,将结果显示在datagrid中 转换方法看代码注释 <td cols ...

  2. vue.esm.js:578 [Vue warn]: Missing required prop

    问题: 解决: required: true,属性是,这个必须填写

  3. Java分享笔记:自定义枚举类 & 使用enum关键字定义枚举类

    在JDK1.5之前没有enum关键字,如果想使用枚举类,程序员需要根据Java语言的规则自行设计.从JDK1.5开始,Java语言添加了enum关键字,可以通过该关键字方便地定义枚举类.这种枚举类有自 ...

  4. BGP映射和联盟

    BGP映射和联盟 一:请看下面四张有关于BGP映射和联盟的拓扑图 BGP联盟 BGP映射实例 BGP单映射 BGP多映射 二:以图一为列,进行BGP联盟的配置测试: 首先进行理论分析,在拓扑图中共用两 ...

  5. U盘被分区后恢复方法

    一:运行cmd 二:输入diskpart,按enter. 三:输入list disk,按enter. 四:选择优U盘,输入select disk X(X代表磁盘后面的数字0.1,可磁盘的大小来判断数字 ...

  6. FROM_UNIXTIME

    FROM_UNIXTIME 格式化MYSQL时间戳函数   函数:FROM_UNIXTIME作用:将MYSQL中以INT(11)存储的时间以"YYYY-MM-DD"格式来显示.语法 ...

  7. 8.2 USB键盘驱动编写和测试

    目标:根据USB驱动分析和上节的USB鼠标驱动,编写键盘驱动,并测试. 一.原理分析 1. 首先通过打印usb_buf[i]中的8字节数据,看一下按键按下之后会接收到什么. 1)通过按完所有键盘按键打 ...

  8. linux系统编程之框架

    linux系统编程之框架: 1. 进程 1.1 进程概念 1.1.1 PCB 1.1.2 环境变量 1.2 进程控制 1.3 进程间通信 1.3.1 管道 1.3.2 有名管道 1.3.3 共享内存 ...

  9. ruby Dir类

    类方法 1. Dir[pat]    Dir::glob( pat) 返回一个数组,包含与指定的通配符模式 pat 匹配的文件名: * - 匹配包含 null 字符串的任意字符串 ** - 递归地匹配 ...

  10. ruby 数据类型String

    一.字符串创建 单引号包含,不支持转义符和内嵌表达式#{}(插值符) str = 'hello world!' 双引号包含 str = "hello world!" 使用%,%Q, ...