作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2213
一、基本要求
从个人项目出发,将程序改造成一个单机带用户界面(不是控制台)的程序,这个程序最基本要达到:
- 自动生成题目,单个题目最多不能超过4个运算符,操作数小于100。
- 用户可以输入答案
- 若用户输入答案正确,则提示正确;若答案错误,则提示错误,并要提示正确答案是多少
二、我们做的扩展方向
实现逻辑上依旧是:出题(makeQuestions) 做题(calQuestion)印题(filePrint)三个方法。
而因为在第一次的个人项目中,就已经在makeQuestion方法中设置了参数,并且将随机数产生器单独列为一个方法(makeRandom),所以在这次的作业中可以很好的控制题目个数、数据范围、操作符个数。
三、开发环境下调试:Intelij IDEA

四、估计实现所需时间,记录结对编程时间。
| PSP2.1 | Personal Software Process Stages | Time Senior Student | Time |
| Development | 开发 | 250 | 260 |
| · Analysis | 需求分析 (包括学习新技术) | 20 | 30 |
| · Design Spec | 生成设计文档 | 0 | 0 |
| · Design Review | 设计复审 | 0 | 0 |
| · Coding Standard | 代码规范 | 15 | 18 |
| · Design | 具体设计 | 30 | 35 |
| · Coding | 具体编码 | 100 | 200 |
| · Code Review | 代码复审 | 5 | 8 |
| · Test | 测试(自我测试,修改代码,提交修改) | 15 | 12 |
| Reporting | 报告 | 10 | 10 |
五、部分代码实现
计算模块部分异常处理说明
import java.io.IOException;
public class Command {
public static void main(String args[]) {
String[] questionList = new String[105];
String path = "result.txt";
int sum = 0, ops = 1, minn = 1, maxx = 100;
boolean have_lv2_ops = false, have_bracket = false;
try {
for(int i=0; i<args.length; i++) {
if(args[i].equals("-n") ) {
sum = Integer.parseInt(args[++i]);
if(sum<0) {
System.out.println("错误:设置的题目个数应为正整数");
return;
}
}
else if(args[i].equals("-m")) {
minn = Integer.parseInt(args[++i]);
maxx = Integer.parseInt(args[++i]);
if(minn>maxx) {
System.out.println("错误:设置的最小值 :" + minn + "大于设置的最大值" + maxx);
return;
}
else if(maxx>1000 || minn<1) {
System.out.println("错误:设置的取值范围应在[1, 1000]之间");
return;
}
}
else if(args[i].equals("-o")) {
ops = Integer.parseInt(args[++i]);
if(ops<0) {
System.out.println("错误:设置的操作符个数应为正整数");
return;
}
}
else if(args[i].equals("-c")) {
have_lv2_ops = true;
}
else if(args[i].equals("-b")) {
have_bracket = true;
}
else {
System.out.println("错误: " + args[i] + "不是一个有效的命令,请输入有效的命令(-n, -m, -o, -c, -b)");
return;
}
}
} catch (Exception e) {
System.out.println("请输入有效的命令及其对应的参数");
System.out.println("设置题目个数为sum: -n sum sum为正整数");
System.out.println("设置题目上下界为[min, max]: -m min max min maxx应在[1, 1000]之间 ");
System.out.println("设置题目操作符个数为ops: -n ops");
System.out.println("设置题目中含有乘除法: -c");
System.out.println("设置题目中含有括号: -b");
}
Lib.makeQuestions(questionList, sum, ops, minn, maxx, have_lv2_ops, have_bracket);
try {
Lib.filePrint(questionList, sum, path);
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import javax.swing.*;
public class GUI extends JFrame{
private JTextField sum = new JTextField(5);
private JTextField min = new JTextField(2);
private JTextField max = new JTextField(2);
private JTextField ops = new JTextField(4);
private JRadioButton b2 = new JRadioButton();
private JRadioButton b1 = new JRadioButton();
private JButton Cre = new JButton("开始生成!");
public GUI() {
Font font = new Font("SansSerif",Font.BOLD,18);//设定字体
Font font2 = new Font("SansSerif",Font.CENTER_BASELINE,26);
Color color = new Color(50,150,50);
JPanel p1 = new JPanel();
JLabel title = new JLabel("欢迎使用四则运算题目生成系统!");
title.setFont(font2);
p1.add(title,BorderLayout.CENTER); //p1为标题
JPanel p2 = new JPanel();
p2.setLayout(new FlowLayout(FlowLayout.CENTER,10,20));
JLabel NOQ= new JLabel("需要的题目数量(1~10000):");
NOQ.setFont(font);
p2.add(NOQ);
p2.add(sum);//p2设定为题目数
JPanel p3 = new JPanel();
JLabel RON = new JLabel("题目的数值范围(下界1~100,上界50~1000):");
RON.setFont(font);
p3.add(RON);
p3.add(min);
p3.add(max);//p3设定上下界
//System.out.println(min1);
JPanel p4 = new JPanel();
JLabel NOO = new JLabel("题目中最多存在运算符数量:");
NOO.setFont(font);
p4.add(NOO);
p4.add(ops);//p4设定运算符数量
JPanel p5 = new JPanel();
JLabel isMul = new JLabel("题目中是否有乘除法(默认为无):");
isMul.setFont(font);
p5.add(isMul);
p5.add(b2);//设定乘除
JPanel p6 =new JPanel();
JLabel isBracket = new JLabel("题目中是否有括号(默认为无):");
isBracket.setFont(font);
p6.add(isBracket);
p6.add(b1);
p6.setFont(font);//设定括号
JPanel p7 =new JPanel();
Cre.setFont(font);
Cre.setBackground(color);
p7.add(Cre,BorderLayout.WEST);
JButton exit = new JButton("退出系统");
exit.setFont(font);
exit.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
System.exit(0);
}
});
exit.setBackground(new Color(200,250,250));
exit.setForeground(new Color(0,0,0));
p7.add(exit,BorderLayout.EAST);
setLayout(new GridLayout(7,1,5,2));
add(p1);
add(p2);
add(p3);
add(p4);
add(p5);
add(p6);
add(p7);
Cre.addActionListener(new ButtonListener());
}
public boolean actionPerformed(ActionEvent e ,JRadioButton b) {
if(b.isSelected())
return true;
else
return false;
}
private class ButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
int sum1 = Integer.parseInt(sum.getText());
int min1 = Integer.parseInt(min.getText());
int max1 = Integer.parseInt(max.getText());
int ops1 = Integer.parseInt(ops.getText());
String path = "result.txt";
boolean have_Mul = GUI.this.actionPerformed(e ,b2);
boolean have_Bra = GUI.this.actionPerformed(e ,b1);
//System.out.println(sum1+" "+min1+" "+max1+" "+ops1+" "+have_Mul+" "+have_Bra);
String[] questionList = new String[sum1+3];
Lib.makeQuestions(questionList, sum1, ops1, min1, max1, have_Mul, have_Bra);
try {
Lib.filePrint(questionList, sum1, path);
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
public static void main(String[] args) {
GUI frame = new GUI();
frame.setTitle("四则运算题目生成系统");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(1000,800);
}
}

七、总结心得
这个项目的完成遇到了很多困难,请教了很多师兄师姐的帮助。
程序还是不够全面,很多地方都没有完善。
八、结对工作照片


