结对编程

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的更多相关文章

  1. 组队打代码 !!! ——Alpha项目冲刺

    Alpha阶段 - 博客链接合集 队伍名称: 代码那些事儿 学号 姓名 211606320 刘佳 211606313 李佳 211606303 陈水莲 211606302 曾丽丽 211606338 ...

  2. 第七次Scrum冲刺

    第七次Scrum冲刺 1.今日完成的任务 队员 今日完成任务 刘佳 前端与后端对接 李佳 后端与数据库对接 周世元 数据库与后端对接 杨小妮 博客编写 许燕婷 管理团队当日及次日任务 陈水莲 综合测试 ...

  3. 第五次Scrum冲刺

    第五次Scrum冲刺 1.成员今日完成情况 队员 今日完成任务 刘佳 前端初步构建 李佳 后端设计初级阶段 周世元 数据设计 杨小妮 博客编写 许燕婷 管理团队当日及次日任务 陈水莲 测试矩阵用例设计 ...

  4. 第六次Scrum冲刺

    第六次Scrum冲刺 1.成员今日完成情况 队员 今日完成任务 刘佳 前端构建 李佳 后端设计 周世元 数据设计 杨小妮 博客编写 许燕婷 管理团队当日及次日任务 陈水莲 性能测试用例设计 曾丽丽 性 ...

  5. 王燕 201771010126《面向对象程序设计(java)》第一周学习总结

    王燕 201771010126<面向对象程序设计(java)>第一周学习总结 王燕 201771010126<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部 ...

  6. 3000本IT书籍下载地址

    http://www.shouce.ren/post/d/id/112300    黑客攻防实战入门与提高.pdfhttp://www.shouce.ren/post/d/id/112299    黑 ...

  7. 第一次Scrum冲刺(云医院)

    一.小组第一次冲刺任务 1.小故事 小故事1 有一天,A牙齿突然开始痛,想着去医院看看,但是去了医院发现排队挂号的人很多,不知道什么时候才能轮到B.于是A想着能不能提前预约,免去排队的时间.正好云医院 ...

  8. Beta博客总结

    描述项目预期计划和现实进展 冲刺 时间 预期任务以及预估时间 现实完成情况以及实际用时 冲刺1 12.4 修改等级答题界面:30,修改获取用户信息接口:30 修改等级答题界面:60,修改获取用户信息接 ...

  9. 【Alpha】Scrum Meeting 5-end

    第一天:2019/6/19 前言: 第5次会议在6月19日由PM在教9C-501召开. 总结项目,进行单元测试并进行简单的整合.时长60min. 团队GitHub仓库 仓库连接 1.1 今日完成任务情 ...

随机推荐

  1. POJ 3414 Pots 暴力,bfs 难度:1

    http://poj.org/problem?id=3414 记录瓶子状态,广度优先搜索即可 #include <cstdio> #include <cstring> #inc ...

  2. plsql的快速生成sql语句设置

    单 单击tool(工具)->的preferences(首选项)  ,进入到首选项页面 在点击user interface 的editor下的autoreplace 的edit按钮        ...

  3. New Concept English Two 16 40

    Keynote Speech  are useful. $课文38  唯独没有考虑到天气 388. My old friend, Harrison, had lived in the Mediterr ...

  4. Hadoop/Spark入门学习笔记(完结)

    Hadoop基础及演练 ---第1章 初识大数据 大数据是一个概念也是一门技术,是在以Hadoop为代表的大数据平台框架上进行各种数据分析的技术. ---第2章 Hadoop核心HDFS Hadoop ...

  5. mysql配置调优-开启慢查询日志-slow_query_log

    工作中,会遇到需要查看mysql的top 20 慢sql,逐个进行优化,加上必要的索引这种需求,这时就需要开启数据库的慢查询日志的功能 1.查询当前慢查询日志的状态 # 默认为关闭状态 mysql - ...

  6. C程序设计-----第2次作业

    作业要求一 (15分) 完成下列编程题目,每次上完课都会增加2-3道题目,并将编程过程记录在博客里,一次PTA作业任选一道题目给出设计思路.流程图.源代码和错误记录,其他题目可只给出设计思路.源代码和 ...

  7. test20181020 B君的第二题

    题意 分析 考场70分 一看就是裸的kmp,直接打上去. #include<cstdlib> #include<cstdio> #include<cmath> #i ...

  8. python中django框架的csrf验证

    在form表单以post的方式提交时,django默认会带一个验证的机制csrf验证 <form action="/day02/login/" method="po ...

  9. 修改panabit web管理介面端口

    panabit使用mini_httpd为web发布平台,版本为1.19.使用https协议发布,端口443,运行命令为/usr/panabit/bin/ipe_httpd. panabit启动时使用/ ...

  10. emacs之配置yasnippet

    ~/emacsConfig/auto-complete-yasnippet-setting.el (require 'yasnippet) (setq ac-sources (append '(ac- ...