结对项目(简单四则运算升级并实现界面化)

作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2213

我的Github:https://github.com/CTqin/CTqin

一、基本要求

从个人项目出发,将程序改造成一个单机带用户界面(不是控制台)的程序,这个程序最基本要达到:

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

二、我做的扩展方向

  1. 程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.67而非2.66(保留两位小数功能实现,不支持出带括号题目)
  2. 可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8(function6实现)
  3. 用户答题结束以后,程序可以显示用户答题所用的时间(实现)
  4. 用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数(实现)
  5. 用户在第一次答题时,需要用户输入用户名,用户下次启动后,程序需要记住用户前一次输入的用户名 (此功能已经有了但是还没具体实现下来,日后会实现跟新)
  6. 程序可以出单个整数阶乘的题目:如:4!=24(function5实现)
  7. 程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。(实现)
  8. 程序可以设置皮肤功能,可以改变界面的颜色即可(按钮点击实现两种颜色切换)

三、开发环境下调试: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陈廷钦(本人)

结对照片:

 

原文地址:https://www.cnblogs.com/Tqin/p/9827836.html