`

计算器模拟程序

    博客分类:
  • java
 
阅读更多
package com.xianfengshangtai.interview;

/**
 * 本程序是一个简单的计算器模拟程序。对任给的正确四则元算表达式,程序计算结果值并输出。
 * 表达式中操作数为无符号整数,运行符为+,-,*,/,圆括号按常规配对,表达式以字符串'='结束 
 *
 */
public class Problem18_21 {
	
	public static void main(String[] args) {
		int value ;
		
		Calculator calcula = new Calculator();
		System.out.println("Please input an expression : ");
		calcula.getChar();
		while(calcula.getCurChar()!='='){
			value = calcula.calc();
			String x = "The result is : "+value;
			System.out.println(x);
			System.out.println("Please input an expression :");
			calcula.getChar();
		}
		
	}

}



package com.xianfengshangtai.interview;


public class Calculator {

	private static char m_aOpChrSet [] = {'+','-','*','/','(',')','=','\0'};

	private static char m_aAllChrSet [] = {'+','-','*','/','(',')','=','0',
		'1','2','3','4','5','6','7','8','9','0','\0'};

	private int m_nNum ;//用户保存输入的数字

	private int m_nCurChr;//用户保存输入的单个字符

	public int getCurChar(){
		return m_nCurChr;
	}

	/**
	 * 
	 * 得到一个合法的输入,包含在m_aAllChrSet中,但不是'\0'的字符
	 */
	public int getChar(){
		int i;
		while(true){
			try{
				m_nCurChr = System.in.read();
				if(m_nCurChr==13||m_nCurChr==10){//如果在键盘上敲入的换行或者回车就重新输入
					continue;
				}
			}catch (Exception e) {
				System.out.println("IO error!");
			}
			if(m_nCurChr==-1){
				return -1;
			}
			//如果输入的字符不在m_aAllChrSet就重新输入,直到i<m_aAllChrSet.length成立
			for(i=0;m_aAllChrSet[i]!='\0'&&m_nCurChr!=m_aAllChrSet[i];i++){
				;
			}
			if(i<m_aAllChrSet.length){
				break;
			}
		}

		return m_nCurChr;
	}

	public int calc(){
		int x1;
		int x2;
		int x3;
		int op1;
		int op2;
		int i = getId();

		/**
		 * x1为操作数
		 */
		if(i==4){
			x1 = calc();
		}else{
			x1 = m_nNum;
		}

		op1 = getId();
		/**
		 * op1为反括号或者等号
		 */
		if(op1>=5){
			return x1;
		}
		i = getId();
		/**
		 * x2为操作数
		 */
		if(i==4){
			x2 = calc();
		}else{
			x2 = m_nNum;
		}

		op2 = getId();

		/**
		 * 反括号时要返回
		 */
		while(op2>=0&&op2<5){
			//while(_op2>=0&&op2<5______P18____)

			i = getId();
			if(i==4){
				x3 = calc();
			}else{
				x3 = m_nNum;
			}
			/**
			 * 如果op1为+或者-并且op2为*或者/
			 */
			if((op1/2==0)&&(op2/2==1)){
				x2 = operate(op2,x2,x3);
			}else{
				x1 = operate(op1, x1, x2);
				//__________P19_______
				x2 = x3;
				op1 = op2;
				//__________P20_______
			}
			op2 = getId();

		}

		return operate(op1, x1, x2);
		//return _______P21__________
	}

	private int getId(){
		int i;
		/**
		 * 获取输入的操作数
		 */
		if(m_nCurChr>='0'&&m_nCurChr<='9'){
			for(m_nNum=0;m_nCurChr>='0'&&m_nCurChr<='9';getChar()){
				m_nNum = m_nNum*10+(m_nCurChr-'0');
				//m_nNum = _________________________ 
			}
			return -1;
		}else{
			/**
			 * 获取输入的操作符
			 */
			for(i = 0;m_aOpChrSet[i]!='\0';i++){
				if(m_aOpChrSet[i]==m_nCurChr){
					break;
				}
			}
			/**
			 * 如果没有输入'=',就一直输入
			 */
			if(i<=5){
				getChar();
			}
			return i;
		}
	}

	private int operate(int op_id,int num1,int num2){
		int ret = 0;
		switch(op_id){
			case 0:      ret = num1 + num2; break;
			case 1:      ret = num1 - num2; break;
			case 2:      ret = num1 * num2; break;
			case 3:      ret = num1 / num2; break;
			default : break;
		}
		return ret;
	}

}



运算结果:
Please input an expression : 
1+2*3+(4*6-5)*6-9=
The result is : 112
Please input an expression :
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics