Problemi per la lezione del 22/12
La società di telefonia TeleBue vi ha commissionato la realizzazione di un programma per gestire il traffico telefonico. Per iniziare tale programma dovete scrivere alcune classi di utilità, come sotto specificato.
- [Classe Orario] Implementate una classe di nome Orario che rappresenta un orario, specificato
come ore e minuti. Internamente, la classe deve mantenere un singolo attributo intero (privato) che rappresenta i minuti trascorsi dalla mezzanotte.
La classe deve avere i seguenti costruttori e metodi:
- Orario(int h, int m): costruisce l'orario h:m (h deve essere compreso fra 0 e 23, e m deve essere compreso fra 0 e 59; decidete come comportarvi se queste condizioni non si verificano);
- Orario(int h): costruisce l'orario h:00
- Orario(): costruisce l'orario corrispondente all'ora attuale; per ottenere tale orario, tenete conto che:
- l'ora attuale si può ottenere con l'istruzione (new GregorianCalendar()).get(Calendar.HOUR_OF_DAY)
- i minuti attuali si possono ottenere con l'istruzione (new GregorianCalendar()).get(Calendar.MINUTE)
- int getOre(): restituisce le ore
- int getMinuti(): restituisce i minuti
- void setOre(int h): cambia le ore, lasciando i minuti invariati
- void setMinuti(int m): cambia i minuti, lasciando le ore invariate
- void setOreMinuti(int h, int m): cambia sia le ore che i minuti
- boolean equals(Orario x): restituisce true sse l'orario su cui è invocato è uguale a x
- int compareTo(Orario x): restituisce un valore negativo se l'orario su cui è invocato viene prima di x, 0 se i due orari sono uguali, e un valore maggiore di zero se l'orario su cui è invoato viene dopo
- int quantoManca(Orario x): restituisce il numero di minuti dall'orario target all'orario x (sarà un valore negativo se x viene prima dell'orario attuale)
- String toString(): restituisce una stringa della forma h:m
- static void setSeparatore(char separatore): permette di scegliere con che separatore produrre gli orari (da ora in avanti verrà usato come separatore il carattere indicato, anziché :, nel metodo toString())
- static void setFormato(boolean formato24): permette di scegliere se stampare gli orari (da ora in poi) nel formato 24 ore, oppure nel formato 12 ore: in questo caso, il metodo toString() dovrà restituire ore della forma "h:m AM" oppure "h:m PM" (al posto dei : ovviamente dovrete usare il separatore specificato).
- [Classe PianoTariffario] La società fornisce vari piani tariffari. Ogni piano tariffario prevede un certo
prezzo al minuto per ciascuna fascia oraria. Più precisamente, ogni piano è caratterizzata da un nome e da un prezzo al minuto assegnato
a ciascuna delle 24 ore. La classe deve avere i seguenti metodi e costruttori:
- PianoTariffario(String nome, int prezzoAlMinuto): crea un piano tariffario con il nome specificato e in cui il prezzo al minuto (in centesimi di euro) è quello indicato per tutte le fasce orarie
- void setPrezzoAlMinuto(int nuovoPrezzoAlMinuto, int da, int a): modifica il prezzo al minuto fra l'ora da e l'ora a
- int getPrezzoAlMinuto(int h): restituisce il prezzo al minuto per l'ora indicata
- int getPrezzoAlMinuto(Orario x): restituisce il prezzo al minuto per l'orario indicato (questo prezzo dipende solo dall'ora, non dai minuti)
- int prezzoTotale(Orario inizio, int minuti): resituisce il prezzo complessivo di una telefonata che sia iniziata nell'orario indicato, e che sia durata il numero di minuti specificati (tale prezzo si otterrà moltiplicando il prezzo al minuto che dipende dall'orario di partenza per il numero di minuti)
- String toString(): restituisce una stringa descrittiva per il piano tariffario.
Per esempio, il seguente frammento di codice costruisce una fascia tariffaria di nome
AsinelloNoLimit con un prezzo di 15 cent al minuto nelle fascie 8-11 e 15-18, di 20 cent nelle fasce 12-14 e 19-21, e di 10 cent fra le 22 e le 7:
PianoTariffario f = new PianoTariffario( "AsinelloNoLimits", 10 );
f.setPrezzoAlMinuto(15, 8, 11);
f.setPrezzoAlMinuto(15, 15, 18);
f.setPrezzoAlMinuto(20, 12, 14);
f.setPrezzoAlMinuto(20, 19, 21);
Suggerimento: la classe dovrebbe avere un attributo costituito da un array di 24 interi, in cui l'elemento di indice i rappresenta il prezzo al minuto per l'ora i. Tale array viene inizializzato dal costruttore e modificato dal metodo setPrezzoAlMinuto.
- [Classe Abbonato] Un abbonato è una persona dotata di un numero di telefono e di un piano tariffario (scelto al momento
della sottoscrizione dell'abbonamento e non più modificabile). Per scrivere la classe Abbonato copiate nel progetto la classe Persona
che avete scritto la scorsa settimana. Quindi aggiungete una classe Abbonato che estenda
Persona con i seguenti costruttori e con i nuovi metodi indicati (gli altri sono ovviamente ereditati da Persona):
- Abbonato(String nome, String cognome, String luogoDiNascita, int annoDiNascita, String numeroTelefono, PianoTariffario piano): costruisce un abbonato con i dati forniti
- PianoTariffario getPiano(): restituisce il piano tariffario dell'abbonato
- String numeroTelefono(): restituisce il numero di telefono dell'abbonato
Decidete anche se volete riscrivere qualche metodo di Persona. In particolare, consigliamo di riscrivere il metodo toString() in modo che venga stampato anche il numero di telefono e il piano tariffario.
- [Classe Chiamata] Una chiamata è caratterizzata da: un abbonato chiamante, una persona ricevente (può trattarsi di un abbonato
oppure no), un orario di inizio, e un numero di minuti per cui è durata. Scrivete una classe Chiamata che abbia (almeno) i seguenti
costruttori e metodi:
- Chiamata(Abbonato chiamante, Persona chiamata, Orario inizio, int durata): crea una chiamata
- int getCostoTotale(): restituisce il costo totale della chiamata.
A questo punto, modificate la classe abbonato, aggiungendo un metodo:
- void aggiungiChiamata(Persona chiamata, Orario inizio, int durata)
- String elencoChiamate(): restituisce una stringa contenente l'elenco delle chiamate effettuate dall'abbonato
- int spesaTotale(): restituisce il costo complessivo delle telefonate effettuate dall'abbonato.