Programmazione in Java Settima lezione Cristian Del Fabbro Lezione di oggi ● ● ● ● Esercizio sull'utilizzo delle classi viste nella quarta lezione (Vector, StringTokenizer, file su disco, ecc.) Alcune classi per semplici poligoni Delle classi per un semplice database di persone Una biblioteca Esercizio (1) ● ● Scrivere una classe per memorizzare i dati di una persona: – nome e cognome – professione – luogo e data di nascita Aggiungere alla classe dei metodi che ritornino il nome, il cognome, la professione, il luogo di nascita e la data di nascita in formato esteso Classe Persona(1) package esercizio; import java.text.DateFormat; import java.util.Date; import java.util.GregorianCalendar; public class Persona { private String nome; private String cognome; private Date dataDiNascita; private String luogoDiNascita; private String occupazione; Classe Persona(2) public Persona(String nome, String cognome, String occupazione, String luogoDiNascita, int giorno, int mese, int anno) { this.nome = nome; this.cognome = cognome; this.luogoDiNascita = luogoDiNascita; this.occupazione = occupazione; dataDiNascita = new GregorianCalendar(anno, mese-1,giorno).getTime(); } Classe Persona(3) public String cognome() { return cognome; } public String nome() { return nome; } Classe Persona(4) public String luogoDiNascita() { return luogoDiNascita; } public String occupazione() { return occupazione; } Classe Persona(5) public String dataDiNascita() { DateFormat df = DateFormat.getDateInstance(DateFormat.LONG); return df.format(dataDiNascita); } } // <--- chiudere la classe Esercizio (2) ● Preparare un file con una serie di informazioni per riga, ad es: Mario|Rossi|impiegato|Udine|23/3/1952 Carlo|Bianchi|studente|S. Donà|2/12/1990 Franco|Franchi|comico|Frafroreano|4/4/1944 ● Scrivere un programma che legge il file e scrive un altro file come nell'esempio della prossima slide Esercizio (3) Mario Rossi di professione impiegato Nato a Udine il 23 febbraio 1952 Carlo Bianchi di professione studente Nato a S. Donà il 12 dicembre 1990 Franco Franchi di professione comico Nato a Fraforeano il 4 aprile 1944 Esercizio (4) package esercizio; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.PrintWriter; import java.io.IOException; import java.util.StringTokenizer; import java.util.Vector; public class Esercizio { Esercizio (5) public static Vector leggiFile(String fileName) throws IOException { Vector v = new Vector(); FileReader f = new FileReader(fileName); BufferedReader file = new BufferedReader(f); Esercizio (6) while (file.ready()) { String linea = file.readLine(); StringTokenizer st = new StringTokenizer(linea, "|"); if (st.countTokens() != 5) { System.out.println("La seguente riga non è corretta: " + linea); } else { Esercizio (7) String nome = st.nextToken(); String cognome = st.nextToken(); String impiego = st.nextToken(); String luogo = st.nextToken(); StringTokenizer data = new StringTokenizer(st.nextToken(), "/"); if (data.countTokens() != 3) { System.out.println("La seguente riga non è corretta: "+ linea); } else { int giorno = new Integer(data.nextToken()).intValue(); int mese = new Integer(data.nextToken()).intValue(); int anno = new Integer(data.nextToken()).intValue(); Persona p = new Persona(nome, cognome, impiego, luogo, giorno, mese, anno); v.add(p); } Esercizio (8) } } // If // While file.close(); return v; } // metodo Esercizio (9) public static void scriviFile(String fileName, Vector v) throws IOException { FileWriter w = new FileWriter(fileName); PrintWriter fileOutput = new PrintWriter(w); Esercizio (10) for (int i = 0; i < v.size(); i++) { Persona p = (Persona) v.elementAt(i); System.out.println("Scrivo il record di " + p.nome() + " " + p.cognome()); fileOutput.println(p.nome() + " " + p.cognome() + " di professione " + p.occupazione() + "\n" + "Nato a " + p.luogoDiNascita() + " il " + p.dataDiNascita() + "\n"); } fileOutput.close(); } // chiude il metodo Esercizio (11) public static void main(String[] args) { EasyIn input = new EasyIn(); System.out.print("File di input: "); String inputFileName = input.readString(); System.out.print("File di output: "); String outputFileName = input.readString(); Esercizio (12) try { Vector v = leggiFile(inputFileName); scriviFile(outputFileName, v); } catch (IOException e) { System.out.println("Si è verificato un errore: " + e.getMessage()); } } // Chiude il main } // Chiude la classe Poligono Poligono int numeroDiLati() String tipo() double area() double perimetro() Rettangolo Triangolo Quadrato Triangolo Equilatero Classe Poligono (1) package geometria; abstract public class Poligono { int numLati; String tipo = "Poligono"; public Poligono(int nl){ numLati = nl; } Classe Poligono (2) public int numeroDiLati(){ return numLati; } public String tipo(){ return tipo; } abstract public double area(); abstract double perimetro(); } Classe Rettangolo (1) package geometria; public class Rettangolo extends Poligono { double base, altezza; public Rettangolo(double b, double a) { super(4); base = b; altezza = a; tipo = "Rettangolo"; } Classe Rettagolo(2) public double area() { return base * altezza; } double perimetro() { return 2*base + 2*altezza; } } Classe Triangolo(1) package geometria; public class Triangolo extends Poligono { double a, b, c; public Triangolo(double l1, double l2, double l3) { super(3); a = l1; b = l2; c = l3; tipo = "Triangolo"; } Classe Triangolo(2) double perimetro() { return a + b + c; } } public double area() { double p = perimetro()/2; // Formula di Erone return Math.sqrt(p*(p-a)*(p-b)*(p-c)); } AREA= p p−a p−b p−c Classe Quadrato package geometria; public class Quadrato extends Rettangolo { public Quadrato(double l) { super(l,l); tipo = "Quadrato"; } } Classe TriangoloEquilatero package geometria; public class TriangoloEquilatero extends Triangolo { public TriangoloEquilatero(double lato) { super(lato, lato, lato); tipo = "Triangolo equilatero"; } } Esempio di utilizzo package geometria; public class Esempio { public static void main(String[] args) { Poligono elenco[] = new Poligono[4]; elenco[0] = new Rettangolo(3.2, 4.5); elenco[1] = new Quadrato(5); elenco[2] = new Triangolo(3,4,5); elenco[3] = new TriangoloEquilatero(3.3); } } for (int i = 0; i<elenco.length; i++) System.out.println("Il perimetro del " + elenco[i].tipo() + " è " + elenco[i].perimetro() + " e l'area è " + elenco[i].area()); Output Il perimetro del Rettangolo è 15.4 e l'area è 14.4 Il perimetro del Quadrato è 20.0 e l'area è 25.0 Il perimetro del Triangolo è 12.0 e l'area è 6.0 Il perimetro del Triangolo equilatero è 9.0 e l'area è 3.897114317029974 Un semplice database di persone Persona Dipendente Insegnante Studente Segretario Un semplice database di persone (2) Persona __________________ String nome String cognome Data dataDiNascita String luogoDiNascita Indirizzo indirizzo __________________ String descrizione() public Persona( String nome, String cognome, Data dataDiNascita, String luogoDiNascita, Indirizzo indirizzo ){ // assegnamento ad esempio: this.nome = nome; } Un semplice database di persone (3) Data ________________ Date data ________________ dataFormattata() public Data(int giorno, int mese, int anno) { data = new GregorianCalendar( anno, mese-1, giorno).getTime(); } Un semplice database di persone (4) Indirizzo __________________ String viaPiazza String numeroCivico String localita __________________ String descrizione() Un semplice database di persone (5) Persona __________________ String nome String cognome Data dataDiNascita String luogoDiNascita Indirizzo indirizzo __________________ String descrizione() Studente __________________ String classe; Indirizzo scuola; __________________ String descrizione() public Studente([...], String classe, Indirizzo scuola) { super(nome, cognome, dataDiNascita, luogoDiNascita, classe, scuola); this.scuola = scuola; this.classe = classe; } Un semplice database di persone (6) Persona __________________ String nome String cognome Data dataDiNascita String luogoDiNascita Indirizzo indirizzo __________________ String descrizione() Dipendente __________________ Indirizzo azienda; int stipendio; __________________ String descrizione() Un semplice database di persone (7) Persona __________________ String nome String cognome Data dataDiNascita String luogoDiNascita Indirizzo indirizzo __________________ String descrizione() Dipendente __________________ Indirizzo azienda; int stipendio; __________________ String descrizione() Segretario __________________ String ufficio __________________ String descrizione() Un semplice database di persone (8) Persona __________________ String nome String cognome Data dataDiNascita String luogoDiNascita Indirizzo indirizzo __________________ String descrizione() Dipendente __________________ Indirizzo azienda; int stipendio; __________________ String descrizione() Insegnante __________________ Vector classi __________________ String descrizione() Un semplice database di persone (9) ● ● Scrivere un programma che usi le classi scritte Estendere la classe Indirizzo in modo da distinguere, ad esempio, Aziende o Scuole (utilizzando l'ereditarietà) e modificando la classe Studente in modo che richieda che il campo scuola sia di tipo Scuola invece che Indirizzo Una biblioteca ● ● Per quanto riguarda gli oggetti contenuti: – una classe base per gestire gli “oggetti” – una specializzazione per i libri – una specializzazione per i cd – una specializzazione per i dvd/vhs – le riveste (non possono essere prestate) Gli utenti – Quale bibliotecario ha fatto un prestito e a chi (suggerimento: estendere e usare classi già pronte ...)