软件工程第二次作业——结对编程
软件工程第二次作业——结对编程
结对编程成员: 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是世界上最好的语言。