四则运算--计应192马冰霞

一 : 需求如下:

1、程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。

2、每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数。

3、支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号数必须大于2对,且不得超过运算符的个数。

4、支持真分数的出题与运算(只需要涵盖加减法即可)。注意在实现本功能时,需支持运算时分数的自动化简,且计算过程中与结果都须为真分数。

二 : 部分代码:

public int algorithm(String s) {

Stack<Integer> stack1 = new Stack<>();Stack<String> stack2 = new Stack<>();HashMap<String, Integer> hashmap = new HashMap<>();

hashmap.put("(", 0);
hashmap.put("+", 1);
hashmap.put("-", 1);
hashmap.put("*", 2);
hashmap.put("÷", 2);
for (int i = 0; i < s.length();) {
StringBuffer digit = new StringBuffer();
char c = s.charAt(i);
while (Character.isDigit(c)) {
digit.append(c);
i++;
c = s.charAt(i);
}
//当前digit里面已经无数字,即当前处理符号
if (digit.length() == 0){
switch (c) {
case '(': {
stack2.push(String.valueOf(c));
break;
}
//遇到右括号了计算,因为(的优先级最高
case ')': {
String stmp = stack2.pop();
while (!stack2.isEmpty() && !stmp.equals("(")) {
int a = stack1.pop();
int b = stack1.pop();
int sresulat = calculate(b, a, stmp);
if(sresulat<0)
return -1;
stack1.push(sresulat);
//符号指向下一个计算符号
stmp = stack2.pop();
}
break;
}
case '=': {
String stmp;
while (!stack2.isEmpty()) {
stmp = stack2.pop();
int a = stack1.pop();
int b = stack1.pop();
int sresulat = calculate(b, a, stmp);
if(sresulat<0)
return -1;
stack1.push(sresulat);
}
break;
}
default: {
String stmp;
while (!stack2.isEmpty()) {
stmp = stack2.pop();
//比较优先级
if (hashmap.get(stmp) >= hashmap.get(String.valueOf(c))) {
int a = stack1.pop();
int b = stack1.pop();
int sresulat =calculate (b, a, stmp);
if(sresulat<0)
return -1;
stack1.push(sresulat);
}
else {
stack2.push(stmp);
break;
}}
//将符号压入符号栈
stack2.push(String.valueOf(c));
break;
}}}
else {
//处理数字
stack1.push(Integer.valueOf(digit.toString()));
continue;
}
i++;
}
//返回栈底得到答案
return stack1.peek();
}

 

public class Create {
public String createProblem(){ //产生整数式子
Random r = new Random();
String[] opertor = {"+","-","*","÷"};
//操作符的个数
int operatorNum = 3+r.nextInt(3);
//新建数组来保存操作数
int[] number = new int[operatorNum+1];
//操作符的下标
int[] arr = index(operatorNum);
String s = new String();

for(int j=0;j<operatorNum+1;j++){
number[j] = r.nextInt(101);
}


int flag = r.nextInt(2);
switch (operatorNum){
case 3:{
if(flag == 0){
s = "(" + number[0] + opertor[arr[0]] + number[1] + ")" +opertor[arr[1]]+ "(" + number[2] + opertor[arr[2]] + number[3] + ")";
}
else{
s = number[0] + opertor[arr[0]] + number[1]+opertor[arr[1]]+number[2] + opertor[arr[2]] + number[3] ;
}
break;
}
case 4:{
if(flag ==0){
s = "(" + "(" + number[0] + opertor[arr[0]] + number[1] + ")" + opertor[arr[1]] + number[2] + ")" + opertor[arr[2]] + "(" + number[3] + opertor[arr[3]] + number[4] + ")";
}
else{
s = number[0] + opertor[arr[0]] + number[1] +opertor[arr[1]] + number[2] + opertor[arr[2]] + number[3] + opertor[arr[3]] + number[4] ;
}
break;
}
case 5:{
if(flag ==1){
s = "(" + "(" + number[0] + opertor[arr[0]]+number[1]+")" + opertor[arr[1]] + number[2] + ")" +opertor[arr[2]]+ "(" + "(" + number[3] + opertor[arr[3]] + number[4] + ")" + opertor[arr[4]] + number[5] + ")";
}
else{
s = number[0] + opertor[arr[0]]+number[1]+ opertor[arr[1]] + number[2] +opertor[arr[2]] + number[3] + opertor[arr[3]] + number[4] + opertor[arr[4]] + number[5] ;
}
break;
}
}
s+="=";
Calculator calculator = new Calculator();
int answer = calculator.algorithm(s);

//判断式子是否符合要求,凡是返回负数的就是不合格的
if(answer>=0){
s+=answer;
}else {
//递归
return createProblem();
}
return s;
}
public int[] index(int n){ //产生操作符的下标数组
Random random = new Random();
int similar=0;
int[] a = new int[n];
for(int j=0;j<n;j++){
a[j] = random.nextInt(4);
}
for(int j=1;j<n;j++){
if(a[0]==a[j]) similar++;
}
//保证一个式子里至少有2个不同的操作符
if(similar==n-1) return index(n);
else {
return a;
}}}

posted @ 2021-06-01 15:45  陈十十  阅读(55)  评论(0编辑  收藏  举报