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

📄 fsm.cpp

📁 This program can determin very accurately the nature of the user input
💻 CPP
字号:
///////////////////////////////////////////////////////////////////////////////////////////
//	This program can determin very accurately the nature of the user input,
//	it detects whether it is an integer, a float, a number in scientific notation
//	or simply an invalid input. To be capable of doing this the program uses a simple FSM
//	(FINITE STATE MACHINE) to represent the possible states of the input.( INT, FLOAT,.. )
//	author: Gonzales Cenelia
///////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
using std::cin;
using std::endl;
using std::cout;

//===========================================================================
//		the list of all the possible states for the current FSM
//===========================================================================
enum STATE{ START, INT, FLOAT, SCIENTIFIC, EXPONENT, S1, S2, INVALID } state;

STATE Transition( char *str );
void PrintState( STATE state );

int main() {
	// declaring buffer variable
	char buffer[32] = {0}; 
	// geting input from the user
	cout << "\nPlease enter a number: ";
	cin.getline( buffer, 32 );
	// compute final state
	STATE FINAL_STATE = Transition(buffer);
	// prints the final state
	PrintState(FINAL_STATE);
	return 0;
}

//================================================
// makes the transition from one state to another
//================================================
STATE Transition( char *str ) {
	int NEXT_SYMBOL;
	for( ; *str && state != INVALID; str++ ) {
		NEXT_SYMBOL = *str;
		switch(state) {
		case START:
			if(isdigit(NEXT_SYMBOL)) {
				state = INT;
			}
			else if( NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-' ) {
				state = S1;
			}
			else if( NEXT_SYMBOL == '.' ) {
				state = FLOAT;
			}
			else {
				state = INVALID;
			}
			break;
		case S1:
			if(isdigit(NEXT_SYMBOL)) {
				state = INT;
			}
			else if( NEXT_SYMBOL == '.' ) {
				state = FLOAT;
			}
			else if(!isdigit(NEXT_SYMBOL)) {
				state = INVALID;
			}
			break;
		case INT:
			if( NEXT_SYMBOL == '.' ) {
				state = FLOAT;
			}
			else if(!isdigit(NEXT_SYMBOL)) {
				state = INVALID;
			}
			break;
		case FLOAT:
			if( NEXT_SYMBOL == 'E' || NEXT_SYMBOL == 'e' ) {
				state = S2;
			}
			else if(!isdigit(NEXT_SYMBOL)) {
				state = INVALID;
			}
			break;
		case S2:
			if( NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-' ) {
				state = EXPONENT;
			}
			else {
				state = INVALID;
			}
			break;
		case EXPONENT:
			if(isdigit(NEXT_SYMBOL)) {
				state = SCIENTIFIC;
			}
			else {
				state = INVALID;
			}
			break;
		case SCIENTIFIC:
			if(!isdigit(NEXT_SYMBOL)) {
				state = INVALID;
			}
			break;
		}
	}
	return state;
}

//=====================================
// prints the current state of the FSM
//=====================================
void PrintState( STATE state ) {
	cout << "\nFSM state: ";
	switch(state) {
	case INT:
		cout << "INT ";
		break;
	case FLOAT:
		cout << "FLOAT ";
		break;
	case SCIENTIFIC:
		cout << "SCIENTIFIC ";
		break;
	case INVALID:
		cout << "INVALID ";
		break;
	}
}







⌨️ 快捷键说明

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