Forum by laureateci.it
[ Home | REGOLE FORUM | Tutti i blog | Profilo | Registrati | CHAT | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Download Informatica | Download ICD | Download TPS | Download Magistrale | Download Specialistica | Giochi | Cerca nel web | cerca | faq | RSS ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 INFORMATICA - Primo Anno
 Linguaggi di programmazione
 aiuto automa in c

Nota: Devi essere registrato per poter inserire un messaggio.
Per registrarti, clicca qui. La Registrazione è semplice e gratuita!

Larghezza finestra:
Nome Utente:
Password:
Modo:
Formato: GrassettoCorsivoSottolineatoBarrato Aggiungi Spoiler Allinea a  SinistraCentraAllinea a Destra Riga Orizzontale Inserisci linkInserisci EmailInserisci FlashInserisci Immagine Inserisci CodiceInserisci CitazioneInserisci Lista Inserisci Faccine
   
Icona Messaggio:              
             
Messaggio:

  * Il codice HTML è OFF
* Il Codice Forum è ON

Smilies
Approvazione [^] Arrabbiato [:(!] Bacio [:X] Bevuta [:273]
Caldo [8D] Compiaciuto [8)]    
compleanno [:269]
Davvero Felice [:D] Diavoletto [}:)] Disapprovazione [V] Domanda [?]
Felice [:)] Fumata [:29] Goloso [:P] Imbarazzato [:I]
Infelice [:(] Morte improvvisa da [:62]
Morto [xx(] Occhio Nero [B)] Occhiolino [;)] Palla 8 [8]
pc [:205]    
Riproduzione [:76]
Scioccato [:O]      

   Allega file
  Clicca qui per inserire la tua firma nel messaggio.
Clicca qui per sottoscrivere questa Discussione.
    

V I S U A L I Z Z A    D I S C U S S I O N E
Mil Inserito il - 13/09/2005 : 16:30:53
Ciao a tutti, da un pò mi sto fissando su un esempio stupido di automa (giusto per prendere confidenza con il c) che non gira.
lo scopo è riconoscere numeri del tipo 080#,0880# ecc..
mi da 10 errori ma non capisco dove sia sbagliato.

#include <iostream.h>
#include <stdlib.h>
#define MAX_LENGHT 100

typedef char symbol;
int scan(char* s)
{
enum {q0,q1,q2,q3,q4,pozza} current_state=q0;
int i=0;
while ((s[i]!='\0' && s[i]!='\n') && current_state != pozza)
{
switch(current_state)
{
case q0:
if(s[i]=='0')
current_state=q1;
else
current_state=pozza;
break;

case q1:
if (s[i]>='1' && s[i]<='9')
current_state=q2;
else
current_state=pozza;
break;

case q2:
if (s[i]=='0')
current_state=q3;
else if (s[i]>='1' && s[i]<='9')
current_state=q2;
else
current_state=pozza;
break;

case q3:
if (s[i]=='#')
current_state=q4;
else
current_state=pozza;
break;
}
++i;
}
if(current_state==pozza)
printf("si e' giunti in uno stato POZZA");
else if(current_state!=q4)
printf("si e' giunti in uno stato non finale");
return(current_state==q4);
}




int main(int argc, char* argv[])
{
char buffer[MAX_LENGHT+1];
char* filename = argv[1];
FILE*file;
file=fopen(filename,"r");
if (file==NULL)
{
printf("il file e' inesistente");
return -1;
}
while(!feof(file))
{
if(fgets(buffer,MAX_LENGHT,file))
if scan(buffer)
printf("%s la stringa e' valida\n", buffer);
else
printf("%s la stringa non e' valida\n",buffer);
}
fclose(file);
system("PAUSE");
return 0;
}

sicuramente è una cazzata ma se non faccio questo come faccio il resto!
grazie.
18   U L T I M E    R I S P O S T E    (in alto le più recenti)
Mil Inserito il - 30/10/2005 : 10:52:04
questo è il problema:
Acquisita una grammatica, contare le produzioni in cui i primi due simboli della parte sinistra sono uguali agli ultimi due della parte destra (es: abCd>ccab)

aiutatemi e ve ne sarò grato!

io ho fatto questo tentativo:

int esercizio (Grammar* g)
{
int i=0;
int j=0;
int z=0;
Symbol primo;
Symbol secondo;
int cont=0;
Symbol ultimo;
Symbol penultimo;
int lung=0;

for (i=0; i<g->numprod; i++)
{
primo=g->productions[i].left.word[0];
secondo=g->productions[i].left.word[1];
for(j=0; j<g->productions[i].right.length; j++);
{
ultimo=g->productions[i].right.word[lung];
penultimo=g->productions[i].right.word[lung-1];

if((primo==penultimo) && (secondo==ultimo))
cont++;
}

}
return(cont);
}
mrluglio Inserito il - 23/10/2005 : 10:11:22
prego!
Mil Inserito il - 23/10/2005 : 09:22:16
E' una bella soluzione, grazie per l'aiuto!
mrluglio Inserito il - 23/10/2005 : 00:10:45
si..dovrebbe andare...
però ho come l'impressione che sprechi stati...
Basterebbe usare lo stato iniziale per controllare la presenza del primo apice, un secondo stato per leggere tutti i caratteri meno l'apice (e ovviamente i ritorni a capo) e un terzo stato che dovrebbe essere quello finale incaricato di controllare la presenza di un solo apice. Se è presente un carattere dopo il secondo apice è lo switch stesso a controllare l'errore e a passare in "pozza" e tu non hai bisogno di mettere ulteriori controlli.

Questo qui sotto riconosce le stringhe del tuo problema (ovvero quelle tipo 'asdsd12321') e non quello della traccia "ufficiale".
Ok?



#include <stdio.h>
#include <stdlib.h>
#define max 100

int scan(char* s){
    enum {S,A,B,C,D,pozza} current_state=S;
    int i = 0;
    while ((s[i] != '\0' && s[i] != '\n') && current_state != pozza)
    {
        switch(current_state)
        {
            case S:
                if (s[i] == '\'')
                    current_state = A;
                else current_state=pozza;
            break;

            case A:
                if (s[i] =='\'')
                    current_state = B;
                // altrimenti resta in A
            break;

            case B:
                // se legge qualcosa dopo ' è un errore!
               current_state = pozza;
            break;
        }
        i++;
    }
    return(current_state == B);
}


int main(int argc, char* argv[])
{
    char buffer[max + 1];
    char* filename = argv[1];
    FILE* file;
    file = fopen(filename,"r");
    if (file==NULL)
        printf("il file non esiste\n");
    else while(!feof(file)){
        if (fgets(buffer,max,file))
            if (scan(buffer))  // avevi scritto scan(file)
                printf("la stringa %s è valida\n",buffer);
            else
                printf("la stringa %s NON è valida\n",buffer);

    }

    system("PAUSE");
    return 0;
}
Mil Inserito il - 22/10/2005 : 17:48:11
Citazione:
Messaggio inserito da mrluglio

per le stringhe che hai scritto funziona. se però mi dai la traccia precisa potrei correggerlo


Progettare, commentando opportunamente, il frammento di analizzatore lessicale (automa a stati finiti) in grado di riconoscere le stringhe che iniziano e terminano con due caratteri "apice singolo", proponendone una realizzazione in linguaggio C.
(era nello scritto ma io ho preso spunto per farne uno di laboratorio)

Cmq grazie, ora gira senza problemi.


[quote]
visto che legge stringhe come 'asdfg01234'dsa (e non mi sembra che termini con un ')
[quote]

case D:
if (s[i]!='\0')
current_state=pozza;
break;

che ne dici?





mrluglio Inserito il - 21/10/2005 : 19:18:41

#include <stdio.h>
#include <stdlib.h>
#define max 100

int scan(char* s){
    enum {S,A,B,C,D,pozza} current_state=S;
    int i=0;
    while ((s[i]!='\0' && s[i]!='\n') && current_state!=pozza)
    {
        switch(current_state)
        {
            case S:
                if (s[i]=='\'')
                    current_state=A;
                else current_state=pozza;
            break;

            case A:
                if (s[i]>='a' && s[i]<='z')
                    current_state=B;
                else if (s[i]>='0' && s[i]<='9')
                    current_state=C;
                else current_state=pozza;
            break;

            case B:
                if (s[i]>='a' && s[i]<='z')
                    current_state=B;
                else if (s[i]>='0' && s[i]<='9')
                    current_state=B;
                else if (s[i]=='\'')
                    current_state=D;
                else current_state=pozza;
            break;

            case C:
                if (s[i]>='a' && s[i]<='z')
                    current_state=C;
                else if (s[i]>='0' && s[i]<='9')
                    current_state=C;
                else if (s[i]=='\'')
                    current_state=D;
                else current_state=pozza;
            break;
        }
        i++;
    }
    return(current_state==D);
}


int main(int argc, char* argv[])
{
    char buffer[max+1];
    char* filename=argv[1];
    FILE*file;
    file=fopen(filename,"r");
    if (file==NULL)
        {
        printf("il file non esiste\n");
        //return -1;
    }else
    while(!feof(file))
    {
        if (fgets(buffer,max,file))
            if (scan(buffer))  // avevi scritto scan(file)
                printf("%s la stringa è valida\n",buffer);
            else
                printf("%s la stringa NON è valida\n",buffer);

    }

    system("PAUSE");
    return 0;
}


per le stringhe che hai scritto funziona. se però mi dai la traccia precisa potrei correggerlo
visto che legge stringhe come 'asdfg01234'dsa (e non mi sembra che termini con un ')

Mil Inserito il - 21/10/2005 : 18:24:36
ho un nuovo quesito per voi.

creare una utoma che acchetta solo stringhe che iniziano e finiscono con il carattere '
tipo:
'asdfg01234' accettato
asdfg0123 non accettato

io ho provato così ma non va (non accetta nessuna)


#include <stdio.h>
#include <stdlib.h>
#define max 100

int scan(char* s)
{
enum {S,A,B,C,D,pozza} current_state=S;
int i=0;
while ((s[i]!='\0' && s[i]!='\n') && current_state!=pozza)
{
switch(current_state)
{
case S:
if (s[i]=='\'')
current_state=A;
else current_state=pozza;
break;

case A:
if (s[i]>='a' && s[i]<='z')
current_state=B;
else if (s[i]>='0' && s[i]<='9')
current_state=C;
else current_state=pozza;
break;

case B:
if (s[i]>='a' && s[i]<='z')
current_state=B;
else if (s[i]>='0' && s[i]<='9')
current_state=B;
else if (s[i]=='\'')
current_state=D;
else current_state=pozza;
break;

case C:
if (s[i]>='a' && s[i]<='z')
current_state=C;
else if (s[i]>='0' && s[i]<='9')
current_state=C;
else if (s[i]=='\'')
current_state=D;
else current_state=pozza;
break;
}
i++;
}
return(current_state==D);
}


int main(int argc, char* argv[])
{
char buffer[max+1];
char* filename=argv[1];
FILE*file;
file=fopen(filename,"r");
if (file==NULL)
{
printf("il file non esiste");
return -1;
}
while(!feof(file))
{
if (fgets(buffer,max,file))
if (scan(file))
printf("%s la stringa è valida\n",buffer);
else
printf("%s la stringa NON è valida\n",buffer);

}

system("PAUSE");
return 0;
}

ringrazio anticipatamente chi mi vorrà aiutare!
Mil Inserito il - 19/09/2005 : 11:55:58
infatti, adesso è tutto chiaro...
meno male che quando vado in panico ci sei tu ad aiutarmi!!!
cmq più in là faro il grammar reader...
preparati...
panico Inserito il - 19/09/2005 : 11:49:55
Allora, il fatto che ti dia una schermata in nero ti dovrebbe suggerire che c'è qualche problema sul loop! Infatti se controlli qui

while ((s[i]!='\0' && s[i]!='\n') && current_state!=pozza);

hai piazzato un ";" che non ci dovrebbe essere!

In più, l'automa non darà i risultati previsti, perchè scrivere

return (current_state=q5);

è un po' diverso da scrivere

return (current_state==q5);
Mil Inserito il - 19/09/2005 : 11:47:47
Ho trovato... che errore di me*da!!!!
il ; del ciclo while!!!!

while ((s[i]!='\0' && s[i]!='\n') && current_state!=pozza);

vabbè... grazie panico!!
Mil Inserito il - 19/09/2005 : 11:42:43
inoltre se sostituisco:

enum {q0,q1,q2,q3,q4,q5,pozza} current_state=q0;

con:

enum {q0,q1,q2,q3,q4,q5,pozza} current_state=pozza;

il programma gira ma le stringhe risultano sempre non valide...

AMMIN'G NA' PEZZ!!!

Mil Inserito il - 19/09/2005 : 11:38:22
Ho cercato dovunque ma non trovo niente.
Ho svolto altri due automi diversi ma il risultato è lo stesso.
Allora ho provato a mettere la funzione scan in un file c che girava lasciando invariata la main... indovina che è successo?!!!
panico Inserito il - 19/09/2005 : 11:36:14
Anzi, mi correggo: un ";" in più e un "=" in meno!
panico Inserito il - 19/09/2005 : 11:33:57
Da qualche parte ci sono un ";" e un "=" di troppo, ma lascio a te trovarli
Mil Inserito il - 19/09/2005 : 10:25:10
Bene, adesso mi serve un aiuto con questo. Il risultato è la pagina dos in bianco... cioè in nero!insomma non visualizza niente. eppure l'ho guardato e riguardato 3000 volte!!! aiutatemi!!!




/*automa che riconosce stringhe che cominciano per www seguite da un
punto e poi da una serie di caratteri divisi da punti quindi
si termina con un punto*/
#include <stdio.h>
#include <stdlib.h>
#define max 100

int scan(char* s)
{
enum {q0,q1,q2,q3,q4,q5,pozza} current_state=q0;
int i=0;
while ((s[i]!='\0' && s[i]!='\n') && current_state!=pozza);
{
switch(current_state)
{
case q0:
if (s[i]=='w' || s[i]=='W')
current_state=q1;
else
current_state=pozza;
break;

case q1:
if (s[i]=='w' || s[i]=='W')
current_state=q2;
else
current_state=pozza;
break;

case q2:
if (s[i]=='w' || s[i]=='W')
current_state=q3;
else
current_state=pozza;
break;

case q3:
if (s[i]=='.')
current_state=q4;
else
current_state=pozza;
break;

case q4:
if ((s[i]>='a' && s[i]<='z')||(s[i]>='A' && s[i]<='Z')||
(s[i]>='1' && s[i]<='9'))
current_state=q4;
else if (s[i]=='.')
current_state=q5;
else
current_state=pozza;
break;

case q5:
if ((s[i]>='a' && s[i]<='z')||(s[i]>='A' && s[i]<='Z')||
(s[i]>='0' && s[i]<='9'))
current_state=q4;
else
current_state=pozza;
break;
}
++i;
}
return (current_state=q5);
}


int main(int argc,char* argv[])
{
char buffer[max+1];
char* filename=argv[1];
FILE*file;
file=fopen(filename,"r");
if (file==NULL)
{
printf("il file non esiste");
return -1;
}
while (!feof(file))
{
if (fgets(buffer,max,file))
if (scan(buffer))
printf("%s la stringa è valida \n",buffer);
else
printf("%s la stringa NON è valida\n",buffer);
}
fclose(file);
system("PAUSE");
return 0;
}
panico Inserito il - 14/09/2005 : 20:03:27
<iostream.h> è una libreria standard del C++
Mil Inserito il - 14/09/2005 : 12:12:45
ok, è fatta!grazie.
ma che diff. c'è tra <iostream.h> e <stdio.h>?
panico Inserito il - 13/09/2005 : 19:52:49
Sostituisci <iostream.h> con <stdio.h>
e if scan(buffer) con if (scan(buffer))

Forum by laureateci.it © 2002 - 2012 Laureateci Communications Torna all'inizio della Pagina
Il DB ha risposto in 0,12 secondi.

TargatoNA.it | SuperDeejay.Net | Antidoto.org | Brutto.it | Equiweb.it | Snitz Forum 2000