【SE】Week1 : 四则运算题目生成器批改器程序总结
用户需求详见:http://www.cnblogs.com/jiel/p/4810756.html
1)PSP表格分析(预计耗时):
|
PSP2.1 |
Personal Software Process Stages |
Time |
|
Planning |
计划 |
|
|
· Estimate |
· 估计这个任务需要多少时间 |
0.5h |
|
Development |
开发 |
|
|
· Analysis |
· 需求分析 (包括学习新技术) |
1h |
|
· Design Spec |
· 生成设计文档 |
0.5h |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
0h |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
0h |
|
· Design |
· 具体设计 |
1.5h |
|
· Coding |
· 具体编码 |
8h |
|
· Code Review |
· 代码复审 |
2h |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
6h |
|
Reporting |
报告 |
|
|
· Test Report |
· 测试报告 |
0.5h |
|
· Size Measurement |
· 计算工作量 |
0.5h |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
0.5h |
|
合计 |
22h |
2)PSP表格分析(实际耗时):
|
PSP2.1 |
Personal Software Process Stages |
Time |
|
Planning |
计划 |
|
|
· Estimate |
· 估计这个任务需要多少时间 |
0.5h |
|
Development |
开发 |
|
|
· Analysis |
· 需求分析 (包括学习新技术) |
0.5h |
|
· Design Spec |
· 生成设计文档 |
0.5h |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
0h |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
0h |
|
· Design |
· 具体设计 |
1h |
|
· Coding |
· 具体编码 |
10h |
|
· Code Review |
· 代码复审 |
2h |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
7h |
|
Reporting |
报告 |
|
|
· Test Report |
· 测试报告 |
0.5h |
|
· Size Measurement |
· 计算工作量 |
0.5h |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
0.5h |
|
合计 |
23h |
3)记录你在改进程序性能上花费了多少时间,描述你改进的思路,并展示一张性能分析的图(由VS2012的性能分析工具自动生成)。如果可能,展示你程序中消耗最大的函数。
在改进程序性能方面花费的时间包括:最初的算法设计 + coding过程中对想法的qualification + 最后测试过程中的修改 = 0.5h + 6h + 3h = 9.5h
改进的过程中,花了较多的时间用来修改最初设计的算法:
采用多步式的结构来存储表达式,取代一般存储整个表达式的做法。
这样的优点是能更清晰地获得表达式的整体结构和关系信息,比存储整个字符串再做后续分析要简单。
尤其考虑到需要进行重复性检验,如果将表达式存为字符串将难以判定;相反,按运算步骤存储后,只需比较每步的两个运算元是否构成重复即可。
在重复性检验环节,优化的一点是存储了两个表达式重复关系的表格,使得后续判断可以不用重复计算。
【性能分析图】

由上可知,最耗时的部分为重复性检验,其代码为:
private static bool isReplicate(int i)
{
for (int k = ; k < i; k++)
if (es[i].isReplicate(es[k]))
return true;
return false;
} public bool isReplicate(Expression e)
{
if (e.numOfOp != this.numOfOp) return false;
if (!e.res[numOfOp - ].equalTo(res[numOfOp - ])) return false;
int[] map = new int[numOfOp]; for (int i = ; i < numOfOp; i++) {
bool flag = false;
for (int j = ; j < numOfOp; j++)
if (isomorphic(items[i, ], items[i, ], (char)items[i, ],
e.items[j, ], e.items[j, ], (char)e.items[j, ], map)) {
flag = true;
map[i] = j + ;
}
if (!flag) return false;
}
return true;
} private static bool isomorphic(Object t11, Object t12, char op1,
Object t21, Object t22, char op2, int[] map)
{
if (op1 != op2) return false;
if (op1 == '-' || op1 == '/') {
if (!(t11.GetType().Name.Equals(t21.GetType().Name) &&
t12.GetType().Name.Equals(t22.GetType().Name)))
return false;
if (t11 is Fraction && !((Fraction)t11).equalTo((Fraction)t21))
return false;
if (t12 is Fraction && !((Fraction)t12).equalTo((Fraction)t22))
return false;
if (t11 is Notation && map[((Notation)t11).getNot() - ] != ((Notation)t21).getNot())
return false;
if (t12 is Notation && map[((Notation)t12).getNot() - ] != ((Notation)t22).getNot())
return false;
return true;
} bool flag = true;
if (!(t11.GetType().Name.Equals(t21.GetType().Name) &&
t12.GetType().Name.Equals(t22.GetType().Name)))
flag = false;
else {
if (t11 is Fraction && !((Fraction)t11).equalTo((Fraction)t21))
flag = false;
if (t12 is Fraction && !((Fraction)t12).equalTo((Fraction)t22))
flag = false;
if (t11 is Notation && map[((Notation)t11).getNot() - ] != ((Notation)t21).getNot())
flag = false;
if (t12 is Notation && map[((Notation)t12).getNot() - ] != ((Notation)t22).getNot())
flag = false;
}
if (flag) return true; if (!(t11.GetType().Name.Equals(t22.GetType().Name) &&
t12.GetType().Name.Equals(t21.GetType().Name)))
return false;
if (t11 is Fraction && !((Fraction)t11).equalTo((Fraction)t22))
return false;
if (t12 is Fraction && !((Fraction)t12).equalTo((Fraction)t21))
return false;
if (t11 is Notation && map[((Notation)t11).getNot() - ] != ((Notation)t22).getNot())
return false;
if (t12 is Notation && map[((Notation)t12).getNot() - ] != ((Notation)t21).getNot())
return false;
return true;
}
4)共享你对程序进行测试的至少10个测试用例,以及说明为什么你能确定你的程序是正确的。(不正确的程序得0分,不管性能如何)
在测试环节,我用的方法简单但有效,
对功能一:题目生成 进行测试时,生成了60000+个,bound = 3(即所有数字必须小于3)的表达式,具体内容在工程文件中,在此由于篇幅限制只共享几个:
1. 0 × 2'1/2 =
2. 1/2 ÷ 2 =
3. 1'1/2 + 0 =
4. 1 ÷ 1/2 =
5. 1'1/2 ÷ 1'1/2 × 1'1/2 =
6. 2 ÷ (1'1/2 × (1 + 2'1/2)) =
7. 2'1/2 + 1 + 2'1/2 =
8. 2 ÷ (1/2 × (1'1/2 ÷ 2'1/2)) =
9. 2'1/2 ÷ 2 =
10. 1 + 2'1/2 =
11. 1'1/2 - (2'1/2 - 2) =
12. 1 + 0 =
13. 2 × 0 =
14. 1/2 ÷ (1/2 + 1) =
15. 2'1/2 - (1/2 + 1/2) =
16. 1'1/2 + 1/2 =
17. 1'1/2 × 2 + (2 - 2) =
18. 1 ÷ 2 =
19. 2 × 2'1/2 =
20. 0 ÷ ((1/2 - 0) × 1) =
21. 0 × (0 ÷ 1) =
22. 1 + (2'1/2 + 1/2) =
23. 2'1/2 × (2 × 2'1/2) =
24. 1 × 1/2 =
25. 2'1/2 - (1/2 × (1/2 + 2'1/2)) =
26. 1'1/2 ÷ 1 × 1/2 ÷ 1'1/2 =
27. 1'1/2 - 0 =
28. (2 + 1'1/2) × (2'1/2 × 2'1/2) =
29. 1'1/2 + 1'1/2 =
30. 1 × 1/2 ÷ 2'1/2 =
31. 2 ÷ (1'1/2 × 1 + 1/2) =
32. 1 ÷ (1/2 × (1'1/2 - 1)) =
33. (2 × 0 - 0) ÷ 1 =
34. 2 + 1 =
35. 2 ÷ (1 × 2'1/2) =
36. 1 ÷ (2'1/2 × 1) =
37. 1/2 + 2'1/2 + (1/2 + 0) =
38. 1/2 × (0 - 0) =
39. 1/2 ÷ 1 ÷ (2'1/2 + 1'1/2) =
40. 1'1/2 + (2 × 0) =
41. 1 + (2 ÷ (2 ÷ 2'1/2)) =
42. 2'1/2 ÷ 1 =
43. 2'1/2 × 2'1/2 =
44. 1/2 ÷ (2 + 1'1/2) =
45. 0 ÷ 1'1/2 =
46. 2'1/2 × 1/2 =
47. 1 × (2'1/2 × 1'1/2) =
48. 1 + (1'1/2 × 0) =
49. 1 + 1/2 - 1/2 =
50. 2 + 2 =
在对功能二:评分系统 的测试中,我利用了功能一生成的10000个测试样例作为题目,结合程序生成的结果,将其直接作为答案,输入程序。
最终得到的结果是Correct: 10000 Wrong: 0(和输入表达式数目一致)。


5)说明你在个人项目中学到了什么。
在此次的个人项目中,学到的最大一点即对项目的规划和设计远比实际写代码要重要。没有一个清晰,细化到每一个流程的设计会大大增加工程的完成时间。在此次的项目中,由于在设计环节仅仅是提出了分步存储的这么一个概念,但对实际实现并没有进行较好的规划,导致在真正开始写代码时走了不少弯路,代码耗时比预期要长,并且后期的优化问题也不断,大大降低了效率。
综合这次实践,在下次的工程中,需要对所做的东西有个清晰细致的规划,不能只停留在概念层面。
【SE】Week1 : 四则运算题目生成器批改器程序总结的更多相关文章
- myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)
1.Github项目地址 https://github.com/baiyexing/myapp.git 2.功能要求 题目:实现一个自动生成小学四则运算题目的命令行程序 功能(已全部实现) 使用 -n ...
- 实现一个自动生成小学四则运算题目的命令行程序(java实现)
Github项目地址:https://github.com/xiaobaot/wordcount/tree/master/sizeyusuan 团队成员:谢家明(代码生成) 谢竣(测试完善) 项 ...
- 结对编程(四则运算题目生成器core第七组)对接心得
在这篇博客博主想记录一下此次结队编程作业中与ui组对接的心得.在这里我也想表达一下对涂涵越同学的敬佩,他遇到困难时孜孜不倦求解的毅力着实让我佩服,我们在dll的生成上遇到了很大的困难,要不是他的坚持我 ...
- 结对项目:四则运算题目生成器(C)
一.Github项目地址:https://github.com/Spartaright/myapp(合作人:梁天龙.赖佑铭) 二.PSP表格(如下图) 1.项目地址 PSP表格 PSP2.1 Pers ...
- 结对编程1 —— 基于GUI和Swing的四则运算题目生成器
合作伙伴 201421123102 王艳秋 201421123106 陈 雄 代码地址 题目描述 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI( ...
- 结对编程1--基于GUI的四则运算题目生成器
最终项目详细代码(coding地址)/李志强的博客/我的详细代码/方言的博客 一.需求分析 1.实现之前项目的功能,如:除了整数之外,还要支持真分数的四则运算,真分数的运算,并且要求能处理用户的输入, ...
- 结对编程1---基于Flask的四则运算题目生成器
项目代码地址 / WEB应用地址 / 合作伙伴iFurySt博文链接 需求分析 本次程序是基于原有的控制台四则运算器的基础上,改成WEB的形式,同时还增加了一些新的功能.同时因为交互方式的改变,代码也 ...
- 结对项目:四则运算题目生成器(Java)
目录 一.需求分析 二.开发计划 三.实现方案 3.1 项目结构 3.2 代码说明 3.2.1 出题功能代码 3.2.3 批卷功能代码 3.2.3 四则运算功能代码 四.效能分析 4.1 程序效能 4 ...
- 结对项目 实现自动生成四则运算题目的程序 (C++)
本次作业由 陈余 与 郭奕材 结对完成 零.github地址: https://github.com/King-Authur/-Automatically-generate-four-arithmet ...
随机推荐
- 【adb命令】在cmd窗口中使用adb install命令安装 中文名字apk报错的解决办法
1.在cmd窗口中使用adb install命令安装中文名字apk报错,安装英文名字apk就正常,详细报错如下图: 2.查看adb版本号:adb version 3.怀疑是adb版本的原因,尝试换个最 ...
- Linux命令一览
Linux系统中的命令参数有长短格式之分,长格式和长格式之间不能合并,长格式和短格式之间也不能合并,但短格式和短格式之间是可以合并的,合并后仅保留一个-(减号)即可. echo命令:用于在终端输出字符 ...
- BZOJ3996:[TJOI2015]线性代数(最大权闭合子图)
Description 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D Input 第一行输入一个整数N,接 ...
- linux 的常用命令---------第九阶段
Centos 7 系统启动及相关配置文件(面试题) 1. BIOS 初始化,开始post开机自检(主要检查磁盘.cpu.内存) 2. 加载 MBR 到内存 3. GRUB 阶段(可不说) 4. 加载内 ...
- OpenCV——Harris、Shi Tomas、自定义、亚像素角点检测
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...
- 【转】阿里云Ubuntu系统搭建SVN服务器
##SVN服务器相关软件安装 1.使用SSH远程服务器 (1)对于MAC OS/Liunx的用户直接打开终端输入 ssh 用户名@实例名,例如 ssh root@192.168.1.100 执行上面 ...
- PAT B1006 换个格式输出整数 (15 分)
让我们用字母 B 来表示“百”.字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<),换个格式来输出任一个不超过 3 位的正整数.例如 234 应该被输出为 BBSSS123 ...
- [笔记] ubuntu下添加windows的字体
方法如下: 第一步:将windows下喜欢的字体文件copy到一个文件夹中,例如将XP里WINDOWS/FONTS中的字体文件(本人比较贪心,把整个文件夹copy了过来……),在linux中命名为xp ...
- 【css】文本超出行数以省略号显示
//超出2行省略overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webk ...
- 百度谷歌雅虎三大搜索引擎比较和如何配置谷歌访问助手访问Google搜索服务
引言: 由于近期网上盛传”百度搜索引擎已死“的消息,引发个人对于搜索引擎的思考.百度作为最大的中文搜索引擎,确实有着很大声誉,再加上本地化的优势,正成为国人们的首选,但是作为一名技术开发人员,使用搜索 ...