PROGRAMMAZIONE I M - Z
Anno accademico 2017/2018 - 1° annoCrediti: 9
Organizzazione didattica: 225 ore d'impegno totale, 153 di studio individuale, 36 di lezione frontale, 36 di esercitazione
Semestre: 1°
Obiettivi formativi
l corso presenta i fondamenti di programmazione degli elaboratori adottando C++ come linguaggio di riferimento.
In particolare sono presentati i concetti base della programmazione strutturata e di quella OOP (Object-Oriented Programming) senza tralasciare la codifica di algoritmi notevoli ed alcune tecniche di progettazione di software OOP.
Obiettivi formativi generali dell'insegnamento in termini di risultati di apprendimento attesi
- Conoscenza e capacità di comprensione (knowledge and understanding): l'obiettivo primario del corso è individuato nell’acquisizione da parte degli studenti della “filosofia” della programmazione strutturata e di quella OOP, oltre che nella conoscenza dettagliata della sintassi e della semantica del linguaggio di programmazione C++.
Il corso rivolge una particolare attenzione allo sviluppo di codice ben scritto e ben strutturato utilizzando le tecniche di base per lo sviluppo di software nel paradigma Object-Oriented. - Capacità di applicare conoscenza e comprensione (applying knowledge and understanding): si intende fornire gli strumenti per conseguire le seguenti abilità pratiche e professionali:
- Tradurre in codice idee algoritmiche;
- Progettare, descrivere ed implementare programmi in C++;
- Debuggare programmi C++ con tools professionali;
- Comprendere semplici algoritmi ricorsivi;
- Analizzare e descrivere soluzioni Object-Oriented mediante diagrammi UML (Unified Language Modeling) delle classi;
- Progettare, implementare ed utilizzare correttamente gerarchie di classi polimorfe e codice generico;
- Leggere, comprendere ed analizzare codice C++ di terze parti anche in termini di efficienza;
- Orientarsi nella documentazione delle librerie. - Autonomia di giudizio (making judgements): attraverso l'esame di numerosi esempi di codice Object-Oriented e una consistente componente pratica che prevede lo svolgimento di esercizi all'elaboratore, il discente sarà in grado, sia in forma autonoma che in forma cooperativa, di analizzare problemi e progettare ed implementare le relative soluzioni software.
- Abilità comunicative (communication skills): lo studente acquisirà le necessarie abilità comunicative e di appropriatezza espressiva nell'impiego del linguaggio verbale tecnico e del linguaggio visuale UML nell'ambito della programmazione degli elaboratori.
- Capacità di apprendimento (learning skills): il corso intende fornire al discente le necessarie metodologie teoriche e pratiche da mettere in campo in contesti professionali e, in particolare, la capacità di formulare algoritmi ad-hoc per la risoluzione di nuovi problemi e la possibilità di acquisire facilmente ed in breve tempo un altro linguaggio di programmazione Object-Oriented.
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.
Programmazione del corso
* | Argomenti | Riferimenti testi | |
---|---|---|---|
1 | * | Tipi di dato ed operatori, Costrutti di controllo del flusso | 1-7 |
2 | * | Array ed algoritmi notevoli (ricerca, ordinamento, fusione) | 1-7 |
3 | Puntatori e gestione dinamica della memoria, Ricorsione | 1-7 | |
4 | * | Classi ed oggetti, Relazione di composizione e aggregazione | 1-7 |
5 | * | Ereditarietà e Polimorfismo | 1-7 |
N.B. La conoscenza degli argomenti contrassegnati con l'asterisco è condizione necessaria ma non sufficiente per il superamento dell'esame. Rispondere in maniera sufficiente o anche più che sufficiente alle domande su tali argomenti non assicura, pertanto, il superamento dell'esame.
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.