Come si implementa un automa a stati finiti?

di il
5 risposte

Come si implementa un automa a stati finiti?

Vi posto la traccia d'esame che il mio prof ha fatto per il preappello di dicembre :
-------------------------------------------------------------------------------------
Data una sequenza di caratteri da file, stampare in un secondo file tutti i caratteri che NON SONO COMPRESI tra "/*" e "*/" (apici esclusi). Inoltre, utilizzando un array di record, stampare a video il numero di volte in cui l'esclusione è stata effettuata, in che posizione, ed il numero di caratteri esclusi.
------------------------------------------------------------------------------------
Esempio:
F1 = Quest'anno /*per gli studenti*/ ci sara' l'esame /*alle ore 11*/ di Fondamenti di Informatica.

In F2 deve comparire: Quest'anno ci sara' l'esame di Fondamenti di Informatica.
A video: "ci sono state 2 esclusioni: in posizione 12 per 18 caratteri; in posizione 50 per 11 caratteri."

non mi sono chiare queste due richieste del prof:
1) se usate un array di caratteri commettete un errore grave, il programma deve poter funzionare anche per file molto grandi che la memoria non può contenere.
2) possibilmente realizzatelo con un automa a stati finiti

5 Risposte

  • Re: Come si implementa un automa a stati finiti?

    Utilizzando un array di record
    
    struct
    {
     int posIniziale;
     int caratteriEsclusi;
    }
    
    fin quì ci siamo?

    http://it.wikipedia.org/wiki/Automa_a_stati_finit

    prende dati in ingresso e li butta modificati in uscita. Pensalo come un rubinetto che chiudi quando vedi /* e apri quando vedi */

    quindi puoi anche leggere dal file un carattere per volta e scrivi sul f2 finche non trovi /*. a sto punto inizia a contare senza scrivere finche non trovi */ e così via finche non hai finito il file. Nessun array di caratteri coinvolto.
    l'ASF prende i due file e lavora.
  • Re: Come si implementa un automa a stati finiti?

    Ho buttato giù uno pseudo codice

    void funzione(){
    while (in!= /*){ //fin quando il flusso d'entrata è diverso da /*
    in>>out; // inserisce nel flusso di uscita
    posizione++; // incrementa la posizione
    }

    numero_volte++;

    while(in!=*/){//fin quando non trova il carattere */incrementa il numero di caratteri esclusi
    caratteri_esclusi++
    }


    }
    goto funzione; //non ho mai usato il goto, va bene? o (come credo) riparte da capo?


    spero che questa cosa non funzioni solo nella mia testa
  • Re: Come si implementa un automa a stati finiti?

    MAI USARE goto basta un while(in.good()). Dimenticati della sua esistenza. Non estrarre dati formattati, usa in.get() e out.put(). ogni volta che incontri /* devi creare una struttura nuova che deve essere aggiornata quando incontri il corrispettivo */.
  • Re: Come si implementa un automa a stati finiti?

    1)perchè tutti consigliano di non usare il goto? cosa comporta?
    2)che vuol dire Non estrarre dati formattati?
    3)ho inserito nella mia procedura l'incremento delle tre variabili posizione, caratteri_esclusi, nomero_di volte,
    posso creare una struttura :
    struct info{
    int posizione;
    int caratteri_escl
    int numero_divol
    }

    anche se non credo sia necessaria la struct ....
  • Re: Come si implementa un automa a stati finiti?

    Il goto fa un salto incondizionato (equivale al jmp in assembler). Quindi non hai il controllo del codice.
    leggi quì:

    http://it.wikipedia.org/wiki/Spaghetti_cod

    il numero di volte dentro il record non ti serve perche lo ricavi da quante celle ha l'array di record. Qui puoi usare il std::vector o se non l'hai imparato usi l'allocazione dinamica di memoria per ogni cella nuova creata.

    l'operatore >> fa la formattazione dei dati. Se tu li chiedi un int lui trasforma il dato letto in un int. con get() e put() i dati vengono estratti come char, la dimensione del quale equivale sempre un byte (in qualsiasi compilatore, è definito dallo standard). tutte le altre formattazioni dipendono dal compilatore e SO.
Devi accedere o registrarti per scrivere nel forum
5 risposte