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

📄 cpp03.cpp

📁 C++参考书
💻 CPP
字号:

// Coded by plusir -- Dec.29.2002.
// Standard C++ Bible -- (P213-7-3)

#include <iostream>
#include <cctype>
#include <csetjmp>
using namespace std ;

int addsubt( void ) ;
int multdiv( void ) ;
int number( void ) ;
void error( void ) ;

static char expr[81] ;
static int pos ;
static jmp_buf errjb ;

int main()
{
	int ans ;

	do {

		if ( setjmp( errjb ) == 0 ) {
            pos = 0 ;

			cout << "Enter expression( 0 to quit ): " ;
			cin >> expr ;

			ans = addsubt() ;

			if ( expr[pos] != '\0' )
				error() ;

			if ( ans != 0 )
				cout << ans << endl ;
		}
		else {
			cout << "Try again." << endl ;
			ans = 1 ;
		}

	} while ( ans != 0 ) ;

	return 0 ;
}

int 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 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 number( void )
{
	int rtn ;

	if ( expr[pos] == '(' ) {
		pos++ ;
		rtn = addsubt() ;
		if ( expr[pos++] != ')' )
			error() ;
		return rtn ;
	}

	if ( ! isdigit( expr[pos] ) )
		error() ;

	rtn = atoi( expr + pos ) ;

	while ( isdigit( expr[pos] ) )
		pos++ ;

	return rtn ;
}

void error( void )
{
	cout << '\r' ;
	while ( pos-- )
		cout << ' ' ;
	cout << "^syntax error" << endl << '\a' ;
	
	longjmp( errjb, 1 ) ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -