MathExamLv2——周世元211606348,许燕婷211606338
结对编程
211606348 周世元 211606338 许燕婷
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 100 | |
• Estimate | • 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 30 | 30 |
• Design Spec | • 生成设计文档 | 30 | 70 |
• Design Review | • 设计复审 | 10 | 10 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 10 | 20 |
• Design | • 具体设计 | 20 | 20 |
• Coding | • 具体编码 | 500 | 300 |
• Code Review | • 代码复审 | 20 | 100 |
• Test | • 测试(自我测试,修改代码,提交修改) | 200 | 300 |
Reporting | 报告 | ||
• Test Repor | • 测试报告 | 40 | 100 |
• Size Measurement | • 计算工作量 | 15 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 50 | 100 |
合计 | 1170 |
二、需求分析
小学一年级数学
· 数学一年级下学期 第五单元测试题
· 两位数减两位数 不退位减
· 两位数减两位数(退位减)
· 两位数加两位数(进位加)
· 两位数加两位数(不进位加)
· 两位数减一位数(退位)
· 两位数加一位数(进位)
· 两位数减一位数、整十数(不退位)
· 小括号
· 两位数加一位数、整十数(不进位)
· 整十数加、减整十数
· 整十数加、减整十数
小学二年级数学
· 万以内的加法和减法
· 求比一个数多几的应用题
· 不连续进位加
· 连续进位加
· 加法的验算
· 万以内的加法和减法
我通过百度的方式了解到,小学三年级数学有如下的几个特点:
- 特点
- 只有正整数运算
- 没学负数,不会小数运算
- 只会运算1000以内的数
- 小学二年级除了要满足一年级的要求,还要算仅限于九九乘法表的乘法与除法
- 小学三年级进行四则混合运算,运算符在2~4个之间,可以加括号,减法运算的结果不能有负数,除法运算除数不能为0,不能有余数。
输入格式:
- 程序需从命令行中接收两个参数 年级 和 题目数量,分别用 -n 和 -grade 表示,这两个参数的顺序不限,当 n 为 2 或 1 时,分别代表给 2 年级,1 年级出题
输出格式:
- 把题目和标准答案写入out.txt文件,输出的格式要求
- 每道题目占一行
- 每道题的格式:
- (1)题号:数字 + 一对英文括号;
- (2)题目:数字、符号之间空一格;
- (3)题号与题目之间也需要加一空格,行末不需要加空格。
- (4)题目和标准答案分开输出,先输出所有题目,后输出所有答案,答案的输出格式与题目一样。
经过分析,我认为,这个程序应当:
- 可接收2个参数:题目数量、年级
- 会检测出各种输入参数的异常
- 会根据传入的年级生成对应需求的题目
- 最后将题目答案输出到out.txt文件
- 采用代码重构和分而治之的思想。
- 各部分函数代码给注释,有明确的逻辑。
- 程序运行中、文件输出后要给明确的提示
三、设计
1. 设计思路
这个程序有2个类,7个函数,功能如下:
主类和内部类
- 内部类:Node (用来存储后缀表达式)
主函数
- 主函数里调用check()函数排除输入参数的各种问题
- 主函数里判断当前输入参数的年级,根据年级执行不同的题目生成器
- 主函数里根据对应的年级调用init3()函数初始化三年级题目和答案
- 主函数里根据对应的年级调用init1_2()函数初始化1、2年级题目和答案
- 主函数里调用OutPutFile()函数将题目和答案输出到out.txt文件中
check()函数用来排除输入参数的各种问题,函数流程如下:
- 判断输入的参数的长度(只能为4)
- 判断是否用-n 和-grade作为标识符
- 取出参数的前导0(类似0000001的情况)
- 检查参数题目数量必须都是数字
- 检测年级参数是否是1-3
- 判断题目的数量是否为正整数
init3()函数用来生成题目和答案,函数流程如下:
- 生成3个可变字符串
- 随机生成2-4个运算符(必须有2个不同)
- for循环生成题目
- 随机在+、-运算符左右边的数字分别生成2个括号
- 将随机生成的题目丢用逆波兰表达式算出答案并保存
- 将题目和答案拼接成字符串
init1_2()函数用来生成题目和答案,函数流程如下:
-直接引用1.2年级的题目生成器CalPoland()函数
- 实现逆波兰表达式
ShuntYardAlgo()函数
- 实现调度场算法
OutPutFile()函数
- 将题目和答案输出到out.txt文件
函数流程图:
算法的关键:
- 判断输入的参数是否合法,对于不合法的各种情况需给予提示
- 生成带括号的四则运算的题目是否满足教学大纲的要求
2. 实现方案
写出具体实现的步骤
- 准备工作:
- 先在Github上Fork厂库,并克隆到本地
- 编写MathExam.java
- 在三年级题目的基础上改进逻辑并增加1.2年级出题功能
- 重构代码,并增加注释
- 代码测试
- 技术关键点:
- 生成带括号的四则运算
- 拼接可变字符串
- 按需求产生随机数
- 按需求产生随机运算符和括号
- 输入参数的各种判断
- 逆波兰表达式
- 调度场算法
- 文件io流
四、编码
编码过程:
main函数:
- 调用check()函数判断输入参数是否有异常
- 没有异常的情况下判断年级
- 如果是1.2年级就将4个当前输入的参数,删除2个标识符其余封装在一个数组中传给init1_2()函数中进行1.2年级题目初始化.并调用outPutFile()函数输出out.txt文件。
- 如果是3年级就直接调用init3()函数中进行3年级题目初始化.并调用outPutFile()函数输出out.txt文件。
init3()函数:
- 创建1个可变字符串str1用于拼接答案
- 创建1个for循环
- 循环内生成2个随机数
- 用str拼接题目
- 用条件判断语句判断当前的运算符并算出答案
- str1拼接答案
- str1拼接到str尾部
init1_2()函数:
- 和作业1的init()函数功能相同
遇到的问题:
- 带括号的四则运算如何生成
查阅别人的博客并没有找到带括号的四则运算。然后我就先试着生成随机的没有括号的四则运算,完成任务后我再考虑如何加上括号,设计了好久终于加了一些if判断并且生成了带括号的四则运算了。
- 如何算出题目的答案
1. 调试日志
- ShuntYardAlgo()函数,字符串传入报数组跃界,字符串转字符传入不会报错。
解决:这是我本次开发浪费最多时间调试的bug。原因知道后其实很简单,字符串转字符我没用str.toCharrArrays()这个方法,而是自己开辟一个char[100],默认舒适化是0。当遍历字符串末尾的时候自然就跃界报错了。
- 如何生成带括号的四则运算
解决:当时在这个地方也困扰了我很久,一步步的增加判断,随机安排括号,由于不好控制括号出现的位置我调试了很久才生成带括号的四则运算
2. 关键代码
public static StringBuffer init3(String[] args) throws Exception {
int m = 1;
int l = 1;
String str = null;
// 生成2个字符串用于拼接题目和答案
StringBuffer strbuf = new StringBuffer();
StringBuffer strbuf1 = new StringBuffer();
StringBuffer strbuf2 = new StringBuffer();
// random用于随机生成题目中的操作数
int random = 0;
// int flag=5;
// 将四种运算符放入数组
String[] strop = { "+", "-", "x", "÷" };
// 将随机生成的2-4个运算符存入ostr数组
String[] ostr = new String[4];
int w = Integer.valueOf(args[args[0].equals("-n") ? 1 : 3]);
for (int i = 0; i < w; i++) {
// 随机生成的2-3个运算符
int operator = (int) (Math.random() * 3) + 2;
int k = 0;
// 随机生成运算符号(至少有2种不同运算符号)
for (int j = 0; j < operator; j++) {
k = (int) (Math.random() * 4);
ostr[j] = strop[k];
if (operator == 2 && j == 1) {
// 控制在只有2个运算符的情况下2个运算符号一定不同
while (ostr[0] == ostr[1]) {
k = (int) (Math.random() * 4);
ostr[0] = strop[k];
}
}
}
int flag1 = 1;
int flag = 1;
for (int j = 0; j < operator + 1; j++) {
if (operator == 4)
// 如果运算符有+-就自动生成括号运算符
if (j < operator && (ostr[j].equals("+") || ostr[j].equals("-")) && flag == 1) {
strbuf.append("( ");
flag = 0;// 判断是否加了左括号0代表已近加了
flag1 = 0;// 判断是否可以加右括号了
}
random = (int) (Math.random() * 101);
if (j == operator) {
// 最后一个随机数的末尾不加空格
if (flag == 0 && flag1 == 1) {
strbuf.append(random + " )");
flag1 = 0;
flag = 100;
} else {
strbuf.append(random);
if (flag == 0) {
// 在最后一个数后面加上右括号
flag1 = 1;
}
}
} else {
if (flag == 0 && flag1 == 1) {
strbuf.append(random + " )" + " ");
flag1 = 0;
flag = 100;
} else {
strbuf.append(random + " ");
if (flag == 0) {
// 在下一次循环当中可以加入右括号
flag1 = 1;
}
}
}
if (j < operator)
strbuf.append(ostr[j] + " ");
}
l = 1;
// 重新初始化数组
ostr = new String[4];
//
MathExam mathExam = new MathExam();
mathExam.Init();
str = strbuf.toString();
char[] charArray = str.toCharArray();
double shuntYardAlgo = mathExam.ShuntYardAlgo(charArray);
String vf = String.valueOf(shuntYardAlgo);
boolean matches = vf.matches("\\d+.[0]?");
if (matches) {
// strbuf2用于拼接题目
strbuf2.append("(" + m + ")" + " " + strbuf + "\r\n");
// strbuf1用于拼接答案
strbuf1.append("(" + m + ")" + " " + strbuf + " " + "=" + " " + (int) shuntYardAlgo + "\r\n");
m++;
l = 0;
}
strbuf = new StringBuffer();
if (l != 0)
i--;
}
strbuf2.append("\r\n");
strbuf2.append(strbuf1);
return strbuf2;
}
3. 代码规范
请给出本次实验使用的代码规范:
- 第一条代码中的命名均不以下划线或美元符号开始,也不一下划线或美元符号结束。
- 第二条代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
- 第三条类名使用UpperCamelCase风格,但是以下情形例外:DO / DTO / VO / AO / PO 等。
- 第四条方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵循驼峰形式。
- 第五条变量和常量的命名方式:非公有(private/protected/default)变量前面要加上小写m;
- 第六条类型与中括号紧挨相连来定义数组。正例:定义整形数组 int[] arrayDemo;并人工检查代码是否符合规范
- 第七条杜绝完全不规范的缩写,避免忘文不知义。反例:AbstractClass“缩写”命名成AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。
- 第八条为了达到代码自己自解释的目标,任何自定义编程元素在命名时,使用精良完整的单词组合来表达其意。但是有些名称实在过于长,这个可以适当的缩写,不要忘文不知义就可以。这个不是客观的规定。
- 第九条不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
- 第十条大括号的使用约定。如果是大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代码块则:
- 左大括号前不换行。
- 左大括号后换行。
- 右大括号前换行。
- 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
五、测试
测试 | 预期结果 | 实际结果 |
---|---|---|
不输入参数 | -grade和-n标识符错误!! | -grade和-n标识符错误!! |
只输入一个参数:100 | -grade和-n标识符错误!! | -grade和-n标识符错误!! |
-n 10 -grade 1 | 题目已经生成,详情请见out.txt | 题目已经生成,详情请见out.txt |
-n 10.5 -grade 1 | 请输入正整数 | 请输入正整数 |
-n ascc -grade 2 | 请输入正整数 | 请输入正整数 |
-n 10 -grade vsdv | 年级参数错误,只能在[1~3]以内 | 年级参数错误,只能在[1~3]以内 |
-n 00001 -grade 3 | 题目已经生成,详情请见out.txt | 题目已经生成,详情请见out.txt |
-n 1000 -grade 2.3 | 年级参数错误,只能在[1~3]以内 | 年级参数错误,只能在[1~3]以内 |
-n 10 -grade 002 | 题目已经生成,详情请见out.txt | 题目已经生成,详情请见out.txt |
-n 10000 -grade 3 | 题目已经生成,详情请见out.txt | 题目已经生成,详情请见out.txt |
-n -1 -grade 3 | 请输入正整数 | 请输入正整数 |
1000 -n -grade 2 | -grade和-n标识符错误!! | -grade和-n标识符错误!! |
-n 10 -grade -3 | 年级参数错误,只能在[1~3]以内 | 年级参数错误,只能在[1~3]以内 |
-n 1000 2 -grade | -grade和-n标识符错误! | -grade和-n标识符错误! |
-grade 2 -n 1000 | 题目已经生成,详情请见out.txt | 题目已经生成,详情请见out.txt |
-grade 0.1 -n 800 | 年级参数错误,只能在[1~3]以内 | 年级参数错误,只能在[1~3]以内 |
-grade a1 -n 10 | 年级参数错误,只能在[1~3]以内 | 年级参数错误,只能在[1~3]以内 |
-grade 001 -n 20 | 题目已经生成,详情请见out.txt | 题目已经生成,详情请见out.txt |
-grade 1 -n 0000000002 | 题目已经生成,详情请见out.txt | 题目已经生成,详情请见out.txt |
-grade 0.1 -n 0.1 | 请输入正整数 | 请输入正整数 |
-n a1 -grade a1 | 请输入正整数 | 请输入正整数 |
六、总结
做这个前首先要做好前期的准备,知道小学生都需要什么样的题目,再继续想好加减乘除每一个的简单算法
这次作业的收获是我弄懂逆波兰函数和调度法
拿到项目前一定要先分析需求,构思大致方向
再说说对结对编程的看法吧!在从最初的构思阶段到最后的编写代码测试代码结束,都需要两个人不断的配合,不断的去交流两个人的想法,然后通过想法的整合,调整出一段更为优质的代码。
团队协作,可以提高写代码质量和效率。写代码过程也是一种基础的累积,对于不会的东西就去搜素学习,把知识基础变为自己的。两个人互帮互助,实现“1+1”能够大于2的成果。
MathExamLv2——周世元211606348,许燕婷211606338的更多相关文章
- 组队打代码 !!! ——Alpha项目冲刺
Alpha阶段 - 博客链接合集 队伍名称: 代码那些事儿 学号 姓名 211606320 刘佳 211606313 李佳 211606303 陈水莲 211606302 曾丽丽 211606338 ...
- 第七次Scrum冲刺
第七次Scrum冲刺 1.今日完成的任务 队员 今日完成任务 刘佳 前端与后端对接 李佳 后端与数据库对接 周世元 数据库与后端对接 杨小妮 博客编写 许燕婷 管理团队当日及次日任务 陈水莲 综合测试 ...
- 第五次Scrum冲刺
第五次Scrum冲刺 1.成员今日完成情况 队员 今日完成任务 刘佳 前端初步构建 李佳 后端设计初级阶段 周世元 数据设计 杨小妮 博客编写 许燕婷 管理团队当日及次日任务 陈水莲 测试矩阵用例设计 ...
- 第六次Scrum冲刺
第六次Scrum冲刺 1.成员今日完成情况 队员 今日完成任务 刘佳 前端构建 李佳 后端设计 周世元 数据设计 杨小妮 博客编写 许燕婷 管理团队当日及次日任务 陈水莲 性能测试用例设计 曾丽丽 性 ...
- 王燕 201771010126《面向对象程序设计(java)》第一周学习总结
王燕 201771010126<面向对象程序设计(java)>第一周学习总结 王燕 201771010126<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部 ...
- 3000本IT书籍下载地址
http://www.shouce.ren/post/d/id/112300 黑客攻防实战入门与提高.pdfhttp://www.shouce.ren/post/d/id/112299 黑 ...
- 第一次Scrum冲刺(云医院)
一.小组第一次冲刺任务 1.小故事 小故事1 有一天,A牙齿突然开始痛,想着去医院看看,但是去了医院发现排队挂号的人很多,不知道什么时候才能轮到B.于是A想着能不能提前预约,免去排队的时间.正好云医院 ...
- Beta博客总结
描述项目预期计划和现实进展 冲刺 时间 预期任务以及预估时间 现实完成情况以及实际用时 冲刺1 12.4 修改等级答题界面:30,修改获取用户信息接口:30 修改等级答题界面:60,修改获取用户信息接 ...
- 【Alpha】Scrum Meeting 5-end
第一天:2019/6/19 前言: 第5次会议在6月19日由PM在教9C-501召开. 总结项目,进行单元测试并进行简单的整合.时长60min. 团队GitHub仓库 仓库连接 1.1 今日完成任务情 ...
随机推荐
- 如何在JavaScript中手动创建类数组对象
前言 关于什么是js的类数组对象这里不再赘述.可以参考这个链接,还有这里. js中类数组对象很多,概念简单的讲就是看上去像数组,又不是数组,可以使用数字下标方式访问又没有数组方法. 例: argume ...
- mongdb分布式
搭建高可用mongodb集群(一)——配置mongodb Posted on 17 十一月, 2013 by lanceyan | 21 Replies 在大数据的时代,传统的关系型数据库要能更高的服 ...
- 如何在idea中使用Mybatis-generator插件快速生成代码
传送门 使用这个插件可以快速生成一些代码,包含 实体类/Mapper接口/*Mapper.xml文件 首先,我们需要搭建一个Maven的项目. 在pom.xml中添加代码 <plugins> ...
- MyBatis_Study_003(字段名与属性名称不一致,resultMap)
源码:https://github.com/carryLess/mbtsstd-003 1.主配置文件 <?xml version="1.0" encoding=" ...
- 设置Nginx日志
在nginx.conf文件或vhosts/*.conf文件中的access_log日志中指定级别为main. http { include mime.types; default_type appli ...
- appium使用
学过selenium的朋友再来看appium,基本上就是一个环境折腾问题,还有一个就是初始化Driver的问题,以下代码是初始化Driver WebDriver driver = null; // 驱 ...
- strapi 开源api && 内容管理平台试用
strapi 是一个开源的api && 内容管理平台,功能操作起来还是比较方便简单的. 安装 使用docker && docker-compose 代码clone gi ...
- MSMQ向远程服务器发送消息----错误总结
一:路径错误(Path)错误 如果向远程服务器发送消息,请使用格式名的形式,如: FormatName:Direct=TCP:121.0.0.1\\private$\\queueFormatName: ...
- Firefox渗透插件—Web渗透必备工具
1:Firebug Firefox的 五星级强力推荐插件之一,不许要多解释 2:User Agent Switcher 改变客户端的User Agent的一款插件 3:Hackbar 攻城师们的必备工 ...
- docker挂载本地目录和数据卷容器
1.docker挂载本地目录 docker可以支持把一个宿主机上的目录挂载到镜像里. 交互模式运行docker run -it -v /home/dock/Downloads:/usr/Downloa ...