Metodologie di Programmazione a.a. 2010-2011

19 aprile 2011

Soluzione esercizio [Elettrodomestici]
  1. Definizione della classe base e delle sottoclassi.
    /*****************************  FILE: ElettroDom.java  *****************************/
    public class ElettroDom {
        public static class Dimensione {
            public final int altezza;
            public final int larghezza;
            public final int profondita;
    
            public Dimensione(int a, int l, int p) {
                altezza = a;
                larghezza = l;
                profondita = p;
            }
    
            public void stampa() {
                System.out.println("Altezza: " + altezza + " Larghezza: " + larghezza + " Profondità:" + profondita);
            }
        }
    
        public final String marca;
        public final String modello;
        private float prezzo;
        private Dimensione dimensione;
    
        public ElettroDom(String m, String mod) {
            marca = m;
            modello = mod;
        }
    
        public void setPrezzo(float p) { prezzo = p; }
        public void setDimensione(Dimensione d) { dimensione = d; }
    
        public float getPrezzo() { return prezzo; }
        public Dimensione getDimensione() { return dimensione; }
    
        public void stampa() {
            System.out.println("Marca: "+marca);
            System.out.println("Modello: "+modello);
            System.out.println("Prezzo: "+prezzo);
            if (dimensione != null) dimensione.stampa();
        }
    }
    
    /*****************************  FILE: Frigo.java  *****************************/
    public class Frigo extends ElettroDom {
        private int capacita;
    
        public Frigo(String m, String mod) { super(m, mod); }
    
        public void setCapacita(int c) { capacita = c; }
        public int getCapacita() { return capacita; }
            //Ridefinsce il metodo della superclasse
        public void stampa() {
            super.stampa();
            System.out.println("Capacità: "+capacita);
        }
    }
    
    
    /*****************************  FILE: Lavatrice.java  *****************************/
    import java.util.Arrays;
    
    public class Lavatrice extends ElettroDom {
        private String[] programmi;
    
        public Lavatrice(String m, String mod) {
            super(m, mod);
            programmi = new String[0];
        }
    
        public boolean addProg(String prog) {
            if (prog == null) return false;
            int n = programmi.length;
            for (int i = 0 ; i < n ; i++)
                if (programmi[i].equals(prog)) return false;
            programmi = Arrays.copyOf(programmi, n + 1);
            programmi[n] = prog;
            return true;
        }
    
        public String[] getProg() {
            return Arrays.copyOf(programmi, programmi.length);
        }
            //Ridefinsce il metodo della superclasse
        public void stampa() {
            super.stampa();
            System.out.println("Programmi: ");
            for (int i = 0 ; i < programmi.length ; i++)
                System.out.println("  "+programmi[i]);
        }
    }
    
  2. Il metodo statico cercaLavatrice() della classe ElettroDom.
       public static Lavatrice[] cercaLavatrice(ElettroDom[] arr, String prog) {
            Lavatrice[] lavArray = new Lavatrice[0];
            for (int i = 0 ; i < arr.length ; i++) {
                if (arr[i] instanceof Lavatrice) {
                    Lavatrice lav = (Lavatrice)arr[i];
                    String[] p = lav.getProg();
                    for (int j = 0 ; j < p.length ; j++) {
                        if (p[j].equals(prog)) {
                            int n = lavArray.length;
                            lavArray = Arrays.copyOf(lavArray, n + 1);
                            lavArray[n] = lav;
                            break;
                        }
                    }
                }
            }
            return lavArray;
        }
    
Soluzione esercizio [Errori]
Ci sono quattro errori.
  1. Nel costruttore della classe DoubleLine la linea line = l; provoca un errore in compilazione perché dovrebbe essere sostituita da super(l);.
  2. La ridefinizione del metodo print() nella classe DoubleLine è un metodo ricorsivo che se eseguito porta ad un loop infinito. L'invocazione ricorsiva dovrebbe essere sostituita dall'invocazione del metodo della superclasse super.print().
  3. La linea linee[0] = new Line("prima"); provoca un errore in esecuzione (ArrayStoreException) perché l'array il cui riferimento è nella variabile linee è un array di DoubleLine e quest'ultimo tipo non è un supertipo di Line.
  4. La linea linee[2].print(); provoca un errore in esecuzione (NullPointerException) perché line[2] ha valore null e si tenta quindi di invocare il metodo print() su un riferimento inesistente.

Soluzione esercizio [Prefix_free]
  1. La classe PrefixFree con il metodo add.
    public class PrefixFree {
        private String[] set;
    
        public PrefixFree() {
            set = new String[0];
        }
            //Metodo ausiliario che ritorna true se s1 è un prefisso di s2
        private static boolean isPrefix(String s1, String s2) {
            if (s1.length() > s2.length()) return false;
            for (int i = 0 ; i < s1.length() ; i++)
                if (s1.charAt(i) != s2.charAt(i)) return false;
            return true;
        }
    
        public boolean add(String s) {
            int n = set.length;               //Controlla se la stringa s è in relazione
            for (int i = 0 ; i < n ; i++)     //di prefisso con qualche stringa dell'insieme.
                if (isPrefix(set[i], s) || isPrefix(s, set[i]))
                    return false;
            set = Arrays.copyOf(set, n + 1);    //Estende l'array per contenere anche s
            set[n] = s;
            return true;
        }
    }
    
  2. Definizione del metodo extensions() della classe PrefixFree:
        public String[] extensions(String p) {
            int ne = 0;                             //Conta il numero di stringhe nell'insieme
            for (int i = 0 ; i < set.length ; i++)  //tali che p è un loro prefisso.
                if (isPrefix(p, set[i])) ne++;
            String[] ext = new String[ne];          //Crea un array per contenere tali stringhe
            int j = 0;
            for (int i = 0 ; i < set.length ; i++)  //Aggiungi le stringhe nell'array
                if (isPrefix(p, set[i]))
                    ext[j++] = set[i];
            return ext;
        }
    
  3. Il programma è scritto come main della classe PrefixFree.
    import java.io.*;
    import java.util.*;
    
        public static void main(String[] args) throws FileNotFoundException {
            String inpath = args[0];
            String outpath = args[1];
            String p = args[2];
            File infile = new File(inpath);
            Scanner in = new Scanner(infile);        //Apri il file di input in lettura
            PrefixFree set = new PrefixFree();       //Crea un insieme prefix free vuoto
            while (in.hasNextLine())                 //Aggiungi le linee del file all'insieme
                if (!set.add(in.nextLine())) {                  //Se non sono un insieme prefix free
                    System.out.println("Non è prefix free");   //termina il programma.
                    return;
                }
            File outfile = new File(outpath);
            PrintStream out = new PrintStream(outfile);   //Apri il file di output in scrittura
            String[] ext = set.extensions(p);             //Ottieni le estensioni della stringa p
            for (int i = 0 ; i < ext.length ; i++)        //Scrivi le estensioni nel file
                out.println(ext[i]);
        }