Le lezioni
Diario delle lezioni dell'anno accademico 2026/2027
Le lezioni del corso IN110 Algoritmi e Strutture Dati si tengono nel primo semestre (settembre 2026 - gennaio 2027) con il seguente orario:
- lunedì ore 14:00-16:00 (tutorato: aula M1);
- martedì ore 9:00-11:00 (lezione: aula M1, prof. Marco Liverani);
- giovedì ore 14:00-17:00 (esercitazione: laboratorio, prof. Alessandro Ravoni);
- venerdì ore 9:00-11:00 (lezione: aula M1, prof. Marco Liverani).
Di seguito si riporta una sintesi degli argomenti trattati nel corso delle lezioni in aula e delle esercitazioni di laboratorio.
- Lezione n. 1 - lunedì 21 settembre 2026
-
- Presentazione del corso: argomenti che tratteremo, orario delle lezioni, orario delle esercitazioni, orario di ricevimento, modalità di esame (scarica il documento: “Presentazione del corso di Algoritmi e Strutture Dati”
). - Introduzione alla progettazione di algoritmi: un approccio intuitivo mediante alcuni esempi elementari.
- Presentazione del corso: argomenti che tratteremo, orario delle lezioni, orario delle esercitazioni, orario di ricevimento, modalità di esame (scarica il documento: “Presentazione del corso di Algoritmi e Strutture Dati”
- Lezione n. 2 - martedì 22 settembre 2026
-
- Esecutore e algoritmi: problema e istanza di un problema, caratteristiche dell'esecutore, compiti del progettista degli algoritmi, capacità del calcolatore/esecutore; algoritmi; esempi di pseudo-codifica di algoritmi per la soluzione di problemi elementari (primi k multipli di n, sommatoria dei primi n naturali, fattoriale di un numero naturale, verifica dell'ordinamento crescente di una sequenza di numeri). Linguaggi imperativi, istruzioni fondamentali di in linguaggio imperativo.
- Lezione n. 3 - giovedì 24 settembre 2026
-
- Algoritmi, diagrammi di flusso, programmazione strutturata: linguaggi imperativi, istruzioni fondamentali di un linguaggio imperativo, rappresentazione di algoritmi mediante diagrammi di flusso, strutture algoritmiche di tipo sequenziale, iterativa, condizionale; regole della programmazione strutturata, cenni sul Teorema Fondamentale della Programmazione Strutturata di Giuseppe Jacopini e Corrado Böhm; esempi: ricerca del massimo fra 2, 3 e n numeri, verifica dell'ordinamento di una sequenza, verifica della divisibilità di un numero naturale per un altro, calcolo del quoziente e del resto nella divisione di due numeri naturali (scarica il documento: “Algoritmi e diagrammi di flusso”
).
- Algoritmi, diagrammi di flusso, programmazione strutturata: linguaggi imperativi, istruzioni fondamentali di un linguaggio imperativo, rappresentazione di algoritmi mediante diagrammi di flusso, strutture algoritmiche di tipo sequenziale, iterativa, condizionale; regole della programmazione strutturata, cenni sul Teorema Fondamentale della Programmazione Strutturata di Giuseppe Jacopini e Corrado Böhm; esempi: ricerca del massimo fra 2, 3 e n numeri, verifica dell'ordinamento di una sequenza, verifica della divisibilità di un numero naturale per un altro, calcolo del quoziente e del resto nella divisione di due numeri naturali (scarica il documento: “Algoritmi e diagrammi di flusso”
- Lezione n. 4 - venerdì 25 settembre 2026
-
- Algoritmi, diagrammi di flusso, programmazione strutturata: esercizi per la pseudo-codifica di un algoritmo e la rappresentazione di un diagramma di flusso per la risoluzione dei seguenti problemi: verifica della primalità di un numero naturale, minimo comune multiplo tra due numeri naturali; un algoritmo sbagliato per il calcolo della radice quadrata di un numero naturale.
- Cenni sulla calcolabilità: alcuni problemi non risolubili per via algoritmica: esempi basati sulla congettura di Goldbach e la congettura di Collatz / Ulam.
- Lezione n. 5 - martedì 29 settembre 2026
-
- La Macchina di Turing: definizione della MdT come modello di calcolo astratto; esempio di MdT per il calcolo del successore di un numero naturale espresso in base 2; funzioni, macchine di Turing, algoritmi, calcolabilità delle funzioni elementari, composizione di funzioni e ricorsione come operazioni che preservano la calcolabilità; codifica di una macchina di Turing e del suo input come numeri naturali.
- Calcolabilità e modelli di calcolo: problemi calcolabili e non calcolabili, alcuni esempi; modelli di calcolo astratti: la macchina di Turing.
- Calcolabilità e modelli di calcolo: il modello di Von Neumann; cenni sul problema della fermata, cenni sulla Tesi di Church-Turing (scarica il documento: “Appunti sui modelli di calcolo”
).
- Lezione n. 6 - venerdì 2 ottobre 2026
-
- Linguaggi di programmazione: classificazion dei linguaggi in base al paradigma di programmazione, alcuni esempi. Linguaggi di programmazione di basso livello e di alto livello, linguaggio macchina; processo di traduzione del codice da linguaggio di programmazione di alto livello (codice sorgente) a linguaggio macchina (codice binario eseguibile), esecuzione del programma (scarica il documento: “Appunti sui linguaggi di programmazione”
). - Rappresentazione delle informazioni: codifica decimale e binaria di numeri interi positivi; struttura della memoria, bit, byte; rappresentazione di numeri interi “grandi”, mediante parole ottenute concatenando più byte. Rappresentazione di numeri interi relativi, rappresentazione di numeri razionali (floating point), rappresentazione di caratteri alfanumerici (scarica il documento: “Appunti sulla rappresentazione delle informazioni in memoria”
).
- Linguaggi di programmazione: classificazion dei linguaggi in base al paradigma di programmazione, alcuni esempi. Linguaggi di programmazione di basso livello e di alto livello, linguaggio macchina; processo di traduzione del codice da linguaggio di programmazione di alto livello (codice sorgente) a linguaggio macchina (codice binario eseguibile), esecuzione del programma (scarica il documento: “Appunti sui linguaggi di programmazione”
- Lezione n. 7 - martedì 6 ottobre 2026
-
- Introduzione al linguaggio C: struttura e sintassi generale di un programma C, direttive del precompilatore per l'inclusione di librerie, la funzione main, dichiarazione di variabili, tipi di dato, la funzione printf, la funzione scanf.
- Struttura di controllo condizionale: la struttura di controllo condizionale if... else..., esempi.
- Operatori di confronto: operatori di confronto, espressioni logiche, connettori logici and, or, not, valutazione di espressioni booleane, esempi.
- Lezione n. 8 - venerdì 9 ottobre 2026
-
- Strutture di controllo iterative: le istruzioni while, do-while e for; esempi.
- Operatori aritmetici: operatori aritmetici, anche in forma compatta (++, -- in forma prefissa e postfissa; gli operatori di assegnazione +=, -=, *= e /=). L'operazione di cast. L'operatore modulo “%” per il calcolo del resto nella divisione tra interi.
- Lezione n. 9 - lunedì 12 ottobre 2026
-
- Array: array monodimensionali (vettori) e multidimensionali (matrici), dichiarazione di array, allocazione in memoria di un array; esempi.
- Stringhe di caratteri: rappresentazione di stringhe di caratteri come array, il carattere nullo “\0” di terminazione di una stringa, le funzioni printf e scanf con le stringhe; esempi.
- Lezione n. 10 - martedì 13 ottobre 2026
-
- Stringhe di caratteri: esempi ed esercizi sulle stringhe di caratteri, cenni sulle funzioni della libreria string.h.
- Numeri pseudo-casuali: generazione di sequenze di numeri pseudo-casuali, le funzioni srand e rand, la funzione time, esempi per la generazione di numeri interi pseudo-casuali nell'intervallo (a, b), esempi (scarica il documento: “Appunti sul linguaggio C”
).
- Esercitazione in laboratorio - giovedì 15 ottobre 2026
-
- Introduzione all'uso del laboratorio informatico: struttura del laboratorio e della sua rete, accesso alle postazioni di lavoro, accesso al server mediante il protocollo SSH, accesso al server mediante connessioni Internet dall'esterno (scarica il documento: “Accesso alle risorse del laboratorio informatico del Dipartimento di Matematica”
e le slide sull'uso del laboratorio informatico
; si suggerisce di prendere visione anche del documento “UNIX: introduzione elementare”
per una migliore comprensione dell'uso della shell del sistema operativo UNIX/Linux). - Programmazione in C: scrittura di un programma in linguaggio C, compilazione, debugging ed esecuzione (documento con i testi e le soluzioni di alcuni esercizi che non abbiamo avuto il tempo di svolgere durante la lezione: esercitazione01.pdf
).
- Introduzione all'uso del laboratorio informatico: struttura del laboratorio e della sua rete, accesso alle postazioni di lavoro, accesso al server mediante il protocollo SSH, accesso al server mediante connessioni Internet dall'esterno (scarica il documento: “Accesso alle risorse del laboratorio informatico del Dipartimento di Matematica”
- Lezione n. 11 - venerdì 16 ottobre 2026
-
- Definizione di funzioni: definizione di funzioni in un programma C, nome della funzione, valore restituito dalla funzione, parametri, variabili locali, esempi.
- Passaggio dei parametri alle funzioni: passaggio di parametri per valore e per indirizzo ad una funzione, gli operatori “&” e “*”, esempi.
- Passaggio di array a funzioni: passaggio di un array (dell'indirizzo di memoria del primo elemento dell'array) ad una funzione; le funzioni per l'acquisizione in input e la stampa di un vettore; aritmetica sui puntatori; esempi con la notazione vettoriale e con l'uso esplicito di puntatori.
- Lezione n. 12 - martedì 20 ottobre 2026
-
- Crivello di Eratostene: calcolo dei numeri primi minori di n con il Crivello di Eratostene, strategia risolutiva, pseudo-codice e diagramma di flusso dell'algoritmo.
- Funzioni ricorsive: definizione di funzioni ricorsive, differenze ed analogie con procedure iterative, esempi (funzione fattoriale definita in modalità iterativa e ricorsiva).
- Esercitazione n. 2 - giovedì 22 ottobre 2026
-
- Esercizi sugli array: operazioni sugli array: intersezione, differenza, inversione (documento con i testi e le soluzioni degli esercizi: esercitazione02.pdf
).
- Esercizi sugli array: operazioni sugli array: intersezione, differenza, inversione (documento con i testi e le soluzioni degli esercizi: esercitazione02.pdf
- Lezione n. 13 - venerdì 23 ottobre 2026
-
- Problema dell'ordinamento (sort): definizione del problema dell'ordinamento di un insieme di dati, esempi.
- Algoritmo Selection Sort: strategia risolutiva del problema di ordinamento adottata dall'algoritmo di ordinamento per selezione, pseudo-codifica dell'algoritmo Selection Sort, diagramma di flusso, codifica in linguaggio C, esempi.
- Complessità computazionale di un algoritmo: problema, istanza di un problema, “dimensione” dell'istanza di un problema; complessità computazionale di un algoritmo come funzione che esprime una stima del numero di operazioni eseguite dall'algoritmo in funzione della dimensione dell'istanza del problema. La notazione “O grande”, esempi di classi di complessità.
- Algoritmo Insertion Sort: strategia risolutiva dell'algoritmo Insertion Sort, pseudo-codifica, diagramma di flusso, codifica in linguaggio C, esempi; calcolo del numero di operazioni fondamentali eseguite per risolvere un'istanza del problema, nel caso migliore e nel caso peggiore, complessità dell'algoritmo.
- Lezione n. 14 - martedì 27 ottobre 2026
-
- Complessità computazionale di un algoritmo: ancora sulla funzione complessità che fornisce una stima del numero di operazioni svolte eseguendo un certo algoritmo per risolvere l'istanza di dimensione n di un problema; esempi con classi di complessità computazionale differenti, notazione “O grande”.
- Algoritmo Bubble Sort: strategia risolutiva, pseudo-codifica dell'algoritmo, calcolo della complessità computazionale, codifica in linguaggio C dell'algoritmo Bubble Sort, esempi.
- Esercitazione n. 3 - giovedì 29 ottobre 2026
-
- Esercizi sulle stringhe e sulle matrici: Letta una parola S, stabilire se S è palindroma (ossia se è simmetrica); acquisire in input un array A di n numeri interi minori di 100; per ogni elemento di A stampare il numero di volte che compare nel vettore; letta in input una matrice A di n × m numeri interi, stampa la colonna con il maggior numero di elementi dispari (documento con i testi e le soluzioni degli esercizi: esercitazione03.pdf
).
- Esercizi sulle stringhe e sulle matrici: Letta una parola S, stabilire se S è palindroma (ossia se è simmetrica); acquisire in input un array A di n numeri interi minori di 100; per ogni elemento di A stampare il numero di volte che compare nel vettore; letta in input una matrice A di n × m numeri interi, stampa la colonna con il maggior numero di elementi dispari (documento con i testi e le soluzioni degli esercizi: esercitazione03.pdf