PROGRAMMAZIONE I E LABORATORIO A - L

Anno accademico 2018/2019 - 1° anno
Docenti Crediti: 9
SSD: INF/01 - Informatica
Organizzazione didattica: 225 ore d'impegno totale, 153 di studio individuale, 36 di lezione frontale, 24 di esercitazione, 12 di laboratorio
Semestre:

Obiettivi formativi

  • PROGRAMMAZIONE I

    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 ed implementare algoritmi ad-hoc per la risoluzione di nuovi problemi oltre alla possibilità di acquisire facilmente ed in breve tempo altri linguaggi di programmazione Object-Oriented.
  • LABORATORIO

    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 ed implementare algoritmi ad-hoc per la risoluzione di nuovi problemi oltre alla possibilità di acquisire facilmente ed in breve tempo altri linguaggi di programmazione Object-Oriented.

Modalità di svolgimento dell'insegnamento

  • PROGRAMMAZIONE I

    Lezioni frontali con l'ausilio del videoproiettore.

  • LABORATORIO

    Lezioni frontali con l'ausilio del videoproiettore.


Prerequisiti richiesti

  • PROGRAMMAZIONE I

    Nessun prerequisito.

  • LABORATORIO

    Nessun prerequisito.


Frequenza lezioni

  • PROGRAMMAZIONE I

    Frequenza obbligatoria, bi-settimanale secondo il calendario pubblicato in www.dmi.unict.it

  • LABORATORIO

    Frequenza obbligatoria, bi-settimanale secondo il calendario pubblicato in www.dmi.unict.it


Contenuti del corso

  • PROGRAMMAZIONE I

    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.
  • LABORATORIO

    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

  • PROGRAMMAZIONE I
    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.

  • LABORATORIO
    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

PROGRAMMAZIONE I
 ArgomentiRiferimenti testi
1Tipi di dato ed operatori1..7 
2Costrutti di controllo del flusso1..7 
3Array ed algoritmi notevoli (ricerca, ordinamento, fusione)1..7 
4Puntatori e gestione dinamica della memoria1..7 
5Ricorsione1..7 
6Classi ed oggetti1..7 
7Relazione di contenimento: composizione ed aggregazione1..7 
8Relazione di ereditarietà1..7 
9Polimorfismo1..7 
10Overloading degli operatori1..7 
11Codice generico1..7 
LABORATORIO
 ArgomentiRiferimenti testi
1Tipi di dato ed operatori1..7 
2Costrutti di controllo del flusso1..7 
3Array ed algoritmi notevoli (ricerca, ordinamento, fusione)1..7 
4Puntatori e gestione dinamica della memoria1..7 
5Ricorsione1..7 
6Classi ed oggetti1..7 
7Relazione di contenimento: composizione ed aggregazione1..7 
8Relazione di ereditarietà1..7 
9Polimorfismo1..7 
10Overloading degli operatori1..7 
11Codice generico1..7 

Verifica dell'apprendimento

Modalità di verifica dell'apprendimento

  • PROGRAMMAZIONE I
    • 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.
  • LABORATORIO
    • 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

  • PROGRAMMAZIONE I

    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

    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?
  • LABORATORIO

    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

    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?