오토마타

프로그래밍/C/C++ 2007. 4. 9. 16:56 |

#include
#include
#include
enum STATE{IS_START, IS_INTEGER, IS_OCTAL, IS_HEXA, IS_POINT, IS_POWER, IS_QUIT};
bool plus = true;
bool powerPlus = true;

int main()
{
int NowState = 0;
int CharLen = 0;
int index = 0;
double result = 0;
int length = 0;
int temp = 0;
int square = 0;
char data[10];

printf("Input Data: ",data);
scanf("%s", data);
CharLen = strlen(data);

if(data[0] == '-')
{
plus = false;
index = 1;
}

while(index != CharLen)
{
switch(NowState)
{
case IS_START:
if(data[index] >= (int)'1' && data[index] <= (int)'9')
NowState = IS_INTEGER;
else if(data[index] == (int)'0')
NowState = IS_OCTAL;
else NowState = IS_QUIT;
break;
case IS_INTEGER:
if(data[index] >= (int)'0' && data[index] <= (int)'9')
NowState = IS_INTEGER;
else if(data[index] == (int)'0')
NowState = IS_OCTAL;
else if(data[index] == (int)'.')
NowState = IS_POINT;
else if(data[index] == (int)'E' || data[index] == (int)'e')
NowState = IS_POWER;
else NowState = IS_QUIT;
break;
case IS_OCTAL:
if(data[index] >= (int)'0' && data[index] <= (int)'9')
NowState = IS_OCTAL;
else if(data[index] == (int)'x')
NowState = IS_HEXA;
else if(data[index] == (int)'.')
NowState = IS_POINT;
else NowState = IS_QUIT;
break;
case IS_HEXA:
if(data[index] >= (int)'0' && data[index] <= (int)'9')
NowState = IS_HEXA;
else if((data[index] >= (int)'A' && data[index] <= (int)'F')
||(data[index] >= (int)'a' && data[index] <= (int)'f'))
NowState = IS_HEXA;
else if(data[index] == (int)'.')
NowState = IS_POINT;
else NowState = IS_QUIT;
break;
case IS_POINT:
if(data[index] >= (int)'0' && data[index] <= (int)'9')
NowState = IS_POINT;
else if(data[index] == (int)'E' || data[index] == (int)'e')
NowState = IS_POWER;
else NowState = IS_QUIT;
case IS_POWER:
if(data[index] == (int)'-')
{
powerPlus = false;
break;
}
else if(data[index] >= (int)'0' && data[index] <= (int)'9')
{
NowState = IS_POWER;
}
else NowState = IS_QUIT;

break;
}//End of Switch
index++;
}//End of While

printf("nNowState: ");
if(plus == false)
printf("-");
switch(NowState)
{
case IS_START:
printf("Start");
break;
case IS_INTEGER:
result = atoi(data);
printf("integer");
break;
case IS_OCTAL:
if(plus==true)
length = CharLen-1;
else length = CharLen-2;
index = CharLen;
square = 1;
while(index>CharLen-length)
{
temp = ((int)data[index-1]-48);
result += temp*square;
square = square*8;
index--;
}
printf("octal");
break;
case IS_HEXA:
if(plus==true)
length = CharLen-2;
else length = CharLen-3;
index = CharLen;
square = 1;
while(index>CharLen-length)
{
if(data[index-1] >= (int)'A' && data[index-1] >= (int)'F')
temp = (int)data[index-1]-54;
else if(data[index-1] >= (int)'a' && data[index-1] >= (int)'f')
temp = (int)data[index-1]-86;
else temp = (int)data[index-1]-48;
result += temp*square;
square = square*16;
index--;
}
printf("hexa");
break;
case IS_POWER:
printf("power");
break;
case IS_QUIT:
printf("quit");
}

printf("nDataResult: %0.3lf", result);

return 0;
}

Posted by YoungMoon
: