PROGRAMMAZIONE I M - Z

Anno accademico 2015/2016 - 1° anno - Curriculum A e Curriculum B
Docente: Gianluca CINCOTTI
Crediti: 9
SSD: INF/01 - Informatica
Organizzazione didattica: 225 ore d'impegno totale, 153 di studio individuale, 72 di lezione frontale
Semestre:

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)

  1. Introduzione alla programmazione
    1. Problemi; Algoritmi; Diagrammi di flusso.
    2. Variabili; Espressioni; Assegnazioni.
    3. Notazione lineare strutturata; Teorema di Böhm-Jacopini.
    4. Struttura dati array.
  2. Linguaggi di programmazione : C++
    1. Linguaggi di programmazione: macchina, assembly e di alto livello.
    2. Problema della traduzione : compilazione ed interpretazione.
    3. Installazione del compilatore; Primo programma: Editing, Compiling, Running, Debugging.
  3. Costrutti del linguaggio
    1. Tipi di dato; Operatori predefiniti; Conversioni di tipo; Gestione dell’I/O.
    2. Controllo del flusso: costrutti di selezione if-then-else e switch, ed iterativi while e do-while.
  4. Introduzione alla Programmazione Orientata agli Oggetti
    1. Oggetti: stato e comportamento; Classi; Istanziazione di oggetti: costruttori.
    2. Messaggi: struttura, parametri, tipi di messaggi.
    3. Relazione di composizione/aggregazione per gli oggetti.
  5. Struttura dati array e stringhe di caratteri
    1. Array di tipi predefiniti e di oggetti. Array bidimensionali.
    2. Costrutto iterativo for.
    3. Sequenze di caratteri : array di char ed oggetti stringa.

 

Modulo B − Caratteristiche avanzate del linguaggio C++ (2,5CFU)

  1. Dichiarazione di classi
    1. Struttura della classe: attributi ed operazioni; Modificatori di accesso.
    2. Implementazione di metodi: valore di ritorno, passaggio di parametri per valore e per riferimento; Categorie di memorizzazione delle variabili; Regole di visibilità.
    3. Implementazione del costruttore.
  2. Puntatori ed Array
    1. Puntatori; Operatori di indirizzo e di dereferenzazione. Aritmetica dei puntatori. Puntatori ed array; Puntatori come parametro; Allocazione dinamica della memoria.
    2. Puntatori a funzioni; Il puntatore this; Indirizzamento multilivello.
    3. Riferimenti; Enumerazioni; Unioni; Campi di bit.
    4. Array 2D : Array allocati dinamicamente, Array come parametri, Array frastagliati; Array multidimensionali;.
  3. Elementi avanzati del linguaggio
    1. Il modificatore const per i puntatori e per i metodi; Argomenti standard per i parametri di funzioni. Clausola Namespace; Dichiarazioni forward; Funzioni inline.
    2. Implementazione della relazione di composizione/aggregazione.
    3. Overloading di metodi; Costruttori e distruttori. Costruttore di copia.
    4. Funzioni e classi friend; Attributi e metodi statici.

 

Modulo C − Tecniche di Programmazione (0,5CFU)

  1. Algoritmi notevoli
    1. Algoritmi di Ricerca: lineare in una sequenza ordinata e non, ricerca con sentinella, ricerca del massimo/minimo, ricerca dicotomica iterativa.
    2. Algoritmi di Ordinamento: Bubblesort, Selectionsort, Insertionsort.
    3. Algoritmi di Fusione: Natural-merge.
  2. Ricorsione
    1. Definizione di metodi ricorsivi; Calcolo del fattoriale.
    2. Gestione delle chiamate ai metodi mediante stack delle attivazioni.
    3. Ricorsione di coda e non di coda.
    4. Efficienza della ricorsione: numeri di Fibonacci.
    5. Applicazioni della ricorsione: Ricerca dicotomica, Torre di Hanoi, Segmentazione binaria di un righello.

 

Modulo D − Progettazione di software orientato agli oggetti (3CFU)

  1. Ereditarietà
    1. Definizione; Relazione ISA; Derivazioni e modalità di accesso: protected.
    2. Gerarchie ereditarie di classi. Overriding di metodi. Operatore :: risolutore di scope.
    3. Lista di inizializzazione e modalità d’esecuzione di costruttori e distruttori ereditati.
    4. Ereditarietà multipla. Classi base virtuali.
  2. Polimorfismo e Classi astratte
    1. Puntatori a classi derivate; Funzioni virtuali; Late-binding. Polimorfismo.
    2. Gerarchie ereditarie di classi polimorfe.
    3. Funzioni virtuali pure; Classi astratte; Interfacce.
    4. RTTI: typeid e dynamic_cast.
  3. Principi di progettazione orientata agli oggetti
    1. Diagrammi UML per le classi.
    2. Progettazione ed analisi nel paradigma OOP.
  4. Overloading degli operatori.
    1. Tipo di overloading di operatori : non-membro, friend, membro.
    2. Operatori prefissi e postfissi “++” e “--”.
    3. Cenni ad operatori di assegnamento “=”, di indicizzazione “[ ]” e “( )” e di cast.
    4. Operatori di I/O.
  5. Programmazione generica.
    1. Funzioni generiche. Classi generiche.

Testi di riferimento

  1. H.M. Deitel, P. J. Deitel, C++ Fondamenti di programmazione – Apogeo
  2. Eckel, Thinking in C++, Vol. I, 2°Ed. (anche online ed in italiano)
  3. Horstmann, C++ for everyone, 2°Ed. – Wiley (anche online)
  4. Lippman, Lajoye, C++ Corso di programmazione, 3°Ed. – Addison Wesley
  5. Pohl, Object-Oriented Programming Using C++, 2° Ed. – Addison Wesley
  6. Schildt, C++ La guida completa, 2°Ed. – McGraw-Hill (anche online)
  7. 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è:
    1. la capacità di descrivere ed implementare semplici procedimenti algoritmici,
    2. la conoscenza dettagliata del linguaggio di programmazione C++,
    3. 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:

  1. prova teorica di programmazione imperativa (verifica gli obiettivi (a) e (b)),
  2. prova pratica di laboratorio (verifica gli obiettivi (b) e (c)),
  3. 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.