• 四则运算的改进


    小组成员、学号:杨立鑫 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+"道题
    
    总分是"+sum+"
    
    总用时为:"+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

  • 相关阅读:
    终于搞明白Unicode,ASCII,UTF8,UCS2编码是啥了
    在IDEA中构建Tomcat项目流程
    在执行jar包时如何使用调优参数
    在浏览器运行JS脚本实现博客园文章批量删除
    线索二叉树之初步剖析(献给那些想形象思考二叉树遍历过程的人)
    二分查找c++实现
    c++学习之初话 函数指针和函数对象 的因缘
    继承与动态内存分配
    C++入门之初话多态与虚函数
    c++入门之类继承初步
  • 原文地址:https://www.cnblogs.com/yaq233/p/6552779.html
Copyright © 2020-2023  润新知