⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpp07.cpp

📁 C++参考书
💻 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 + -