11
Parte 3
Fondamenti di programmzione
22
Cosa è Java
Linguaggio di programmazione familiareSimile a C e C++
Linguaggio di programmazione orientato a oggettiFacile da modificare e altamente riutilizzabile
Linguaggio robustoRestrizioni per evitare che le applicazioni generino errori
Linguaggio ad alte prestazioniStrumenti per la gestione di più processi
Linguaggio portabile Applicazioni eseguibili su Windows, Linux o MacOS
Linguaggio semplicePochi strumenti base e molte librerie
33
Compilatori tradizionali
codice sorgente
compilatore Windows
compilatore Linux
compilatore MacOS
codice eseguibile Windows
codice eseguibile Linux
codice eseguibile MacOS
44
Compilatore Java
codice sorgente
compilatore Windows
compilatore Linux
compilatore MacOS
interprete bytecode Windows
interprete bytecode Linux
interprete bytecode MacOS
Java bytecode
55
Programmazione
Concetti base: dati istruzioni
Dati: variabili tipi
Istruzioni: istruzioni base strutture di controllo sotto-programmi
66
Variabili e tipi
Variabile: locazione di memoria a cui è dato un nome con cui chiamarla ed utilizzarla
programmatore usa il nome senza necessariamente sapere che esso faccia riferimento ad una locazione di memoria
Tipo: ogni variabile ha un tipo che indica che genere di dati la variabile può contenere
una variabile può contenere dati di tipo intero (ad es., 15 o 2038), oppure dati di tipo carattere (ad es., ‘a’ o ‘£’) oppure dati di tipo stringa (ad es., “java” o “pascal”)
77
Istruzioni base
Assegnazioni ed espressioni: comandi per leggere e scrivere dati in una variabile e per fare calcoli esempio: interest = amount * 0.07;
Input/Output: comandi per ricevere dati dall’utente o da un file su disco e comandi per inviare dati nell’altra direzione
88
Strutture di controllo
Un programma è una sequenza di istruzioni Il calcolatore esegue le istruzioni nell’ordine
in cui esse appaiono, una dopo l’altra molto limitato
Le strutture di controllo sono istruzioni speciali che consentono di modificare il normale flusso di istruzioni
Due tipi base di strutture di controllo cicli
permettono di ripetere una sequenza di istruzioni diramazioni
permettono di decidere tra due o più diverse alternative di proseguimento
99
Sotto-programmi I programmi sono spesso abbastanza complessi da
dover essere scomposti in “pezzi” più maneggevoli Un sotto-programma consiste di istruzioni per
svolgere un certo compito raggruppate insieme in un’unità a cui è dato un nome
il nome può essere usato come sostituto dell’intero insieme di istruzioni
Esempio uno dei compiti del programma consiste nel disegnare un
rettangolo sullo schermo scrivere le necessarie istruzioni e raggrupparle in un sotto-programma di nome drawRect
ogni volta che il programma deve disegnare un rettangolo, lo può fare con una semplice istruzione: drawRect();
Vantaggi: risparmio di scrittura, organizzazione, riutilizzo
1010
Che cosa è una variabile?Che cosa è una variabile? Una locazione in cui memorizzare dati ed a cui è assegnato un nome un contenitore di dati
Può contenere un solo tipo di dati per esempio, solo numeri interi, solo numeri reali oppure solo caratteri
Una locazione in cui memorizzare dati ed a cui è assegnato un nome un contenitore di dati
Può contenere un solo tipo di dati per esempio, solo numeri interi, solo numeri reali oppure solo caratteri
1111
Creazione di variabiliCreazione di variabili Tutte le variabili devono essere dichiarate
prima di poterle utilizzare
Una dichiarazione di variabile associa un nome alle locazioni di memoria ad essa corrispondenti e specifica il tipo di dati che la variabile conterrà:
Tipo Variabile_1, Variabile_2, …;
Per esempio, per creare tre variabili che memorizzino il numero di cesti, il numero di uova per cesto ed il numero totale di uova:
int numberOfBaskets, eggsPerBasket, totalEggs;
Tutte le variabili devono essere dichiarate prima di poterle utilizzare
Una dichiarazione di variabile associa un nome alle locazioni di memoria ad essa corrispondenti e specifica il tipo di dati che la variabile conterrà:
Tipo Variabile_1, Variabile_2, …;
Per esempio, per creare tre variabili che memorizzino il numero di cesti, il numero di uova per cesto ed il numero totale di uova:
int numberOfBaskets, eggsPerBasket, totalEggs;
1212
Nomi di variabili: identificatoriNomi di variabili: identificatori
Regole- devono essere rispettate
tutti gli identificatori Java devono obbedire alle stesse regole
non devono cominciare con una cifra
devono contenere solo numeri, lettere, simboli ‘_’ e ‘$’ (ma è meglio evitare ‘$’, in quanto è riservato per scopi particolari)
sono sensibili alle maiuscole (ThisName e thisName sono due diversi nomi di variabili)
Regole- devono essere rispettate
tutti gli identificatori Java devono obbedire alle stesse regole
non devono cominciare con una cifra
devono contenere solo numeri, lettere, simboli ‘_’ e ‘$’ (ma è meglio evitare ‘$’, in quanto è riservato per scopi particolari)
sono sensibili alle maiuscole (ThisName e thisName sono due diversi nomi di variabili)
Regole di programmazione - dovrebbero essere rispettate
usare sempre nomi che abbiano un significato (ad esempio, eggsPerBasket invece di n o di count)
iniziare i nomi di variabile con una lettera minuscola
iniziare le parole interne al nome con una lettera maiuscola (meglio eggsPerBasket di eggsperbasket)
evitare di usare ‘$’ in quanto è riservato a scopi particolari
Regole di programmazione - dovrebbero essere rispettate
usare sempre nomi che abbiano un significato (ad esempio, eggsPerBasket invece di n o di count)
iniziare i nomi di variabile con una lettera minuscola
iniziare le parole interne al nome con una lettera maiuscola (meglio eggsPerBasket di eggsperbasket)
evitare di usare ‘$’ in quanto è riservato a scopi particolari
1313
Due tipi di tipi di dati in JavaDue tipi di tipi di dati in Java
primitivi I tipi più semplici Non possono essere
decomposti in altri tipi
Contengono solo valori Esempi:
int - interodouble - realechar - carattere
primitivi I tipi più semplici Non possono essere
decomposti in altri tipi
Contengono solo valori Esempi:
int - interodouble - realechar - carattere
classi Più complessi Composti di altri tipi
(primitivi o classi) Contengono sia dati che
metodi Esempio:
IntegerString
classi Più complessi Composti di altri tipi
(primitivi o classi) Contengono sia dati che
metodi Esempio:
IntegerString
1414
Tipi di Dati PrimitiviTipi di Dati Primitivi
Nome
Tipo di valore
Memoria usata
Insieme di valori
byte intero 1 byte da -128 a 127
short intero 2 byte da -32768 a 32767
int intero 4 byte da -2,147,483,648 a 2,147,483,647
long intero 8 byte da -9,223,372,036,854,775,808 a 9,223,374,036,854,775,808
float reale 4 byte da +/- 3.4028… x 10+38 a +/- 1.4023… x 0-45
double reale 8 byte da +/- 1.767… x 10+308 a +/- 4.940… x 0-324
char carattere (Unicode) 2 byte tutti i caratteri Unicode
boolean true oppure false 1 bit
1515
Quali sapere per oraQuali sapere per ora
int semplicemente numeri
interi possono essere positivi
e negativi nessun punto decimale
char semplicemente un
singolo carattere utilizza le virgolette
singole per esempio, `A`;
int semplicemente numeri
interi possono essere positivi
e negativi nessun punto decimale
char semplicemente un
singolo carattere utilizza le virgolette
singole per esempio, `A`;
double numeri reali, sia
positivi che negativi ha un punto decimale
(parte frazionaria) due formati
numero con punto decimale, a.e. 514.061
notazione e o scientifica, a.e. 5.14061 e2, che significa 5.14061 x 102
double numeri reali, sia
positivi che negativi ha un punto decimale
(parte frazionaria) due formati
numero con punto decimale, a.e. 514.061
notazione e o scientifica, a.e. 5.14061 e2, che significa 5.14061 x 102
1616
Assegnare valori alle variabiliAssegnare valori alle variabili
Istruzione di assegnazione variabile = espressione;
esempio: answer = 42; Operatore di assegnazione: “=“
non lo stesso dell’algebra significa: “assegna il valore dell’espressione alla
destra del segno di uguale alla variabile alla sinistra.”
se numberOfCards ha il valore 7 e handicap ha il valore 2, allora la seguente istruzione imposta il valore di score a 9:score = numberOfCards + handicap;
La variabile può apparire in entrambi i lati:int count = 10;count = count - 1; nuovo valore di count = 10 - 1 = 9
Istruzione di assegnazione variabile = espressione;
esempio: answer = 42; Operatore di assegnazione: “=“
non lo stesso dell’algebra significa: “assegna il valore dell’espressione alla
destra del segno di uguale alla variabile alla sinistra.”
se numberOfCards ha il valore 7 e handicap ha il valore 2, allora la seguente istruzione imposta il valore di score a 9:score = numberOfCards + handicap;
La variabile può apparire in entrambi i lati:int count = 10;count = count - 1; nuovo valore di count = 10 - 1 = 9
1717
Assegnare valori iniziali alle variabili
Assegnare valori iniziali alle variabili
I valori iniziali possono o meno essere assegnati quando le variabili sono dichiarate:
int totalEggs, numberOfBaskets, eggsPerBasket;
oppure
int totalEggs = 0;int numberOfBaskets = 0;int eggsPerBasket = 0;
Suggerimento: è una buona regola di programmazione inizializzare sempre le variabili.
I valori iniziali possono o meno essere assegnati quando le variabili sono dichiarate:
int totalEggs, numberOfBaskets, eggsPerBasket;
oppure
int totalEggs = 0;int numberOfBaskets = 0;int eggsPerBasket = 0;
Suggerimento: è una buona regola di programmazione inizializzare sempre le variabili.
1818
Cambiare il valore di una variabileCambiare il valore di una variabile
Generalmente il valore viene cambiato (è assegnato un valore diverso) in qualche parte del programma
Può essere calcolato a partire da altri valori:
totalEggs = numberOfBaskets * eggsPerBasket;
Oppure può essere letto in input vedremo più avanti
Generalmente il valore viene cambiato (è assegnato un valore diverso) in qualche parte del programma
Può essere calcolato a partire da altri valori:
totalEggs = numberOfBaskets * eggsPerBasket;
Oppure può essere letto in input vedremo più avanti
1919
Operatori di assegnazione specializzatiOperatori di assegnazione specializzati Un’abbreviazione per eseguire un’operazione ed
assegnare un nuovo valore ad una variabile Forma generale: var <op>= expression;
equivalente a: var = var <op> (expression); <op> è +, -, *, /, or %
Esempi:amount += 5;
//amount = amount + 5;
amount *= 1 + interestRate;
//amount = amount * (1 + interestRate); La parte destra è trattata come una singola
unità (come se vi fossero delle parentesi)
Un’abbreviazione per eseguire un’operazione ed assegnare un nuovo valore ad una variabile
Forma generale: var <op>= expression; equivalente a: var = var <op> (expression); <op> è +, -, *, /, or %
Esempi:amount += 5;
//amount = amount + 5;
amount *= 1 + interestRate;
//amount = amount * (1 + interestRate); La parte destra è trattata come una singola
unità (come se vi fossero delle parentesi)
2020
CostantiCostanti• Le costanti sono simili alle variabili, ma possono contenere un solo valore per tutta la durata della loro esistenza.• In Java si dichiarano le costanti premettendo la parola chiave final.• E’ convenzione usare lettere maiuscole.
Es.: final int NUMERO_MASSIMO_POSTI = 427
• E’ buona pratica usare costanti invece di valori numerici (letterali) perche’ si evita di modificarli inavvertitamente.
2121
Valore di ritornoValore di ritorno
Le espressioni ritornano valori: il numero prodotto da un’espressione è il “valore di ritorno”int numberOfBaskets, eggsPerBasket, totalEggs;
numberOfBaskets = 5;
eggsPerBasket = 8;
totalEggs = numberOfBaskets * eggsPerBasket; nell’ultima linea numberOfBaskets ritorna il valore 5 e eggsPerBasket ritorna il valore 8
numberOfBaskets * eggsPerBasket è un’espressione che ritorna il valore intero 40
Le espressioni ritornano valori: il numero prodotto da un’espressione è il “valore di ritorno”int numberOfBaskets, eggsPerBasket, totalEggs;
numberOfBaskets = 5;
eggsPerBasket = 8;
totalEggs = numberOfBaskets * eggsPerBasket; nell’ultima linea numberOfBaskets ritorna il valore 5 e eggsPerBasket ritorna il valore 8
numberOfBaskets * eggsPerBasket è un’espressione che ritorna il valore intero 40
2222
Conversione di tipoConversione di tipo
La conversione di tipo cambia il tipo di dato di un valore Non è possibile assegnare un valore di un tipo ad una
variabile di un tipo diverso, a meno che non lo si converta in modo da coincidere con il tipo della variabile
La conversione di tipo modifica solo il tipo del valore di ritorno, non il tipo della variabile ad esempio:
double x;int n = 5;x = n; poiché n è un int ed x è un double, il valore ritornato da n (non n) deve essere convertito in un double prima di essere assegnato ad x
La conversione di tipo cambia il tipo di dato di un valore Non è possibile assegnare un valore di un tipo ad una
variabile di un tipo diverso, a meno che non lo si converta in modo da coincidere con il tipo della variabile
La conversione di tipo modifica solo il tipo del valore di ritorno, non il tipo della variabile ad esempio:
double x;int n = 5;x = n; poiché n è un int ed x è un double, il valore ritornato da n (non n) deve essere convertito in un double prima di essere assegnato ad x
2323
Conversione implicitaConversione implicita
La conversione di tipo è eseguita implicitamente (in modo automatico) quando un tipo “più basso” viene assegnato ad un tipo “più alto” secondo la seguente gerarchia:
byte --> short --> int --> long --> float --> double
Ad esempio:double x;
int n = 5;
x = n; il valore di ritorno di n è convertito (in modo implicito)
in un double, e quindi assegnato ad x x contiene 5.0 il tipo di dato della variabile n è invariato (ovvero
ancora int)
La conversione di tipo è eseguita implicitamente (in modo automatico) quando un tipo “più basso” viene assegnato ad un tipo “più alto” secondo la seguente gerarchia:
byte --> short --> int --> long --> float --> double
Ad esempio:double x;
int n = 5;
x = n; il valore di ritorno di n è convertito (in modo implicito)
in un double, e quindi assegnato ad x x contiene 5.0 il tipo di dato della variabile n è invariato (ovvero
ancora int)
2424
Ancora conversione implicitaAncora conversione implicita Alcune espressioni includono valori di tipo diverso Tutti i valori sono automaticamente (in modo
implicito) fatti avanzare al livello più alto prima di eseguire il calcolo del valore di ritorno
Ad esempio:double a;
int n = 2;
float x = 5.1;
double y = 1.33;
a = (n * x)/y; i valori di n ed x sono automaticamente convertiti al tipo double prima di eseguire la moltiplicazione e la divisione
Alcune espressioni includono valori di tipo diverso Tutti i valori sono automaticamente (in modo
implicito) fatti avanzare al livello più alto prima di eseguire il calcolo del valore di ritorno
Ad esempio:double a;
int n = 2;
float x = 5.1;
double y = 1.33;
a = (n * x)/y; i valori di n ed x sono automaticamente convertiti al tipo double prima di eseguire la moltiplicazione e la divisione
2525
Conversione esplicitaConversione esplicita
La conversione esplicita è necessaria in tutti i casi non coperti da quella implicta
Ad esempio:int points;double distance = 9.0;points = distance; l’ultima istruzione è illegale (anche se la parte frazionaria è 0)
Porre di fronte al valore il cui tipo deve essere convertito il nuovo tipo tra parentesi:points = (int)distance; quest’istruzione è legale
La conversione esplicita è necessaria in tutti i casi non coperti da quella implicta
Ad esempio:int points;double distance = 9.0;points = distance; l’ultima istruzione è illegale (anche se la parte frazionaria è 0)
Porre di fronte al valore il cui tipo deve essere convertito il nuovo tipo tra parentesi:points = (int)distance; quest’istruzione è legale
2626
TroncamentoTroncamento
Conversione da reale ad intero non arrotonda, ma tronca la parte frazionaria viene semplicemente ignorata
Ad esempio:int numberOfDollars;
double dinnerBill = 26.99;
numberOfDollars = (int) dinnerBill; il valore di numberOfDollars è ora 26
Conversione da reale ad intero non arrotonda, ma tronca la parte frazionaria viene semplicemente ignorata
Ad esempio:int numberOfDollars;
double dinnerBill = 26.99;
numberOfDollars = (int) dinnerBill; il valore di numberOfDollars è ora 26
2727
Divisione reale e divisione interaDivisione reale e divisione intera Se almeno uno dei valori che occorrono nella divisione è di tipo float o double, allora non si ha nessun troncamento (tutti i valori sono convertiti al tipo più alto)
Il troncamento si verifica se tutti i valori sono interi
Ad esempio:int a = 4, b =5, c;double x = 1.5, y;y = b/x;c = b/a; il valore di y è 3.333... mentre quello di c è 1
Se almeno uno dei valori che occorrono nella divisione è di tipo float o double, allora non si ha nessun troncamento (tutti i valori sono convertiti al tipo più alto)
Il troncamento si verifica se tutti i valori sono interi
Ad esempio:int a = 4, b =5, c;double x = 1.5, y;y = b/x;c = b/a; il valore di y è 3.333... mentre quello di c è 1
2828
Caratteri come interiCaratteri come interi Il tipo di dati char memorizza un singolo carattere
stampabile Ad esempio:
char answer = `y`; I caratteri sono in realtà memorizzati come interi secondo
un codice speciale ogni carattere stampabile (lettera, cifra, segno di
interpunzione, spazio e tabulazione) ha associato un codice intero distinto
i codici sono distinti a seconda delle maiuscole o delle minuscole
ad esempio, 97 potrebbe essere il codice di ‘a’ e 65 quello di ‘A’
ASCII e Unicode sono due codici molto frequenti Unicode include tutti i codici ASCII più altri codici per
linguaggi con alfabeto diverso da quello italiano Java usa Unicode
Il tipo di dati char memorizza un singolo carattere stampabile
Ad esempio:char answer = `y`;
I caratteri sono in realtà memorizzati come interi secondo un codice speciale ogni carattere stampabile (lettera, cifra, segno di
interpunzione, spazio e tabulazione) ha associato un codice intero distinto
i codici sono distinti a seconda delle maiuscole o delle minuscole
ad esempio, 97 potrebbe essere il codice di ‘a’ e 65 quello di ‘A’
ASCII e Unicode sono due codici molto frequenti Unicode include tutti i codici ASCII più altri codici per
linguaggi con alfabeto diverso da quello italiano Java usa Unicode
2929
Conversione di carattere in interoConversione di carattere in intero La conversione di un valore di tipo char produce il suo codice Unicode
Ad esempio, eseguendo le seguenti istruzioni
char answer = `7`;
int intAnswer = answer;il valore di intAnswer sarebbe 55 (non 7) in quanto 55 è il codice Unicode del carattere ‘7’
La conversione di un valore di tipo char produce il suo codice Unicode
Ad esempio, eseguendo le seguenti istruzioni
char answer = `7`;
int intAnswer = answer;il valore di intAnswer sarebbe 55 (non 7) in quanto 55 è il codice Unicode del carattere ‘7’
3030
Imprecisione di numeri in virgola mobileImprecisione di numeri in virgola mobile
I calcolatori memorizzano i numeri utilizzando un numero fissato di bit, per cui non tutti i numeri reali possono essere codificati in modo esatto un numero infinito di bit sarebbe richiesto per
rappresentare in modo esatto ogni numero reale ad esempio, se il calcolatore può rappresentare
solo 10 cifre dopo il punto decimale, allora il numero reale 1/3=0.33333... sarebbe memorizzato come 0.3333333333 (che non è esattamente 1/3)
Gli interi, al contrario, sono memorizzati in modo esatto se il valore 2 è assegnato ad una variabile di tipo
int, il suo valore è esattamente 2
I calcolatori memorizzano i numeri utilizzando un numero fissato di bit, per cui non tutti i numeri reali possono essere codificati in modo esatto un numero infinito di bit sarebbe richiesto per
rappresentare in modo esatto ogni numero reale ad esempio, se il calcolatore può rappresentare
solo 10 cifre dopo il punto decimale, allora il numero reale 1/3=0.33333... sarebbe memorizzato come 0.3333333333 (che non è esattamente 1/3)
Gli interi, al contrario, sono memorizzati in modo esatto se il valore 2 è assegnato ad una variabile di tipo
int, il suo valore è esattamente 2
3131
L’operatore di modulo: % L’operatore di modulo: %
Usato con i tipi interi a%b restituisce il resto della divisione di b per a
Ad esempio:int a = 14; b = 4, c;c = a%b; c ora ha il valore 2, che è il reso della divisione di 14 per 4
Ha molte applicazioni consente di contare modulo 2, 3 o qualsiasi altro numero
consente di distinguere numeri pari da numeri dispari consente di eseguire un’operazione solo in corrispondenza dei multipli di un dato numero
Usato con i tipi interi a%b restituisce il resto della divisione di b per a
Ad esempio:int a = 14; b = 4, c;c = a%b; c ora ha il valore 2, che è il reso della divisione di 14 per 4
Ha molte applicazioni consente di contare modulo 2, 3 o qualsiasi altro numero
consente di distinguere numeri pari da numeri dispari consente di eseguire un’operazione solo in corrispondenza dei multipli di un dato numero
3232
Precedenze e parentesi Precedenze e parentesi Le espressioni Java soddisfano regole simili
all’algebra dei numeri reali Si usano le parentesi per forzare la precedenza
Tranne i casi in cui la precedenza è corretta ed ovvia, conviene usare le parentesi per facilitare la lettura dell’espressione
Le espressioni Java soddisfano regole simili all’algebra dei numeri reali
Si usano le parentesi per forzare la precedenza Tranne i casi in cui la precedenza è corretta ed ovvia,
conviene usare le parentesi per facilitare la lettura dell’espressione
Espressioni matematiche
Espressione Java (forma preferita)
Espressione Java con tutte le parentesi
rate2 + delta rate*rate + delta (rate*rate) + delta
2(salary + bonus) 2 * (salary + bonus) 2 * (salary + bonus)
3mass time
1
+ 1/(time + 3 * mass) 1/(time + (3 * mass))
9v t
7 - a
+ (a - 7) / (t + 9 * v) (a - 7) / (t +( 9 * v))
3333
Operatori di incremento e decrementoOperatori di incremento e decremento
Utilizzati per aumentare o diminuire il valore di una variabile di 1
Incremento ++
ad esempio, count++; Decremento
-- ad esempio, count--;
La variabile può essere incrementata (o decrementata) prima o dopo aver usato il suo valore attuale. Ad esempio, dopoint count=5;int n = 2*(++count);int m = 2*(count++); sia n che m hanno il valore 12, mentre count ha il valore
7
Utilizzati per aumentare o diminuire il valore di una variabile di 1
Incremento ++
ad esempio, count++; Decremento
-- ad esempio, count--;
La variabile può essere incrementata (o decrementata) prima o dopo aver usato il suo valore attuale. Ad esempio, dopoint count=5;int n = 2*(++count);int m = 2*(count++); sia n che m hanno il valore 12, mentre count ha il valore
7