• MathExam V2.0

一、预估与实际

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

二、需求分析

我通过观察家长们的要求了解到,小学三年级四则混合运算有如下的几个特点:

  • 运算符在2~4个【进一步细化要求:至少两个不同的运算符】
  • 可以加括号
  • 减法运算的结果不能有负数
  • 除法运算除数不能为0,不能有余数

经过分析,我认为,这个程序应当:

  • 不可输入除数字外其他字符
  • 注意辨别命令行参数个数
  • 保留小学一年级和小学二年级计算题生成的功能,同时增加小学三年级四则混合运算的生成功能
  • 随机生成括号改变优先级

三、设计

1. 设计思路

说明你如何设计这个程序

比如:

  • 通过命令行接收参数
  • 通过函数来随机生成题目
  • 计算四则算式
  • 最后生成题目与答案文件
  • 关键函数是题目的生成函数认真构思

2. 实现方案

  • 逆波兰表达式

四、编码

请说明你如何按照设计思路进行编码,并记录你在开发中遇到的问题,与解决过程

1. 调试日志

  • 第一次编译测试,括号位置不正确
  • 第二次编译测试,括号无法提高优先级

2. 关键代码

	public static int Random(int Min, int Max) {
return (int) (Min + Math.random() * (Max - Min + 1));
} public static int Calc(String Question) {
Stack<Integer> nums = new Stack<Integer>(); // 栈 保存数字
Stack<Character> opes = new Stack<Character>(); // 栈 保存操作符
String string = Question.replace(" ", "");// 获取临时字符串
char symbol;
int n = 0; // 保存每一个数字
char[] cs = string.toCharArray();// 字符串转换为char数组
for (int i = 0; i < cs.length; i++) {// 遍历char数组
char temp = cs[i];
if (Character.isDigit(cs[i])) {// 判断当前char是否为数字
n = 10 * n + Integer.parseInt(String.valueOf(temp)); // 临时保存大于10的数字
} else {// 非数字
if (n != 0) {
nums.push(n);// 数字入栈
n = 0;
}
if (temp == '(') {// 如果遇到左括号
opes.push(temp);// 入栈
} else if (temp == ')') {// 如果是遇到右括号
while (opes.peek() != '(') { // 括号里面运算完(查看堆栈顶部的对象,但不从堆栈中移除它)
symbol = opes.pop();
int t = cal(nums.pop(), nums.pop(), symbol);// 计算两个数据
if (t < 0 && symbol == '-') {
return -1;
}
if (t == 0 && symbol == '÷') {
return -1;
}
if (t < 0 && symbol == '÷') {
return -1;
}
nums.push(t);// 计算结果入栈
}
opes.pop();
} else if (isType(temp) > 0) {
if (opes.isEmpty()) { // 栈为空直接入栈
opes.push(temp);
} else {
// 若栈顶元素优先级大于或等于要入栈的元素,将栈顶元素弹出并计算,然后入栈
if (isType(opes.peek()) >= isType(temp)) {
symbol = opes.pop();
int t = cal(nums.pop(), nums.pop(), symbol);// 计算两个数据
if (t < 0 && symbol == '-') {
return -1;
}
if (t == 0 && symbol == '÷') {
return -1;
}
if (t < 0 && symbol == '÷') {
return -1;
}
nums.push(t);
}
opes.push(temp);
}
}
}
}
// 最后一个字符若是数字,未入栈
if (n != 0) {
nums.push(n);
}
while (!opes.isEmpty()) {
symbol = opes.pop();
int t = cal(nums.pop(), nums.pop(), symbol);// 计算两个数据
if (t < 0 && symbol == '-') {
return -1;
}
if (t == 0 && symbol == '÷') {
return -1;
}
if (t < 0 && symbol == '÷') {
return -1;
}
nums.push(t);
}
return nums.pop();
}

3. 代码规范:

  • 采用4个空格缩进,禁止使用tab字符。
  • 左小括号和字符之间不出现空格;同样的,有小括号和字符之间也不出现空格
  • 注释的双斜线与注释内容之间有且仅有一个空格
  • 大括号的使用约定
  • 方法参数在定义和传入是,多个参数逗号后边必须加空格
  • 没有必要增加若干空格来是耨一行的字符与上一行对应位置的字符对齐
  • 不同逻辑、不同语义、不同业务的代码之间插入一个空行分割开来以提升可读性
  • 任何二目、三木运算符的左右两边都需要加一个空格

五、测试

  • 命令:

java MathExam -n 5 -Grade 1

  • 输出:

(1) 40 - 38 =

(2) 2 + 38 =

(3) 81 - 10 =

(4) 42 + 57 =

(5) 79 - 17 =

(1) 40 - 38 = 2

(2) 2 + 38 = 40

(3) 81 - 10 = 71

(4) 42 + 57 = 99

(5) 79 - 17 = 62

  • 命令:

java MathExam -Grade 3 -n 5

  • 输出:

(1) 36 × 17 + 75 ÷ 1 + 91

(2) ( 13 + 93 ) × 17

(3) 97 + 21 + 44 - 89 + 73

(4) 4 × 64 + 23 + 18 + 9

(5) 1 × 58 × 57 × 86 - 96

(1) 96 × 5 + 68 ÷ 91 + 20 = 778

(2) ( 13 + 93 ) × 17 = 1802

(3) 7 + 55 + 57 - 53 + 32 = 146

(4) 55 × 85 + 100 + 95 + 74 = 306

(5) 65 × 96 × 71 × 92 - 52 = 284220

  • 命令:

java MathExam Grade 2 -n

  • 输出:

Error:001

六、总结

请总结过程中的教训和经验,思考

  • 结对编程相比单独编程效率更高
  • 需求分析非常重要
  • 掌握多门语言非常重要
  • 代码目前3/4运算符加括号问题暂时没有解决,且运行时可能崩溃

作业2-MathExam V2.0的更多相关文章

  1. MathExam V2.0

    # 隔壁村小学的小朋友都羡慕哭了2.0版 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 1 ...

  2. 电梯V2.0

    电梯V2.0 GitHub仓库地址 Problem 一栋10层的大楼(楼层编号1-10),设3台无限载重的电梯,初始时电梯停在1层.其中:1号电梯只能停留在奇数层,2号电梯可以各层都停留,3号电梯只停 ...

  3. [Android]Android端ORM框架——RapidORM(v2.0)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...

  4. JuCheap V2.0响应式后台管理系统模板正式发布beta版本

    JuCheap V1.* 查看地址: http://blog.csdn.net/allenwdj/article/details/49155339 经过半年的努力,JuCheap后台通用响应式管理后台 ...

  5. python gettitle v2.0

    #!/usr/bin/env python # coding=utf-8 import threading import requests import Queue import sys import ...

  6. ".NET Compact Framework v2.0 could not be found."

    参考: http://blog.csdn.net/godcyx/article/details/7348431 问题原因: That's a known issue where VS can't di ...

  7. 【JS】heatmap.js v1.0 到 v2.0,详细总结一下:)

    前段时间,项目要开发热力图插件,研究了heatmap.js,打算好好总结一下. 本文主要有以下几部分内容: 部分源码理解 如何迁移到v2.0 v2.0官方文档译文 关于heatmap.js介绍,请看这 ...

  8. 怎样在IDEA中使用JUnit4和JUnitGenerator V2.0自动生成测试模块

     因为项目的需要,所以研究了一下自动生成测试代码.将经验记录下来,总会有用的.我个人认为,好记性不如多做笔记多反思总结. 1.    前提条件 开发环境已正确配置 工程已解决JUnit依赖关系(pom ...

  9. 微信快速开发框架(六)-- 微信快速开发框架(WXPP QuickFramework)V2.0版本上线--源码已更新至github

    4月28日,已增加多媒体上传及下载API,对应MediaUploadRequest和MediaGetRequest ------------------------------------------ ...

随机推荐

  1. ps基本认识

    近来中意ui方面学习,从视频中总结了些许notses,希望能够帮到共同喜欢(❤ ω ❤)的友友 ·基础了解 位图:由像素组成的图片,把位图无限放大以后看到很多小方格,一个方格代表一个像素 矢量图:放大 ...

  2. 团队展示网页 HTML模版

    之前帮着领导,参加了iGEM的校内赛的网页制作,一开始也是用的现成的模版,但后面修修改改几乎面目全非了- 这里分享一下自己的网站,可以用做团队展示的网页模版,文件在末尾,大家自行下载吧-- 这里贴两张 ...

  3. 关于 idea 快捷键 alt + f7 无法使用的一些尝试

    1. 概述 问题 使用 idea 时, 快捷键 alt + f7 无法生效 环境 OS: win10 idea: idea 2018.1.5 GeForce Experience: 3.17.0.12 ...

  4. EntityFramework6.1自动生成复数名称数据表的问题

    遇到一个很奇怪的问题,两个程序部署在两个不同的机器上,一个是.net 4.6.1另外一个是.net 4.0的运行时,两个项目都引用了EntityFramework6.1.3.程序分别执行后,4.0环境 ...

  5. 20155223 2016-2017-2《Java程序设计》课程总结

    20155223 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1 预备作业2 预备作业3 第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 ...

  6. 2017-2018-1 20155315 《信息安全系统设计基础》加分作业:实现mypwd

    学习pwd命令 man pwd查看 pwd命令用于显示当前工作目录,是Linux下最常用的命令之一.在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. 环境变量OLDPWD表示 ...

  7. 20145207 《Java 程序设计》实验三 (敏捷开发与XP实践)实验报告

    <Java 程序设计>实验三 (敏捷开发与XP实践)实验报告 目录 改变 敏捷开发与XP实践实验要求 实验成果 课后思考 改变 修改了之前仅仅是贴了图片,连代码都没粘的状态.增加了自己的思 ...

  8. POI导出excel文件样式

    需求: 公司业务和银行挂钩,各种形式的数据之间交互性比较强,这就涉及到了存储形式之间的转换 比如数据库数据与excel文件之间的转换 解决: 我目前使用过的是POI转换数据库和文件之间的数据,下边上代 ...

  9. R的数据库访问-MySQL

    目录 1 RMySQL 2 环境与安装 3 建立通信 1 RMySQL R作为一款数据分析的工具,,而MySQL是一款常用的开源关系型数据库软件,非常适用于中小型的数据存储,当二者相互结合时才能爆发出 ...

  10. python实现socket通信

    python实现socket很简单,保证你的环境有响应的python环境就可以,我使用的是socket,demo代码如下: server端程序: # coding:utf-8 import socke ...