Sei sulla pagina 1di 154

Metodologie di Programmazione: Introduzione

Roberto Navigli
Creiamo software con la programmazione!

Metodologie di Programmazione 28/02/2020 2


Roberto Navigli
Metodologie di Programmazione 28/02/2020 3
Roberto Navigli
Metodologie di Programmazione 28/02/2020 4
Roberto Navigli
Metodologie di Programmazione 28/02/2020 5
Roberto Navigli
Informazioni sul Corso (Canale M-Z, ma...)
• Docenti: Roberto Navigli (+ Giuseppe Pirrò)
– Stanza: G24 (viale Regina Elena, 295, pal. G, secondo piano)
– Ricevimento: dopo le lezioni e su appuntamento
• Crediti: 9
• Organizzazione:
– Quando: 24 febbraio-29 maggio 2020
• lunedì ore 8.00-10.00, venerdì 8.00-11.00 aula Cabibbo
• mercoledì ore 12-16 (aule 15-16 lab AST via Tiburtina, 205)
– URL: http://naviglimetodologie.blogspot.com
– Comunicazioni: iscrivetevi al gruppo Facebook del corso:
fortemente consigliato (quasi necessario)!
– Valutazione:
• 60% scritto; 40% progetto
• Lo scritto può essere sostituito da 4 prove intermedie (ci torniamo dopo)
• Soglia minima: 18/30 in ciascuna prova, tranne una delle quattro prove

Metodologie di Programmazione 28/02/2020 10


Roberto Navigli
Il gruppo FB è accessibile dal blog del corso

Metodologie di Programmazione 28/02/2020 11


Roberto Navigli
Metodologie di Programmazione 28/02/2020 12
Roberto Navigli
Docente
• Professore Ordinario presso il Dipartimento di Informatica
(Sapienza)
• Home page: http://wwwusers.di.uniroma1.it/~navigli
• Email: navigli@di.uniroma1.it

Metodologie di Programmazione 28/02/2020 13


Roberto Navigli
Metodologie di Programmazione 28/02/2020 17
Roberto Navigli
Quando scrivere una mail al vostro docente:
quali sono le due variabili principali?

probabilità
di risposta

lunghezza orario

Metodologie di Programmazione 28/02/2020 18


Roberto Navigli
Che cosa fa il vostro docente quando non insegna

• Provate a indovinare…

Metodologie di Programmazione 28/02/2020 20


Roberto Navigli
Che cosa fa il vostro docente quando non insegna

• Ricerca!
– Intelligenza Artificiale
– Elaborazione del linguaggio naturale/Linguistica computazionale

Metodologie di Programmazione 28/02/2020 21


Roberto Navigli
Il primo ricercatore italiano a vincere
un ERC Starting Grant in informatica
• 1.3 Meuro per un singolo progetto gestito da un singolo
ricercatore!
• Tra 2 e 3 volte il totale dei finanziamenti del Ministero
dell’Istruzione, Università e Ricerca concesso a tutti del
TUTTI i dipartimenti di informatica in Italia negli ultimi 2
anni

Metodologie di Programmazione 28/02/2020 22


Roberto Navigli
Nel 2016 ne ho vinto un secondo: ERC Consolidator
Grant!!!
• Uno dei pochi ricercatori europei ad aver vinto due
grant ERC (totale: 2.8 milioni di euro!)

Metodologie di Programmazione 28/02/2020 23


Roberto Navigli
Language Understanding
cum Knowledge Yield

NLP: Work at the Sapienza University of Rome 28/02/2020 Pagina 24


I computer sono intelligenti?

Metodologie di Programmazione 28/02/2020 25


Roberto Navigli
Metodologie di Programmazione 28/02/2020 26
Roberto Navigli
Di quale conoscenza ha bisogno HAL 9000?

• HAL (Heuristically programmed ALgorithmic


sintassi
computer) fonetica

Dave Bowman: Pronto, HAL. Mi ricevi, HAL? semantica


HAL: Affermativo, David. Ti ricevo.
Dave Bowman: Apri la saracinesca esterna, HAL. discorso
HAL: Mi dispiace, Dave. Purtroppo non posso farlo.
Dave Bowman: Qual è il motivo?
HAL: Credo che tu lo sappia altrettanto bene quanto me.
Dave Bowman: Ma di che diavolo parli?
HAL: Questa macchina è troppo importante per me per lasciare
pragmatica
che tu la manometta.
Dave Bowman: Non so a cosa ti riferisci, HAL.
HAL: Io so che tu e Frank avevate deciso di scollegarmi e
purtroppo non posso permettere che questo accada morfologia

Metodologie di Programmazione 28/02/2020 27


Roberto Navigli
Metodologie di Programmazione 28/02/2020 28
Roberto Navigli
BabelNet is our biggest success

• Well-known worldwide (800+ universities!)


• Continuously updated
• Most cited 2012 paper in Artificial Intelligence!
• Attracted the attention of the EU:

NLP: Work at the Sapienza University of Rome 28/02/2020 Pagina 30


BabelNet is our biggest success

• Well-known worldwide (800+ universities!)


• Continuously updated
• Most cited 2012 paper in Artificial Intelligence!
• Attracted the attention of the EU
– Workshop organized by EU Parliament, Commission &
Publications Office
– Appeared in TIME magazine!

NLP: Work at the Sapienza University of Rome 28/02/2020 Pagina 31


Abbiamo creato Babelscape

• Una startup Sapienza ipertecnologica


• Un ambiente ideale per sviluppare idee innovative
• Dare spazio a studenti di ogni livello

Metodologie di Programmazione 28/02/2020 32


Roberto Navigli
Metodologie di Programmazione 28/02/2020 33
Roberto Navigli
“Stay hungry, stay foolish” – Think different

Metodologie di Programmazione 28/02/2020 37


Roberto Navigli
Che cosa pensano gli studenti degli anni precedenti

• “Salve professore, volevo semplicemente


ringraziarla per il corso da lei tenuto, ma non mi
sembrava il caso di farlo ieri davanti ad altri miei
colleghi. La prego di non prenderla come un
atteggiamento da "lecchino" perché mai lo sono
stato, e mai lo sarò, però le dico GRAZIE per
averci davvero insegnato qualcosa. Continui ad
insegnare con la stessa passione, renderà
entusiasti tutti gli studenti dei suoi futuri corsi.
[…] In bocca al lupo per i suoi progetti futuri. Sentiti
saluti.”

Metodologie di Programmazione 28/02/2020 38


Roberto Navigli
Obiettivi del corso (1)

• Fornire i concetti fondamentali della programmazione


orientata agli oggetti
• Fornire strumenti e metodologie di base per la
progettazione del software
• Usando:

• Se studierete, alla fine di questo corso avrete gli


strumenti per sviluppare e in parte progettare un
software di medie dimensioni
Metodologie di Programmazione 28/02/2020 39
Roberto Navigli
Obiettivi del corso (2)

• Così come facciamo (tutti?) con lo sport:

Metodologie di Programmazione 28/02/2020 40


Roberto Navigli
Obiettivi del corso (2)

• Allenare il nostro cervello ad affrontare e risolvere


problemi di programmazione e progettazione del
software:

• E' quasi impossibile superare questo corso senza fare


esercizi settimanalmente
• La programmazione non si impara in due settimane di
"chiusa" durante la sessione d'esami
Metodologie di Programmazione 28/02/2020 41
Roberto Navigli
Obiettivi del corso (3)

• Fornire le basi per:


– Corsi più avanzati
– Tirocinio e tesi di laurea!
– Iniziare ad affrontare un colloquio con big player
come Google, Facebook, Amazon, ecc.
– Lavoro in azienda
– Lavoro di ricerca

Metodologie di Programmazione 28/02/2020 42


Roberto Navigli
Costo di un corso di Java

• Privatamente: dai 1000 ai 3000 euro e oltre

Metodologie di Programmazione 28/02/2020 43


Roberto Navigli
Metodologie di Programmazione 28/02/2020 44
Roberto Navigli
Metodologie di Programmazione 28/02/2020 45
Roberto Navigli
Perché io so
programmare!
Metodologie di Programmazione 28/02/2020 46
Roberto Navigli
Materiale
• Oltre al blog (che include l’accesso alle diapositive)
– http://naviglimetodologie.blogspot.it
• Testi consigliati:
Herbert Schildt, Java: The Complete Reference, 11a edizione, Oracle Press.

• Cay S. Horstmann, Concetti di informatica e fondamenti di Java


• Magggioli Editore, 2020

Claudio De Sio Cesari, Manuale di Java 9. Hoepli, 2018

• Se avete dubbi, stackoverflow, stackoverflow, stackoverflow

Metodologie di Programmazione 28/02/2020 47


Roberto Navigli
Per i perfezionisti (ma anche non):
Effective Java, third edition
• La bibbia delle cose da
fare e da non fare
• Aggiornato a Java 9
(uscito a fine dicembre
2017!)

Metodologie di Programmazione 28/02/2020 48


Roberto Navigli
Registratevi mediante il modulo di iscrizione!!!
http://naviglimetodologie.blogspot.it

Metodologie di Programmazione 28/02/2020 49


Roberto Navigli
Mettiamoci alla prova!
• Scrivere una funzione Python che, date in input 2 liste di
l1 e l2, restituisca una lista della lunghezza maggiore tra
le due e in cui ogni elemento è la somma dei due
elementi nelle posizioni corrispondenti delle due liste
– Se una delle due liste è più lunga, le somme degli elementi
saranno effettuate immaginando che le liste siano replicate
all’infinito

Metodologie di Programmazione 28/02/2020 50


Roberto Navigli
Modalità d’esame
• Prova scritta: potrà essere sostituita da 4 prove intermedie (di cui 1 a
sorpresa, una durante le prove intermedie, una a casa e 1 da
svolgere durante la prima sessione d'esame)
– Almeno 3 su 4 delle prove di "esonero" devono essere superate con
almeno 18/30.
• Progetto: Le specifiche del progetto saranno rese disponibili entro
marzo
– Può essere svolto individualmente o da un gruppo di al più 2 studenti (difficoltà
crescente per 2)
– Il superamento del progetto richiede, oltre alla consegna di ciò che è richiesto dalle
specifiche, anche una discussione individuale del progetto
– Il voto dipende sia dal materiale consegnato che dalla discussione orale.
– Se ci sono significativi indizi che portano a credere che il progetto consegnato sia
stato copiato in tutto o in parte, il progetto è considerato nullo
• Voto finale: 60% del voto dello scritto + 40% del voto del progetto

Metodologie di Programmazione 28/02/2020 51


Roberto Navigli
Come sono andati gli studenti all'esonero 2014/2015?

Punto di non ritorno!

• Uno studente allo scritto di gennaio e uno a quello di


febbraio!!!
Metodologie di Programmazione 28/02/2020 52
Roberto Navigli
Esercizi bonus
• Durante il semestre vi darò alcuni esercizi
bonus per incrementare i punteggi dei
vostri esoneri
• Gli esercizi non saranno obbligatori
• Tuttavia se copiate…

Metodologie di Programmazione 28/02/2020 53


Roberto Navigli
Sul progetto
• Progetto base: dopo…
• Progetto “segreto”!
– accessibile solo a chi prende ≥ 27 nel primo E nel secondo
esonero in alternativa (non obbligatoria) al progetto base
– possibile solo se completato entro l'appello di settembre

Metodologie di Programmazione 28/02/2020 54


Roberto Navigli
Metodologie di Programmazione 28/02/2020 55
Roberto Navigli
A game without purpose – Federico Scozzafava

Metodologie di Programmazione 28/02/2020 56


Roberto Navigli
Minesweeper – Carlo Innamorati e Domenico Toscani

Metodologie di Programmazione 28/02/2020 57


Roberto Navigli
An RPG with a purpose – Domenico Toscani (Tirocinio)

Videogiochi, reti semantiche e IA 28/02/2020 58


Roberto Navigli
Videogiochi, reti semantiche e IA 28/02/2020 59
Roberto Navigli
Videogiochi, reti semantiche e IA 28/02/2020 60
Roberto Navigli
Videogiochi, reti semantiche e IA 28/02/2020 61
Roberto Navigli
Videogiochi, reti semantiche e IA 28/02/2020 62
Roberto Navigli
BabelTag: a Web and smartphone word game!

BabelNet, Babelfy and Beyond 28/02/2020 64


Roberto Navigli
BabelTag: a Web and smartphone word game!

BabelNet, Babelfy and Beyond 28/02/2020 65


Roberto Navigli
BabelTag: "amuse-toi avec ta langue" *GRATIS*

BabelNet, Babelfy and Beyond 28/02/2020 66


Roberto Navigli
Progetti 2016: La "mia rete neurale" e Crucy

Metodologie di Programmazione 28/02/2020 67


Roberto Navigli
Progetto 2017: il curiosone (http://lcl.uniroma1.it/curiosone)

Metodologie di Programmazione 28/02/2020 69


Roberto Navigli
Qual è il progetto segreto?

Metodologie di Programmazione 28/02/2020 70


Roberto Navigli
non posso ancora
svelarlo!

Metodologie di Programmazione 28/02/2020 71


Roberto Navigli
Domande

• L’interazione è fondamentale (altrimenti non saremmo qui)


• Magari non sei l’unico/a ad avere una domanda e ad avere
timore di chiedere
• Meglio fare una domanda che rimanere con un dubbio!

Metodologie di Programmazione 28/02/2020 81


Roberto Navigli
Ci sono
domande?
Metodologie di Programmazione 28/02/2020 82
Roberto Navigli
Qualche anno fa sapevate guidare?

Metodologie di Programmazione 28/02/2020 83


Roberto Navigli
Qualche anno fa sapevate guidare?

E adesso???

Metodologie di Programmazione 28/02/2020 84


Roberto Navigli
La base dell’istruzione nel Novecento

• Leggere

• Scrivere

• Far di conto (matematica)

Metodologie di Programmazione 28/02/2020 85


Roberto Navigli
La base dell’istruzione nel Duemila

• Leggere

• Scrivere

• Far di calcolo (matematica & informatica)

Metodologie di Programmazione 28/02/2020 86


Roberto Navigli
Ma che cosa pensa un utente medio della
programmazione?

Metodologie di Programmazione 28/02/2020 87


Roberto Navigli
Ma tu stai studiando per diventare un informatico!

• Non un mero utilizzatore di computer!

Metodologie di Programmazione 28/02/2020 88


Roberto Navigli
Lo Yoga della Programmazione

• Scrivere un programma (a oggetti) è (deve essere)


un’esperienza naturale, appagante e creativa

• Come per la scrittura in prosa, puoi continuamente


migliorare e raffinare la capacità di programmare nel
tempo

Metodologie di Programmazione 28/02/2020 89


Roberto Navigli
Molto più semplice che apprendere una lingua straniera

• Poche parole chiave da imparare (vs. migliaia di parole)


• Portabilità del bagaglio: la maggior parte di ciò che
imparate in Java, potete applicarlo in Python, C, in C++
o nella maggior parte degli altri linguaggi di
programmazione
• Come vi sentite in un paese straniero senza poter
parlare correttamente?
• E’ fondamentale apprendere a programmare (a oggetti),
non (solo) apprendere Java:
– sapere quali dettagli sono rilevanti in quale situazione
– modellare la realtà mediante l’utilizzo di oggetti
– astrarre e generalizzare per poter riutilizzare

Metodologie di Programmazione 28/02/2020 90


Roberto Navigli
Anteprima su ciò che vedremo nei prossimi 3 mesi

Metodologie di Programmazione 28/02/2020 91


Roberto Navigli
Da dove venite…

• Paradigma di programmazione procedurale visto


attraverso il linguaggio Python (o C)
• Un tipo di programmazione imperativa in cui il
programma è costituito da una o più procedure
(funzioni)
• Tipi di base, costanti, espressioni, variabili, operatori,
istruzioni di selezione (if) e iterative (for, while, do),
array, funzioni, ricorsione, strutture, stringhe, puntatori,
input/output, ecc.

Metodologie di Programmazione 28/02/2020 92


Roberto Navigli
Dove stiamo andando (1): grado di astrazione

• Portare il grado di astrazione al prossimo livello:


– In fondo anche il linguaggio C aumenta il grado di astrazione
del linguaggio assembly (mov eax, ebx; jmp 0x00a30f0e)
– Che a sua volta aumenta quello del linguaggio macchina
(0100111001110111)
• La programmazione orientata agli oggetti fornisce nuovi
strumenti per rappresentare elementi nello spazio del
problema (qualsiasi esso sia!)
– Gli elementi sono chiamati oggetti
– Puoi descrivere il problema in termini del problema, non in
termini del computer su cui gira il programma

Metodologie di Programmazione 28/02/2020 93


Roberto Navigli
Tutto è un oggetto

• Un oggetto è un po’ come un piccolo computer


– Ha uno stato
– Puoi “farci delle cose” (= ha delle operazioni che puoi chiedergli
di eseguire)
• Esempio:
– Modellare una lampadina in una stanza
• Stato: accesa vs. spenta
• Operazioni: collega, scollega

Metodologie di Programmazione 28/02/2020 94


Roberto Navigli
Tutto è un oggetto

• Un oggetto è un po’ come un piccolo computer


– Ha uno stato
– Puoi “farci delle cose” (= ha delle operazioni che puoi chiedergli
di eseguire)
• Esempio:
– Modellare una lampadina in una stanza
– Modellare un personaggio in un ambiente simulato:

Metodologie di Programmazione 28/02/2020 95


Roberto Navigli
Un programma è una collezione di oggetti

• Per effettuare una richiesta a un oggetto, si invia un


messaggio a quell’oggetto
• Un messaggio è una richiesta di chiamata a una
funzione (metodo) che appartiene a un particolare
oggetto

collega()
scollega()

Metodologie di Programmazione 28/02/2020 96


Roberto Navigli
Ogni oggetto ha una propria memoria “fatta” di altri
oggetti (incapsulamento e information hiding)
• Un nuovo tipo di oggetto può essere creato utilizzando
oggetti esistenti
• Un programma può nascondere la sua complessità
mediante la semplicità degli oggetti

Metodologie di Programmazione 28/02/2020 97


Roberto Navigli
Ogni oggetto ha un suo tipo (detto classe)

• Ogni oggetto è istanza di una classe


• La classe è identificata dai messaggi (metodi) che essa
possiede
• Tutti gli oggetti di uno stesso tipo possono ricevere gli
stessi messaggi
PersonaggioDisney
classe
parla();
faPasticci();
dormi();
mangia();
oggetti

Metodologie di Programmazione 28/02/2020 98


Roberto Navigli
Ereditarietà

• Vogliamo evitare di ricreare nuove classi di oggetti


quando esse hanno funzionalità simili

Forma
superclasse
disegna();
cancella();

classi

Cerchio Triangolo Rettangolo oggetti

Metodologie di Programmazione 28/02/2020 99


Roberto Navigli
Polimorfismo

• E’ possibile utilizzare la classe base, senza dover


conoscere necessariamente la classe specifica di un
oggetto
• Permette di scrivere codice che non dipende dalla
classe specifica
• Posso aggiungere nuove sottoclassi anche in seguito!
• Ad esempio, una ImmagineVettoriale è una collezione
di oggetti di tipo Forma in determinate posizioni:

Metodologie di Programmazione 28/02/2020 100


Roberto Navigli
Perché Java come linguaggio di riferimento
• Un linguaggio di programmazione potente, orientato agli
oggetti
– Creato da James Gosling e altri informatici di Sun Microsystems
(ora Oracle)
• Relativamente recente (1995) – Python risale al 1991!
– Precursori: Smalltalk (fine ‘70), C++ (inizio ‘80)
• Costruito per essere “sicuro”, cross-platform e
internazionale
• Continuamente aggiornato con nuove feature e librerie
– Concorrenza
– Accesso alle basi di dati
– Programmazione di rete
– Calcolo distribuito
• Portabile: “WORA” (write once, run anywhere)
Metodologie di Programmazione 28/02/2020 101
Roberto Navigli
2010:

Sei già un
drago in
Python, vero?

Metodologie di Programmazione 28/02/2020 102


Roberto Navigli
2017

Metodologie di Programmazione 28/02/2020 103


Roberto Navigli
Metodologie di Programmazione 28/02/2020 104
Roberto Navigli
Metodologie di Programmazione 28/02/2020 105
Roberto Navigli
Adozione su larghissima scala
• E' il linguaggio delle applicazioni di business
– ecommerce (eBay, Amazon)
– streaming (Netflix)
– portali
– finanza
– sistemi di scambio/commercio
– online banking / pagamenti online (paypal)
– telco
– assicurazioni
– Flickr, IMDB, Walmart, Linkedin e molti altri
• Google usa Java in gmail, Google+
• Android SDK usa Java come "cittadino di prima classe"
• Big data: Hadoop

Metodologie di Programmazione 28/02/2020 106


Roberto Navigli
Metodologie di Programmazione 28/02/2020 107
Roberto Navigli
Caratteristiche di Java (1)
• Indipendenza dalla piattaforma:
– Portabile: “WORA” (write once, run anywhere)
– Al contrario di linguaggi come il C o il C++ non viene compilato
su una macchina o piattaforma, ma nel bytecode di una
macchina virtuale – che è anche meglio!
– Neutro rispetto all’architettura sottostante (architecture-neutral)
• Sicurezza:
– Non permette manomissioni
– Le tecniche di autenticazione sono basate su codifiche con
chiavi pubbliche
• Robustezza:
– Situazioni tipiche d’errore vengono eliminate il più possibile a
tempo di compilazione
– Laddove non possibile, gestite a tempo di esecuzione con
appositi controlli
Metodologie di Programmazione 28/02/2020 108
Roberto Navigli
Caratteristiche di Java (2)

• Multithreaded:
– Supporta nativamente programmi che gestiscono attività
eseguite in contemporanea (thread)
– Facilita la costruzione di applicazioni interattive
• Interpretato e compilato:
– Il byte code è tradotto “al volo” in istruzioni macchina native
– Rende più veloce e snello il processo di sviluppo
• Alte prestazioni:
– Con l’uso dei compilatori Just-In-Time (JIT), le prestazioni sono
le stesse se non addirittura SUPERIORI del codice nativo

Metodologie di Programmazione 28/02/2020 109


Roberto Navigli
Caratteristiche di Java (3)

• Distribuito:
– Progettato per ambienti distribuiti come Internet
• Dinamico
– Si adatta a un ambiente in evoluzione
– Porta con sé parecchie informazioni a tempo di esecuzione per
verificare e risolvere gli accessi agli oggetti
• Enterprise, Web e Mobile
– E’ utilizzato a livello enterprise, web e mobile per applicazioni
robuste, solide, sicure e distribuite

Metodologie di Programmazione 28/02/2020 110


Roberto Navigli
Java: statistiche

• Dal sito http://www.java.com/en/about/

Metodologie di Programmazione 28/02/2020 111


Roberto Navigli
Interoperabilità con tutti i linguaggi JVM-based!

• Scala
• Kotlin
• Clojure
• Groovy
• JRuby
• Jython

O per cui esiste un'implementazione JVM-based:


• Javascript
• JScheme
• JIProlog
Metodologie di Programmazione 28/02/2020 112
Roberto Navigli
Il nuovo ciclo di vita delle versioni Java

• Versione open source (totalmente gratuita)


• Versione commerciale (gratuita per dev+test) – con supporto
• Sostanzialmente analoghe – mostly licensing
https://blog.jetbrains.com/idea/2018/09/using-java-11-in-production-important-things-to-know/

Metodologie di Programmazione 28/02/2020 113


Roberto Navigli
Da dove iniziare?

• Installiamo il JDK 13 (dal 17 marzo, JDK 14)


– https://www.java.com/it/download/
• Utilizziamo la REPL (Read-Eval-Print Loop) chiamata
jshell

Metodologie di Programmazione 28/02/2020 114


Roberto Navigli
Installiamo Eclipse

• Su eclipse.org e cliccando download

Metodologie di Programmazione 28/02/2020 115


Roberto Navigli
Tipi di dato di base (o primitivi)

Metodologie di Programmazione 28/02/2020 116


Roberto Navigli
Tipi di dato di base (o primitivi)

• I tipi di dati di base sono built-in, ovvero sono predefiniti


nel linguaggio
• E’ fondamentale essere a conoscenza di quali siano i tipi
di base e quali non lo siano
• Per ragioni di efficienza e di allocazione della memoria
• Un tipo di dati è un insieme di valori e di operazioni
definite su tali valori:
– Interi (es. 42)
– Reali (es. 42.5)
– Booleani (true o false)
– Caratteri (es. ‘a’)
– Stringhe (es. “questa non è una stringa”) – non è realmente
“primitivo”
Metodologie di Programmazione 28/02/2020 117
Roberto Navigli
Anteprima: che cosa potremo fare con i tipi primitivi?

Metodologie di Programmazione 28/02/2020 118


Roberto Navigli
Principali tipi di dato di base

Tipo Insieme di valori Operatori comuni Esempi di valori


int interi +-*/% 42 -12 21464642
double numeri in virgola mobile +-*/% 3.14 -2.5 5.01e23
boolean valori booleani && || ! true false
char caratteri +- ‘a’ ‘b’ ‘1’ ‘%’ ‘\n’
String sequenze di caratteri + “ciao” “3.6”

Non è
realmente
primitivo!

Metodologie di Programmazione 28/02/2020 119


Roberto Navigli
Tutti i tipi di dato built-in
il numero di atomi
nell’universo è
Tipo Intervallo nell’ordine di 1080… Dimensione
double parte intera: ±10308, parte frazionaria: circa 15 8 byte
cifre decimali significative – tutte le funzioni
matematiche usano i double
long -9223372036854775808…9223372036854775807 8 byte
int -2147483648…2147483647 4 byte
float parte intera: ±1038, parte frazionaria: circa 7 cifre 4 byte
decimali significative – compatto e veloce, utile per
smartphone e dispositivi con problemi di memoria
char Rappresenta tutti i caratteri codificati con Unicode 2 byte
short -32768…32767 2 byte
byte -128…127 1 byte
boolean solo due valori: true o false 1 byte

Metodologie di Programmazione 28/02/2020 120


Roberto Navigli
Review & Update: Variabili, dichiarazioni e assegnazioni

• Una variabile è un nome usato per riferirsi a un valore di


un tipo di dati (es. contatore)
• Una variabile è creata mediante una dichiarazione:

• Il valore viene assegnato a una variabile mediante una


assegnazione:

• Un’istruzione può includere una dichiarazione e una


assegnazione allo stesso tempo:

Metodologie di Programmazione 28/02/2020 121


Roberto Navigli
Rispetto a Python

• In Java siamo costretti a specificare il tipo della variabile


• Questo tipo non può più cambiare (ovvero è statico)
– Tuttavia esistono alcuni elementi di dinamicità (che vedremo più
in là)
• Non posso utilizzare una variabile senza prima
dichiararla
– NO: a = “stringa”;
– SI: String a = “stringa”;
• Non posso assegnare a una variabile tipi incompatibili
tra loro
– NO: int a = “stringa”;
– NO: String a = 50;
– SI: String a = “stringa”;
Metodologie di Programmazione 28/02/2020 122
Roberto Navigli
Review & Update: Variabili e identificatori (1)
• Il nome assegnato a una variabile è detto identificatore,
ovvero una sequenza di lettere, cifre, _ e $ la prima
delle quali non è una cifra
• Gli identificatori sono case-sensitive
• Non possono essere utilizzate alcune parole riservate
(es. public, static, int, double, ecc.)
• Si utilizza la notazione a cammello (Camel case)
• Le variabili devono avere un nome sensato

Metodologie di Programmazione 28/02/2020 123


Roberto Navigli
Review & Update: Variabili e identificatori (2)

k bufferFile
bufferFILE
contatoreIntero

MyInteger
int
unaVariabile

myInteger
PosizioneX

mia_variabile
POSIZIONEX
String

Metodologie di Programmazione 28/02/2020 124


Roberto Navigli
Assegnazioni e inizializzazione

• Alcuni esempi:

• Al momento della dichiarazione, il valore iniziale della


variabile non è definito! a b c
non def. non def.
5 non def.
5 15
5 15 20
17 15 20

Metodologie di Programmazione 28/02/2020 125


Roberto Navigli
Assegnazioni e inizializzazione

• Alcuni esempi:

• Al momento della dichiarazione, il valore iniziale della


variabile non è definito! a b c
non def. non def.
5 non def.
5 15
5 15 20
17 15 20

Metodologie di Programmazione 28/02/2020 126


Roberto Navigli
Review & Update: Letterali

• Un letterale è una rappresentazione a livello di codice


sorgente del valore di un tipo di dati
– 42 o -32 sono letterali per gli interi
– 3.14 è un letterale per i double
– true o false sono gli unici due letterali per il tipo booleano
– “Ciao, mondo” è un letterale per il tipo String

Metodologie di Programmazione 28/02/2020 127


Roberto Navigli
Distinguere tra costanti intere e in virgola mobile
• Interi:
– Le costanti di tipo int sono semplicemente numeri nell’intervallo
[-2, +2] miliardi circa
– Le costanti di tipo long vengono specificate con il suffisso l o L (ad
esempio, 1000000000000L)
• Numeri in virgola mobile:
– Le costanti di tipo double sono semplicemente numeri con la
virgola (punto)
– Le costanti di tipo float hanno il suffisso f o F (ad esempio, 10.5f)
• In tutti i casi si può utilizzare il trattino basso (_) per separare le
cifre (es. 100_000 per indicare 100000, 1_234 per indicare 1234
ecc.)
• Si può ottenere un intero da una rappresentazione binaria
anteponendo 0b alla stringa binaria (ad esempio, 0b101 vale 5)

Metodologie di Programmazione 28/02/2020 128


Roberto Navigli
Review & Update: Espressioni

Metodologie di Programmazione 28/02/2020 129


Roberto Navigli
Review & Update: Espressioni

• Un’espressione è un letterale, una variabile o una


sequenza di operazioni su letterali e/o variabili che
producono un valore
Operatori
• Esempio:

Operandi (ed espressioni)

Metodologie di Programmazione 28/02/2020 130


Roberto Navigli
Review & Update: assegnazione di un’espressione a
una variabile

Supponiamo di voler effettuare l’assegnazione:


c = a*2+b
Memoria:
a 5

b 15 (1)
c 20
25

(2)
Valore dell’espressione destra: a*2+b

1) Calcola il valore dell’espressione destra (5*2+15)


2) Assegna il valore (25) alla variabile di destinazione (c)

Metodologie di Programmazione 28/02/2020 131


Roberto Navigli
Review & Update: Precedenza degli operatori aritmetici

Operatori Operazioni Precedenza


*, /, % Moltiplicazione, Valutati per primi, da
divisione, resto sinistra verso destra
+, - Addizione, sottrazione Valutati per secondi, da
sinistra verso destra

• Facciamo un test “online”…


• Quanto fa 5-2-3/2.0+2*2-5%2/2.0?

Metodologie di Programmazione 28/02/2020 132


Roberto Navigli
Ci torniamo su tra poco…

Metodologie di Programmazione 28/02/2020 133


Roberto Navigli
Caratteri e stringhe

• Un char è un carattere alfanumerico o un simbolo


• Ci sono 216 possibili valori di caratteri (più eventuali
“caratteri supplementari”, per esempio per il cinese)
– Codifica Unicode basata su interi a 16 bit
• Racchiusi da apici (es. ‘a’, ‘b’, ‘0’, ‘1’, ecc.)
• Caratteri di escape:
– Tab: ‘\t’
– A capo: ‘\n’
– Backslash: ‘\\’
– Apice: ‘\’’
– Virgoletta: ‘\”’
• Una stringa è una sequenza di caratteri

Metodologie di Programmazione 28/02/2020 134


Roberto Navigli
Review & Update: Tipi booleani

• Il tipo booleano ha solo due valori possibili: true (vero) e


false (falso)
• Gli operatori disponibili sono && (and), || (or) e ! (not)
• Le tabelle di verità sono:

a !a a b a && b a || b
true false false false false false
false true false true false true
true false false true
true true true true

Metodologie di Programmazione 28/02/2020 135


Roberto Navigli
Esempi di variabili booleane

• boolean piove = true;

• boolean giocoAPallone = !piove;

• boolean fuoriForma = true;

• boolean vadoInPalestra = piove && fuoriForma;

Metodologie di Programmazione 28/02/2020 136


Roberto Navigli
Review & Update: Operatori di confronto

• Tutti definiti su ciascun tipo numerico primitivo


• Producono un valore booleano
– Uguaglianza: ==
– Diversità: !=
– Minore: <
– Minore uguale: <=
– Maggiore: >
– Maggiore uguale: >=

Metodologie di Programmazione 28/02/2020 137


Roberto Navigli
Review & Update: Operatori di confronto

operatore significato true false

== uguale 42 == 42 42 == 43
!= diverso 42 != 43 42 != 42
< minore 42 < 100 42 < 42
<= minore o uguale 42 <= 42 43 <= 42
> maggiore 100 > 42 42 > 100
>= maggiore o uguale 43 >= 42 42 >= 43

Metodologie di Programmazione 28/02/2020 138


Roberto Navigli
Differenza tra == e =!!!

Metodologie di Programmazione 28/02/2020 139


Roberto Navigli
Tutti gli operatori e le loro precedenze
Operatori Operazioni
post-incremento e post-decremento var++ var--
pre-incremento e pre-decremento, operatori
++var --var +espr -espr ~ !
unari
operatori moltiplicativi * / %
operatori additivi + -
shift << >> >>>
relazionali < > <= >= instanceof
confronto == !=
AND bit a bit &
OR esclusivo bit a bit (XOR) ^
OR inclusivo bit a bit |
AND logico &&
OR logico ||
operatore ternario ?:
lambda ->

assegnazione = += -= *= /= %= &= ^= |= <<= >>= >>>=

Metodologie di Programmazione 28/02/2020 142


Roberto Navigli
HelloWorld.java

Metodologie di Programmazione 28/02/2020 143


Roberto Navigli
Anatomia di HelloWorld.java
Nome del programma (classe)

Fine istruzione ;

PER ORA!!! Istruzioni Corpo del metodo


Metodo main

• Il programma (meglio: la classe) Java risiede in un file che ha lo


stesso nome della classe creata (HelloWorld) più l’estensione .java
(HelloWorld.java)
• La prima istruzione chiama System.out.print per stampare la
stringa “Hello, World!”
• La seconda istruzione chiama System.out.println per terminare la
linea (= andare a capo)
Metodologie di Programmazione 28/02/2020 144
Roberto Navigli
Sequenza: istruzione1; istruzione2; …; istruzione n;

• Le istruzioni sono raggruppate in un corpo, racchiuso da


parentesi graffe
• Ogni istruzione termina con un punto e virgola
• Anche l’ultima istruzione

Metodologie di Programmazione 28/02/2020 145


Roberto Navigli
Il tuo primo programma Java in 3 passi

• Crea un programma (create!)


• Compilalo (compile!)
• Eseguilo (run!) Java Virtual
Machine: simula
Bytecode un computer

editor HelloWorld.java compilatore HelloWorld.class JVM “Hello, World!”

oppure IDE Scrivi: javac Digita: java


(Integrated HelloWorld.java per HelloWorld per
Development compilare il tuo programma eseguire il tuo
Environment) programma

Librerie

Metodologie di Programmazione 28/02/2020 146


Roberto Navigli
Metodologie di Programmazione 28/02/2020 147
Roberto Navigli
HelloWorld in Python

• Ricordate? Chiamata a funzione print

• Programma eseguito mediante interprete

Metodologie di Programmazione 28/02/2020 148


Roberto Navigli
Ricevere un input ed emettere un output
Input da console

Prima parola
in input

• Compila: javac BotSempliceSemplice.java


• Esegui: java BotSempliceSemplice Rob
• Output: Ciao Rob. Come va?

Metodologie di Programmazione 28/02/2020 150


Roberto Navigli
Vediamo il programma come una scatola nera

• Abbiamo implementato un programma che prende una


stringa in input e ne restituisce un’altra in output

Rob programma Ciao, Rob. Come va?

Metodologie di Programmazione 28/02/2020 152


Roberto Navigli
In fondo anche il compilatore Java fa lo stesso

• Javac prende in input una classe .java (una stringa di


testo) e ne restituisce la versione “compilata” .class (una
stringa di testo) in bytecode

Programma.java javac Programma.class

Metodologie di Programmazione 28/02/2020 153


Roberto Navigli
Coding Horror: Anarchia vs. regole di stile

• Posso scrivere HelloWorld.java in questo modo?

• Potenzialmente Sì: non è una questione di spazi e di “a


capo”
• Decisamente No! il codice è scritto per essere riletto e
riusato da altri (e da noi stessi) dopo qualche
settimana, mese, anno…

Metodologie di Programmazione 28/02/2020 154


Roberto Navigli
Esempi di espressioni nel main di una classe

Questa riga va eliminata!

Output:

Metodologie di Programmazione 28/02/2020 155


Roberto Navigli
Errori tipici

Metodologie di Programmazione 28/02/2020 156


Roberto Navigli
Review & Update: operatori di confronto, booleani e
anno bisestile

Ogni 4 anni
Ma non ogni 100

Tranne ogni 400!

• Compila: javac AnnoBisestile.java


• Esegui: java AnnoBisestile 2012
• Output: L’anno 2012 e’ bisestile? true

Metodologie di Programmazione 28/02/2020 157


Roberto Navigli
Esercizi sulle espressioni

• Si riscriva l’espressione bBisestile della diapositiva


precedente utilizzando un’unica istruzione di
assegnazione
• Siano date a e b variabili di tipo double; si scriva
l’istruzione che definisce c pari al valore true se a è
maggiore di b, false altrimenti
• Siano date una variabile intera a e una variabile double
b; si scriva l’istruzione che assegna a c la parte intera
della differenza tra a e b
• Qual è il valore di x dopo l’esecuzione di quanto segue?

Metodologie di Programmazione 28/02/2020 158


Roberto Navigli
Alcune funzioni matematiche utili
• Alcuni metodi della classe Math di Java
– double abs(double a)
– double max(double a, double b)
– double min(double a, double b)
– double sin(double theta)
– double cos(double theta)
– double tan(double theta)
– double exp(double a)
– double log(double a)
– double pow(double a, double b)
– long round(double a)
– double random()
– double sqrt(double a)
• Alcune costanti di base:
– double E
– double PI

Metodologie di Programmazione 28/02/2020 159


Roberto Navigli
Da stringhe a dati primitivi

• Supponiamo di voler utilizzare l’input di un programma


per effettuare dei calcoli (es. somme)
• Come convertiamo da stringa a intero?

Metodologie di Programmazione 28/02/2020 161


Roberto Navigli
Da stringhe a dati primitivi

• Supponiamo di voler utilizzare l’input di un programma


per effettuare dei calcoli (es. somme)
• Come convertiamo da stringa a intero?
• E da stringa a double?

Metodologie di Programmazione 28/02/2020 162


Roberto Navigli
Da dati primitivi a stringhe

• Java definisce l’operatore + sul tipo di dato “built-in”


String
• Quando usiamo + con almeno un operando String, Java
converte automaticamente l’altro operando a String,
restituendo una stringa:

Metodologie di Programmazione 28/02/2020 163


Roberto Navigli
“Guida galattica per autostoppisti” vi dice qualcosa?

Metodologie di Programmazione 28/02/2020 164


Roberto Navigli
La tua consapevolezza del tipo di dati

• Regola aurea: sii sempre consapevole


del tipo di dati che il tuo programma sta
elaborando
• Quali valori può assumere ciascuna
variabile?
• Tuttavia, lavoriamo tipicamente con
molteplici tipi di dati
• Come convertire un tipo di dati?

Metodologie di Programmazione 28/02/2020 165


Roberto Navigli
Conversioni di tipo
• Conversione esplicita:
– Utilizzando un metodo che prende in ingresso un argomento di un tipo
e restituisce un valore di un altro tipo
– Integer.parseInt(), Double.parseDouble(), Math.round(), Math.floor(),
Math.ceil() ecc.
• Cast esplicito:
– Anteponendo il tipo desiderato tra parentesi
– (int)2.71828 produce un intero di valore 2
– Se il tipo di partenza è più preciso (es. double), le informazioni
aggiuntive vengono eliminate nel modo più ragionevole (es. da double
a int viene eliminata la parte frazionaria)
• Cast implicito:
– Se il tipo di partenza è meno preciso, Java converte automaticamente
il valore al tipo più preciso
– double d = 2;
– Attenzione: la somma di due caratteri dà un intero!

Metodologie di Programmazione 28/02/2020 166


Roberto Navigli
Regole per il cast implicito

• Il cast implicito avviene in fase di assegnazione:


– byte, short e char possono essere promossi a int
– int può essere promosso a long
– float può essere promosso a double
• o in fase di calcolo di un’espressione:
– se uno dei due operandi è double, l’intera espressione è
promossa a double
– altrimenti, se uno dei due operandi è float, l’intera espressione è
promossa a float

Metodologie di Programmazione 28/02/2020 167


Roberto Navigli
Review & Update: Conversioni di tipo
espressione tipo valore
(int)2.71828 int 2

Math.round(2.71828) long 3

(int) Math.round(2.71828) int 3

(int) Math.round(3.14159) int 3


Il cast ha precedenza più elevata!

Integer.parseInt(“42”) int 42

“42” + 99 String “4299”

42 * 0.4 double 16.8

(int)42 * 0.4 double 16.8

42 * (int)0.4 int 0

(int)(42 * 0.4) int 16

Metodologie di Programmazione 28/02/2020 168


Roberto Navigli
Quanto fa 5-2-3/2.0+2*2-5%2/2.0?

Metodologie di Programmazione 28/02/2020 169


Roberto Navigli
Risultati 2012

-3 x
-1 x
0 xx
0.5 xxxx
1 xxx
1.5 xxx
2 x
4 xx 28.8%!
4.5 xxxx
5 xxxxxxxxxxxxxxxxxxx
5.5 xxxxxxxxxxx
6 xxxxxxxxx
6.5 x
7 xx
7.5 x
8 x
8.5 x

Metodologie di Programmazione 28/02/2020 170


Roberto Navigli
Risultati 2013

0 xxx
0.5 xx
2.75 x
3.5 xx
4 xxxx
55%!
4.5 x
5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
5.45 x
5.5 xxxxxxxxxxxxxxx
5.55 x
WISDOM OF THE CROWD
6 xxxxxxxxx
6.5 x

Metodologie di Programmazione 28/02/2020 171


Roberto Navigli
Quanto fa 5-2-3/2.0+2*2-5%2/2.0?
• Prima si effettuano i prodotti, le divisioni e i moduli da
sinistra verso destra
– Quando si effettua un’operazione aritmetica tra tipi diversi ma
compatibili, avviene un cast implicito
• 5-2-3/2.0+2*2-5%2/2.0
• 5-2-3.0/2.0+2*2-5%2/2.0
• 5-2-1.5+2*2-5%2/2.0
• 5-2-1.5+2*2-5%2/2.0
• 5-2-1.5+4-5%2/2.0
• 5-2-1.5+4-5%2/2.0
• 5-2-1.5+4-1/2.0
• 5-2-1.5+4-1.0/2.0
• 5-2-1.5+4-0.5

• Infine si calcolano somme e sottrazioni da sinistra verso


destra
• 3-1.5+4-0.5 -> 1.5+4-0.5 -> 5.5-0.5 -> 5.0

Metodologie di Programmazione 28/02/2020 172


Roberto Navigli
Esercizi per cominciare

• Scrivere una classe Moltiplica che, dati in input 2 numeri


interi, ne restituisca a video il prodotto
• Scrivere una classe StampaNome che, dato in input un
nome, lo stampi tra due righe di trattini. Ad es.:
+---------+
Roberto
+---------+

Metodologie di Programmazione 28/02/2020 173


Roberto Navigli
Soluzioni degli esercizi

Metodologie di Programmazione 28/02/2020 174


Roberto Navigli
L’intestazione del main è scolpita nella pietra!

Metodologie di Programmazione 28/02/2020 175


Roberto Navigli
Esercizi per cominciare

• Scrivere una classe Variabili che, all’interno del metodo


main, dichiari una variabile intera i, una variabile di tipo
stringa s e una variabile double d. Quindi vengono
svolte le seguenti tre operazioni:
– La stringa viene inizializzata al valore del primo argomento
fornito in input al main
– All’intero viene assegnato il valore intero della stringa
– Al double viene assegnata la metà del valore di i (ad es. se i è
pari a 3, d sarà pari a 1.5)
– I valori di s, i e d vengono stampati a video

Metodologie di Programmazione 28/02/2020 176


Roberto Navigli
Soluzione dell’esercizio

Metodologie di Programmazione 28/02/2020 177


Roberto Navigli
Un generatore di numeri

Commento su singola linea


Escluso 1

Metodologie di Programmazione 28/02/2020 178


Roberto Navigli
Esercizio: Phrase-O-Matic
• Progettare una classe i cui oggetti contengono tre
elenchi di parole l1, l2 e l3
• La classe è in grado di emettere nuove espressioni
costruite creando stringhe del tipo “a b c” scegliendo
casualmente dai tre rispettivi elenchi a ϵ l1, b ϵ l2, c ϵ l3
• Ad esempio, dati i seguenti elenchi:
– l1 = { “salve”, “ciao”, “hello”, “buongiorno”, “scialla” }
– l2 = { “egregio”, “eclettico”, “intelligentissimo”, “astutissimo” }
– l3 = { “studente”, “ragazzo”, “giovane”, “scapestrato”,
“fannullone”, “studioso” }
Dichiarazione di un array di stringhe:
• Esempi di output sono: String[] a = { “a”, “b”, “c” };
– “salve egregio fannullone” Accesso all’i-esimo elemento dell’array:
– “ciao eclettico scapestrato” String s = a[i];

– “scialla astutissimo studente”


Metodologie di Programmazione 28/02/2020 179
Roberto Navigli
Soluzione dell’esercizio

N.B.: Sarebbe errore scrivere:


(int)Math.random()*l3.length
perché il cast ha precedenza sul prodotto!

Metodologie di Programmazione 28/02/2020 180


Roberto Navigli
Soluzione (ideale)
dell’esercizio

Metodologie di Programmazione 28/02/2020 181


Roberto Navigli