程序大体思路如下,先定义一个char[]用来保存输入的表达式,之后利用atoi();isdigit();两个函数把字符串转化为算数表达式,逐层调用,先调用加法函数,再调用乘除法,再判断是否存在()提升优先级;求过来人串讲一下细节,看不明白,谢谢了。受累!
////////////////////////////////////////
// File Name: pr06025.cpp
////////////////////////////////////////
#include
#include
#include
// Function prototypes.
int addsubt();
int multdiv();
int number();
void error();
// Global expression buffer.
static char expr[81];
static int pos;
////////////////////////////////////////
// The main() function.
////////////////////////////////////////
int main()
{
int ans;
do
{
// Initialize the string subscript.
pos = 0;
// Read an expression.
std::cout << "Enter expression (0 to quit):"
<< std::endl;
std::cin >> expr;
// Evaluate the expression.
ans = addsubt();
if (expr[pos] != '\0')
error();
if (ans != 0)
std::cout << ans << std::endl;
}
while (ans != 0);
return 0;
}
//////////////////////////////////////////
// Top of recursive descent: add/subtract.
//////////////////////////////////////////
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;
}
////////////////////////////////////////
// Highest precedence: multiply/divide.
////////////////////////////////////////
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;
}
////////////////////////////////////////
// Extract a number.
////////////////////////////////////////
int number()
{
int rtn;
if (expr[pos] == '(')
{
// Parenthetical expression.
pos++;
rtn = addsubt(); // Back to top.
if (expr[pos++] != ')') // Must have ')'
error();
return rtn;
}
// Extract the number.
if (!isdigit(expr[pos]))
error();
rtn = atoi(expr+pos);
while (isdigit(expr[pos]))
pos++;
return rtn;
}
////////////////////////////////////////
// Syntax error.
////////////////////////////////////////
void error()
{
std::cout << '\r';
while (pos--) // Position error pointer.
std::cout << ' ';
std::cout << "^ syntax error" << std::endl << '\a';
exit(-1);
}