该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//用于计算整型数据,结果也只可以是整数 例如 (1+2)*3输出结果是9,但是4/5=0 ,0不显示出来 直接结束
#include
#include
#include
//函数原型
int addsubt ();
int multdiv ();
int number ();
void error ();
//全局表达式缓冲器
static char expr[81];
static int pos;
int main ()
{
int ans;
do
{
pos = 0;
//读取表达式
std::cout <(0 to quit):" <
std::cin >> expr;
//求值
ans = addsubt ();
if (expr[pos] != '\0')
error ();
if (ans != 0)
std::cout <
}
while (ans != 0);
return 0;
}
//逆序递归的顶层:加/减
int addsubt ()
{
int rtn = multdiv ();
while (expr[pos] == '+' || expr[pos] == '-')
{
int op = expr[pos++];
int opr2 = multdiv ();
if (op == '+')
rtn += opr2;
else
rtn -= opr2;
}
return rtn;
}
//最高优先级:乘/除
int multdiv ()
{
int rtn = number ();
while (expr[pos] == '*' || expr[pos] == '/')
{
int op = expr[pos++];
int opr2 = number ();
if (op == '*')
rtn *= opr2;
else
rtn /= opr2;
}
return rtn;
}
//计算括号里面
int number ()
{
int rtn;
if (expr[pos] == '(')
{
pos ++;
rtn = addsubt (); //返回到顶层
if (expr[pos++] != ')') //括号必须配对
error ();
return rtn;
}
if (! isdigit (expr[pos]))
error ();
rtn = atoi (expr + pos); //字符串转换成整型
while (isdigit (expr[pos]))
pos ++;
return rtn;
}
//语法错误
void error ()
{
std::cout <
while (pos --) //放置错误指针
std::cout <
std::cout <
exit (-1);
}