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

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

结对编程成员: 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是世界上最好的语言。

原文地址:https://www.cnblogs.com/xuchunxiao119/p/6838443.html