Premetto che forse sarebbe meglio aprire un altro 3d per parlare di macchine o automi a stati finiti.
Ma per ora facciamo qui.
Devo ancora leggere e rileggere il tuo post Robo,mi scuserai, ma il tempo è quello che è.
Come detto gli automi a stati finiti (o macchine a stati finiti, da ricerche, dovrebbero essere la stessa cosa),
io li ho usati e studiati un po' come metodo per la valutazione di stringhe, ma credo che possano fare altro.
Se non erro, ma dovrei ripassare, si possono dividere in deterministici e non deterministici. Nel caso approfondiremo.
A volte può capitare di dover analizzare una stringa e accettarla solo in determinate condizioni. Es:
la "a" può essere seguita solo da una b, ma 2 'a' consecutive ti concedono la' b' e via dicendo....
Si rischia d'impazzire a suon di if...e qualche caso garantito al 100% ti sfugge sempre.
Si può ricorrere allora agli automi.
Nel programmino seguente, la stringa è accetta solo se non contiene a seguito da b (banale, ma è un esempio)
Se non ricordo male, per far ciò si ricorre ad un grafo orientato e pesato.
Orientato nel senso che si va da un punto all'altro con un verso e pesato nel senso che l'arco che li congiunge è legato
ad un evento.
con questo grafico si vede come ho realizzato l'automa "ab". Molto probabilmente si può fare molto meglio con meno nodi,ma erano le prime prove:
E questa è il programma:
CODICE
#include <stdio.h>
#include <stdlib.h>
//--------------------------------------------------------------------
int isvalue(char* s)
{
char ttable[8][4] = {{1,3,6,7},
{1,7,2,7},
{1,3,2,7},
{4,3,5,7},
{4,7,3,7},
{3,7,5,7},
{1,3,6,7},
{7,7,7,7}};
int event;
int stat = 0;
while(*s)
{
char c = *s++;
if (c=='a') event = 0;
else if (c=='b') event = 1;
else if (c>='c' && c<='z') event = 2;
else event = 3;
stat = ttable[stat][event];
}
return stat==1 || stat==2 || stat==3 || stat==4 || stat==5 || stat==6;
}
//--------------------------------------------------------------------
int main(void)
{
char st[128] = "sto abbastanza bene";
int res;
res= isvalue(st);
if (res!=0)
printf ("stringa accettata\n");
else
printf ("stringa NON accettata\n");
return 0;
}
Non so se tutto questo è quello che intendete, e nel caso devo capire bene come lo adattate a quello che dite