-
Notifications
You must be signed in to change notification settings - Fork 89
/
Copy pathMathExam6348.java
188 lines (183 loc) · 5.52 KB
/
MathExam6348.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
public class MathExam6348 {
/*主函数功能:
* 1.check函数检测输入参数是否有问题
* 2.init函数初始化获得题目和答案
* 3.OutPutFile函数将题目输出为out.txt文件
* */
public static void main(String[] args) {
//创建一个可变字符串用来拼接题目和答案
StringBuffer strbuf = new StringBuffer();
// 检测输入的参数是否有误
if (!check(args))return;
// 初始化获取题目和答案
init(strbuf, args);
OutPutFile(strbuf);
}
/*
* 检测输入参数个数错误
* 检测输入参数只能为数字且最大值只有10000
* 解决参数为00000000000001之类的问题
* 解决参数为负数
*/
public static boolean check(String[] s) {
char[] ca = s[0].toCharArray();
int k = 0;
//控制输入的参数只能为0、1、2个
if (s.length == 0 || s.length > 2) {
System.out.println("输入的参数个数错误!!");
return false;
}
//去掉第一个参数前面所有的数字0
while (ca[k++] == '0');
s[0] = new String(ca, k - 1, ca.length - k + 1);
//控制算数的题目数量不超过10000道题目
if (s[0].length() > 4) {
System.out.println("题目数量过大,请输入10000以内的数");
return false;
}
//检测第一个参数是个数字
k = 0;
while (!Character.isDigit(ca[k++])) {
System.out.println("请输入一个正整数!!");
return false;
}
return true;
}
/*
* init函数产生题目和答案
*/
public static void init(StringBuffer strbuf, String[] s) {
int result = 0; // 表示题目答案
int remainder = 0; // 表示余数
String operator = null; // 表示随机出来的运算符
String[] mark_code = { "+", "-", "*", "/" }; // 小学1年级和2年级所有的运算
StringBuffer strbuf1 = new StringBuffer(); // 用于答案的拼接
//for循环拼接题目和答案
for (int i = 1; i <= Integer.valueOf(s[0]); i++) {
//判断年级 判断该年级对应的运算
if (s.length == 1) {
operator = mark_code[(int) (Math.random() * 2)];
} else {
if (Integer.valueOf(s[1]) == 1) {
operator = mark_code[(int) (Math.random() * 2)];
} else if (Integer.valueOf(s[1]) == 2) {
operator = mark_code[(int) (Math.random() * 4)];
} else {
System.out.println("输入年级有误!!");
System.exit(0);
}
}
//题目序号
String number = "(" + i + ")" + " ";
// 生成2个随机数
int first = (int) (Math.random() * 100);
int second = (int) (Math.random() * 100);
// 按照年级需求生成指定的题目
if (operator.equals("+")) {
if (s.length == 2 && s[1].equals("2")) {
//二年级的加法题目答案不超过100
while (first + second > 100) {
first = (int) (Math.random() * 100);
second = (int) (Math.random() * 100);
}
} else {
while (first + second > 100) {
//1年级的加法:
//1. 答案不超过100
//2. 可以是2位数+个位数
//3. 可以是2位数+整的10位数
if (first % 2 == 0) {
first = (int) (Math.random() * 100);
second = (int) (Math.random() * 100);
if (second > 10)
second = second / 10;
} else {
first = (int) (Math.random() * 100);
if (first > 10)
second = second / 10 * 10;
second = (int) (Math.random() * 100);
}
}
}
result = first + second;
} else if (operator.equals("-")) {
// 控制左边的数必须大于右边的数。
if (first < second) {
int t;
t = first;
first = second;
second = t;
}
if (!(s.length == 2 && s[1].equals("2"))) {
//2年级的减法:
//1. 答案不能为负数
//2. 可以是2位数-个位数
//3. 可以是2位数-整的10位数
if (second > 10)second = second / 10 * 10;
result = first - second;
} else {
result = first - second;
}
} else if (operator.equals("*")) {
//控制乘法只能是99乘法表上面的
while (first > 10 || second > 10) {
first = (int) (Math.random() * 10);
second = (int) (Math.random() * 10);
}
result = first * second;
} else {
// 当运算符为除时候 除数不能为0
while (second == 0) {
second = (int) (Math.random() * 100);
}
//控制除数只能是小于等于10
while (second > 10) {
second /= 10;
}
if (first % second == 0) {
result = first / second;
} else { //控制不能整除将答案和余数都显示出来
if (first > second) {
result = (int) (first / second);
remainder = first - (int) (first / second) * second;
} else {
result = (int) (first / second);
remainder = second;
}
}
}
// 如果为除法要考虑是否有余数拼接在答案后面
if (operator.equals("/")) {
strbuf1.append(number + first + " " + operator + " " + second + " " + "=" + " " + result + "..." + remainder + "\r\n");
} else {
strbuf1.append(number + first + " " + operator + " " + second + " " + "=" + " " + result + "\r\n");
}
strbuf.append(number + first + " " + operator + " " + second + "\r\n");
}
// 将题目和答案拼接在strbuf可变字符串当中
strbuf = strbuf.append("\r\n" + strbuf1);
}
public static void OutPutFile(StringBuffer strbuf) {
// 将题目和答案的可变字符串转成二级制
byte[] bytes = new String(strbuf).getBytes();
// 将二进制传入文件输出流输出成out.txt
try {
FileOutputStream fos = new FileOutputStream("out.txt");
try {
fos.write(bytes);
} catch (IOException e) {
System.out.println("文件写出错误");
}
} catch (FileNotFoundException e) {
System.out.println("文件未找到!!");
}
// 输出程序执行的结果
System.out.println("题目已经生成,详情请见out.txt");
}
}