• 四则运算结对编程


    GitHub项目地址:https://github.com/Juneflyfire/jisuan2

    a. 需求分析:

    设计开发一个小学生四则运算练习软件,使之具有以下功能:

    (1)由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;

    (2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成

    (3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;

    (4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图;

    (5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;  

    (6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。

    (7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。

     

    b. 软件设计:使用类图

     

    c. 核心功能代码展示:展示核心功能代码。

    (1)语言切换

        以下为语言的切换功能,采用的方式是设置三个按钮,分别为“简体中文”、“繁体中文”和“英文”,将窗体上所有的文字设置为一个变量,当任意一个按钮按下时,切换成该按钮对应的语言。

    if(input.equals("S5"))//简体中文
                {
                    La1="得分";
                    La2="计时";
                    La4="下一轮";
                    La5="提交答案";
                    La6="测评";
                    La7="简体中文";
                    La8="繁体中文";
                    La9="英文";
                    La10="整数运算";
                    La11="分数运算";                
                    l1.setText(La1);
                    BT4.setText(La6);
                    BT2.setText(La5);
                    BT5.setText(La7);
                    BT6.setText(La8);
                    BT7.setText(La9);
                    BT8.setText(La2);
                    BT9.setText(La10);
                    BT10.setText(La11);
                }    
                if(input.equals("S6"))//繁体中文
                {
                    La1="得分";
                    La2="計時";
                    La4="下一輪";
                    La5="提交答案";
                    La6="測評";
                    La7="簡體中文";
                    La8="繁體中文";
                    La9="英文";
                    La10="整數運算";
                    La11="分數運算";                
                    l1.setText(La1);
                    BT4.setText(La6);
                    BT2.setText(La5);
                    BT5.setText(La7);
                    BT6.setText(La8);
                    BT7.setText(La9);
                    BT8.setText(La2);
                    BT9.setText(La10);
                    BT10.setText(La11);
                    
                }    
                if(input.equals("S7"))
                {
                    La1="Grade";
                    La2="Time";
                    La4="Next Turn";
                    La5="Submit";
                    La6="Measurement";
                    La7="Simplified Chinese";
                    La8="Traditional Chinese";
                    La9="English";
                    La10="Integer arithmetic";
                    La11="Fraction arithmetic";        
                    l1.setText(La1);
                    BT4.setText(La6);
                    BT2.setText(La5);
                    BT5.setText(La7);
                    BT6.setText(La8);
                    BT7.setText(La9);
                    BT8.setText(La2);
                    BT9.setText(La10);
                    BT10.setText(La11);    
                }

    (2)统计得分

      对“提交答案”按钮进行监听,获取所有输入的答案,于文本文档result1中的答案进行比较,每对一题得五分,在得分后的文本框中显示得分。

    if(input.equals("S2"))//提交答案
                {
                    String []res = new String[20];
                    //获取结果数组
                    try {
                        
                        int i = 1;
                        BufferedReader br = new BufferedReader(new FileReader("result1.txt"));
                        String nString = br.readLine();
                        res[0] = nString;
                        while (nString != null) {
                            nString=br.readLine();
                            res[i]= nString;
                            i++;
                            
                        }
                        br.close();
                    } catch (Exception e) {
                    }      
                    int sum = 0;
                    //获取答案内容
                    if(a1.getText().equals(res[0]))
                    {
                        sum += 5;    
                    }
                    if(a2.getText().equals(res[1]))
                        sum += 5;
                    if(a3.getText().equals(res[2]))
                        sum += 5;
                    if(a4.getText().equals(res[3]))
                        sum += 5;
                    if(a5.getText().equals(res[4]))
                        sum += 5;
                    if(a6.getText().equals(res[5]))
                        sum += 5;
                    if(a7.getText().equals(res[6]))
                        sum += 5;
                    if(a8.getText().equals(res[7]))
                        sum += 5;
                    if(a9.getText().equals(res[8]))
                        sum += 5;
                    if(a10.getText().equals(res[9]))
                        sum += 5;
                    if(a11.getText().equals(res[10]))
                        sum += 5;
                    if(a12.getText().equals(res[11]))
                        sum += 5;
                    if(a13.getText().equals(res[12]))
                        sum += 5;
                    if(a14.getText().equals(res[13]))
                        sum += 5;
                    if(a15.getText().equals(res[14]))
                        sum += 5;
                    if(a16.getText().equals(res[15]))
                        sum += 5;
                    if(a17.getText().equals(res[16]))
                        sum += 5;
                    if(a18.getText().equals(res[17]))
                        sum += 5;
                    if(a19.getText().equals(res[18]))
                        sum += 5;
                    if(a20.getText().equals(res[19]))
                        sum += 5;
                    String sco = sum + "";
                    l2.setText(sco);
                    
                    Grade.add(sco);
                            
                }

    (3)计时

    public class Time extends JFrame {
        private static final long serialVersionUID = 1L;  
        private static final String INITIAL_LABEL_TEXT = "00:00:00 000"; 
        
     // 计数线程    
        private CountingThread thread = new CountingThread();    
        // 记录程序开始时间    
        private long programStart = System.currentTimeMillis();    
        // 程序一开始就是暂停的    
        private long pauseStart = programStart;    
        // 程序暂停的总时间    
        private long pauseCount = 0;    
        private JLabel label = new JLabel(INITIAL_LABEL_TEXT);    
        private JButton startPauseButton = new JButton("开始");    
        private JButton resetButton = new JButton("清零");    
        String time;
        private ActionListener startPauseButtonListener = new ActionListener() {    
            public void actionPerformed(ActionEvent e) {    
                if (thread.stopped) {    
                    pauseCount += (System.currentTimeMillis() - pauseStart);    
                    thread.stopped = false;    
                    startPauseButton.setText("暂停");    
                } else {    
                    pauseStart = System.currentTimeMillis();    
                    thread.stopped = true;    
                    startPauseButton.setText("继续");    
                }    
            }    
        };   
        private ActionListener resetButtonListener = new ActionListener() {    
            public void actionPerformed(ActionEvent e) {    
                pauseStart = programStart;    
                pauseCount = 0;    
                thread.stopped = true;    
                label.setText(INITIAL_LABEL_TEXT);    
                startPauseButton.setText("开始");    
            }    
        };    
        public Time(String title) throws HeadlessException {    
            super(title);    
            setDefaultCloseOperation(EXIT_ON_CLOSE);    
            setLocation(300, 300);    
            setResizable(false);    
         
            setupBorder();    
            setupLabel();    
            setupButtonsPanel();    
            startPauseButton.addActionListener(startPauseButtonListener);    
            resetButton.addActionListener(resetButtonListener);    
            thread.start(); // 计数线程一直就运行着    
        }    
        // 为窗体面板添加边框    
        private void setupBorder() {    
            JPanel contentPane = new JPanel(new BorderLayout());    
            contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));    
            this.setContentPane(contentPane);    
        }    
        // 配置按钮    
        private void setupButtonsPanel() {    
            JPanel panel = new JPanel(new FlowLayout());    
            panel.add(startPauseButton);    
            panel.add(resetButton);    
            add(panel, BorderLayout.SOUTH);    
        }    
        // 配置标签    
        private void setupLabel() {    
            label.setHorizontalAlignment(SwingConstants.CENTER);    
            label.setFont(new Font(label.getFont().getName(), label.getFont().getStyle(), 40));    
            this.add(label, BorderLayout.CENTER);    
        }   
         
        private class CountingThread extends Thread {    
         
            public boolean stopped = true;    
         
            private CountingThread() {    
                setDaemon(true);    
            }    
         
            @Override    
            public void run() {    
                while (true) {    
                    if (!stopped) {    
                        long elapsed = System.currentTimeMillis() - programStart - pauseCount;    
                        label.setText(format(elapsed));    
                        time=label.getText();
                        File f=new File("time.txt");
                        BufferedWriter bw;
                        try {
                            bw = new BufferedWriter(new FileWriter(f));
                            bw.write(time);
                            bw.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }    
         
                    try {    
                        sleep(1);  // 1毫秒更新一次显示  
                    } catch (InterruptedException e) {    
                        e.printStackTrace();    
                        System.exit(1);    
                    }    
                }    
            }    
         
            // 将毫秒数格式化    
            private String format(long elapsed) {    
                int hour, minute, second, milli;    
         
                milli = (int) (elapsed % 1000);    
                elapsed = elapsed / 1000;    
         
                second = (int) (elapsed % 60);    
                elapsed = elapsed / 60;    
         
                minute = (int) (elapsed % 60);    
                elapsed = elapsed / 60;    
         
                hour = (int) (elapsed % 60);    
         
                return String.format("%02d:%02d:%02d:%03d", hour, minute, second, milli);    
            }    
    
        }
    }

    (4)柱状图

    public class BarGraph extends JPanel 
    {
        private int x;
        private static int length ; 
        int i=0;
        public int[] count;
        ArrayList<JLabel> label = new ArrayList<JLabel>();
        public BarGraph(final ArrayList<String> summer) 
        {
            length = summer.size();
            count = new int[length];
            System.out.print(length);
            this.setLayout(null);
            for(int i=0;i<summer.size();i++)
            {
                count[i] = Integer.parseInt(summer.get(i));    
            }
            for(int i=1;i<summer.size();i=i+2)
            {
                JLabel  Label = new JLabel("柱状图",JLabel.LEFT);
                Label.setFont(new Font("SansSerif", Font.BOLD + Font.ITALIC, 18));
                Label.setBounds(30+(i-1)*30, 610, 60,50);
                JLabel  Label2 = new JLabel(count[i]+"",JLabel.CENTER);
                Label2.setFont(new Font("SansSerif", Font.BOLD + Font.ITALIC, 18));
                Label2.setBounds(25+(i-1)*30, 555-6*count[i], 60,50);
                label.add(Label);
                label.add(Label2);
                this.add(label.get(i-1));
                this.add(label.get(i));  
            }
        } 
         protected void paintComponent(Graphics g) 
         {
             int x=10;
             g.setColor(Color.red);
             for (int i = 0; i < count.length; i++) 
             {   
                 g.fillRect(x, 600-6*count[i], 30,6*count[i] );
                 x += 30; 
             }
         }
    }

    d. 程序运行:程序运行时每个功能界面截图。

    (1)语言的切换

    (2)点击“整数运算”按钮以后,随机产生20个算式,并且存在result文本文档中,同时将单独的计算结果存在result1文档中。如下图所示:

    ‘’

    (3)计时。点击“计时”按钮,开始计时,当答案输入完毕时,提交答案,显示得分。计时器具有清零、暂停等按钮。

     

    (4)柱状图

    第一轮计算

    第二轮, 再次点击“整数运算”按钮,将上一轮的文本框清空,进行再一轮运算。

    将以上两轮的得分存在一个ArrayList数组中,作为绘制柱状图的参数

    e.描述结对的过程,提供两人在讨论、细化和编程时的结对照片(非摆拍)。

    由于我们采用的是分工合作的方法完成项目,彼此不熟悉彼此的代码风格,两个人也没有花时间去讨论类与类之间的关系,只是画了一个初期完成项目的思维导图就开始各做个的了,再花一天时间一起完善代码。在这期间,队友给我带来了很多的新思路,但同时呢,也出现过两个人彼此误导,在长时间编程以后两个人都陷入了错误之中。两个人也都在磨合之中,逐渐提高了Java的编程能力。

     

     

    f.提供此次结对作业的PSP。

    PSP2.1

    任务内容

    计划共完成需要的时间(min)

    实际完成需要的时间(min)

    Planning

    计划

    8

    6

    ·       Estimate

    ·  估计这个任务需要多少时间,并规划大致工作步骤

    8

    6

    Development

    开发

    600

    1800

    ··       Analysis

      需求分析 (包括学习新技术)

    6

    10

    ·       Design Spec

    ·  生成设计文档

    5

    6

    ·       Design Review

    ·  设计复审 (和同事审核设计文档)

    4

    6

    ·       Coding Standard

      代码规范 (为目前的开发制定合适的规范)

    3

    3

    ·       Design

      具体设计

    10

    12

    ·       Coding

      具体编码

    36

    1693

    ·       Code Review

    ·  代码复审

    7

    10

    ·       Test

    ·  测试(自我测试,修改代码,提交修改)

    13

    60

    Reporting

    报告

    9

    6

    ··       Test Report

    ·  测试报告

    3

    2

    ·       Size Measurement

      计算工作量

    2

    1

    ·       Postmortem & Process Improvement Plan

    ·  事后总结 ,并提出过程改进计划

    3

    3

    g. 请使用汉堡评价法给你的小伙伴一些点评。

    队友是个好队友,思路很清晰,效率也很高。在两个人的思想碰撞中,可以很好的表达自己,并且让我很好的接受她的建议。希望在未来还有机会可以一起合作。

    h. 结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会。

    结对编程可以带来1+1>2的效果,因为自己在编写代码的时候,很容易陷入错误的思路之中,此时队友就可以在一旁点醒自己。两个人编程可以取长补短,相互补充不知道的知识,同时也因为分工合作的原因,不自觉地会将代码规范,认真地将自己写的代码部分注释好意思,并且给队友讲解,在这个过程中,自己对自己的要求高了,知识记忆也加深了。当然了,凡事都要两面性,在与队友的磨合时,花费了很长的时间,也面临了与队友的时间冲突问题,但这些都是可以一一克服的。

    很多书中都批判过中国人的合作,《丑陋的中国人》中将这个问题延伸到了“窝里斗”,三个和尚没水喝的故事也成了合作界的笑话。但是在本次项目中,我切身体会到了“三个臭皮匠赛过诸葛亮”的道理。在信息大爆炸的今天,只有合作,才能让思想之花绽放的灿烂,中国的互联网飞速发展,大家都在提倡团队合作,我们再也不是像曾经书中写的那样了。

    至于自己在写代码的过程中,最大的感悟就是前期的分析工作是至关重要的,由于没有提前设计好项目思路,在写项目尤其是在写界面的时候,反复改写界面,类写了又删,删了又写,而且对于用户的需求分析不足,只关注到了老师留的任务的个数,想着将任务全部完成,却忽视了小学生是多数用户,在写的时候犯下了致命错误,就是没有控制百内的整数运算。虽然功能基本完成,但是却是很失败的。其次就是,条条大路通罗马,在编写代码的过程中,会遇到一个方法行不通,然后又想着可以存在文档里,再行不通的话又会想出另一个办法,实现同一个功能,会有很多很多的方法去达到它,这大概也是它的迷人之处吧,让编程者在思考的海洋中不断遨游。最后就是,少壮不努力,老大徒伤悲呀,大一Java没学好,现在每次项目前,都需要把代码涉及到的知识点都现学一遍,所幸的是,现在的自己,已经可以静下心来花很长的时间去写一个代码,所幸的是,现在也不晚。

  • 相关阅读:
    一周最新示例代码回顾 (4/23–4/29)
    优酷的投票
    Google API获取用户信息
    CPU性能分析
    有意思的排序算法快速排序
    http响应LastModified和ETag以及asp.net web api实现
    java/C#多态漫谈
    有意思的排序算法插入排序
    [Architecture Pattern] Repository
    50个jQuery代码段帮你成为更出色的JS开发者
  • 原文地址:https://www.cnblogs.com/wuqiong666/p/8711128.html
Copyright © 2020-2023  润新知