RICONOSCIMENTO DI SEQUENZE DI EVENTI Il problema Realizzare un algoritmo per identificare in una sequenza di caratteri provenienti da un dispositivo d’input e di lunghezza non nota a priori la parola SUN, in qualunque contesto si trovi. Una soluzione Il problema potrebbe essere ricondotto al riconoscimento di stringhe: • si memorizza in un vettore di caratteri una parte della sequenza d’input e poi, • a partire dalla prima posizione del vettore, si effettua il confronto tra una sottostringa lunga 3 caratteri e la parola di riferimento (SUN). • Se sono uguali si dichiara di aver trovato la parola cercata. • Si procede così di seguito, avanzando ogni volta di una posizione, finché ci sono abbastanza caratteri nel vettore. • Esauriti i caratteri del vettore di supporto, se ne caricano altri dal dispositivo di input. • Prima però si devono trasferire in testa al vettore gli ultimi due caratteri della sequenza precedente: potrebbero infatti contenere l’inizio della parola. Si preferisce adottare un altro approccio, comune a tutti i casi in cui occorre riconoscere sequenze di eventi. La macchina a stati • L’idea è quella di analizzare un elemento per volta (in questo caso, un carattere per volta) e di memorizzare in una apposita variabile, denominata stato_corrente, la condizione in cui ci si trova. • Si svolge l’analisi di quanto può succedere aiutandosi con un disegno (diagramma a stati o pallogramma) e con una sequenza di caratteri qualsiasi, ideata in modo da contemplare tutti i casi possibili, come la seguente: “QUESTO E’ UN TESTO DI COLLAUDO, CONTIENE SUN MA ANCHE SU E SSUN E ANCORA SUSUN NONCHE’ SUNSUN, CIOE’ DUE STRINGHE SUN CONSECUTIVE”. • All’inizio si suppone di essere in uno stato chiamato stato_iniz, e si analizzano i caratteri uno per volta, man mano che arrivano. • Fin quando si ricevono caratteri diversi da ‘S’, si resta nello stesso stato stato_iniz. • Quando arriva il carattere ‘S’, si passa ad un nuovo stato chiamato stato_s. ALTRI CARATTERI ‘S’ START STATO_INIZ STATO_S • In stato_s, si verifica se arriva il carattere ‘U’, nel qual caso si passa allo stato stato_u. • Se il carattere che arriva non è ‘U’, controllo che non sia ‘S’, nel qual caso si resta in stato_s (ci si trova in una situazione del tipo ...SSUN...). • In tutti gli altri casi si è trattato di un falso allarme e si torna a stato_iniz. ALTRI CARATTERI ‘S’ ‘S’ ‘U’ START STATO_INIZ STATO_S ALTRI CARATTERI STATO_U • In stato_u, se arriva ‘N’, si va in stato_fin, in cui si dichiara di aver riconosciuto la parola SUN; • se invece arriva ‘S’, si torna in stato_s (situazione del tipo ...SUSUN...), • mentre in tutti gli altri casi si torna a stato_iniz e si continua l’analisi fino all’esaurimento dei caratteri in input. ALTRI CARATTERI ‘S’ ‘S’ ‘U’ ‘N’ START STATO_INIZ STATO_S ALTRI CARATTERI ALTRI CARATTERI STATO_U ‘S’ STATO_FIN • Se interessa riconoscere la parola SUN una sola volta, quando si raggiunge stato_fin si termina; • altrimenti si fa coincidere stato_fin con stato_iniz e si continua. ALTRI CARATTERI ‘S’ ‘S’ ‘U’ START STATO_INIZ STATO_S ALTRI CARATTERI STATO_U ‘S’ ALTRI CARATTERI ‘N’ : PAROLA RICONOSCIUTA • Si considera quest’ultimo caso, in modo che l’algoritmo tratti correttamente situazioni come ...SUNSUN..., identificando due occorrenze della stringa SUN. • Nella realizzazione dell’algoritmo, si utilizza il costrutto switch (o, in alcuni linguaggi, il costrutto case) in sostituzione della cascata di if necessaria per analizzare il contenuto di stato_corrente. Algoritmo • • Pongo il valore STATO_INIZ in stato_corrente Finché ci sono caratteri – – leggo un carattere in carat switch su stato_corrente • caso STATO_INIZ: se carat = ‘S’ – pongo il valore STATO_S in stato_corrente • caso STATO_S: se carat = ‘U’ – pongo il valore STATO_U in stato_corrente • altrimenti – se carat ’S’ » pongo il valore STATO_INIZ in stato_corrente • • caso STATO_U: se carat = ‘N’ – visualizzo “Parola riconosciuta” – pongo il valore STATO_INIZ in stato_corrente altrimenti – se carat = ‘S’ » pongo il valore STATO_S in stato_corrente – altrimenti » pongo il valore STATO_INIZ in stato_corrente • Fine.