向隅而泣

导航

 

小组成员、学号:杨立鑫 201421123100 杨爱清201421123099

需求分析:

  在原来的程序基础上,我认为还需要以下几个功能:
  1.能够自由选择题目个数,能够生成加减乘除运算,包括分数运算。此外最好能实现阶乘运算
  2.最好能给定时间记时,在完成答题时给出答题时间,有利于在答题效率上给出正确评估。
  3.能够实现中英切换,增加适用人群
  4.能够设计出美观的图形界面,更加亲和用户。

三、程序设计:

  1、完成计时功能。

2、实现图形界面。
二、程序设计

对上次程序分的四个类,我根据期望对其进行了优化:

上次:
1.Calculate
用于实现加减乘除运算,以及数字大小的比较
2.Dofrac
用于检查答案,随机创建分数,求最大公约数,生成算式并求得计算结果
3.Fraction
用于生成分数与分数化简
4.Generator
主类,生成主界面

优化:
1.Frame
经过实际变成优化,去掉不必要的代码,将Calculate,Dofrac,Fraction合为一个大类
在该类中实现的图形界面的设计,以及计时,出题,判断对错,以及异常处理(输入异常)等函数。
不仅实现了加减乘除,又添加了阶乘运算。
2.Generator
主类。生成主界面
三、代码展示

package javaapplication8;


import javax.swing.*;

import java.awt.event.*;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

class Frame extends JFrame implements ActionListener
{
    int a, b, c, count, num;//a,b分别是第一个操作数,第二个操作数,c是存放用户输入的答案,count是题目总数,num是用于存放代表运算符的数
    int t=0,f=0,sum=0,s=1;//s表示阶乘结果
    float d,d1;//d是用于存放除法结果,d1是用于处理除法结果中保留小数点后两位
    int counter=0;//统计答题个数
    Timer time;
    int t1 = 0;
    JTextField T;//定义一个文本
    JLabel L1 = new JLabel("请输入题目个数(1-5):");  
    JTextField T1 = new JTextField(5);   //放题目个数
    JButton B3 = new JButton("开始");
    JTextField T2 = new JTextField(10);  //设置运算式
    JTextField T3 = new JTextField(10);  //获取输入答案
    JTextField T4 = new JTextField(10);//存放答案提示
    JButton B1 = new JButton("确定");
    JButton B2 = new JButton("下一题");

    Frame() {
        T=new JTextField(10);//计时
        T.setEditable(false);
        time = new Timer(1000, this);
        time.start();
        T.setText(setTime(t1));
        this.setTitle("四则运算");
        this.setSize(280, 200);
        this.setVisible(true);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        JPanel p2 = new JPanel();
        JPanel p1 = new JPanel();
        p2.add(L1);
        p2.add(T1);
        p2.add(B3);
        p2.add(T2);
        p2.add(T3);
        p2.add(T4);
        p2.add(T);
        p1.add(B1);
        p1.add(B2);
        add(p2, "Center");
        add(p1, "South");
        
        B3.addActionListener(new ActionListener() {           //按钮B3表示开始
            public void actionPerformed(ActionEvent e) {
                boolean flag=false;
                Object bj = e.getSource(); // 获得事件源
                if (bj == B3) {
                    try{  //如果输入字符,抛出异常,提示错误
                    count = Integer.parseInt(T1.getText());  //将文本中获取的字符串转换为整型
                    }
                    catch(Exception f)
                    {
                        flag=true;
                    }
                    if(flag)
                    {
                        JOptionPane.showMessageDialog(null,"输入有误,请输入数字!");
                    }
                    if(count>5)
                    {
                        JOptionPane.showMessageDialog(null, "题目个数不能超过五个!请重新输入。");
                    }
                    if(count<=5)
                    {
                    num = (int) (Math.random() * 5);
                    a = (int) (Math.random() * 200) - 100;
                    b = (int) (Math.random() * 200) - 100;
                    if (num == 0)//num为0时,是加法运算
                    {
                        if (a < 0 && b < 0)       //判断a,b的正负并给负数加括号
                        {
                            T2.setText("(" + a + ")" + "+(" + b + ")=");
                        } 
                        else if (a < 0 && b > 0)
                        {
                            T2.setText("(" + a + ")" + "+" + b + "=");
                        } 
                        else if (a > 0 && b < 0)
                        {
                            T2.setText(a + "+(" + b + ")=");
                        } 
                        else
                        {
                            T2.setText(a + "+" + b + "=");
                        }
                        c = a + b;
                                              //处理按钮监听事件
                        
                    } else if (num == 1)  //num为1表示减法运算
                    {
                        if (a < 0 && b < 0)
                        {
                            T2.setText("(" + a + ")" + "-(" + b + ")=");
                        } 
                        else if (a < 0 && b > 0)
                        {
                            T2.setText("(" + a + ")" + "-" + b + "=");
                        } 
                        else if (a > 0 && b < 0) 
                        {
                            T2.setText(a + "-(" + b + ")=");
                        }
                        else 
                        {
                            T2.setText(a + "-" + b + "=");
                        }
                        c = a - b;
                        
                    } else if (num == 2) {   //num为2表示乘法运算
                        if (a < 0 && b < 0) {
                            T2.setText("(" + a + ")" + "*(" + b + ")=");

                        } else if (a < 0 && b > 0) {
                            T2.setText("(" + a + ")" + "*" + b + "=");

                        } else if (a > 0 && b < 0) {
                            T2.setText(a + "*(" + b + ")=");

                        } else {
                            T2.setText(a + "*" + b + "=");

                        }
                        c = a * b;
                    }
                     else if (num == 3&&b!=0) {   //num为3表示除法运算,并且要考虑除数不能为0的情况,因此b!=0
                            if (a < 0 && b< 0) {
                                T2.setText("(" + a + ")" + "/(" + b + ")=");

                            } else if (a < 0 && b > 0) {
                                T2.setText("(" + a + ")" + "/" + b + "=");

                            } else if (a > 0 && b< 0) {
                                T2.setText(a + "/(" + b + ")=");

                            } else {
                                T2.setText(a + "/" + b + "=");

                            }
                            d= (float)a/(float)b;  //将整型a,b强制转换为浮点型,保证结果正确
                            BigDecimal bg = new BigDecimal(d);   //将除法结果保留小数点后两位
                            d1 =(float)bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                        }
                     else
                     {
                         a=(int)(Math.random()*10);
                         T2.setText(a+"!=");
                         int i;
                         if(a==0||a==1)
                         {
                             s=1;
                         }
                         else
                         {
                         
                         for(i=1;i<=a;i++)//计算阶乘
                         {
                             s=s*i;
                         }
                         }
                     }

                }
            }
            }
        });    
        B2.addActionListener(new ActionListener() {           //B2表示下一题
            public void actionPerformed(ActionEvent e) {
                Object bj = e.getSource(); // 获得事件源
                if (bj == B2) {
                    int a, b, num, i = 1;
                    if (i < count) {   
                        T3.setText(null);//当按钮按下一题时就将T3与T4的内容更新
                        T4.setText(null);
                        num = (int) (Math.random() * 5);
                        a = (int) (Math.random() * 200) - 100;
                        b = (int) (Math.random() * 200) - 100;
                        i++;
                        if (num == 0) {
                            if (a < 0 && b < 0) {
                                T2.setText("(" + a + ")" + "+(" + b + ")=");
                            } else if (a < 0 && b > 0) {
                                T2.setText("(" + a + ")" + "+" + b + "=");
                            } else if (a > 0 && b < 0) {
                                T2.setText(a + "+(" + b + ")=");
                            } else {
                                T2.setText(a + "+" + b + "=");
                            }
                            c = a + b;
                        } else if (num == 1) {
                            if (a < 0 && b < 0) {
                                T2.setText("(" + a + ")" + "-(" + b + ")=");

                            } else if (a < 0 && b > 0) {
                                T2.setText("(" + a + ")" + "-" + b + "=");
                            } else if (a > 0 && b < 0) {
                                T2.setText(a + "-(" + b + ")=");
                            } else {
                                T2.setText(a + "-" + b + "=");
                            }
                            c = a - b;

                        } else if (num == 2) {
                            if (a < 0 && b < 0) {
                                T2.setText("(" + a + ")" + "*(" + b + ")=");

                            } else if (a < 0 && b > 0) {
                                T2.setText("(" + a + ")" + "*" + b + "=");

                            } else if (a > 0 && b < 0) {
                                T2.setText(a + "*(" + b + ")=");

                            } else {
                                T2.setText(a + "*" + b + "=");

                            }
                            c = a * b;


                        }
                        else if (num == 3&&b!=0) {
                            if (a < 0 && b < 0) {
                                T2.setText("(" + a + ")" + "/(" + b + ")=");

                            } else if (a < 0 && b > 0) {
                                T2.setText("(" + a + ")" + "/" + b + "=");
                            } else if (a > 0 && b < 0) {
                                T2.setText(a + "/(" + b + ")=");
                            } else {
                                T2.setText(a + "/" + b + "=");
                            }
                            d= (float)a/(float)b;
                            BigDecimal bg = new BigDecimal(d);
                            d1 =(float)bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                            

                        }
                        else
                         {
                             a=(int)(Math.random()*10);
                             T2.setText(a+"!=");
                             if(a==0||a==1)
                             {
                                 s=1;
                             }
                             else
                             {
                             
                             for(i=1;i<=a;i++)//计算阶乘
                             {
                                 s=s*i;
                             }
                             }
                         }
                        
                        counter++;
                        if(counter>=count)//判断题目是否答完,答完了就弹出一个提示题目答完并给出答题时间的对话框
                        {
                            JOptionPane.showMessageDialog(null, "题目已答完,答对了"+t+"道题,答错了"+f+"道题\n\n总分是"+sum+"\n\n总用时为:"+t1+"秒");
                        }
                    }
                }
            }
        });
        B1.addActionListener(new ActionListener() {        //按钮B1表示确定
            public void actionPerformed(ActionEvent e) {
                Object bj = e.getSource();     // 获得事件源
                if (bj == B1) {
                    if (d1== Float.parseFloat(T3.getText()) || c == Float.parseFloat(T3.getText()) || s ==Float.parseFloat(T3.getText())) {
                        T4.setText("恭喜你,答对了");
                        t=t+1;
                        sum=sum+20;//每答对一题加20分
                    } else {
                        T4.setText("抱歉,你答错了");
                        f=f+1;
                    }
                }
            }
        });

    }
    public void actionPerformed(ActionEvent e) {  
        t1= t1 + 1;            //累加时间
        T.setText(setTime(t1));
        
    }
    public String setTime(int t1) {//累加时间
        int hour, minute, second, a;
        String mytimer, strsec, strmin, strhour;
        t1=t1 % (60 * 60 * 24);
        second = t1 % 60;
        a = t1/ 60;
        minute = a % 60;

        hour = a / 60;
        if (second <= 9) {
            strsec = "0" + String.valueOf(second);
        } else {
            strsec = String.valueOf(second);
        }
        if (minute <= 9) {
            strmin = "0" + String.valueOf(minute);
        } else {
            strmin = String.valueOf(minute);
        }
        if (hour <= 9) {
            strhour = "0" + String.valueOf(hour);
        } else {
            strhour = String.valueOf(hour);
        }
        mytimer = "计时: " + strhour + ":" + strmin + ":" + strsec;
        return mytimer;
    }



}

四、程序运行

PSP

PSP2.1 Personal Software Process Stages Time (%) Senior Student(/hour) Time (%)(/hour)
· Planning 计划 2 1
· Estimate 估计这个任务需要多少时间 15 13
· Analysis 需求分析 (包括学习新技术) 2 1.5
· Coding Standard 代码规范 0.5 0.5
· Design 具体设计 1.5 1
· Coding 具体编码 10 7
· Test 测试(自我测试,修改代码,提交修改) 2 1.5
Reporting 报告 1 2

小结:

看到这周的实验题目之后我们就马上对实验的需求进行了分析,因为我的代码是用c来实现,所以经过一番讨论之后,我们决定用立鑫的java代码来实现这次实现,因为java能更好的实现图形界面。

过程中我们有很多不同的想法,产生了很多的分歧,经过分析和比较之后,我们选择了大家都能接受的解决方案,没有钻牛角尖,毕竟1+1还是大于1的,要充分认识这一点,团结合作,才能将两个人的力量发挥到最

大!后来经过我们两个人的共同努力,终于实现了图形界面和计时功能,但是由于时间问题,我们还没有实现四则运算的中英文切换,但是我们已经从别的小组那里学习到了如何做,后期我们会进行完善,通过不断的

学习,不断的努力,将项目做的更好。

这几天天气好冷,敲代码手好冷····,啥时候能天气转热,一边吃着西瓜一边讨论代码岂不快哉?QAQ

posted on 2017-03-15 11:30  向隅而泣  阅读(268)  评论(9编辑  收藏  举报