Programmazione

Contenuto delle lezioni (teoria) - A.A. in corso



Data Argomento
28/9/2016 Presentazione del corso: struttura, contenuti, programma, modalità d'esame. Motivazioni: cos'è l'informatica, la programmazione in ambito informatico, sua centralità. Nozione ingenua di algoritmo, esempi. Algoritmi per il calcolo del massimo comun divisore
3/10/2016 Algoritmo di Euclide, esempi di esecuzione. Considerazioni su correttezza ed efficienza degli algoritmi. Definizione più precisa di algoritmo, esempi di non-algoritmi. Dall'algoritmo al programma: esecutore e linguaggio di programmazione
4/10/2016 Costruzione di semplici algoritmi numerici: somma di due numeri con incremento e decremento, prodotto, esponenziale fattoriale
5/10/2016 Rappresentazione dell'informazione, digitalizzazione (immagini, suono, testo). Sequenze di bit per la rappresentazione di valori, byte e multipli. Rappresentazione numerica binaria per la digitalizzazione. L'esecutore: il calcolatore. La macchina di von Neumann: cpu, ram, bus, periferiche, principali funzionalità caratteristiche. Velocità per cpu espressa in Hz. Paralelismo interno, tecnologia multicore. Struttura della ram, celle, indirizzi, capienza
10/10/2016 Memorie di massa e loro funzione, capienza, tempi d'accesso. Memorie magnetiche, ottiche, flash, tecnologia e principali caratteristiche. Esecuzione dei programmi sull'architettura di von Neumann, ciclo macchina: fetch-decode-execute. Struttura interna della CPU: ALU, CU, registri, clock. Linguaggio macchina, forma delle istruzioni, modus operandi sui dati. Linguaggio assembly, assemblatore. Programmazione a basso livello e suoi svantaggi
11/10/2016 Linguaggi ad alto livello, vantaggi (portabilità), concetto di macchina virtuale. Compilatori, sorgente ed oggetto Esecuzione mediante interpretazione. Vita del software, fasi di editing, compiling, linking, loading, executing, possibili errori e loro correzione. La situazione ibrida di Java, compilatore e Java Virtual Machine (JVM), creazione del bytecode e interpretazione. Portabilità di sorgente e bytecode. Esecuzione di programmi in Internet (applet, browser)
12/10/2016 Programmazione ad alto livello, programmazione strutturata, strutture di controllo, motivazioni: sequenza, selezione, iterazione. Programmazione a basso livello vs. programmazione ad alto livello: teorema di Boehm-Jacopini. La struttura selezione, diverse forme, esercizi
17/10/2016 Il concetto di variabile, nome, tipo, valore, dichiarazioni di variabili. La struttura di iterazione, le due forme, massimo e minimo numero di iterazioni possibili. Simulazione reciproca dei due tipi di iterazione. Esercizi sulla programmazione strutturata: gestione di sequenze potenzialmente infinite di dati, clcoli statistici su stream di interi (medie)
18/10/2016 Esercizi sulla programmazione strutturata: gestione di stream di dati in problemi di calcolo
19/10/2016 Ancora esercizi sulla programmazione strutturata. Programmazione imperativa vs. programmazione ad oggetti. Un primo approccio alla programmazione ad oggetti, l'esempio del mondo universitario. Primo programma Java: "Salve Mondo!", editing, compilazione, interpretazione. Struttura del programma "Salve mondo!", oggetti e invocazione di comportamenti
24/10/2016 Il paradigma della programmazione ad oggetti, scenari: classi, oggetti, interazioni tra oggetti, messaggi. Caratteristiche di un oggetto, stato e comportamento. Protocollo, interfaccia, contratto, responsabilità dell'interfaccia. Classe come fabbrica di oggetti. Utilizzo di classi esistenti, nascita di oggetti e invocazione di metodi. La classe Scanner per l'input di dati, i metodi nextInt() e nextLine(). Struttura di un oggetto, variabili e riferimento. Variabili di tipo String, programma con input/output
25/10/2016 Primo esempio di utilizzo di variabili intere. Utilizzo dei metodi, prototipo e segnatura. Il fenomeno dell'overloading. La classe String, metodi principali. L'operazione di concatenazione tra stringhe e variabili eterogenee. Esercizi e progetti: il programma Evidenziatore
2/11/2016 Discussione sul progetto Evidenziatore e sui metodi di String. Variabili e tipi in Java, Java come linguaggio fortemente tipato, tipo dell'espressione. Dichiarazione e definizione di variabili. Tipi primitivi e tipi riferimento, principali caratteristiche. Il valore null nei tipi riferimento. Assegnamento per variabili di tipo primitivo e riferimento, sostanziale differenza. La classe Frazione, metodi principali. Selezione: il costrutto if in Java, varianti ed esempi. If nidificati in vari contesti
7/11/2016 Ancora esercizi sulla selezione. If nidificati, convenzioni del compilatore. Il tipo boolean, operatori tra tipi primitivi ed espressioni semplici. Operatori == e != su tipi primitivi e riferimento, differenze ed esempi. Espressioni booleane composte mediante && (and), || (or), ! (not), esempi
8/11/2016 Iterazione: i costrutti while e do-while, esempi: media di una sequenza numerica, statistiche su brani, ricerca della stringa più lunga e più corta in un brano
9/11/2016 Ricerca del massimo e del minimo in una sequenza numerica. Iterazione mediante for, varianti di for, esempi Vita delle variabili in un ciclo for, esempi. Le istruzioni break e continue, esempi. Test di primalità, ottimizzazioni. Introduzione al problema delle stringhe palindrome, accenno all'algoritmo di soluzione
14/11/2016 Stringhe palindrome, algoritmo per la loro rivelazione, ottimizzazioni. Il metodo charAt della classe String, esempi di utilizzo. Cicli nidificati, esempi: stampa delle tabelline, conteggio lettere in un brano, conteggio numeri perfetti in una sequenza di numeri
15/11/2016 Espressioni Java, tipo e valore ritornato. Espressioni semplici, metodi, espressioni complesse. Esempi. L'assegnamento come espressione, effetti collaterali. Esercizi con assegnamenti, effetti collaterali Operatori di incremento e decremento prefissi e postfissi, loro utilizzo in espressioni e frammenti di codice Valutazione di espressioni booleane, lazy evaluation e sua prevenzione, utilizzo di &&, &, ||, |, !, esempi con effetti collaterali. L'operatore ternario condizionale, significato e suo utilizzo
16/11/2016 I tipi primitivi numerici in Java: int, long, byte, short, double, float, principali caretteristiche di memorizzazione, principali operatori aritmetici e di confronto. Divisione tra int o double. Le costanti in Java. La classe BigInteger per interi a precisione infinita, principali caratteristiche ed esempi. Calcolo del fattoriale e del coefficiente binomiale con BigInteger
21/11/2016 Operazioni tra tipi eterogenei, conversioni implicite (promozioni), esempi. Forzatura di tipo mediante casting, esempi Conversioni implicite con l'operatore di concatenazione. Il tipo char, codifica UNICODE, esempi di conteggio di caratteri. Il costrutto switch, significato ed esempi
22/11/2016 Metodi statici, sintassi e semantica, esempi di metodi statici. Metodi statici nella gestione di interi Classi involucro, alcuni esempi d'utilizzo di metodi statici dalle classi involucro. Differenze tra variabile di tipo primitivo e di "tipo involucro". Conversioni implicite per le classi involucro: boxing e unboxing
23/11/2016 Modularizzazione del codice, i metodi statici. Vantaggi della modularizzazione, approccio top-down nella progettazione. Forma generale dei metodi statici: yipo di ritorno, parametri formali, variabili locali. Forma del codice modularizzato e invocazione dei metodi statici. Esempi di costruzione dei metodi statici nel calcolo del coefficiente binomiale (metodo fatt) e della ricerca dei numeri perfetti (metodo perf)
28/11/2016 Ancora sull'utilizzo e la progettazione di metodi statici per la modularizzazione del codice. Progettazione del codice top-down, definizione di metodistatici per sottoproblemi. Progetti per la gestione di testi e sequenze numeriche. Caratteristiche interne dei metodi statici, l'istruzione
29/11/2016 Progettazione di metodi statici che richiamano altri metodi statici. Struttura di un metodo statico: variabili locali, parametri formali. Scopo delle variabili locali e dei parametri. Parametri attuali e passaggio per valore
30/11/2016 Ancora sul passaggio di parametri per valore. Record di attivazione di un metodo, sua struttura. Gestione dei record di attivazione nella memoria centrale, suddivisione logica: stack e heap. Gestione a pila dei record di attivazione, operazioni di push, pop, top. Errore di stack overflow. Esempi di dinamica dello stack. Ricorsione. Ricorsione in matematica, esempi. Metodi ricorsivi, esempi (numeri triangolari, esponenziale, numeri di Fibonacci
5/12/2016 Ricorsione su stringhe, test palindrome. Dinamica dello stack nei metodi ricorsivi. Confronto tra ricorsione ed iterazione, efficienza. Gli array, struttura e principali definizioni, esempi d'utilizzo
6/12/2016 Array di tipo primitivo e array d'oggetti, differenze. Riempimento, utilizzo e scansione d'array. Esempi di programmi che utilizzano array di BigInteger e per gestione testi. Il ciclo for-each per la scansione di array, definizione ed esempi. Il parametro args del main, significato ed esempi di programmi con dati "a linea di comando". Conversione dei dati numerici. Il metodo split della classe String per l'analisi sintattica del testo
12/12/2016 Costruzione di array dinamici mediante la classe generica ArrayList, principali primitive. ArrayList come struttura di memorizzazione dinamica, problemi nell'istanziazione di classi generiche, uso di classi involucro. Esempi di utilizzo di ArrayList. Costruzione di classi, stato e comportamenti di un oggetto. Costruzione della classe Frazione. Campi (variabili d'istanza), loro significato nella forma di un oggetto. I costruttori della classe Frazione, specifica e significato
13/12/2016 Costruzione di metodi nella classe Frazione. Uso di this nei metodi. Specifica del metodo toString per miglioramenti successivi. Uso di this nei metodi e nei costruttori. Miglioramenti in Frazione, metodi statici: costruzione di frazioni ridotte ai minimi termini. Campi statici (variabili di classe), loro significato, esempio nella classe Frazione. Utilizzo dei campi statici mediante get e set
14/12/2016 Riepilogo dei costrutti in una classe e loro significato: campi, campi statici, costruttori, metodi, metodi statici. Esempi. Approfondimento sul passaggio dei parametri nel caso di parametri di tipo riferimento, differenze col caso primitivo. Gestione della memoria run-time in Java, garbage collector. Introduzione alle gerarchie di classi, ereditarietà e polimorfismo. La gerarchia delle figure geometriche. La classe Rettangolo
19/12/2016 Gerarchie di classi, significato. La classe Rettangolo, definizione e principali metodi. Esempi di utilizzo, ricerca del rettangolo di area maggiore in una sequenza di rettangoli. La classe Quadrato, principali metodi. Problemi nella ricerca della figura di area maggiore tra rettangoli o quadrati: tipi e metodi Il formalismo UML per Java: classi (a diversi livelli di dettaglio) e parentele. La classe Quadrato, relazione con Rettangolo. Gerarchie di classi, ereditarietà, polimorfismo. Tipi, supertipi, ereditarietà sui metodi, riscrittura di metodi (overriding). Il predicato instanceof, suo significato ed esempi di utilizzo Ricerca del rettangolo o qudrato di area massima. La classe Cerchio, principali metodi e relazioni col resto delle figure, la classe Figura. Ricerca del rettangolo, quadrato o cerchio di area massima. Ancora sul funzionamento del predicato instanceof, esempi. Approfondimento sulle caratteristiche della classe Figura. Nozione di classe astratta, motivazioni, metodi astratti
20/12/2016 Visione completa della gerarchia Java, la classe Object sua struttura e implicazioni su ereditarietà e polimorfismo. Necessità di overriding per i metodi toString e equals. La classe Object, assegnamenti, tipi, supertipi, polimorfismo, overriding, esempi. Esercizi sulla gerarchia di classi, array di Object
21/12/2016 Le Eccezioni in Java, loro significato e struttura. Esempi di sollevazione di eccezioni, la gerarchia delle eccezioni. Le principali eccezioni e loro significato. Dinamica delle eccezioni nei programmi. Gestione delle eccezioni: prevenzione e cura. Il costrutto try-catch, significato ed esempi. Ancora sulle eccezioni per migliorare la scrittura delle classi. Sollevare eccezioni, esempio del costruttore di Frazione. Creare nuove eccezioni, l'eccezione FrazioneException. Eccezioni controllate e non controllate: motivazioni ed esempi
9/1/2017 Esercitazione di riepilogo in vista delle prove scritte
16/1/2017 Esercitazione di riepilogo in vista delle prove scritte

Torna alla pagina del corso

Carlo Mereghetti
Dipartimento di Informatica
Università degli Studi di Milano
via Comelico 39, 20135 Milano, Italy
phone(fax) +39 02 503 16261(16276)
mail: mereghetti@di.unimi.it