不带括号的四则运算步骤

来源:互联网 发布:淘宝女棉拖 编辑:程序博客网 时间:2024/04/25 18:19
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.0public static String getStringFromDouble(double d){int i = (int)d;if(i - d == 0){return i+"";}return d+"";}}

原创粉丝点击