PROGRAMMAZIONE I A - L

Anno accademico 2017/2018 - 1° anno
Docente: Gianluca CINCOTTI
Crediti: 9
SSD: INF/01 - Informatica
Organizzazione didattica: 225 ore d'impegno totale, 153 di studio individuale, 36 di lezione frontale, 36 di esercitazione
Semestre:

Obiettivi formativi

Descrizione generale sintetica

Il 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

Tri-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.



Programmazione del corso

 *ArgomentiRiferimenti testi
1*Tipi di dato ed operatori, Costrutti di controllo del flusso1..7 
2*Array ed algoritmi notevoli (ricerca, ordinamento, fusione)1..7 
3 Puntatori e gestione dinamica della memoria, Ricorsione1..7 
4*Classi ed oggetti, Relazione di composizione e aggregazione1..7 
5*Ereditarietà e Polimorfismo1..7 
6 Codice generico, Overloading degli operatori1..7 
* Conoscenze minime irrinunciabili per il superamento dell'esame.

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è:
    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.

Esempi di domande e/o esercizi frequenti

Alcuni testi di compiti per la prova teorica (1) e per la prova di laboratorio (2) si trovano in:

http://www.dmi.unict.it/~messina/teaching.html#prog1_2017_18

Alcune tipiche domande per la prova orale (3) sono le seguenti:

  • Descrivere l'algoritmo "InsertionSort".
  • Implementare una matrice con gestione dinamica della memoria.
  • Qual è la differenza tra aggregazione e composizione?
  • Cos'è il polimorfismo?
  • A cosa servono le funzioni virtuali pure?
  • Come si implementa l'overloading dell'operatore di incremento in forma prefissa?