Programmazione in Java

annuncio pubblicitario
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 ...)
Scarica