结对项目-小学生四则运算系统(GUI)
Coding克隆地址:https://git.coding.net/FrrLolix/CalGUI.git
伙伴博客:http://www.cnblogs.com/wangyy39/p/8763244.html
目录:
一、前言
二、计划时间——PSP
三、接口设计
四、接口实现
五、性能分析
六、单元测试
七、异常处理
八、模块设计
九、模块对接
十、她
十一、结对编程思考
十二、实际时间——PSP
十三、关于柱状图的实现
一、前言
首先我很感谢我的队友——王玥莹,谢谢她的努力,放弃自己休息的时间。
二、PSP
|
PSP |
任务内容 |
计划时间(min) |
|
Planning |
计划 |
30 |
|
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
30 |
|
Development |
开发 |
35*60+25 |
|
Analysis |
需求分析 |
60 |
|
Design Spec |
生成文档 |
0 |
|
Design Review |
设计复审 |
2*60 |
|
Coding Standard |
代码规范 |
10 |
|
Design |
具体设计 |
12*60 |
|
Coding |
具体编码 |
2*8*60 |
|
Code Review |
代码复审 |
4*60 |
|
Test |
测试 |
15 |
|
Reporting |
报告 |
5.5*60 |
|
Test Report |
测试报告 |
60 |
|
Size Measurement |
计算工作量 |
30 |
|
Postmortem& ProcessImprovement Plan |
事后总结, 并提出过程改进计划 |
4*60 |
三、接口设计
信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。
在结对项目中,使用命令行模式执行和使用GUI界面执行出题部分时调用了同一部分核心代码,在这里我将出题这一部分信息隐藏,当改变人机交互模式的时候就不会给系统带来全局性的影响。在我的程序中避免了A类调用B类的程序,B类有调用A类的程序这种情况,这也是所谓的“循环依赖”,这种情况会阻碍信息隐藏。
接口设计(Interface Design)
在本项目设计接口过程中,使用有意义的命名方式使接口的功能一目了然,增强了可读性;类名和方法名也都使用了有意义的命名方式;在开发过程中加好了注释,方便自己和他人看懂代码;在接口设计过程中对相关原则也有了一些体会,主要参考以下内容:
https://blog.csdn.net/blueangle17/article/details/55049858
https://jingyan.baidu.com/article/066074d626ea09c3c21cb0b9.html
四、接口实现

我们用到了按钮监听器和复选框监听器以及文件监听器,对于时间计算方面我们选择的是比较简单但是简陋的计时器。
五、性能分析
讲真,这个项目对于我们来说,能完成已经是竭尽全力,在优化性能时尽管有些抵触,但也算尽力,尽量减少内存占用率,减少嵌套循环和数组过大带来的资源浪费。在生成计算式时,不符合要求的计算式需要舍弃,在数值较大时,十分容易造成资源的浪费,因此我们在数值较大时,尽量限制了乘法时数的大小,尽量避免连续多次弃用。



六、单元测试
测试Command类
设计思路:
在main方法中实现了对输入参数的解析和对输入参数异常的报错,所以测试这个部分的函数最主要的就是构造不同的异常情况,同时也不要忘记测试参数正确时的情况,因为这也是代码的一部分(单元测试中第一次就是因此覆盖率较低)。
单元测试代码展示(测试Command.java):
import static org.junit.Assert.*; import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test; public class CommandTest { @BeforeClass
public static void setUpBeforeClass() throws Exception {
} @AfterClass
public static void tearDownAfterClass() throws Exception {
} @Before
public void setUp() throws Exception {
} @After
public void tearDown() throws Exception {
} @Test
public void testNewExpSome() {
for(int i=0;i<6;i++){
Command.expression(false, 200, 20, 6);
}
for(int i=0;i<24;i++){
Command.expression1(true, 200, 20, 4);
Command.exprission2(true, 200, 20, 4);
Command.expression3(true, 200, 20, 4);
} System.out.println("Command程序正常!");
} @Test
public void testDivideExactly() { } } CommandTest
七、异常处理:
if(radioButtonMenuItem01.isSelected()){flag='a';}
if(radioButtonMenuItem02.isSelected()){flag='b';}
if(radioButtonMenuItem03.isSelected()){flag='c';}
String n = JOptionPane.showInputDialog(
frame,
"输入题目的数量(1-1000):"
);
String m = JOptionPane.showInputDialog(
frame,
"输入数值范围(1-10000):"
);
String z = JOptionPane.showInputDialog(
frame,
"输入符号数量(1-10):"
);
if(n==null||n.equals("")&&m==null||m.equals("")&&z==null||z.equals("")){
textArea.append("取消生成,请检查数值\n");
}
if(arithExpress.isEmpty()){
JOptionPane.showMessageDialog(
frame,
"没有读取到默认题库,请先生成或者打开本地题库",
"消息标题",
JOptionPane.WARNING_MESSAGE
);

八、模块设计

导航页和获得出题参数页使用了同种方式来生成用户界面,代表导航页和出题参数页的类继承了JFrame类,在内部类中加入页面需要的各种组件,并将这个内部类的对象加入到外部类的实例中,在这里以导航页的代码为例展示这种方式(因代码太长所以只展示一部分):
CalFrame frame=new CalFrame();
DoFile doFile=new DoFile();
StrPro strPro=new StrPro();
Expression expression=new Expression();
arithExpress=doFile.ReadFile("./result.txt");//默认从当前目录读取题库 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setTitle("小学四则运算测试"); JMenuBar menuBar = new JMenuBar(); JMenu sysMenu = new JMenu("系统");
JMenu chooseMenu = new JMenu("题型选择");
JMenu aboutMenu = new JMenu("关于"); menuBar.add(sysMenu);
menuBar.add(chooseMenu);
menuBar.add(aboutMenu); JPanel panel = new JPanel(new BorderLayout()); JPanel centerPanel = new JPanel(new BorderLayout());
panel.add(centerPanel,BorderLayout.CENTER); // 创建文本区域组件
JTextArea textArea = new JTextArea();
textArea.setLineWrap(true);
textArea.setFont(new Font(null, Font.PLAIN, 18));
JScrollPane scrollPane = new JScrollPane(
textArea,
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
); JPanel rightPanel = new JPanel();
rightPanel.setLayout(null); JLabel arithLabel=new JLabel("点击开始答题按钮,开始答题");
arithLabel.setBounds(30,80,250,50);
arithLabel.setFont(new Font(null, Font.PLAIN, 20));
JLabel helloLabel=new JLabel("请仔细查看算式后得出计算结果!");
helloLabel.setBounds(20,10,500,50);
helloLabel.setFont(new Font(null, Font.PLAIN, 20)); JTextField textField = new JTextField(8);
textField.setBounds(330, 80, 200, 40);
textField.setFont(new Font(null, Font.PLAIN, 20));
JButton btn = new JButton("确定");
btn.setFont(new Font(null, Font.PLAIN, 20));
btn.setBounds(340, 160, 180, 40); rightPanel.add(helloLabel);
rightPanel.add(arithLabel);
rightPanel.add(textField);
rightPanel.add(btn); JSplitPane splitPane = new JSplitPane();
splitPane.setLeftComponent(scrollPane);
splitPane.setRightComponent(rightPanel);
splitPane.setOneTouchExpandable(true);
splitPane.setContinuousLayout(true);
splitPane.setDividerLocation(300); centerPanel.add(splitPane,BorderLayout.CENTER);
九、模块对接
1、参数传递功能
String n = JOptionPane.showInputDialog(
frame,
"输入题目的数量(1-1000):"
);
String m = JOptionPane.showInputDialog(
frame,
"输入数值范围(1-10000):"
);
String z = JOptionPane.showInputDialog(
frame,
"输入符号数量(1-10):"
);
2、选择计算方式功能
switch(flag){
case 'a':
expression.generateExpressionA(Integer.parseInt(n),Integer.parseInt(m),Integer.parseInt(z));
break;
case 'b':
expression.generateExpressionB(Integer.parseInt(n),Integer.parseInt(m),Integer.parseInt(z));
break;
case 'c':
expression.generateExpressionC(Integer.parseInt(n),Integer.parseInt(m),Integer.parseInt(z));
break;
}
3、做题功能

public void actionPerformed(ActionEvent e) {
if(!doFlag){
JOptionPane.showMessageDialog(frame,"请点击开始答题按钮,进行测试!","消息标题",JOptionPane.WARNING_MESSAGE);
}
else{
textArea.append("上一题\n");
textArea.append("算式:"+strPro.StrSplitBefore(arithExpress.get(index))+"="+textField.getText()+"\n");
if(!textField.getText().equals("")||textField.getText()!=null){
ansHash.put(index, strPro.StrSplitAfter(arithExpress.get(index)));
resHash.put(index, textField.getText());
}
4、统计分析功能
使用了绘制柱状图工具类,从一篇博客中学习找到的灵感 链接:http://www.jb51.net/article/73346.htm

ChartPanel frame1;
static StrPro strPro=new StrPro();
static DoFile doFile=new DoFile();
public BarChart(){
CategoryDataset dataset = getDataSet();
JFreeChart chart
;
chart = ChartFactory.createBarChart3D(
"四则运算测试结果图表", // 图表标题
"测试轮/次", // 目录轴的显示标签
"题数", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
); //从这里开始
CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
CategoryAxis domainAxis=plot.getDomainAxis(); //水平底部列表
domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14)); //水平底部标题
domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //垂直标题
ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));
chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));
chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体 //到这里结束,虽然代码有点多,但只为一个目的,解决汉字乱码问题 frame1=new ChartPanel(chart,true); //这里也可以用chartFrame,可以直接生成一个独立的Frame
十、结对成员

1、我:优点:技术较强,善于思考 缺点:态度有时不够端正,不认真。
2、她:优点:认真,上进,积极活泼,又带动性。缺点:技术稍差。
十一、结对编程思考
结对编程有好处:
一、结对编程可以相互学习互相鼓励
二、分工明确,可以提高做事效率
三、增强两个人的关系,增强合作能力、增强代码理解能力。
四、在出现错误时,伙伴可以及时发现并且指出,少走弯路
结对编程有坏处:
一、需要大量的交流,如果交流沟通不到位,项目将寸步难行。
二、可能会出现思路的分歧,导致两人代码出现分歧,难以结合。
三、两人分工的不均匀,有可能出现技术强带技术弱做项目的情况。
十二、PSP
|
PSP |
任务内容 |
完成时间(min) |
|
Planning |
计划 |
60 |
|
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
60 |
|
Development |
开发 |
45*60 |
|
Analysis |
需求分析 |
45 |
|
Design Spec |
生成文档 |
0 |
|
Design Review |
设计复审 |
3*60 |
|
Coding Standard |
代码规范 |
15 |
|
Design |
具体设计 |
12*60 |
|
Coding |
具体编码 |
3*8*60 |
|
Code Review |
代码复审 |
4*60 |
|
Test |
测试 |
60 |
|
Reporting |
报告 |
9*60 |
|
Test Report |
测试报告 |
0 |
|
Size Measurement |
计算工作量 |
60 |
|
Postmortem& ProcessImprovement Plan |
事后总结, 并提出过程改进计划 |
8*60 |
十三、柱状图的实现
相关实现代码如图,主要借用了jfreechart的工具类,jfreechart是一个图标绘制类库,通过对jfreechart的引用,实现了项目中的柱状图。在下面的博客中具体的讲解了jfreechart的使用方法,包括了柱状图、饼图、折线图等。
相关参考博客:https://blog.csdn.net/pzhtpf/article/details/7600100/
参考博客:https://www.cnblogs.com/xdp-gacl/p/3633744.html(GUI的使用)
结对项目-小学生四则运算系统(GUI)的更多相关文章
- 第三周结对项目--小学生四则运算CAI软件汇报及总结(UI/web)
前言: 这周是和我队友苏卫喜一起结对开发,我主要是写项目文档需求分析,她是通过我的需求文档来进行做思维导图,之后我们通过思维导图一起讨论用户界面设计. 以下就是我的需求分析1.0版本 1. 软件名 ...
- 基于GUI的小学生四则运算系统
前言:首先在此感谢我的结对搭档,没有她的帮助和引导绝不会有现在的项目.很高兴和她一起结对完成这个项目.搭档真的是棒棒哒! 一.Coding.Net项目地址: https://git.coding.ne ...
- 第四周结对项目总结及改进(ui/web)
项目介绍 随着社会科技的进步和多媒体教育的日益发展,越来越来的学生正在接受着新时代下的教育模式,而且手机.电脑等科技产品的普及以及其带来的更高效更便捷的模式 使得它们成为当代学生学习中的一种很好的学习 ...
- 小学四则运算结对项目报告【GUI】
写在前面 这次的结对项目我做了很长时间,感触也很多.在这次项目中我使用了Java GUI作为和用户的交互方式,但是在上Java课的时候我对GUI和事件驱动这里并没有学的多好,可能是当时对编程还没有什么 ...
- 高级四则运算器—结对项目反思(193 & 105)
高级四则运算器—结对项目反思(193 & 105) 本周我和一位韩国同学(71061105)一起结对编程完成了我们的结对项目——高级的小学四则运算题目生成器. PSP表格 PSP2.1 P ...
- 高级四则运算器—结对项目总结(193 &105)
高级四则运算器—结对项目总结 为了将感想与项目经验体会分割一下,特在此新开一篇博文. 界面设计 啥都不说,先上图震慑一下... 上面的三个界面是我们本次结对项目的主界面,恩,我也觉得挺漂亮的!你问我界 ...
- 高级软件工程2017第3次作业——结对项目:四则运算题目生成程序(基于GUI)
Deadline:2017-10-11(周三)21:00pm (注:以下内容参考集大作业 ) 前言 想过和别人一起探索世界吗?多么希望,遇到困难时,有人能一起探讨:想要懈怠时,有人推你一把:当你专注于 ...
- 结对项目——四则运算GUI项目
一.项目地址:https://git.coding.net/lvgx/wsz.git 二.PSP: PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) Plannin ...
- 【SE】Week3 : 四则运算式生成评分工具Extension&Release Version(结对项目)
Foreword 此次的结对项目终于告一段落,除了本身对软件开发的整体流程有了更深刻的了解外,更深刻的认识应该是结对编程对这一过程的促进作用. 在此想形式性但真心地啰嗦几句,十分感谢能端同学能够不厌其 ...
随机推荐
- 【转载】COM 组件设计与应用(十)——IDispatch 接口 for VC.NET
原文:http://vckbase.com/index.php/wv/1225.html 一.前言 终于写到了第十回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用 ...
- 18-[模块]-shutil
shutil模块 高级的 文件.文件夹.压缩包 处理模块 (1)文件操作 shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中 import ...
- BZOJ2439【中山市选2011】序列
题面 题解 设$f[i]$表示将$[1,i]$修改为递增的最小代价, $g[i]$表示将$[i,n]$修改为递减的最小代价. $L[i]$表示将$[1,i]$修改为倒$\text V$的代价 $$ \ ...
- callable(object)
callable(object) 中文说明:检查对象object是否可调用.如果返回True,object仍然可能调用失败:但如果返回False,调用对象ojbect绝对不会成功. 注意:类是可调用的 ...
- springmvc controller转发setViewName时找不到路径的问题以及转发视图时出现找不到样式的问题
注释掉的部分是错误的写法,@RequestMapping 需要将方法放置在要转发的视图所在目录下,不然视图会找不到样式(无法正确的加载css文件), 如果将方法放在了视图所在目录下,那么 setUie ...
- WebGL——水波纹特效
大家好,今天我ccentry要做一个水波纹特效,我们来看看水波纹特效的做法.首先我们来看一下水波纹特效的效果是怎么样的,请看下图. 我们要做的就是类似这种纹理特效,那么我们来看看是如何制作的吧.首先鲫 ...
- iOS分类Category探索
什么是Category? Category是Objective-C 2.0之后添加的语言特性,Category的主要作用是为已经存在的类添加方法,一般称为分类,文件名格式是"NSObject ...
- HPCMS V9使用ajax方式提交表单
一.前台模板(注:需要引入jquery文件) <form id="myform" class="subscribe-form subscription" ...
- Git----01介绍&下载&安装&创建本地仓库
一.Git介绍 1.0.Git是分布式版本控制工具 1.1.历史 Linux 内核开源项目有着为数众广的参与者.绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2 ...
- DockerCon2017前瞻 - Docker企业版体验
DockerCon 2017将于四月17号在美国Austin召开.在去年DockerCon上,Docker公司一系列的发布吹响了进军企业市场的号角.今天,容器技术已经愈发成熟,被越来越多的企业所关注和 ...

