java运算div_java四则运算1

这篇博客介绍了一个Java程序,用于生成和解决包含四则运算的随机算术表达式。用户可以自定义运算操作数、运算式数量、数值范围以及是否包含乘除和负数。程序首先生成指定数量的算式,然后通过栈来计算每个算式的正确答案。用户可以在限定时间内输入答案,程序会检查其正确性,并显示正确率。如果所有算式都答对,程序才会结束。
摘要由CSDN通过智能技术生成

四则运算的代码,后面几天在反复测试优化

package formula;

import java.util.*;

public class RandomFormula {

public int numberTotal;//运算操作数

public int formulaTotal;//运算式数量

public int numberRange;//数值范围

public boolean includeMulAndDiv;//是否包含乘除

public boolean includeNegNum;//是否包含负数

public RandomFormula() {

this.numberTotal = 2;

this.formulaTotal = 30;

this.numberRange = 100;

this.includeMulAndDiv = false;

this.includeNegNum = false;

}

public RandomFormula(int numberTotal, int formulaTotal, int numberRange, boolean includeMulAndDiv,

boolean includeNegNum) {

this.numberTotal = numberTotal;

this.formulaTotal = formulaTotal;

this.numberRange = numberRange;

this.includeMulAndDiv = includeMulAndDiv;

this.includeNegNum = includeNegNum;

}

// 获取随机数

public int getRandomNumber() {

Random rand = new Random();

if (this.includeNegNum) {

return (rand.nextInt(this.numberRange) + 1) * (rand.nextDouble() > 0.5 ? 1 : -1);

} else {

return rand.nextInt(this.numberRange) + 1;

}

}

//得到一个随机的运算符

public String getRandomOperator() {

Random rand = new Random();

String[] operations = { "+", "-", "*", "/" };

return operations[rand.nextInt((this.includeMulAndDiv == true) ? 4 : 2)];

}

// 生成算式

public String generateFormula() {

String formula = "";

for (int i = 0; i < this.numberTotal; i++) {

if (i >= this.numberTotal - 1) {

formula += isNegNum(this.getRandomNumber());

continue;

}

formula += isNegNum(this.getRandomNumber()) + " " + this.getRandomOperator() + " ";

}

return formula;

}

//生成算式集合

public List getFormulas() {

List set = new ArrayList();

set.add(this.generateFormula());

while (set.size() <= this.formulaTotal){

for(int i=0;i

{

String formula=this.generateFormula();

if(!formula.equalsIgnoreCase(set.get(i)))

{

set.add(formula);

break;

}

}

}

return set;

}

//若负数,加括号

public String isNegNum(int num) {

if (num < 0) {

return "(" + num + ")";

}

return "" + num;

}

//生成算式结果???????all???

public int getAnswer(String formula) {

int length = 0;

String[] formulaArr = formula.split(" ");

String operators = "+-*/";

Stack opNumbers = new Stack();

Stack opOperators = new Stack();

opOperators.add("#");//字符栈中存储个#号,防止栈空???

while (length < formulaArr.length) {

String op = formulaArr[length++];

if (operators.indexOf(op) > -1) {// 若是运算符,判断优先级

String sign = opOperators.peek();

int priority = compare(op, sign);// 要入栈的跟栈顶的相比

if (priority >= 0) {// 如果要入栈的运算符高或者相等,出栈两个数字,和之前的运算符,计算后,将数字入栈,将字符入栈

opNumbers.add(compute(opOperators, opNumbers));

opOperators.add(op);

} else {// 入栈运算符优先级低,直接入栈??

opOperators.add(op);

}

continue;

}

// 若是数字,则入栈???

opNumbers.add(Integer.parseInt(op.replace("(", "").replace(")", "")));

}

while (opOperators.peek() != "#") {

opNumbers.add(compute(opOperators, opNumbers));

}

return opNumbers.pop();

}

//比较运算优先级

public int compare(String operator1, String operator2) {

int res = 0;

switch (operator1) {

case "+":

case "-":

if (operator2.equals("+") || operator2.equals("-") || operator2.equals("*") || operator2.equals("/")) {

res = 1;

} else {

res = -1;

}

break;

case "*":

case "/":

if (operator2.equals("*") || operator2.equals("/")) {

res = 1;

} else {

res = -1;

}

break;

}

return res;

}

//算式求值

public int compute(Stack opOperators, Stack opNumbers) {

int num2 = opNumbers.pop();

int num1 = opNumbers.pop();

String _op = opOperators.pop();

int result = 0;

switch (_op) {

case "+":

result = num1 + num2;

break;

case "-":

result = num1 - num2;

break;

case "*":

result = num1 * num2;

break;

case "/":

result = num1 / num2;

break;

}

return result;

}

//生成算式结果数组

public int[] getAnswers(List set) {

int[] arr = new int[set.size()];

int i = 0;

for (String str : set) {

arr[i++] = getAnswer(str);

}

return arr;

}

public List getAnswer0sList(List set) {

List arr = new ArrayList();

for (String str : set) {

arr.add( getAnswer(str));

}

return arr;

}

}

package formula;

import java.util.*;

class Thread1 extends Thread{

public boolean tim=true;

private String name;

public Thread1(String name) {

this.name=name;

}

public void run() {

for (int i = 0; i < 5; i++) {

//System.out.println(name + "倒计时 : " + (499-i));

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println("超时");

tim=false;

System.exit(0);

Thread.activeCount();

}

}

public class formula {

@SuppressWarnings("deprecation")

public static void main(String[] args) {

Thread1 mTh1=new Thread1("A");

int numtotal;//运算操作数

int formtotal;//运算式数量

int numrange;//数值范围

boolean muland=false;//是否包含乘除

boolean negnum=false;//是否包含负数

int time=5;//one fromula using time

Scanner in=new Scanner(System.in);

System.out.println("请输入 运算操作数 运算式数量 数值范围 /*是否包含乘除 是否包含负数*/

numtotal=in.nextInt();

formtotal=in.nextInt();

numrange=in.nextInt();

muland=in.nextBoolean();

negnum=in.nextBoolean();

System.out.println("请输入 one fromula use time:");

time=in.nextInt();

RandomFormula B=new RandomFormula (numtotal,formtotal,numrange, muland,negnum);

List test = new ArrayList();

test=B.getFormulas();

double correctrat=0;

List anwser = B.getAnswer0sList(test);

do {

int all=test.size();

correctrat=0;

if(all==0)

break;

System.out.println(test.size());//test use

for(int i=0;i

System.out.println(i+1+". "+test.get(i)+"=");//test use

System.out.println("=");//test use

for(int i=0;i

{

//mTh1.run();

mTh1.start();

System.out.print(i+1+". "+test.get(i)+"= ");

System.out.print(" 答案:");

if(anwser.get(i)==in.nextInt())

{

mTh1.interrupt();

System.out.println(" 答案 is:(tset use)"+anwser.get(i));

correctrat++;

test.remove(i);

anwser.remove(i);

}

}

System.out.println(correctrat/all);

System.out.println("全对了吗,有没有超时,没通过继续吧");

}while((correctrat/=test.size())!=1);

System.out.println("好吧,你过了。");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值