| V I S U A L I Z Z A D I S C U S S I O N E |
| iperattivo |
Inserito il - 21/01/2006 : 12:32:54 Ragazzi ho un piccolo problema circa l’implementazione degli automi in linguaggio c. Si tratta di un automa definito su un alfabeto X={0,1}.”traccia 31 ottobre 2005 presente sul sito di Lops”. La traccia richiede che al termine dell’esecuzione per le stringhe non accettate debba essere riportata la motivazione ed in particolare tra le seguenti: 1.si e’ giunti nello stato pozza 2.si e’ giunti ad uno stato non finale 3.la stringa contiene simboli esterni all’alfabeto. Per quanto riguarda gli stati nn finali nn ci sono problemi.Il mio dubbio sorge quando devo trattare gli altri due casi e cioè se quando inserisco un simbolo esterno all’alfabeto vado o meno nello stato pozza quindi oltre al terzo messaggio devo inserire anche il primo.Di seguito sono inserite entrambe le realizzazioni,una delle quali sicuramente è inesatta rispetto alle richieste della traccia.In ogni caso se ci sono altre cose poco giuste fatemi sapere;GRAZIE.
#include <stdio.h> #include <stdlib.h> #define MAX_LENGTH 100
int scan(char* s) {int i=0; enum{q0,q1,q2,q3,q4,pozza}current_state=q0; while((s[i]!='\n' && s[i]!='\0')&& current_state!=pozza) { switch(current_state) { case q0: if(s[i]=='1') current_state=q0; else if(s[i]=='0') current_state=q1; else {current_state = pozza; printf("la stringa contiene simboli esterni all'alfabeto"); } break;
case q1: if(s[i]=='0') current_state=q2; else {current_state=pozza; printf("\nla stringa contiene simboli esterni all'alfabeto"); } break;
case q2: if(s[i]=='1') current_state=q3; else if(s[i]=='0') current_state =q2; else {current_state = pozza; printf("\nla stringa contiene simboli esterni all'alfabeto"); } break;
case q3: if(s[i]=='1') current_state =q4; else if(s[i]=='0') current_state=q1; else {current_state = pozza; printf("\nla stringa contiene simboli esterni all'alfabeto"); } break;
case q4: if(s[i]=='1') current_state=q4; else if(s[i]== '0') current_state=q4; else {current_state = pozza; printf("\nla stringa contiene simboli esterni all'alfabeto"); } break;
} ++i; } if(current_state==pozza) printf("\nsi e' giunti nello stato pozza\n"); else if (current_state == q0 || current_state == q1 || current_state == q2 || current_state == q3 ) printf("\nsi e' giunti ad uno stato nn finale\n"); return(current_state == q4); }
int main(int argc, char* argv[]) { char buffer[MAX_LENGTH+1]; char* filename = argv[1]; FILE* file; file = fopen(filename,"r"); if (file == NULL) { printf("file inesistente"); return -1; }
while (!feof(file)) { if (scan(fgets(buffer,MAX_LENGTH,file))) printf("%s RICONOSCIUTO\n", buffer); else printf("%s NON RICONOSCIUTO\n", buffer); } fclose(file); system("PAUSE"); return 0; }
OPPURE
#include <stdio.h> #include <stdlib.h> #define MAX_LENGTH 100
int scan(char* s) {int i=0; enum{q0,q1,q2,q3,q4,pozza}current_state=q0; while((s[i]!='\n' && s[i]!='\0')&& current_state!=pozza) { switch(current_state) { case q0: if(s[i]=='1') current_state=q0; else if(s[i]=='0') current_state=q1; else { printf("la stringa contiene simboli esterni all'alfabeto"); } break;
case q1: if(s[i]=='0') current_state=q2; else if (s[i]=='1') current_state=pozza; else { printf("\nla stringa contiene simboli esterni all'alfabeto"); } break;
case q2: if(s[i]=='1') current_state=q3; else if(s[i]=='0') current_state =q2; else { printf("\nla stringa contiene simboli esterni all'alfabeto"); } break;
case q3: if(s[i]=='1') current_state =q4; else if(s[i]=='0') current_state=q1; else { printf("\nla stringa contiene simboli esterni all'alfabeto"); } break;
case q4: if(s[i]=='1') current_state=q4; else if(s[i]== '0') current_state=q4; else { printf("\nla stringa contiene simboli esterni all'alfabeto"); } break;
} ++i; } if(current_state==pozza) printf("\nsi e' giunti nello stato pozza\n"); else if (current_state == q0 || current_state == q1 || current_state == q2 || current_state == q3 ) printf("\nsi e' giunti ad uno stato nn finale\n"); return(current_state == q4); }
int main(int argc, char* argv[]) { char buffer[MAX_LENGTH+1]; char* filename = argv[1]; FILE* file; file = fopen(filename,"r"); if (file == NULL) { printf("file inesistente"); return -1; }
while (!feof(file)) { if (scan(fgets(buffer,MAX_LENGTH,file))) printf("%s RICONOSCIUTO\n", buffer); else printf("%s NON RICONOSCIUTO\n", buffer); } fclose(file); system("PAUSE"); return 0; }
|
| 5 U L T I M E R I S P O S T E (in alto le più recenti) |
| silent |
Inserito il - 21/01/2006 : 13:01:56 solo nel caso in cui scriverai simboli diversi da 0 e 1 visualizzerà due messaggi, ma comunque l'esercizio è corretto |
| iperattivo |
Inserito il - 21/01/2006 : 12:59:12 ok ora vedo un po... |
| silent |
Inserito il - 21/01/2006 : 12:57:00 no, fai una prova e vedi, io l'ho fatta e mi esce il risultato richiesto |
| iperattivo |
Inserito il - 21/01/2006 : 12:54:49 tu sei sicuro di questo? poi i due messaggi nn vengono visualizzati insieme??? |
| silent |
Inserito il - 21/01/2006 : 12:51:23 la prima realizzazione è giusta solo che dovresti modificare le case di q1 e q4 così:
case q1: if(s[i]=='0') current_state=q2; else if (s[i] != 1) {printf("\nla stringa contiene simboli esterni all'alfabeto"); current_state==pozza; } break;
case q4: if (s[i]=='0' || s[i]=='1') current_state=q4; else {printf("\nla stringa contiene simboli esterni all'alfabeto"); current_state==pozza; } break; |
|
|