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
 Nuova Discussione  Nuovo Sondaggio Nuovo Sondaggio
 Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Autore Discussione Precedente Discussione Discussione Successiva  

Mil
ù tent

berluscasuperman



Inserito il - 13/09/2005 : 16:30:53  Mostra Profilo  Visita l'Homepage di Mil Invia a Mil un Messaggio Privato  Rispondi Quotando
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.





panico
Nuovo Utente



Inserito il - 13/09/2005 : 19:52:49  Mostra Profilo  Visita l'Homepage di panico  Invia a panico un messaggio ICQ Invia a panico un Messaggio Privato  Rispondi Quotando
Sostituisci <iostream.h> con <stdio.h>
e if scan(buffer) con if (scan(buffer))
Torna all'inizio della Pagina

Mil
ù tent

berluscasuperman



Inserito il - 14/09/2005 : 12:12:45  Mostra Profilo  Visita l'Homepage di Mil Invia a Mil un Messaggio Privato  Rispondi Quotando
ok, è fatta!grazie.
ma che diff. c'è tra <iostream.h> e <stdio.h>?





Torna all'inizio della Pagina

panico
Nuovo Utente



Inserito il - 14/09/2005 : 20:03:27  Mostra Profilo  Visita l'Homepage di panico  Invia a panico un messaggio ICQ Invia a panico un Messaggio Privato  Rispondi Quotando
<iostream.h> è una libreria standard del C++
Torna all'inizio della Pagina

Mil
ù tent

berluscasuperman



Inserito il - 19/09/2005 : 10:25:10  Mostra Profilo  Visita l'Homepage di Mil Invia a Mil un Messaggio Privato  Rispondi Quotando
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;
}





Torna all'inizio della Pagina

panico
Nuovo Utente



Inserito il - 19/09/2005 : 11:33:57  Mostra Profilo  Visita l'Homepage di panico  Invia a panico un messaggio ICQ Invia a panico un Messaggio Privato  Rispondi Quotando
Da qualche parte ci sono un ";" e un "=" di troppo, ma lascio a te trovarli
Torna all'inizio della Pagina

panico
Nuovo Utente



Inserito il - 19/09/2005 : 11:36:14  Mostra Profilo  Visita l'Homepage di panico  Invia a panico un messaggio ICQ Invia a panico un Messaggio Privato  Rispondi Quotando
Anzi, mi correggo: un ";" in più e un "=" in meno!
Torna all'inizio della Pagina

Mil
ù tent

berluscasuperman



Inserito il - 19/09/2005 : 11:38:22  Mostra Profilo  Visita l'Homepage di Mil Invia a Mil un Messaggio Privato  Rispondi Quotando
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?!!!





Torna all'inizio della Pagina

Mil
ù tent

berluscasuperman



Inserito il - 19/09/2005 : 11:42:43  Mostra Profilo  Visita l'Homepage di Mil Invia a Mil un Messaggio Privato  Rispondi Quotando
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!!!






Torna all'inizio della Pagina

Mil
ù tent

berluscasuperman



Inserito il - 19/09/2005 : 11:47:47  Mostra Profilo  Visita l'Homepage di Mil Invia a Mil un Messaggio Privato  Rispondi Quotando
Ho trovato... che errore di me*da!!!!
il ; del ciclo while!!!!

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

vabbè... grazie panico!!





Torna all'inizio della Pagina

panico
Nuovo Utente



Inserito il - 19/09/2005 : 11:49:55  Mostra Profilo  Visita l'Homepage di panico  Invia a panico un messaggio ICQ Invia a panico un Messaggio Privato  Rispondi Quotando
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);
Torna all'inizio della Pagina

Mil
ù tent

berluscasuperman



Inserito il - 19/09/2005 : 11:55:58  Mostra Profilo  Visita l'Homepage di Mil Invia a Mil un Messaggio Privato  Rispondi Quotando
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...





Torna all'inizio della Pagina

Mil
ù tent

berluscasuperman



Inserito il - 21/10/2005 : 18:24:36  Mostra Profilo  Visita l'Homepage di Mil Invia a Mil un Messaggio Privato  Rispondi Quotando
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!





Torna all'inizio della Pagina

mrluglio
Utente Sempre in Vacanza

Max


Regione: Puglia
Prov.: Bari
Città: Terlizzi


Inserito il - 21/10/2005 : 19:18:41  Mostra Profilo  Visita l'Homepage di mrluglio  Clicca per vedere l'indirizzo MSN di mrluglio Invia a mrluglio un Messaggio Privato  Rispondi Quotando

#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 ')


Spazio agli inventori : "Questa cosa non funziona...funzionerebbe però se usassimo il RETROMOUSE"
by Anonimo

Torna all'inizio della Pagina

Mil
ù tent

berluscasuperman



Inserito il - 22/10/2005 : 17:48:11  Mostra Profilo  Visita l'Homepage di Mil Invia a Mil un Messaggio Privato  Rispondi Quotando
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?










Torna all'inizio della Pagina

mrluglio
Utente Sempre in Vacanza

Max


Regione: Puglia
Prov.: Bari
Città: Terlizzi


Inserito il - 23/10/2005 : 00:10:45  Mostra Profilo  Visita l'Homepage di mrluglio  Clicca per vedere l'indirizzo MSN di mrluglio Invia a mrluglio un Messaggio Privato  Rispondi Quotando
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;
}

Spazio agli inventori : "Questa cosa non funziona...funzionerebbe però se usassimo il RETROMOUSE"
by Anonimo


Modificato da - mrluglio in data
Torna all'inizio della Pagina

Mil
ù tent

berluscasuperman



Inserito il - 23/10/2005 : 09:22:16  Mostra Profilo  Visita l'Homepage di Mil Invia a Mil un Messaggio Privato  Rispondi Quotando
E' una bella soluzione, grazie per l'aiuto!





Torna all'inizio della Pagina

mrluglio
Utente Sempre in Vacanza

Max


Regione: Puglia
Prov.: Bari
Città: Terlizzi


Inserito il - 23/10/2005 : 10:11:22  Mostra Profilo  Visita l'Homepage di mrluglio  Clicca per vedere l'indirizzo MSN di mrluglio Invia a mrluglio un Messaggio Privato  Rispondi Quotando
prego!

Spazio agli inventori : "Questa cosa non funziona...funzionerebbe però se usassimo il RETROMOUSE"
by Anonimo

Torna all'inizio della Pagina

Mil
ù tent

berluscasuperman



Inserito il - 30/10/2005 : 10:52:04  Mostra Profilo  Visita l'Homepage di Mil Invia a Mil un Messaggio Privato  Rispondi Quotando
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);
}






Modificato da - Mil in data
Torna all'inizio della Pagina
  Discussione Precedente Discussione Discussione Successiva  
 Nuova Discussione  Nuovo Sondaggio Nuovo Sondaggio
 Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
Vai a:
Forum by laureateci.it © 2002 - 2012 Laureateci Communications Torna all'inizio della Pagina
Il DB ha risposto in 0,3 secondi.

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