Docente
|
MAIELI ROBERTO
(programma)
1. Problemi ed algoritmi Introduzione alle caratteristiche del calcolatore ed al rapporto programmatore/esecutore; compiti ed abilità del programmatore; principali caratteristiche ed abilità dell’esecutore, operazioni di base (logiche, aritmetiche e di confronto). Modelli di macchina calcolatrice: cenni sul modello di Von Neumann e sulla macchina di Turing. Linguaggi di programmazione: linguaggi imperativi e dichiarativi. Istruzioni fondamentali di un linguaggio di programmazione procedurale generico. Algoritmi e programmi; diagrammi di flusso. Regole della programmazione strutturata, cenni sul teorema di Jacopini-Bohm; approccio top–down alla soluzione di un problema.
2. Il linguaggio C Organizzazione della memoria di un calcolatore, indirizzi, parole, puntatori. Codifica binaria. Tipi di dato, strutture dati (array, matrici, pile, code, code di priorità, liste, alberi, grafi). Linguaggio macchina, linguaggi di alto livello; compilatori ed interpreti, compilazione ed esecuzione di un programma C in ambiente UNIX/Linux. Il linguaggio C: scopi e principali caratteristiche. La struttura di un programma C, l’inclusione degli header, dichiarazione delle variabili; le librerie. Tipi di dato elementari in linguaggio C: interi,floating point, double, char. Puntatori; aritmetica sui puntatori. Array e matrici e loro rappresentazione in memoria. Strutture dati complesse: liste, alberi, grafi; l’istruzione “struct”. Operatore di assegnazione, operatori aritmetici in C in forma estesa e compatta. Strutture di controllo: “if...else...”, “while...”, “do...while”, “for...”. Funzioni: funzioni di libreria e funzioni definite dall’utente. Passaggio di parametri per valore e per indirizzo alle funzioni. Funzioni ricorsive. Funzioni di input/output: printf, scanf, fprintf, fscanf; funzioni per la gestione della memoria: malloc, free, sizeof; gestione di liste di record collegati tramite puntatori.
3. Algoritmi di ordinamento Algoritmi di ordinamento elementari: Insertion sort, Selection sort, Bubble sort; l’approccio “divide et impera”, l’algoritmo Quick sort. Strutture di tipo LIFO (Last In First Out), pile; strutture di tipo FIFO (First In First Out), code; code di priorità, gli heap. Algoritmi ottimi per l’ordinamento: Heap sort, Merge sort. Complessità di un algoritmo, la notazione “O grande”, analisi della complessità degli algoritmi di ordinamento.
4. Algoritmi elementari sui grafi Definizioni principali: grafo, grafo orientato; sottografo, sottografo indotto; cammino, cammino semplice, grafo connesso, grafo fortemente connesso, grafo completo, clique, ciclo, grafo aciclico; alberi, foreste, spanning treedi un grafo. Strutture dati per la rappresentazione di grafi mediante un calcolatore: liste di adiacenza e matrici di adiacenza. Algoritmi di visita di un grafo: visita in ampiezza (BFS), visita in profondità (DFS), ordinamento topologico di un grafo orientato aciclico. Problemi di cammino minimo su un grafo, l’algoritmo di Dijkstra. Alberi binari di ricerca: definizione e algoritmi per l’ordinamento degli elementi, la ricerca di un elemento, la ricerca del massimo e del minimo l’inserimento e la cancellazione di un vertice dell’albero. Analisi della complessità degli algoritmi presentati. Cenni sulle classi dei problemi P, NP, NP-completi. Il problema “P=NP”.
(testi)
[1] T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein, Introduzione agli algoritmi e strutture dati. McGraw–Hill, (Terza edizione, 2010). [2] M. Liverani, Programmare in C. Esculapio, (Seconda edizione, 2013). [3] A. Bellini, A. Guidi, Linguaggio C - Guida alla programmazione. McGraw-Hill, (Quarta edizione, 2009).
|