Programmazione

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



Data Argomento
2/10/2017 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. 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. Costruzione di semplici algoritmi numerici: somma di due numeri con incremento e decremento, prodotto, esponenziale fattoriale. Rappresentazione dell'informazione, digitalizzazione (immagini, suono, testo). Sequenze di bit per la rappresentazione di valori, byte e multipli.
9/10/2017 Digitalizzazione dell'informazione: testo, suoni, immagini. 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 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
12/10/2016 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 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). 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
16/10/2017 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). Test di primalità numeri perfetti. 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
19/10/2017 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. 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
23/10/2017 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. Selezione: il costrutto if in Java, varianti ed esempi. If nidificati in vari contesti. 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
26/10/2017 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. 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. Stringhe palindrome, algoritmo per la loro rivelazione, ottimizzazioni. Il metodo charAt della classe String, esempi di utilizzo
30/10/2017 Cicli nidificati, esempi: stampa delle tabelline, conteggio lettere in un brano. 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. I tipi primitivi numerici in Javai. Tipi interi: int, long, byte, short, principali caretteristiche di memorizzazione, principali operatori aritmetici e di confronto. La classe BigInteger per interi a precisione infinita, principali caratteristiche ed esempi
2/11/2017 Calcolo del fattoriale e del coefficiente binomiale con BigInteger. I tipi primitivi numerici in Java. Numeri con la virgola, notazione scientifica mantissa + esponente. I tipi double, float, principali caretteristiche di memorizzazione, principali operatori aritmetici e di confronto. Divisione tra int o double. Le costanti in Java. 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
6/11/2017 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. Modularizzazione del codice, i metodi statici. Vantaggi della modularizzazione, approccio top-down nella progettazione. Forma generale dei metodi statici: tipo 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), nella ricerca dei numeri perfetti (metodo perf) e dei numeri primi (metodo primo)
9/11/2017 Ancora sull'utilizzo e la progettazione di metodi statici. I metodi void. Progetti per la gestione di testi e sequenze numeriche. Caratteristiche interne dei metodi statici. 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. Gli array, struttura e principali definizioni, esempi d'utilizzo. 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 metodo split della classe String per l'analisi sintattica del testo
13/11/2017 Il parametro args del main, significato ed esempi di programmi con dati "a linea di comando". Conversione dei dati numerici. 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
20/11/2017 Struttura di un metodo statico, variabili locali, parametri formali. Parametri attuali, passaggio dei 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 Ricorsione su stringhe, test palindrome. Dinamica dello stack nei metodi ricorsivi. Confronto tra ricorsione ed iterazione, efficienza. Costruzione di classi, stato e comportamenti di un oggetto. Costruzione della classe Frazione. Campi (variabili d'istanza), loro significato nella forma di un oggetto

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