不带括号的四则运算步骤

2 篇文章 0 订阅
1 篇文章 0 订阅
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+"";
	}

}

#include<stdio.h> #include<stdlib.h> struct four { double a; struct four *next; //定义结构体,作为链表的节点. }; void main() { double sum(void); //函数声明. 该函数返回等式的计算结果. 有优先级的运算符号在函数内部先进行计算。 double sum1; printf("请输入等式,以 '=' 结束, 例如“ 2*2*3-2/2= ” 结果将自动保留六位有效数字\n"); sum1=sum(); printf("该等式的结果为:\t%f\n\n",sum1); } double sum(void) { struct four *head,*pnew,*ptail,*p,*q; //结构体成员. char ah; double s=0,last; //last作为 pnew->a 的前一个数值. int j=1; q=(struct four *)malloc(sizeof(struct four)); scanf("%lf%c",&q->a,&ah); last=q->a; while(j==1 && ah!='=') //头节点的建立. { switch(ah) //对运算符号的优先级进行选择,优先级高的先进行计算. { case '+': j=0; continue; break; case '-': j=0; continue; break; case '*': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last*q->a; break; case '/': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last/q->a; break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } last=q->a; scanf("%c",&ah); } pnew=(struct four *)malloc(sizeof(struct four)); pnew->a=q->a; //将头节点的信息传递给 head 和 ptail. head=ptail=pnew; while(ah!='=') //接下来节点的建立. { pnew=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&pnew->a); switch(ah) { case '*': pnew->a=last*pnew->a; break; case '/': pnew->a=last/pnew->a; break; case '+': break; case '-': pnew->a=-pnew->a;break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } scanf("%c",&ah); if(ah=='-' || ah=='+'|| ah=='=') //将值进行传递 ptail->next=pnew. { ptail->next=pnew; ptail=pnew; } last=pnew->a; } ptail->next=NULL; p=head; while(p!=NULL) //各个节点数值相加的结果,有优先级符号的已经先计算了. { s=s+(p->a); p=p->next; } return s; //返回运算结果. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值