• 结对项目-小学生四则运算系统(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("取消生成,请检查数值
    ");
                            }
    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("上一题
    ");
                                textArea.append("算式:"+strPro.StrSplitBefore(arithExpress.get(index))+"="+textField.getText()+"
    ");
                                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的使用)

  • 相关阅读:
    HDU 5273 Dylans loves sequence 暴力递推
    HDU 5285 wyh2000 and pupil 判二分图+贪心
    HDU 5281 Senior's Gun 贪心
    HDU 5651 xiaoxin juju needs help 逆元
    HDU 5646 DZY Loves Partition
    HDU 5366 The mook jong
    HDU 5391Z ball in Tina Town 数论
    HDU 5418 Victor and World 允许多次经过的TSP
    HDU 5642 King's Order dp
    抽屉原理
  • 原文地址:https://www.cnblogs.com/FrrLolix/p/8763072.html
Copyright © 2020-2023  润新知