结对项目-四则运算 “软件”之升级版
Posted zpfs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结对项目-四则运算 “软件”之升级版相关的知识,希望对你有一定的参考价值。
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 + " " + "正确:" +count +" "+"错误:" + code +" "+ "你的最后分数是:"+(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 + " " + "题目数不能超过5题,请重新输入!"+ " " + "请输入题目数目:"; 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+ " "+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 + " " + "此题超时,答案错误!"; Content.setText(string); code++; timer.cancel(); } } }; timer.schedule(task2,1,1000); //所有题目答题完毕 }else { tis.cancel();//总时间 new Timer().cancel();//答题所用时间(所有题目) string = string + " " + "正确:" +count +" "+"错误:" + code + " "+ "你的最后分数是:"+(float)count/num*100; Content.setText(string + " " + "你的用时:" + 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() + " " +"恭喜你,计算正确,答案是:"+result(); Content.setText(string); count=count+1; }else{ string = string + AnswerText.getText() + " " +"很遗憾,计算错误,答案是:"+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 + " " + "正确:" + count + " " + "错误:" + code + " " + "你的最后分数是:" + (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 |
以上是关于结对项目-四则运算 “软件”之升级版的主要内容,如果未能解决你的问题,请参考以下文章