java四则运算系统设计实现1、设计任务与目的2、设计思路3、概要设计 4、详细设计5、软件需求6、可行性研究 7、体会与心得
1、设计任务与目的:
设计一个Java四则运算系统,可以实现加减乘除四种基本算术运算,可以自动生成指定数量的随机算式,支持括号运算和多级运算符优先级,保证算式的正确性,并能够输出算式和答案。目的是提高Java编程能力,加深对基本算法和数据结构的理解。
2、设计思路:
本系统采用面向对象的思想进行设计,主要包括四个类:Main类、Expression类、Operator类和Number类。其中,Main类为系统入口,负责与用户进行交互,获取用户输入的参数并生成算式;Expression类为算式类,负责生成随机算式、计算算式的值以及判断算式是否合法;Operator类为运算符类,主要包括四种基本运算符和括号运算符,负责运算符的优先级和计算;Number类为数字类,负责生成随机数字。
3、概要设计:
(1) Main类:
属性:
- count:生成算式的数量
- maxNum:生成的最大数字
- minNum:生成的最小数字
- maxLevel:生成的最大运算符级别
方法:
- main():程序入口,与用户进行交互,获取用户输入的参数并生成算式
(2) Expression类:
属性:
- expression:算式的字符串表示
- value:算式的值
方法:
- Expression():构造函数,生成一个随机算式
- Expression(String exp):构造函数,根据传入的字符串生成算式
- getValue():计算算式的值
- isValid():判断算式是否合法
(3) Operator类:
属性:
- priority:运算符的优先级
方法:
- operate(double a, double b):根据运算符计算两个数的值
(4) Number类:
方法:
- getRandomNum():生成一个随机数
4、详细设计:
(1) Main类:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要生成的算式数量:");
int count = scanner.nextInt();
System.out.print("请输入生成算式中的最大数字:");
int maxNum = scanner.nextInt();
System.out.print("请输入生成算式中的最小数字:");
int minNum = scanner.nextInt();
System.out.print("请输入生成算式中的最大运算符级别:");
int maxLevel = scanner.nextInt();
for (int i = 0; i < count; i++) {
Expression expression = new Expression(maxNum, minNum, maxLevel);
System.out.println(expression.getExpression() + " = " + expression.getValue());
}
}
}
(2) Expression类:
import java.util.Random;
public class Expression {
private String expression;
private double value;
private static final int MAX_LEVEL = 3; // 最大运算符级别
private static final char[] OPERATORS = {'+', '-', '*', '/'}; // 四种基本运算符
private static final char[] BRACKETS = {'(', ')'}; // 括号运算符
public Expression(int maxNum, int minNum, int maxLevel) {
this.expression = generateExpression(maxNum, minNum, maxLevel);
this.value = calculate();
}
public Expression(String exp) {
this.expression = exp;
this.value = calculate();
}
public double getValue() {
return this.value;
}
public String getExpression() {
return this.expression;
}
private String generateExpression(int maxNum, int minNum, int maxLevel) {
StringBuilder sb = new StringBuilder();
int level = 1;
while (level <= MAX_LEVEL) {
int index = new Random().nextInt(OPERATORS.length);
char operator = OPERATORS[index];
if (operator == '/') {
sb.append(generateDivision(maxNum, minNum));
} else {
sb.append(generateSimpleExpression(maxNum, minNum));
}
if (level == maxLevel) {
break;
}
sb.append(' ').append(operator).append(' ');
level++;
}
return sb.toString();
}
private String generateSimpleExpression(int maxNum, int minNum) {
int num1 = Number.getRandomNum(maxNum, minNum);
int num2 = Number.getRandomNum(maxNum, minNum);
char operator = OPERATORS[new Random().nextInt(OPERATORS.length - 2)];
return String.format("%d %s %d", num1, operator, num2);
}
private String generateDivision(int maxNum, int minNum) {
int num1 = Number.getRandomNum(maxNum, minNum);
int num2 = Number.getRandomNum(maxNum, minNum);
while (num2 == 0 || num1 % num2 != 0) {
num1 = Number.getRandomNum(maxNum, minNum);
num2 = Number.getRandomNum(maxNum, minNum);
}
return String.format("%d / %d", num1, num2);
}
private double calculate() {
String[] tokens = expression.split("\\s+");
Stack<Double> nums = new Stack<>();
Stack<Character> ops = new Stack<>();
for (String token : tokens) {
if (isNumber(token)) {
nums.push(Double.parseDouble(token));
} else if (isOperator(token.charAt(0))) {
char op = token.charAt(0);
while (!ops.isEmpty() && priority(ops.peek()) >= priority(op)) {
nums.push(operate(nums.pop(), nums.pop(), ops.pop()));
}
ops.push(op);
} else if (isLeftBracket(token.charAt(0))) {
ops.push(token.charAt(0));
} else if (isRightBracket(token.charAt(0))) {
while (!isLeftBracket(ops.peek())) {
nums.push(operate(nums.pop(), nums.pop(), ops.pop()));
}
ops.pop();
}
}
while (!ops.isEmpty()) {
nums.push(operate(nums.pop(), nums.pop(), ops.pop()));
}
return nums.pop();
}
private boolean isNumber(String s) {
return s.matches("\\d+");
}
private boolean isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
private boolean isLeftBracket(char c) {
return c == '(';
}
private boolean isRightBracket(char c) {
return c == ')';
}
private int priority(char op) {
if (op == '+' || op == '-') {
return 1;
} else if (op == '*' || op == '/') {
return 2;
} else {
return 3;
}
}
private double operate(double b, double a, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
throw new IllegalArgumentException("Illegal operator: " + op);
}
}
}
(3) Operator类:
public class Operator {
private int priority;
public Operator(int priority) {
this.priority = priority;
}
public int getPriority() {
return this.priority;
}
public double operate(double a, double b) {
return 0;
}
}
class AddOperator extends Operator {
public AddOperator() {
super(1);
}
public double operate(double a, double b) {
return a + b;
}
}
class SubOperator extends Operator {
public SubOperator() {
super(1);
}
public double operate(double a, double b) {
return a - b;
}
}
class MulOperator extends Operator {
public MulOperator() {
super(2);
}
public double operate(double a, double b) {
return a * b;
}
}
class DivOperator extends Operator {
public DivOperator() {
super(2);
}
public double operate(double a, double b) {
return a / b;
}
}
class LeftBracketOperator extends Operator {
public LeftBracketOperator() {
super(3);
}
}
class RightBracketOperator extends Operator {
public RightBracketOperator() {
super(3);
}
}
(4) Number类:
import java.util.Random;
public class Number {
public static int getRandomNum(int maxNum, int minNum) {
return new Random().nextInt(maxNum - minNum + 1) + minNum;
}
}
5、软件需求:
- JDK 8或以上
- IDE(例如Eclipse、IntelliJ IDEA等)
6、可行性研究:
本系统的设计非常简单,所需的基本算法和数据结构也比较基础,因此实现起来较为容易,可行性较高。
7、体会与心得:
通过本次设计与实现,我更加深入地了解了Java的面向对象编程思想,学习并掌握了常用的数据结构和算法。在实现过程中,我不断地调试和优化代码,加深对语言和系统的理解,不断提高了自己的编程能力。总之,这是一次非常有收获的编程实践
原文地址: https://www.cveoy.top/t/topic/hfeH 著作权归作者所有。请勿转载和采集!