PROGRAMMAZIONE I M - Z
Anno accademico 2015/2016 - 1° anno - Curriculum A e Curriculum BCrediti: 9
Organizzazione didattica: 225 ore d'impegno totale, 153 di studio individuale, 72 di lezione frontale
Semestre: 1°
Prerequisiti richiesti
Nessun prerequisito.
Frequenza lezioni
Bi-settimanale secondo il calendario pubblicato in www.dmi.unict.it
Contenuti del corso
Modulo A − Elementi di Programmazione Imperativa ed Orientata agli Oggetti (3CFU)
- Introduzione alla programmazione
- Problemi; Algoritmi; Diagrammi di flusso.
- Variabili; Espressioni; Assegnazioni.
- Notazione lineare strutturata; Teorema di Böhm-Jacopini.
- Struttura dati array.
- Linguaggi di programmazione : C++
- Linguaggi di programmazione: macchina, assembly e di alto livello.
- Problema della traduzione : compilazione ed interpretazione.
- Installazione del compilatore; Primo programma: Editing, Compiling, Running, Debugging.
- Costrutti del linguaggio
- Tipi di dato; Operatori predefiniti; Conversioni di tipo; Gestione dell’I/O.
- Controllo del flusso: costrutti di selezione if-then-else e switch, ed iterativi while e do-while.
- Introduzione alla Programmazione Orientata agli Oggetti
- Oggetti: stato e comportamento; Classi; Istanziazione di oggetti: costruttori.
- Messaggi: struttura, parametri, tipi di messaggi.
- Relazione di composizione/aggregazione per gli oggetti.
- Struttura dati array e stringhe di caratteri
- Array di tipi predefiniti e di oggetti. Array bidimensionali.
- Costrutto iterativo for.
- Sequenze di caratteri : array di char ed oggetti stringa.
Modulo B − Caratteristiche avanzate del linguaggio C++ (2,5CFU)
- Dichiarazione di classi
- Struttura della classe: attributi ed operazioni; Modificatori di accesso.
- Implementazione di metodi: valore di ritorno, passaggio di parametri per valore e per riferimento; Categorie di memorizzazione delle variabili; Regole di visibilità.
- Implementazione del costruttore.
- Puntatori ed Array
- Puntatori; Operatori di indirizzo e di dereferenzazione. Aritmetica dei puntatori. Puntatori ed array; Puntatori come parametro; Allocazione dinamica della memoria.
- Puntatori a funzioni; Il puntatore this; Indirizzamento multilivello.
- Riferimenti; Enumerazioni; Unioni; Campi di bit.
- Array 2D : Array allocati dinamicamente, Array come parametri, Array frastagliati; Array multidimensionali;.
- Elementi avanzati del linguaggio
- Il modificatore const per i puntatori e per i metodi; Argomenti standard per i parametri di funzioni. Clausola Namespace; Dichiarazioni forward; Funzioni inline.
- Implementazione della relazione di composizione/aggregazione.
- Overloading di metodi; Costruttori e distruttori. Costruttore di copia.
- Funzioni e classi friend; Attributi e metodi statici.
Modulo C − Tecniche di Programmazione (0,5CFU)
- Algoritmi notevoli
- Algoritmi di Ricerca: lineare in una sequenza ordinata e non, ricerca con sentinella, ricerca del massimo/minimo, ricerca dicotomica iterativa.
- Algoritmi di Ordinamento: Bubblesort, Selectionsort, Insertionsort.
- Algoritmi di Fusione: Natural-merge.
- Ricorsione
- Definizione di metodi ricorsivi; Calcolo del fattoriale.
- Gestione delle chiamate ai metodi mediante stack delle attivazioni.
- Ricorsione di coda e non di coda.
- Efficienza della ricorsione: numeri di Fibonacci.
- Applicazioni della ricorsione: Ricerca dicotomica, Torre di Hanoi, Segmentazione binaria di un righello.
Modulo D − Progettazione di software orientato agli oggetti (3CFU)
- Ereditarietà
- Definizione; Relazione ISA; Derivazioni e modalità di accesso: protected.
- Gerarchie ereditarie di classi. Overriding di metodi. Operatore :: risolutore di scope.
- Lista di inizializzazione e modalità d’esecuzione di costruttori e distruttori ereditati.
- Ereditarietà multipla. Classi base virtuali.
- Polimorfismo e Classi astratte
- Puntatori a classi derivate; Funzioni virtuali; Late-binding. Polimorfismo.
- Gerarchie ereditarie di classi polimorfe.
- Funzioni virtuali pure; Classi astratte; Interfacce.
- RTTI: typeid e dynamic_cast.
- Principi di progettazione orientata agli oggetti
- Diagrammi UML per le classi.
- Progettazione ed analisi nel paradigma OOP.
- Overloading degli operatori.
- Tipo di overloading di operatori : non-membro, friend, membro.
- Operatori prefissi e postfissi “++” e “--”.
- Cenni ad operatori di assegnamento “=”, di indicizzazione “[ ]” e “( )” e di cast.
- Operatori di I/O.
- Programmazione generica.
- Funzioni generiche. Classi generiche.
Testi di riferimento
- H.M. Deitel, P. J. Deitel, C++ Fondamenti di programmazione – Apogeo
- Eckel, Thinking in C++, Vol. I, 2°Ed. (anche online ed in italiano)
- Horstmann, C++ for everyone, 2°Ed. – Wiley (anche online)
- Lippman, Lajoye, C++ Corso di programmazione, 3°Ed. – Addison Wesley
- Pohl, Object-Oriented Programming Using C++, 2° Ed. – Addison Wesley
- Schildt, C++ La guida completa, 2°Ed. – McGraw-Hill (anche online)
- Stroustrup, C++ Linguaggio, libreria standard, principi di programmazione, 3°Ed. – Addison Wesley
I libri (1), (2), (3) ed (6) sono consigliati ai principianti.
Il libro (3) è fortemente consigliato ai principianti per la grande quantità di esercizi presenti in esso.
I libri (4) e (5) sono di livello intermedio e sono consigliati a chi è già nota la programmazione.
Il libro (7) è di livello avanzato ed è consigliato a chi è già nota la programmazione.
Verifica dell'apprendimento
Modalità di verifica dell'apprendimento
- L’esame consiste nella verifica degli obiettivi preposti per il corso e cioè:
- la capacità di descrivere ed implementare semplici procedimenti algoritmici,
- la conoscenza dettagliata del linguaggio di programmazione C++,
- la capacità di applicare il paradigma orientato agli oggetti (OOP) allo sviluppo del software.
A tal fine l’esame è composto da tre prove indipendenti atte a verificare i precedenti punti e si intenderà superato quando tutte e tre le prove saranno valutate sufficientemente:
- prova teorica di programmazione imperativa (verifica gli obiettivi (a) e (b)),
- prova pratica di laboratorio (verifica gli obiettivi (b) e (c)),
- prova teorica di programmazione orientata agli oggetti (verifica gli obiettivi (b) e (c)).
Le prove 1), 2) e 3) sono da considerarsi propedeutiche, pertanto, possono accedere alla prova 2) tutti coloro che abbiano superato la prova 1), e possono accedere alla prova 3) tutti coloro che abbiano superato la prova 2). Le varie prove possono essere superate in momenti differenti; la sufficienza conseguita in una certa prova sarà considerata valida per tutto l’A.A. (fino a Dicembre successivo al corso).
Ad ogni appello gli studenti potranno sostenere tutti e tre i tipi di prove, in particolare:
- la prova 1) può essere sostenuta alla data ufficiale dell’appello;
- la prova 2) può essere sostenuta alla data che sarà pubblicata nella homepage del docente (tale data sarà tipicamente 7 gg. dopo la data dell’appello). Per accedere al tale prova è necessario esibire il tesserino per il laboratorio ed utilizzare il corrispondente account assegnato.
- la prova 3) può essere sostenuta nello studio del docente durante un qualunque orario di ricevimento. Per accedere a tale prova lo studente deve risultare prenotato nel portale studenti.