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 :