上一篇
Java做简单计算器,先创建类承载功能,通过接收用户输入的数字与运算符,执行对应数学运算后输出结果
核心需求分析
我们需要创建一个支持基本四则运算(加/减/乘/除)的命令行交互式工具,用户输入类似3 + 5或10 2的表达式后,程序应能解析运算符并返回正确结果,为提升健壮性,还需处理异常情况如除零错误、非规字符输入等。
关键技术点:
| 功能模块 | 实现方式 | 注意事项 |
|---|---|---|
| 输入获取 | Scanner类读取控制台输入 |
需验证是否为有效数字格式 |
| 表达式拆分 | 正则表达式匹配数字与运算符 | 确保多位数不被错误分割 |
| 类型转换 | Double.parseDouble() |
捕获NumberFormatException |
| 逻辑判断 | switch-case结构处理不同运算符 |
默认分支处理未知符号 |
| 错误防护 | try-catch块包裹关键代码段 | 提供友好的错误提示信息 |
完整代码实现(含注释)
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SimpleCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("欢迎使用Java简易计算器!输入'exit'退出程序。");
while (true) {
System.out.print("请输入算式(5 + 3):");
String inputLine = scanner.nextLine().trim();
// 终止条件判断
if (inputLine.equalsIgnoreCase("exit")) {
System.out.println("感谢使用,再见!");
break;
}
try {
// 使用正则表达式提取两个操作数和中间的运算符
Pattern pattern = Pattern.compile("([+\-/])"); // 匹配任意一种运算符
Matcher matcher = pattern.matcher(inputLine);
if (!matcher.find()) {
throw new IllegalArgumentException("未检测到有效的运算符!");
}
int opIndex = matcher.start(); // 运算符位置索引
String numStr1 = inputLine.substring(0, opIndex).replaceAll("\s+", ""); // 去除空格
String numStr2 = inputLine.substring(opIndex + 1).replaceAll("\s+", "");
char operator = inputLine.charAt(opIndex);
double num1 = Double.parseDouble(numStr1);
double num2 = Double.parseDouble(numStr2);
double result = 0;
// 根据运算符执行对应计算
switch (operator) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 num2;
break;
case '':
result = num1 num2;
break;
case '/':
if (num2 == 0) {
throw new ArithmeticException("错误:除数不能为零!");
}
result = num1 / num2;
break;
default:
throw new IllegalArgumentException("不支持的运算符:" + operator);
}
// 输出格式化的结果(保留两位小数)
System.out.printf("%.2f %c %.2f = %.2f%n", num1, operator, num2, result);
} catch (NumberFormatException e) {
System.err.println("️ 输入包含非数字字符,请重新输入!");
} catch (ArithmeticException e) {
System.err.println("️ " + e.getMessage());
} catch (IllegalArgumentException e) {
System.err.println("️ " + e.getMessage());
} catch (Exception e) {
System.err.println("️ 发生未知错误:" + e.getMessage());
}
}
scanner.close();
}
}
代码亮点说明:
- 灵活的空白处理:通过
replaceAll("\s+", "")自动过滤用户误输入的多余空格; - 精准的定位算法:利用正则表达式找到第一个出现的运算符作为分割点;
- 完善的异常体系:针对数值转换失败、除零操作、无效符号分别抛出特定异常;
- 人性化交互:支持大小写敏感的退出指令(如
Exit/EXIT均可识别); - 美观的输出格式:采用
printf控制浮点数精度,使结果显示更专业。
典型运行示例
| 用户输入 | 程序响应 | 说明 |
|---|---|---|
7 8 |
00 8.00 = 56.00 |
正常乘法运算 |
15 / 0 |
️ 错误:除数不能为零! |
触发除零保护机制 |
abc + def |
️ 输入包含非数字字符... |
非规字符检测 |
(3+4)5 |
️ 未检测到有效的运算符! |
不支持括号优先级 |
exit |
感谢使用,再见! |
安全退出循环 |
进阶改进方向(选做)
若希望进一步提升该计算器的功能边界,可以考虑以下扩展方案:
| 改进目标 | 技术实现建议 | 难度等级 |
|————————|—————————————|———-|
| 支持连续多步运算 | 改用逆波兰表达式算法 | |
| 添加历史记录功能 | 结合ArrayList存储每次计算结果 | |
| 实现图形界面 | Swing/JavaFX框架开发GUI版本 | |
| 增加科学函数支持 | Math类的sin/cos/tan等方法调用 | |
| 优化表达式解析能力 | Antlr等专业语法分析工具集成 | |
FAQs(常见问题解答)
Q1: 如果我想让用户能够进行多次连续计算而不必每次都重启程序怎么办?
A: 当前代码已通过while(true)循环实现持续交互模式,只要不输入”exit”命令,用户可以无限次地进行新的计算,每次循环都会清空之前的变量状态,确保独立性。
Q2: 这个计算器为什么不能处理像“(2+3)×4”这样带括号的复杂表达式?
A: 因为采用的是最简单的线性扫描解析策略,仅识别第一个遇到的运算符作为当前操作符,要支持运算符优先级和括号嵌套,需要引入栈结构来实现完整的表达式求值算法(如Shunting
