📄 pr25007.cpp
字号:
////////////////////////////////////////
// File Name: pr25007.cpp
////////////////////////////////////////
#include <iostream>
#include <cstdlib>
#include <cctype>
#include <string>
// Declare the error class.
class Error {};
////////////////////////////////////////
// Calculator class declaration.
////////////////////////////////////////
class Calculator
{
int pos;
std::string expr;
int addsubt();
int multdiv();
int number() throw(Error);
public:
Calculator(){ }
int Compute(const std::string& str) throw(Error);
};
////////////////////////////////////////
// Calculator class definition.
////////////////////////////////////////
int Calculator::Compute(const std::string& str) throw(Error)
{
int rtn = 0;
try
{
pos = 0;
expr = str;
rtn = addsubt();
if (pos < expr.length() && expr[pos] != '\0')
throw Error();
}
catch(Error)
{
std::cout << '\r';
while (pos--) // position error pointer
std::cout << ' ';
std::cout << "^ syntax error" << std::endl << '\a';
throw;
}
return rtn;
}
// Top of recursive descent: add/subtract.
int Calculator::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 Calculator::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 Calculator::number() throw(Error)
{
int rtn;
if (expr[pos] == '(')
{
// Parenthetical expression.
pos++;
rtn = addsubt(); // Back to top.
if (expr[pos++] != ')') // Must have ')'
throw Error();
}
else
{
// Extract the number.
if (!std::isdigit(expr[pos]))
throw Error();
char ans[80] = "0";
int i = 0;
while (std::isdigit(expr[pos]) && pos < expr.length())
ans[i++] = expr[pos++];
ans[i] = '\0';
rtn = std::atoi(ans);
}
return rtn;
}
////////////////////////////////////////
// The main() function.
////////////////////////////////////////
int main()
{
int ans;
do
{
// Read an expression.
std::cout << "Enter expression (0 to quit):"
<< std::endl;
std::string expr;
std::cin >> expr;
try
{
Calculator calc;
ans = calc.Compute(expr);
if (ans != 0)
std::cout << ans << std::endl;
}
catch(Error)
{
std::cout << "Try again" << std::endl;
ans = 1;
}
}
while (ans != 0);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -