📄 cpp07.cpp
字号:
// Coded by plusir -- Jan.15.2003.
// Standard C++ Bible -- (P720-25-7)
#include <iostream>
#include <cstdlib>
#include <cctype>
#include <string>
using namespace std ;
class Error { } ;
// --------------------------------------------------------- class Calculator
class Calculator
{
public:
Calculator( void ) { }
int compute( const string & ) throw( Error ) ;
private:
int pos ;
string expr ;
int addsubt( void ) ;
int multdiv( void ) ;
int number( void ) throw( Error ) ;
} ;
int Calculator::compute( const 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 ) {
cout << "\r" ;
while ( pos-- )
cout << ' ' ;
cout << "^syntax error" << endl ;
throw ;
}
return rtn ;
}
int Calculator::addsubt( void )
{
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 Calculator::multdiv( void )
{
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 Calculator::number( void ) throw( Error )
{
int rtn ;
if ( expr[pos] == '(' ) {
pos++ ;
rtn = addsubt() ;
if ( expr[pos++] != ')' )
throw Error() ;
}
else {
if ( !isdigit( expr[pos] ) )
throw Error() ;
char ans[80] = "0" ;
int i = 0 ;
while ( isdigit( expr[pos] ) && pos < expr.length() )
ans[i++] = expr[pos++] ;
ans[i] = '\0' ;
rtn = atoi( ans ) ;
}
return rtn ;
}
int main()
{
int ans ;
do {
cout << "Enter expression( 0 to quit ):" << endl ;
string expr ;
cin >> expr ;
try {
Calculator calc ;
ans = calc.compute( expr ) ;
if ( ans != 0 )
cout << ans << endl ;
}
catch( Error ) {
cout << "Try again" << endl ;
ans = 1 ;
}
} while( ans != 0 ) ;
return 0 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -