Giovedì 3 Maggio 2001



Scaricare 41 Kb.
14.11.2018
Dimensione del file41 Kb.

Martedì 15 Maggio 2001 Michele Crociani


Relazione relativa alla creazione

dell’astrazione Orario


  1. DESCRIZIONE DEL PROBLEMA

Si vuole creare l’astrazione Orario riutilizzando la classe Counter creata nella precedente esercitazione. Un Orario è costituito da ore, minuti e secondi (Counter appunto)che posso essere settati e letti in ogni momento. Un Orario deve essere incrementabile di un secondo, con coerente incremento di minuti e ore. Deve essere possibile costruire un Orario con un valore di default 00:00:00 oppure specificando il valore di ore, minuti e secondi. Deve restituire i singoli valori di ore, minuti e secondo e deve essere inoltre stampabile nel formato hh:mm:ss.



Estensione:

Un Orario può essere confrontato con un altro Orario fornendo servizi per sapere se è maggiore, minore o uguale.




  1. ANALISI

Grandezze coinvolte:


Per la realizzazione dell’Orario vengono utilizzati tre oggetti della classe Counter: ore, minuti e secondi. Questi vengono dichiarati private per non renderli accessibili dall’esterno (incapsulamento).

Costruttori:


Vengono definiti due costruttori Orario.

Uno senza parametri che imposta per default i valori di ore, minuti e secondi a 0

Un secondo che accetta tre interi come parametri, che saranno rispettivamente ore, minuti e secondi. Nel caso i dati inseriti non siano coerenti con i valori possibili che ore, minuti e secondi possono assumere, viene stampato un messaggio di errore e i valori vengono impostati tutti a 0, come nel costruttore precedente.
Metodi e nozioni di consistenza:
public void tic(). Questo metodo incrementa di una unità secondi (con secondi.inc())e incrementa dunque minuti e ore coerentemente con la “definizione” di orario. Il counter secondi non può avere un valore superiore a 59. In questo caso il valore viene resettato a 0 (con il metodo reset del contatore) e viene incrementato di una unità il valore di minuti. Stessa cosa per minuti, che una volta raggiunto il valore 59, se incrementato, viene resettato a 0 e incrementato il valore di ore. Stessa cosa quando ore ha valore 23.

Questo metodo modifica solo il valore dei counter, non restituisce nulla.


public string toString(). Metodo che restituisce una stringa. Utilizza il metodo della classe counter getValue per chiedere ai contatori i rispettivi valori. Restituisce i valori di ore, minuti e secondi nel formato hh:mm:ss, aggiungendo uno zero davanti ai numeri formati da una sola cifra (tramite gli if indentati).
public int getHour(), getMinute(), getSecond(). Sono tre metodi che restituiscono i valori (int) rispettivamente di ore, minuti e secondi.
private double toSecond(). Converte tutti i valori dei contatori in secondi, applicando le rispettive “leggi”. Le ore vengono moltiplicate per 3600, i minuti per 60, i secondi sono già tali. Poi questi tre valori vengono sommati.

Mi servirà per poter implementare più facilmente i metodi di confronto.



Nota: E’ dichiarato private perché è un metodo che creo esclusivamente per facilitarmi un’operazione all’interno di questa stessa classe, non mi interessa dunque che possa venir invocato dall’esterno
public boolean equalsTo(), greaterThan(), lessThan(). Metodi di confronto tra due orari. Restituiscono un booleano. equalsTo, controlla se i corrispondenti valori dei contatori dei due orari sono uguali. Se la condizione è soddisfatta restituisce true, flase altrimenti.

Gli altri due metodi convertono i valori di entrambi gli orari in secondi e controllano se sono soddisfatte le condizioni di disuguaglianza.





  1. PROGETTO

Per realizzare quello che è descritto nell’analisi utilizzo l’ ADT Counter, precedentemente realizzato. Per creare un contatore utilizzerò il costruttore che accetta in ingresso un parametro (quello senza parametri non viene usato perché setta il valore a 1 -> inutile).

Viene incrementato con il metodo inc(), resettato con reset() e gli viene chiesto il valore con getValue().

In questa maniera ho realizzato un oggetto composto, Orario.



  1. IMPLEMENTAZIONE

Vedi file allegati con relativi commenti.




  1. CASI D’USO

Per effettuare alcuni test viene creato e stampato dapprima un Orario o1 con valore di default 00:00:00. Viene poi incrementato e ristampato per verificare la correttezza del metodo.

Viene creato e stampato (anche utilizzando i singoli valori di ore, minuti e secondi) un secondo orario con valori impostati a 23:59:59. Viene incrementato e ristampato per verificarne la consistenza. -> 00:00:00. Ok.

Viene creato in terzo orario o3 con valori 17:00:00.

Un quarto o4 con valori 17:32:70, che naturalmente restituisce un messaggio di errore poiché i secondi non posso valere più di 59. Viene perciò inizializzato 00:00:00.

Viene creato un quinto orario o5 con valori 17:32:45.


Vengono poi invocati alcuni metodi di confronto:
o2.equalsTo(o4) ->true

o2.equalsTo(o5) ->false

o2.lessThan(o3) ->true

o2.lessThan(o5) ->true

o2.greaterThan(o3) ->false

o1.greaterThan(o4) ->true


C:\Temp>java Example

Ore 00:00:00

Ore 00:00:01

Ore 23:59:59

Ore = 23

Minuti = 59

Secondi = 59

Ore 00:00:00

L'ora inserita non e' corretta!

L'Orario sara' settato per default al valore 00:00:00


true

false


true

true


false

true



  1. CONCETTI E TECNICHE ACQUISITE

Realizzando l’astrazione Orario è stato possibile capire i meccanismi e i problemi che possono sorgere per quanto riguarda la creazione di oggetti composti da altri oggetti.

In particolare viene capito il concetto di incapsulamento, potendo accedere all’oggetto counter solamente attraverso i metodi pubblici e non potendo andare a modificare i valori delle variabili all’interno dell’oggetto stesso (dichiarate private).


Estensione della relazione

sull’astrazione ElencoTemp


  1. DESCRIZIONE DEL PROBLEMA

Si vuole creare l’astrazione ElencoTemp. ElencoTemp è un elenco di N (a scelta) temperature con associati i rispettivi orari in cui sono state rilevate (nell’arco di una giornata). Deve poter esser restituita una media di tutte le temperature rilevate e deve essere possibile una stampa dell’elenco.



Estensione:

Se vengono inseriti più rilevamenti delle dimensioni dell’elenco, i rilevamenti in più sovrascrivono, a partire dal più vecchio, i rilevamenti già inseriti.





  1. ANALISI

Grandezze coinvolte:


Per la realizzazione dell’ElencoTemp vengono utilizzati due array e due variabili.

temp[] sarà (al momento della costruzione, prima sono solo riferimenti ad oggetti della classe []) un array di variabili di tipo int, mentre ora[] sarà un array di riferimenti ad oggetti di tipo Orario.

La variabile x (di tipo int) indica l’ultima posizione degli array nella quale è stato inserito un rilevamento (dunque un intero che identifica una temperatura, e un orario).

La variabile full (di tipo boolean), inizialmente settata a false, diventa true quando gli array sono stati riempiti completamente. Mi serve per poter distinguere il caso in cui la variabile x ha completato un “giro” e ha ricominciato il conteggio. In questo caso quando chiederò la stampa o la media delle temperature, non dovrò più usare la suddetta variabile come indice degli array al quale fermarmi, ma dovrò prendere in considerazione l’intera lunghezza degli array, utilizzando temp.length e ora.legnth.

Costruttori:


Vengono definiti due costruttori ElencoTemp.

Uno senza parametri che imposta per default le lunghezze degli array a 5, la variabile x a 0 e la variabile full a false.

L’altro accetta un parametro intero l che indica la lunghezza degli array. Stessi valori per le due variabili.

Metodi e nozioni di consistenza:


public void insert(). Questo metodo permette l’inserimento di un rilevamento, passando i parametri relativamente di ore, minuti e secondi (Orario), e la temperatura (int).

Ad ogni inserimento la variabile x viene incrementata di 1.



Estensione: se x raggiunge il valore della lunghezza degli array, viene riportata a 0 e full viene settato a true.

Nota: Differentemente dall’array di interi, nell’array ora, inizialmente contenente solo riferimenti, devo creare nuovi oggetti Orario ogni volta che ne inserisco uno.
public void stampa(). Stampa a video il contenuto dei due array, distinguendo il caso in cui l’array sia stato riempito completamente, o solo in parte.
public int media(). Restituisce la media di tutte le temperature rilevate. Anche qui vengono distinti i due casi sopra menzionati.


  1. PROGETTO

Per realizzare quello che è descritto nell’analisi utilizzo l’ ADT Orario, precedentemente realizzato. Per creare un elenco simile (vedi descrizione) dovrò utilizzare due array differenti, poiché i dati da inserire sono di natura differente. Uno è una temperatura, dunque un intero, l’altro un orario, un’astrazione che (per fortuna) ho già a disposizione.




  1. IMPLEMENTAZIONE

Vedi file allegati con relativi commenti.





  1. CASI D’USO

Come richiesto viene creato un elenco per 10 rilevamenti, vengono inseriti 10 rilevamenti, viene stampato l’elenco e la media delle temperature inserite.


Estensione: vengono inseriti altri due rilevamenti che vanno a sovrascrivere i primi due precedentemente immessi. Questo per verificare il corretto funzionamento dell’elenco nel caso vengano inseriti più rilevamenti di quelli che potrebbero essere inseriti (10).

Viene ristampato l’elenco aggiornato e viene ristampata la media, che ovviamente avrà un valore differente.

C:\Temp>java Example

Rilevamenti totali: 10

Rilevamenti vecchi sovrascritti: false
Rilevamento 0 : Temperatura: 19 Ore 20:30:00

Rilevamento 1 : Temperatura: 18 Ore 20:31:00

Rilevamento 2 : Temperatura: 20 Ore 20:32:00

Rilevamento 3 : Temperatura: 16 Ore 20:33:00

Rilevamento 4 : Temperatura: 15 Ore 20:34:00

Rilevamento 5 : Temperatura: 18 Ore 20:35:00

Rilevamento 6 : Temperatura: 17 Ore 20:36:00

Rilevamento 7 : Temperatura: 24 Ore 20:37:00

Rilevamento 8 : Temperatura: 25 Ore 20:38:00

Rilevamento 9 : Temperatura: 30 Ore 20:39:00


Media temperature: 20


C:\Temp>java Example


Rilevamenti totali: 10

Rilevamenti vecchi sovrascritti: true


Rilevamento 0 : Temperatura: -1 Ore 20:40:00

Rilevamento 1 : Temperatura: 1 Ore 20:50:00

Rilevamento 2 : Temperatura: 20 Ore 20:32:00

Rilevamento 3 : Temperatura: 16 Ore 20:33:00

Rilevamento 4 : Temperatura: 15 Ore 20:34:00

Rilevamento 5 : Temperatura: 18 Ore 20:35:00

Rilevamento 6 : Temperatura: 17 Ore 20:36:00

Rilevamento 7 : Temperatura: 24 Ore 20:37:00

Rilevamento 8 : Temperatura: 25 Ore 20:38:00

Rilevamento 9 : Temperatura: 30 Ore 20:39:00


Media temperature: 16

  1. CONCETTI E TECNICHE ACQUISITE

Realizzando l’astrazione ElencoTemp si è imparato (si spera) l’utilizzo degli array come oggetti, come istanze della classe [].

In primo luogo, infatti, sono stati definiti i riferimenti, poi si sono creati dinamicamente le istanze degli array.

A questo punto nel caso dell’array di interi gli elementi sono già variabili, dunque occupano lo spazio di una variabile di tipo int, mentre nell’array di orari gli elementi sono riferimenti e occupano lo spazio di un riferimento.



Se voglio dunque un nuovo oggetto Orario, devo crearlo con ora[x]= new Orario (o,m,s);

Si è imparato inoltre l’utilizzo di alcune delle proprietà di questa classe [], come length.


Condividi con i tuoi amici:


©astratto.info 2019
invia messaggio

    Pagina principale