Parte 3
Fondamenti di programmzione
1
Cosa è Java
Linguaggio di programmazione familiare
Simile a C e C++
Linguaggio di programmazione orientato a oggetti
Facile da modificare e altamente riutilizzabile
Linguaggio robusto
Restrizioni per evitare che le applicazioni generino errori
Linguaggio ad alte prestazioni
Strumenti per la gestione di più processi
Linguaggio portabile
Applicazioni eseguibili su Windows, Linux o MacOS
Linguaggio semplice
Pochi strumenti base e molte librerie
2
Compilatori tradizionali
compilatore Windows
codice sorgente
compilatore Linux
compilatore MacOS
codice eseguibile Windows
codice eseguibile Linux
codice eseguibile MacOS
3
Compilatore Java
compilatore Windows
codice sorgente
compilatore Linux
compilatore MacOS
interprete bytecode Windows
Java bytecode
interprete bytecode Linux
interprete bytecode MacOS
4
Programmazione
 Concetti base:
 dati
 istruzioni
 Dati:
 variabili
 tipi
 Istruzioni:
 istruzioni base
 strutture di controllo
 sotto-programmi
5
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”)
6
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
7
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
8
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
9
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
10
Creazione 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;
11
Nomi di variabili:
identificatori
Regole
- devono essere rispettate
Regole di programmazione


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)



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)
- dovrebbero essere rispettate


evitare di usare ‘$’ in quanto è riservato a
scopi particolari
12
Due tipi di tipi di dati in Java
primitivi
classi
 I tipi più semplici
 Non possono essere
decomposti in altri tipi
 Contengono solo valori
 Esempi:
int - intero
double - reale
char - carattere
 Più complessi
 Composti di altri tipi (primitivi o
classi)
 Contengono sia dati che metodi
 Esempio:
Integer
String
13
Tipi di Dati Primitivi
Nome
byte
Tipo di valore
intero
Memoria usata
1 byte
Insieme di valori
da -128 a 127
short
intero
2 byte
da -32768 a 32767
int
intero
4 byte
long
intero
8 byte
float
reale
4 byte
double
reale
8 byte
char
carattere (Unicode)
2 byte
da -2,147,483,648 a
2,147,483,647
da -9,223,372,036,854,775,808
a 9,223,374,036,854,775,808
da +/- 3.4028… x 10+38 a
+/- 1.4023… x 0-45
da +/- 1.767… x 10+308 a
+/- 4.940… x 0-324
tutti i caratteri Unicode
boolean
true oppure false
1 bit
14
Quali 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`;
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
15
Assegnare 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
16
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.
17
Cambiare 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
18
Operatori 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)
19
Costanti
•
•
•
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.
20
Valore 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
21
Conversione 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
22
Conversione 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)
23
Ancora 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
24
Conversione 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
25
Troncamento
 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
26
Divisione 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
27
Caratteri 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
28
Conversione 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’
29
Imprecisione 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
30
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
31
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
Espressioni
matematiche
rate2 + delta
Espressione Java
(forma preferita)
rate*rate + delta
Espressione Java
con tutte le parentesi
(rate*rate) + delta
2(salary + bonus)
2 * (salary + bonus)
2 * (salary + bonus)
1/(time + 3 * mass)
1/(time + (3 * mass))
(a - 7) / (t + 9 * v)
(a - 7) / (t +( 9 * v))
1
time  3mass
a -7
t  9v
32
Operatori 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, dopo
int count=5;
int n = 2*(++count);
int m = 2*(count++);
sia n che m hanno il valore 12, mentre count ha il valore 7
33
Scarica

Lezione3