结对项目(简单四则运算升级并实现界面化)
作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2213
我的Github:https://github.com/CTqin/CTqin
一、基本要求
从个人项目出发,将程序改造成一个单机带用户界面(不是控制台)的程序,这个程序最基本要达到:
- 自动生成题目,单个题目最多不能超过4个运算符,操作数小于100。
- 用户可以输入答案
- 若用户输入答案正确,则提示正确;若答案错误,则提示错误,并要提示正确答案是多少。
二、我做的扩展方向
- 程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.67而非2.66(保留两位小数功能实现,不支持出带括号题目)
- 可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8(function6实现)
- 用户答题结束以后,程序可以显示用户答题所用的时间(实现)
- 用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数(实现)
- 用户在第一次答题时,需要用户输入用户名,用户下次启动后,程序需要记住用户前一次输入的用户名 (此功能已经有了但是还没具体实现下来,日后会实现跟新)
- 程序可以出单个整数阶乘的题目:如:4!=24(function5实现)
- 程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。(实现)
- 程序可以设置皮肤功能,可以改变界面的颜色即可(按钮点击实现两种颜色切换)
三、开发环境下调试:IDEA
四、实现
本次实验利用Java实现,用户界面的实现使用的是Javax框架。
通过产生随机数0-5对应实现随机出题目
int x=(int)(Math.random()*5);
int x=(int)(Math.random()*5);
switch(x)
{
case 0:
function1();//一个运算符,整数,整数
break;
case 1:
function2();//一个运算符,整数,分数
break;
case 2:
function3();//一个运算符,分数,分数
break;
case 3:
function4();//两个运算符
break;
case 4:
function5();//求阶乘
break;
case 5:
function6();//题目出现负数
break;
}
功能function0-4的逻辑和上次发表的博客逻辑一样,不做详细解析,具体请看代码。
1. 阶乘功能的实现在function5()方法中
private void function5()//阶乘
{
int a=(int)(Math.random()*10+1);//求1~10的阶乘
t.setText(a+"!");
for(int i=1;i<=a;i++)
{
answer =1;
answer = answer *i;
}
}
产生随机产生一到1-10随机数a,利用for语句实现阶乘功能。其中answer为全局变量,计算出answer方便后来用来检验答案是否正确。
2.功能六题目出现负数的处理
private void function6()//表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。 { int a=(int)(Math.random()*99+1)*-1;//随机生成-1~-99的负整数 int b=(int)(Math.random()*10+1); int x1=(int)(Math.random()*4); switch(x1) { case 0: { t.setText("("+a+") "+String.valueOf(ch[0])+" "+b); answer =a+b; } break; case 1: { t.setText("("+a+") "+String.valueOf(ch[1])+" "+b); answer =a-b; } break; case 2: { t.setText("("+a+") "+String.valueOf(ch[2])+" "+b); answer =a*b; } break; case 3: { t.setText("("+a+") "+String.valueOf(ch[3])+" "+b); answer =(float)a/(float)b; } break; } }
通过随机产生的随机数乘(-1)即可产生随机负数。
3.功能背景颜色的改变
if(e.getSource()==colorchangebtn) { if (colorchange==true) { p1.setBackground(Color.red); p2.setBackground(Color.red); colorchange=false; } else { p1.setBackground(Color.white); p2.setBackground(Color.white); colorchange=true; } }
利用actionPerformed(ActionEvent e)事件监听器,处理单击鼠标时触发的事件
判断是否是点击的colorchangebtn按钮,若已经点击则进行背景颜色改变
4.菜单栏目功能
JMenuBar menubar = new JMenuBar(); JMenu LoginMenu = new JMenu("系统登录"); JMenu UserMangeMenu = new JMenu("用户管理"); JMenu backColorMenu = new JMenu("背景功能"); JMenu HelpMenu = new JMenu("关于"); JMenuItem userLoginMenu= new JMenuItem("用户登录"); userLoginMenu.addActionListener(new LoginActionListener()); JMenuItem exitLoginMenu= new JMenuItem("退出"); // JMenuItem myBackgroudColor=new JMenuItem("背景颜色改变"); exitLoginMenu.addActionListener(new exitmyitem()); LoginMenu.add(userLoginMenu); LoginMenu.add(exitLoginMenu); // backColorMenu.add(myBackgroudColor); menubar.add(LoginMenu); menubar.add(UserMangeMenu); menubar.add(backColorMenu); menubar.add(HelpMenu); //将菜单加入至菜单栏 p1.add(menubar);
添加菜单栏不会,百度搜索了下,具体参考了http://blog.sina.com.cn/s/blog_5e94b1030100slkn.html
5.计时功能的实现
Timer timertask = new Timer(1000, this);//间隔1秒 this.tmr = timertask;//添加时间
定时器,每1000毫秒进行更新
int m = Integer.parseInt(ShowTime.getText()); m--; ShowTime.setText("" + m); if (m <= 0) { tmr.stop(); JOptionPane.showMessageDialog(null, "超出答题时间!"); this.setVisible(false); }
文本框进行显示,超出时间弹出消息框提示。
ShowTime.setText(String.valueOf(settingtime.getText()));//在显示时间框里显示以获取的时间 int n1=120,n2=5; if(n1<(Integer.parseInt(ShowTime.getText()))) {//当设置时间超过120秒,弹出对话框 JOptionPane.showMessageDialog(null, "时间不能超过120秒!"); this.setVisible(false); } if(n2<(Integer.parseInt(titlenumber.getText()))) {//当选择题目个数超过5个,弹出对话框 JOptionPane.showMessageDialog(null, "选择题数不能超过5个!"); this.setVisible(false); } tmr.start();//开始计时
通过点击开始按钮事件获取文本框用户输入的时间,若输入的时间大于120s不会被允许。
五、问题解决
在写代码时候的确是遇到问题,在写菜单栏的时候,菜单栏目的子事件不能通过
actionPerformed(ActionEvent e)的getresource来获取到菜单栏目的事件,本来打算把背景颜色的设置放置菜单栏目,这样子比较好看美观,
通过观看了几篇博客,发现一下在弄不出来,只能进行简单的处理化,直接定义按钮来进行解决。而后就是阶乘计算答案,还没做的时候可能会觉得比较麻烦,
动起手来发现简单粗暴,利用一个for循环就能解决到问题。我设置了用户登录界面,现在想怎么把他文本框输入的值传回到主框架中。还没想到解决的方法。
六、运行效果截图
1.主界面
2.背景颜色的改变
(点击一次)
(点击第二次)
3.用户登录功能
(实际功能未实现)
4.设置时间和题目
(合法输入)
(非法输入)
超时间提示
5.答案判断
附图:统计表
PSP2.1 |
Personal Software Process Stages |
Time Senior Student(h) |
Time(h) |
Planning |
计划 |
0 |
0 |
· Estimate |
估计这个任务需要多少时间 |
7 |
8 |
Development |
开发 |
1 |
1.5 |
· Analysis |
需求分析 (包括学习新技术) |
0.1 |
0.3 |
· Design Spec |
生成设计文档 |
0 |
0 |
· Design Review |
设计复审 |
3 |
1 |
· Coding Standard |
代码规范 |
0.1 |
0.1 |
· Design |
具体设计 |
0.5 |
1 |
· Coding |
具体编码 |
1 |
1 |
· Code Review |
代码复审 |
1 |
1.1 |
· Test |
测试(自我测试,修改代码,提交修改) |
0.5 |
1 |
Reporting |
报告 |
0 |
0 |
Test Report |
测试报告 |
0 |
0.5 |
·workload |
计算工作量 |
0 |
0.5 |
·correction |
并提出过程改进计划 |
0 |
0 |
结对编程分工:
背景颜色设置,整数相加减乘除,时间更新(何凯江 博客地址:http://www.cnblogs.com/hekairui/)
页面布局,点击时间处理,答案判断,阶乘计算,代码细节等其余是我弄的
结对同伴:何凯江 201606120010(图右) 20160612003陈廷钦(本人)
结对照片: