Paolo Boldi
Problemi per la lezione del 17/12
- [Interfaccia Comparable (I)] Vogliamo rendere la classe Persona comparabile, confrontando
due persone sulla base della loro età (cioè, definendo una persona ≤ di un'altra se e solo se la sua età lo è). Fate in modo che la
classe implementi l'interfaccia Comparable e sperimentatela, realizzando un metodo main in cui vengono letti i dati
di un certo numero di persone, vengono inseriti in un array e l'array viene ordinato usando il metodo sort
di java.util.Arrays..
- [Interfaccia Comparable (II)] Riprendete la classe Punto realizzata qualche giorno
fa e rendetela comparabile, definendo un punto p minore di un punto p' se e solo se p ha modulo (distanza dall'origine) minore di p'.
Questa relazione rispetta il contratto definito dall'interfaccia? (Consultate la documentazione delle API per decidere)
In caso affermativo, realizzate un main di prova che ordini un array di punti e guardate come vengono ordinati.
- [Classe Retta] Definite una classe di nome Retta le cui istanze rappresentano rette nel piano cartesiano. Devono essere consentite rette qualsiasi
(anche parallele all'asse Y). Poiché la classe Retta usa fra l'altro dei punti, mettete nel progetto una copia
della classe Punto (che avete scritto alcune lezioni fa).
La classe deve fornire almeno i seguenti costruttori e metodi:
- Retta(): costruisce la bisettrice del I/III quadrante;
- Retta(double m, double q): costruisce la retta y=mx+q;
- Retta(double x): costruisce la retta parallela all'asse y e passante per (x,0);
- Retta(Retta r, Punto p): costruisce la retta parallela a r e passante per p;
- Retta(Punto p, Retta r): costruisce la retta perpendicolare a r e passante per p;
- double y(double x): restituisce il valore y tale che (x,y) sta sulla retta (e solleva un'eccezione
se la retta è verticale);
- boolean isParallela(Retta r): restituisce true sse la retta è parallela a r;
- boolean isPerpendicolare(Retta r): restituisce true sse la retta è perpendicolare a r;
- boolean equals(Object x): restituisce true sse la retta è uguale a x;
- boolean passaPer(Punto p): restituisce true sse la retta passa per p;
- boolean passaPer(Punto[] p): restituisce true sse la retta passa per tutti i punti dell'array p.
- [Classe Studente] Definite una classe Studente che estenda la classe Persona; la classe deve avere come attributi il corso di laurea, un ArrayList<String> con la lista degli esami fatti, e l'anno di immatricolazione. La classe deve avere i seguenti costruttori e metodi:
- Studente(String nome, String cognome,
String luogoNascita, int annoNascita, String corsoDiLaurea, int annoImmatricolazione): costruisce uno Studente con anno immatricolazione dato, corso di laurea dato, e lista degli esami fatti vuota.
- Studente(String nome, String cognome,
String luogoNascita, int annoNascita, String corsoDiLaurea): costruisce uno Studente con anno immatricolazione uguale all'anno corrente, corso di laurea dato, e lista degli esami fatti vuota.
- void addCourse(String course): aggiunge alla lista degli esami il corso specificato;
- Object[] getCourses(): ritorna un array contente tutti gli esami fatti;
- int getNumberOfCourses(): ritorna il numero totale di esami fatti;
- boolean isCompletedCourse(String course): restituisce true sse il corso specificato compare nella lista degli esami fatti.
- double isInCorso(): restituisce true sse l'anno di immatricolazione è al più 3 anni fa;
- double getAverageCoursesPerYear(): ritorna il numero medio di esami fatti per anni trascorsi dall'anno di immatricolazione (arrotondati per eccesso: se l'anno di immatricolazione coincide con l'anno corrente, contiamo 1 anno).
Modificate quindi la classe di prova di Persona, in modo che legga degli Studenti, e permetta di includere quindi una lista di esami svolti.
- [Classe ProiettileEsplosivo] Definite una classe ProiettileEsplosivo che estenda la classe Proiettile; questo ha la particolarità di generare un'esplosione al contatto con il terreno, di raggio dato. Deve avere almeno i seguenti costruttori e metodi:
- Missile(double theta, double v, double radius): definisce un proiettile con angolo e velocità dati, e con il raggio di esplosione dato.
- boolean isHitting(Punto p): resituisce true sse il proiettile colpisce quel punto. Si noti che questo è vero se la traiettoria colpisce p, oppure se p si trova ad una certa distanza dal punto di atterraggio.
Potete anche dotare questa classe di un metodo statico che restituisca un ProiettileEsplosivo che atterri in un punto dato.