您的位置:首页 > 其它

返回数值类型

2011-01-03 22:38 127 查看
代码

///////////////////////////////////////////////////////////////////////////////////////////
//    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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: