Metodologie di Programmazione a.a. 2009-2010 (canali A-D ed  E-O)

Prova intermedia - 27 aprile 2010
Avvertenze:


[Azienda]   Definire una gerarchia di classi per gestire le informazioni relative ai dipendenti di una azienda che opera su commessa. I dipendenti sono distinti in tre categorie: operai, commerciali e responsabili (di commessa).
  1. (max ? punti)  Prima di tutto, definire una classe Commessa per mantenere i dati di una commessa (cioè, un lavoro o prodotto commissionato all'azienda): il codice (una stringa) e un importo in euro (un float) che è un incentivo per i responsabili della lavorazione della commessa. Gli oggetti di questa classe devono essere immutabili.
      •   Definire la classe base Dipendente per gestire i dati comuni a tutti i dipendenti: il nome e cognome (una sola stringa), un importo in euro (un float) che rappresenta lo stipendio di base e un'altro importo in euro (un float) che è una addizionale contrattuale. Definire metodi per leggere e scrivere questi dati. Definire inoltre un metodo che ritorna lo stipendio e che sarà eventualmente ridefinito dalle sottoclassi. Lo stipendio è inizialmente determinato dalla somma dello stipendio base e l'addizionale contrattuale. Il costruttore della classe Dipendente deve inizializzare il nome e cognome e lo stipendio base (l'addizionale è inizializzata a zero).
      •   Definire una sottoclasse Operaio che mantiene la commessa (di tipo Commessa) a cui è assegnato l'operaio e definisce metodi per leggere e impostare tale informazione.
      •   Definire una sottoclasse Commerciale che mantiene l'importo totale delle commesse acquisite in euro (un float) e definisce un metodo per aggiungere un importo a questo totale e un'altro metodo per azzerarlo. Lo stipendio è determinato dalla somma dello stipendio della superclasse e il 3% del totale acquisito.
      •   Infine, definire una sottoclasse Responsabile che mantiene l'elenco delle commesse di cui è responsabile ed ha un metodo per aggiungere una commessa (se non è già presente), un metodo per rimuovere una commessa dall'elenco e un metodo boolean isResp(Commessa c) che ritorna true se è responsabile della commessa c (due commesse sono uguali se hanno lo stesso codice). Lo stipendio è determinato dalla somma dello stipendio della superclasse e gli incentivi relativi a tutte le commesse di cui è responsabile.

  2. (max ? punti)  Aggiungere alla classe Dipendente un metodo statico disimpegna che preso in input un array di Dipendente e una commessa c disimpegna dalla commessa c tutti i dipendenti (operai e responsabili) dell'array e ritorna un nuovo array che contiene tutti i dipendenti che erano impegnati nella commessa c.

[Errori] (max ? punti)   Il seguente codice Java contiene uno o più errori. Trovare gli errori e spiegarli. In particolare, dire per ogni errore se si verifica in compilazione o durante l'esecuzione.
class Line {
public final String line;

public Line(String l) { line = l; }

public void print() { System.out.println(line); }
}

class DoubleLine extends Line {
public final String line2;

public DoubleLine(String l, String l2) {
line = l;
line2 = l2;
}

public void print() {
print();
System.out.println(line2);
}
}

public class Test {
public static void main(String[] args) {
Line[] linee = new DoubleLine[5];
linee[0] = new Line("prima");
linee[3] = new DoubleLine("A", "B");
linee[3].print();
linee[2].print();
}
}

[Prefix_free]   Un insieme di stringhe si dice prefix free se nessuna stringa dell'insieme è un prefisso di un'altra stringa dell'insieme. Ad esempio, l'insieme {"terre", "terrazzo"} è prefix free mentre l'insieme {"terre", "terrazzo", "terreno"} non è prefix free, perché "terre" è un prefisso di "terreno". Due stringhe uguali sono l'una il prefisso dell'altra.
  1. (max ? punti)  Definire una classe PrefixFree per gestire insiemi di stringhe prefix free. Il costruttore inizializza l'insieme come vuoto. La classe deve avere un metodo add che permette di aggiungere una stringa all'insieme se la stringa non viola la proprietà di prefix freeness e ritorna true, altrimenti non modifica l'insieme e ritorna false.

  2. (max ? punti)  Aggiungere alla classe PrefixFree un metodo extensions che presa una stringa p ritorna in un nuovo array tutte le stringhe s dell'insieme tali che p è un prefisso di s.

  3. (max ? punti)  Sfruttando la classe PrefixFree scrivere una programma che legge dalla linea di comando due pathnames di file di testo infile, outfile e una stringa p e se le linee del file infile sono un insieme prefix free allora scrive nel file outfile le stringhe ritornate dal metodo extensions applicato alla stringa p, altrimenti stampa "Non è prefix free" e termina. Ecco un esempio:
    Contenuto infile    Stringa p          Contenuto outfile
    programma           oggetti            oggetti e metodi
    oggetti e metodi                       oggettivo
    classi e oggetti
    oggettivo