ayuda con un automata finito el programa

bob marley
06 de Mayo del 2008
nececito un programa de un automata finito en lenguace en c/c++

NYuyito
06 de Mayo del 2008
Hola:
Te queria preguntar si tenes el codigo de automata finito.
desde ya gracias

Noel Solw
06 de Mayo del 2008
El programa anterior corresponde a un "automata finito"

Noel Solw
06 de Mayo del 2008
Te envio un programa que implementa 2 automatas finitos para solucionar el problema de la calculadora.
Espero te sea util.

// program k9d7.CPP - page 213
// pointers to functions : command line calculator
// 23/3/2002
// written in Borland CPP ver 3.1

#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#include <stdlib.h>

#define NOT_FOUND -999

enum TokenType {INT,FLOAT,STRING,PLUS,MINUS,MULT,DIV,NONE};
enum InputType {DIGIT,POINT,CHAR,PLUS_MINUS};

char *result;

InputType GetInputType(char a)
{
switch(a)
{
case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
case '5' :
case '6' :
case '7' :
case '8' :
case '9' : return DIGIT;
case '.' : return POINT;
case '+' :
case '-' : return PLUS_MINUS;
default : return CHAR;
} // SWITCH a
} // GET INPUT TYPE

TokenType GetTokenType(char *str)
{ // finite deterministic automata
// state : 0 1 2 3 4
int trans[4][5] = {{ 2, 2, 2, 3, 4}, // DIGIT
{ 3, 3, 3, 4, 4}, // POINT
{ 4, 4, 4, 4, 4}, // CHAR
{ 1, 4, 4, 4, 4}}; // PLUS MINUS
if(strlen(str) == 1)
switch(str[0])
{
case '+' : return PLUS;
case '-' : return MINUS;
case '*' : return MULT;
case '/' : return DIV;
}
int state = 0;
for(int i = 0;i < strlen(str);i++)
{
InputType in = GetInputType(str[i]);
state = trans[in][state];
}
switch(state)
{
case 2 : return INT;
case 3 : return FLOAT;
case 4 : return STRING;
default : return NONE;
} // SWITCH STATE
} // GET TOKEN TYPE

int GetFunctionIndex(char *first,char *opera,char *second)
{ // finite deterministic automata
// state : 0 1 2 3 4 5 6 7 8
int trans[8][9] = {{ 1, 4, 5, 7, 8, 8, 8, 8, 8}, // INT
{ 2, 5, 5, 8, 8, 8, 8, 8, 8}, // FLOAT
{ 3, 8, 8, 6, 8, 8, 8, 8, 8}, // STRING
{ 8, 8, 8, 8,10,14,18, 8, 8}, // PLUS
{ 8, 8, 8, 8,11,15, 8, 8, 8}, // MINUS
{ 8, 8, 8, 8,12,16, 8,19, 8}, // MULT
{ 8, 8, 8, 8,13,17, 8,20, 8}, // DIV
{ 8, 8, 8, 8, 8, 8, 8, 8, 8}}; // NONE
int state = 0;
TokenType in = GetTokenType(first);
state = trans[in][state];
in = GetTokenType(second);
state = trans[in][state];
in = GetTokenType(opera);
state = trans[in][state];
if(state < 10)
return NOT_FOUND;
return state - 10;
} // GET FUNCTION INDEX

char *PlusInt(char *str1,char *str2)
{
int a = atoi(str1),
b = atoi(str2);
int la = strlen(str1),
lb = strlen(str2);
char *result = new char [la > lb ? la+1 : lb+1];
itoa(a+b,result,10);
return result;
} // PLUS INT

char *MinusInt(char *str1,char *str2)
{
int a = atoi(str1),
b = atoi(str2);
int la = strlen(str1),
lb = strlen(str2);
result = new char [la > lb ? la+1 : lb+1];
itoa(a-b,result,10);
return result;
} // MINUS INT

char *MultiplyInt(char *str1,char *str2)
{
int a = atoi(str1),
b = atoi(str2);
result = new char [strlen(str1)+strlen(str2)];
itoa(a*b,result,10);
return result;
} // MULTIPLY INT

char *DivideInt(char *str1,char *str2)
{
int a = atoi(str1),
b = atoi(str2);
if(!b)
return "division by zero error ! ! !";
result = new char [strlen(str1)];
itoa(a/b,result,10);
return result;
} // DIVIDE INT

char *PlusFloat(char *str1,char *str2)
{
float a = atof(str1),
b = atof(str2);
int dec,sign;
char *p = fcvt(a+b,3,&dec,&sign);
result = new char[strlen(p)+sign];
strset(result,0);
if(sign)
strcat(result,"-");
strncat(result,p,dec);
strcat(result,".");
strcat(result,p+dec);
return result;
} // PLUS FLOAT

char *MinusFloat(char *str1,char *str2)
{
float a = atof(str1),
b = atof(str2);
int dec,sign;
char *p = fcvt(a-b,3,&dec,&sign);
result = new char[strlen(p)+sign];
strset(result,0);
if(sign)
strcat(result,"-");
strncat(result,p,dec);
strcat(result,".");
strcat(result,p+dec);
return result;
} // MINUS FLOAT

char *MultiplyFloat(char *str1,char *str2)
{
float a = atof(str1),
b = atof(str2);
int dec,sign;
char *p = fcvt(a*b,3,&dec,&sign);
result = new char[strlen(p)+sign];
strset(result,0);
if(sign)
strcat(result,"-");
strncat(result,p,dec);
strcat(result,".");
strcat(result,p+dec);
return result;
} // MULTIPLY FLOAT

char *DivideFloat(char *str1,char *str2)
{
float a = atof(str1),
b = atof(str2);
int dec,sign;
char *p = fcvt(a/b,3,&dec,&sign);
result = new char[strlen(p)+sign];
strset(result,0);
if(sign)
strcat(result,"-");
strncat(result,p,dec);
strcat(result,".");
strcat(result,p+dec);
return result;
} // DIVIDE FLOAT */

char *PlusString(char *str1,char *str2)
{
result = new char[strlen(str1) + strlen(str2)];
strcpy(result,str1);
return strcat(result,str2);
} // PLUS STRING

char *MultiplyString(char *str1,char *str2)
{
int num = atoi(str2);
result = new char[strlen(str1)*num];
result[0] = 0;
for(int i = 0;i < num;i++)
strcat(result,str1);
return result;
} // MULTIPLY STRING

char *DivideString(char *str1,char *str2)
{
int index = strlen(str1) / atoi(str2);
if(!index)
return "empty string";
str1[index] = 0;
return str1;
} // MULTIPLY STRING

void Process(char *argv[])
{
char* (*pF[11])(char*,char*) = {PlusInt,MinusInt,MultiplyInt,DivideInt,
PlusFloat,MinusFloat,
MultiplyFloat,DivideFloat,
PlusString,MultiplyString,DivideString};
for(int i = 1;i < 4;i++)
cout << argv[i] << " ";
cout << "= ";
int index = GetFunctionIndex(argv[1],argv[2],argv[3]);
if(index == NOT_FOUND)
cout << "not allowed operation ! ! !" << endl;
else
cout << pF[index](argv[1],argv[3]) << endl;
} // PROCESS

void main(int argc,char *argv[])
{
clrscr();
cout << "pointers to functions : command line calculator.n";
cout << "-----------------------------------------------------"
"-------------------------n";
if(argc != 4)
cout << "wrong arguments number ! ! !" << endl;
else
Process(argv);
cout << "-----------------------------------------------------"
"-------------------------n";;
cout << "end of program - good bye ! ! !n";
getch();
} // MAIN