package org.lw.test;
import java.text.DecimalFormat;
import java.text.Format;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 四则运算的详细步骤,(算式中不带括号)
* @author 古市轩
* @时间 2012-4-28下午 07:41:22
*/
public class Test112 {
public static void main(String[] args) {
System.out.println("请输入四则运算: ");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
//如果输入的四则运算有误,则提示重新输入
while(!isOk(str)){
str = sc.nextLine();
}
System.out.println(" " + myTrim(str));
getResult(getAddAndSubString(myTrim(str)));
}
//检查输入的等式是否有效
public static boolean isOk(String str){
try{
getOperationNumber(myTrim(str));
}catch(Exception e){
System.out.println("您输入的四则运算有误,请从新输入!");
return false;
}
return true;
}
// 根据算式截取运算符
public static List<Character> getOperation(String str) {
if (!"".equals(str)) {
List<Character> list = new ArrayList<Character>();
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '+' || str.charAt(i) == '-'
|| str.charAt(i) == '*' || str.charAt(i) == '/') {
list.add(str.charAt(i));
}
}
return list;
} else {
return null;
}
}
// 根据算式截取操作数
public static List<Double> getOperationNumber(String str){
if (!"".equals(str)) {
List<Double> list = new ArrayList<Double>();
String[] s = str.split("\\+|-|\\*|/");
for (int i = 0; i < s.length; i++) {
list.add(Double.parseDouble(s[i]));
}
return list;
} else {
return null;
}
}
// 根据只有加减运算的等式计算结果
public static Double getResult(String str) {
Double result = -1.0;
if (str.contains("+") || str.contains("-")) {
List<Character> operations = getOperation(str);
List<Double> operationNumbers = getOperationNumber(str);
result = operationNumbers.get(0);
for (int i = 0; i < operations.size(); i++) {
char ch = operations.get(i);
switch (ch) {
case '+':
result = result + operationNumbers.get(i + 1);
break;
case '-':
result = result - operationNumbers.get(i + 1);
}
operations.remove(i);
operationNumbers.remove(i);
operationNumbers.remove(i);
operationNumbers.add(i, result);
i--;
System.out.println("=" + getString(operations, operationNumbers));
}
}
return result;
}
// 把等式的乘除运算计算完后返回只剩加减运算的等式,即把含有乘法和除法的等式装换成只含有加法和减法的等式
public static String getAddAndSubString(String str) {
if (str.contains("*") || str.contains("/")) {
List<Character> operations = getOperation(str);
List<Double> operationNumbers = getOperationNumber(str);
for (int i = 0; i < operations.size(); i++) {
Double temp = 0.0;
switch (operations.get(i)) {
case '*':
temp = operationNumbers.get(i);
temp = temp * operationNumbers.get(i + 1);
operations.remove(i);
operationNumbers.remove(i);
operationNumbers.remove(i);
operationNumbers.add(i, getDoubleByPoint(temp));
i--;
System.out.println("=" + getString(operations, operationNumbers));
break;
case '/':
temp = operationNumbers.get(i);
if (operationNumbers.get(i + 1) != 0) {
temp = temp / operationNumbers.get(i + 1);
operations.remove(i);
operationNumbers.remove(i);
operationNumbers.remove(i);
operationNumbers.add(i, getDoubleByPoint(temp));
i--;
System.out.println("=" + getString(operations, operationNumbers));
} else {
System.out.println("除数不能为0!");
return "";
}
}
}
return getString(operations, operationNumbers);
} else {
return str;
}
}
//根据操作符和操作数拼接成等式字符串
public static String getString(List<Character> operations, List<Double> operationNumbers){
StringBuilder sb = new StringBuilder();
if (operations.size() != 0) {
sb.append(getStringFromDouble(operationNumbers.get(0)));
for (int i = 0; i < operations.size(); i++) {
sb.append(operations.get(i)).append(
getStringFromDouble(operationNumbers.get(i + 1)));
}
return sb.toString();
} else {
return getStringFromDouble(operationNumbers.get(0)).toString();
}
}
//去掉输入的等式中所有的空格
public static String myTrim(String str){
return str.replaceAll("\\s*", "");
}
//保留两位小数,(如3.14159显示3.14)
public static double getDoubleByPoint(double d){
Format format = new DecimalFormat("#.00");
return Double.parseDouble(format.format(d));
}
//使输出的等式格式良好,如3直接输出3,而不是3.0
public static String getStringFromDouble(double d){
int i = (int)d;
if(i - d == 0){
return i+"";
}
return d+"";
}
}
不带括号的四则运算步骤
最新推荐文章于 2021-02-21 00:22:04 发布