Il linguaggio Java
Formalismo ad alto livello...
Permette di descrivere programmi basandosi su
concetti primitivi “sofisticati” (file, finestre, tabelle, liste,
ecc.)
...basato su una notazione testuale familiare
Codice sorgente
Simile, nella sintassi e nelle istruzioni al linguaggio C
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Codice Sorgente
I programmi Java sono suddivisi in
“classi”
Le classi sono descritte all’interno di file di
testo con estensione “.java”
Ogni file contiene una sola classe
Il nome file deve coincidere con il nome
della classe
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Un esempio
Hello.java
public class Hello {
// Il programma più semplice
public static void main(String[] args) {
// Stampa un messaggio sul video
System.out.println(“Hello Java”);
}
}
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Compilazione
Scrittura
Compilazione
J
1001
0110
110..
.java
.class
Codice
sorgente
ByteCode
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esecuzione
Esecuzione
1001
0110
110..
.class
ByteCode
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Gli strumenti di Java
La macchina virtuale
Il compilatore
Gli ambienti di sviluppo
La documentazione
Il debugger
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Macchina virtuale (1)
Applicazione
tradizionale
Applicazione
Java
Macchina
Virtuale
Sistema Operativo
Hardware
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Macchina virtuale (2)
Astrazione di un elaboratore “generico”
Ambiente di esecuzione delle applicazioni Java
Esempio:
java Hello
Responsabilità:
Caricamento classi dal disco
Verifica consistenza codice
Esecuzione applicazione
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Il compilatore
J
1001
0110
110..
Traduzione dei sorgenti testuali in
bytecode
Linguaggio della macchina virtuale Java
Esempio:
javac Hello.java
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Ambienti di sviluppo
Il codice sorgente Java è
composto da testo
Un editor qualsiasi è sufficiente
Si possono usare ambienti integrati per lo
sviluppo (IDE)
Offrono strumenti per la redazione, la
compilazione, l’esecuzione e la ricerca degli
errori
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esempi
Eclipse
http://www.eclipse.org
JCreator
http://www.jcreator.com
BlueJ
http://www.bluej.org
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Documentazione (1)
Strumento necessario
alla sopravvivenza del programmatore
Java!!
Raccolta di informazioni relative alle
classi appartenenti alle librerie standard
di Java
http://java.sun.com/docs/
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Documentazione (2)
Per ogni classe:
Descrizione funzionale
Elenco di attributi:
funzionalità, caratteristiche
Elenco dei metodi:
funzionalità, parametri in ingresso, valori di ritorno, …
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Il debugger
Strumento ausiliario
al programmatore
Monitorare l’esecuzione
di una applicazione
Analisi dei valori assunti dalle variabili, i metodi della
classe, …
Comando jdb.exe
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Dove si usa Java?
Apparati
di rete
Cellulari e
PC palmari
PC client
Server
Elettrodomestici
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Java nei sistemi Embedded
Segmento di mercato in forte crescita:
Milioni di PC connessi ad Internet
Centinaia di milioni di telefoni cellulari
Miliardi di elettrodomestici
Vengono usate librerie specifiche
JavaCard, Java Micro Edition, …
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Programmi Java
Java è un linguaggio ad oggetti
L’unità minima di programmazione è la classe
Un programma Java utilizza una o più classi
Per ora, consideriamo programmi formati da
una sola classe
Un solo file sorgente
Il nome del file coincide con il nome della classe
L’estensione del file è “.java”
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Formato generale
Prova.java
public class Prova {
/*
qui vengono riportati attributi e
metodi della classe
…
*/
}
Stesso nome!
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
main(…): la porta
sul mondo Java
public static void
main(String[] args){
/* istruzioni ... */
}
Punto di ingresso di ogni applicazione
Invocato automaticamente dalla VM Java
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 1 – il primo programma
Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello");
}
}
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Dichiarazioni
Introducono l’utilizzo di una variabile
Formato generale
<Tipo> <Nome> ‘;’
<Tipo> <Nome> ‘=’ <ValoreIniziale> ‘;’
Esempi
char c;
int i = 10;
long l1, l2;
Opzionale
La mancata dichiarazione è un errore
sintattico
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Tipi: una forma per i dati
Variabili e parametri sono
caratterizzati da un tipo
che ne precisa/limita l’uso
Possono contenere solo
valori conformi al proprio tipo
Esistono tipi
Semplici (primitivi)
Composti (classi) – le vedremo più avanti
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Usare le variabili (1)
Si può dichiarare una variabile ovunque nel
codice di un metodo
Bisogna farlo, però, prima di usarla
Visibilità limitata al blocco di istruzioni in cui è
dichiarata
Le variabili devono essere inizializzate!
int a;
Errore!
La variabile “a” non è stata
int b = a;
inizializzata, e il suo valore
è casuale
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Usare le variabili (2)
Ad una variabile può essere assegnato:
Un valore costante
Il risultato di una formula
Esempi
int i = 1, j = 5;
i = (5*j) % 10;
long l = 10L;
char c1 = ‘a’, c2 = ‘\u0062’;
boolean b = false;
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Tipi primitivi
Numerici interi
byte, short, int, long
o esempio: int a; //variabile chiamata "a" di tipo intero
Numerici reali
float, double
o esempio: float b; variabile "b" di tipo reale
Non numerici
boolean, char
o esempio: char c; variabile "c" di
tipo singolo carattere
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Tipi numerici interi (1)
Valori ammissibili
byte {-128 ... 127}
short {-32768 ... 32767}
int {-2147483648 ... 2147483647}
long {-9.22 E18 ... 9.22E18}
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Tipi numerici interi (2)
Operazioni consentite
aritmetiche
+, -, *, /, %, ++, --, >>
logiche (bit a bit)
^, &, |, ~, <<, >>>
confronto
==, !=, >, >=, <, <=
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Tipi numerici reali
Valori
float {±3.403E38}
6 cifre significative
double {±1.798E308}
15 cifre significative
Operazioni
aritmetiche (+, -, *, /)
confronto (==, !=,
>, >=, <, <=)
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 2 – tipi numerici
scrivere un programma che:
date due variabili intere "a" e "b" calcoli e visualizzi la
loro somma, prodotto, differenza, rapporto
date due variabili di tipo float "c" e "d" calcoli e
visualizzi la loro somma, prodotto, differenza, rapporto
data la variabile di tipo byte "e", che modifica occorre
fare al programma per permettere di memorizzare
nella variabile "e" il valore 1000?
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
if-then-else
permette di verificare se una condizione è vera
esempio:
if (A>0) //la parola "then" è sottintesa!
System.out.println("A è maggiore di 0");
else //l'else invece non è sottinteso
System.out.println("A non è maggiore di 0");
se più di un'istruzione va eseguita nel then o
nell'else si usano le parentesi graffe:
if(A>0) {
System.out.println("A è maggiore di zero");
B=Math.sqrt(A);//B contiene la radice quadrata di A
}
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 3 – tipi numerici
date due variabili di tipo intero X e Y
se X>Y visualizzare "X è maggiore di Y"
se Y>X visualizzare "Y è maggiore di X"
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 4 – tipi numerici
date tre variabili intere "a", "b" e "c":
se a<0 stampare il risultato di b+c
se a=0 stampare il risultato di b*c
se a>0 stampare il risultato di b/c
nelle condizioni (ad esempio in quella dell'if)
l'uguaglianza si scrive con il simbolo "=="
esempio:
if(a==0) serve a controllare se il valore di a è uguale a
zero
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 5
scrivere un programma Java che, dato un
numero intero X, visualizza sulla console la
parola "pari" se il numero è pari o "dispari" se
non lo è
utilizzare l'operatore % che corrisponde
all'operazione "resto della divisione per"
ad esempio:
10%2=0
5%2=1
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
while
permette di ripetere una sequenza di operazioni
fintanto che una condizione è vera
esempio:
int a=0; // a vale 0
while(a<10) // fintanto che a è minore di 10
{
System.out.println(a+","); // visualizza a
a=a+1; // incrementa a di 1
}
come nel caso dell'if-then-else se la sequenza di
istruzioni da ripetere è più lunga di 1 vanno usate
e parentesi graffe per delimitarle
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 5b
scrivere un programma Java che data una
variabile intera "a" di valore positivo calcoli e
visualizzi la somma di tutti gli interi positivi minori
o uguali ad "a"
esempio:
a vale 9
il programma dovrà visualizzare 20
perché: 2+4+6+8=20 e 2<=9, 4<=9, 6<=9, 8<=9
modificare l'esercizio in modo da sommare solo
gli interi positivi pari minori o uguali ad "a"
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 5c
scrivere un programma Java che data una
variabile intera "a" di valore positivo maggiore di
2 calcoli "a!" (cioè "a fattoriale)
a!=a*(a-1)*(a-2)*......*2*1
esempio:
a=4
il programma deve visualizzare 24
perché: a!=4!=4*3*2*1=24
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Tipi non numerici: boolean
Valori
{false, true}
Operazioni
logiche (&&, ||, !)
confronto (==, !=)
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 6 – tipo boolean
date le variabili "a" e "b" intere e le variabili
boolean:
somma
moltiplicazione
sottrazione
divisione
calcolare e visualizzare il risultato delle 4
operazioni base se e solo se le corrispondenti
variabili booleane hanno valore "true"
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Tipi non numerici: char
Rappresentazione
dei caratteri secondo
lo standard Unicode
Lettere di vari alfabeti
arabo, armeno, bengalese, cirillico,
greco, latino, ...
Simboli
diacritici, punteggiatura,
matematici, tecnici, ...
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Tipi non numerici: char
Rappresentazione su due byte
Le costanti sono indicate tra apici semplici (‘a’)
I valori non stampabili sono rappresentati nel formato
unicode (‘\u27AF’)
Operazioni
confronto
(==, !=, >,>=, <, <=)
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 7 – tipo char
un certo contratto di lavoro può essere di tipo 'a'
o 'b'
se è di tipo 'a' lo stipendio mensile è di 1500€
se è di tipo 'b' lo stipendio mensile è di 2000€
assegnare ad una variabile char il tipo di
contratto
a seconda del tipo di contratto assegnare ad una
variabile intera l'ammontare mensile dello
stipendio
visualizzare il reddito annuale complessivo
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Commenti
Servono a documentare un programma
(o una sua parte)
Racchiusi da “/*” e “*/”
“//” inizia un commento che termina a fine riga
Usati sempre troppo poco!
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esempio
max.java
public class max {
public static void main(String[] args) {
int x,y; /* x e y sono di tipo "int"*/
x=1;
y=10;
if(x>y) //questo è un if-then-else!
System.out.println("X");
else
System.out.println("Y");
}
}
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Input da tastiera
per leggere dei dati da tastiera in Java si usa
l'oggetto Scanner
all'inizio del programma (prima della
dichiarazione della classe) bisogna scrivere:
import java.util.*;
esempio, lettura di una variabile intera:
Scanner sc = new Scanner(System.in);
System.out.println("Inserire il valore di N: ");
int n = sc.nextInt();
sc.close(); //l'oggetto di classe Scanner va
chiuso quando non serve più
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Input da tastiera
leggere un intero:
int I = sc.nextInt();
leggere un double:
double D = sc.nextDouble();
leggere un boolean:
boolean B = sc.nextBoolean();
leggere un char: [è un caso particolare!]
char C = sc.next().charAt(0);
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 7b
scrivere un programma java che legge da
tastiera i valori di 4 varibaili:
"i" di tipo intero, "d" di tipo double, "b" di tipo boolean e
"c" di tipo char
il programma, dopo averli letti, deve visualizzare
sullo schermo i valori delle 4 variabili
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Il tipo String
non è un tipo primitivo ma una classe!
si usa per trattare più di un carattere alla volta
una stringa di testo (cioè una variabile di tipo
String) è una sequenza di caratteri (cioè una
sequenza di char)
esempio:
String s; //dichiarazione di una stringa
s="Hello world!"; //assegnazione del valore
System.out.println("valore di s: "+s);
//visualizza s
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Inserimento di stringhe
per inserire il valore di una stringa da tastiera:
Scanner scanner = new Scanner(System.in);
String s; //dichiarazione di una stringa
s=scanner.next(); // <---inserimento da tastiera!
System.out.println("valore di s: "+s);
//visualizza s
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 7c
scrivere un programma Java che:
chiede di inserire il Nome
chiede di inserire il Cognome
visualizza la frase "Ciao <Nome> <Cognome>!"
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Confronto tra stringhe
l'uguaglianza (o differenza) tra stringhe non si
controlla con == e !=
l'uguaglianza si controlla con:
nome_stringa.equals("valore");
controlla se la stringa nome_stringa vale "valore"
la differenza si controlla con:
!nome_stringa.equals("valore");
controlla se la stringa nome_stringa non vale "valore"
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 7d
come nell'esercizio 7c richiedere l'inserimento di
nome e cognome
dopo aver inserito nome e cognome visualizzare:
"ti chiami <nome> <cognome>, è corretto?"
se l'utente inserisce "sì" terminare il programma
se l'utente inserisce qualsiasi cosa diversa da
"sì" ricominciare l'inserimento di nome e
cognome da capo
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Array
un array, o vettore, è una sequenza indicizzata di
elementi tutti dello stesso tipo
esempi:
un array di 10 interi:
o 2,4,6,8,10,12,14,16,18,20
un array di 5 char:
o 'f','m','s','g','p'
un array di 3 stringhe:
o "casa","auto","albero"
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Array in Java
un array va prima dichiarato:
<tipo>[] <nome>;
esempio:
int[] interi; //un array di interi
String[] parole; //un array di stringhe di testo
poi va inizializzato usando l'operatore new,
specificando quanti elementi contiene:
interi=new int[10]; //l'array contiene 10 interi
parole=new String[3]; //l'array contiene 3
stringhe di testo
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Array in Java
si usano le parentesi quadre per accedere ai
singoli elementi dell'array, numerati da zero in
poi:
interi[0]=0; //il primo elemento dell'array vale zero
parole[2]="hello"; //il terzo elemento dell'array
si può sapere quanti elementi contiene un array
usando la funzione "length":
interi.length; //restituisce la lunghezza dell'array: 10
parole.length; //restituisce la lunghezza dell'array: 3
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 7e
dichiarare e inizializzare un array di 10 interi
utilizzando un ciclo while, chiedere in input da
tastiera uno alla volta i valori dei 10 interi
dopo che tutti e 10 i valori sono stati inseriti
visualizzarli tutti di seguito, separati dalla virgola
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Inizializzazione diretta
abbiamo visto che l'operatore new permette di
creare array di qualsiasi lunghezza:
studenti=new String[75];
esiste un altro modo per inizializzare un array
definendo direttamente i valori che contiene:
int [] array = new int[] {100,200,300};
l'istruzione sopra dichiara un array e allo stesso
tempo lo inizializza con tre valori; ciò equivale a:
int [] array =new int[3];
array[0]=100;array[1]=200;array[2]=300;
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 7f
usando l'inizializzazione diretta dichiarare e
inizializzare un array di 6 elementi interi
contenente i valori 10, 22, 15, 43, 1, 18
leggere i valori dell'array con un ciclo while e
visualizzarli
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 7g
dichiarare un array settimana di 7 elementi di
tipo String contenente i seguenti valori nell'ordine
indicato:
lunedì, martedì, mercoledì, giovedì,
venerdì, sabato, domenica
visualizzare, grazie a un ciclo while, i giorni della
settimana in ordine inverso, dalla domenica al
lunedì
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Scambio di valore
problema:
date due variabili dello stesso tipo V1 e V2
scambiare i loro valori
soluzione:
creare una terza variabile "di appoggio" Vapp, e poi
copiare V1 in Vapp (Vapp=V1;)
copiare V2 in V1 (V1=V2;)
copiare Vapp in V2 (V2=Vapp)
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 7h
scrivere un programma Java che:
1.
2.
3.
4.
5.
date due variabili dello stesso tipo
richieda l'inserimento dei loro valori da tastiera
visualizzi i loro valori
effettui lo scambio tra i loro valori
visualizzi i loro valori dopo lo scambio
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Algoritmi di ordinamento
semplice problema:
dato un array di N elementi (siano numeri interi o con
la virgola, o stringhe) in ordine qualsiasi
ordinare gli elementi in ordine crescente (o
decrescente)
esistono numerose soluzioni:
selection (o simple) sort
bubble sort
quick sort
...
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Selection (Simple) sort
il più semplice algoritmo di ordinamento
idea:
cercare l'elemento più piccolo in tutto l'array
scambiarlo con l'elemento in prima posizione
partendo ora dal secondo elemento dell'array cercare
di nuovo l'elemento più piccolo (ignorando quindi
quello in prima posizione)
scambiarlo con l'elemento in seconda posizione
proseguire così fino all'esaurimento di tutto l'array
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 7i
scrivere un programma Java per:
definire ed inizializzare un array A contenente
elementi di un qualsiasi tipo (usare la tecnica degli
esercizi 7f e 7g)
visualizzare il contenuto di A
ordinare A usando l'algoritmo del Selection Sort
visualizzare il contenuto di A
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Metodi in Java
un metodo è una funzione che permette di
riutilizzare lo stesso codice in più punti di un
programma senza doverlo riscrivere ogni volta
da capo
in Java esistono due tipi di metodi:
metodi statici
metodi di classe (li vedremo più avanti in queste slide)
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Metodi statici
il main è un metodo statico
un metodo statico consiste in una sequenza di
istruzioni che svolgono un determinato compito:
ha un nome
può avere dei parametri
può restituire un valore
può contenere uno o più un commenti
è "simile" ad una funzione in C/C++
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Metodi statici
esempio di dichiarazione di un metodo statico:
// dichiarazione di un metodo:
public static tipo nome (tipo1 par1, ..., tipoN parN){
// variabili locali
...
//istruzioni del metodo
}
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Parametri
un metodo (statico o di classe) può avere dei
parametri
servono a "passare" dei dati dall'esterno del
metodo all'interno del metodo
per ogni parametro vanno specificati:
nome
tipo
all'interno del metodo il parametro viene gestito
come una variabile locale
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Parametri
esempio:
public class operazioni{
public static void add(int x, int y) {
System.out.println("x+y="+(x+y));
}
public static void sub(int x, int y) {
System.out.println("x-y="+(x-y));
}
public static void main(String[] args) {
int n1=10,n2=15;
add(n1,n2); sub(n1,n2);
}
}
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Variabili locali
i metodi (statici e di classe) possono utilizzare
variabili:
servono a memorizzare
risultati intermedi
dichiarate nel corpo del metodo
durata temporanea: quando termina l'esecuzione del
metodo, la variabile viene distrutta
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Variabili locali
esempio:
public class prodotto{
public static void prezzo(double g, int euro_g) {
double tara=5;
System.out.println("prezzo="+((g-tara)*euro_g));
}
}
la variabile locale "tara" viene definita e quindi
può essere usata dentro al metodo "prezzo"
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Variabili di ritorno
un metodo (statico o di classe) può restituire un
valore (o più valori) di ritorno
il valore di ritorno di un metodo viene usato dal
metodo chiamante
va specificato il tipo del valore restituito dal
metodo
se il metodo non torna nessun valore va
specificato il tipo void
il main è un metodo che non ritorna nulla
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
public class Test {
//questo metodo calcola il
//quadrato di una variabile
static int quadrato(int a) {
int c = a*a;
return c;
}
public static
void main(String[] args) {
int i = quadrato(12);
System.out.println(i);
}
}
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 8
scrivere un metodo statico ipocalc che date le
lunghezze dei cateti di un triangolo rettangolo
calcoli la lunghezza dell'ipotenusa e la restituisca
chiamare il metodo statico ipocalc nel metodo
main passando i valori dei cateti al metodo
ipocalc e visualizzare la lunghezza dell'ipotenuta
calcolata dal metodo
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 8b
nell'esercizio 7i (ordinamento di un vettore)
definire un metodo statico ordinaVettore con due
parametri:
un vettore di interi
un intero che indica la lunghezza del vettore
trsferire le istruzioni dell'algoritmo di ordinamento
all'interno del metodo
chiamare il metodo per ordinare il vettore
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 8c
definire due metodi con lo stesso nome: contaVocali
il primo metodo contaVocali prende in input un vettore di
char e la lunghezza del vettore
il secondo metodo contaVocali prende in input una
stringa di testo
entrambi i metodi restituiscono il numero di vocali
contenute nel vettore di char (il primo metodo) o nella
stringa di testo (il secondo metodo)
per la stringa sfruttare i due metodi seguenti:
nomeStringa.length(); che ritorna la lunghezza della stringa
nomeStringa
nomeStringa.charAt(N); che ritorna il carattere alla posizione N
all'interno della stringa nomeStringa
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Convenzioni sui nomi
le classi hanno nomi che iniziano con la lettera
maiuscola
metodi, attributi e variabili hanno l’iniziale
minuscola
se un qualsiasi nome è composto da più parole
giustapposte, l’iniziale di ogni parola successiva alla
prima è maiuscola
int contatoreNumeroOccorrenze = 0;
class CentraleTelefonica { }
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 9 – anno bisestile
un anno è bisestile se è divisibile per 4 e inoltre:
qualora sia divisibile per 100 deve essere anche
divisibile per 400
2004 è bisestile
perché è divisibile per 4 e non per 100
1900 non è bisestile
perché è divisibile per 4, è divisibile per 100 ma non
per 400
2000 è bisestile
perché è divisibile per 4, per 100 e per 400
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 9 – anno bisestile
seguendo le convenzioni sui nomi di Java
definire un metodo bisestile che
dato un anno A
restituisce true se l'anno A è bisestile
o false altrimenti
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Modellare la realtà
STATO
via1: verde
via2: rosso
STATO
motore:acceso
velocità: 0
COMPORTAMENTO
Parti!
Frena!
Sterza!
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Modellare la realtà
un oggetto del mondo reale può essere
modellato attraverso il suo:
stato
o l’insieme dei parametri caratteristici che contraddistinguono
un oggetto in un dato istante
comportamento
o descrive come si modifica lo stato a fronte degli stimoli
provenienti dal mondo esterno
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Programmazione ad oggetti
paradigma di programmazione
basato sulla nozione di oggetto:
stato
o un insieme di attributi che determinano in quale stato si trova
in un certo momento l'oggetto
o esempio: l'oggetto semaforo ha un attributo "colore" che può
valere "rosso", "arancione" o "verde"
comportamento
o un insieme di metodi che provocano la variazione degli
attributi (e quindi dello stato) dell'oggetto
o esempio: dopo che l'oggetto semaforo quando si trova nello
stato "rosso" per 1 minuto passa allo stato "verde"
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Classi
una classe costituisce il “progetto” di un oggetto:
nome della classe
nomi e valori iniziali degli attributi
nomi, e parametri metodi
una classe non è un tipo primitivo
in java una classe si definisce con:
<visibilità> class <nomeClasse> { ..... }
dove la visibilità può essere private o pubblic
e la descrizione della classe è scritta tra le parentesi
graffe
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Oggetti
definita una classe, è possibile costruire uno o
più oggetti di quella classe
gli oggetti vengono detti “istanze” della classe
in Java per costruire un oggetto si usa l'operatore
new:
o new NomeClasse ( );
ogni nuovo oggetto “vive” all’interno della
memoria del calcolatore
qui viene memorizzato il suo stato
oggetti differenti occupano spazi differenti nella
memoria
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Operatore new
a differenza delle variabili di tipo primitivo gli oggetti
vanno esplicitamente creati prima di essere usati
esempio:
String nome="mario";
definisce ed assegna un valore alla stringa mario
mentre:
className ABC;
definisce una variabile di classe "className"
prima di poter usare la variabile ABC dovremo creare un nuovo
oggetto di classe "className":
ABC=new className();
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Stato di un oggetto
un oggetto ha un proprio stato:
insieme dei valori assunti dagli attributi dell’oggetto
i metodi di un oggetto permettono di modificarne lo
stato
all’atto della costruzione di un oggetto, occorre
assegnare un valore ai diversi attributi
è il compito di un metodo particolare, detto
costruttore
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Attributi
gli attributi di un oggetto ne descrivono lo stato
sono delle variabili "locali" (di qualunque tipo)
esempio:
public class Automobile{
public String marca,modello;
public int cilindrata;
Passeggero[] pass;
}
un oggetto di classe "Automobile" è descritto da una
"marca" e un "modello" di tipo testuale, da una
"cilindrata" di tipo numerico intero e da un array "pass"
di oggetti di classe Passeggero
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Metodi (di classe)
abbiamo visto in precedenza cosa sono e come si usano
i metodi statici
un metodo di classe è una "funzione" applicabile solo
agli oggetti della classe in cui viene dichiarato
ha accesso a tutti gli attributi della classe
conseguenza: i metodi servono a modifica lo stato di un oggetto
esempio:
public class Studente{
public int numeroEsami; //attributo
public void superaEsame(){ //metodo
numeroEsami=numeroEsami+1;
}
}
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Metodi
un metodo (di classe), in generale, può operare
liberamente sull’oggetto su cui viene invocato
modificandone lo stato (cioè gli attributi)
chiamando altri metodi
effettuando calcoli
restituendo risultati
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Eseguire un metodo
a partire dal nome di un oggetto di una certa classe, è
possibile eseguire i relativi metodi con la notazione:
nomeOggetto.nomeMetodo(...);
nelle parentesi si indicano gli eventuali parametri
il metodo è costituito da un insieme di istruzioni
il chiamante attende il completamento del metodo, poi prosegue
la propria elaborazione
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Parametri
un metodo (di classe o statico) può avere parametri
internamente, appaiono come variabili locali
il loro valore viene fornito dal chiamante
come le variabili, i parametri hanno un tipo
nel caso di parametri di tipo primitivo
all’interno del parametro viene memorizzata una copia del valore
indicato dal chiamante
eventuali modifiche compiute dal metodo sul valore non si
ripercuotono sul chiamante
se il tipo non è primitivo (una classe ad esempio)
il parametro contiene una copia del riferimento all’oggetto
passato come parametro
le eventuali modifiche sullo stato dell’oggetto sono visibili al
chiamante
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Valori di ritorno
i metodi (di classe o statici) possono restituire un valore
il tipo del valore ritornato viene dichiarato prima del nome del
metodo
double calcolaPerimetro() { … }
il valore ritornato può essere assegnato ad una variabile
occorre che la variabile sia compatibile con il tipo del valore
ritornato
alcuni metodi non ritornano nulla
in questo caso dichiarano di ritornare il tipo predefinito void
void setRaggio(double r) { … }
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Metodi di tipo set e get
metodi di tipo set
servono ad alterare lo stato dell’oggetto
di solito hanno parametri e non ritornano nulla
per convenzione hanno un nome tipo:
o void setXyz(<parametri>);
metodi di tipo get
permettono di conoscere lo stato di un oggetto
di solito non hanno parametri e ritornano il valore letto
per convenzione hanno un nome tipo:
o <tipoRitornato> getXyz();
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Costruttore
metodo che inizializza gli attributi di una classe
sintassi particolare:
ha lo stesso nome della classe
non indica nessun tipo di ritorno, non restituisce valori
class Cerchio {
double r;
Cerchio() {
r=1.0;
}
}
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Costruttore e parametri
il costruttore assegna valori di default agli
attributi
se ha dei parametri può usarli per assegnare dei
valori particolari agli attributi
chi invoca il costruttore in questo caso deve fornire
i parametri richiesti
una classe può avere molti costruttori
sono distinguibili attraverso il numero ed il tipo di
parametri richiesti
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Costruttore e parametri
class Poligono {
double lato;
int numeroLati;
Poligono(int n) {
numeroLati=n;
lato=1.0;
}
Poligono p;
}
p= new Poligono(3);
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Classi pubbliche
se una classe C è public:
si possono istanziare oggetti di classe C in qualsiasi
altra classe
esempio:
public class Bicicletta{
public String nomeModello;
...
}
file: Bicicletta.java
//la classe Veicolo può istanziare oggetti di
classe Bicicletta
public class Veicolo{
public Bicicletta [] biciclette;
}
file: Veicolo.java
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Classi private
se una classe C è privata:
si possono istanziare oggetti di classe C solo
all'interno della classe X in cui la classe C è definita
esempio:
//la classe Veicolo può istanziare oggetti di
public class Veicolo{
private class Bicicletta{
public String nomeModello;
...
}
public Bicicletta [] biciclette;
}
file: Veicolo.java
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Classi private
se una classe C è privata:
non si possono istanziare oggetti di classe C in altre
classi
esempio:
private class Bicicletta{
public String nomeModello;
...
}
file: Bicicletta.java
//la classe Veicolo può istanziare oggetti di
classe Bicicletta
public class Veicolo{
public Bicicletta [] biciclette;
}
file: Veicolo.java
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Attributi pubblici
se un attributo è pubblico:
si può accedere al valore di quell'attributo (leggerlo,
modificarlo) da qualsiasi classe
esempio:
public class Bicicletta{
public String nomeModello;
...
}
public class Veicolo{
public Bicicletta B1;
Veicolo(){
B1.nomeModello="nessuno";
}
}
file: Bicicletta.java
file: Veicolo.java
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Attributi private
se un attributo è privato:
si può accedere al valore di quell'attributo (leggerlo,
modificarlo) solo nella classe di cui fa parte
esempio:
public class Bicicletta{
file: Bicicletta.java
private String nomeModello;
public void setNomeModello(String nome){
nomeModello=nome;
}
}
public class Veicolo{
public Bicicletta B1;
Veicolo(){
B1.setNomeModello("nessuno");
}
}
file: Veicolo.java
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Attributi private
se un attributo è privato:
si può accedere al valore di quell'attributo (leggerlo,
modificarlo) solo nella classe di cui fa parte
esempio:
public class Bicicletta{
file: Bicicletta.java
private String nomeModello;
public void setNomeModello(String nome){
nomeModello=nome;
}
}
public class Veicolo{
public Bicicletta B1;
Veicolo(){
B1.nomeModello="nessuno";
}
}
file: Veicolo.java
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Operatore this
la parola this in Java indica l'oggetto nel quale ci
si trova
si solito è sottinteso ma si può scrivere
esplicitamente per rendere più chiaro il
programma
esempio:
public class Bicicletta{
private String nomeModello;
public void setNomeModello(String nomeModello){
this.nomeModello=nomeModello;
}
}
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 10
definire una classe Studente con i seguenti attributi pubblici:
nome, cognome, matricola (testuali)
anno di iscrizione e numero di esami superati (numerici)
definire:
un costruttore che, dati nome, cognome e matricola dello studente,
assegni di default ogni nuovo studente al primo anno con zero esami
superati
un metodo rinnovaIscrizione() che aumenta di 1 il numero di anno di
iscrizione dello studente
un metodo esameSuperato() che aumenta di 1 il numero di esami
superati dello studente
in un file separato definire il main ed istanziare uno o più oggetti di
classe studente e testare il corretto funzionamento di costruttore e
metodi
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 10b
nell'esercizio 10 rendere privati gli attributi nome,
cognome e matricola
definire dei pubblici metodi per leggere il
contenuto degli attributi privati:
getNome()
getCognome()
getMatricola()
modificare di conseguenza il main in modo da
usare i 3 metodi definiti sopra
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Array di oggetti
come con i tipi primitivi anche con le classi si possono
definire degli array:
Automobile[] parcoAuto;
la variabile parcoAuto è un array di oggetti di classe Automobile
l'inizializzazione si fa come per i tipi primitivi:
parcoAuto=new Automobile[10];
la variabile parcoAuto è un array di 10 oggetti di classe
Automobile
ma trattandosi di oggetti ogni singolo elemento dell'array
va poi creato a parte:
while (c<10){
parcoAuto[c]=new Automobile();
c=c+1;
}
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 11
si consideri la seguente interazione:
Quanti professori?
2
Inserimento professore numero 0:
Nome? maurizio
Congome? mancini
Email? [email protected]
Dipartimento: dibris
Anzianità: 8
Inserimento professore numero 1:
Nome? mario
Congome? rossi
Email? [email protected]
Dipartimento: dime
Anzianità: 2
Quanti studenti?
3
Inserimento studente numero 0:
Nome? luigi
Congome? bianchi
Email? [email protected]
Matricola: 123456
Inserimento studente numero 1:
Nome? giuseppe
Congome? verdi
Email? [email protected]
Matricola: 1111
Inserimento studente numero 2:
Nome? antonio
Congome? gialli
Email? [email protected]
Matricola: 9999999
***Università
Professori
Nome: maurizio
Cognome: mancini
Email: [email protected]
Dipartimento: dibris
Anzianità: 8
Nome: mario
Cognome: rossi
Email: [email protected]
Dipartimento: dime
Anzianità: 2
Studenti
Nome: luigi
Cognome: bianchi
Email: [email protected]
Matricola: 123456
Anno di iscrizione: 1
Esami sostenuti: 0
Nome: giuseppe
Cognome: verdi
Email: [email protected]
Matricola: 1111
Anno di iscrizione: 1
Esami sostenuti: 0
Nome: antonio
Cognome: gialli
Email: [email protected]
Matricola: 9999999
Anno di iscrizione: 1
Esami sostenuti: 0
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html
Esercizio 11
scrivere un programma Java che permetta di inserire
professori e studenti di un'università e poi li visualizzi
ogni professore o studente:
ha nome, cognome, indirizzo email
ogni studente:
ha matricola, anno di iscrizione, esami sostenuti
ogni professore:
appartiene ad un dipartimento, ha una certa anzianità
per le caratteristiche comuni (nome, cognome, email)
definire un'unica classe "anagrafica" da usare sia per i
professori che per gli studenti
queste slide sono un'elaborazione delle slide di M. Mirto: http://sara.unisalento.it/~mirto/beniculturali/page3/page3.html