java用户界面项目_结对项目(带图型用户界面)Java实现【柴政-陈起廷】

对分数及整数的计算

/***

* 相加操作

*/

ADD("+") {

@Override

public String calculate(String a, String b) {

boolean flagA = a.contains("/");

boolean flagB = b.contains("/");

//两个都是分数

if (flagA && flagB) {

int[] anInt = ResolveUtil.analysis(a);

int[] bnInt = ResolveUtil.analysis(b);

//以AB为分母

int denominator = anInt[1] * bnInt[1];

//相加后的分子

int molecule = anInt[0] * bnInt[1] + anInt[1] * bnInt[0];

return ResolveUtil.createFraction(molecule, denominator);

} else if (flagA) {

int[] anInt = ResolveUtil.analysis(a);

//直接更新分子便可

anInt[0] += Integer.parseInt(b) * anInt[1];

return ResolveUtil.createFraction(anInt[0], anInt[1]);

} else if (flagB) {

int[] bnInt = ResolveUtil.analysis(b);

//直接更新分子便可

bnInt[0] += Integer.parseInt(a) * bnInt[1];

return ResolveUtil.createFraction(bnInt[0], bnInt[1]);

} else {

return String.valueOf(Integer.parseInt(a) + Integer.parseInt(b));

}

}

},

/***

* 相乘操作

*/

MULTIPLY("×") {

@Override

public String calculate(String a, String b) {

boolean flagA = a.contains("/");

boolean flagB = b.contains("/");

if (flagA && flagB) {

int[] anInt = ResolveUtil.analysis(a);

int[] bnInt = ResolveUtil.analysis(b);

//以AB为分母

int denominator = anInt[1] * bnInt[1];

//分子相乘

int molecule = anInt[0] * bnInt[0];

return ResolveUtil.createFraction(molecule, denominator);

} else if (flagA) {

int[] anInt = ResolveUtil.analysis(a);

return ResolveUtil.createFraction(anInt[0] * Integer.parseInt(b), anInt[1]);

} else if (flagB) {

int[] bnInt = ResolveUtil.analysis(b);

return ResolveUtil.createFraction(bnInt[0] * Integer.parseInt(a), bnInt[1]);

} else {

return String.valueOf(Integer.parseInt(a) * Integer.parseInt(b));

}

}

},

/***

* 相除操作

*/

DIVIDE("÷") {

@Override

public String calculate(String a, String b) {

//除法,从另外一种角度来说,是乘法的倒转,所以,只需要把b分子分母倒过来用乘法就行了

boolean flag = b.contains("/");

//新的数b的字符串

String newB;

//判断b是否为分数

if (flag) {

int[] bnInt = ResolveUtil.analysis(b);

newB = ResolveUtil.createFraction(bnInt[1], bnInt[0]);

} else {

newB = 1 + "/" + b;

}

return Symbol.MULTIPLY.calculate(a, newB);

}

},

/***

* 相减操作

*/

SUB("-") {

@Override

public String calculate(String a, String b) {

//减是加的特例,把b弄成-就可以了

return Symbol.ADD.calculate(a, "-" + b);

}

},

中缀转后缀表达式

/***

* 中缀表达式转换成后缀表达式

* @param expression 表达式

* @return 数组

*/

private String[] middleToAfter(String expression) {

//用来转换的栈

Stack stack = new Stack<>();

//表达式每个字符前后都会生成一个空格

String[] strings = expression.split("\\s");

//返回的list

List stringList = new ArrayList<>(strings.length);

for (int index = 0; index < strings.length; index++) {

if ('0' <= strings[index].charAt(0) && strings[index].charAt(0) <= '9') {

//数字直接输出

stringList.add(strings[index]);

} else if (strings[index].equals(Symbol.BEGIN.getSymbol())) {

//开始括号压进栈

stack.push(strings[index]);

} else if (strings[index].equals(Symbol.END.getSymbol())) {

//把所有运算符都出栈

while (!stack.peek().equals(Symbol.BEGIN.getSymbol())) {

stringList.add(stack.pop());

}

//出栈开始括号

stack.pop();

} else if (strings[index].equals(Symbol.MULTIPLY.getSymbol())

|| strings[index].equals(Symbol.DIVIDE.getSymbol())) {

//判断上一级符号是什么

boolean flag = !stack.isEmpty() && (stack.peek().equals(Symbol.MULTIPLY.getSymbol())

|| stack.peek().equals(Symbol.DIVIDE.getSymbol()));

if (flag) {

stringList.add(stack.pop());

}

stack.push(strings[index]);

} else if (strings[index].equals(Symbol.SUB.getSymbol())

|| strings[index].equals(Symbol.ADD.getSymbol())) {

//此处应该为+,-号

boolean flag = !stack.isEmpty() && (stack.peek().equals(Symbol.ADD.getSymbol())

|| stack.peek().equals(Symbol.SUB.getSymbol()));

if (flag) {

stringList.add(stack.pop());

}

stack.push(strings[index]);

} else {

//有其他符号,直接跳出,可能是=号

break;

}

}

while (!stack.isEmpty()) {

stringList.add(stack.pop());

}

//返回数组

return stringList.toArray(new String[0]);

}

后缀计算

/***

* 计算表达式

* @param expression 表达式

* @param permit 允许存在负数的运算过程

* @return 结果

*/

public String calculate(String expression, boolean permit) {

if (expression == null) {

return null;

}

//先生成后缀表达式数组,然后手动控制数组进行操作

String[] afterExp = middleToAfter(expression);

Stack stack = new Stack<>();

try {

for (int index = 0; index < afterExp.length; index++) {

if (afterExp[index].matches("[0-9/']+")) {

stack.push(afterExp[index]);

} else {

String b = stack.pop();

String a = stack.pop();

String result = Symbol.value(afterExp[index]).calculate(a, b);

//计算过程中存在负数,重新生成表达式

if (result.startsWith("-") && !permit) {

return null;

}

stack.push(result);

}

}

} catch (NullPointerException e) {

e.printStackTrace();

} catch (Exception e) {

System.out.println("存在表达式不合法");

}

return stack.pop();

}

生成表达式

/***

* 生成表达式

* @return 生成表达式

*/

private String generateExpression() {

//随机运算符大小

int operatorSize = (int) (Math.random() * MAX_OPERATOR_SIZE) + 1;

int numberSize = operatorSize + 1;

//判断是否需要生成括号,1/4的概率

boolean flag = (int) (Math.random() * MAX_OPERATOR_SIZE) == 0;

//标记(产生的位置)

int mark = -1;

if (flag) {

//随机插入括号的位置

mark = (int) (Math.random() * operatorSize);

}

StringBuilder expression = new StringBuilder();

//遍历产生数字和符号,你一下我一下

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

if (mark == i) {

myAppend(expression, "(");

}

//生成数字

myAppend(expression, (int) (Math.random() * 2) == 0 ? generateFraction() : generateInt());

//判断是否加入结束符号,判断是否结尾

if (mark >= 0 && mark < i) {

//已经到了表达式结尾, 此时必须结束

if (i == operatorSize) {

myAppend(expression, ")");

break;

}

//判断是否需要结束

flag = (int) (Math.random() * 2) == 0;

if (flag) {

myAppend(expression, ")");

mark = -1;

}

}

if (i < operatorSize) {

//然后生成一个操作符

myAppend(expression, generateOperator());

}

}

//最后补充等号

expression.append("=");

return expression.toString();

}

去重校验

/***

* 检查表达式是否已经存在或者重复

* @param expression 表达式

* @param result 结果

* @return 是否重复

*/

private boolean checkExpressionExistAndResultIllegal(String expression, String result) {

if (Objects.isNull(result)) {

return true;

}

//当前没有表达式

if (nowExpressionSize == 0) {

return false;

}

//API的一些操作也是循环,效率低下,手动循环

for (int i = 0, j = nowExpressionSize - 1; i <= j; i++, j--) {

if (expressionList.get(i).equals(expression) || expressionList.get(j).equals(expression)) {

return true;

}

//查看是否答案有相同的

if (answerList.get(i).equals(result)) {

return checkCharEquals(expressionList.get(i), expression);

} else if (answerList.get(j).equals(result)) {

return checkCharEquals(expressionList.get(j), expression);

}

}

return false;

}

/***

*

* @param oldExpression 存在的表达式

* @param newExpression 还没存进去的表达式

* @return 相同,不相同

*/

private boolean checkCharEquals(String oldExpression, String newExpression) {

String[] oldExpressionArrays = oldExpression.split("\\s+");

String[] newExpressionArrays = newExpression.split("\\s+");

int oldExpressionNumber = 0;

int equalsNumber = 0;

//是否为数字

boolean flag;

//开始遍历

for (String oldString : oldExpressionArrays) {

flag = oldExpression.matches("[0-9'/]+");

if (flag) {

oldExpressionNumber++;

}

//比对

for (String newString : newExpressionArrays) {

if (oldString.equals(newString)) {

equalsNumber++;

}

}

}

答案校对

//保存正确/错误题号的队列

private List correctList = new ArrayList<>();

private List wrongList = new ArrayList<>();

/**

* 校验待检测文件状态

* @param exersicesFile

* @param myAnswer

* @Author Naren

*/

public void checkFile(String exersicesFile,String myAnswer) {

//存储表达式的文件

File expFile = new File(exersicesFile);//Exercise002.txt

//待校验答案的文件

File myAnsFile = new File(myAnswer);//myAnswers001.txt

//待校验答案文件不存在

if(!myAnsFile.exists()){

//System.out.println("未找到待检验答案文件。");

new Tips().displayTips("noExpTip.png");

return;

}

//如果表达式文件不存在

if(!expFile.exists()) {

//System.out.println("未找到指定题目文件。");

new Tips().displayTips("noAnsTip.png");

return;

}

//如果全部文件名都正确,检测待校对题目文件是否存在于系统生成历史中

String id = exersicesFile.substring(9,12);

String sysAnsFile = "Answers" + id + ".txt"; //Myapp.exe -e Exercises001.txt -a myAnswers001.txt

File ansFile = new File(sysAnsFile);//Answers002.txt(不存在)

//若系统中不存在与题目文件相符合的答案文件

if(!ansFile.exists()){

try {

FileReader fr = new FileReader(expFile);

BufferedReader br = new BufferedReader(fr);

String content = null;

ArrayList questionList = new ArrayList<>();

while((content = br.readLine()) != null){//(?m)^.*$

content = content.split("\\.")[1];

questionList.add(content);

}

//调用起廷方法获得答案队列

Expression ex = new Expression(new Calculate());

List answerList = ex.getCorrectAnswerList(questionList);

//比对

checkAnswer(myAnsFile,answerList);

} catch (Exception e) {

System.out.println("Class:AnswerChecking,Method:checkFile(String,String) is wrong!");

}

}else{

//调用本类检验方法比对答案文件

checkAnswer(myAnsFile,ansFile);

}

}

/**

* 将待校验答案文件与现场计算出的答案队列进行比对

* @param myAnswer

* @param answerList

* @author Naren

*/

private void checkAnswer(File myAnswer, List answerList){

try {

//待检测答案文件

FileReader fr1 = new FileReader(myAnswer);

BufferedReader br1 = new BufferedReader(fr1);

LinkedHashMap map1 = new LinkedHashMap<>();

String content = "";

while((content = br1.readLine()) != null){

content = content.replaceAll(" +", "").replaceAll("\uFEFF", "");

//map1待校验答案:key:序号,value:答案

map1.put(Integer.valueOf(content.split("\\.")[0]),content.split("\\.")[1]);

}

//开始比对

for (int i = 0; i < answerList.size(); i++) {

if(map1.containsKey(i + 1)){

if(map1.get(i + 1).equals(answerList.get(i))) {

correctList.add(i + 1);//正确题号添加进队列

}

else{

wrongList.add(i + 1);//错误题号添加进队列

}

}else{

//漏写

wrongList.add(i + 1);

}

}

//将校验结果写入文件

//System.out.println("检验信息已写入Grade.txt文件。");

new Tips().displayTips("checkSuccess.png");

new DataStorage().storeCheckInfo(correctList,wrongList);

} catch (Exception e) {

System.out.println("Class:AnswerChecking,Method:checkAnswer(File,List) is wrong!");

}

}

/**

* 【重载】将待校验答案文件与本地答案文件进行比对

* @param myAnswer 待校验答案文件

* @param ansFile 正确答案文件

* @author Naren

*/

private void checkAnswer(File myAnswer, File ansFile) {

try {

FileReader fr1 = new FileReader(myAnswer);

FileReader fr2 = new FileReader(ansFile);

BufferedReader br1 = new BufferedReader(fr1);

BufferedReader br2 = new BufferedReader(fr2);

LinkedHashMap map1 = new LinkedHashMap<>();//待检测 key:序号,value:答案

LinkedHashMap map2 = new LinkedHashMap<>();//正 确 key:序号,value:答案

//分别按行读出答案

String content = "";

while((content = br1.readLine()) != null){

content = content.replaceAll(" +", "").replaceAll("\uFEFF", "");

map1.put(Integer.valueOf(content.split("\\.")[0]),content.split("\\.")[1]);

}

while((content = br2.readLine()) != null){

content = content.replaceAll(" +", "").replaceAll("\uFEFF", "");

map2.put(Integer.valueOf(content.split("\\.")[0]),content.split("\\.")[1]);

}

//开始比对

for (int i = 0; i < map2.size(); i++) {

if(map1.containsKey(i + 1)){

if(map1.get(i + 1).equals(map2.get(i + 1))) {

correctList.add(i + 1);//正确题号添加进队列

}

else{

wrongList.add(i + 1);//错误题号添加进队列

}

}else{

//漏写

wrongList.add(i + 1);

}

}

//将校验结果写入文件

//System.out.println("检验信息已写入Grade.txt文件。");

new Tips().displayTips("checkSuccess.png");

new DataStorage().storeCheckInfo(correctList,wrongList);

} catch (Exception e) {

System.out.println("Class:AnswerChecking,Method:checkAnswer(File,File) is wrong!");

}

}

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

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

相关文章

java securerandom使用_Java中的SecureRandom nextBytes()方法

用户指定的随机字节数可以使用nextBytes()类java.security.SecureRandom中的方法获得。该方法需要一个参数&#xff0c;即一个随机字节数组&#xff0c;它返回用户指定的随机字节。演示此的程序如下所示-示例import java.security.*;import java.util.*;public class Demo {pub…

java 跨类 调用 model_Model.java中的这两个方法,为什么不能在子类中调用,或者包内调用也行啊。...

JFinal 你好&#xff0c;想跟你请教个问题&#xff1a;Model.java中的这两个方法&#xff0c;为什么不能在子类中调用&#xff0c;或者包内调用也行啊。/*** Find model.*/SuppressWarnings("unchecked")private List find(Connection conn, String sql, Object... p…

mysql n 识别_mysql – 不能有“不识别”的N:M关系吗?

我的数据库ERM(实体关系模型)有一个TEACHER实体类型,它与SUBJECT_MODULE实体类型相关(因为每个主题中的不同模块由不同的教师讲授,对于某些模块,甚至每个模块中的不同章节都可以通过不同的教师)通过TEACH关系类型.这是一种N&#xff1a;M的关系,因为每个教师都可以教授许多学科…

新闻资讯java开发_新闻资讯app开发的功能与意义

获取新闻的目的因人而异&#xff0c;但对获取新闻的需求是一样的。现在是移动互联网的时代。人们不再想依靠传统的手段&#xff0c;而把便利作为获取服务的核心。因此&#xff0c;开发新闻咨询app是必要的。其到来不仅意味着获得新闻登上新的阶梯&#xff0c;还因为画出了圆满的…

JAVA中注解controller_SpringMVC之基于注解的Controller

参考博客&#xff1a;https://www.cnblogs.com/qq78292959/p/3760560.htmlController注解&#xff1a;传统风格的Controller需要实现Controller接口&#xff0c;而现在我们只需要用注解就行了。基于注解的控制器有几个优点&#xff0c;1.一个控制器可以处理多个action(动作)&am…

c java json_cJSON_json包的C语言解析库

cJSON库描述CJSON是一个用于解析JSON包的C语言库&#xff0c;库文件为cJSON.c和cJSON.h&#xff0c; 所有的实现都在这两个文件中。原作者的地址cJSON。JSON包的解析例如有一个JSON的数据包如下&#xff1a;{"rxpk": [{"tmst": 1868500100,"time"…

e语言mysql中文_大佬们E语言连接MYSQL输出中文乱码怎么破

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼.版本 2.支持库 mysql.支持库 iext.程序集 窗口程序集_启动窗口.子程序 _按钮1_被单击数据库连接句柄 &#xff1d; 连接MySql (“127.0.0.1”, “root”, “zkqingfish*”, “mu_game_1”, 3306) 执行SQL语句 (连接句柄, “set na…

java中删除最大的数,【Java练习】删除字符串中字符个数最少的字符

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼输入&#xff1a;asdasdas输出&#xff1a;asasas[java] view plain copyprint?1.package com.iotex;2.3.import java.util.ArrayList;4.import java.util.Collections;5.import java.util.Comparator;6.import java.util.HashMap…

php实时上传多张图片,PHP实现多张图片上传预览功能

PHP实现多张图片上传预览功能&#xff0c;支持左右移动图片切换位置、删除图片&#xff0c;限制图片上传的数量等-向左移动图片function reverse_left(obj) {var obj_li obj.parents("li");var obj_prev obj_li.prev("li");if (obj_prev.hasClass("…

centos php 默认安装目录,centos系统中的软件安装目录在哪

centos系统中软件的默认安装目录一般在/usr/local或者/opt中。我们还可以通过whereis命令来查看软件的实际安装路径。命令&#xff1a;whereis功能介绍&#xff1a;在特定目录中查找符合条件的文件。这些文件的烈性应属于原始代码&#xff0c;二进制文件&#xff0c;或是帮助文…

php代码丑,php – 屏幕截图你生命中见过的最丑陋的HTML

我正在使用PHP和libtidy来尝试筛选可能是历史上最糟糕和最不正确的HTML表格使用情况.该站点关闭了几个table,tr,td,font或bold标签,并且一致地嵌套了表中的许多不同的表层.示例代码段&#xff1a;Home Team - WildcatsAway Team - Polar BearsRosters1 Baird, T2 Knight, P8 Mi…

百度指数 php,百度指数是什么?百度指数有什么用?百度指数怎么用?

做SEO必知的第一步&#xff1a;百度指数【百度指数地址】百度指数是用以反映关键词在过去30天内的网络曝光率及用户关注度&#xff01; 它能形象地反映该关键词的每天的变化趋势&#xff01;百度指数是以百度网页搜索和百度新闻搜索为基础的免费海量数据分析服务&#xff0c;用…

php获取全部sessionid,php怎么获取所有的sessionid?或获取所有的session

php怎么获取所有的sessionid&#xff1f;或获取所有的sessionphp 如何获取所有的 sessionid &#xff1f;或获取所有的session就是想通过一个.php文件读取所有的 sessionid &#xff1f;或获取所有的session &#xff1f;&#xff1f;sessionphp------解决方案----------------…

php atlas,apache atlas是什么

Atlas是一组可伸缩和可扩展的核心基础治理服务——使企业能够有效和高效地满足Hadoop中的遵从性需求&#xff0c;并允许与整个企业数据生态系统进行集成。Apache Atlas为组织提供开放的元数据管理和治理能力&#xff0c;以建立其数据资产的目录&#xff0c;对这些资产进行分类和…

matlab heaviside,Matlab编写的Lyapunov指数计算程序汇总.doc

Matlab编写的Lyapunov指数计算程序汇总matlab编写的Lyapunov指数计算程序汇总申明&#xff1a;以下各程序为个人在网络上收集的Lyapunov指数计算程序&#xff0c;未经过验证&#xff0c;不保证程序的正确性和计算结果的正确性&#xff0c;请大家见谅&#xff0c;也欢迎大家探讨…

php2588,搞清楚一下必胜2588z和2582z哪个好点?都有些什么区别?内幕评测分析

这二个必胜2588z和2582z区别不是很大的哈&#xff0c;款式和配置是差不多的&#xff0c;只是必胜2582Z 2052Z更强一些&#xff0c;看个人需要吧&#xff0c;不过家用的话&#xff0c;这两款都是可以的&#xff0c;我自己用的是必胜2582Z 2052Z&#xff0c;款式多大气的&#xf…

超表面透镜相位matlab,基于超透镜的小F数大景深镜头的设计方法及应用与流程...

本发明涉及基于超透镜的小f数大景深镜头的设计方法及应用。背景技术&#xff1a;监控系统中采用的透镜往往要求具有尽量高的成像分辨率和尽量大的景深&#xff0c;通常情况下&#xff0c;高分辨率的透镜一般具有较小f数&#xff0c;大的景深又要求焦距较短。但是利用传统透镜的…

获取php数组最后,php获取数组最后一个值的2种方法

摘要&#xff1a;这篇文章主要介绍了PHP获取数组最后一个值的2种方法,本文直接给出实现代码,代码中包含注释,需要的朋友可以参考下$arrayarray(1,2,3,4,5);echo $array[count($array)-1];//计算数组长度&#xff0c;然后获取数组最后一个元素&#xff0c;如果数组中最后一个元素…

php等级证书,php银行开放平台接口1:php 对cer证书处理

做一个银行接口要进行证书解析和签名&#xff0c;然后验证获token银行开放平台提供了2个证书public.cer 证书 &#xff1a;里面只有公钥200090491595.pfx证书 &#xff1a;里面有公钥和私钥这里专门做public.cer的说明和处理&#xff0c;.cer为扩展的证书&#xff0c;就是一个x…

php theexcerpt,wordpress的excerpt()函数的用法示例

本篇文章给大家带来的内容是关于wordpress的excerpt()函数的用法示例&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。问题&#xff1a;在wordpres中的single页面&#xff0c;本身引用的<?php the_excerpt(); ?>&…