结对编程

小组成员:

201521123055 林一心 博客地址

201521123046 张杭镖 博客地址

项目地址

一、分析改进现有代码

1.单元测试:

2.覆盖率:

3.确定当前设计的一个弱点,通过重构,确保在这个地方已有测试覆盖并保证重构没有改变已有的功能:

原程序只能生成两个数之间的算式,并且分数与整数算式出现几率没设置正确。

4.修改代码后,检查代码覆盖,看单元测试是否需要修改?测试用例是否需要增加?

单元测试需要修改,因为添加了多个数字的运算。

二、功能扩展

增加了括号运算符,相应的计算函数也要添加括号运算符的处理,原代码把计算过程放在main生成算式的main类中处理,扩展功能后代码显得臃肿,因此单独把计算功能拉出来做一个Calculator类。(这个计算功能同样也支持多位整数的计算,以便小学生升级到进阶地狱)

核心代码:

生成题目

        public main()//生成四则运算并输出{new Thread(myTimeRunable).start();int n = 0;MainFrame ma= new MainFrame();try{//调用初始化方法jbInit();}catch(Exception exception){exception.printStackTrace();}try{n= Integer.parseInt(ma.number);}catch(NumberFormatException e){//利用消息对话框提示输入失败JOptionPane.showMessageDialog(this,"输入错误!请重新输入");}int m = (int)(Math.random()*n+1);//随机整数题目和分数题目的题量for(int j=0;j<(n-m);j++){//整数题目int no=(int)(Math.random()*3+1); //最多四个数字运算StringBuffer qustr=new StringBuffer("");String ans;int numm=(int)(Math.random()*9+1);//随机数字qustr.append(numm);for(int i=0;i<no;i++){numm=(int)(Math.random()*9+1);int op=(int)(Math.random()*4+1);//随机选择计算符if(op==1){//加法qustr.append("+"+numm);//Answer.add(num1+num2+"");}if(op==2){qustr.append("-"+numm);}if(op==3){//乘法qustr.append("*"+numm);}if(op==4){//除法i--;continue;}}if(no>=2) {int left_kuo = (int) (Math.random() * no  + 1);int right_kuo = (int) (Math.random() * (no+1 - left_kuo) + 1 + left_kuo);qustr.insert(2*(left_kuo-1), '(');qustr.insert(2*right_kuo, ')');}qustr.append('=');Question.add(qustr.toString());Calculator cal=new Calculator();Answer.add(""+cal.caculate(qustr.toString()));}for(int j=0;j<m;j++){//分数题目Scanner in = new Scanner(System.in);//真分数的计算int op=(int)(Math.random()*4+1);int[] f1 =createFraction();int[] f2 =createFraction();int j1=GCD(f1[0],f1[1]);f1[0]=f1[0]/j1;//化简分数f1[1]=f1[1]/j1;j1=GCD(f2[0],f2[1]);f2[0]=f2[0]/j1;f2[1]=f2[1]/j1;int gbs = LCM(f1[1],f2[1]);if(op==1){//加法Question.add("("+f1[0]+"/"+f1[1]+")+("+f2[0]+"/"+f2[1]+")=");int num1=f1[0]*f2[1]+f2[0]*f1[1];int num2=f1[1]*f2[1];int num3=GCD(num1,num2);num1=num1/num3;num2=num2/num3;String a=new String();if(num1==num2){a="1";}else {a = num1 + "/" + num2;}Answer.add(a+"");}if(op==2){//减法int num1=f1[0]*f2[1]-f2[0]*f1[1];if(num1>0){  //防止出现负数Question.add("("+f1[0]+"/"+f1[1]+")-("+f2[0]+"/"+f2[1]+")=");int num2=f1[1]*f2[1];String a=new String();if(num1==0){a="0";}else{int num3=Math.abs(GCD(num1,num2));num1=num1/num3;num2=num2/num3;if(num1==num2){a="1";}else{a=num1+"/"+num2;}}Answer.add(a+"");}else{Question.add("("+f2[0]+"/"+f2[1]+")-("+f1[0]+"/"+f1[1]+")=");int num11=f2[0]*f1[1]-f1[0]*f2[1];int num2=f1[1]*f2[1];String a=new String();if(num11==0){a="0";}else{int num3=Math.abs(GCD(num11,num2));num11=num11/num3;num2=num2/num3;if(num11==num2){a="1";}else{a=num11+"/"+num2;}}Answer.add(a+"");}}if(op==3){//乘法Question.add("("+f1[0]+"/"+f1[1]+")*("+f2[0]+"/"+f2[1]+")=");int num1= f1[0]*f2[0];int num2 = f1[1]*f2[1];int num3=GCD(num1,num2);String a=new String();num1= num1/num3;num2 = num2/num3;if(num1==num2){a="1";}else{a=num1+"/"+num2;}Answer.add(a+"");}if(op==4){//除法Question.add("("+f1[0]+"/"+f1[1]+")÷("+f2[0]+"/"+f2[1]+")=");int num1= f1[0]*f2[1];int num2 = f1[1]*f2[0];int num3=GCD(num1,num2);String a=new String();num1= num1/num3;num2 = num2/num3;if(num1==num2){a="1";}else{a=num1+"/"+num2;}Answer.add(a+"");}}//输出题目JTextArea0.setText("");for(String string : Question){num ++;JTextArea0.append("("+num+")、"+string+"\n");}}

计算

    public class Calculator {private Stack<Long> numberStack = null;private Stack<Character> symbolStack = null;public long caculate(String numStr) {// 初始化栈numberStack = new Stack<Long>();symbolStack = new Stack<Character>();// 用于缓存数字,因为数字可能是多位的StringBuffer temp = new StringBuffer();// 从表达式的第一个字符开始处理for (int i = 0; i < numStr.length(); i++) {char ch = numStr.charAt(i); // 获取一个字符if (isNumber(ch)) { // 若当前字符是数字temp.append(ch); // 加入到数字缓存中} else { // 非数字的情况String tempStr = temp.toString(); // 将数字缓存转为字符串if (!tempStr.isEmpty()) {long num = Long.parseLong(tempStr); // 将数字字符串转为长整型数numberStack.push(num); // 将数字压栈temp = new StringBuffer(); // 重置数字缓存}// 判断运算符的优先级,若当前优先级低于栈顶的优先级,则先把计算前面计算出来while (!comparePri(ch) && !symbolStack.empty()) {long b = numberStack.pop(); // 出栈,取出数字,后进先出long a = numberStack.pop();// 取出运算符进行相应运算,并把结果压栈进行下一次运算switch ((char) symbolStack.pop()) {case '+':numberStack.push(a + b);break;case '-':numberStack.push(a - b);break;case '*':numberStack.push(a * b);break;case '/':numberStack.push(a / b);break;default:break;}} // while循环结束if (ch != '=') {symbolStack.push(new Character(ch)); // 符号入栈if (ch == ')') { // 去括号symbolStack.pop();symbolStack.pop();}}}} // for循环结束return numberStack.pop(); // 返回计算结果}private String removeStrSpace(String str) {return str != null ? str.replaceAll(" ", "") : "";}private boolean isStandard(String numStr) {if (numStr == null || numStr.isEmpty()) // 表达式不能为空return false;Stack<Character> stack = new Stack<Character>(); // 用来保存括号,检查左右括号是否匹配boolean b = false; // 用来标记'='符号是否存在多个for (int i = 0; i < numStr.length(); i++) {char n = numStr.charAt(i);// 判断字符是否合法if (!(isNumber(n) || "(".equals(n + "") || ")".equals(n + "")|| "+".equals(n + "") || "-".equals(n + "")|| "*".equals(n + "") || "/".equals(n + "")|| "=".equals(n + ""))) {return false;}// 将左括号压栈,用来给后面的右括号进行匹配if ("(".equals(n + "")) {stack.push(n);}if (")".equals(n + "")) { // 匹配括号if (stack.isEmpty() || !"(".equals((char) stack.pop() + "")) // 括号是否匹配return false;}// 检查是否有多个'='号if ("=".equals(n + "")) {if (b)return false;b = true;}}// 可能会有缺少右括号的情况if (!stack.isEmpty())return false;// 检查'='号是否不在末尾if (!("=".equals(numStr.charAt(numStr.length() - 1) + "")))return false;return true;}private boolean isNumber(char num) {if (num >= '0' && num <= '9')return true;return false;}private boolean comparePri(char symbol) {if (symbolStack.empty()) { // 空栈返回turereturn true;}char top = (char) symbolStack.peek();if (top == '(') {return true;}// 比较优先级switch (symbol) {case '(': // 优先级最高return true;case '*': {if (top == '+' || top == '-') // 优先级比+和-高return true;elsereturn false;}case '/': {if (top == '+' || top == '-') // 优先级比+和-高return true;elsereturn false;}case '+':return false;case '-':return false;case ')': // 优先级最低return false;case '=': // 结束符return false;default:break;}return true;}}

运行结果:

效能分析:

三、小结感受

两个人结对编程跟单人编程相比确实有些优势,可以跟队友随时讨论这点很重要,沟通使得问题快速解决,有时候自己有些小问题转不过来是真的难受。。但是不管如何,前提都是要事前把整个项目过程弄清楚,最好能写下来解决步骤。

PSP2.1 个人开发流程 预估耗费时间(分钟) 实际耗费时间(分钟)
Planning 计划 15 8
Estimate 明确需求和其他相关因素,估计每个阶段的时间成本 10 4
Development 开发 120 140
Analysis 需求分析需求分析 (包括学习新技术) 10 10
Design Spec 生成设计文档 0 0
Design Review 设计复审 10 8
Coding Standard 代码规范 2 2
Design 具体设计 10 15
Coding 具体编码 40 60
Code Review 代码复审 20 10
Test 测试(自我测试,修改代码,提交修改) 15 15
Reporting 报告 15 12
· 测试报告 2 2
· 计算工作量 15 10
· 并提出过程改进计划 10 5

在线转表格 推荐个在线搞md表格的工具

转载于:https://www.cnblogs.com/wkfg/p/8646410.html

201521123055 结对编程作业相关推荐

  1. 软件工程网络15结对编程作业

    软件工程网络15结对编程作业 1.项目成员 学号:201521123014 博客地址:http://www.cnblogs.com/huangsh/ 学号: 201521123102 博客地址:htt ...

  2. 结对编程作业——毕设导师智能匹配

    结对编程作业--毕设导师智能匹配 031402317 李佳恺 031402511 黄家俊 问题描述及要求 输入30个老师(包含带学生数的要求的上限,单个数值,在[0,8]内),100个学生(包含绩点信 ...

  3. 2022秋软工实践 第一次结对编程作业

    2022秋软工实践 第一次结对编程作业 需求分析 (1)Need,需求 (2)Approach,做法 (3)Benfit,好处 (4)Competitors,竞争 (5)Delivery,推广 UML ...

  4. 2021秋软工实践第一次结对编程作业

    这个作业属于哪个课程 构建之法-2021秋-福州大学软件工程 这个作业要求在哪里 2021秋软工实践第一次结对编程作业 这个作业的目标 实现博饼软件原型并进行博客写作 学号 031902139 队友学 ...

  5. 2022软工K班结对编程作业

    逍遥骰GitHub链接 哔哩哔哩功能展示 学号 姓名 作业博客链接 具体分工 032002621 林灿彬 待填写 JavaScript编程.AI设计 032002623 林达锴 待填写 原型制作.ht ...

  6. 2021软工第一次结对编程作业

    这个作业属于哪个课程 构建之法-2021秋-福州大学软件工程 这个作业要求在哪里 2021秋软工实践第一次结对编程作业 这个作业的目标 结对完成任务并学会原型设计 学号 031902414 队友学号 ...

  7. 2022秋软工实践 第二次结对编程作业

    这个作业属于哪个课程 fzusdn 这个作业要求在哪里 作业要求 这个作业的目标 生成指定条件数据集,实现效益最大的点名策略 学号 032004110 队友学号 032004119 commit记录 ...

  8. 学生和老师匹配java_结对编程作业——毕设导师智能匹配

    结对编程作业--毕设导师智能匹配 031402317 李佳恺 031402511 黄家俊 问题描述及要求 输入30个老师(包含带学生数的要求的上限,单个数值,在[0,8]内),100个学生(包含绩点信 ...

  9. 结对编程作业——四则运算

    Github项目地址 PSP PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 10 10 · Estimat ...

最新文章

  1. 如何在asp.net中动态生成验证码
  2. 自己用C#写一个采集器、蜘蛛(zz)
  3. 亿级流量搜索前端,是怎么做架构升级的?
  4. firefox+android+平板,Firefox模拟手机浏览器(iOS+Android) – UserAgent Switcher使用方法...
  5. 鲁迅散文——狗的驳诘
  6. TabHost刷新activity的方法
  7. 使用 WebBrowser 操作 js
  8. 发生在“注解”@的那些事儿
  9. python 解方程 sympy_Python数据处理篇之Sympy系列(五)---解方程
  10. VMware 虚拟机安装OSX el capitan 11.12
  11. HBase完全分布式集群部署
  12. Windows Phone开发(37):动画之ColorAnimation 转:http://blog.csdn.net/tcjiaan/article/details/7526026...
  13. 如何搭建企业大数据分析平台
  14. FOC电机控制之SVPWM原理与实现
  15. 【计算机组成原理】Verilog语言编写32位并行加法器的理解
  16. 腾讯笔试题——逆序对
  17. Python数据处理二
  18. [Learn Android Studio 汉化教程]Reminders实验(一)
  19. 昨天在洛阳,也就是阴历十月一日,晚上有在自家门前烧纸的,有点好奇,今天知道了
  20. 2018秦皇岛ccpc赛后总结

热门文章

  1. 如何快速写一篇文章。
  2. 【数据库笔记】(一)数据库模式
  3. 兄弟Brother HL-2260D 驱动
  4. 常用Bash命令整理
  5. 去中心化数字身份DID简介——一、基本概念
  6. CaysnPrinter - Windows平台开发包打印示例程序及接口说明文档 - 20170531
  7. 通达信破解接口怎么委托下单?
  8. JAVA 实现对图片打码,打马赛克
  9. c语言中如何生成1个0到1的随机数
  10. matlab 中 将一组数据归一化到(0,1)之间