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;从而起…

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

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

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集合类分析-hashset

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

站立会议 2

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

转为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…

cJONS序列化工具解读二(数据解析)

cJSON数据解析 关于数据解析部分&#xff0c;其实这个解析就是个自动机&#xff0c;通过递归或者解析栈进行实现数据的解析 /* Utility to jump whitespace and cr/lf *///用于跳过ascii小于32的空白字符 static const char *skip(const char *in) { while (in && *in…

小米范工具系列之二:小米范 web目录扫描器

最新版本1.1&#xff0c;下载地址&#xff1a;http://pan.baidu.com/s/1c1NDSVe 文件名scandir&#xff0c;请使用java1.8运行 小米范web目录扫描器主要功能是探测web可能存在的目录及文件&#xff0c;界面如下&#xff0c;左侧为发现的url&#xff0c;中间为浏览器&#xff0…

php中介者,PHP设计模式 - 中介者模式

【一】模式定义中介者模式(Mediator)就是用一个中介对象来封装一系列的对象交互&#xff0c;中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。对于中介对象而言&#xff0c;所有相互交互的对象&#xff0c;都视…

dedecms模版php,dedecms专题模板怎么用

dedecms专题模板怎么用&#xff1f;DeDeCms的专题相关信息bbs上相对较少&#xff0c;之前查阅了很多资料都未找到其解决方案推荐学习&#xff1a;织梦cms无柰只有靠自己动手丰衣足食&#xff1b;在官方的版本上有这样的一段话&#xff1a;1、文章列表用ID1,ID2,ID3这样形式分开…

Windows中断那些事儿

搞内核研究的经常对中断这个概念肯定不陌生&#xff0c;经常我们会接触很多与中断相关的术语&#xff0c;按照软件和硬件进行分类&#xff1a; 硬件CPU相关&#xff1a; IRQ、IDT、cli&sti 软件操作系统相关&#xff1a; APC、DPC、IRQL 一直以来对中断这一部分内容弄的一知…

(1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6

ASP.NET从MVC5升级到MVC6 总目录 MVC5项目结构 带有Areas和Filter的项目结构 一般来说&#xff0c;小的MVC项目是不考虑领域的&#xff0c;但是&#xff0c;如果是稍微复杂一点的项目&#xff0c;往往是需要领域这个概念的。 一个领域就是一个小型的MVC项目&#xff0c;所以领域…

重启模块与及关开邮件存储设置功能页面-PHP-shell-py

邮件系统几百台&#xff0c;每台负责 grep -P "^ip\d.\d." /home/mymail/newconf/hosts.conf -c465 每台机器负责启动的模块又是不一样的如&#xff1a; A机器&#xff1a; ProgramsList"1svr,2svr,3svr,4svr," b机器&#xff1a; ProgramsList"asvr,…

用IIS配置反向代理

https://natapp.cn/ http://blog.csdn.net/g2321514568/article/details/12406755 目标服务器&#xff1a;targetServer 配置反向代理的服务器&#xff1a;reveseProxServer 1、确定最终访问的网址&#xff1a;比如www.baidu.com 、www.csdn.net等等。 当然你也可以自己在targ…

oracle存储过程使用ftp,ASM存储FTP上传文件

引用SQL>execute dbms_xdb.sethttpport(8080);SQL>execute dbms_xdb.setftpport(2100);SQL>commit;检查端口是否开启引用SQL> select dbms_xdb.GETHTTPPORT() from dual;DBMS_XDB.GETHTTPPORT()----------------------8080SQL> select dbms_xdb.GETFTPPORT() fr…

Python学习笔记——基础篇【第六周】——hashlib模块

常用模块之hashlib模块  用于加密相关的操作&#xff0c;3.x里代替了md5模块和sha模块&#xff0c;主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 &#xff0c;MD5 算法 import md5 hash md5.new() hash.update(admin) print hash.hexdigest() MD5-废弃import shahash sha…