201521123055 结对编程作业
结对编程
小组成员:
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 结对编程作业相关推荐
- 软件工程网络15结对编程作业
软件工程网络15结对编程作业 1.项目成员 学号:201521123014 博客地址:http://www.cnblogs.com/huangsh/ 学号: 201521123102 博客地址:htt ...
- 结对编程作业——毕设导师智能匹配
结对编程作业--毕设导师智能匹配 031402317 李佳恺 031402511 黄家俊 问题描述及要求 输入30个老师(包含带学生数的要求的上限,单个数值,在[0,8]内),100个学生(包含绩点信 ...
- 2022秋软工实践 第一次结对编程作业
2022秋软工实践 第一次结对编程作业 需求分析 (1)Need,需求 (2)Approach,做法 (3)Benfit,好处 (4)Competitors,竞争 (5)Delivery,推广 UML ...
- 2021秋软工实践第一次结对编程作业
这个作业属于哪个课程 构建之法-2021秋-福州大学软件工程 这个作业要求在哪里 2021秋软工实践第一次结对编程作业 这个作业的目标 实现博饼软件原型并进行博客写作 学号 031902139 队友学 ...
- 2022软工K班结对编程作业
逍遥骰GitHub链接 哔哩哔哩功能展示 学号 姓名 作业博客链接 具体分工 032002621 林灿彬 待填写 JavaScript编程.AI设计 032002623 林达锴 待填写 原型制作.ht ...
- 2021软工第一次结对编程作业
这个作业属于哪个课程 构建之法-2021秋-福州大学软件工程 这个作业要求在哪里 2021秋软工实践第一次结对编程作业 这个作业的目标 结对完成任务并学会原型设计 学号 031902414 队友学号 ...
- 2022秋软工实践 第二次结对编程作业
这个作业属于哪个课程 fzusdn 这个作业要求在哪里 作业要求 这个作业的目标 生成指定条件数据集,实现效益最大的点名策略 学号 032004110 队友学号 032004119 commit记录 ...
- 学生和老师匹配java_结对编程作业——毕设导师智能匹配
结对编程作业--毕设导师智能匹配 031402317 李佳恺 031402511 黄家俊 问题描述及要求 输入30个老师(包含带学生数的要求的上限,单个数值,在[0,8]内),100个学生(包含绩点信 ...
- 结对编程作业——四则运算
Github项目地址 PSP PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 10 10 · Estimat ...
最新文章
- 如何在asp.net中动态生成验证码
- 自己用C#写一个采集器、蜘蛛(zz)
- 亿级流量搜索前端,是怎么做架构升级的?
- firefox+android+平板,Firefox模拟手机浏览器(iOS+Android) – UserAgent Switcher使用方法...
- 鲁迅散文——狗的驳诘
- TabHost刷新activity的方法
- 使用 WebBrowser 操作 js
- 发生在“注解”@的那些事儿
- python 解方程 sympy_Python数据处理篇之Sympy系列(五)---解方程
- VMware 虚拟机安装OSX el capitan 11.12
- HBase完全分布式集群部署
- Windows Phone开发(37):动画之ColorAnimation 转:http://blog.csdn.net/tcjiaan/article/details/7526026...
- 如何搭建企业大数据分析平台
- FOC电机控制之SVPWM原理与实现
- 【计算机组成原理】Verilog语言编写32位并行加法器的理解
- 腾讯笔试题——逆序对
- Python数据处理二
- [Learn Android Studio 汉化教程]Reminders实验(一)
- 昨天在洛阳,也就是阴历十月一日,晚上有在自家门前烧纸的,有点好奇,今天知道了
- 2018秦皇岛ccpc赛后总结