结对项目-四则运算 “软件”之升级版

201606120038李家俊

博客园:https://www.cnblogs.com/-QAQ/

201606120043曾鹏菲

博客园:https://www.cnblogs.com/zpfs/

github:https://github.com/rg-zpf/rg-software

一.基本要求

  • 自动生成题目,单个题目最多不能超过4个运算符,操作数小于100。
  • 用户可以输入答案
  • 若用户输入答案正确,则提示正确;若答案错误,则提示错误,并要提示正确答案是多少。

二.开发环境

  程序所使用的开发环境是:IntelliJ IDEA 2018.2.2x

三.扩展方向

1.用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数,并且显示用户的得分(曾鹏菲)

2.程序可以出单个整数阶乘的题目:如:4!=24(阶层在10以内随机产生)(曾鹏菲)

3.用户答题结束以后,程序可以显示用户答题所用的时间(以00:00形式显示)(李家俊)

4.程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。(每一题的答题时间)(曾鹏菲)

5.程序设置总时间5分钟,若5分钟内还未完成所有题目,时间到则当程序结束,未作答的题目当错误(程序总时间)(李家俊)

四.程序实现

结队项目的实现,需要有可视化界面的显示。

1.首先,程序采用javafx窗体框架的编程,界面设计略显简单粗糙。

请输入题目数按钮:在输入框内输入题目数,点击按钮,触发点击按钮事件,num=输入数

生成题目按钮:在输入题目数后,点击生成题目按钮会生成题目,每做完一道题目,就需要点击一次,产生题目,如果做完最后一道题,点击产生题目按钮,就会显示最后得分和用时

确定按钮:输入框内输入答案,点击确定提交,判断答案对错

2.程序运行,即总时间开始倒计时5分钟,若倒计时完毕还未答题完毕,则不能再作答,直接输出最后得分和做对题目数和做错题目数。

tis = new Timer();
        tis.schedule(new TimerTask() {
            public void run() {

                if (times==0){
                    code = num - count;
                    string = string + "\n" + "正确:" +count +"\t"+"错误:" + code +"\n"+ "你的最后分数是:"+(float)count/num*100;
                    Content.setText(string);
                    tis.cancel();
                    timer.cancel();
                    n=-1;
                }else {

                    times--;

                    long hh = times / 60 / 60 % 60;
                    long mm = times / 60 % 60;
                    long ss = times % 60;
                    StrOut = "还剩" + hh + "小时" + mm + "分钟" + ss + "秒";
                    outTime.setText(StrOut);
                }
            }
        }, 0, 1000);

3.输入题目数,题目数不能超过5题,输入完题目数,点击按钮的同时,做题开始计算做题时间(总时间与做题计算时间不同步)

Number.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                num = Integer.parseInt(NumText.getText());
                if (num>5){
                    string = string + "\n" + "题目数不能超过5题,请重新输入!"+ "\n" + "请输入题目数目:";
                    Content.setText(string );
                }else {
                    string = string + NumText.getText();
                    Content.setText(string);
                }


                TimerTask task1 = new TimerTask() {
                    @Override
                    public void run() {
                        StrTime = String.format("%1$tM:%1$tS",System.currentTimeMillis()-time);
                    }
                };
                new Timer().schedule(task1, 1, 1000);
            }
        });

4.产生题目按钮,点击后,会随机产生题目,产生题目的同时,还同时启动了一个计时器,改计时器的作用是规定每一道题目的答题时间不能超过120秒,超过则当该题答案错误处理;每产生一道题目,都必须要点击一次按钮,已经做完最后一题,则在点击按钮后,会输入最后的得分和用时、题目的对错数量。

newCode.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                n++;
                if(n<num){
                    string = string+ "\n"+Code();
                    Content.setText(string);

                    //每一道题目的规定答题时间
                    timer = new Timer();//第二个计时器:计算每一题的规定时间
                    long nowTime = System.currentTimeMillis();
                    TimerTask task2 = new TimerTask() {
                        @Override
                        public void run() {
                            endTime = (System.currentTimeMillis()-nowTime)/1000;
                            //System.out.println(endTime);
                            if (endTime>120){
                                string = string + "\n" + "此题超时,答案错误!";
                                Content.setText(string);
                                code++;
                                timer.cancel();
                            }
                        }
                    };
                    timer.schedule(task2,1,1000);
                //所有题目答题完毕
                }else {
                    tis.cancel();//总时间
                    new Timer().cancel();//答题所用时间(所有题目)
                    string = string + "\n" + "正确:" +count +"\t"+"错误:" + code + "\n"+ "你的最后分数是:"+(float)count/num*100;
                    Content.setText(string + "\n" + "你的用时:" + StrTime);
                    n=-1;

                }
            }
        });

5.填写答案框中输入答案,点击确定按钮提交,则会判断答案对错,在点击按钮后的同时,计算每一题的答题时间定时器也会同时关闭,相当于该题答题完毕,下一题再创建新的计时器计数。判断答案对错,还会分别统计正确和错误的数量。

Answer.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                timer.cancel();//每一道题的结束
                answer = Integer.parseInt(AnswerText.getText());
                if(Math.abs(answer-result())<0.1){
                    string = string + AnswerText.getText() + "\n" +"恭喜你,计算正确,答案是:"+result();
                    Content.setText(string);
                    count=count+1;
                    }else{
                        string = string + AnswerText.getText() + "\n" +"很遗憾,计算错误,答案是:"+result();
                        Content.setText(string);
                        code++;
                    }
            }
        });

6.清除按钮,点击则清除所有数据,再重新输入题目数目开始,总时间倒计时也回到5分钟,重新开始倒计时。

clear.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                NumText.setText(null);
                AnswerText.setText(null);
                Content.setText(null);
                string = "请输入题目数目:";
                Content.setText(string);
                time=System.currentTimeMillis();
                count=0;
                code=0;
                //复位总时间
                times=300;
                tis = new Timer();
                tis.schedule(new TimerTask() {
                    public void run() {

                        if (times == 0) {
                            code = num - count;
                            string = string + "\n" + "正确:" + count + "\t" + "错误:" + code + "\n" + "你的最后分数是:" + (float) count / num * 100;
                            Content.setText(string);
                            tis.cancel();
                            timer.cancel();
                            n = -1;
                        } else {

                            times--;

                            long hh = times / 60 / 60 % 60;
                            long mm = times / 60 % 60;
                            long ss = times % 60;
                            StrOut = "还剩" + hh + "小时" + mm + "分钟" + ss + "秒";
                            outTime.setText(StrOut);
                        }
                    }
                }, 0, 1000);
            }
        });

五.问题与解决

1.javafx的窗体设置界面,之前已经学过这个,但学的不深入,所以现在用起来也不熟练,甚至,在该程序中,界面的设置也是过于简单的,并且有些控件的位置,我感觉自己不能随心所欲想让它放在哪边就在哪边,在遇到这个问题的时候,我也只能自己上网去查相关信息,但也比较难找到适合自己问题并解决的。

2.变量的作用域。该程序的变量大部分是采取了全局变量的,因为大部分变量都是涉及到各个功能中的;其实我个人认为一个程序定义过多的全局变量是不怎么好的,能尽量用局部变量解决问题的就尽量用,这样好像更低耦合,实在没办法再考虑全局变量。

3.定时器的使用。一个定时器很容易管理, 但2个或多个以上,就会容易出现混淆了,该程序中运用了三个定时器,总时间倒计时定时器、答题时间计时器、每一道题目规定时间定时器;一开始我也混淆了,结果导致不能关闭某一个定时器,后来查阅相关资料后, 我采取了两种方式创建定时器,就比较好的区分开来了。

4.清除、复位功能。清除按钮,等于复位,重新开始,该功能中,要注意所有相关的数据,都必须复位,恢复一开始的数据状态,时间、题目数,正确题目数、错误题目数都要复位。

六.感悟

       程序是需要编码和无数次的测试才完成的,有时候,编码编程是困难的,当你没有思路的时候,它的确是很困难,这个时候可以先停下来想一想,思考一下,该如何去做,还可以先查阅相关资料,才动手去做,或者,有时候已经编码很长时间了,可以先停一停,去运动一下先,一直刚下去,或者效果反而没有那么高效;然而测试,有时候比编码难很多,是因为它运行出错了,你却无法发现,或者,你发现出错了,但你不知道它错在哪里,如何去调试才能发现问题所在,所以,需要测试过很多,很多情况都能出现过并解决,这才是一个比较完整的程序,我的这个程序中,也有一个我无法发现错在什么地方的bug,查看了很多次都不知道如何修改。

       总而言之,花了时间去做事情,无论做得好坏,都会有一个结果,但不花时间,就别谈结果了,所有的成果,都是用时间和精力去堆积成的,所以,每一件事情都需要花时间下去,才能做出一些成果,好坏就看个人而言了。

七.结队工作照片

八.统计表

PSP2.1 Personal Software Process Stages Time Senior Student(h) Time(h)
Planning 计划 1 1
· Estimate 估计这个任务需要多少时间 50 55
Development 开发 3 3
· Analysis 需求分析 (包括学习新技术) 1 1
· Design Spec 生成设计文档 1 1
· Design Review 设计复审 2 2
· Coding Standard 代码规范 5 5
· Design 具体设计 1 1
· Coding 具体编码 20 22
· Code Review 代码复审 5 5
· Test 测试(自我测试,修改代码,提交修改) 10 13
Reporting 报告 2 2
· 测试报告 0.5 0.5
· 计算工作量 1 1
· 并提出过程改进计划 0.5 0.5

posted @ 2018-10-24 19:43  曾鹏菲  阅读(297)  评论(0编辑  收藏  举报