Seguici su
Cerca

PROGRAMMAZIONE II E LABORATORIO O - Z
Modulo LABORATORIO

Anno accademico 2024/2025 - Docente: DANIELE FRANCESCO SANTAMARIA

Risultati di apprendimento attesi

Il corso di Programmazione 2 ha lo scopo di fornire gli strumenti per la risoluzione di semplici problemi connessi all'uso di alcune strutture dati elementari attraverso l'utilizzo della programmazione ad oggetti. In particolare il corso parte dall'introduzione del concetto di modello di dati astratto per poi introdurre ed approfondire diversi modelli dei dati quali: pile, code, liste e alberi e grafi. Verranno inoltre studiati i principali algoritmi di gestione delle strutture dati. In particolare i principali algoritmi di ordinamento come  quicksort e mergesort.

Il linguaggio C++ verrà usato come strumento principale per presentare le implementazioni delle strutture dati e degli algoritmi.

 

Obiettivi formativi generali dell'insegnamento in termini di risultati di apprendimento attesi.

 

  1. Conoscenza e capacità di comprensione (knowledge and understanding): l'obiettivo del corso è quello di far acquisire conoscenze che consentano allo studente di comprendere le idee ed i principi che stanno alla base della programmazione orientata agli oggetti; in particolare lo studente acquisirà le conoscenze dei principali costrutti del linguaggio C++ e delle strutture dati di base.
  2. Capacità di applicare conoscenza e comprensione (applying knowledge and understanding): lo studente acquisirà le competenze necessarie per utilizzare in modo corretto i concetti legati al polimorfismo, all'ereditarietà e all'uso delle classi. Inoltre, lo studente acquisirà le competenze necessarie ad utilizzare correttamente strutture dati di base quali, liste concatenate, pile, code e alberi binari.
  3. Autonomia di giudizio (making judgements): Attraverso esempi concreti di programmazione lo studente sarà in grado di utilizzare autonomamente gli strumenti forniti a lezione.
  4. Abilità comunicative (communication skills): lo studente acquisirà le necessarie abilità comunicative e di appropriatezza espressiva nell'ambito della programmazione in C++.
  5. Capacità di apprendimento (learning skills): il corso si propone, come obiettivo, di fornire allo studente le necessarie metodologie teoriche e pratiche per poter affrontare e risolvere autonomamente nuove problematiche che dovessero richiedere l'utilizzo della programmazione ad oggetti e delle strutture dati di base.

Modalità di svolgimento dell'insegnamento

L'insegnamento sarà svolto attraverso delle lezioni frontali (per un totale di 24 ore) in cui verranno presentati i contenuti del corso, anche attraverso delle dimostrazioni pratiche di programmazione in aula. Lo studente avrà a disposizione ulteriori ore di lezione frontale da svolgere con un tutor didattico, durante le quali avrà la possibilità di perfezionare la propria preparazione o colmare eventuali lacune. Inoltre lo studente avrà a disposizione una piattaforma di apprendimento attraverso la quale sarà possibile esercitarsi durante le ore di studio e autovalutarsi sui contenuti appresi a lezione. La medesima piattaforma fornisce un valido strumento per la preparazione all'esame.

Qualora l'insegnamento venisse impartito in modalità mista o a distanza potranno essere introdotte le necessarie variazioni rispetto a quanto dichiarato in precedenza, al fine di rispettare il programma previsto e riportato nel syllabus.

Prerequisiti richiesti

Lo studente che accede al corso di Programmazione II dovrà conoscere i fondamenti del paradigma di programmazione imperativa. Per poter sostenere l'esame è obbligatorio aver già superato l'esame di Programmazione I.

Frequenza lezioni

La frequenza delle lezioni  è obbligatoria.

Contenuti del corso

Il Programma didattico è diviso nelle seguenti parti:


Parte IntroduttivaRipasso e approfondimento di concetti introdotti nel corso di Programmazione 1

  • Array: inizializzazione di un array, array di caratteri e stringhe di testo, array multidimensionali, passaggio di vettori come parametri.
  • Puntatori e riferimenti: Riferimenti, puntatori, puntatori null, puntatore a puntatore, puntatori e array, array di puntatori, puntatori a stringhe, aritmetica dei puntatori, puntatori costanti e puntatori a costanti, puntatori come argomenti di funzioni, puntatori a funzioni, puntatori a strutture.
  • Allocazione dinamica della memoria: Gestione dinamica della memoria, l’operatore new, l’operatore delete, gestione dell’overflow di memoria, tipi di memoria in C++.


Parte 2: Programmazione avanzata a oggetti

  • Classi e oggetti: funzioni membro, metodi set, get e predicati, costruttori e distruttori standard, overloading e overriding di funzioni membro, altri costruttori.
  • Classi derivate: ereditarietà e polimorfismo: Classi derivate, tipi di ereditarietà, distruttori, ereditarietà multipla e composizione, binding, funzioni virtuali, polimorfismo, vantaggi del polimorfismo.
  • Template: Genericità, template in C++, template di funzioni, templatedi classi.
  • Sovraccaricamento degli operatori: Sovraccaricamento degli operatori unari e binari, sovraccaricamento degli operatori + e - e dell’operatore di assegnamento, sovraccaricamento degli operatori di inserimento, estrazione, new e delete, conversione di dati e operatori di conversione forzata di tipi.
  • Implementazione di un insieme mediante array dinamici: Interfaccia per l’implementazione di un insieme, espansione e contrazione di un array, elementi privati ed elementi pubblici, iteratore degli elementi di un insieme.


Parte 3: Ricorsione e ordinamento.

  • Algoritmi di ordinamento che sfruttano il concetto di ricorsione:

    • Merge Sort
    • Quick Sort  


Parte 4: Strutture dati elementari e loro implementazione in C++

  • Implementazione di strutture dati dinamiche sfruttando la OOP in C++
    • Liste: Implementazione di un insieme mediante liste, liste ordinate e liste non ordinate; operazioni con le liste: inserimento, cancellazione e ricerca.
    • Pile e code: Implementazione di pile e code mediante OOP.
    • Alberi: Gli alberi, struttura di un albero binario, alberi binari di ricerca ed operazioni base: inserimento, ricerca e cancellazione, visite preorder, postorder e inorder.
    • Grafi: Definizione di grafo, grafi orientati e non orientati, inserimento di un nodo, rappresentazione con matrici di adiacenza e con liste di adiacenza, inserimento di un arco. Visita in ampiezza e visita in profondità.

Testi di riferimento

Fondamenti di Programmazione in C++

Algoritmi, strutture dati e oggetti
Autore: Luis Joyanes Aguilar
Casa Editrice: McGraw-Hill

Questo volume introduce ai principi della programmazione scegliendo come linguaggio didattico proprio il C++, nonostante non lo si possa certamente definire tale. Il motivo che ci spinge in questa direzione è il desiderio di ridurre i tempi di formazione del programmatore, facendolo applicare, fin dai primi algoritmi, su un linguaggio professionale realmente utilizzato in grandi suite software.


Altro materiale disponibile sul canale Teams del corso: https://teams.microsoft.com/l/team/19%3AZUhI3BpwTmux0dAGHalm6k4TABXeJ9Xlb-e7Rp4tNXo1%40thread.tacv2/conversations?groupId=cf43421d-fa9c-4576-a6ad-d8a821a6835d&tenantId=baeefbc8-3c8b-4382-9126-e86bfef46ce6


Libri consigliati:

Effective C++ e More Effective C++

Autore: Scott Meyers
Casa Editrice: Addison-Wesley

Il testo è consigliato agli studenti che intendono approfondire il tema della programmazione C++ avanzata. Ogni capitolo del libro è costituito da più "temi" presentati sotto forma di brevi trattazioni indipendenti che forniscono consigli specifici, spiegazioni sulle sottigliezze del C++ ed esempi di codice esaurienti. La descrizione articolata di ogni tema rende chiaro cosa fare, cosa non fare e perché.



Programmazione del corso

 ArgomentiRiferimenti testi
1Introduzione alla Programmazione in C++Capitoli 1-9 del T.D.R.
2Classi e oggettiCapitolo 12 del T.D.R.
3Classi derivate, ereditarietà e polimorfismoCapitolo 13 del T.D.R.
4Sovraccaricamento degli operatoriCapitolo 20 del T.D.R.
5TemplateCapitolo 14 del T.D.R.
6Ordinamento e ricercaCapitolo 11 del T.D.R.
7ListeCapitolo 16 del T.D.R.
8Pile e codeCapitolo 17 del T.D.R.
9AlberiCapitolo 19 del T.D.R.
10GrafiMateriale del docente

Verifica dell'apprendimento

Modalità di verifica dell'apprendimento

L'esame consiste in una prova di laboratorio che prevede  l'implementazione in C++ di alcune tre le strutture dati previste dal corso e/o la risoluzione di alcuni problemi computazionali di livello intermedio. La prova di laboratorio sarà affrontata solo se lo studente supererà la prova scritta. Gli studenti idonei alla prova di laboratorio potranno affrontare la prova orale. Il voto finale sarà dato dalla medie delle tre prove, in trentesimi. I risultati saranno visibili nella sezione "Avvisi" della pagina web del dipartimento e sul canale Teams dedicato (https://teams.microsoft.com/l/team/19%3AZUhI3BpwTmux0dAGHalm6k4TABXeJ9Xlb-e7Rp4tNXo1%40thread.tacv2/conversations?groupId=cf43421d-fa9c-4576-a6ad-d8a821a6835d&tenantId=baeefbc8-3c8b-4382-9126-e86bfef46ce6).


Al termine della prova ad ogni studente sarà attribuito un voto secondo il seguente schema:

  • Non approvato: lo studente non ha acquisito i concetti di base e non è in grado di rispondere ad almeno il 60% delle domande né di svolgere gli esercizi.
  • 18-23: lo studente dimostra una padronanza minima dei concetti di base, le sue capacità  di collegamento dei contenuti sono modeste, riesce a risolvere semplici esercizi.
  • 24-27:  lo studente dimostra una buona padronanza dei contenuti del corso, le sue capacità di collegamento dei contenuti sono buone,  risolve gli esercizi con pochi errori.
  • 28-30 e lode: lo studente ha acquisito tutti i contenuti del corso ed è in grado di padroneggiarli compiutamente e di collegarli con spirito critico; risolve gli esercizi in modo completo e senza errori.


Verranno adottate tutte le misure previste dal regolamento per gli studenti con necessità speciali.

Esempi di domande e/o esercizi frequenti

I testi delle prove di laboratorio in C++ saranno disponibili sul canale Teams dedicato (https://teams.microsoft.com/l/team/19%3AZUhI3BpwTmux0dAGHalm6k4TABXeJ9Xlb-e7Rp4tNXo1%40thread.tacv2/conversations?groupId=cf43421d-fa9c-4576-a6ad-d8a821a6835d&tenantId=baeefbc8-3c8b-4382-9126-e86bfef46ce6).