Java实现能完成 加减乘除幂与阶乘 组合运算的计算器
题目叙述:
有一组小学生要开始学习算术运算,需要使用计算机辅助他们检查计算结果,请帮助小同学设计一个能够完成+、-、*、\、幂运算和阶乘的计算器程序
具体要求:
- 由于是面向小同学的软件工具,请设计一个友好、方便的用户交互界面
- 计算器应该能够完成由加、减、乘、除运算符构成的复合算术表达式的求解,允许使用括号
- 计算器能够完成幂运算和阶乘运算,其中,幂运算可以采用M^N的方式输入
提前说明:
- 该程序由一个类实现,可通过调用solve方法求解,具体使用方式请看main函数
- 程序缺少必要注释,本博客未列出求解思路,具体查看源码
- 该程序未实现单独负数的处理,如
-1-2
或者2^-2
等 - 支持浮点数,但未使用大数,程序可能会产生溢出
运行示例:
程序源码:
package experiment;import javafx.util.Pair;import java.util.*;public class Calculator {private final Stack<Double> numSt;private final Stack<Character> opSt;public static void main(String[] args) {Calculator calculator = new Calculator();System.out.print("Please input: ");Scanner in = new Scanner(System.in);String str = in.nextLine();System.out.println("The answer is: " + calculator.solve(str));}public Calculator() {numSt = new Stack<>();opSt = new Stack<>();}// 求解表达式并返回值public double solve(String in) {String evalStr = in.trim();for (int i = 0; i < evalStr.length(); ++i) {char ch = evalStr.charAt(i);if (ch >= '0' && ch <= '9') {Pair<Double, Integer> res = parseNum(evalStr, i);numSt.push(res.getKey());i = res.getValue();} else if (ch == '(') {opSt.push('(');} else if (ch == ')') {while (!opSt.empty() && opSt.peek() != '(') {opNum();}opSt.pop();} else if (ch == '!') {// 阶乘运算符注意溢出int top = numSt.pop().intValue();numSt.push((double) factorial(top));} else {if (!opSt.empty() && cmpPriority(opSt.peek(), ch)) {while (!opSt.empty() && cmpPriority(opSt.peek(), ch)) {opNum();}}opSt.push(ch);}}while (!opSt.empty()) {opNum();}return numSt.peek();}// 解析字符串,返回整数.返回结果是键值对,键是解析结果,值是解析完成指向的位置private static Pair<Double, Integer> parseNum(String num, int start) {int end = start;while ((num.charAt(end) >= '0' && num.charAt(end) <= '9') || num.charAt(end) == '.') {++end;if (end >= num.length()) break;}return new Pair<>(Double.parseDouble(num.substring(start, end)), end - 1);}// 比较操作符优先级,若前者优先级比较大则返回true,否则返回falseprivate boolean cmpPriority(char x, char y) {if (x == '^') {return true;} else if (x == '*' || x == '/') {return y != '^';} else if (x == '+' || x == '-') {// 否则x就只能是"+"或"-"return y == '+' || y == '-';} else {return false;}}// 求一个数的阶乘private long factorial(int x) {if (x < 1) return 1;long res = 1;for (int i = 2; i <= x; ++i) {res *= i;}return res;}// 对两个栈执行操作,确保调用时操作符栈非空,操作数栈内容至少为2private void opNum() {char op = opSt.pop();Double x = numSt.pop();if (op == '+') numSt.push(numSt.pop() + x);else if (op == '-') numSt.push(numSt.pop() - x);else if (op == '*') numSt.push(numSt.pop() * x);else if (op == '/') numSt.push(numSt.pop() / x);else if (op == '^') numSt.push(Math.pow(numSt.pop(), x));}
}
Java实现能完成 加减乘除幂与阶乘 组合运算的计算器相关推荐
- [ Java ] 实现两个数加减乘除的简易计算器
[ Java ] 实现两个数加减乘除的简易计算器 新手,不足之处望大佬们海涵 感谢( *ˊᵕˋ)✩︎‧₊ 以下为代码: package com.zhong.homework;import java.u ...
- java分子分母的加减乘除_JAVA实现精确的加减乘除代码
用java代码实现一个加减乘除运算计算器白雪公主的故事告诉我们,就算七个屌丝对她好,也比不过高富帅给她的一个吻. 现场写一个:代码如下 import java.util.Scanner; public ...
- 复数加减java_用java实现复数的加减乘除运算
用java实现复数的加减乘除运算 1. 背景 老师在课上布置了几道java编程题,此为其中之一 2. 题目内容 设计一个类Complex,用于封装对复数的下列操作: (1)一个带参数的构造函数,用于初 ...
- Java实现复数的加减乘除
Java实现复数的加减乘除 题目: 编程练习:复数的类封装 完成复数加减乘除四则运算的类封装,主类Main输入两个复数输出其四则运算后的结果. 如:输入 1 2 1 -2 输出 复数: 1.0+2.0 ...
- JAVA:实现binary exponentiation二进制幂运算算法(附完整源码)
JAVA:实现binary exponentiation二进制幂运算算法 package com.thealgorithms.divideandconquer;public class BinaryE ...
- java文档注释加减乘除,java计算器加减乘除
TOMCAT7.0, IE8 三.实验内容及步骤 1.创建一个 web 工程,在页面中实现加减乘除的运算操作,并实现运算结果的计算显示, 注意进行异常处理,运行效果如下图所示.... ,本章的仿 Wi ...
- java中两个复数相乘_用java实现复数的加减乘除运算
用java实现复数的加减乘除运算 1. 背景 老师在课上布置了几道java编程题,此为其中之一 2. 题目内容 设计一个类Complex,用于封装对复数的下列操作: (1)一个带参数的构造函数,用于初 ...
- 编程之美系列之一——阶乘的运算
前言: 本人一直以来都对算法很有兴趣,前些日子拿到<编程之美>这本书,爱不释手,遂有意将书中的一些本人觉得较有意思的题目以及自己的心得拿出来与大家分享,共同讨论,共同进步. 需 ...
- 带控制端的逻辑运算电路_分别完成正整数的平方、立方和阶乘的运算verilog语言...
练习:设计一个带控制端的逻辑运算电路,分别完成正整数的平方.立方和阶乘的运算. //--------------myfunction---------- modulemyfunction(clk,n, ...
最新文章
- 转载:HBuilder常用快捷键
- mysql計劃任務_MySQL計劃任務 | 學步園
- 年度总结和计划:去年4个1,今年5个1
- jvm内存模型及分配
- volatile 手摸手带你解析
- 三个球数求最大值c语言,C语言中一个简单的球3个数最大数的程序中,最后一步:printf(apos;apos;max=%d\napos;apos;,max);怎么理解...
- error_reporting
- C语言 · 数的读法
- SpringBoot 小技巧
- QQ空间面试题放送,速度教科书式扑街补救offer!
- 如何成为一名网络工程师
- Linux中如何针对用户及组设置磁盘配额
- 程序关闭是总是出异常解决方法
- 好用的android高清播放器,高清播放器哪个好用(推荐4款4K高清画质播放器)
- Win10PE网络版.iso UEFI、BIOS双启动
- 阅读软件怎么添加书源_认识一波苹果安卓手机上,那些以一敌百的小说漫画软件...
- 计算机辅助园林设计ps,《CAD PS辅助园林设计》课程教学大纲.doc
- 微信朋友圈分享详细步骤html,微信如何转发朋友圈图文(朋友圈转发图文教程分享)...
- 计算机一级误差怎么计算,(excel最大偏差公式)偏离值怎么计算
- 宝塔备份文件到ftp服务器上,宝塔自动备份网站到FTP空间,宝塔备份ftp空间
热门文章
- Layui layer弹层组件 子iframe大小比父iframe大,还可对父iframe进行操作
- leetcode 1217. Play with Chips 解法 python
- 谷歌浏览器输入网址显示该网页无法正常运作
- Redis 根据value 进行查询
- python PIL将图片转换成九宫格拼图样式
- 阿里云 部署SpringBoot和Vue项目 亲测可用(第一次部署经验贴)
- 在ssd上win10和linux双系统,windows 10 ssd ubuntu hdd双系统
- 软件发明专利实例_软件发明专利思路(精)
- Halcon的C++教程
- solaris系统关闭服务器,Solaris下如何关闭SUN服务器