Tema n. 1
import competenze.*;
public class TestCompetenze {
public static void main(String[] args) {
String[] v; Org Org1 = new Org();
try{
Competenza c1 = Org1.newCompetenza("java", "programmazione java");
Org1.newCompetenza("c++", "programmazione c++");
Org1.newCompetenza("uml", "modellazione ad oggetti");
Org1.newCompetenza("cs", "progetto sistemi client/server");
Org1.newCompetenza("er", "modellazione er");
String[] v1 = {"java"};
String[] v2 = {"uml", "cs", "java"};
String[] v3 = {"uml", "er"};
String[] v4 = {"uml", "cs", "java", "c++"};
Attività a1 = Org1.newAttività("Analisi s1", v1);
Attività a2 = Org1.newAttività("Progetto s1", v2);
Utente u1 = Org1.newUtente("U1", v3);
Org1.newUtente("U2", v2);
Org1.newUtente("U3", v4);
System.out.println(a2); System.out.println(u1);
} catch (OrgEccezione e){System.out.println(e.getMessage());}
System.out.println(Org1.elencoCompetenzeRichieste());
System.out.println(Org1.elencoCompetenzePossedute());}}
Risultato
Progetto s1[cs, java, uml] nota: competenze ordinate; da println(a2)
U1[er, uml] nota: competenze ordinate; da println(u1)
[java: nR=2 nP=2, cs: nR=1 nP=2, uml: nR=1 nP=3, c++: nR=0 nP=1, er: nR=0 nP=1]
[uml: nR=1 nP=3, cs: nR=1 nP=2, java: nR=2 nP=2, c++: nR=0 nP=1, er: nR=0 nP=1]
Si implementino le classi usate nel programma di test precedente; tali classi si trovano nel
package competenze.
Note
newCompetenza nomeCompetenza, descrizione:
genera un'eccezione se nomeCompetenza è null oppure è ripetuto
newAttività nomeAttività, elenco competenze richieste
genera un'eccezione se nomeAttività è null o è ripetuto
oppure se una competenza nell'elenco non è stata definita
o è già stata richiesta per l'attività corrente
newUtente nomeUtente, elenco competenze possedute
genera un'eccezione come nel caso precedente
elencoCompetenzeRichieste
stampa l'elenco delle competenze ordinate in modo decrescente
in base al numero delle attività richiedenti; a parità di n. richiedenti
vale l’ordine alfabetico delle competenze; si usi un oggetto comparatore
elencoCompetenzePossedute
stampa l'elenco delle competenze ordinate in base al numero degli utenti
possessori; stesse modalità del caso precedente
Suggerimento
In ogni oggetto Competenza si registrino il n. di attività che la richiedono
e il n. di utenti che la posseggono.
Si raccomanda la massima chiarezza.
1
classe OrgEccezione
classe package competenze;
public class OrgEccezione extends Exception {
OrgEccezione(String s) {super(s);}}
classe Competenza
package competenze;
public class Competenza {
String c; String d;
int nRichieste = 0; int nPossedute = 0;
Competenza(String c, String d) {this.c = c; this.d = d;}
public String toString(){
return c + ":" + " nR=" + nRichieste + " nP=" + nPossedute;}}
classe Attività
package competenze;
import java.util.TreeMap; import java.util.Map;
public class Attività {
private String a;
Map competenze = new TreeMap();
Attività(String a) {this.a = a;}
public String toString(){return a + competenze.keySet();}}
classe Utente
package competenze;
import java.util.TreeMap; import java.util.Map;
public class Utente {
private String u;
Map competenze = new TreeMap();
Utente(String u) {this.u = u;}
public String toString(){return u + competenze.keySet();}}
2
classe Org
package competenze;
import java.util.ArrayList; import java.util.Collections;
import java.util.Comparator; import java.util.HashMap;
import java.util.List; import java.util.Map;
public class Org {
private Map competenze = new HashMap();
private Map attività = new HashMap();
private Map utenti = new HashMap();
public Competenza newCompetenza(String c, String d) throws OrgEccezione {
if (c == null) throw new OrgEccezione("competenza nulla");
Competenza c1 = new Competenza(c,d);
Object prev = competenze.put(c, c1);
if (prev != null) throw new OrgEccezione("competenza esistente:" + c);
return c1; }
public Attività newAttività(String a, String[] v) throws OrgEccezione {
if (a == null) throw new OrgEccezione("attività nulla");
Attività a1 = new Attività(a);
Object prev = attività.put(a, a1);
if (prev != null) throw new OrgEccezione("attività duplicata:" + a);
for (int i = 0; i < v.length; i++) {
String c = v[i];
Competenza c1 = (Competenza) competenze.get(c);
if (c1 == null) throw new OrgEccezione("competenza inesistente:" + c);
else {
Competenza c2 = (Competenza) a1.competenze.get(c);
if (c2 != null) throw new OrgEccezione("competenza già richiesta:"
+ c + " da " + a);
else {a1.competenze.put(c, c1); c1.nRichieste++;}
}
}
return a1;}
public Utente newUtente(String u, String[] v) throws OrgEccezione {
if (u == null) throw new OrgEccezione("utente nullo");
Utente u1 = new Utente(u);
Object prev = utenti.put(u, u1);
if (prev != null) throw new OrgEccezione("utente esistente:" + u);
for (int i = 0; i < v.length; i++) {
String c = v[i];
Competenza c1 = (Competenza) competenze.get(c);
if (c1 == null) throw new OrgEccezione("competenza inesistente:" + u);
else {
Competenza c2 = (Competenza) u1.competenze.get(c);
if (c2 != null) throw new OrgEccezione("competenza già richiesta:"
+ c + " da " + u);
else {u1.competenze.put(c, c1); c1.nPossedute++;}
}
}
return u1;}
3
public String elencoCompetenzeRichieste() {
Comparator ordineR = new Comparator() {
public int compare(Object o1, Object o2) {
Competenza c1 = (Competenza) o1;
Competenza c2 = (Competenza) o2;
if (c2.nRichieste == c1.nRichieste) return c1.c.compareTo(c2.c);
return new Integer(c2.nRichieste).compareTo(new Integer(c1.nRichieste));
}};
List l1 = new ArrayList(competenze.values());
Collections.sort (l1, ordineR); return l1.toString();}
public String elencoCompetenzePossedute() {
Comparator ordineP = new Comparator() {
public int compare(Object o1, Object o2) {
Competenza c1 = (Competenza) o1;
Competenza c2 = (Competenza) o2;
if (c2.nPossedute == c1.nPossedute) return c1.c.compareTo(c2.c);
return new Integer(c2.nPossedute).compareTo(new
Integer(c1.nPossedute));
}};
List l1 = new ArrayList(competenze.values());
Collections.sort (l1, ordineP); return l1.toString();}
}
4
Si progetti un’interfaccia
grafica
che
consenta
l’inserimento
delle
competenze e delle attività
relative al package di cui al
punto 1. Per inserire una
competenza si scrive il
nome nella prima casella, la
descrizione nella seconda e
si preme il pulsante
NewCompetenza;
per
inserire un’attività si scrive il nome nella prima casella, l’elenco delle competenze
separate da virgole nella seconda e si preme il pulsante NewAttività; per avere l’elenco
delle competenze richieste si preme il pulsante ElencoCR. L’interfaccia è realizzata dalla
classe Gui che usa il package competenze del punto 1. L’area di testo centrale è usata per
mostrare le eccezioni dei primi due comandi e il risultato del terzo.
Nel caso del comando NewAttività si usi uno StringTokenizer per estrarre le competenze
dalla stringa (ad es. “uml,cs,java”) letta dalla seconda casella di testo per poi collocarle
nel vettore da passare al metodo NewAttività della classe Org.
Si indichino gli attributi della classe Gui e si scriva il metodo ActionPerformed.
Attributi di Gui
private
private
private
private
JTextArea ta;
JTextField tf1;
JTextField tf2;
Org org1 = new Org();
metodo ActionPerformed
public void actionPerformed(ActionEvent e)
{
String actionCommand = e.getActionCommand();
ta.setText("");
if (actionCommand.equals("NewCompetenza")){
String n = tf1.getText();
String d = tf2.getText();
try{org1.newCompetenza(n, d); ta.setText("added");
} catch (OrgEccezione ex){ta.setText(ex.getMessage());}
}
else if (actionCommand.equals("NewAttività")) {
String n = tf1.getText();
String s = tf2.getText();
StringTokenizer st = new StringTokenizer(s,",");
String[] v = new String[st.countTokens()];
for (int i = 0; st.hasMoreTokens(); i++ ) {
v[i] = st.nextToken();}
try{org1.newAttività(n, v); ta.setText("added");
} catch (OrgEccezione ex){ta.setText(ex.getMessage());}
}
else if (actionCommand.equals("ElencoCR")) {
ta.setText(org1.elencoCompetenzeRichieste());
}
}
5
Tema n.2
import biblioteca.*;
public class TestPrestiti {
public static void main(String[] args) {
Biblioteca bib = new Biblioteca();
try{
Libro l1 = bib.newLibro("titolo1", 1);
bib.newLibro("titolo2", 2);
bib.newLibro("titolo3", 3);
Utente u1 = bib.newUtente("utente1", 1);
bib.newUtente("utente2", 3);
int c1 = bib.newPrestito("utente1", "titolo1");
bib.restituzione("utente1", c1);
int c2 = bib.newPrestito("utente1", "titolo3");
int c3 = bib.newPrestito("utente2", "titolo1");
}catch(BiblioEccezione e){System.out.println(e.getMessage());}
System.out.println(bib.graduatoriaLibri());
System.out.println(bib.prestitiInCorso());}}
Risultati
[titolo1:2, titolo3:1, titolo2:0]
[titolo1:100(utente2), titolo3:103(utente1)]
Si implementino le classi usate nel programma di test precedente; tali classi si trovano nel
package biblioteca. Tutti gli attributi di tali classi devono essere privati.
Note
newLibro titolo, nVolumi: genera nVolumi disponibili per il libro dal titolo
dato; produce un’eccezione se titolo è null oppure è ripetuto o nVolumi <= 0.
Ogni volume ha un numero progressivo univoco a partire da 100.
newUtente nome, maxVolumi: genera un utente con il nome dato e stabilisce il n.
max di volumi che può prendere in prestito simultaneamente; produce
un’eccezione se nome è null oppure è ripetuto o maxVolumi <= 0.
newPrestito utente, titolo: genera un prestito e fornisce il codice del volume;
produce un’eccezione se utente/titolo è null oppure non esiste o l’utente ha
raggiunto il max numero di libri in prestito o non c’è alcun volume
disponibile. Un prestito è una coppia di riferimenti: volume, utente.
restituzione utente, codice; restituisce il volume con il codice dato; produce
un’eccezione se utente/titolo è null oppure non esiste o il codice non si
riferisce ad un volume preso in prestito dall’utente.
graduatoriaLibri fornisce l’elenco dei libri ordinati in base al n. dei
prestiti totali e a parità di tale numero in base al titolo; si usi un
comparator.
prestitiInCorso fornisce l’elenco dei prestiti in corso ordinati in base al
titolo e al codice del volume.
Si raccomanda la massima chiarezza.
6
package biblioteca;
public class BiblioEccezione extends Exception {
BiblioEccezione(String s) {super(s);}}
package biblioteca;
public class Libro {
private String titolo; private Volume[] volumi; private int nPrestiti = 0;
Libro(String titolo, int n){
this.titolo = titolo; volumi = new Volume[n];
for (int i = 0; i < volumi.length; i++) volumi[i] = new Volume(this);}
String getTitolo(){return titolo;}
int getNPrestiti() {return nPrestiti;}
Volume getVolume() {
for (int i = 0; i < volumi.length; i++){
Volume v = volumi[i];
if (v.getDisp()) {v.setDisp(false); nPrestiti ++; return v;}}
return null;}
public String toString(){return titolo + ":" + nPrestiti;}
}
package biblioteca;
class Volume {
private static int nuovoCodice = 100;
private int codice; private boolean disp = true;
private Libro libro;
Volume(Libro l){libro = l; codice = nuovoCodice++;}
boolean getDisp () {return disp;}
void setDisp(boolean val) {disp = val;}
int getCodice(){return codice;}
Libro getLibro() {return libro;}
}
7
package biblioteca;
public class Utente {
private String nome; private int max;
private int nPrestiti = 0;
Utente(String nome, int max) {this.nome = nome; this.max = max;}
String getNome(){return nome;}
void incPrestiti(){nPrestiti++;}
void decPrestiti(){nPrestiti--;}
boolean prestitoAmmissibile () {return nPrestiti < max;}
}
package biblioteca;
class Prestito implements Comparable{
private Utente u; private Volume v;
Prestito(Utente u, Volume v){this.u = u; this.v = v;}
Utente getU() {return u;}
Volume getV() {return v;}
public int compareTo(Object o1) {
Prestito p1 = (Prestito) o1;
if (this.v.getLibro().getTitolo().equals(p1.v.getLibro().getTitolo()))
return new Integer(this.v.getCodice()).compareTo(new
Integer(p1.v.getCodice()));
else return
this.v.getLibro().getTitolo().compareTo(p1.v.getLibro().getTitolo());
}
public String toString(){return v.getLibro().getTitolo() + ":" + v.getCodice()
+ "(" + u.getNome() + ")";}
}
8
package biblioteca;
import java.util.ArrayList; import java.util.Collections;
import java.util.Comparator; import java.util.HashMap;
import java.util.List; import java.util.Map;
public class Biblioteca {
private Map libri = new HashMap();
private Map utenti = new HashMap();
private Map prestiti = new HashMap();
public Libro newLibro(String titolo, int n) throws BiblioEccezione {
if (titolo == null || n <= 0) throw new BiblioEccezione("newLibro: dati
errati - " + titolo + " " + n);
Libro l1 = new Libro(titolo,n);
Object prev = libri.put(titolo, l1);
if (prev != null) throw new BiblioEccezione("libro esistente:" + titolo);
return l1;}
public Utente newUtente(String nome, int n) throws BiblioEccezione {
if (nome == null || n <= 0) throw new BiblioEccezione("newUtente: dati
errati - " + nome + " " + n);
Utente u1 = new Utente(nome,n);
Object prev = utenti.put(nome, u1);
if (prev != null) throw new BiblioEccezione("utente esistente:" + nome);
return u1;}
public int newPrestito(String u, String titolo) throws BiblioEccezione {
if (titolo == null || u == null) throw new BiblioEccezione("newPrestito:
dati errati - " + titolo + " " + u);
Utente u1 = (Utente) utenti.get(u);
if (u1 == null) throw new BiblioEccezione("newPrestito: dati errati - " +
u);
if (!u1.prestitoAmmissibile()) throw new BiblioEccezione("newPrestito:
max prestiti per " + u);
Libro l = (Libro)libri.get(titolo);
if (l == null) throw new BiblioEccezione("newPrestito: dati errati - " +
titolo);
Volume v = l.getVolume();
if (v == null) throw new BiblioEccezione("newPrestito: volume non
disponibile - " + titolo);
Prestito p = new Prestito(u1, v);
int c = v.getCodice();
prestiti.put(new Integer(c), p);
u1.incPrestiti();
return c;
}
9
public void restituzione(String u, int codiceVolume) throws BiblioEccezione {
Utente u1 = (Utente) utenti.get(u);
if (u1 == null) throw new BiblioEccezione("restituzione: dati errati - "
+ u);
Prestito p = (Prestito) prestiti.get(new Integer(codiceVolume));
if (p == null || u1 != p.getU()) throw new BiblioEccezione("restituzione:
dati errati - " + codiceVolume);
u1.decPrestiti(); p.getV().setDisp(true);
prestiti.remove(new Integer(codiceVolume));
}
public String graduatoriaLibri() {
Comparator ordine = new Comparator() {
public int compare(Object o1, Object o2) {
Libro l1 = (Libro) o1;
Libro l2 = (Libro) o2;
if (l2.getNPrestiti() == l1.getNPrestiti()) return
l1.getTitolo().compareTo(l2.getTitolo());
return new Integer(l2.getNPrestiti()).compareTo(new
Integer(l1.getNPrestiti()));
}};
List list1 = new ArrayList(libri.values());
Collections.sort(list1, ordine); return list1.toString();}
public String prestitiInCorso(){
List list1 = new ArrayList(prestiti.values());
Collections.sort(list1); return list1.toString();}
}
10
2. Si progetti un’interfaccia grafica (attributi e metodo actionPerformed della classe GUI) che consenta
l’uso del package di cui al punto 1. I pulsanti corrispondono alle operazioni definite al punto 1.
Ad esempio, detti t1 e t2 i valori inseriti nelle due caselle di testo, newLibro inserisce il libro con titolo t1 e
con n. volumi pari a t2.
Eventuali eccezioni sono mostrate nell’area di testo. L’area di testo mostra la conferma “done” nel caso di
newLibro, newUtente e restituzione se l’operazione è andata a buon fine, il codice del prestito nel caso di
newPrestito, il risultato della query negli altri casi. La figura precedente presenta il risultato di
graduatoriaLibri.
private JTextArea ta; private JTextField tf1; private JTextField tf2;
private Biblioteca bib = new Biblioteca();
public static final String LIBRO = "newLibro";
public static final String UTENTE = "newUtente";
public static final String PRESTITO = "newPrestito";
public static final String RESTITUZIONE = "restituzione";
public static final String INCORSO = "prestitiInCorso";
public static final String GRAD = "graduatoriaLibri";
public void actionPerformed(ActionEvent e)
{
String actionCommand = e.getActionCommand();
ta.setText("");
String s1 = tf1.getText(); String s2 = tf2.getText();
try{
if (actionCommand.equals(LIBRO)){
bib.newLibro(s1, Integer.parseInt(s2));
ta.setText("done"); }
else if (actionCommand.equals(UTENTE)) {
bib.newUtente(s1, Integer.parseInt(s2));
ta.setText("done"); }
else if (actionCommand.equals(PRESTITO)) {
ta.setText(bib.newPrestito(s1, s2) + "");}
else if (actionCommand.equals(RESTITUZIONE)) {
bib.restituzione(s1, Integer.parseInt(s2));
ta.setText("done"); }
else if (actionCommand.equals(GRAD)) {
ta.setText(bib.graduatoriaLibri());
}
else if (actionCommand.equals(INCORSO)) {
ta.setText(bib.prestitiInCorso());
}
}catch(BiblioEccezione ex){ta.setText(ex.getMessage());}
catch(NumberFormatException ex){ta.setText(ex.getMessage());}}
11
Tema n. 3
public class TestPalestra {
public static void main(String[] args) {
try{
Persona p1 = new Persona("p1");
Persona p2 = new Persona("p2");
// Persona p3 = new Persona("p1"); genera l’errore: nome ripetuto - p1
Attrezzo a1 = new Attrezzo("a1"); Attrezzo a2 = new Attrezzo("a2");
String s1 = Attrezzo.showAttrezzi(); System.out.println(s1);
Esercizio e1 = new Esercizio ("es 1", "a1", 1, 8);
Esercizio e2 = new Esercizio ("es 2", "a2", 1, 9);
Esercizio e3 = new Esercizio ("es 3", "a1", 2, 8);
Esercizio e4 = new Esercizio ("es 4", "a2", 2, 10);
Esercizio e5 = new Esercizio ("es 5", "a2", 2, 10);
p1.nuovoEsercizio(e1); p1.nuovoEsercizio(e2);
p1.nuovoEsercizio(e3); p2.nuovoEsercizio(e4);
//p1.nuovoEsercizio(e1); //produce il messaggio d'errore esercizio duplicato per p1
//p1.nuovoEsercizio(e5); //produce il messaggio d'errore esercizio duplicato per a2
System.out.println(p1); System.out.println(a1); } catch(PalestraEx e)
{System.out.println(e.getMessage());}}}
Risultato
[a1, a2] nota: gli attrezzi sono ordinati; da showAttrezzi()
p1[1:8:es 1:p1:a1, 1:9:es 2:p1:a2, 2:8:es 3:p1:a1] nota: da println(p1)
a1[1:8:es 1:p1:a1, 2:8:es 3:p1:a1] nota: da println(a1)
Si implementino le classi usate nel programma di test precedente.
Note
Il programma riguarda la gestione degli esercizi che devono essere svolti dalle persone che
frequentano una palestra. Un esercizio è caratterizzato da: nome, attrezzo da usare, giorno e ora di
inizio (giorno e ora sono indicati da numeri interi, la durata si assume unitaria).
new Persona/ new Attrezzo nome
genera un'eccezione se nome è null oppure è ripetuto
new Esercizio nome, attrezzo, giorno, ora
genera un'eccezione se l’attrezzo non è stato definito oppure se giorno non è compreso tra 1 e 365
o ora non è compresa tra 8 e 21
nuovoEsercizio esercizio
genera un'eccezione se esercizio è null oppure la persona ha già un esercizio in quella data
(giorno + ora) o l’attrezzo indicato da esercizio è già impegnato in un altro esercizio alla stessa
data
Si raccomanda la massima chiarezza.
12
classe PalestraEx
public class PalestraEx extends Exception {
PalestraEx(String s) {super(s);}
classe Esercizio
public class Esercizio implements Comparable {
String nome; Attrezzo a; int g; int h;
Persona p;
Attrezzo getAttrezzo(){return a;}
void setPersona(Persona p){this.p = p;}
public Esercizio(String nome, String attrezzo, int g, int h) throws
PalestraEx{
this.nome = nome; this.g = g; this.h = h;
a = Attrezzo.getAttrezzo(attrezzo);
if (a == null) throw new PalestraEx("attrezzo inesistente");
if ((g < 1 || g > 365) || (h < 8 || h > 21)) throw new
PalestraEx("data errata per " + nome);}
public int compareTo(Object other) {
Esercizio e = (Esercizio) other;
if (this.g != e.g) return (this.g < e.g ? -1 : 1);
if (this.h == e.h) return 0;
return (this.h < e.h ? -1 : 1);
}
public String toString(){
return g + ":" + h + ":" + nome +
a.getNome();
}
}
":" + p.getNome() +
":" +
13
classe Attrezzo
import java.util.TreeSet; import java.util.Set;
import java.util.TreeMap; import java.util.Map;
public class Attrezzo {
private String nome;
private static Map attrezzi = new TreeMap();
private Set esercizi = new TreeSet();
static Attrezzo getAttrezzo(String nome){
return
(Attrezzo) attrezzi.get(nome);
}
public static String showAttrezzi(){
return attrezzi.keySet().toString();
}
String getNome (){return nome;}
public Attrezzo(String nome) throws PalestraEx {
this.nome = nome;
if (nome == null) throw new PalestraEx("nome nullo");
this.nome = nome;
Object prev = attrezzi.put(nome, this);
if (prev != null) throw new PalestraEx("attrezzo già esistente:" +
nome);
}
public String toString(){return nome + esercizi;}
boolean addEsercizio(Esercizio e) {return esercizi.add(e);}
}
14
classe Persona
import java.util.TreeMap; import java.util.Map;
import java.util.TreeSet; import java.util.Set;
public class Persona {
private String nome;
private static Map persone = new TreeMap();
private Set esercizi = new TreeSet();
String getNome (){return nome;}
public Persona(String nome) throws PalestraEx {
if (nome == null) throw new PalestraEx("nome nullo");
this.nome = nome;
Object prev = persone.put(nome, this);
if (prev != null) throw new PalestraEx("persona già esistente:" +
nome);
}
public String toString(){return nome + esercizi;}
public void nuovoEsercizio(Esercizio e) throws PalestraEx{
boolean b = esercizi.add(e);
if (! b) throw new PalestraEx("esercizio duplicato per " + nome);
Attrezzo a = e.getAttrezzo();
if (! a.addEsercizio(e)) throw new PalestraEx("esercizio duplicato
per " + a.getNome());
e.setPersona(this);
}
}
15
2. Si progetti un’interfaccia
grafica
che
consenta
l’inserimento delle persone e
degli attrezzi relativi al punto
1.
Per
inserire
una
persona/attrezzo si scrive il
nome nella casella di testo,
poi si preme il pulsante
newPersona/newAttrezzo. Per
avere l’elenco degli attrezzi si
preme
il
pulsante
showAttrezzi.
L’area di testo centrale è usata per mostrare le eccezioni dei primi due comandi e il risultato del
terzo.
Si indichino i dati della classe Gui e si scriva soltanto il metodo ActionPerformed.
private JTextArea ta;
private JTextField tf1;
public void actionPerformed(ActionEvent e)
{
String actionCommand = e.getActionCommand();
ta.setText("");
String n = tf1.getText();
try{
if (actionCommand.equals("newPersona")){
new Persona(n);
ta.setText("added");
}
else if (actionCommand.equals("newAttrezzo")) {
new Attrezzo(n);
ta.setText("added");
}
else if (actionCommand.equals("showAttrezzi")) {
ta.setText(Attrezzo.showAttrezzi());
}
}catch (PalestraEx ex){ta.setText(ex.getMessage());}
}
}
16
Tema n. 4
import voli.*;
public class TestVoli {
public static void main(String[] args) {
try{
Voli vi = new Voli();
Aereo a1 = vi.addAereo("a1", "aereo a1", 100);
Aereo a2 = vi.addAereo("a2", "aereo a2", 150);
vi.addVolo("v1", "a1", "L1", 8, "L2", 10);
vi.addVolo("v10", "a1", "L23", 6, "L34", 7);
vi.addVolo("v2", "a2", "L3", 12, "L4", 14);
//vi.addVolo("v20", "a1", "L5", 9, "L6", 11); genera e. volo sovrapposto
vi.addPrenotazione("v1", "pass5", 1);
vi.addPrenotazione("v1", "pass2", 1);
//vi.addPrenotazione("v1", "pass2", 1); genera e. prenotazione duplicata
VoloGiornaliero vg = vi.getVoloGiornaliero("v1", 1);
System.out.println(vg);
System.out.println(a1);
}catch(VoliEx e){System.out.println(e);}}}
Risultato
1 v1 da L1:8 a L2:10[pass2, pass5] //info su volo giornaliero
//giorno, volo … passeggeri prenotati in ordine alfabetico
a1 aereo a1 100 [v10 da L23:6 a L34:7, v1 da L1:8 a L2:10] //info su aereo
//elenco voli ordinati per orario
Si implementino le classi usate nel programma di test precedente; tali classi si trovano nel
package voli.
Note
Il programma riguarda la gestione delle prenotazioni di voli giornalieri nell’ambito di una
settimana.
addAereo codiceAereo, descrizione, numeroPosti
genera un aereo e produce un'eccezione se codiceAereo è null o ripetuto o se numeroPosti < 0.
addVolo codiceVolo, codiceAereo, luogoPartenza, oraPartenza, luogoArrivo, oraArrivo
produce un'eccezione se codiceVolo è null o ripetuto o se l’aereo non esiste, se i luoghi sono nulli
e le ore non sono comprese tra 1 e 24 e oraArrivo non è maggiore di oraPartenza;
inoltre produce un’eccezione se tale volo si sovrappone ad un altro volo per lo stesso aereo (detti
v1 e v2 due voli per lo stesso aereo, non si ha sovrapposizione se
v1.oraArrivo < v2.oraPartenza o v1.oraPartenza > v2.oraArrivo.
Genera il volo in base al suggerimento seguente.
Suggerimento
Conviene che un oggetto volo, che stabilisce l’orario di un volo, contenga un array di 7 voli
giornalieri, perché le prenotazioni si riferiscono ai voli giornalieri.
addPrenotazione codiceVolo, passeggero, giorno
produce un'eccezione se il volo non esiste, passeggero è nullo o giorno non è compreso tra 1 e 7
e inoltre se non vi sono posti disponibili sul volo giornaliero nel giorno indicato o la prenotazione
è duplicata; aggiunge il passeggero alle prenotazioni del volo giornaliero nel giorno indicato.
17
package voli;
public class VoliEx extends Exception {
VoliEx(String s) {super(s);}
}
package voli;
import java.util.Set; import java.util.TreeSet;
public class Aereo {
String id; String descr; int nPosti;
Set sVoli = new TreeSet();
Aereo(String id, String descr, int nPosti){
this.id = id; this.descr = descr; this.nPosti = nPosti;
}
void addVolo(Volo v) throws VoliEx{
if (! sVoli.add(v)) throw new VoliEx("sovrapposizione voli:" + v.id);
}
public String toString(){
return id + " " + descr + " " + nPosti + " " + sVoli;
}
}
18
package voli;
public class Volo implements Comparable {
String id; Aereo a; String lP; int oP; String lA; int oA;
VoloGiornaliero[] voliGiornalieri;
Volo(String id, Aereo a, String lP, int oP, String lA, int oA){
this.id = id; this.a = a; this.lP = lP; this.oP = oP; this.lA =
lA; this.oA = oA;
voliGiornalieri = new VoloGiornaliero[7];
for (int i = 0; i < 7; i++) voliGiornalieri[i] = new
VoloGiornaliero(this, i);
}
public int compareTo(Object o){
Volo v2 = (Volo) o;
if (this.oA < v2.oP) return -1;
else if (this.oP > v2.oA) return 1;
else return 0;
}
void addPrenotazione(String passeggero, int giorno) throws VoliEx{
VoloGiornaliero vg = voliGiornalieri[giorno];
if (vg.prenotazioni.size() == this.a.nPosti) throw new
VoliEx("volo completo:" + this.id + ":" + giorno);
if (! vg.prenotazioni.add(passeggero)) throw new
VoliEx("prenotazione duplicata:" + this.id + ":" + giorno + " " + passeggero);
}
public String toString(){
return id + " da " + lP + ":" + oP + " a " + lA + ":" + oA;}
}
package voli;
import java.util.Set; import java.util.TreeSet;
public class VoloGiornaliero {
Set prenotazioni; Volo v; int giorno;
VoloGiornaliero(Volo v, int giorno){
this.v = v; this.giorno = giorno; prenotazioni = new TreeSet();}
public String toString(){
return giorno + " " + v.id + " da " + v.lP + ":" + v.oP + " a " +
v.lA + ":" + v.oA + prenotazioni;}
}
19
package voli;
import java.util.HashMap; import java.util.Map;
public class Voli {
Map mAerei = new HashMap();
Map mVoli = new HashMap();
public Aereo addAereo(String id, String descr, int nPosti) throws VoliEx{
System.out.println(id + " " + descr + " " + nPosti);
if (id == null || nPosti <= 0) throw new VoliEx("dati errati - " + id + "
" + nPosti);
Aereo a1 = new Aereo(id, descr, nPosti);
Object prev = mAerei.put(id, a1);
if (prev != null) throw new VoliEx("duplicazione:" + id);
return a1;
}
public void addVolo(String id, String aereo, String lP, int oP, String lA, int
oA) throws VoliEx {
if (id == null || lP == null || lA == null || oP >= oA || oP < 1 || oP >
23 || oA < 2 || oA > 24) throw new VoliEx("dati errati - " + id);
Aereo a1 = (Aereo) mAerei.get(aereo);
if (a1 == null) throw new VoliEx("aereo non definito:" + aereo);
Volo v1 = new Volo(id, a1, lP, oP, lA, oA);
a1.addVolo(v1);
//verifica sovrapposizione voli su aereo
Object prev = mVoli.put(id, v1);
if (prev != null) throw new VoliEx("duplicazione:" + id);
}
public void addPrenotazione(String idVolo, String passeggero, int giorno)
throws VoliEx {
if (idVolo == null || passeggero == null || giorno < 1 || giorno > 7 )
throw new VoliEx("dati errati - " + idVolo);
Volo v1 = (Volo) mVoli.get(idVolo);
if (v1 == null) throw new VoliEx("volo non definito:" + idVolo);
v1.addPrenotazione(passeggero, giorno);
}
public VoloGiornaliero getVoloGiornaliero(String idVolo, int giorno) throws
VoliEx {
if (idVolo == null || giorno < 1 || giorno > 7 ) throw new VoliEx("dati
errati - " + idVolo);
Volo v1 = (Volo) mVoli.get(idVolo);
if (v1 == null) throw new VoliEx("volo non definito:" + idVolo);
return v1.voliGiornalieri[giorno];
}}
20