结对项目-小学生四则运算系统(GUI)

Coding克隆地址:https://git.coding.net/FrrLolix/CalGUI.git

伙伴博客:http://www.cnblogs.com/wangyy39/p/8763244.htmlhtml

目录:

1、前言java

2、计划时间——PSPgit

3、接口设计express

4、接口实现编程

5、性能分析数组

6、单元测试app

7、异常处理dom

8、模块设计ide

9、模块对接函数

10、她

11、结对编程思考

12、实际时间——PSP

十3、关于柱状图的实现

 

1、前言

首先我很感谢个人队友——王玥莹,谢谢她的努力,放弃本身休息的时间。

 

2、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

3、接口设计

信息隐藏指在设计和肯定模块时,使得一个模块内包含的特定信息(过程或数据),对于不须要这些信息的其余模块来讲,是不可访问的。

  在结对项目中,使用命令行模式执行和使用GUI界面执行出题部分时调用了同一部分核心代码,在这里我将出题这一部分信息隐藏,当改变人机交互模式的时候就不会给系统带来全局性的影响。在个人程序中避免了A类调用B类的程序,B类有调用A类的程序这种状况,这也是所谓的“循环依赖”,这种状况会阻碍信息隐藏。

接口设计(Interface Design)

  在本项目设计接口过程当中,使用有意义的命名方式使接口的功能一目了然,加强了可读性;类名和方法名也都使用了有意义的命名方式;在开发过程当中加好了注释,方便本身和他人看懂代码;在接口设计过程当中对相关原则也有了一些体会,主要参考如下内容:

https://blog.csdn.net/blueangle17/article/details/55049858

https://jingyan.baidu.com/article/066074d626ea09c3c21cb0b9.html

4、接口实现

咱们用到了按钮监听器和复选框监听器以及文件监听器,对于时间计算方面咱们选择的是比较简单可是简陋的计时器。

5、性能分析

讲真,这个项目对于咱们来讲,能完成已是不遗余力,在优化性能时尽管有些抵触,但也算尽力,尽可能减小内存占用率,减小嵌套循环和数组过大带来的资源浪费。在生成计算式时,不符合要求的计算式须要舍弃,在数值较大时,十分容易形成资源的浪费,所以咱们在数值较大时,尽可能限制了乘法时数的大小,尽可能避免连续屡次弃用。

6、单元测试

测试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

 

7、异常处理:

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
                            );

 

 

8、模块设计

 

 导航页和得到出题参数页使用了同种方式来生成用户界面,表明导航页和出题参数页的类继承了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);

9、模块对接

一、参数传递功能

 

String n = JOptionPane.showInputDialog(
                                frame,
                                "输入题目的数量(1-1000):"
                        );
                        String m = JOptionPane.showInputDialog(
                                frame,
                                "输入数值范围(1-10000):"
                        );
                        String z = JOptionPane.showInputDialog(
                                frame,
                                "输入符号数量(1-10):"
                        );

 

二、选择计算方式功能

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;
                                }

 

三、作题功能

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());
                            }

 

四、统计分析功能

使用了绘制柱状图工具类,从一篇博客中学习找到的灵感 连接: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

10、结对成员

 

一、我:优势:技术较强,善于思考 缺点:态度有时不够端正,不认真。

二、她:优势:认真,上进,积极活泼,又带动性。缺点:技术稍差。

 

11、对编程思考

结对编程有好处:

1、结对编程能够相互学习互相鼓励

2、分工明确,能够提升作事效率

3、加强两我的的关系,加强合做能力、加强代码理解能力。

4、在出现错误时,伙伴能够及时发现而且指出,少走弯路

结对编程有坏处:

1、须要大量的交流,若是交流沟通不到位,项目将步履维艰。

2、可能会出现思路的分歧,致使两人代码出现分歧,难以结合。

3、两人分工的不均匀,有可能出现技术强带技术弱作项目的状况。

 

12、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

 

 

十3、柱状图的实现

  相关实现代码如图,主要借用了jfreechart的工具类,jfreechart是一个图标绘制类库,经过对jfreechart的引用,实现了项目中的柱状图。在下面的博客中具体的讲解了jfreechart的使用方法,包括了柱状图、饼图、折线图等。

相关参考博客:https://blog.csdn.net/pzhtpf/article/details/7600100/

 

参考博客:https://www.cnblogs.com/xdp-gacl/p/3633744.html(GUI的使用)

相关文章
相关标签/搜索