V I S U A L I Z Z A D I S C U S S I O N E |
titty2008 |
Inserito il - 04/09/2008 : 11:08:20 ho provato a compilare questo programma: #include<stdio.h> #include<stdlib.h>
#define MAX_LENGTH 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]== '1' ) current_state = S; else if (s[i] == '0') current_state = A; else { printf("\n la stringa contiene simboli esterni all'alfabeto! \n"); current_state = POZZA; } break;
case A: if (s[i]== '0' ) current_state = B; else if (s[i] != '1') printf("\n la stringa contiene simboli esterni all'alfabeto! \n"); else current_state = POZZA; break;
case B: if (s[i]== '0' ) current_state = B; else if (s[i] == '1') current_state = C; else { printf("\n la stringa contiene simboli esterni all'alfabeto! \n"); current_state = POZZA; } break;
case C: if (s[i]== '0' ) current_state = A; else if (s[i] == '1') current_state = D; else { printf("\n la stringa contiene simboli esterni all'alfabeto! \n"); current_state = POZZA; } break;
case D: if (s[i]== '0' || s[i] == '1' ) current_state = D; else { printf("\n la stringa contiene simboli esterni all'alfabeto! \n"); current_state = POZZA; } break; } ++i; } if (current_state == POZZA) printf ("\n Si è giunti nello stato pozza! \n"); else if (current_state == S || current_state == A || current_state == B || current_state == C) printf("\n Si è giunti ad uno stato non finale \n"); return(current_state == D); }
int main(int argc, char* argv[]) { char buffer[MAX_LENGTH+1]; char* filename = argv[1]; FILE* file;
file = fopen("c:\Documents and Settings\alicetuttoincluso\Desktop\dfa.txt","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; }
non mi da nessuno errore, ma perchè non me lo esegue? sicuramente faccio qualche errore con i file, c'è qualcuno che mi può spiegare l'errore? tra l'altro questo è una delle soluzioni di un esame di laboratorio messa in rete... grazie e ciao a tutti... |
12 U L T I M E R I S P O S T E (in alto le più recenti) |
titty2008 |
Inserito il - 09/09/2008 : 09:33:45 ma io al prof non glielo invio così, gli scriverò filename... è normale... qui lo sto scrivendo a voi per farvi capire come io apro il file, ancora sto commetendo qualche errore, dato che il programma non gira come dovrebbe... e secondo me gli errori che commetto sono proprio nella gestione dei file... |
Stewie83 |
Inserito il - 09/09/2008 : 02:46:17 spiegami perchè hai modificato l'inserimento del file in input passandogli il path del tuo computer...sai che se lo invii al prof così come lo stai facendo te non gli funzionerà mai!!!! |
titty2008 |
Inserito il - 08/09/2008 : 10:36:47 lo so, sono molto stressante, ma il professore questa settimana non c'è, e non so a chi chiedere ogni mio dubbio... e non mi va di aspettare senza far niente fino a martedì prossimo... qui vi inserisco il programma che verifica se una grammatica è C.F.
/* GrammarReader v. 1.2.2 Corrado Mencar, Pasquale Lops */
#include <stdio.h>
#define MAX_WORD_LENGTH 100 #define MAX_PRODUCTIONS 100
// Definizione dei tipi ------------------------------------------------------*/
typedef char Symbol;
typedef struct { Symbol word [MAX_WORD_LENGTH]; unsigned length; } Word;
typedef struct { Word left; Word right; } Production;
typedef struct { Production productions[MAX_PRODUCTIONS]; unsigned numprod; } Grammar;
// Procedure di riconoscimento dei simboli -----------------------------------*/
int is_terminal(Symbol s) { //return (islower(s)); return (s >= 'a') && (s <= 'z'); }
int is_nonterminal(Symbol s) { //return (isupper(s)); return (s >= 'A') && (s <= 'Z'); }
int is_prodsym(Symbol s) { return (s == '>'); }
int is_prodsep(Symbol s) { return (s == '\n'); }
/* Lettura di simboli da file ------------------------------------------------*/
Symbol read_sym(FILE* file) { Symbol s;
// fscanf(file,"%c",&s);
//questo ciclo permette di saltare la lettura di spazi tra i simboli do s = getc(file); while (s==' ');
return s; }
Production* add_new_production(Grammar *g) { Production* p; p = &(g->productions[g->numprod++]); p->left.length = 0; p->right.length = 0;
return p; }
void add_symbol(Word *w, Symbol s) { w->word[w->length++] = s; }
// Procedura di acquisizione di una grammatica da un file --------------------*/
Grammar* load_grammar(FILE* file, Grammar* g) { enum States {START,LEFT,RIGHT,ERROR}; /* START = Scansione di una nuova produzione [F] LEFT = Scansione della parte sinistra RIGHT = Scansione della parte destra [F] ERROR = Errore di scansione */ enum States current_state = START; // Stato iniziale Symbol s; Production* p;
g->numprod = 0; // Inizializza la grammatica
while (current_state != ERROR && !feof(file)) { s = read_sym(file); if (feof(file)) break; switch(current_state) { case START: if (is_terminal(s) || is_nonterminal(s)) { current_state = LEFT;
//p = &(g->productions[g->numprod++]); //p->left.length = 0; p = add_new_production(g); add_symbol(&p->left,s); //L'istruzione precedente corrisponde a p->left.word[p->left.length++] = s; } else if (is_prodsep(s)) { current_state = START; } else current_state = ERROR; break; case LEFT: if (is_terminal(s) || is_nonterminal(s)) { current_state = LEFT; add_symbol(&p->left,s); } else if (is_prodsym(s)) { current_state = RIGHT; } else current_state = ERROR; break; case RIGHT: if (is_terminal(s) || is_nonterminal(s)) { current_state = RIGHT; add_symbol(&p->right,s); } else if (is_prodsep(s)) { current_state = START; } else current_state = ERROR; break; } }
if (current_state == START || current_state == RIGHT) return g; else return NULL;
}
// Procedure di stampa
void print_sym (Symbol s) { printf("%c ",s); }
void print_word (Word* w) { int i;
for (i=0; i<w->length; i++) print_sym(w->word[i]); }
void print_production (Production* p) { print_word(&p->left); printf (" --> "); print_word(&p->right); }
void print_grammar(Grammar* g) { int i;
if (g == NULL) printf ("Errore! Grammatica non valida! \n"); else { printf ("Numero di produzioni: %d\n", g->numprod); for (i=0; i<g->numprod; i++) { print_production(&g->productions[i]); printf ("\n"); } } }
// CF int is_contextfreeproduction(Production* p) { if (p->left.length==1 && is_nonterminal(p->left.word[0])) return 1; else return 0; }
int is_contextfreegrammar(Grammar* g) { int i=0; if (g == NULL) { printf ("Errore: grammatica non valida \n"); return 0; } for (i=0; i < g->numprod; i++) if (!is_contextfreeproduction(&g->productions[i])) return 0; return 1; }
// MAIN ------------------------------------------------------------------------
int main(int argc, char *argv[]) { char* filename = argv[1]; FILE* gram_file; Grammar grammar;
// controlla se è stato inserito il nome del file
if ("c:Documents and SettingsalicetuttoinclusoDesktopcf.txt" == 0) { printf("nome file non specificato \n"); return -1; }
// apertura del file contenente la grammatica
gram_file = fopen("c:Documents and SettingsalicetuttoinclusoDesktopcf.txt","r"); if (gram_file == NULL) { printf("nome di file errato\n"); return -1; }
print_grammar(load_grammar(gram_file,&grammar));
fclose(gram_file);
return 0;
}
quando lo eseguo mi visualizza: il numero di produzioni è 4 e mi elenca le 4 produzioni che avevo inserito nel file di testo. cosa c'è di sbagliato? ho provato a inserire una grammatica non CF, ma comunque me la visualizza e non mi da nessun messaggio di errore... grazie ciao |
titty2008 |
Inserito il - 08/09/2008 : 10:05:04 ho provato a fare un altro esercizio e questo me lo esegue... mi dice file inisistente... ora il problema è di creare il file di testo... e poi non riesco capire perchè questo va e quello che ho scritto a voi qui no... mi esce la maschera con scritto: si è verificato un errore nell'apertura del file. il file verrà chiuso... bohhhhhh.... va beh, cmq grazie grazie e grazie... |
titty2008 |
Inserito il - 08/09/2008 : 09:52:03 io non so perchè ma a me nn esegue un bel niente... vi ringrazio tantissimo per la collaborazione, siete stati veramente tato gentili... un ultimo favore... vi ripeto, mi dispiace se vi possono sembrare domande molto stupide... ma io il file di testo come lo creo? nel senso: se si tratta di grammar reader inserisco delle produzioni del tipo: S>Ab, ecc.. ma in questo caso come si fa? grazie ancora tantissimo... |
Stewie83 |
Inserito il - 06/09/2008 : 04:43:08 lascia perdere i consigli di X500....è più facile di quanto tu possa immaginare....
Basta che trascini con il mouse il file .txt da provare direttamente sul file eseguibile .exe e va che è una meraviglia....
P.S:fammi sapere!...per il caffè |
X500 |
Inserito il - 05/09/2008 : 13:16:59 Ed eccoti uno screen del tuo programma:
Immagine:
25,48 KB Saluti |
X500 |
Inserito il - 05/09/2008 : 13:10:46 Comunque io ho apportato una modifica.. qui:
file = fopen("c:Documents and SettingsalicetuttoinclusoDesktopdfa.txt","r");
Gli "\" sono sbagliati.. Non è un percorso valido quello che hai inserito.
Devi mettere al loro posto questi qua --> "/" (vale la stessa cosa anche per java)
Poi riprova ad eseguire il programma sotto Dos.
A me il programma dava come risultato "file inesistente" ossia entrava in questo controllo qui:
if (file == NULL) { printf("file inesistente"); return -1; }
|
titty2008 |
Inserito il - 05/09/2008 : 09:40:21 ti ringrazio tantissimo, sei stato veramente gentile, anche se comunque non lo esegue lo stesso... ho fatto tutto quello che mi hai indicato, ma niente! quando lo vado a dare in esecuzione, è come se non vedesse niente... eppure è strano, perchè questo esercizio è un esercizio svolto, quindi in teoria dovrebbe funzionare correttamente... cmq grazie di nuovo...
|
X500 |
Inserito il - 04/09/2008 : 13:50:12 Citazione: Messaggio inserito da titty2008
e come si fa? scusa se ti possono sembrare domande banali, maè il mio primo approccio al c++... grazie comenque
Il compilatore, qualsiasi esso sia (Turbo C o DevC++), quando ti compila un file con successo, ti crea anche il file eseguibile nomeFile.exe Con il Dos, punta alla directory che contiene il tuo bel file .exe e lo lanci. Ad esempio, il tuo file .exe si trova in una cartella in C: che chiameremo Eseguibili. Fai così da dos:
c: cd Eseguibili c:EseguibiliNomeFile.exe
A questo punto riesci a vedere quello che ti fa il programma. Io non ricordo ora quale istruzione ti conviene usare al posto di quel system("Pause").. ma è un problema che capita spesso con il C.
Ciao
Immagine:
19,6 KB |
titty2008 |
Inserito il - 04/09/2008 : 12:05:25 e come si fa? scusa se ti possono sembrare domande banali, maè il mio primo approccio al c++... grazie comenque |
X500 |
Inserito il - 04/09/2008 : 11:49:38 fai partire il file .exe che ti genera da dos. Non mantiene il programma in memoria. Lo esegue ed esce subito dall'applicazione senza farti vedere nulla. quel system("PAUSE") non lo vede manco.
Ciao |
|
|