四则运算“软件”之升级版
作业来源: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); } }
七、总结心得
这个项目的完成遇到了很多困难,请教了很多师兄师姐的帮助。
程序还是不够全面,很多地方都没有完善。
八、结对工作照片