65,206
社区成员
发帖
与我相关
我的任务
分享
////////////////////////
//标准C++编程宝典Chap06
//File Name:pr06025.cpp
////////////////////////
#include <iostream>
#include <cstdlib>
#include <cctype>
//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);
}
/////////////////////////////
/*
Enter expression (0 to quit):
2+3
5
Enter expression (0 to quit):
2*3
6
Enter expression (0 to quit):
(2+3)/3
1
Enter expression (0 to quit):
23+56
79
Enter expression (0 to quit):
((23+56)+80/40)/9-7
2
Enter expression (0 to quit):
89+256*(1024/8+36-100/2)+63-56/7
29328
Enter expression (0 to quit):
89+256*(1024/8+(36-100/2))+(63-56/7)
29328
Enter expression (0 to quit):
*/
//////////////////////////////