作业要求来自于https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2232
GitHub远程仓库的地址https://github.com/kunnkkk/16rg
结对同伴:林溢漫 学号:201606120099 博客地址:https://www.cnblogs.com/linyiman/p/9827457.html
注:这次的结对编程我们一起做了Java版和Web版的四则运算答题软件/系统。我们首先做的是Java版的四则运算答题软件,功能齐全,符合作业要求,而Web版是一个尝试的额外制作,初衷是令用户界面更美观、友好,但由于剩余的时间不多还有小部分功能未完善。
(Java版)四则运算
public class FourCalculations {...}
随机生成最多不能超过4个运算符,操作数小于100的单个四则运算式,并且能进行正确答案的计算。
public class FactorialCalculations {...}
设置随机数种子随机产生一个范围在1~20的数字,并且能进行正确的阶乘运算。
public class JudgeLabel extends JLabel {...}
创建一个JudgeLabel类用于显示图标“√”和“×”,若用户在答案区输入的答案正确,则图标为“√”,若用户在答案区输入的答案错误,则图标为“×”。
public class Window extends JFrame implements Runnable {...}
设计非控制台的用户界面,初始化各类按钮,主函数就在这个类里面,程序的执行从主函数里的代码语句开始。
用户界面
设置背景色
输入题目数,范围为1~5,否则出现信息提示,需要重新输入
四则运算开始计时
四则运算交卷判断答案正确与否
限时120秒交卷
阶乘题目开始计时
阶乘交卷判断答案正确与否
(1)计算四则运算式的正确结果。首先遍历存储在operators列表中的所有运算符,当有乘除时,就取出operations列表中位于此符号的左右两侧的操作数,然后进行四则运算。计算结束后要将此运算符和操作了的两个操作数从列表中移除,运算符容器的指针回到原来的位置。遍历完所有的乘号和除号后,再遍历operators列表中的所有加号和减号。
public int generateCorrectAnswer(List<String> operators, List<Integer> operations) { //遍历运算符容器,完成乘除运算 for (int i = 0; i < operators.size(); i++) { String operator = operators.get(i); if (operator.equals("*") || operator.equals("/")) { operators.remove(i); //乘除符号将其从集合中移除 int operateLeft = operations.remove(i); //拿运算符左侧的数字 int operateRight = operations.remove(i); //拿运算符右侧的数字 if (operator.equals("*")) operations.add(i, operateLeft * operateRight); else operations.add(i, operateLeft / operateRight); i--; //运算符容器的指针回到原来的位置,防止跳过下一个运算符 } } //遍历运算符容器,完成加减运算,当运算符容器为空时,运算结束 while (!operators.isEmpty()) { String operator = operators.remove(0); int operateLeft = operations.remove(0); int operateRight = operations.remove(0); if (operator.equals("+")) operateLeft = operateLeft + operateRight; else operateLeft = operateLeft - operateRight; operations.add(0, operateLeft); } return operations.get(0); }
(2)产生一个范围在1~20的随机数,进行阶乘运算,将最终得到的int整型运算结果result转换成String字符串类型。
//随机产生的阶乘数字 public int generateFormula() { Random random = new Random(); int num = random.nextInt(19)+1; //计算阶乘结果 int result = 1; for (int i = 1; i <= num; i++) { result*= i; } correctAnswerList.add(String.valueOf(result)); return num; }
(3)进行答案判断。首先判断用户进行的是四则运算操作还是阶乘运算操作,接着从答题区answerArea[]中取出用户输入的答案与标准正确答案进行对比,若相同,则在图标区显示“√”,若不相同,则表示用户计算结果不正确,图标区显示“×”,并且将答题区用户原先输入的答案修改为正确答案。
private void markingPapers() { if(fourCalculation == true) { for (int i = 0; i < answerArea.length; i++) { //System.out.println("answer:"+fourCalculations.correctAnswerList.get(i)); //System.out.println("input:"+answerArea[i].getText()); if (answerArea[i].getText().equals(fourCalculations.correctAnswerList.get(i))) { judgeLabel[i].setImageUrl("./FourOperations/src/main/img/right.png"); // 正确,显示“√”图标 numT++; } else { //answerArea[i].setText("错"); judgeLabel[i].setImageUrl("./FourOperations/src/main/img/error.png"); // 错误,显示“×”图标 answerArea[i].setText(fourCalculations.correctAnswerList.get(i)); //将用户输入的错误答案修改为正确答案 numF++; } } } else{ for (int i = 0; i < answerArea.length; i++) { //System.out.println("answer:"+fourCalculations.correctAnswerList.get(i)); //System.out.println("input:"+answerArea[i].getText()); if (answerArea[i].getText().equals(factorialCalculations.correctAnswerList.get(i))) { judgeLabel[i].setImageUrl("./FourOperations/src/main/img/right.png"); // 正确,显示“√”图标 numT++; } else { //answerArea[i].setText("错"); judgeLabel[i].setImageUrl("./FourOperations/src/main/img/error.png"); // 错误,显示“×”图标 answerArea[i].setText(factorialCalculations.correctAnswerList.get(i)); //将用户输入的错误答案修改为正确答案 numF++; } } } }
(4)设置时间线程显示用户答题时间。若用户在120s时仍未答题结束,则弹出提示框提示用户“时间已到,不能答题!”。
public void run() { // 完成时间计时 int second = 0; int minute = 0; String time; timeLabel.setText("用时 00:00"); // 初始化用时 while (true) { try { Thread.sleep(1000); // 按时间设置 } catch (InterruptedException e) { e.printStackTrace(); } second++; if (second == 60) { second = 0; minute++; } if (minute < 10) { time = "用时 " + "0" + minute + ":"; } else { time = "用时 " + minute + ":"; } if (second < 10) { time = time + "0" + second; } else { time = time + second; } if (minute == 2) { // 如果时间到120s,用户还未答完题,提示信息 JOptionPane.showMessageDialog(this, "时间已到,不能答题!"); submit(); return; } timeLabel.setText(time); } }
(5)设置用户界面的背景色。当用户单击“背景色”按钮时,会显示一个颜色选择界面,用户选择合适的背景色之后单击“确认”按钮,背景色就会改变。
// 背景色按钮 JButton changeButton = new JButton("背景色"); changeButton.setBounds(startX, startY+step*5, width, height); changeButton.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { Color color = JColorChooser.showDialog(outPanel, "背景色", outPanel.getBackground()); // 弹出颜色界面供用户自由选择背景色 if (color != null) { outPanel.setBackground(color); } }
(Web版)四则运算
首页选择答题数目与类型
选择题目数量进入简单运算,120秒倒计时开始,输入结果对比后判断对错和计算用时,确定返回主页
选择题目数量进入阶乘运算,120秒倒计时开始,输入结果对比后判断对错和计算用时,确定返回主页
答题超过120秒时按确认返回主页
总结
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
420 |
420 |
· Estimate |
估计这个任务需要多少时间 |
420 |
420 |
Development |
开发 |
420 |
420 |
· Analysis |
需求分析 (包括学习新技术) |
30 |
15 |
· Design Spec |
生成设计文档 |
0 |
0 |
· Design Review |
设计复审 |
20 |
40 |
· Coding Standard |
代码规范 |
120 |
120 |
· Design |
具体设计 |
30 |
35 |
· Coding |
具体编码 |
420 |
400 |
· Code Review |
代码复审 |
100 |
60 |
· Test |
测试(自我测试,修改代码,提交修改) |
120 |
120 |
Reporting |
报告 |
120 |
125 |
Test Report |
测试报告 |
0 |
0 |
·workload |
计算工作量 |
420 |
400 |
·correction |
并提出过程改进计划 |
0 |
0 |
遇到的问题/如何解决
收获体会
这次的结对编程我和我的同伴在完成程序的过程中合作很愉快,我们分工明确,在遇到困难时互相帮助,并且会自己查找不同的资料来解决编程的过程中所遇到的问题。在完成了java版的四则运算程序后,也抱着尝试和学习的想法制作了web版的四则运算,虽然由于时间问题还有一点点功能没做完,但从中我们也学习到了新的JavaScript的知识与逻辑运用。当然,在后续当中我还想把未完成的功能解决了,并且把web版的界面再做得更人性化和美观一点,而这就是后话了。
原文:https://www.cnblogs.com/kunnkkk/p/9809435.html