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

Posted on 2018-04-02 20:45  能怎样i  阅读(388)  评论(1编辑  收藏  举报

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的这种效果,而且感觉很明显,如果一个人编程,在设计功能时有可能会忘记某些功能,或者说功能不完善,结对编程可以避免这种情况,而且两个人一起编程思路清晰,效率也就更高,总之,结对编程对我们的帮助是很大的。