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