个人工作流程
PSP阶段 | 预计时间(h) |
实际时间(h) |
计划 | 1 | 0.5 |
|
1 | 0.5 |
开发 | 18.5 | 19 |
|
1 | 0.5 |
|
1 | 1.5 |
|
1 | 0.5 |
|
0.5 | 0.5 |
|
2 | 3 |
|
8 | 10 |
|
2 | 1 |
|
3 | 2 |
报告 |
4 | 3 |
|
2 | 1 |
|
1 | 1 |
|
1 | 1 |
1、计划:
编写一个软件,可以完成对100以内的加减法进行出题,并能通过测试来记录成绩和答题时间
2、需求分析:
用户需求:作为一名小学生家长,希望有一个软件,能够自动给出100以内的加减运算,并判断答案,统计正确率,以便能够减轻我的压力
软件需求:①、软件给的数字范围应该是0~100的整数;
②、软件能够自动随机给出N组题,并且题目不能重复;
③、在用户完成题目后,软件能够自动判断用户完成的结果和完成时间;
④、软件还可以根据用户的完成结果来和用户进行不同的互动
3、生成设计文档
4、设计复审
5、代码规范:
使用的eclipse工具,代码比较规范
6、具体设计:
先生成两个随机数,将这两个随机数进行运算,作为一个表达式;
创建一个页面,有若干个按钮可以控制开始和结束,将表达式传入页面当中,由用户来进行运算,最后进行统计结果。
7、具体代码
package operation; import java.util.Random; public class JiSuan { // 定义一个数组,用来存储“+”“-”符号 static String[] str = { "+", "-" }; // 创建随机数对象 static Random random = new Random(); // 创建两个0~100的随机数num1和num2 static int num1 = random.nextInt(101); static int num2 = random.nextInt(101); // 将数组str中的元素随机赋值给s static String s = str[random.nextInt(2)]; // 创建一个习题方法,返回一个字符串类型的表达式(生成的是习题表达式) public static String xiti() { // 创建随机数对象num1和num2和随机运算符号 num1 = random.nextInt(101); num2 = random.nextInt(101); s = str[random.nextInt(2)]; //当运算符号为减号时,判断num1和num2的大小,如果num1<num2,则需要重新随机生成num1 if(s=="-"){ while(num1<num2) { num1 = random.nextInt(101); } // 返回一个字符串类型的运算表达式 return num1 + "" + s + "" + num2 + "="; } // 返回一个字符串类型的运算表达式 return num1 + "" + s + "" + num2 + "="; } // 创建一个运算的方法,返回一个结果 public static int jieguo() { // 先初始化结果为0 int result = 0; // 通过switch语句判断随机生成的运算符号s是哪种,并进行运算 switch (s) { case "+": result = num1 + num2; break; case "-": result = num1 - num2; break; } return result; } }
package operation; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Font; 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.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; public class YeMian { /* * jtf_result.getText() 用户给出的答案 * JiSuan.jieguo() 计算机计算的答案 * redo 按钮:再做一遍 * jt 显示做题结果的文本框 */ // 设置一个页面,可以用图形化界面容器JFrame来实现 static JFrame jf = new JFrame(); // 主界面 static JPanel pan1 = new JPanel(); // 主界面最上方面板 static JPanel pan2 = new JPanel(); // 主界面中间面板 static JPanel pan3 = new JPanel(); // 主界面最下方面板 // 声明一个字符串类型的表达式,用来接收计算类传来的字符串表达式 static String str = ""; // 声明一个文本框类型的数组,用来在页面存储表达式 static JTextField[] jTextFields = new JTextField[10]; // 初始化一个变量i,i用来存储写了几道题 static int i = 0; // 初始化一个变量right,right用来存储答对了几道题 static int right = 0; static long begin=0; static long end= 0; public static void main(String[] args) { // 设置主页面格式 jf.setSize(800, 600); jf.setLayout(new BorderLayout()); jf.setLocationRelativeTo(null); // 设置上方格式 pan1.setBackground(Color.YELLOW); pan1.setSize(800, 150); pan1.setLayout(new FlowLayout()); // 创建一个JTextField对象jtf,用于显示单行文本(20表示列数,用于计算文本宽度) JTextField jtf = new JTextField(20); // 将JiSuan类中xiti方法得到的表达式赋值给str str = JiSuan.xiti(); // 将str作为参数传到数组jtf当中 jtf.setText(str); jtf.setSize(400, 100); jtf.setEditable(false); jtf.setLocation(300, 25); jtf.setFont(new Font("微软雅黑", 1, 20)); pan1.add(jtf); // 创建一个JTextField对象jtf_result,用于输入计算结果 JTextField jtf_result = new JTextField(5); jtf_result.setFont(new Font("微软雅黑", 1, 20)); pan1.add(jtf_result); // 创建一个按钮,点击按钮后生成下一个表达式 JButton jb = new JButton("下一题"); pan1.add(jb); // 设置中间布局 pan2.setLayout(new GridLayout(5, 2)); // 利用循环生成表达式 for (int i = 0; i < 10; i++) { jTextFields[i] = new JTextField(); // 设置文本框字体 jTextFields[i].setFont(new Font("微软雅黑", 1, 20)); // 设置文本框为不可编辑 jTextFields[i].setEditable(false); // 循环生成文本框,并将文本框添加到中间面板中 pan2.add(jTextFields[i]); } // 设置用于显示做题结果的文本框 JTextField jt = new JTextField(40); jt.setFont(new Font("微软雅黑", 1, 15)); jt.setEditable(false); // 用于清空所有信息,并重新开始答题 JButton redo = new JButton("再做一遍"); // 将文本框和按钮添加到页面底部布局中 pan3.add(jt); pan3.add(redo); // 添加一个按钮事件 jb.addActionListener(new ActionListener() { // 编写一个程序运行的方法,判断用户答题成绩 public void actionPerformed(ActionEvent arg0) { // 当用户没有输入答案时 if (jtf_result.getText().equals("")) { jTextFields[i].setText(str + jtf_result.getText() + " × 正确结果为:" + JiSuan.jieguo()); // 当用户给的答案和计算机给的答案相同时 } else if (jtf_result.getText().equals(JiSuan.jieguo()+"")) { jTextFields[i].setText(str + jtf_result.getText() + " √"); right++; // 当用户给的答案和计算机给的答案不同时 } else { jTextFields[i].setText(str + jtf_result.getText() + " × 正确结果为:" + JiSuan.jieguo()); } // 变更下一题 i++; str = JiSuan.xiti(); jtf.setText(str); jtf_result.setText(""); jtf_result.requestFocus(); // 判断10题是否全部做完时 if (i == 10) { //记录程序结束的时间 end= System.currentTimeMillis(); jb.setEnabled(false); // 输出成绩 jt.setText("你答对了" + right + "道题,答错了" + (10 - right) + "道题,正确率为:" + (right / 10.0)+",耗费时间"+((end-begin)/1000)+"秒"); // 如果答对了10道题 if(right==10) { JOptionPane.showMessageDialog(null, "全部回答正确,你真棒"); }else if(right>7){ JOptionPane.showMessageDialog(null, "恭喜你答对了" + right + "道题"+" Great!"); }else if (right>4) { JOptionPane.showMessageDialog(null, "你答对了" + right + "道题"+"加油!"); }else { JOptionPane.showMessageDialog(null, "You are a loser,加油,你是最没用的!"); } } } }); //当点击再做一次时,调用此方法 redo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { //重新对文本框传递表达式 str = JiSuan.xiti(); jtf.setText(str); //遍历文本框数组,将数组中的内容初始化 for (int i = 0; i < 10; i++) { jTextFields[i].setText(""); } //初始化文本框、答题数、答对的题数 jt.setText(""); i = 0; right = 0; begin=System.currentTimeMillis(); //更改按钮为可用的 jb.setEnabled(true); } }); //将面板添加到界面里,然后设置可见 jf.add(pan1, BorderLayout.NORTH); jf.add(pan2, BorderLayout.CENTER); jf.add(pan3, BorderLayout.SOUTH); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //记录程序开始的时间 begin = System.currentTimeMillis(); } }
8、代码复审:
使用开发工具,能够快捷的找出程序的缺陷并进行修改
9、测试
10、测试报告:刚开始,程序出现许多问题,例如界面出不来;两个数字相减后出现负数;输入正确答案判定为错误;耗费时间累加,不初始化等等,
但是在朋友的帮助下,问题一个个解决了
11、计算工作量
12、总结:
在刚开始的时候觉得做一个0~100的加减运算的程序十分简单,而且老师也对需求分析有所提示,在完成具体设计之前感觉都很顺利,但到具体设计时,发现自己寸步难行,在控制台上输出加减运算十分容易,但是要做一个页面,在页面上让用户计算却十分艰难,发现自己能力非常欠缺;在朋友的帮助下,渐渐有了思路,但代码的编写总是红色的线到处横行,最终在朋友的帮助下得以完成。但程序还不够完美,存在一些缺陷,可以再进行修改提升。
有些东西看着十分简单,但是动手去做的时候却毫无头绪,根本不像看上去那么简单,自己的能力不够,对于语言的掌握不牢靠,有的都不认识,下一步要更加努力学习,提高自身水平。
加油!我们是最没用的!!!