作业要求地址:http://www.cnblogs.com/xiangxuer/p/9695909.html
github地址:https://github.com/GVictory/MakeOutQuestions
前言:
上软件工程课中出现了一道例子,即阿超做了一个简单的四则运算用于给他儿子出题,为了练手,将在于此模仿阿超将简单的四则运算做出来,该四则运算为初步版本,仅仅包含正整数的加减乘除,不包括括号。
题目要求:
任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:23 - 3 * 4 = 11
所用版本:
操作系统:windows10
开发环境:intellij IDEA 2016.4
开发语言:java
实现思路:
这个程序分两个步骤,第一个是出题,第二个是解题,出题即使用stringbuilder的方式将字符串拼接起来,将四个操作字符归为一个字符组,然后使用随机函数随机获取,数字也是采用随机函数获得的。第二个是解题,解题使用到了栈,将每一个遇到的数字入到数字栈,将每一个遇到的操作字符进行判断,如果为*或/就直接取出数字栈的数字进行运算,如果遇到+或-则压入操作栈中,当将所有的数字压入栈后,最后将所有的数字按栈的数字进行加减运算。
个人软件过程耗时估计与统计表:
| Personal Software Process Stages | Time Senior Student | Time |
| 计划 | 1 | 1 |
| 估计这个任务需要多少时间 | 4 | 6 |
| 开发 | 1 | 2 |
| 需求分析 (包括学习新技术) | 0.5 | 0.5 |
| 生成设计文档 | 0.5 | 0.5 |
| 设计复审 | 0.5 | 0 |
| 代码规范 | 0 | 0.5 |
| 具体设计 | 0.5 | 0.5 |
| 具体编码 | 1 | 2 |
| 代码复审 | 0.5 | 0.5 |
| 测试(自我测试,修改代码,提交修改) | 0.5 | 0.5 |
| 报告 | 0.5 | 0.5 |
| 测试报告 | 0.5 | 0.5 |
| 计算工作量 | 2 | 2 |
| 并提出过程改进计划 | 1 | 1 |
实现代码:
设计一个栈出来:
1 public class Stack<T> {
2 private int top;
3 private List<T> list;
4
5 public Stack() {
6 top=-1;
7 list=new ArrayList<T>();
8 }
9
10 public T getTop(){
11 return list.get(top);
12 }
13
14 public T pop(){
15 T template=list.get(top);
16 list.remove(top);
17 top--;
18 return template;
19 }
20
21 public T push(T data){
22 list.add(data);
23 top++;
24 T template=list.get(top);
25 return template;
26 }
27
28 public Boolean isEmpty(){
29 if (top==-1){
30 return true;
31 }else {
32 return false;
33 }
34 }
35 }
编写创建题目函数:
1 private static String getQuestion(Integer operatorNumber,Integer numberRange){
2 char[] operator = new char[]{‘+‘, ‘-‘, ‘*‘, ‘/‘};
3 Random random = new Random();
4 StringBuilder stringBuilder = new StringBuilder();
5 for (int operatorIndex = 0; operatorIndex < operatorNumber; operatorIndex++) {
6 stringBuilder.append(random.nextInt(numberRange+1));
7 stringBuilder.append(operator[random.nextInt(4)]);
8 }
9 stringBuilder.append(random.nextInt(numberRange+1));
10 return stringBuilder.toString();
11 }
编写解题函数:
1 private static Float getAnswer(String question){
2 Stack<Character> operatorStack=new Stack<Character>();
3 Stack<Float> numberStack=new Stack<Float>();
4 char operatorTemp;
5 StringBuilder numberTemp=new StringBuilder();
6 for (int questionIndex=0;questionIndex<question.length();questionIndex++){
7 char singleChar=question.charAt(questionIndex);
8 if (Character.isDigit(singleChar)){
9 numberTemp.append(singleChar);
10 }else {
11 if (!operatorStack.isEmpty()&&operatorStack.getTop()==‘*‘){
12 operatorStack.pop();
13 numberStack.push(numberStack.pop()*Float.valueOf(numberTemp.toString()));
14 }else if (!operatorStack.isEmpty()&&operatorStack.getTop()==‘/‘){
15 operatorStack.pop();
16 numberStack.push(numberStack.pop()/Float.valueOf(numberTemp.toString()));
17 }else if(!operatorStack.isEmpty()&&operatorStack.getTop()==‘-‘){
18 numberStack.push(-Float.valueOf(numberTemp.toString()));
19 }else {
20 numberStack.push(Float.valueOf(numberTemp.toString()));
21 }
22 operatorStack.push(singleChar);
23 numberTemp.delete(0,numberTemp.length());
24 }
25 }
26 if (!operatorStack.isEmpty()&&operatorStack.getTop()==‘*‘){
27 numberStack.push(numberStack.pop()*Float.valueOf(numberTemp.toString()));
28 operatorStack.pop();
29 }else if (!operatorStack.isEmpty()&&operatorStack.getTop()==‘/‘){
30 numberStack.push(numberStack.pop()/Float.valueOf(numberTemp.toString()));
31 operatorStack.pop();
32 }else if(!operatorStack.isEmpty()&&operatorStack.getTop()==‘-‘){
33 numberStack.push(-Float.valueOf(numberTemp.toString()));
34 }else {
35 numberStack.push(Float.valueOf(numberTemp.toString()));
36 }
37 while (!operatorStack.isEmpty()){
38 operatorStack.pop();
39 numberStack.push(numberStack.pop()+numberStack.pop());
40 }
41 return numberStack.pop();
42 }
43 }
编写启动主类代码:
1 public static void main(String[] args) {
2 Scanner scanner = new Scanner(System.in);
3 HashMap<String, Float> hashMap = new HashMap<>();
4 System.out.print("请输入需要创建的题目的个数:");
5 int count = scanner.nextInt();
6 String questionTemp;
7 float answertemp;
8 for (int index = 0; index < count; index++) {
9 do {
10 questionTemp = getQuestion(2, 100);
11 answertemp = getAnswer(questionTemp);
12 } while (answertemp < 0);
13 hashMap.put(questionTemp, answertemp);
14 }
15 Set<Map.Entry<String, Float>> ms = hashMap.entrySet();
16 for (Map.Entry entry : ms) {
17 System.out.println(entry.getKey() + "=" + entry.getValue());
18 }
19 }
运行结果:

总结:
这个程序相对比较简单,主要是对进栈出栈的应用,其重点在于如何进栈的点和出栈的把握。
原文:https://www.cnblogs.com/GMUK/p/9845805.html