Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [JAVA] "Macchina a stati"

    Salve a tutti, mi trovo un pò in difficoltà con un progetto Java universitario che devo consegnare a breve,
    Devo rappresentare un'ipotetica macchina in grado di cambiare stato in base ai caratteri di una stringa in input con i quali opera confronti:
    le regole di cambio di stato sono definite da delle terzine (o triplette) formate da stato corrente, lettera, stato successivo, a tal proposito le ho create
    come oggetti con i relativi 3 parametri (int,char,int), le ho inserite in un array di oggetti e ho creato appositi metodi per farmi restituire i valori contenuti
    nell'array stesso iterandolo, ora devo scrivere un algoritmo che, a partire dallo stato iniziale = 1, fa transitare la macchina dallo stato corrente a quello successivo confrontando i parametri "lettera" degli oggetti triple nell'array con quelli della stringa in input (che ho inserito in un array "carattere per carattere"
    col metodo toCharArray) senza dimenticare dello stato corrente della macchina che viene aggiornato ad ogni confronto, ogni valore degli oggetti triple è stato letto e caricato in memoria (almeno questo con successo) da un file di testo così come la stringa in input, lo stato a cui arriva la macchina alla fine del "confronto" con l'input viene salvato su un file txt di output (anche qui ci siamo peccato non sia il risultato esatto), c'è qualcuno che potrebbe aiutarmi cortesemente? so che sicuramente è una stupidaggine, ma mi sono goffamente incartata su questa questione

    questo è il ""codice"" che ho buttato giù:

    codice:
     	public int statoRaggiunto ()
    	{
    		for (int j=0; j<stringa.length; j++)
    		{
    			for (int i=0; i<size; i++) /* con size = capienza array di oggetti triple*/
    			{
    				firstStatus = 1;
    				
    				do
    				{
    					firstStatus = nextStatus;
    					
    				} while(stringa[j] == test[i].getLetter());
    			}
    		}
    		return firstStatus;
    	}
    P.s (in termini di costi computazionali mi è stato detto che la struttura dati utilizzata su cui operare non consente algoritmi ottimali, usare una matrice o una lista concatenata avrebbe abbassato la complessità dei calcoli ma per questione di tempo non mi resta che andare avanti con questa soluzione,colgo anche l'occasione di salutare tutti i membri del forum essendo questo il mio primo post,grazie anticipatamente )

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] "Macchina a stati"

    Originariamente inviato da ClaudiaRo93
    so che sicuramente è una stupidaggine, ma mi sono goffamente incartata su questa questione
    Ciao, scusa però la mia domanda: ma la questione o dubbio esattamente quale è? Il codice che hai postato lo vedo ... mi pare abbastanza incompleto.
    Il tuo dubbio è su come andare a cercare stato_attuale+lettera nell'array delle triple?

    Se così innanzitutto io ti consiglierei di "incapsulare" la gestione di questo array di triple in modo da separare i concetti e semplificare il codice. Cioè di avere una apposita classe solo per questo, che offre (oltre ad altro) un metodo che dati stato_attuale+lettera fornisce in uscita lo stato successivo.

    E se mi permetti ti dico che cosa avrei fatto io: avrei modellato con una classe solo stato_attuale+lettera (perché questa è l'unicità) e con equals/hashCode corretti per essere usata come chiave in una Map. Poi appunto sfrutterei un HashMap che ha come chiave <stato_attuale+lettera> e come valore <stato_successivo>.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: [JAVA] "Macchina a stati"

    Buonasera andbin, grazie per la risposta, si il mio dubbio è quello cercare statocorrente+lettera e in base al confronto con i char della stringa in input passare da uno stato corrente (a incominciare da quello iniziale che deve essere = 1) a quello successivo, in realtà l'oborobrio che ho postato è un tentativo di algoritmo che debba eseguire questo compito ma è palese anche agli occhi di una principiante come me che non è corretto , molto probabilmente (anzi sicuramente) l'opzione da te citata funziona, quindi se non ho capito male, tramite la funzione hash applicata alla chiave (statocorrente, lettera) mi faccio restituire il corretto statofuturo?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: [JAVA] "Macchina a stati"

    Originariamente inviato da ClaudiaRo93
    Buonasera andbin, grazie per la risposta, si il mio dubbio è quello cercare statocorrente+lettera e in base al confronto con i char della stringa in input passare da uno stato corrente (a incominciare da quello iniziale che deve essere = 1) a quello successivo, in realtà l'oborobrio che ho postato è un tentativo di algoritmo che debba eseguire questo compito ma è palese anche agli occhi di una principiante come me che non è corretto , molto probabilmente (anzi sicuramente) l'opzione da te citata funziona, quindi se non ho capito male, tramite la funzione hash applicata alla chiave (statocorrente, lettera) mi faccio restituire il corretto statofuturo?
    Io potrei suggerirti una cosa del genere (abbozzo che completeresti tu):

    codice:
    public class TransizioniMacchinaStati {
        // .....
    
        public void aggiungi(int statoCorrente, char lettera, int statoSuccessivo) {
            // .....
        }
    
        public int cercaStatoSuccessivo(int statoCorrente, char lettera) {
            // .....
        }
    }
    Ovviamente con i campi necessari, costruttore/i, ecc...

    I due metodi sono davvero il minimo: per popolare l'insieme e per cercare lo stato successivo. Che poi dentro a TransizioniMacchinaStati ci sia una lista di oggetti a ricerca lineare, un HashMap come ho detto io o qualunque altra cosa più sofisticata .... all'esterno non importa, è tutto ben incapsulato qui dentro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    ooook, perfetto, mi metto subito a lavoro grazie mille

  6. #6
    Rieccomi di nuovo qui, ho fatto tesoro di quanto mi hai suggerito (andbin), sempre per le solite questioni di tempo che citavo anche nel primo messaggio postato, ho preferito non approcciare a strutture dati alternative (ma sicuramente più performanti del array di oggetti triple), il metodo per popolarlo è filato liscio come l'olio, nessun problema e tutto è stato scritto in memoria correttamente, il mio guaio è il metodo per il cambio di stato io l'ho pensato cosi:

    -1 stato iniziale della macchina = 1
    -2 per ogni carattere della stringa in input == parametro lettera dell'array triple sovrascrivere
    lo stato iniziale col parametro stato_successivo

    è proprio a livello di codice che sto " " , 5/6 righe maledette che mi stanno mandando al manicomio...avresti qualche indizio da darmi (magari anche in pseudocodice per evitare la tanto odiata "pappa pronta")?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ClaudiaRo93
    è proprio a livello di codice che sto " " , 5/6 righe maledette che mi stanno mandando al manicomio...avresti qualche indizio da darmi (magari anche in pseudocodice per evitare la tanto odiata "pappa pronta")?
    Ok, allora spiegato a parole, ecco una ipotesi/suggerimento:

    - Una classe es. MacchinaStati, che contiene almeno 2 variabili di istanza, un TransizioniMacchinaStati e un int con lo stato "corrente".
    - Un costruttore che riceve TransizioniMacchinaStati (creato/popolato altrove) e inizializza lo stato corrente (iniziale).
    - Un metodo es. "avanzaStato" (non mi piace ma ora non mi viene in mente altro nome) che riceve il char lettera, usa il TransizioniMacchinaStati e lo stato corrente che poi aggiorna.
    - Se vuoi altri metodi es. per leggere lo stato corrente (se serve).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    credo di aver capito dove ho sbagliato, in primis l'inizializzazione dello stato iniziale, grazie mille ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.