Informatica. Fondamenti della Programmazione in Java. Leonardo Vanneschi

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Informatica. Fondamenti della Programmazione in Java. Leonardo Vanneschi"

Transcript

1 Informatica Fondamenti della Programmazione in Java Leonardo Vanneschi 1

2 1. Fondamenti Il primo programma in Java Il programma che stampa a video una sequenza di caratteri (o stringa): class Esempio { public static void main (String[] args) { System.out.println("Hello World!"); Nota: per poter essere utilizzato, questo programma deve necessariamente essere contenuto in un file di testo di nome Esempio.java. Spiegazione dettagliata del programma Per i più "esperti": Esempio è il nome della classe che contiene il metodo main; public: il metodo main può essere invocato anche esternamente alla classe che lo contiene; static: il metodo main si riferisce alla classe Esempio e non ad una particolare istanza di esse; in altri termini, esiste uno ed un solo metodo main, identico per ogni istanza della classe Esempio; void: il metodo main non restituisce alcun risultato (dunque ha il solo ruolo di compiere delle azioni); main è il nome del metodo principale di un programma Java: il primo ad essere eseguito. String[] args: l'argomento del metodo main è un vettore di stringhe di caratteri chiamato args; System.out.println è il comando predefinito di Java per stampare a video una sequenza di caratteri. Tale sequenza va passata come parametro a questo comando. Tutti questi concetti verranno chiariti durante il corso. Per i "principianti": La prima riga significa che il programma che sto scrivendo si chiama Esempio. Affinché esso possa funzionare, esso deve essere contenuto in un file di testo con lo stesso nome e con l'estensione ".java" (quindi in questo caso Esempio.java). La seconda può essere interpretata come l' "inizio del programma": a partire dalla riga successiva a questa, ha inizio il codice che viene eseguito. In prima approssimazione, le prime due righe possono essere considerate come qualcosa che non deve essere compreso nei dettagli, ma che va scritto ogni volta in modo meccanico e sempre uguale, con la sola eccezione del fatto che il nome del programma (la parola che segue la parola class nella prima riga) può essere scelta di volta in volta e con il vincolo che tale nome deve essere identico al nome del file che contiene il codice. 2

3 System.out.println è il comando predefinito di Java per stampare a video una sequenza di caratteri. La sequenza di caratteri da stampare deve essere scritta dopo il comando, tra parentesi e tra virgolette. Tutti questi concetti verranno chiariti durante il corso. Compilazione ed esecuzione Per poter eseguire un programma Java, occorre prima compilarlo. Una volta che si è scritto il programma, infatti, esso è in una forma comprensibile da parte di un essere umano, ma non da parte di un calcolatore (si dice che è scritto in un linguaggio di programmazione di alto livello). Viceversa, un calcolatore è una macchina in grado di eseguire programmi scritti in un linguaggio macchina, o, nel gergo di Java, in byte-code (un programma scritto in linguaggio macchina può approssimativamente essere immaginato come una sequenza di bit, ovvero di caratteri 0 e 1). Quindi, il programma scritto da un essere umano, per poter essere eseguito deve essere tradotto in linguaggio macchina. Questo è il compito principale del compilatore. Le tappe da compiere per poter eseguire il programma Esempio.java sono schematizzate qua sotto: Programma di Programma in alto livello (file byte-code (file Esempio.java) compilatore Esempio.class) esecuzione Comando per compilare: javac Esempio.java Comando per eseguire: java Esempio e possono essere riassunte dai seguenti punti: Compilare il programma con il comando javac Esempio.java (questo comando, se viene eseguito senza errori, fa si che venga creato un nuovo file chiamato Esempio.class che è la traduzione in byte-code del file Esempio.java). Eseguire il programma con il comando java Esempio L'effetto sarà la visualizzazione a video della sequenza di caratteri Hello World! 3

4 Note: i comandi javac e java (detti anche compilatore e interprete di Java) sono comandi che devono essere eseguiti dal Sistema Operativo presente sul vostro calcolatore (probabilmente Linux o Windows nel vostro caso). Il meccanismo più elementare per "interagire" con un Sistema Operativo (e quello che verrà utilizzato in questo corso) è tramite un terminale. Quindi, ad esempio per eseguire il comando javac Esempio.java, occorre aprire un terminale con l'apposito meccanismo previsto dal vostro sistema operativo (normalmente lo si può fare tramite un apposito menu), posizionarsi nella directory in cui è contenuto il file Esempio.java, scrivere con la tastiera javac Esempio.java e premere il tasto return. Per poter essere eseguiti, i comandi javac e java devono essere stati precedentemente installati. Essi possono essere scaricati ed installati gratuitamente dal sito seguendo il link downloads e scegliendo il Sistema Operativo utilizzato. Oltre a quello di tradurre programmi ad alto livello in programmi in linguaggio macchina, il compilatore ha anche il compito di segnalare gli errori che sono stati commessi al momento della scrittura del programma. Si noti che i soli errori che possono essere segnalati da un compilatore sono errori di sintassi. Esempi di errori di sintassi: Scrivere Sytsem.otu.priltn invece di System.out.println. Dimenticare il simbolo ";" alla fine di un comando. Dimenticarsi di chiudere una parentesi che era stata precedentemente aperta.... (i possibili errori di sintassi sono moltissimi, ve ne accorgerete presto in laboratorio, purtroppo... E' importante non scoraggiarsi se all'inizio commettete molti di questi errori: è del tutto normale! Vedrete che con l'esperienza le cose andranno meglio). Esempi di errori di semantica: Il programma che volevo scrivere non doveva stampare a video la stringa Hello World!, ma doveva fare la somma di due numeri interi. Chiaramente il compilatore non è in grado di segnalare errori di semantica. Questi ultimi sono di sola competenza del programmatore, che ha tutta la responsabilità di far si che il programma si comporti come desiderato. Quando il compilatore trova un errore si sintassi all'interno del programma, si interrompe e segnala sul terminale il tipo di errore e la riga di codice in cui l'errore è contenuto. In questo modo (con un po' di esperienza!) dovrebbe risultare facile da parte del programmatore identificare l'errore, correggerlo e riprovare a compilare. Quando il programma non contiene errori di sintassi, il compilatore genera un nuovo file (nella stessa directory in cui vi trovate) chiamato Esempio.class, che è la traduzione in byte-code del file Esempio.java. Se si cerca di aprire il file Esempio.class con un editore di testo, si vedrà che questo file risulta del tutto illeggibile da parte di un essere umano. Questo codice non deve essere ne' letto, ne' capito, ma deve essere eseguito, tramite il comando java Esempio. 4

5 2. Variabili, Tipi di Dato, Espressioni Il Concetto di Variabile Per introdurre il concetto di variabile (uno dei concetti fondamentali della programmazione), si consideri un programma un po' più complesso di quello visto fin qui: class Esempio { public static void main (String[] args) { System.out.println("2"); System.out.println("2"); System.out.println("2"); E' chiaro che questo programma stampa a video tre volte la stringa 2. Supponiamo adesso che dopo aver scritto questo programma, ci si renda conto che la stringa che doveva essere stampata non era 2, bensì (ad esempio) 5. Per correggere il programma da questo errore di semantica, occorrerà correggere tre punti del programma. In questo caso il lavoro non sarebbe granché oneroso, ma è facile immaginare che, se la stringa dovesse essere stampata mille volte, risulterebbe assai fastidioso dover effettuare mille correzioni dello stesso errore! Questo problema (ovvero quello di scrivere un programma che deve poi essere modificato in un secondo tempo per qualche motivo) è molto frequente. Uno dei metodi per affrontare in modo più efficace questo problema è quello di utilizzare il concetto di variabile. In prima approssimazione, ed in modo del tutto intuitivo e informale, una variabile può essere definita come una scatola (o, un po' più correttamente, come una parte della memoria del calcolatore) che contiene dei valori. Una variabile è identificata da: un nome; un tipo di dato; un valore. Per esempio, una possibile definizione di variabile in Java può essere: int x = 5; In questo modo, abbiamo definito una variabile tale che: il suo nome è x; il suo tipo è int, ovvero questa variabile è un numero intero; il suo valore è 5. Il tipo di dato di una variabile è legato alla sua taglia, ovvero allo spazio di memoria che essa occupa. Dopo che la riga di codice int x = 5; è stata eseguita, infatti, viene riservato uno 5

6 spazio di memoria per la variabile x e la taglia di questo spazio di memoria è esattamente la dimensione sufficiente per contenere un numero intero (32 bit in Java). Successivamente, all'interno di questa regione di memoria viene registrato il valore 5. Altro esempio: char c = 'a'; il suo nome è c; il suo tipo è char, che significa che si tratta di un carattere alfanumerico; il suo valore è il carattere a. In questo caso, al momento dell'esecuzione della riga di codice char c = 'a'; viene riservato, all'interno della memoria del calcolatore, uno spazio per la variabile c della taglia necessaria per contenere un qualsiasi carattere alfanumerico (16 bit in Java) e successivamente viene registrato il valore a all'interno di questa regione. Si noti che la rappresentazione binaria del carattere a è uguale a quella di un numero intero di tipo short, quindi occorre utilizzare i simboli ' e ' per distinguere questi due casi. Vediamo adesso come può essere riscritto il programma precedente utilizzando una variabile: class Esempio { public static void main (String[] args) { int n = 2; System.out.println(n); System.out.println(n); System.out.println(n); Note: E' chiaro che stavolta se occorre cambiare il valore che deve essere stampato a video, il cambiamento può essere fatto una sola volta, in un sol punto del programma. E' importante notare la differenza tra l'uso del comando System.out.println con e senza le virgolette: un comando come System.out.println("n"); stampa a video la lettera n; viceversa, un comando come System.out.println(n); implica la ricerca all'interno della memoria di una variabile di nome n e la stampa a video del suo valore. Adesso che abbiamo (parzialmente) capito l'utilità del concetto di variabile, possiamo dedicarci con un livello maggiore di dettaglio alle tre caratteristiche tipiche delle variabili: i tipi di dato, i nomi (detti anche identificatori) e i valori. 6

7 Tipi di Dato In Java esistono due categorie di tipi di dato: Tipi di dato primitivi Tipi di dato complessi (o classi predefinite) Inoltre, in Java il programmatore ha la possibilità di definire dei nuovi tipi di dato. I tipi di dato primitivi di Java sono: short numeri interi rappresentabili con 16 bit int numeri interi rappresentabili con 32 bit long numeri interi rappresentabili con 64 bit float numeri reali rappresentabili con 32 bit double numeri reali rappresentabili con 64 bit char caratteri alfanumerici (rappresentabili con 16 bit) boolean i valori di verità. I possibili valori sono true (vero) e false (falso) e quindi, dato che i possibili valori sono 2, sono rappresentabili con 1 bit. I tipi di dato short, int, long, float e double sono detti tipi numerici. Esistono (pochi) altri tipi di dato semplici in Java (come ad esempio il tipo byte), che vengono utilizzati di rado e non sono di interesse in questo corso. Tra i tipi di dato complessi (si noti che, come risulterà più chiaro alla fine del corso, il termine classi predefinite è più corretto ed appropriato, ma in questa fase si è preferito utilizzare il termine tipi di dato complessi perché più intuitivo) in Java sono moltissimi. Fin qui ne abbiamo visto uno soltanto: String sequenze di caratteri alfanumerici Risulterà chiaro durante il corso il motivo per cui i tipi di dato complessi debbano essere distinti dai tipi di dato semplice. Inoltre, durante il corso si vedranno altri esempi di tipi di dato complessi di Java (anche se non ci avvicineremo neanche ad una analisi esaustiva di tutte le classi predefinite del linguaggio) e impareremo a definire nuovi tipi di dato. 7

8 Identificatori Un identificatore è una sequenza di caratteri: tale che: Esempi: c 0 non è una cifra; c 0 c 1...c N-1 i tale che 0 i N-1: c i non è un simbolo di operazione aritmetica (+,-,*,/,...) o logica (&,,!) e non è uguale a uno spazio vuoto (carattere di spaziatura). somma è un identificatore corretto; 3aPagina NON è un identificatore corretto perché comincia con una cifra; due+tre NON è un identificatore corretto perché contiene un simbolo di operazione aritmetica; il-mio-nome NON è un identificatore corretto perché contiene simboli di operazioni aritmetiche; il_mio_nome è un identificatore corretto (si noti la differenza col caso precedente); ilmionome è un identificatore corretto; il mio nome NON è un identificatore corretto perché contiene degli spazi bianchi. x2 è un identificatore corretto (contiene o più cifre, ma nessuna di esse appare come primo carattere). 8

9 Valori delle variabili I valori costanti delle variabili e la loro rappresentazione dipendono fortemente dal tipo di dato. In particolare: I valori di tipo short, int e long si rappresentano scrivendo semplicemente dei numeri senza la virgola. Chiaramente il tipo long contiene un insieme di possibili valori più grande rispetto al tipo int e quest'ultimo contiene un insieme di possibili valori più grande rispetto al tipo short, dato che i valori di tipo long sono rappresentati con 64 bit, quelli di tipo int con 32 bit e quelli di tipo short con 16 bit. I valori di tipo float e double si rappresentano come numeri con la virgola (la notazione è americana, ovvero viene utilizzato il punto per separare le cifre intere da quelle decimali). Ancora una volta, il tipo double contiene un insieme di possibili valori più grande rispetto al tipo float, perché i suoi valori si rappresentano utilizzando un numero superiore di bit. I valori di tipo char si rappresentano scrivendo un carattere alfanumerico tra apice singolo. I valori di tipo boolean si rappresentano scrivendo le parole true e false senza alcuna virgoletta o apice (attenzione: la differenza tra maiuscole e minuscole in Java è sempre importante; True non è un valore booleano, true si). I valori di tipo String si rappresentano scrivendo sequenze di caratteri tra virgolette (o apici doppi). Esempi di definizioni di variabili int x = 5; short pippo = 5; long y = 5; float numero = 5.3; double ciao = 5.3; char ilmiocarattere = 'w'; boolean b = true; String s = "Ciao a tutti, come va questa lezione di informatica?"; Oltre ai valori costanti, per ogni tipo di dato si possono avere valori dati dal risultato di una espressione più complessa, come risulterà chiaro dopo la lettura del prossimo paragrafo. Oltre a definire le variabili come negli esempi qui sopra, si può anche: Definire una variabile senza assegnarle (immediatamente) un valore. Ad esempio, una definizione come: int n; 9

10 definisce una variable intera senza alcun valore (si può immaginare che le celle di memoria riservate per questa variabile vengano lasciate vuote). In questo caso si dice che la variabile è stata dichiarata, ma non inizializzata. In alcuni casi, è utile dichiarare una variabile senza assegnarle immediatamente un valore, ma è bene tenere presente che il linguaggio Java non consente (per fortuna!) l'utilizzo di una variabile se prima non le è stato assegnato un valore. Inoltre il linguaggio Java vieta l'uso di una variabile se prima non è stata inizializzata. Morale: non usate mai variabili senza dichiararle e inizializzarle (l'inizializzazione può essere fatta al momento della dichiarazione o successivamente, ma sempre prima del loro primo utilizzo). In seguito vedremo come sia possibile assegnare un valore a una variabile che è stata definita precedentemente, oppure cambiare il valore di una variabile, tramite il cosiddetto comando di assegnamento. Definire più variabili "in un colpo solo". Una definizione come: int x, y, z; è assolutamente equivalente alla sequenza di definizioni: int x; int y; int z; 10

11 Espressioni Le principali espressioni in Java sono le espressioni aritmetiche, le espressioni relazionali, le espressioni logiche e le espressioni su stringhe. Esse vengono trattate separatamente qua sotto. Espressioni aritmetiche La definizione di queste espressioni è data dai seguenti punti: Un numero è una espressione aritmetica. Se A e B sono espressioni aritmetiche, allora: - A+B (addizione) - A-B (sottrazione) - A/B (divisione) - A*B (moltiplicazione) - A%B (modulo o resto della divisione intera) sono espressioni aritmetiche. Se A è un'espressione aritmetica, allora anche (A) è un'espressione aritmetica. Esempio di espressione aritmetica: (5+7)*3+2 Precedenza degli operatori aritmetici: gli operatori * e / hanno la precedenza rispetto a + e -. Questo significa che * e / vengono eseguiti prima di + e - indipendentemente dalla posizione in cui si trovano nell'espressione. Esempio: * 2 restituisce come risultato 19 in altri termini, prima viene calcolato 7*2 e poi il risultato viene sommato a 5. Per cambiare la precedenza degli operatori si possono usare le parentesi. Esempio: ( ) * 2 restituisce come risultato 24 in altri termini, prima viene calcolato 5+7 e poi il risultato viene moltiplicato per 2. 11

12 Espressioni relazionali La definizione di queste espressioni è data dai seguenti punti: Se A e B sono espressioni aritmetiche, allora: - A == B (uguale) - A > B (maggiore) - A < B (minore) - A >= B (maggiore o uguale) - A <= B (minore o uguale) - A!= B (diverso) sono espressioni relazionali. Se A è un'espressione relazionale, allora anche (A) è un'espressione relazionale. Si noti il fatto che le espressioni relazionali restituiscono sempre come risultato un valore di tipo boolean. Esempi di espressioni relazionali: 5 == 8 il risultato è false (o "è falsa" o "vale false") perché 5 non è uguale a 8 5 == 5 vale true 3+4 > 2+1 vale true perché 7 è maggiore di 3 5 >= 5 vale true 5 >= 8 vale false 5 >= 3 vale true Espressioni Logiche La definizione di queste espressioni è data dai seguenti punti: true e false sono espressioni logiche. Se A è un'espressione relazionale, allora A è anche un'espressione logica. Se A e B sono espressioni logiche, allora: -!A (negazione logica) - A & B (and logico) - A B (or logico) - A && B (and logico ottimizzato) - A B (or logico ottimizzato) sono espressioni logiche. Se A è un'espressione logica, allora anche (A) è un'espressione logica. 12

13 Il valore restituito come risultato da un'espressione logica è un valore di tipo boolean. Questo valore può essere sempre calcolato in funzione dei valori di A e B grazie all'uso delle cosiddette tabelle di verità. Le tabelle di verità della negazione logica, dell'and logico e dell'or logico sono riportate brevemente qua sotto: A!A true false false true A B A & B true true true true false false false true false false false false A B A B true true true true false true false true true false false false 13

14 Esempi di espressioni logiche (4 > 3) & (2 > 1) vale false (7+1 > 2+2) (8+1 > 100) vale true true & (4 < 1) vale false Differenza tra gli operatori & ed &&: A & B valuta le espressioni A e B e ne calcola l'and logico A && B valuta l'espressione A; se il valore di A è uguale a false, allora l'espressione B non viene valutata ma viene restituito direttamente il valore false come risultato. In caso contrario, viene valutata l'espressione B e viene restituito l'and logico tra A e B. E' chiaro che il risultato restituito da A && B è sempre uguale a quello restituito da A & B, ma valutare A && B è meno costoso che valutare A & B. Nel caso in cui l'espressione B sia molto complessa, questa differenza di efficienza può essere significativa! Morale: se non si hanno validi motivi per valutare anche l'espressione a destra dell'operatore, usare sempre && quando si vuole eseguire un and logico. Esempio: (4 < 3) && ((5 <= 9) (7%6 == 1) &...) L'espressione (4 < 3) è falsa, quindi tutto il resto dell'espressione non è calcolata, ma viene restituito immediatamente il valore false. Differenza tra gli operatori ed : A B valuta le espressioni A e B e ne calcola l'or logico A B valuta l'espressione A; se il valore di A è uguale a true, allora l'espressione B non viene valutata ma viene restituito direttamente il valore true come risultato. In caso contrario, viene valutata l'espressione B e viene restituito l'or logico tra A e B. Ancora una volta, è chiaro che il risultato restituito da A B è sempre uguale a quello restituito da A B, ma valutare A B è meno costoso che valutare A B. Morale: se non si hanno validi motivi per valutare anche l'espressione a destra dell'operatore, usare sempre quando si vuole eseguire un or logico. 14

15 Espressioni su stringhe Le espressioni che possono essere formate un Java utilizzando le stringhe sono molte e non è scopo di questo corso una analisi esaustiva di ognuna di esse. Ci limiteremo a trattare le espressioni formate da concatenazione di stringhe: se A e B sono due stringhe, allora A+B è una stringa formata dalla concatenazione delle stringhe A e B. La concatenazione tra due stringhe A e B è semplicemente una sequenza formata da tutti i caratteri che compongono A seguiti da tutti i caratteri che compongono B (senza alcun carattere di separazione). Esempio: "buon" + "Giorno" è una espressione che restituisce come risultato la stringa "buongiorno". Nota: se uno solo degli operandi dell'operatore + è una stringa, allora l'altro operando viene trasformato in una stringa e successivamente viene eseguita l'operazione di concatenazione. Ad esempio: String s = "ciao" + 4; alla fine di questo comando, il valore della stringa s è "ciao4". 15

16 Definizione di variabile Adesso siamo pronti a definire in modo più preciso la sintassi della definizione di una variabile all'interno di un programma Java: [<modificatore>] <tipo T> <identificatore> = <espressione di tipo T> ; Si osservi che con questa notazione per definire la sintassi, tutto ciò che è racchiuso tra i simboli e è inteso come "opzionale" (ovvero può essere o non essere presente nel codice). Inoltre, si noti che: Un modificatore è una tra le parole chiave di Java public, private, static, ecc.... I modificatori verranno introdotti nella parte finale del corso e per adesso non verranno utilizzati. L'espressione che compare alla sinistra del simbolo di uguaglianza deve essere dello stesso tipo rispetto a quello dichiarato a sinistra del nome della variabile. Il simbolo ; è obbligatorio alla fine di una dichiarazione di variabile, come alla fine di ogni comando Java (separatore di comandi). Esempi di definizioni di variabili corrette: boolean variabilelogica = (5>4) & (3<10) & true; int x = 5+9*8+2; double pippo = 10/3; Esempi di definizioni errate: boolean ciao = 10*4; double x = (5 == 3); 16

17 Esempio di programma Java che utilizza variabili ed espressioni: class Esercizio { public static void main (String[] args) { int x = 5; int y = 3; int somma; somma = x + y; System.out.println("La somma è: " + somma); Si cerchi di capire nei minimi dettagli il funzionamento di questo programma. Nota: Come già detto, l'operatore + in Java ha un significato diverso a seconda del tipo di dato dei suoi operandi: se entrambi gli operandi sono di tipo numerico, + è l'operazione aritmetica di somma. se almeno uno dei due operandi è una stringa, + è l'operatore di concatenazione tra stringhe. Quindi: 5+4 è una espressione di tipo intero il cui risultato è 9 "5"+4 è una espressione di tipo stringa il cui risultato è "54" 4+"5" è una espressione di tipo stringa il cui risultato è "54" "4"+"5" è una espressione di tipo stringa il cui risultato è "54" Gli ultimi tre risultati sono valori di tipo String e non hanno nulla a che vedere con il numero 54! Cercare di capire bene questi concetti prima di proseguire con la lettura. 17

18 3. Interazione con l'utente Un programma Java può interagire con il mondo esterno tramite la classe SavitchIn. Ad esempio, tramite questa classe è possibile fare in modo che sia l'utilizzatore del programma (e non il programmatore!) a settare il valore di alcune variabili. Ad esempio, si consideri la seguente definizione di variabile: int n = SavitchIn.readLineInt(); al momento dell'esecuzione di questa linea di codice, l'interprete di Java di arresta ed aspetta che l'utilizzatore scriva un numero intero e prema il tasto return. Una volta che l'utilizzatore preme il tasto return, tutto ciò che è stato scritto precedentemente è interpretato come il valore della variabile n e l'esecuzione del programma continua (si noti che se l'utilizzatore scrive un valore di un tipo diverso dal tipo int, l'esecuzione del programma si blocca e viene segnalato un errore). Esempio Il seguente programma esegue la somma di due numeri digitati dall'utilizzatore: class Esercizio { public static void main (String [] args) { int x; int y; System.out.println("Scrivi il primo numero: "); x = SavitchIn.readLineInt(); System.out.println("Scrivi il secondo numero: "); y = SavitchIn.readLineInt(); int somma = x + y; System.out.println("Somma dei numeri che hai scritto = " + somma); Compilare ed eseguire questo programma per capirne il comportamento. Cercare di capire questo programma nei minimi dettagli prima di proseguire. Si noti che è impossibile scrivere un programma che esegue la somma di due numeri qualsiasi senza far uso delle variabili! La classe SavitchIn non è sempre installata su tutti i PC. In tal caso deve essere installata manualmente. La si può scaricare gratuitamente, ad esempio, dal sito: Altri metodi della classe SavitchIn: double x = SavitchIn.readLineDouble(); char c = SavitchIn.readLineChar(); String s = SavitchIn.readLineWord(); 18

19 4. Istruzione di Assegnamento E' l'istruzione che permette di modificare il valore di una variabile (o di assegnarle un valore per la prima volta, se esso non è già stato assegnato al momento della sua dichiarazione). Sintassi: <identificatore> = <espressione>; dove <espressione> deve restituire un valore dello stesso tipo di quello utilizzato al momento della dichiarazione di <identificatore> (altrimenti il compilatore di Java segnala un errore e si interrompe). Semantica: Si valuta l'espressione ottenendo, se la valutazione termina, un valore v. Il valore v viene scritto nella regione di memoria che è stata associata alla variabile al momento della sua dichiarazione. Un caso interessante: in Java (come nella maggior parte dei linguaggi di programmazione) è permesso l'utilizzo di una istruzione di assegnamento come la seguente: x = espressione(x) ; dove espressione(x) è una espressione che fa uso di x. Ad esempio, si può scrivere una istruzione come: x = x+1; Il significato è: Viene sommato 1 al vecchio valore di x. Il risultato viene scritto di nuovo nella regione di memoria associata a x. In generale: Viene valutata espressione(x) utilizzando il vecchio valore di x. Il risultato viene scritto di nuovo nella regione di memoria associata a x. Esempio class Esercizio { public static void main (String[] args) { int x; x=10; x=x+1; 19

20 x=x+2; x=x+10; Cercare di capire il funzionamento di questo programma. Qual'è il valore della variabile x alla fine dell'esecuzione? Nota: Il linguaggio Java consente anche la notazione: x++; che ha esattamente lo stesso significato di x=x+1; ma è (leggermente) più efficiente. Esempio: class Esercizio { public static void main (String[] args) { int x = 10; x++; x++; System.out.println(x); Che cosa stampa a video questo programma? Il linguaggio Java consente anche la notazione ++x; il risultato è sempre lo stesso, ma c'è un'importante differenza tra x++ e ++x. Per comprenderla, si considerino i seguenti esempi: Il frammento di codice: int x = 2; System.out.println((x++) == 3); System.out.println(x); stampa a video: false 3 Il frammento di codice: int x = 2; System.out.println((++x) == 3); System.out.println(x); stampa a video: 20

21 true 3 In altri termini, c'è una differenza tra x++ e ++x soltanto quando li si utilizza all'interno di una espressione relazionale: Nel caso di ++x prima si incrementa il valore di x e poi si valuta l'espressione relazionale. Nel caso di x++ prima si valuta l'espressione relazionale e poi si incrementa il valore di x. 21

22 Importanza dell'inizializzazione di una variabile Inizializzare una variabile significa assegnarle un valore per la prima volta da quando è stata dichiarata. Non si può utilizzare una variabile a destra del simbolo = in una istruzione di assegnamento se essa non è stata prima inizializzata (pena: errore del compilatore). Esempio: class Esercizio { public static void main (String[] args) { int x; int y; x = 5; int somma; somma = x+y; Il compilatore restituisce un errore quando si tenta di eseguire questo programma: y non è stata inizializzata (non ha un valore o, più correttamente, non ha un valore significativo). Importanza dei tipi di dato Non si può (quasi mai) assegnare ad una variabile di un tipo un valore di un altro tipo! (Pena: errore del compilatore). Esempio: class Esercizio { public static void main (String[] args) { String s = "ciao"; int x = 5; x = s; > Errore s = x; > Errore In questo caso, il programma restituisce un errore a tempo di compilazione perché i tipi int e String non sono compatibili. Una variabile di un tipo T1 può essere assegnata a un valore di tipo T2 se e solo se T1 e T2 sono tipi compatibili. Di seguito vengono trattate le regole per stabilire se due tipi di dato sono o meno compatibili. 22

23 Compatibilità dei Tipi di Dato Le regole per stabilire se due tipi di dato sono o meno compatibili (prendendo in considerazione solo i tipi di dato che sono stati considerati fin qui) sono le seguenti: I tipi numerici sono compatibili con gli altri tipi (String, char, boolean). String, char e boolean non sono compatibili tra di loro (per ogni loro permutazione). I tipi numerici possono essere compatibili tra di loro, con le seguenti regole: Vedendo un tipo di dato come un insieme, esistono le seguenti relazioni tra i tipi numerici in Java: short int long float double Un tipo numerico T1 è compatibile con un altro tipo numerico T2 (in altri termini un valore di tipo T1 può essere assegnato a una variabile di tipo T2) se e solo se: T1 T2 Esempio: double x; x = 1; Questo assegnamento è consentito perché int double. Il valore double "corrispondente" al valore intero 1 è 1.0. Esempio: int x; x = 1.5; Questo assegnamento NON è consentito in quanto non è vero che il tipo double è contenuto in int. Il valore double 1.5 NON ha un corrispettivo nel tipo int. Errore a tempo di compilazione. Esempio: int x = 5; double y = 7.3; double somma = x+y; Questo assegnamento è consentito; il risultato è un double: il valore intero di x viene prima trasformato nel suo corrispettivo nel tipo double e poi i due double vengono sommati. 23

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti Nascita di Java L uscita di Java, verso la metà degli anni novanta, fu accolta con molto entusiasmo dalla comunità dei programmatori e dei provider di servizi internet perché permetteva agli utenti del

Dettagli

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C Università di Roma Tre Facoltà di Scienze M.F.N. Corso di Laurea in Matematica Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C Marco Liverani (liverani@mat.uniroma3.it)

Dettagli

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C Università di Roma Tre Dipartimento di Matematica e Fisica Corso di Laurea in Matematica Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C Marco Liverani (liverani@mat.uniroma3.it)

Dettagli

Struttura di un programma Java

Struttura di un programma Java Struttura di un programma Java Un programma in Java è un insieme di dichiarazioni di classi. Una classe non può contenere direttamente delle istruzioni, ma può contenere la dichiarazione di metodi, che

Dettagli

Richiesta pagina PHP (es: index.php)

Richiesta pagina PHP (es: index.php) PHP PHP = personal home page SERVER Richiesta pagina PHP (es: index.php) Server Web (Apache) in ascolto sulla porta 80, si accorge che la pagina richiesta è una pagina PHP in base all'estensione o con

Dettagli

Le variabili. Olga Scotti

Le variabili. Olga Scotti Le variabili Olga Scotti Cos è una variabile Le variabili, in un linguaggio di programmazione, sono dei contenitori. Possono essere riempiti con un valore che poi può essere riletto oppure sostituito.

Dettagli

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica Fondamenti di Informatica Algebra di Boole: Concetti di base Fondamenti di Informatica - D. Talia - UNICAL 1 Algebra di Boole E un algebra basata su tre operazioni logiche OR AND NOT Ed operandi che possono

Dettagli

Rappresentazione delle informazioni

Rappresentazione delle informazioni Rappresentazione delle informazioni Rappresentazione delle informazioni L informatica si occupa di rappresentare ed elaborare informazioni diverse: numeri caratteri audio immagini video I caratteri: ASCII

Dettagli

Connessione ad internet

Connessione ad internet Introduzione al C++ Connessione ad internet Istruzioni per la connessione internet: - una volta connessi, aprire un browser (firefox) - in Modifica/preferenze/avanzate/rete/impostazioni - attivare la modalità

Dettagli

Programmare in Java. Olga Scotti

Programmare in Java. Olga Scotti Programmare in Java Olga Scotti Linguaggi di programmazione linguaggio macchina assembler linguaggi ad alto livello Linguaggi ad alto livello istruzioni comprensibili linguaggio simile a quello naturale

Dettagli

Variabili e tipi di dato

Variabili e tipi di dato Variabili e tipi di dato Tutte le variabili devono essere dichiarate, specificandone il tipo La dichiarazione deve precedere l uso Il tipo è un concetto astratto che esprime: L allocazione di spazio per

Dettagli

Libreria standard Java possiede un enorme libreria di classi standard organizzata in vari package che raccolgono le classi secondo un organizzazione

Libreria standard Java possiede un enorme libreria di classi standard organizzata in vari package che raccolgono le classi secondo un organizzazione Libreria standard Java possiede un enorme libreria di classi standard organizzata in vari package che raccolgono le classi secondo un organizzazione basata sul campo d utilizzo. I principali package sono:

Dettagli

La velocità di una carovana

La velocità di una carovana Programmazione A.A. 2002-03 I linguaggio Java ( Lezione X, Parte I ) Il primo programma Prof. Giovanni Gallo Dr. Gianluca Cincotti Dipartimento di Matematica e Informatica Università di Catania e-mail

Dettagli

int a = 4; int b = 5; int c = a + b;

int a = 4; int b = 5; int c = a + b; Lezione 5 Operatori ed espressioni Caricare i dati in memoria non è l'unica operazione necessaria per trattare le informazioni. Bisogna intervenire sui valori conservati, esaminandoli, combinandoli e rendendoli

Dettagli

Laboratorio di Informatica

Laboratorio di Informatica Laboratorio di Informatica Introduzione a Python Dottore Paolo Parisen Toldin - parisent@cs.unibo.it Argomenti trattati Che cosa è python Variabili Assegnazione Condizionale Iterazione in una lista di

Dettagli

3. La sintassi di Java

3. La sintassi di Java pag.9 3. La sintassi di Java 3.1 I tipi di dati statici In Java, come in Pascal, esistono tipi di dati statici predefiniti e sono i seguenti: byte 8 bit da -128 a 127 short 16 bit coincide con l integer

Dettagli

Corso Base. Liceo Norberto Rosa Bussoleno Prof. Angelo GIORGIO

Corso Base. Liceo Norberto Rosa Bussoleno Prof. Angelo GIORGIO Corso Base Liceo Norberto Rosa Bussoleno Prof. Angelo GIORGIO Java Java è un Linguaggio di Programmazione orientato agli oggetti. Un Linguaggio di Programmazione è un linguaggio ad alto livello, dotato

Dettagli

JAVASCRIPT. Tale file è associato alla pagina web mediante il tag