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

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

|作业要求 | https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/homework/11376|

|作业目标 | 写一个能自动生成小学四则运算题目的程序 |

|学号 | 3190704130 |

代码如下:

//main函数所在区域主要实现生成问题

`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("当然是小胡啦");

System.out.println("控制台实现出题判断");

System.out.println("注意:结果保留1位小数!");

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() {

//得到问题函数,在这里调用递归函数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;//记录这是第几层调用。

num_i--;

quesGrow_int();//递归

int w=1+(int)(Math.random()*numberRange);//随机生成一个数

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

int f=1+(int)(Math.random()*100);//运算符控制

if(t>50)//新数往右加

{

if(f>50) {

sum = sum + w;

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

}

else {

sum = sum - w;

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

}

}

else//否则 新数往左加

{

if(f>50) {

sum = w + sum;

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

}

else {

if( j < 3 ) {//3——摸索出的数,不用给自己套上括号。实际上就是j=2

sum = w - sum;

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

}

else {

sum = w - sum;

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

//向左添减法的时候加括号,打破顺序计算模式。

}

}

}

}

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;//记录这是第几层调用。

num_i--;

quesGrow_div();//递归

double w=Math.random();//随机生成一个数

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

int f=1+(int)(Math.random()*100);//运算符控制

if(t>50)//新数往右加

{

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//否则 新数往左加

{

if(f>50) {

sum = w + sum;

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

}

else {

if( j < 3 ) {//3——摸索出的数,不用给自己套上括号。实际上就是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+ ")";

//向左添减法的时候加括号,打破顺序计算模式。

}

}

}

}

else if( num_i == 1 ) {

//最后一层,也是输出的第一层

double w=Math.random();

sum = sum + w;

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

}

}

}`

//ChangeToFenshuDemo类实现将数转化为分数

`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]);//获取整数部分

int b = Integer.parseInt(array[1]);//获取小数部分

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类实现数的运算

`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);

}

/**

* 解析计算四则运算表达式,例: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+)?\\]))$";

//最小表达式计算

if(expression.matches(minExp)){

String result=calculate(expression);

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

}

//计算不带括号的四则运算

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

}

//计算带括号的四则运算

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

}

/**

* 计算最小单位四则运算表达式(两个数字)

*/

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;

/*

* 设置精度,否则报错(计算机并不知道要保留几位,所以很干脆的报错

*/

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

//精度为2,舍入模式为大于0.5进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;

}

}`

运行结果展示

1aa2eed81b33dd36e4ede14127fc9ede.png

psp表格:

a48294ef8d5b4faf7f2ee8262099ab78.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(三)

钓鱼邮件 当攻击者制作了钓鱼网站、木马程序后&#xff0c;便会想法设法将其传给受害者&#xff0c;而常见的传播方式便是钓鱼网站了。安全意识较差的用户在收到钓鱼邮件后点击邮件中的钓鱼链接、下载附件中的木马程序&#xff0c;便可能遭受攻击&#xff01; 工具简介 Swak…

struts2拦截器详解

在之前的文章中&#xff0c;我们已经涉及到了拦截器&#xff08;Interceptor&#xff09;的概念。 downpour 写道拦截器是AOP中的概念&#xff0c;它本身是一段代码&#xff0c;可以通过定义“织入点”&#xff0c;来指定拦截器的代码在“织入点”的前后执行&#xff0c;从而起…

java文件上传maven_ssm+maven框架搭建实现ajax多文件上传功能

项目描述用myeclipse工具搭建的ssmmaven项目&#xff0c;之前文件上传是用form表单实现的&#xff0c;可是form表单上传文件会刷新页面&#xff0c;所以就得用ajax无刷新实现文件上传。运行环境jdk7tomcat7mysqlIntelliJ IDEAmaven项目技术(必填)springspring mvcmybatis数据库…

IOS开发基础篇 -- 分类、类别

Category (分类、类别) 分类只能增加方法不能增加成员变量,可以声明属性,实际上会生成属性的set和get方法,但不会生成带下划线的成员变量,也不能添加成员变量&#xff08;可以在不修改原来类模型的基础上拓充方法&#xff09;inheritance 》继承可以扩充成员变量和方法 但会产生…

为什么选用 React 创建混合型移动应用?

【编者按】本文作者为 14islands 联合创始人、创新 Web 开发者 David Lindkvist&#xff0c;主要介绍有关混合型应用搭建的方方面面。文章系国内 ITOM 管理平台 OneAPM 编译呈现。 最近&#xff0c;我们有幸与 Fjord 合作&#xff0c;从零开始为其用户打造了一款 HMTL5 混合型应…

java中除了跟数据相关的知识_Java的基本数据类型及知识介绍

一、基本数据类型&#xff1a;byte&#xff1a;Java中最小的数据类型&#xff0c;在内存中占8位(bit)&#xff0c;即1个字节&#xff0c;取值范围-128~127&#xff0c;默认值0short&#xff1a;短整型&#xff0c;在内存中占16位&#xff0c;即2个字节&#xff0c;取值范围-327…

java null错误事例_java – aspectJ示例中的nullpointer异常

我试图实现我们的stackoverflow成员在这里Logging entry, exit and exceptions for methods in java using aspects给出的建议之一.由于这本身就是不同的问题,再次在这里发布.我试图搜索,但看起来不同的版本有不同的方式,并无法在网上找出一个例子.我尝试了以下简单示例,因为我…

python中减法运算函数_OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减...

OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比? ? 前往老猿Python博文目录 ?在《OpenCV-Python图像的加法运算cv2.add函数详解》详细介绍了图像的加法运算&#xff0c;有加法就有减…

数据访问......单条件查询与多条件查询

一. 将数据库数据访问封装成类 <?php class DB {public $host "localhost"; //服务器地址public $uid "root"; //用户名public $pwd "123"; //密码//执行SQL语句,返回相应结果的方法//$sql代表要执行的SQL语句,$type代表…

java keytool nginx_java 自签名证书转 nginx 所需证书

下面个将介绍怎样利用 jdk keytool 生成自签名证书&#xff0c;然后使用 JKS2PFX 工具将证书转换成 pem 格式。详细步骤如下&#xff1a;(1)先试用 jdk 自带的 keytool 工具生成证书&#xff0c;如下&#xff1a;C:\Users\Administrator\Desktop\jks2pfx>keytool -genkey -v…

《浪潮之巅》读后感

《浪潮之巅》读后感 一开始看了几个公司的故事&#xff0c;感觉有点不够详细、扎实&#xff0c;以为这只是又一本讲述硅谷、讲述那些高科技行业明星的揽财书&#xff0c;但随着阅读的深入发现自己错了&#xff0c;也庆幸自己错了。强烈推荐那些非IT人士也看一看这本书。就…

java implements interface_java接口(interface)与现实(implements)

package com.sadhu;import java.util.*;/**接口接口中不能有字段所有的方法都是公共的可以定义常量接口是多继承的&#xff0c;一个类可以继承多个接口。接口中不能有实现的方法。可以认为是纯的抽象类。接口不能被实例化&#xff0c;但是可以声明一个接口类型的变量*/public c…

java集合类分析-hashset

一、 HashSet概述&#xff1a; HashSet实现Set接口&#xff0c;由哈希表&#xff08;实际上是一个HashMap实例&#xff09;支持。它不保证set 的迭代顺序&#xff1b;特别是它不保证该顺序恒久不变。此类允许使用null元素。 二、 HashSet的实现&#xff1a; 对于HashSet而言&…

php功能大马加密乱码,php大马加密工具 phpTrace:奇虎360开源的PHP脚”的相关知识...

phpTrace&#xff1a;奇虎360开源的PHP脚本分析工具问题&#xff1a;phpTrace&#xff1a;奇虎360开源的PHP脚本分析工具回答&#xff1a;phpTrace是奇虎 360开源的一款和分析PHP脚本的工具。如果开发者用过strace的话&#xff0c;则可能很容易想到phpTrace到底实现了什么样的功…

站立会议 2

这是我们的第二次人员集中&#xff0c;主要是讨论一下接下来的一些工作安排&#xff0c;还有讨论一下在准备过程中出现的一些问题&#xff01; 项目进展&#xff1a; 今天的会议中&#xff0c;我们讨论了我们的项目进展&#xff0c;结果是&#xff1a;我们都已经找到了小球还有…

网吧java安装路径,java环境变量配置

windows xp下配置JDK环境变量&#xff1a;1.安装JDK&#xff0c;安装过程中可以自定义安装目录等信息&#xff0c;例如我们选择安装目录为D:/java/jdk1.5.0_08&#xff1b;2.安装完成后&#xff0c;右击“我的电脑”&#xff0c;点击“属性”&#xff1b;3.选择“高级”选项卡&…

转为win64后, MS的lib问题

> 正在创建库 C:\Users\Administrator\Desktop\branch-Unicode-156\\Temp\Link\PointCloudMeasure\x64\Debug\PointCloudMeasure.lib 和对象 C:\Users\Administrator\Desktop\branch-Unicode-156\\Temp\Link\PointCloudMeasure\x64\Debug\PointCloudMeasure.exp1>vtkXM…

php redis 搜索,PHP+Redis有序集合(zset)实现博客园阅读排行榜功能

许多网站都有排行榜的功能&#xff0c;比如球员人气榜单、阅读排行榜&#xff0c;对于一些小网站&#xff0c;通过查数据库就能实现排行榜的功能&#xff0c;但是对于稍微有点用户量而且还是实时排名的网站&#xff0c;使用一些关系型数据库如(MySQL、Oracle)等来实现就有点力不…

iOS 开发疑难杂症(01)

搜了好多博客&#xff0c;技术网站&#xff0c;答案都不统一&#xff0c;今天偶然发现一个解决方案&#xff1a;这个问题一般是重复导入&#xff0c;使用include的问题&#xff0c;不过iOS一般不用include&#xff0c;所以这个不是正解&#xff0c;还有就是预编译文件&#xff…

php 游标 上移,jQuery点击input使光标移动到最后或指定位置

你要知道面对一个 处女座的 需求者&#xff0c; focus()是远远不够的。 比如说“我点进去的时候光标要在最后&#xff0c;这样我就不用再把光标移动到最后去添加东西了。” oh&#xff0c;让我先撞下墙。 我们需要扩展jQuery: //光标放在最后 $("#文本框ID").textFoc…