• 软件工程第二次作业——结对编程


    软件工程第二次作业——结对编程

    结对编程成员: coding :地址

    乔晶玮1500802040 :博客地址

    许春晓1500802042:博客地址

    上传coding三次:

    编程内容:

    {import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    /**

    • 一个计算器,与Windows附件自带计算器的标准版功能、界面相仿。 但还不支持键盘操作。
      /
      public class Calculator extends JFrame implements ActionListener {
      /
      * 计算器上的键的显示名字 /
      private final String[] KEYS = { "7", "8", "9", "/", "sqrt", "4", "5", "6",
      "
      ", "%", "1", "2", "3", "-", "1/x", "0", "+/-", ".", "+", "="};
      /** 计算器上的功能键的显示名字 /
      private final String[] COMMAND = { "Backspace", "CE", "C"};
      /
      * 计算器左边的M的显示名字 /
      private final String[] M = { " ", "MC", "MR", "MS", "M+"};
      /
      * 计算器上键的按钮 /
      private JButton keys[] = new JButton[KEYS.length];
      /
      * 计算器上的功能键的按钮 /
      private JButton commands[] = new JButton[COMMAND.length];
      /
      * 计算器左边的M的按钮 /
      private JButton m[] = new JButton[M.length];
      /
      * 计算结果文本框 /
      private JTextField resultText = new JTextField("0");
      // 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字
      private boolean firstDigit = true;
      // 计算的中间结果。
      private double resultNum = 0.0;
      // 当前运算的运算符
      private String operator = "=";
      // 操作是否合法
      private boolean operateValidFlag = true;
      /
      *
    • 构造函数
      /
      public Calculator() {
      super();
      // 初始化计算器
      init();
      // 设置计算器的背景颜色
      this.setBackground(Color.LIGHT_GRAY);
      this.setTitle("计算器");
      // 在屏幕(500, 300)坐标处显示计算器
      this.setLocation(500, 300);
      // 不许修改计算器的大小
      this.setResizable(false);
      // 使计算器中各组件大小合适
      this.pack();
      }
      /
      *
    • 初始化计算器
      */
      private void init() {
      // 文本框中的内容采用右对齐方式
      resultText.setHorizontalAlignment(JTextField.RIGHT);
      // 不允许修改结果文本框
      resultText.setEditable(false);
      // 设置文本框背景颜色为白色
      resultText.setBackground(Color.WHITE);
      // 初始化计算器上键的按钮,将键放在一个画板内
      JPanel calckeysPanel = new JPanel();
      // 用网格布局器,4行,5列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
      calckeysPanel.setLayout(new GridLayout(4, 5, 3, 3));
      for(int i = 0; i < KEYS.length; i++) {
      keys[i] = new JButton(KEYS[i]);
      calckeysPanel.add(keys[i]);
      keys[i].setForeground(Color.blue);
      }
      // 运算符键用红色标示,其他键用蓝色表示
      keys[3].setForeground(Color.red);
      keys[8].setForeground(Color.red);
      keys[13].setForeground(Color.red);
      keys[18].setForeground(Color.red);
      keys[19].setForeground(Color.red);
      // 初始化功能键,都用红色标示。将功能键放在一个画板内
      JPanel commandsPanel = new JPanel();
      // 用网格布局器,1行,3列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
      commandsPanel.setLayout(new GridLayout(1, 3, 3, 3));
      for(int i = 0; i < COMMAND.length; i++) {
      commands[i] = new JButton(COMMAND[i]);
      commandsPanel.add(commands[i]);
      commands[i].setForeground(Color.red);
      }
      // 初始化M键,用红色标示,将M键放在一个画板内
      JPanel calmsPanel = new JPanel();
      // 用网格布局管理器,5行,1列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
      calmsPanel.setLayout(new GridLayout(5, 1, 3, 3));
      for(int i = 0; i < M.length; i++) {
      m[i] = new JButton(M[i]);
      calmsPanel.add(m[i]);
      m[i].setForeground(Color.red);
      }
      // 下面进行计算器的整体布局,将calckeys和command画板放在计算器的中部,
      // 将文本框放在北部,将calms画板放在计算器的西部。
      // 新建一个大的画板,将上面建立的command和calckeys画板放在该画板内
      JPanel panel1 = new JPanel();
      // 画板采用边界布局管理器,画板里组件之间的水平和垂直方向上间隔都为3象素
      panel1.setLayout(new BorderLayout(3, 3));
      panel1.add("North", commandsPanel);
      panel1.add("Center", calckeysPanel);
      // 建立一个画板放文本框
      JPanel top = new JPanel();
      top.setLayout(new BorderLayout());
      top.add("Center", resultText);
      // 整体布局
      getContentPane().setLayout(new BorderLayout(3, 5));
      getContentPane().add("North", top);
      getContentPane().add("Center", panel1);
      getContentPane().add("West", calmsPanel);
      // 为各按钮添加事件侦听器
      // 都使用同一个事件侦听器,即本对象。本类的声明中有implements ActionListener
      for(int i = 0; i < KEYS.length; i++) {
      keys[i].addActionListener(this);
      }
      for(int i = 0; i < COMMAND.length; i++) {
      commands[i].addActionListener(this);
      }
      for(int i = 0; i < M.length; i++) {
      m[i].addActionListener(this);
      }
      }

    以上为部分代码。
    经过修改以后,我们实现了相应的自动出题的功能,以下为核心代码:

    class Teacher {
    private int num1;
    private int num2;
    private String operator;
    public Teacher()
    {
    Random random = new Random();
    num1 = random.nextInt(100);
    num2 = random.nextInt(100);
    int opNum = random.nextInt(4);
    if(opNum == 0) operator = "+";
    if(opNum == 1) operator = "-";
    if(opNum == 2) operator = "*";
    if(opNum == 3) operator = "/";
    }
    public boolean isRight(double result)
    {
    System.out.println(num1+ operator + num2 + "=" + result);
    if(operator.equals("+"))
    {
    System.out.println(num1+num2);
    return result == (num1+num2);
    }

    	else if(operator.equals("-"))
    
      {
    
    		System.out.println(num1-num2);
    		return result == (num1-num2);
    
      }
    
    	else if(operator.equals("*"))
    
      {
    
    		System.out.println(num1*num2);
    		return result == (num1*num2);
    
      }
    
    	else if(operator.equals("/"))
    
      {
    
    		System.out.println(((double)num1/(double)num2));
    		return Math.abs(result-(double)num1/(double)num2) < 0.001;
    
      }
    
    	return false;
    

    }
    public int getNum1() {
    return num1;
    }
    public void setNum1(int num1) {
    this.num1 = num1;
    }
    public int getNum2() {
    return num2;
    }
    public void setNum2(int num2) {
    this.num2 = num2;
    } public String getOperator() {
    return operator;
    }
    public void setOperator(String operator) {
    this.operator = operator;
    }
    并进行了倒计时程序的改写,下面是核心代码:
    class TimerLabel extends JLabel {

    private int maxTime;
    private int count;
    private static final int SECOND = 1000;
    private static final int FONT_SIZE = 36;
    private Thread thread;
    private boolean pause;
    private boolean start;
    

    /**
    * 新建一个计时标签
    *倒计时起始时间
    */
    public TimerLabel(int maxTime) {
    this.setHorizontalAlignment(JLabel.CENTER);
    this.setFont(new Font("Times New Roman", Font.BOLD, FONT_SIZE));
    this.pause = false;
    setMaxTime(maxTime);
    }

    /**
    * 修改倒计时起始时间
    * 新的起始时间
    */
    public void setMaxTime(int maxTime) {
    if (this.start) {
    return;
    }
    this.maxTime = maxTime;
    this.count = maxTime;
    initText();
    this.thread = new Thread(new Runnable() {

            @Override
            public void run() {
                while (count != 0) {
                    try {
                        if (!start) {
                            count = 0;
                            initText();
                            break;
                        }
                        if (!pause) {
                            Thread.sleep(SECOND);
                            count--;
                            initText();
                        }
                    } catch (InterruptedException ex) {
                        pause = true;
                    }
                }
                done();
            }
        });
        this.start = false;
    }
    
    /**
     * 倒计时完成后调用此方法
     */
    protected void done() {
        JOptionPane.showMessageDialog(this, "Time up!");
    }
    
    /**
     * 标签字符由此方法设置
     */
    protected void initText() {
        String min = String.valueOf(count / 60);
        String sec = String.valueOf(count % 60);
        while (min.length() < 2) {
            min = "0" + min;
        }
        while (sec.length() < 2) {
            sec = "0" + sec;
        }
        this.setText(min + ":" + sec);
    }
    
    /**
     * 暂停
     */
    public void pause() {
        if (start) {
            thread.interrupt();
        }
    }
    
    /**
     * 检测标签倒计时是否开始
     * @return 如果开始返回true
     */
    public boolean isStart() {
        return start;
    }
    
    /**
     * 得到倒计时起始时间
     * 倒计时起始时间
     */
    
    public boolean isPause() {
        return pause;
    }
    
    /**
     * 从暂停中恢复计时
     */
    public void continueDo() {
        if (this.pause) {
            this.pause = false;
        }
    }
    
    /**
     * 取消计时
     */}
    

    结果:



    注:部分征用了网上的代码,为了美观那些键都没有去掉,但是并没有相关的功能,望谅解。

    计时出题软件详解:

    点击start会开始答题,同时旁边会有计时器开始倒计时,必须在限定时间内答完题目(我设置的初始时间为10s)

    如果规定时间内没有答完,会跳出时间截止的窗口,并更换下一题。

    在规定时间内答完题目的话会弹出正确或者错误的窗口,同时时间清零,这时候是为了方便大家停下来检查自己的错误,
    同时,在检查完之后可以按start键重新开始。如下图:

    合作照片:

    因为昨天只有一节课,再加上晚上和今天中午的时间加班加点的完成了这次任务,因为没有看清要求擅自做题是我的失误,希望助教同学和老师可以原谅。

    心得体会:

    经过这次编写程序,我加深了对Java语言的认识,我认为Java才是世界上最好的语言!这次我们的作业不算尽善尽美,因为时间确实没够,我可能有一点的功能没有实现,但是结果保证都是正确的,我以后会更加努力,一定会编写出一个完美的计算器来,最后再说一遍,Java是世界上最好的语言。

  • 相关阅读:
    统一回复《怎么学JavaScript?》
    nodejs配置简单HTTP服务器
    web跨域解决方案
    JavaScript 调试小技巧
    我从编程总结的 22 个经验
    Sublime Text 3103 Crack 破解 注册码(亲测有效)
    mstsc 远程序桌面登录的 c#开发
    突然顿悟的Javascript中的this
    解决Electron加载带jquery的项目报错问题
    ES6+ 开发 React 组件
  • 原文地址:https://www.cnblogs.com/xuchunxiao119/p/6838443.html
Copyright © 2020-2023  润新知