/**
Compito del 24-Dic-2001
La classe usa un dizionario per memorizzare gli esami con i relativi voti,
dove la chiave e' il nome dell'esame e l'attributo il voto.
Il dizionario e' realizzato con un array di lunghezza fissa.
La classe realizza l'interfaccia Comparable, perche' le istanze dovranno
essere ordinabili secondo la media dei voti ottenuti negli esami.
La classe riscrive i seguenti metodi della classe Object
- boolean equals(Object)
- String toString()
Due studenti sono considerati uguali se hanno lo stesso nome.
@author F. Bombi
@version 24-12-2001
*/
public class Studente implements Comparable
{
// costanti
private static final int MAX_NUMERO_ESAMI = 30;
// variabili di esemplare
private String nome;
private Coppia[] esame;
private int esameSize;
//Istanzia un oggetto di classe studente senza alcun esame
public Studente(String unNome)
{
nome = unNome;
esameSize = 0;
esame = new Coppia[MAX_NUMERO_ESAMI];
}
/**
Aggiunge alla lista degli esami eseguiti il nuovo esame
e il corrispondente voto. Assicura che un esame non
compaia piu' di una volta nel dizionario.
@param nomeEsame il nome dell'esame
@param voto il voto dell'esame
*/
public void aggiungiEsame(String nomeEsame, int voto)
{
Coppia nuovoEsame = new Coppia(nomeEsame, voto);
// Ricerca nel dizionario
for (int i = 0; i < esameSize; i++)
{
if (esame[i].equals(nuovoEsame))
{
// se presente sostituisci con nuovo esame
esame[i] = nuovoEsame;
return;
}
}
// se non presente aggiungi al dizionario il nuovoEsame
esame[esameSize++] = nuovoEsame;
}
/**
Restituisce il voto corrispondente all'esame eseguito.
Se l'esame non e' stato sostenuto, restituisce 0.
@param nomeEsame nome dell'esame
@return il voto dell'esame
*/
private int voto(String nomeEsame)
{
// Coppia per ricerca con attributo qualsiasi (ad esempio zero)
// l'attributo non viene considerato nella ricerca!
Coppia questoEsame = new Coppia(nomeEsame, 0);
for (int i = 0; i < esameSize; i++)
if (esame[i].equals(questoEsame))
return esame[i].getAttributo();
return 0;
}
/**
Restituisce la media degli esami sostenuti.
Se nessun esame e' stato sostenuto, restituisce zero.
@return la media dei voti d'esame
*/
public double media()
{
if (esameSize == 0)
return 0;
int somma = 0;
for (int i = 0; i < esameSize; i++)
somma += esame[i].getAttributo();
// attenzione al forzamento a double per non perdere di precisione
return somma / (double) esameSize;
}
/**
Restituisce vero se due studenti hanno lo stesso nome.
Override del metodo omologo della classe Object
@param obj studente (di classe Object)
@return true se hanno lo stesso nome, altrimenti false
*/
public boolean equals(Object obj)
{
Studente s = (Studente) obj;
return nome.equals(s.nome);
}
/**
comparazione in base alla media dei voti.
@param obj studente da comparare
*/
public int compareTo(Object obj)
{
// forzamento a Studente
Studente s = (Studente) obj;
if (media() > s.media())
return 1;
else if (media() < s.media())
return -1;
else
return 0;
}
/**
Restituisce una stringa descrittiva di uno studente nel formato:
(visibile in Studente.html):
nome: NOME_STUDENTE
Elenco degli Esami:
ESAME1: VOTO1
ESAME2: VOTO2
...
media = MEDIA
Esempio:
nome: Verdi
Elenco degli Esami:
Fondamenti di Informatica 1: 30
Matematica A: 30
Fisica 1: 27
media = 29
*/
public String toString()
{
final String INDENT = " ";
// nome
String tmpString = "nome: " + nome + "\n";
// elenco esami
tmpString += "Elenco degli Esami:\n";
for (int i = 0; i < esameSize; i++)
tmpString += INDENT + esame[i] + "\n"; // viene invocato esame[i].toString()
tmpString += INDENT + "media = " + media();
return tmpString;
}
// classe privata
private class Coppia
{
private String chiave;
private int attributo;
public Coppia(String ch, int att)
{
chiave = ch;
attributo = att;
}
// metodi accessori
public String getChiave() { return chiave; }
public int getAttributo() { return attributo; }
// due coppie sono uguali se hanno la stessa chiave, indipendentemente dall'attributo
public boolean equals(Object obj)
{
Coppia altraCoppia = (Coppia) obj;
return chiave.equals(altraCoppia.chiave);
}
// stringa che descrive un esame: "NOME_ESAME: VOTO"
public String toString()
{
return chiave + ": " + attributo;
}
}
}