Live2D

结对开发

源程序代码:

Cal.java:

package caculator_core;

 

import java.util.HashSet;

import java.util.Random;

import java.util.Scanner;

 

public class Calc {

 

public static void main(String[] args) {

System.out.println("-------输入0选择默认配置,输入1选择自定义配置-------");

Scanner scanner = new Scanner(System.in);

CalCore calCore = new CalCore();

int number = scanner.nextInt();

switch (number) {

case 0:

calCore =new CalCore();

break;

case 1:

System.out.println("-------请输入运算符总数------");

int numberTotal = scanner.nextInt();

System.out.println("-------请输入运算式个数------");

int formulaTotal = scanner.nextInt();

System.out.println("-------请输入最大运算数字------");

int numberRange = scanner.nextInt();

System.out.println("-------请输入运算结果最大值------");

int maxResult = scanner.nextInt();

System.out.println("-------是否包含乘除法------");

boolean includeMulAndDiv = false;

if(scanner.next().equals("")) {

includeMulAndDiv = true;

}else {

includeMulAndDiv = false;

}

System.out.println("-------是否包含负数------");

boolean includeNegNum = false;

if(scanner.next().equals("")) {

includeNegNum = true;

}else {

includeNegNum = false;

}

calCore = new CalCore(numberTotal,formulaTotal,numberRange,maxResult,includeMulAndDiv,includeNegNum);

default:

break;

}

 

HashSet<String> formulas = calCore.generateFormulas();

double [] arr = calCore.generateAnswers(formulas);

System.out.println(calCore.outputFormulas(formulas));

System.out.println(calCore.outputAnswers(arr));

}

}

CalCore.java:

package caculator_core;

 

import java.io.File;

import java.io.FileWriter;

import java.math.BigDecimal;

import java.math.RoundingMode;

import java.util.HashSet;

import java.util.Random;

import java.util.Stack;

 

 

public class CalCore {

 

//运算符总数

private int numberTotal;

//运算式个数

private int formulaTotal;

//数字范围

private int numberRange;

//运算结果最大值

private int maxResult;

//是否包含乘除法

private boolean includeMulAndDiv;

//是否包含负数

private boolean includeNegNum;

public CalCore() {

this.numberTotal = 2;

this.formulaTotal = 10;

this.numberRange = 100;

this.maxResult = 100;

this.includeMulAndDiv =false;

this.includeNegNum = false;

}

public CalCore(int numberTotal,int formulaTotal,int numberRange,int maxResult,boolean includeMulAndDiv,boolean includeNegNum) {

this.numberTotal = numberTotal;

this.formulaTotal = formulaTotal;

this.numberRange = numberRange;

this.maxResult = maxResult;

this.includeMulAndDiv = includeMulAndDiv;

this.includeNegNum = includeNegNum;

}

//生成随机数

public double getRandomNumber() {

Random random = new Random();

 

if(this.includeNegNum) {

double d = (random.nextInt(this.numberRange)+1)*(random.nextDouble()>0.5?1.0:-1.0)*(random.nextDouble());

BigDecimal bg = new BigDecimal(d).setScale(2, RoundingMode.UP);

return bg.doubleValue();

}else {

double d =(random.nextInt(this.numberRange)+1)*(random.nextDouble());

BigDecimal bg = new BigDecimal(d).setScale(2, RoundingMode.UP);

return bg.doubleValue();

}

}

//生成随机运算符

public String getRandomOperator() {

Random random = new Random();

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

return opreations[random.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;

}

//如果负数就加括号

private String isNegNum(double randomNumber) {

if(randomNumber<0) {

return "("+randomNumber +")";

}

return ""+randomNumber;

}

//生成算式集合

public HashSet<String> generateFormulas(){

HashSet<String> set = new HashSet<String>();

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

String formula = this.generateFormula();

if(this.maxResult>= getAnswer(formula)) {

set.add(formula);

}

}

return set;

}

//生成答案

public double[] generateAnswers(HashSet<String> set) {

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

int i=0;

for(String str:set) {

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

}

return arr;

}

//打印算式

public String outputFormulas(HashSet<String> set) {

File file = new File("result.txt");

try {

FileWriter fw = new FileWriter(file);

for(String str:set) {

System.out.println(str);

fw.write(str+"\n");

}

fw.close();

} catch (Exception e) {

System.out.println("Error"+e.getMessage());

System.exit(0);

}

return file.getAbsolutePath();

}

//打印答案

public String outputAnswers(double[]arr) {

File file = new File("answer.txt");

try {

FileWriter fw = new FileWriter(file);

for(int i=0;i<arr.length;i++) {

fw.write(arr[i]+"\n");

}

fw.close();

} catch (Exception e) {

System.out.println("Error"+e.getMessage());

System.exit(0);

}

return file.getAbsolutePath();

}

public  Double getAnswer(String formula) {

int length=0;

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

String operators = "+-*/";

Stack<Double> opNumbers = new Stack<Double>();

Stack<String> opOperators = new Stack<String>();

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

while(length<formulaArr.length) {

String op = formulaArr[length++];

//如果是运算符,判断优先级

//indexof方法,判断字符串第一次出现的位置,找不到为-1

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(Double.parseDouble(op.replace("(", "").replace(")", "")));//将括号忽略掉

}

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

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

}

return opNumbers.pop();

 

}

 

private  Double compute(Stack<String> opOperators, Stack<Double> opNumbers) {

double num2 = opNumbers.pop();

double num1 = opNumbers.pop();

String _op = opOperators.pop();

double result =0.0;

switch(_op) {

case "+":

result=num1+num2;

break;

case "-":

result =num1-num2;

break;

case "*":

result =num1*num2;

break;

case "/":

result =num1/num2;

break;

}

BigDecimal bg = new BigDecimal(result).setScale(2, RoundingMode.UP);

result = bg.doubleValue();

return result;

}

 

private  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;

}

}

运行截图:


 

 

posted @ 2020-03-29 19:00  NyerROii  阅读(74)  评论(0)    收藏  举报