四则运算(Java)

这个作业属于哪个课程 https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/
这个作业要求在哪里 https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/homework/11376
这个作业的目标 编写生成四则运算的题目
学号 3190704107

main方法

public class major {
public static void main(String[] args){

Choose choose = new Choose();

}

主要调用函数

public class Choose extends JFrame{
public Choose() {
super("选择题目数量范围");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400, 300);
this.setLocation(700, 250);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setLayout(null);
JLabel titleNumber = new JLabel("生成题目的数量:");
JLabel titleRange = new JLabel("题目的范围:");
Font font = new Font("微软雅黑", Font.BOLD, 15);
titleNumber.setFont(font);
titleRange.setFont(font);

JTextField number = new JTextField();
JTextField range = new JTextField();
JButton create = new JButton("生成");

titleNumber.setBounds(50, 50, 160, 50);
number.setBounds(200, 50, 100, 40);
titleRange.setBounds(50, 120, 150, 50);
range.setBounds(200, 120, 100, 40);
create.setBounds(150, 190, 100, 50);
this.add(titleNumber);
this.add(number);
this.add(create);
this.add(titleRange);
this.add(range);
this.setVisible(true);

create.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
ReadTxt rt = new ReadTxt();
int Number = Integer.parseInt(number.getText());
int Range = Integer.parseInt(range.getText());
try {
String[] title = title(Number,Range);
double[] rs = rt.readTxt("Answers.txt");
JOptionPane.showMessageDialog(null, "成功生成题目!");
dispose();
Jtable jTable_01 = new Jtable(title,rs);
jTable_01.setVisible(true);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
JOptionPane.showMessageDialog(null, "生成失败!");
} //答案文件

}
});
}

//生成题目、答案,并写入文件
public String[] title(int number,int range) throws IOException {
CalculateImp c = new CalculateImp();
Create_title c2 = new Create_title();
WriteTxt wt = new WriteTxt();
Vector title1 = new Vector();

String title_path = "Exercises.txt";
String result_path = "Answers.txt";

HashSet set = new HashSet();
ServerImp serverImp = new ServerImp();
for(int i = 0 ; i < number ; i++) {
String title = c2.create_title(range,3);
double result = Double.parseDouble(c.calculate(title.toCharArray()));

if(result < 0.0 && i != 0) {
i--;
System.out.println(result);
System.out.println("出现负数");
continue;
}

if(!serverImp.removeRepeat(title,set)){ //去除重复的函数,并把结果存储在set中
System.out.println("重复了");
i--;
}

}

Iterator iterator = set.iterator();
int j = 0;
while (iterator.hasNext()){
String title3 = (String)iterator.next();

title1.add(title3);
System.out.println("第" + String.valueOf(j+1) + "道题目:" + title3 + " =");
wt.WriteTxt("第" + String.valueOf(j+1) + "道题目:" + title3 + " =", title_path);
wt.WriteTxt("第" + String.valueOf(j+1) + "道题的答案:" + c.calculate(title3.toCharArray()),result_path);
j++;
}

String[] title3 = new String[title1.size()];
for(int i = 0;i<title1.size();i++){
title3[i] = (String)title1.get(i);
}
return title3;
}
}

生成题目函数Creat_title

public class Create_title {

public String create_title(int range, int num2) {//num:提目数 range:范围 num2:题目组成数量

Random random = new Random(range);
String[] char_arrays = null;
int num3 = (int) (Math.random() * num2);//分数的个数
int num4 = num2 - num3;//正数个数
int charNum = num2 - 1;//符号个数

int bracketL = 0;//(位置

int[] int_arrays = new int[num4 + num3 * 2];
boolean flag = isBracket();
if (flag) {
char_arrays = returnChar(num3, charNum + 2, flag);

} else {
char_arrays = returnChar(num3, charNum, false);
}

for (int w = 0; w < num2; w++) {
int_arrays[w] = random.nextInt(range);
}
String title = "";
if (char_arrays[0].equals("(")) {
for (int i = 0; i < num2; i++) {
title += char_arrays[i] + ((int) (Math.random() * range) + "");
}
if (char_arrays[num2].equals(")")) {
title += ")";
}

} else {
for (int i = 0; i <= num2; i++) {
title += ((int) (Math.random() * range) + "") + char_arrays[i];
}
}
if (title.charAt(title.length() - 1) == '+' || title.charAt(title.length() - 1) == '-' || title.charAt(title.length() - 1) == '/' || title.charAt(title.length() - 1) == '*') {
title = title.substring(0, title.length() - 1);
}

return title;
}

boolean isBracket() {
return true;
}

String[] returnChar(int mark, int charNum, boolean flag) {
Random random = new Random();
String[] char_array = new String[charNum];

if (flag) {
int bracketL = random.nextInt(charNum - 2);//(位置,最后一位和倒数第二位不能是(

int j = charNum - bracketL - 2;

int bracketR = bracketL + random.nextInt(j) + 2;//)位置这个随机数可以生成0

if (bracketL != 0) {
char_array[bracketL] = "+(";
} else {
char_array[bracketL] = "(";

}

if (bracketR == charNum - 1) {
char_array[bracketR] = ")";
} else {
char_array[bracketR] = ")-";
}
}
int mark1 = 0;
while (true) {
if (mark1 == mark) {
break;
}
int i = (int) (Math.random() * charNum);
if (char_array[i] == null) {
char_array[i] = "/";
mark1++;
}

}
int num = 0;
while (true) {

if (num == charNum) break;
if (char_array[num] == null) {
int i = (int) (Math.random()4);
switch (i) {
case 0:
char_array[num] = "
";
break;
case 1:
char_array[num] = "+";
break;
case 2:
char_array[num] = "-";
break;

case 3:
char_array[num] = "÷";
break;

}
}

num++;

}
return char_array;
}
}

计算结果函数CalculateImp

public class CalculateImp {

public String calculate(char[] str) {
int j = 0;

//中缀表达式转后缀表达式
double[] num = new double[100];
char[] operator = new char[100];
int index = 0;

char[] stack = new char[100];
double[] stackj = new double[100];
int top = -1;

int temp = 0; //正在拼写数字
int flag = 0;//表示是否执行数字

int flag2 = 0;//判断什么时候读完了

while (true) {

if (j == str.length) {
flag2 = 1;
}
if (flag2 == 0 && str[j] >= '0' && str[j] <= '9') {//读到数字
flag = 1;
temp *= 10;
temp += str[j] - '0';

} else {//读到了符号,或者结束

if (flag == 1) {//如果在拼写一个数字就将一个数字输出

num[index] = temp;

operator[index] = '?';

index++;
flag = temp = 0;
}

if (flag2 == 1) {//如果字符串已经结束

while (top >= 0) {
int q = top--;
if (stack[q] != '(') {
operator[index++] = stack[q];

}

}
break;

} else {//读到一个符号

if (top == -1 || str[j] == '(') {
stack[++top] = str[j];

} else if (str[j] == ')') {//如果是右括号则一直出栈道左括号

while (top >= 0 && stack[top] != '(') {
operator[index++] = stack[top--];

}

} else if (str[j] == '' || str[j] == '/') {//如果是乘除,则乘除出栈,新符号入栈
while ((top > 0) && (stack[top] == '
' || stack[top] == '/')) {
operator[index++] = stack[top--];

}
stack[++top] = str[j];

} else {//如果是加减,则四则运算出栈,新符号入栈

while ((top >= 0) && (stack[top] !='(')) {//>=0是为了确保第0位可以出栈
operator[index++] = stack[top--];

}

stack[++top] = str[j];

}

}

}
j++;
}

top = -1;
double temp1 = 0;
double temp2 = 0;

for (int i = 0; i < index; i++) {
if (operator[i] == '?') {
stackj[++top] = num[i];
} else {
temp1 = stackj[top--];

temp2 = stackj[top--];

switch (operator[i]) {
case '+':
stackj[++top] = temp2 + temp1;
break;
case '-':
stackj[++top] = temp2 - temp1;
break;
case '*':
stackj[++top] = temp2 * temp1;
break;
case '÷':
stackj[++top] = temp2 / temp1;
break;
case '/':
stackj[++top] = temp2 / temp1;
break;
}

}
}
double result = stackj[0];
return result + "";
}
}

去重函数ServerImp

public class ServerImp { //去重
boolean flag = true;
public boolean removeRepeat(String title, HashSet set) {
if(title.length()>5){
set.add(title);
}
if (title.charAt(0) == '(') {
if (title.length() == 5) {//只有出现两个数字相加的时候才允许运行
add(title, set, true);
System.out.println("didid");
}

} else if (title.length() == 3) {
add(title, set, false);
System.out.println("lal");
}

return flag;
}

void add(String title, HashSet set, boolean flag) {//用于两个数相加的情况
String a = null;
String b = null;
String c = null;
if (flag) {
a = String.valueOf(title.charAt(1));
c = String.valueOf(title.charAt(2));
b = String.valueOf(title.charAt(3));
} else {
a = String.valueOf(title.charAt(0));
c = String.valueOf(title.charAt(1));
b = String.valueOf(title.charAt(2));
}

String temp = b + c + a;
if (set.add(temp)) {
set.remove(temp);
set.add(a + c + b);
this.flag = true;
} else {
this.flag = false;
System.out.println("出现重复");
}
}
}



psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 15 12
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 8 12
Development 开发 200 170
Analysis 需求分析(包括学习新技术) 50 40
Design Spec 生成设计文档 6 6
Design Review 设计复审 5 5
Coding Standard 代码规范 3 4
Design 具体设计 15 20
Coding 具体编码 40 55
Code Review 代码复审 10 12
Test 测试(自我测试,修改代码,提交修改) 10 15
Reporting 报告 10 15
Test Report 测试报告 3 5
Size Measurement 计算工作量 3 3
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 3 3
posted @ 2020-10-27 23:36  更木剑九  阅读(154)  评论(0编辑  收藏  举报