四则运算结对作业
-
代码仓库地址:https://coding.net/u/anvozo/p/operation-program/git我的结对搭档是张琪。
-
PSP展示
PSP |
任务内容 |
计划时间(min) |
完成时间(min) |
Planning |
计划 |
60 |
80 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
60 |
80 |
Development |
开发 |
3000 |
4800 |
Analysis |
需求分析 |
60 |
80 |
Design Spec |
生成文档 |
0 |
0 |
Design Review |
设计复审 |
200 |
300 |
Coding Standard |
代码规范 |
20 |
30 |
Design |
具体设计 |
1200 |
1800 |
Coding |
具体编码 |
1800 |
3600 |
Code Review |
代码复审 |
300 |
600 |
Test |
测试 |
130 |
150 |
Reporting |
报告 |
600 |
600 |
Test Report |
测试报告 |
60 |
80 |
Size Measurement |
计算工作量 |
30 |
60 |
Postmortem& ProcessImprovement Plan |
事后总结, 并提出过程改进计划 |
600 |
600 |
-
(1)Information Hiding
信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。
信息隐藏原则的应用。
1 多层设计中的层与层之间加入接口层;
2 所有类与类之间都通过接口类访问;
3 类的所有数据成员都是private,所有访问都是通过访问函数实现的;
(2)Interface Design接口设计
接口是对象之间建立连接,指的是进行连接而设计的指定方法;
而java中的interface是为了更好的完成这种连接而定义的一种语法支持;
相对于抽象类,抽象类一般在多重继承结构下,抽象类去实现接口并具体实现部分方法。
(3)Loose Coupling松耦合
耦合度(Coupling)是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。
模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。
降低模块间的耦合度能减少模块间的影响。松耦合的目标是最小化依赖。松耦合这个概念主要用来处理可伸缩性、灵活性和容错这些需求。
4.计算模块接口的设计和实现过程
计算模块的关键是中缀转后缀
转换的整体流程如下:
中缀表达式转后缀表达式的方法:
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。
5.计算模块接口部分的性能改进、
6.计算模块部分单元测试展示
public class Test {
public static void main(String[] args) {
System.out.println(2.1%1);
}
}
7.计算模块部分异常处理说明
模块的异常处理
package com.edu;
public class Command {
public Command() {
}
public static float opt(String s) throws Exception {
if(s != null && !"".equals(s.trim())) {
int a1 = s.indexOf("+");
int a2 = s.indexOf("-");
int a3 = s.indexOf("*");
int a4 = s.indexOf("/");
int a5 = s.indexOf("(");
if(a1 == -1 && a2 == -1 && a3 == -1 && a4 == -1) {
if(s.trim() != null && !"".equals(s.trim())) {
return Float.parseFloat(s.trim());
} else {
throw new Exception("operate error");
}
} else {
float n2;
if(a5 != -1) {
int n11 = s.indexOf(")");
if(n11 == -1) {
throw new Exception("括号不匹配");
} else {
n2 = opt(s.substring(a5 + 1, n11).trim());
s = s.replace(s.substring(a5, n11 + 1), String.valueOf(n2));
return opt(s);
}
} else {
float n1;
if(a1 != -1) {
n1 = opt(s.substring(0, a1));
n2 = opt(s.substring(a1 + 1, s.length()));
return n1 + n2;
} else if(a2 != -1) {
n1 = opt(s.substring(0, a2));
n2 = opt(s.substring(a2 + 1, s.length()));
return n1 - n2;
} else if(a3 != -1) {
n1 = opt(s.substring(0, a3));
n2 = opt(s.substring(a3 + 1, s.length()));
return n1 * n2;
} else if(a4 != -1) {
n1 = opt(s.substring(0, a4));
n2 = opt(s.substring(a4 + 1, s.length()));
return n1 / n2;
} else {
return (float)Integer.parseInt(s.trim());
}
}
}
} else {
return 0.0F;
}
}
}
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class Command {
public static ArrayList<String> fu= new ArrayList();
public static ArrayList<Integer> num= new ArrayList();
public static ArrayList<String> fg= new ArrayList();
public static ArrayList<Float> jian= new ArrayList();//保存四则运算中间结果
public static boolean flag=false;
public static int n=1;//题目数
public static int nops=1;//符号数
public static int mlow=0;//数值最低取值范围
public static int mhigh=50;//数值最高取值范围
public static int c=0;//是否含有括号
public static int bc=0;//是否包含乘除法
/**获取表达式
* @return
*/
public static String fun() {
String str="";
int k=0,s=0,nos=(int) (Math.random()*nops)+1;
int a=(int) (Math.random()*((mhigh-mlow)/n))+mlow;
num.set(0, a);
str+= a;
for(int i=0;i<nops;i++) {
char f=fu.get((int) (Math.random()*fu.size())).charAt(0);
if(f=='/') {
str+= f;
fg.set(i, f+"");
int b= getYin(num.get(i));
num.set(i+1, b);
str+= b;
}else if(f=='*'){
str+= f;
fg.set(i, f+"");
int b=(int) (((mhigh-mlow)/(num.get(i)/2+1))*Math.random()+mlow);
num.set(i+1, b);
str+= b;
}else if(i>1&&fg.get(i-1).equals("+")) {
str+='-';
fg.set(i, f+"");
int b=(int) (((mhigh-mlow)/(num.get(i)+1))*Math.random()+mlow);
num.set(i+1, b);
if(bc==1&&k==0&&nops>2&&s<2&&i<num.size()-2) {
str+="("+b;
k=1;
s++;
}else if(bc==1&&k==1&&nops>2) {
str+=b+")";
k=0;
}else {
str+= b;
}
}else {
str+= f;
fg.set(i, f+"");
int b=(int)(Math.random()*((mhigh-mlow)))+mlow;
num.set(i+1, b);
if(bc==1&&k==0&&nops>2&&s<2&&i<num.size()-2) {
str+="("+b;
k=1;
s++;
}else if(bc==1&&k==1&&nops>2) {
str+=b+")";
k=0;
}else {
str+= b;
}
}
}
if(bc==1&&k==1) {
str+=")";
}
return str;
}
8.界面模块的详细设计过程(界面模块与计算模块的对接。详细地描述UI模块的设计与两个模块的对接,并在博客中截图实现的功能。)
界面模块包含出题页面和答题页面、答题界面和文件上传界面
代码展示
package com.edu; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Date; import java.util.LinkedList; 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 javax.servlet.http.HttpSession; @WebServlet("/answer") public class Answer extends HttpServlet { private static final long serialVersionUID = 1L; private static LinkedList<String> subs=new LinkedList<>(); private static LinkedList<String> ans=new LinkedList<>(); public Answer() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { File file=new File("../result.txt"); file.creatNewFile(); FileReader fr=new FileReader(file); BufferedReader br=new BufferedReader(fr); String str=br.readLine(); //使用request对象的getSession()获取session,如果session不存在则创建一个 HttpSession session = request.getSession(); while (str!= null) { System.out.println(str); subs.add(str); try { int s= (int) Command.opt(str); ans.add(s+""); } catch (Exception e) { e.printStackTrace(); } str=br.readLine(); } session.setAttribute("subs", subs); session.setAttribute("ans", ans); session.setAttribute("nsubs", 0); session.setAttribute("nans", 0); session.setAttribute("time",new Date()); //将数据存储到session中 response.sendRedirect("answer.jsp"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } package com.edu; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.LinkedList; 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 javax.servlet.http.HttpSession; /** * Servlet implementation class DealAnswer */ @WebServlet("/dealAnswer") public class DealAnswer extends HttpServlet { private static final long serialVersionUID = 1L; private static LinkedList<String> subs=new LinkedList<>(); private static LinkedList<String> ans=new LinkedList<>(); public DealAnswer() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getAttribute(""); //使用request对象的getSession()获取session,如果session不存在则创建一个 HttpSession session = request.getSession(); subs=(LinkedList<String>) session.getAttribute("subs"); ans=(LinkedList<String>) session.getAttribute("ans"); Integer nsubs=(Integer) session.getAttribute("nsubs"); Integer nans=(Integer) session.getAttribute("nans"); String answer=request.getParameter("anwer"); try { if(nsubs==subs.size()-1) { Date end=new Date(); Date begin=(Date) session.getAttribute("time"); SimpleDateFormat sf=new SimpleDateFormat("mm:ss"); if(answer.trim().equals((int)Command.opt(subs.get(nsubs))+"")) { System.out.println("你的答案"+answer); System.out.println("实际答案"+Command.opt(subs.get(nsubs))); nans=nans+1; session.setAttribute("nans", nans); } long ti=end.getTime()-begin.getTime(); long h=ti/(1000*60*60); //时 long m=(ti-(h*1000*60*60))/(1000*60);//分 long s=(ti-(m*1000*60))/(1000);//秒 System.out.println(end.getTime()-begin.getTime()); session.setAttribute("time",""+h+":"+m+":"+s); response.sendRedirect("countAns.jsp"); return; } if(answer.trim().equals((int)Command.opt(subs.get(nsubs))+"")) { System.out.println("你的答案"+answer); System.out.println("实际答案"+Command.opt(subs.get(nsubs))); nans=nans+1; session.setAttribute("nans", nans); } } catch (Exception e) { e.printStackTrace(); } session.setAttribute("nsubs", ++nsubs); response.sendRedirect("answer.jsp"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
9.界面模块与计算模块的对接
在web界面中,后端将数据输出到HTML页面,通过servlet方法在JS控制逻辑中需要访问数据时可以从HTML中取得
10.描述结对的过程
这次项目我的队友是张琪,和我对比起来她真的是太优秀了。我的基础知识很不好,编程对于我来说很困难,但是她总能克服各种困难并给我带来信心。我一个人做项目的时候,通常有很多不懂的东西,只能在网上找各种似是而非不知对错的答案,往往因为一个问题纠结半天,效率低下。但是和她合作的时候,因为她性格开朗热情并且乐于助人,有什么问题问她的话简直是事半功倍,我不会再因为一个问题而止步不前,效率比之前提高了很多。我真的给她带来了很多麻烦,谢谢她的不厌其烦。并且她总能有一些很的想法,使得代码变得更加优化简单。
结对编程的优点:
-
队友之间互相帮助,互相进步。
-
两个人一起总能产生各种各样的想法,有利于代码的设计和规范
-
两个人之间的沟通和交流能让一些疑问能很容易就解决了,提高了效率
结对编程的缺点:
-
因为张琪很厉害,有时候我对她产生了依赖,付出很少
-
有时候因为想法不和容易产生分歧
-
成员互评
张琪:优点:认真负责,乐于助人,善于思考,有耐心,代码能力很好
我:优点:思想活跃,总有疑问 缺点:总是拖延,代码能力差