Informatica

A.A. 2026/2027
6
Crediti massimi
60
Ore totali
SSD
INFO-01/A
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
Corso singolo

Questo insegnamento non può essere seguito come corso singolo. Puoi trovare gli insegnamenti disponibili consultando il catalogo corsi singoli.

Programma e organizzazione didattica

Gruppo 1

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 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:
- sito dell'insegnamento sulla piattaforma di ateneo myAriel
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. Una votazione tra 18 e 23 indica un'adeguata conoscenza dei concetti teorici e pratici che stanno alla base dell'informatica e della programmazione, una votazione compresa tra 24 e 28 indica una buona conoscenza dei suddetti concetti, una votazione superiore indica ottima conoscenza e una certa dose di originalità nell'applicare i concetti base dell'informatica e della programmazione.
INFO-01/A - Informatica - CFU: 6
Laboratori: 36 ore
Lezioni: 24 ore

Gruppo 2

Responsabile
Periodo
Primo semestre
INFO-01/A - Informatica - CFU: 6
Laboratori: 36 ore
Lezioni: 24 ore

Gruppo 3

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:
- Ariel: https://myariel.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 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.
INFO-01/A - 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
Ufficio S 6008, VI piano, Dip. Informatica "Giovanni Degli Antoni", via Celoria 18, 20133 Milano, Italy
Ricevimento:
Martedì, 9:00-10:00 o su appuntamento (richiesta via e-mail al docente)
Stanza C12, quinto piano edificio LITA, Dipartimento di Fisica, via Celoria 16.