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


    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

  • 相关阅读:
    [LeetCode] Rabbits in Forest 森林里的兔子
    [LeetCode] 780. Reaching Points 到达指定点
    [LeetCode] Swim in Rising Water 在上升的水中游泳
    [LeetCode] 777. Swap Adjacent in LR String 交换LR字符串中的相邻项
    [LeetCode] Split BST 分割二叉搜索树
    [LeetCode] Global and Local Inversions 全局与局部的倒置
    [LeetCode] Minimize Max Distance to Gas Station 最小化去加油站的最大距离
    [LeetCode] Sliding Puzzle 滑动拼图
    [LeetCode] Basic Calculator IV 基本计算器之四
    [LeetCode] Jewels and Stones 珠宝和石头
  • 原文地址:https://www.cnblogs.com/zpfs/p/9833766.html
Copyright © 2020-2023  润新知