四则运算练习器(基于控制台)

题目链接:http://www.cnblogs.com/HQL0301/p/7502315.htm

源码连接:https://gitee.com/a1234321/four_operations/tree/master

一.需求分析

?可以根据输入的题数和数值范围自动生成四则运算表达式。

?表达式包括“+ - * /”这四种运算符。

?可以进行分数的运算,如果题目中出现假分数,则转换成真分数。

?对题目答案进行批改对错,给出正确率。

二.功能设计

(1)基本功能

1.输入参数n,程序生成 n道四则运算题目.

2.用参数来控制生成的四则运算的数值范围.

3.用户可以对相应的题目进行做答.

4.对用户的答案进行判断对错,并给出正确率.

(2)扩展功能

1.查重复,不出现重复的题目(没有实现)

2.对假分数转换成带分数表示

(3)高级功能

1.用户回答正确可以获得相应的积分,错误会扣除相应的积分,积分可以兑换一定的礼品。(后续完善的时候再实现)

三.设计实现

使用java实现,基于控制台。根据所输入的长度,随机生成四则运算题目。

timu包是实现出题

calculate包是题目的做题业务实现

四.代码说明

  1 public class calculate<optStack> {
  2 private Map<String, Map<String, String>> priorityMap = new HashMap<String, Map<String, String>>();
  3 private Stack<String> optStack = new Stack<String>();
  4 private Stack<Double> numStack = new Stack<Double>();
  5
  6 public double calcualte1(String exp) {
  7 StringTokenizer vn = new StringTokenizer(exp);
  8 while (vn.hasMoreTokens()) {
  9 String token = vn.nextToken();
 10 transversion(token);
 11 }
 12 return numStack.pop();
 13 }
 14 public double calcualte(String exp) {
 15 char[] strExp = exp.toCharArray();
 16 for(char a: strExp){
 17 transversion(""+a+"");
 18 }
 19 return numStack.pop();
 20 }
 21
 22 private void transversion(String token) {
 23 while (false == "=".equals(optStack.peek()) || false == token.equals("=")) {
 24 if (true == judgenum(token)) {
 25 numStack.push(Double.parseDouble(token));
 26 break;
 27
 28 } else {
 29 String priority = priority(optStack.peek(), token);
 30 if ("<".equals(priority)) {
 31 optStack.push(token);
 32 break;
 33 } else if ("=".equals(priority)) {
 34 optStack.pop();
 35 break;
 36 } else {
 37 double res = calculate(optStack.pop(), numStack.pop(), numStack.pop());
 38 numStack.push(res);
 39 }
 40 }
 41 }
 42 }
 43
 44 private double calculate(String opt, double a1, double a2) {
 45 if ("+".equals(opt)) {
 46 return a2 + a1;
 47 } else if ("-".equals(opt)) {
 48 return a2 - a1;
 49 } else if ("*".equals(opt)) {
 50 return a2 * a1;
 51 } else if ("/".equals(opt)) {
 52 return a2 / a1;
 53 } else {
 54 throw new RuntimeException("unsupported operator:" + opt);
 55 }
 56 }
 57
 58 private boolean judgenum(String token) {
 59 int LEN = token.length();
 60 for (int ix = 0 ; ix < LEN ; ++ix) {
 61 char ch = token.charAt(ix);
 62 if (ch == ‘.‘) {
 63 continue;
 64 }
 65 if (false == judgenum(ch)) {
 66 return false;
 67 }
 68 }
 69 return true;
 70 }
 71
 72 private boolean judgenum(char ch) {
 73 if (ch >= ‘0‘ && ch <= ‘9‘) {
 74 return true;
 75 }
 76 return false;
 77 }
 78
 79 public String priority(String op1, String op2) {
 80 return priorityMap.get(op1).get(op2);
 81 }
 82
 83 public calculate() {
 84
 85 optStack.push("=");
 86 Map<String, String> subMap = new HashMap<String, String>();
 87 subMap.put("+", ">");
 88 subMap.put("-", ">");
 89 subMap.put("*", "<");
 90 subMap.put("/", "<");
 91 subMap.put("(", "<");
 92 subMap.put(")", ">");
 93 subMap.put("=", ">");
 94 priorityMap.put("+", subMap);
 95 // -
 96 subMap = new HashMap<String, String>();
 97 subMap.put("+", ">");
 98 subMap.put("-", ">");
 99 subMap.put("*", "<");
100 subMap.put("/", "<");
101 subMap.put("(", "<");
102 subMap.put(")", ">");
103 subMap.put("=", ">");
104 priorityMap.put("-", subMap);
105 // *
106 subMap = new HashMap<String, String>();
107 subMap.put("+", ">");
108 subMap.put("-", ">");
109 subMap.put("*", ">");
110 subMap.put("/", ">");
111 subMap.put("(", "<");
112 subMap.put(")", ">");
113 subMap.put("=", ">");
114 priorityMap.put("*", subMap);
115 // /
116 subMap = new HashMap<String, String>();
117 subMap.put("+", ">");
118 subMap.put("-", ">");
119 subMap.put("*", ">");
120 subMap.put("/", ">");
121 subMap.put("(", "<");
122 subMap.put(")", ">");
123 subMap.put("=", ">");
124 priorityMap.put("/", subMap);
125 // (
126 subMap = new HashMap<String, String>();
127 subMap.put("+", "<");
128 subMap.put("-", "<");
129 subMap.put("*", "<");
130 subMap.put("/", "<");
131 subMap.put("(", "<");
132 subMap.put(")", "=");
133 //subMap.put("#", ">");
134 priorityMap.put("(", subMap);
135 // )
136 subMap = new HashMap<String, String>();
137 subMap.put("+", ">");
138 subMap.put("-", ">");
139 subMap.put("*", ">");
140 subMap.put("/", ">");
141 //subMap.put("(", "<");
142 subMap.put(")", ">");
143 subMap.put("=", ">");
144 priorityMap.put(")", subMap);
145 // #
146 subMap = new HashMap<String, String>();
147 subMap.put("+", "<");
148 subMap.put("-", "<");
149 subMap.put("*", "<");
150 subMap.put("/", "<");
151 subMap.put("(", "<");
152 //subMap.put(")", ">");
153 subMap.put("=", "=");
154 priorityMap.put("=", subMap);
155 }
156 }

出题包:

public void generate(int n, int range) {
char[] symbol = { ‘+‘, ‘-‘, ‘*‘, ‘/‘, ‘(‘ };
int op; // 操作数
try {
File writename = new File("D:\\test1.txt");
BufferedWriter out = new BufferedWriter(new FileWriter(writename));
for (int i = 0; i < n; i++) {

String eHead = "" + (i + 1) + ". ";
String e ="";
int exlength = (int) (Math.random() * 4 + 2);
int lbracket = 0;
int rbracket = 0;
int[] whe = new int[exlength];
for (int j = 0; j < exlength; j++) {
char s = symbol[(int) (Math.random() * 5)];
if (j == exlength - 1 && s == ‘(‘) {
int count1 = lbracket;
if (lbracket == 0) {
e += "" + (int) (Math.random() * range) + "";
} else {
e += "" + (int) (Math.random() * range) + "";
for (int q = 0; q < count1; q++) {
e += ")";
lbracket--;
}
}
e += "=";
continue;
}
if (lbracket == 0) {
if (s == ‘(‘) {
e = e + "" + s + "" + (int) (Math.random() * range)
+ "" + symbol[(int) (Math.random() * 4)] + "";

whe[rbracket] = (int) (Math.random()
* (exlength - j - 1) + j + 1);

lbracket++;
rbracket++;
} else {
e = e + "" + (int) (Math.random() * range) + "" + s
+ "";
}
} else if (s != ‘(‘) {
int count2 = lbracket;
int count_match = 0;
for (int l = 0; l < count2; l++) {
if (whe[(rbracket-count2) + l ] == j) {
if (count_match == 0) {
e = e + "" + (int) (Math.random() * range)
+ ")";
count_match++;
lbracket--;
} else {
e += ‘)‘;
lbracket--;
}
}
}
if (count_match == 0) {
e = e + "" + (int) (Math.random() * range) + "" + s
+ "";
} else {
e += "" + s + "";
}
} else {
int count3 = lbracket;
int count = 0;
for (int m = 0; m < count3; m++) {

if (whe[rbracket-count3 + m] == j) {
if (count == 0) {
e = e + "" + (int) (Math.random() * range)
+ ")";
count++;
lbracket--;

} else {
e += ‘)‘;
lbracket--;

}

}

}
if (count == 0) {
e = e + "(" + (int) (Math.random() * range) + ""
+ symbol[(int) (Math.random() * 4)] + "";
whe[rbracket] = (int) (Math.random()
* (exlength - j - 1) + j + 1);
lbracket++;
rbracket++;
} else {
e += "" + symbol[(int) (Math.random() * 4)] + "("
+ (int) (Math.random() * range) + ""
+ symbol[(int) (Math.random() * 4)] + "";
whe[rbracket] = (int) (Math.random()
* (exlength - j - 1) + j + 1);
rbracket++;
lbracket++;
}
}

}
char[] strChar = e.toCharArray();
strChar[strChar.length - 1] = ‘=‘;
for(int g=0 ;g<strChar.length;g++){
if(strChar[g]==‘/‘){
if(strChar[g+1]==‘0‘){
i=i-1;
System.out.print("非法表达式");
}

}
}
System.out.print(eHead);
System.out.println(strChar);
calculate ee = new calculate();
double result = ee.calcualte(e);
out.write(eHead+"答案:"+result+"\r\n");
out.flush();

}
out.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}

.测试运行

文件:

原文地址:https://www.cnblogs.com/378844859-dylan/p/9064183.html

时间: 2024-10-08 23:55:08

四则运算练习器(基于控制台)的相关文章

四则运算(基于控制台)

一.题目描述: 1. 使用 -n 参数控制生成题目的个数,例如 Myapp.exe -n 10 -o Exercise.txt 将生成10个题目. 2. 使用 -r 参数控制题目中数值(自然数.真分数和真分数分母)的范围,例如 Myapp.exe -r 10 将生成10以内(不包括10)的四则运算题目.该参数可以设置为1或其他自然数.该参数必须给定,否则程序报错并给出帮助信息. 3. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数. 4. 每道题目中出现的运算符个数不超过

个人作业1——四则运算题目生成程序(基于控制台)

No.1 四则运算题目生成程序(基于控制台) 程序代码 需求分析: 能够根据用户自身对题目数量的需求自动生成一定数量的包含分数的四则运算题目的命令行程序. 功能设计: 除了整数以外,还要支持真分数的四则运算,真分数的运算 并且要求能处理用户的输入,并判断对错,打分统计正确率 要求能处理用户输入的真分数 使用 -n 参数控制生成题目的个数 设计实现: 程序是用c++实现的,主要有四个函数,主函数随机生成整数或者分数算法,divisor(int i, int j)计算最大公约数,zs为计算整数算法,

基于控制台的四则运算

一.题目要求:完成一个基于控制台的四则运算程序,实现一个自动生成小学四则运算题目的命令行程序 满足以下需求: 1.除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24 2.运算符为 +, ?, ×, ÷ 3.并且要求能处理用户的输入,并判断对错,打分统计正确率. 4.要求能处理用户输入的真分数, 如 1/2, 5/12 等 5.使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目 Myapp.exe -n 10 二.需求分析 能够自动生成四

基于控制台实现贪吃蛇游戏

1).引言 学习编程,我个人觉得最好的办法就是根据自己的水平不断的给自己设定一个小目标.而这个小目标就是一个有意思的项目,通过完成这个项目,对自己的成果(也包括失败的)进行分析总结,从中提炼出对应的技术并分享出来,不断的往复,如此,为的就是让我们永远保持编写程序的兴趣和热情,完了,还提高我们的技术.而本文就是总结自己的一个小目标(基于控制台实现的贪吃蛇游戏而写的总结) 2).技术实现 大家小时候一定玩过贪吃蛇的游戏.贪吃蛇游戏的控制过程其实也不复杂.简单的可以概括为以下4个部分. 1.1  .组

01:JAVA_四则运算题目生成程序(基于控制台)

一.题目要求 1. 使用 -n 参数控制生成题目的个数,例如 Myapp.exe -n 10 -o Exercise.txt 将生成10个题目. 2. 使用 -r 参数控制题目中数值(自然数.真分数和真分数分母)的范围,例如 Myapp.exe -r 10 将生成10以内(不包括10)的四则运算题目.该参数可以设置为1或其他自然数.该参数必须给定,否则程序报错并给出帮助信息. 3. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数. 4. 每道题目中出现的运算符个数不超过3

四则运算题目生成程序(基于控制台)

题目描述: 能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24 运算符为 +, ?, ×, ÷ 并且要求能处理用户的输入,并判断对错,打分统计正确率 要求能处理用户输入的真分数, 如 1/2, 5/12 等 使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目 功能设计: 1.  通过随机数的生成,实现+, ?, ×, ÷的确定 2.  +, ?, ×, ÷分别赋予整

个人作业1:小学四则运算——基于控制台

源代码地址:http://git.oschina.net/junge212/25eubiqm170p3nzgj4yrh36.code.git a.需求分析: 自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24 运算符为 +, ?, ×, ÷ 并且要求能处理用户的输入,并判断对错,打分统计正确率. 要求能处理用户输入的真分数, 如 1/2, 5/12 等 使用 -n 参数控制生成题目的个

第1次作业------四则运算题目生成程序(基于控制台)

https://git.coding.net/YelCong/Soft.git 需求分析 1. 使用 -n 参数控制生成题目的个数,例如 Myapp.exe -n 10 -o Exercise.txt 将生成10个题目. 2. 使用 -r 参数控制题目中数值(自然数.真分数和真分数分母)的范围,例如 Myapp.exe -r 10 将生成10以内(不包括10)的四则运算题目.该参数可以设置为1或其他自然数.该参数必须给定,否则程序报错并给出帮助信息. 3. 生成的题目中如果存在形如e1 ÷ e2

个人作业-四则运算题目生成程序(基于控制台)

代码:四则运算 一.题目描述: 1. 使用 -n 参数控制生成题目的个数,例如 Myapp.exe -n 10 -o Exercise.txt 将生成10个题目. 2. 使用 -r 参数控制题目中数值(自然数.真分数和真分数分母)的范围,例如 Myapp.exe -r 10 将生成10以内(不包括10)的四则运算题目.该参数可以设置为1或其他自然数.该参数必须给定,否则程序报错并给出帮助信息. 3. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数. 4. 每道题目中出现的