Informatica

A.A. 2021/2022
6
Crediti massimi
60
Ore totali
SSD
INF/01
Lingua
Italiano
Obiettivi formativi
L'insegnamento si propone di introdurre le basi dell'Informatica, con particolare riferimento alla Programmazione. Vengono presentati i rudimenti sulla rappresentazione digitale dell'informazione e sull'architettura dei calcolatori. Viene introdotto il concetto di algoritmo e di programma, unitamente ai principali strumenti coinvolti nel ciclo di vita del software. Viene introdotta la programmazione strutturata ed il paradigma imperativo, ponendo l'accento sulla modularizzazione del software. Vengono introdotte alcune strutture dati ed algoritmi notevoli, accennando alla valutazione della complessità in tempo algoritmica.
Risultati apprendimento attesi
Lo studente sarà in grado di: 1) Affrontare problemi tipicamente rivolti all'analisi dei dati, progettando concettualmente algoritmi di soluzione. 2) Implementare tali algoritmi mediante codice modulare scegliendo strutture dati appropriate e costrutti offerti dal linguaggio di programmazione scelto. 3) Muoversi all'interno di un sistema operativo allo scopo di codificare, compilare, linkare ed eseguire programmi.
Programma e organizzazione didattica

CORSO A

Responsabile
Periodo
Primo semestre
Sui siti dedicati all'insegnamento (vedi sotto) verranno tempestivamente pubblicati avvisi riportanti le modalità di erogazione per un'eventuale fase di didattica emergenziale.

In caso di teledidattica, le lezioni verranno erogate via Zoom in modo sincrono e contestualmente registrate per un'eventuale fruizione asincrona. Il programma dell'insegnamento e le risorse per la preparazione dell'esame non subiranno modifiche. L'esame avverrà mediante Zoom secondo la forma e i criteri adottati per l'esame in presenza e sotto riportati.
Programma
Programma delle lezioni di teoria
- Cos'è l'informatica: mezzi fisici e teorici per l'elaborazione dell'informazione
- Il concetto di algoritmo, esempi: algoritmo di Euclide, semplici algoritmi numerici
- Dagli algoritmi ai programmi: esecutori e linguaggi di programmazione
- L'informazione e la sua rappresentazione numerica (testi, suoni, immagini), digitalizzazione dell'informazione
- Sistemi numerici in diverse basi, la base ottale, esadecimale, binaria (digitalizzazione)
- Rappresentazione dei numeri in binario
- Rappresentazione dei numeri negativi in modulo e segno e in complemento a 2
- Rappresentazione floating point dei razionali, mantissa, esponente, errori di troncamento
- Misure di informazione: bit, byte, multipli
- Architettura dei sistemi di calcolo, macchina di Von Neumann
- CPU, RAM, BUS, periferiche, principali funzionalità e caratteristiche
- Linguaggio macchina e assembly, programmazione a basso livello, svantaggi
- Programmazione ad alto livello, linguaggi e compilatori
- Ciclo di vita del software: progettazione, compilazione, linking, loading, esecuzione
- Possibili errori e debugging
- Programmazione strutturata e Teorema di Boehm-Jacopini. Le strutture di controllo
- Forme di selezione, esempi
- Le variabili, tipi e operazioni
- Forme di iterazione, esempi: gestione di stream di dati e test numerici
- Il primo programma C++. Lo stream di output cout
- I tipi in C++, principali caratteristiche e operazioni. Tipi interi, con virgola, caratteri e bool
- Dichiarazioni di variabili, loro riempimento mediante espressioni e operazioni di input. Lo stream cin
- Il tipo string. Le C-stringhe, loro struttura, gestione e principali funzionalità
- Le strutture di controllo in C++. La selezione, varie forme e if nidificati
- Il tipo bool per le condizioni, principali caratteristiche e operatori booleani. L'operatore condizionale
- Iterazione in C++, possibili forme. Il ciclo for. L'istruzione break
- Gli array monodimensionali in C++, principali caratteristiche, funzionalità e operazioni su array
- Array e allocazione in memoria, indirizzo d'inizio array. Array bidimensionali, esempi di utilizzo
- Il concetto di struct
- Gestione dei file in C++. Principali funzionalità della libreria fstream. Apertura, manipolazione e chiusura di stream su file
- Manipolatori di output, la libreria iomanip
- Gli array dinamici, caratteristiche, definizione e uso. Caricamento dati da file ad array dinamici
- Funzioni in C++. Sviluppo modulare top-down dei programmi. Forma di una function che restituisce valori e void
- Passaggio di parametri, per valore e riferimento, significato. Forma modulare del sorgente e prototipi
- Gestione della memoria, record di attivazione, stack, heap, errori di stack overflow
- Funzioni C++ ricorsive, definizioni induttive di funzioni, loro implementazione mediante ricorsione
- Dinamica dello stack durante la ricorsione. Prestazioni iterativo vs. ricorsivo
- Cenni alla complessità worst case degli algoritmi
- Ricerca in un array. Soluzione lineare e binaria, implementazioni e analisi delle prestazioni
- Il problema di sorting, limiti inferiori alla complessità in tempo. Selection sort, implementazione e complessità in tempo quadratica
- Mergesort, specifica e implentazione
- Valutazione della complessità in tempo di mergesort mediante equazione di ricorrenza, tempo ottimale
- I puntatori, significato, definizione ed utilizzo. Puntatori a strutture ed oggetti
- Variabili dinamiche e puntatori, array dinamici, istruzione new. Memory leak e istruzione delete
- Operazioni sui puntatori, aritmetica dei puntatori. Utilitzzo dei puntatori per scorrere array, copia superficiale e profonda di array
- Array tradizionali come puntatori costanti, differenza con array dinamici. Array restituiti da funzioni, array su stack e su heap
- I parametri del main, acquisizione a linea di comando. Implementazioni di semplici comandi di sistema operativo

Programma delle esercitazioni di laboratorio
- I sistemi operativi, Linux e il file system
- L'utilizzo del terminale Linux, principali comandi
- L'ambiente di programmazione, editor, compilatori
- Primi programmi in C++
- Selezione e cicli in C++
- Array e struct
- Funzioni C++ e passaggio di parametri
- Creazione di librerie di funzioni. Implementazione librerie, file header
- Creazione file oggetto e loro linking
- Utilizzo del comando make e struttura di un makefile
- Uso di file in C++
- Sviluppo di progetti di analisi dati e loro presentazione
Prerequisiti
Nessuno.
Metodi didattici
L'insegnamento si compone di lezioni frontali di teoria ed esercitazioni in laboratorio:

-Le lezioni frontali di teoria presentano le basi della programmazione e del progetto di algoritmi. Viene inoltre proposto un linguaggio di programmazione, illustrandone sintassi, semantica e proponendo tecniche di programmazione ed algoritmi notevoli. Durante tali lezioni vengono proposti e discussi esercizi e problemi, stimolando il lavoro in piccoli gruppi e confrontando le diverse soluzioni proposte.

- Le lezioni di laboratorio hanno lo scopo anzitutto di presentare le funzionalità base di un sistema operativo e alcuni strumenti tipici dell'attività di programmazione (editor, compilatori, ...). Durante tali lezioni vengono proposti esercizi di programmazione e progetti di difficoltà crescente. Implementazioni concrete di tali progetti vengono discusse e rese disponibili sui siti dell'insegnamento.
Materiale di riferimento
Testi:
- D.S. Malik: Programmazione in C++. Apogeo, 2013.
- L.J. Aguilar: Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti. McGraw-Hill, 2008.

Siti web:
- ARIEL https://cmereghettii.ariel.ctu.unimi.it/v5/home/Default.aspx
- GENERALE http://www.l30-informatica.fisica.unimi.it/
Modalità di verifica dell’apprendimento e criteri di valutazione
L'esame consta di una prova scritta ed una prova di laboratorio:

- Nella prova scritta vengono proposti alcuni esercizi di programmazione atti in particolar modo a verificare la conoscenza delle basi teoriche della programmazione e del progetto di semplici algoritmi. La prova scritta ha durata di due ore durante le quali non è consentita la consultazione di alcuna fonte. Nella valutazione di tale prova, espressa in trentesimi, viene considerata sia la capacità di progettare concettualmente algoritmi sia la correttezza formale della specifica di tali algoritmi nel linguaggio di programmazione considerato.

- Nella prova di laboratorio viene proposto un progetto di analisi dei dati relativamente complesso per il quale si richiede la scrittura di codice funzionante e ben strutturato. La prova di laboratorio ha durata di circa tre ore durante le quali gli studenti possono avvalersi del software sviluppato durante le esercitazioni di laboratorio. Nella valutazione di tale prova, espressa in trentesimi, viene valutata sia la capacità progettuale di algoritmi sia la capacità di scrivere codice modulare, ben strutturato e manutenibile.

Il voto finale, espresso in trentesimi, attribuito allo studente per l'insegnamento in questione origina da un'opportuna media delle prove scritta e di laboratorio.
INF/01 - INFORMATICA - CFU: 6
Laboratori: 36 ore
Lezioni: 24 ore

CORSO B

Responsabile
Periodo
Primo semestre
Lezioni teoria: Modalità remota via piattaforma Zoom.
Laboratorio: Modalità remota (piattaforma Zoom).
Programma
Programma delle lezioni di teoria
1. Cos'è l'informatica: mezzi fisici e teorici per l'elaborazione dell'informazione
2. Il concetto di algoritmo, esempi: algoritmo di Euclide, semplici algoritmi numerici
3. Dagli algoritmi ai programmi: esecutori e linguaggi di programmazione
4. L'informazione e la sua rappresentazione numerica (testi, suoni, immagini), digitalizzazione dell'informazione
5. Sistemi numerici in diverse basi: esadecimale, binaria (digitalizzazione)
6. Rappresentazione dei numeri in binario.
7. Overflow.
8. Rappresentazione floating point dei razionali, mantissa, esponente, errori di troncamento
9. Misure di informazione: bit, byte, parole, multipli
10. Architettura dei sistemi di calcolo, macchina di Von Neumann
11. CPU, RAM, BUS, periferiche, principali funzionalità e caratteristiche
12. Linguaggio macchina e assembly, programmazione a basso livello, svantaggi
13. Programmazione ad alto livello, linguaggi e compilatori
14. Ciclo di vita del software: progettazione, compilazione, linking, loading, esecuzione. Possibili errori e debugging
15. Programmazione strutturata e Teorema di Boehm-Jacopini. Le strutture di controllo
16. Forme di selezione, esempi
17. Le variabili, tipi e operazioni
18. Forme di iterazione, esempi: gestione di stream di dati e test numerici
19. Il primo programma C++. Lo stream di output cout
20. I tipi in C++, principali caratteristiche e operazioni. Tipi interi, con virgola, caratteri e bool
21. Dichiarazioni di variabili, loro riempimento mediante espressioni e operazioni di input. Lo stream cin
22. Il tipo string. Le C-stringhe, loro struttura, gestione e principali funzionalità
23. Le strutture di controllo in C++. La selezione, varie forme e if nidificati
24. Il tipo bool per le condizioni, principali caratteristiche e operatori booleani. L'operatore condizionale.
25. Iterazione in C++, possibili forme. Il ciclo for. L'istruzione break
26. Gli array monodimensionali in C++, principali caratteristiche, funzionalità e operazioni su array
27. Array e allocazione in memoria, indirizzo d'inizio array. Array bidimensionali, esempi di utilizzo
28. Il concetto di struct
29. Gestione dei file in C++. Principali funzionalità della libreria fstream. Apertura, manipolazione e chiusura di stream su file
30. Manipolatori di output, la libreria iomanip
31. Gli array dinamici, caratteristiche, definizione e uso. Caricamento dati da file ad array dinamici
32. Funzioni in C++. Sviluppo modulare top-down dei programmi. Forma di una function che restituisce valori e void
33. Passaggio di parametri, per valore e riferimento, significato. Forma modulare del sorgente e prototipi
34. Gestione della memoria, record di attivazione, stack, heap, errori di stack overflow
35. Funzioni C++ ricorsive, definizioni induttive di funzioni, loro implementazione mediante ricorsione
36. Dinamica dello stack durante la ricorsione. Prestazioni iterativo vs. ricorsivo
37. Cenni alla complessità worst case degli algoritmi
38. Ricerca in un array. Soluzione lineare e binaria, implementazioni e analisi delle prestazioni
39. Il problema di sorting, limiti inferiori alla complessità in tempo. Selection sort, implementazione e complessità in tempo quadratica
40. Mergesort, specifica e implentazione.Valutazione della complessità in tempo di mergesort mediante equazione di ricorrenza, tempo ottimale
41. I puntatori, significato, definizione ed utilizzo. Puntatori a strutture ed oggetti
42. Variabili dinamiche e puntatori, array dinamici, istruzione new. Memory leak e istruzione delete
43. Operazioni sui puntatori, aritmetica dei puntatori. Utilitzzo dei puntatori per scorrere array, copia superficiale e profonda di array
44. Array tradizionali come puntatori costanti, differenza con array dinamici. Array restituiti da funzioni, array su stack e su heap
45. I parametri del main, acquisizione a linea di comando. Implementazioni di semplici comandi di sistema operativo

Programma delle esercitazioni di laboratorio
1. I sistemi operativi, Linux e il file system
2. L'utilizzo del terminale Linux, principali comandi
3. L'ambiente di programmazione, editor, compilatori
4. Primi programmi in C++
5. Selezione e cicli in C++
6. Array e struct
7. Funzioni C++ e passaggio di parametri
8. Creazione di librerie di funzioni. Implementazione librerie, file header.
9. Creazione file oggetto e loro linking
10. Utilizzo del comando make e struttura di un makefile
11. Uso di file in C++
Prerequisiti
Nessuno
Metodi didattici
Lezioni teoria:
2 ore a settimana.
Laboratorio:
-introduzione e dimostrazione funzionamento nuovi costrutti linguaggio, discussione e correzione esercizi assegnati, svolgimento individuale esercizi assegnati.
Materiale di riferimento
D.S. Malik: Programmazione in C++. Apogeo, 2013.

L.J. Aguilar: Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti. McGraw-Hill, 2008.
Modalità di verifica dell’apprendimento e criteri di valutazione
La prova d'esame si compone di una prova scritta e di una prova di laboratorio. Ciascuna prova viene valutata indipendentemente e in caso di valutazione positiva (maggiore o uguale a 18) di entrambe le prove, i due voti concorrono a formare il voto finale, dato dalla media aritmetica dei due voti, arrotondata per eccesso all'intero successivo.

La prova scritta si svolge senza l'uso di testi e/o appunti e verte sulle regole concettuali fondamentali del C++ e sullo sviluppo sulla carta di semplici algoritmi.
La prova di laboratorio prevede la messa a punto di algoritmi in C++ attinenti argomenti esplicitamente trattati nel corso e/o nei corsi svolti in parallelo (analisi, meccanica e statistica), durante la prova lo studente può consultare materiale bibliografico e la cartella personale che ha compilato durante le sessioni di laboratorio (e completato in modo autonomo).
INF/01 - INFORMATICA - CFU: 6
Laboratori: 36 ore
Lezioni: 24 ore

CORSO C

Responsabile
Periodo
Primo semestre
Programma
Programma delle lezioni di teoria
- Cos'è l'informatica: mezzi fisici e teorici per l'elaborazione dell'informazione
- Il concetto di algoritmo, esempi: algoritmo di Euclide, semplici algoritmi numerici
- Dagli algoritmi ai programmi: esecutori e linguaggi di programmazione
- L'informazione e la sua rappresentazione numerica (testi, suoni, immagini), digitalizzazione dell'informazione
- Sistemi numerici in diverse basi, la base ottale, esadecimale, binaria (digitalizzazione)
- Rappresentazione dei numeri in binario
- Rappresentazione dei numeri negativi in modulo e segno e in complemento a 2
- Rappresentazione floating point dei razionali, mantissa, esponente, errori di troncamento
- Misure di informazione: bit, byte, multipli
- Architettura dei sistemi di calcolo, macchina di Von Neumann
- CPU, RAM, BUS, periferiche, principali funzionalità e caratteristiche
- Linguaggio macchina e assembly, programmazione a basso livello, svantaggi
- Programmazione ad alto livello, linguaggi e compilatori
- Ciclo di vita del software: progettazione, compilazione, linking, loading, esecuzione
- Possibili errori e debugging
- Programmazione strutturata e Teorema di Boehm-Jacopini. Le strutture di controllo
- Forme di selezione, esempi
- Le variabili, tipi e operazioni
- Forme di iterazione, esempi: gestione di stream di dati e test numerici
- Il primo programma C++. Lo stream di output cout
- I tipi in C++, principali caratteristiche e operazioni. Tipi interi, con virgola, caratteri e bool
- Dichiarazioni di variabili, loro riempimento mediante espressioni e operazioni di input. Lo stream cin
- Il tipo string. Le C-stringhe, loro struttura, gestione e principali funzionalità
- Le strutture di controllo in C++. La selezione, varie forme e if nidificati
- Il tipo bool per le condizioni, principali caratteristiche e operatori booleani. L'operatore condizionale
- Iterazione in C++, possibili forme. Il ciclo for. L'istruzione break
- Gli array monodimensionali in C++, principali caratteristiche, funzionalità e operazioni su array
- Array e allocazione in memoria, indirizzo d'inizio array. Array bidimensionali, esempi di utilizzo
- Il concetto di struct
- Gestione dei file in C++. Principali funzionalità della libreria fstream. Apertura, manipolazione e chiusura di stream su file
- Manipolatori di output, la libreria iomanip
- Gli array dinamici, caratteristiche, definizione e uso. Caricamento dati da file ad array dinamici
- Funzioni in C++. Sviluppo modulare top-down dei programmi. Forma di una function che restituisce valori e void
- Passaggio di parametri, per valore e riferimento, significato. Forma modulare del sorgente e prototipi
- Gestione della memoria, record di attivazione, stack, heap, errori di stack overflow
- Funzioni C++ ricorsive, definizioni induttive di funzioni, loro implementazione mediante ricorsione
- Dinamica dello stack durante la ricorsione. Prestazioni iterativo vs. ricorsivo
- Cenni alla complessità worst case degli algoritmi
- Ricerca in un array. Soluzione lineare e binaria, implementazioni e analisi delle prestazioni
- Il problema di sorting, limiti inferiori alla complessità in tempo. Selection sort, implementazione e complessità in tempo quadratica
- Mergesort, specifica e implementazione
- Valutazione della complessità in tempo di mergesort mediante equazione di ricorrenza, tempo ottimale
- I puntatori, significato, definizione ed utilizzo. Puntatori a strutture ed oggetti
- Variabili dinamiche e puntatori, array dinamici, istruzione new. Memory leak e istruzione delete
- Operazioni sui puntatori, aritmetica dei puntatori. Utilitzzo dei puntatori per scorrere array, copia superficiale e profonda di array
- Array tradizionali come puntatori costanti, differenza con array dinamici. Array restituiti da funzioni, array su stack e su heap
- I parametri del main, acquisizione a linea di comando. Implementazioni di semplici comandi di sistema operativo

Programma delle esercitazioni di laboratorio
- I sistemi operativi, Linux e il file system
- L'utilizzo del terminale Linux, principali comandi
- L'ambiente di programmazione, editor, compilatori
- Primi programmi in C++
- Selezione e cicli in C++
- Array e struct
- Funzioni C++ e passaggio di parametri
- Creazione di librerie di funzioni. Implementazione librerie, file header
- Creazione file oggetto e loro linking
- Utilizzo del comando make e struttura di un makefile
- Uso di file in C++
Prerequisiti
Nessun particolare prerequisito richiesto.
Metodi didattici
Lezioni teoria: lezioni frontali.
Laboratorio: lezioni in laboratorio di calcolo.
Materiale di riferimento
Testi:
- D.S. Malik: Programmazione in C++. Apogeo, 2013.
- L.J. Aguilar: Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti. McGraw-Hill, 2008.
Entrambi i testi sono disponibili anche in inglese.

Siti web:
- Generale: http://www.l30-informatica.fisica.unimi.it/
- Ariel: https://ariel.unimi.it/
- Lab: https://github.com/scarrazza/informatica2021
Modalità di verifica dell’apprendimento e criteri di valutazione
L'esame consta di una prova scritta ed una prova di laboratorio:

- Nella prova scritta vengono proposti alcuni esercizi di programmazione atti in particolar modo a verificare la conoscenza delle basi teoriche della programmazione e del progetto di semplici algoritmi. La prova scritta ha durata di due ore durante le quali non è consentita la consultazione di alcuna fonte. Nella valutazione di tale prova, espressa in trentesimi, viene considerata sia la capacità di progettare concettualmente algoritmi sia la correttezza formale della specifica di tali algoritmi nel linguaggio di programmazione considerato.

- Nella prova di laboratorio viene proposto un progetto di analisi dei dati relativamente complesso per il quale si richiede la scrittura di codice funzionante e ben strutturato. La prova di laboratorio ha durata di circa tre ore durante le quali gli studenti possono avvalersi del software sviluppato durante le esercitazioni di laboratorio. Nella valutazione di tale prova, espressa in trentesimi, viene valutata sia la capacità progettuale di algoritmi sia la capacità di scrivere codice modulare, ben strutturato e mantenibile.

Il voto finale, espresso in trentesimi, attribuito allo studente per l'insegnamento in questione origina da un'opportuna media delle prove scritta e di laboratorio.
INF/01 - INFORMATICA - CFU: 6
Laboratori: 36 ore
Lezioni: 24 ore
Docente/i
Ricevimento:
Lunedi a venerdi a partire dalle 12:30
Via Celoria 16, ufficio DC/1/4
Ricevimento:
su appuntamento via mail
Uff. S 6008, VI piano, Dip. Informatica "Giovanni Degli Antoni", via Celoria 18, 20133 Milano, Italy
Ricevimento:
Lunedi, 14:00 - 15:00 (o su appuntamento)
Stanza C12, quinto piano edificio LITA, Dipartimento di Fisica, via Celoria 16 (durante la fase emergenziale COVID-19: modalità remota via Zoom)