Idraulica

Realizzare il sistema software per la descrizione e la simulazione di un sistema idraulico.
Tutte le classi si trovano nel package idraulica.

R1: Elementi e Tubi

Un sistema idraulico è composto da elementi (di vario tipo) connessi tra loro da tubi. Un sistema è rappresentato da un oggetto di classe Sistema che offre i metodo aggiungiElemento() che riceve come parametro un oggetto di classe Elemento e lo aggiunge alla lista interna. Tramite il metodo getElementi() è possibile ottenere un array contenente gli elementi, questo metodo restituisce un array di oggetti Elemento.

Suggerimento: data una List è possibile generare un array contenente gli elementi tramite il metodo toArray() che riceve come parametro un array vuoto di dimensioni opportune.
Es:
    Elemento[] risultato = (Elemento[])lista.toArray(new Elemento[lista.size()])

R2: Elementi semplici

I tipi di elementi semplici sono: Sorgente, Rubinetto, Scarico che sono rappresentati dalle classi omonime.
Tutti gli elementi hanno un nome che può essere letto tramite il metodo getNome().
E' possibile connettere l'uscita di un elemento all'ingresso di un altro tramite il metodo connetti() che riceve come parametro l'elemento al cui ingresso deve essere connesso l'elemento sui cui è invocato: a.connetti(b); connette l'uscita di a all'ingresso di b. Il metodo connetti() invocato su Scarico non ha nessun effetto e stampa un messaggio d'errore.
Dato un elemento è possibile sapere a quale elemento è connesso in uscita tramite il metodo getUscita() che resituisce un oggetto di tipo Elemento.

R3: Elementi complessi

Oltre agli elementi semplici di cui sopra ci sono degli elementi complessi. L'elemento a T rappresentato dalla classe Split permette di suddivide l'input in due flussi in uscita. In tale caso il metodo connetti() riceve un ulteriore parametro intero che indica l'uscita a cui connettere l'elemento. Tale intero ha valore 0 per la prima uscita e 1 per la seconda. Per sapere quali elementi sono connessi in uscita è possibile utilizzare il metodo getUscite() che restituisce un array di elementi.
Un caso particolare di T è il ripartitore, rappresentato dalla classe Ripartitore; il costruttore di questa classe riceve come parametro il numero di uscite. In questo caso il metodo getNumeroUscite() restituisce il numero di uscite del ripartitore.

R4: Simulazione

E' possibile fare un carico delle portate e di come vengono ripartite.
E' possibile definire la portate per una sorgente con il metodo setPortata() che riceve come parametro un numero floating point che rappresenta i metri cubi al secondo.
Per i rubinetti è possibile impostare la loro apertura tramite il metodo setOpen() che riceve come parametro un boolean. Se un rubinetto è aperto la porta all'ingresso è uguale a quell all'uscita.
Per i raccordi a T la portata in ingresso viene ripartita equamente tra le due uscite.
Per i ripartitori è possibile indicare la ripartizione tramite il metodo setProporzioni() che riceve un array di floating point che definiscono le proporzioni con cui viene ripartito il flusso in entrata sulle uscite. La dimension dell'array deve essere parti al numero di uscite.
Il metodo simula() della classe Sistema, effettua i calcoli di portata a partire da ogni sorgente e stampa per ogni elemento connesso a valle le portate in ingresso e in uscita (per lo scarico solo quella in ingresso).

Suggerimento: dato un oggetto, per sapere se è un'istanza di una classe si può usare l'operatore instanceof.
Es.
    if(elemento instanceof Sorgente)