计算器模拟程序


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 :
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值