ayuda con un automata finito el programa
Hola:
Te queria preguntar si tenes el codigo de automata finito.
desde ya gracias
Te queria preguntar si tenes el codigo de automata finito.
desde ya gracias
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
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