结对项目
| 这个作业属于哪个课程 | 软件工程 |
|---|---|
| 这个作业要求在哪里 | 结对项目 |
| 这个作业的目标 | 实现一个自动生成小学四则运算题目的命令行程序(也可以用图像界面,具有相似功能) |
合作者
吴伟铭: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 |
项目小结
吴伟铭:通过这个项目我对需求设计有了更深层次的了解,对于团队的开发模式也有了许多体会,我认为图形化的界面还是更适合用前端语言开发,其具有跨平台可扩展性的特点,项目中的不足之处是在组队的过程中沟通效率可以进一步提高,后期的优化也可以更加到位
杨海滨:这个项目提高了我的纠错能力,对于括号的处理我修改了很多个版本,最后经过讨论我们决定在算式中找可插入括号的地方,然后判断括号的加入是否有意义或者合理,不合理则取消插入,这个处理方式是两个成员共同努力的结果,所以结对编程对于开发效率确实有比较大的提升





浙公网安备 33010602011771号