日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java生成四则运算表达式_生成四则运算(java实现)

發(fā)布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java生成四则运算表达式_生成四则运算(java实现) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

|博客班級 | https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/ |

|作業(yè)要求 | https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/homework/11376|

|作業(yè)目標(biāo) | 寫一個能自動生成小學(xué)四則運(yùn)算題目的程序 |

|學(xué)號 | 3190704130 |

代碼如下:

//main函數(shù)所在區(qū)域主要實(shí)現(xiàn)生成問題

`package xiaohu;

import java.util.Scanner;

public class CT {

public static String str = "";

public static int num = 5;

public static int num_i = 0;

public static int numberRange = 100;

public static double sum = 0;

public static void main(String[] args) {

System.out.println("當(dāng)然是小胡啦");

System.out.println("控制臺實(shí)現(xiàn)出題判斷");

System.out.println("注意:結(jié)果保留1位小數(shù)!");

System.out.println("共10道題目:");

Scanner in = new Scanner(System.in);

double answer = 0;

double result = 0;

String[] question = new String[10];

int questionNumber = 0;

int answerTrue = 0;

boolean flag;

for(;😉 {

answer = 0; result = 0; flag = true; str="";

if((questionNumber + 1)%5 != 0) {

GetQuestion_int();

} else {

GetQuestion_div();

}

for(int j = questionNumber-1; j >= 0; j --) {

if(question[j].equals(str)) {

flag = false; break;

}

}

if(!flag) continue;

else {question[questionNumber] = new String(str); questionNumber++;}

System.out.print("" + questionNumber + ". " + str+" = ");

answer = in.nextDouble();

if(!str.isEmpty()) {

result = Arithmetic.arithmetic(str);

}

if(answer == result) {

System.out.println(" ??");

answerTrue++;

} else {

System.out.println(" ? " + " 正確答案:" + result);

}

if(questionNumber == 10) break; // 滿10個跳出

}

System.out.println("你的正確概率:" + answerTrue + "/10");

in.close();

}

private static void GetQuestion_int() {

//得到問題函數(shù),在這里調(diào)用遞歸函數(shù)quesGrow()。

str = "";

sum = 0;

num_i = num;//用前都清零

quesGrow_int();

}

private static void GetQuestion_div() {

str = "";

sum = 0;

num_i = num;//用前都清零

quesGrow_div();

}

private static void quesGrow_int() {

//

if( num_i > 1 ) {

int j = num_i;//記錄這是第幾層調(diào)用。

num_i--;

quesGrow_int();//遞歸

int w=1+(int)(Math.random()*numberRange);//隨機(jī)生成一個數(shù)

int t=1+(int)(Math.random()*100);//向左生成,還是向右生成,類似于樹。

int f=1+(int)(Math.random()*100);//運(yùn)算符控制

if(t>50)//新數(shù)往右加

{

if(f>50) {

sum = sum + w;

str = str + "+" + String.valueOf( w );

}

else {

sum = sum - w;

str = str + "-" + String.valueOf( w );

}

}

else//否則 新數(shù)往左加

{

if(f>50) {

sum = w + sum;

str = String.valueOf( w ) + "+" + str;

}

else {

if( j < 3 ) {//3——摸索出的數(shù),不用給自己套上括號。實(shí)際上就是j=2

sum = w - sum;

str = String.valueOf( w ) + "-" + str;

}

else {

sum = w - sum;

str = String.valueOf( w ) + "-" + "(" +str+ ")";

//向左添減法的時候加括號,打破順序計(jì)算模式。

}

}

}

}

else if( num_i == 1 ) {

//最后一層,也是輸出的第一層

int w=1+(int)(Math.random()*numberRange);

sum = sum + w;

str = str + String.valueOf( w );

}

}

private static void quesGrow_div() {

if( num_i > 1 ) {

int j = num_i;//記錄這是第幾層調(diào)用。

num_i--;

quesGrow_div();//遞歸

double w=Math.random();//隨機(jī)生成一個數(shù)

int t=1+(int)(Math.random()*100);//向左生成,還是向右生成,類似于樹。

int f=1+(int)(Math.random()*100);//運(yùn)算符控制

if(t>50)//新數(shù)往右加

{

if(f>50) {

sum = sum + w;

str = str + "+" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4));

}

else {

sum = sum - w;

str = str + "-" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4));

}

}

else//否則 新數(shù)往左加

{

if(f>50) {

sum = w + sum;

str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "+" + str;

}

else {

if( j < 3 ) {//3——摸索出的數(shù),不用給自己套上括號。實(shí)際上就是j=2

sum = w - sum;

str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "-" + str;

}

else {

sum = w - sum;

str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "-" + "(" +str+ ")";

//向左添減法的時候加括號,打破順序計(jì)算模式。

}

}

}

}

else if( num_i == 1 ) {

//最后一層,也是輸出的第一層

double w=Math.random();

sum = sum + w;

str = str + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4));

}

}

}`

//ChangeToFenshuDemo類實(shí)現(xiàn)將數(shù)轉(zhuǎn)化為分?jǐn)?shù)

`package xiaohu;

public class ChangeToFenshuDemo {

public static int getGongYueShu(int a, int b) {

int t = 0;

if(a < b){

t = a;

a = b;

b = t;

}

int c = a % b;

if(c == 0){

return b;

}else{

return getGongYueShu(b, c);

}

}

public static String toFenshu(String xiaoshu) {

String[] array = new String[2];

array = xiaoshu.split("\\.");

int a = Integer.parseInt(array[0]);//獲取整數(shù)部分

int b = Integer.parseInt(array[1]);//獲取小數(shù)部分

int length = array[1].length();

int FenZi = (int) (a * Math.pow(10, length) + b);

int FenMu = (int) Math.pow(10, length);

int MaxYueShu = getGongYueShu(FenZi, FenMu);

return new String(FenZi / MaxYueShu + "/" + FenMu / MaxYueShu);

}

}`

//Arithmetic類實(shí)現(xiàn)數(shù)的運(yùn)算

`package xiaohu;

import java.math.BigDecimal;

import java.math.MathContext;

import java.math.RoundingMode;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class Arithmetic {

public static double arithmetic(String exp){

String result = parseExp(exp).replaceAll("[\[\]]", "");

return Double.parseDouble(result);

}

/**

* 解析計(jì)算四則運(yùn)算表達(dá)式,例:2+((3+4)2-22)/23

*/

public static String parseExp(String expression){

expression=expression.replaceAll("\\s+", "").replaceAll("^\\((.+)\\)$", "$1");

String minExp="^((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))$";

//最小表達(dá)式計(jì)算

if(expression.matches(minExp)){

String result=calculate(expression);

return Double.parseDouble(result)>=0?result:"["+result+"]";

}

//計(jì)算不帶括號的四則運(yùn)算

String noParentheses="^[^\\(\\)]+$";

String priorOperatorExp="(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))";

String operatorExp="(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))";

if(expression.matches(noParentheses)){

Pattern patt=Pattern.compile(priorOperatorExp);

Matcher mat=patt.matcher(expression);

if(mat.find()){

String tempMinExp=mat.group();

expression=expression.replaceFirst(priorOperatorExp, parseExp(tempMinExp));

}else{

patt=Pattern.compile(operatorExp);

mat=patt.matcher(expression);

if(mat.find()){

String tempMinExp=mat.group();

expression=expression.replaceFirst(operatorExp, parseExp(tempMinExp));

}

}

return parseExp(expression);

}

//計(jì)算帶括號的四則運(yùn)算

String minParentheses="\\([^\\(\\)]+\\)";

Pattern patt=Pattern.compile(minParentheses);

Matcher mat=patt.matcher(expression);

if(mat.find()){

String tempMinExp=mat.group();

expression=expression.replaceFirst(minParentheses, parseExp(tempMinExp));

}

return parseExp(expression);

}

/**

* 計(jì)算最小單位四則運(yùn)算表達(dá)式(兩個數(shù)字)

*/

public static String calculate(String exp){

exp=exp.replaceAll("[\\[\\]]", "");

String number[]=exp.replaceFirst("(\\d)[\\+\\-\\*\\/]", "$1,").split(",");

BigDecimal number1=new BigDecimal(number[0]);

BigDecimal number2=new BigDecimal(number[1]);

BigDecimal result=null;

/*

* 設(shè)置精度,否則報錯(計(jì)算機(jī)并不知道要保留幾位,所以很干脆的報錯

*/

MathContext mc = new MathContext(2, RoundingMode.HALF_DOWN);

//精度為2,舍入模式為大于0.5進(jìn)1,否則舍棄。

String operator=exp.replaceFirst("^.*\\d([\\+\\-\\*\\/]).+$", "$1");

if("+".equals(operator)){

result=number1.add(number2);

}else if("-".equals(operator)){

result=number1.subtract(number2);

}else if("*".equals(operator)){

result=number1.multiply(number2);

}else if("/".equals(operator)){

result=number1.divide(number2,mc);

}

return result!=null?result.toString():null;

}

}`

運(yùn)行結(jié)果展示

psp表格:

總結(jié)

以上是生活随笔為你收集整理的java生成四则运算表达式_生成四则运算(java实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。