结对项目

这个作业属于哪个课程 软件工程
这个作业要求在哪里 结对项目
这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序(也可以用图像界面,具有相似功能)

合作者

吴伟铭:3118005428
杨海滨:3118005432

项目Github地址

https://github.com/binocean/ArithmeticApp

设计实现过程

我们使用node.js实现了项目的关键算法,并且结合electron框架完成了带文件上传输出的图形界面。

功能模块说明

creatQuestion.js:实现题目的生成
aboutFile.js:实现文件操作
bracket.js:处理算式中的括号
calculate.js:实现四则运算功能
collateAnswer.js:解析题目答案
index.js:生成图形页面组件

类说明

Operator.js:运算符类
Operands.js:操作数类

核心代码说明

const Arithmetic = {
  // 两个操作数求和 
  add(a, b) {
    return new Operands({
      numerator: a.numerator * b.denominator + b.numerator * a.denominator,
      denominator: a.denominator * b.denominator
    });
  },
  // 两个操作数求差
  sub(a, b) {
    return new Operands({
      numerator: a.numerator * b.denominator - b.numerator * a.denominator,
      denominator: a.denominator * b.denominator
    });
  },
  // 两个操作数乘法
  mult(a, b) {
    return new Operands({
      numerator: a.numerator * b.numerator,
      denominator: a.denominator * b.denominator
    });
  },
  // 两个操作数除法
  divi(a, b) {
    return new Operands({
      numerator: a.numerator * b.denominator,
      denominator: a.denominator * b.numerator
    });
  }
}
//使用栈来判断随机加入括号后的运算优先级
export let calculateExp = (expression) => {
  // 将中缀表达式转为后缀表达式
  let temp = []; // 临时存放
  let suffix = []; // 存放后缀表达式
  expression.forEach(item => {
    if (item instanceof Operands) {
      suffix.push(item) 
    } else if (item === '(') {
      temp.push(item); 
    } else if (item === ')') {
      while (temp[temp.length - 1] !== '(') {
        suffix.push(temp.pop());
      }
      temp.pop(); 
    } else if (item instanceof Operator) {
      // 如果栈顶是运算符,且栈顶运算符的优先级大于或等于该运算符
      while (temp.length !== 0 &&
        temp[temp.length - 1] instanceof Operator &&
        temp[temp.length - 1].value >= item.value) {
        suffix.push(temp.pop());
      }
      // 是空栈或者栈顶是左括号亦或是栈顶优先级低,则直接入栈到 temp
      temp.push(item);
    }
  });
  while (temp.length !== 0) {
    suffix.push(temp.pop());
  }

性能与功能测试

生成100道题目测试,各性能指标表现良好

题目预览

  • 生成10000道题目

  • 生成100道题目

成绩预览

  • 直接导入Answers.txt与自身比较

  • 修改一道正确答案

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 20
Estimate 估计这个任务需要多少时间 30 20
Development 开发 700 800
Analysis 需求分析 (包括学习新技术) 50 65
Design Spec 生成设计文档 30 25
Design Review 设计复审 20 35
Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 25
Design 具体设计 60 65
Coding 具体编码 130 130
Code Review 代码复审 20 25
Test 测试(自我测试,修改代码,提交修改) 30 60
Reporting 报告 30 35
Test Report 测试报告 20 25
Size Measurement 计算工作量 10 15
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 15 20
合计 815 930

项目小结

吴伟铭:通过这个项目我对需求设计有了更深层次的了解,对于团队的开发模式也有了许多体会,我认为图形化的界面还是更适合用前端语言开发,其具有跨平台可扩展性的特点,项目中的不足之处是在组队的过程中沟通效率可以进一步提高,后期的优化也可以更加到位

杨海滨:这个项目提高了我的纠错能力,对于括号的处理我修改了很多个版本,最后经过讨论我们决定在算式中找可插入括号的地方,然后判断括号的加入是否有意义或者合理,不合理则取消插入,这个处理方式是两个成员共同努力的结果,所以结对编程对于开发效率确实有比较大的提升

posted @ 2020-10-13 00:20  西瓜分你一半  阅读(122)  评论(0)    收藏  举报