《小学四则运算练习软件》GUI

GitHub地址:https://github.com/TUOZF/sizeyunsuan.git

  • 需求分析

   在《实验二 软件工程个人项目》中,同学们实现了一个命令行四则运算出题小程序,本次实验采用结对编程方式,设计开发一个小学生四则运算练习软件,使之具有以下功能:

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

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

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

(4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:

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

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

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

  • 软件设计

 

程序流程图

程序类图

 

  • 核心功能代码展示

  四则运算结果的判断:

if( Expressions.get(0).equals(answers.get(0)) )
                    {answer1.setText("正确 "); sum++;}
                else
                    answer1.setText("错误");
                
                if( Expressions.get(1).equals(answers.get(1)) )
                    {answer2.setText("正确 "); sum++;}
                else
                    answer2.setText("错误");
                
                if( Expressions.get(2).equals(answers.get(2)) )
                    {answer3.setText("正确 "); sum++;}
                else
                    answer3.setText("错误");
                
                if( Expressions.get(3).equals(answers.get(3)) )
                    {answer4.setText("正确 "); sum++;}
                else
                    answer4.setText("错误"); 



                                num.add(sum*5+"");
                //num.add(sum+"");
                                //将判断结果存入文件
                try {
                       File f = new File("result.txt"); 
                    FileWriter fw = new FileWriter(f,true);
                    PrintWriter pw = new PrintWriter(fw);
                    //pw.println(" 201571030126");
                    //pw.println();
                    for(String con:num)
                     {
                          pw.println(con);               
                     }
                            
                    fw.close();
                            
                    } catch (IOException e) {
                    // TODO Auto-generated catch block
                        e.printStackTrace();
                    }    

  计时:

class shishi3 extends Thread {
            private long noww = 0l;
            private long start = System.currentTimeMillis();// 程序启动时间的毫秒值
            private long time;
            public void run() {
                int i=0;
                while (true) {

                    noww = System.currentTimeMillis();// 获取一秒之后的毫秒值
                    time = noww - start;// 两个时间相减的到毫秒差
                    timetime=time;
                    String ssss=String.format("%02d:%02d:%02d\n",
                            time / (1000 * 60 * 60) % 60/**/, 
                            time / (1000 * 60)% 60/**/, 
                            (time / 1000 % 60)/**/);// 格式化字符串输出
               
                        l1.setText(ssss);
                        i++;
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    
                }
            }
        }

  统计结果并绘制柱状图:

int Width = 400;
        int Height = 450; 
        Random ran = new Random();
        int leftMargin = 15;//柱形图左边界  
        int topMargin = 50;//柱形图上边界  
        Graphics2D g2 = (Graphics2D) g;
        g2.translate(50, 100);
        int ruler = Height-topMargin-5;  
        int rulerStep = ruler/10;//将当前的高度评分为10个单位  
        g2.setColor(Color.gray);//绘制白色背景  
        g2.fillRect(0, 0, Width, Height);//绘制矩形图  
        g2.setColor(Color.LIGHT_GRAY);  
        for(int i=0;i<=10;i++)
     {//绘制灰色横线和百分比 g2.drawString((100-10*i)+"", 10, topMargin+rulerStep*i);//写下百分比 g2.drawLine(10, topMargin+rulerStep*i, Width, topMargin+rulerStep*i);//绘制灰色横线 } g2.setColor(Color.PINK); for(int i=0;i<4;i++)
     {//绘制柱形图 int value =save[i]*4;// ran.nextInt(Height-topMargin-10)+10;//随机产生柱形的百分比 int step = (i+1)*35;//设置每隔柱形图的水平间隔为40 //绘制矩形 g2.fillRoundRect(leftMargin+step*2, Height-value-10, 40, value, 40, 10); //g2.fillRoundRect(leftMargin+step*2, Height-value, 40, value, 40, 10); //列出产品的编号 g2.drawString("测试"+(i+1), leftMargin+step*2, Height-value-15); }

 

  • 程序运行

  • 结对过程

  • PSP

 

PSP2.1

任务内容

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

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

Planning

计划

20

30

       Estimate

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

40

40

Development

开发

360

480

Analysis

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

10

10

 Design Spec

 设计

20

30

              Design Review

设计复审

10

10

             Coding Standard

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

5

10

                Design

  具体设计

20

20

                 Coding

  具体编码

240

320

              Code Review

代码复审

20

30

                   Test

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

20

40

     Reporting

报告

15

20

       Test Report

测试报告

5

10

      Size Measurement

  计算工作量

3

5

        Postmortem & Process     Improvement Plan

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

5

5

 

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

  本次实验是软件工程第一次用新的模式(结对编程)来进行的,以前和同学也合作过一些作业,但这次作业和以前的不一样,是通过一台电脑来进行编程的,所以合作比以前的更加密切了。刚开始时我们先讨论了实验的大概过程,但是在实验过程中有时候时间会和别的学习有冲突,最后在我们两的协调下对各自的时间进行了调整;刚开始时我们的编程习惯也不是很习惯,所以刚开始时有很多的错误出现,后来我们统一使用了标准的编程规则使得错误巨减;我们遇到分歧时会互相指出对方的优点,从而考虑这些优点进行下一步的选择。最后顺利完成了这次的结对编程。

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

  个人感觉结对编程会带来1+1>2的效果。一个人编程的时候遇到问题有时候会卡好长时间,有时候很简单的错误也需要好久才能找见,但是结对编程的时候这种问题出现次数比较少,遇到问题时解决问题的思路和时间会很大幅度的减少,经过两个人的讨论会对问题理解的更透彻,效率更高,所以说结对编程和团队合作还是很有必要的。

posted @ 2018-04-02 20:24  三金子  阅读(375)  评论(1编辑  收藏  举报