Nuova ricerca

Luca BEDOGNI

Professore Associato
Dipartimento di Scienze Fisiche, Informatiche e Matematiche sede ex-Matematica

Insegnamento: Programmazione 2

Informatica (Offerta formativa 2024)

Obiettivi formativi

Lo scopo del corso di Programmazione II è far evolvere le conoscenze e le abilità di programmazione degli studenti a partire da quelle di base acquisite durante il corso di Programmazione I. In particolare si cureranno da un lato le abilità di analisi e sviluppo di strutture dati e algoritmi avanzati, dall'altro le capacità di sviluppo e testing di applicazioni reali. Si prenderà a riferimento il linguaggio C++.
Al termine del corso lo studente sarà in grado di
- progettare applicazioni usando l'approccio modulare
- padroneggiare l'allocazione dinamica del C++
- codificare programmi in C++ usando i costrutti in modalità imperativa del linguaggio
- implementare i tipi di dato astratto per le principali strutture dati dinamiche ovvero liste, alberi e grafi
- codificare programmi in C++ su più file e compilarli attraverso la scrittura e l'esecuzione di makefile
- implementare algoritmi che sfruttano le principali strutture dati dinamiche
- effettuare il debugging di applicazioni scritte in C++ attraverso l'uso di IDE (Integrated Development Environment)
- gestire versioni del software per lo sviluppo di progetti software distribuito su più programmatori
- usare il sistema di version control GIT

Per una più completa comprensione degli obiettivi formativi, si rimanda alla lettura dei risultati di apprendimento attesi a seguito dello svolgimento del presente percorso formativo

Prerequisiti

Le conoscenze acquisite durante il corso di Programmazione I (propedeuticità obbligatoria).

Programma del corso

L'insegnamento si svolge nel II semestre del I anno, per un totale di 72 ore di didattica frontale (9 CFU).
La scansione dei contenuti in termini di ore è da intendere come puramente indicativa. Essa può infatti subire modifiche nel corso dell’insegnamento alla luce dei riscontri e della partecipazione degli studenti.

Contenuti del corso:

Introduzione al corso (3 ore)

Liste (12 ore): Approfondimento sui puntatori, il tipo di dato lista e le liste semplici, liste doppie, caso di studio: Inverted Index

Sviluppo di funzioni e procedure ricorsive in C++ (3 ore)

Alberi (10 ore): Rappresentazione degli alberi, Visite di Alberi,
Alberi binari di ricerca

Grafi (8 ore): Rappresentazione dei grafi, visite di grafi, implementazione degli algoritmi di Dijkstra e Prim

Programmazione avanzata in C++ (6 ore): Puntatori a funzioni,
operatori bit a bit

Sviluppo e testing (25 ore): Debugging, modularizzazione e sviluppo di progetti su più file, compilazione e Makefile, documentazione di progetti e Doxygen, controllo di versione e GIT

La scansione dei contenuti per CFU è da intendere come indicativa. Essa può infatti subire modifiche nel corso dell’insegnamento alla luce dei feedback degli studenti e delle studentesse.

Metodi didattici

La didattica è basata su lezioni frontali. Il corso prevede lezioni teoriche sugli argomenti descritti nella sezione "Contenuti del corso" ed esercitazioni dedicate alla soluzione di esercizi al computer.

Le domande e gli interventi degli studenti sono graditi e incoraggiati.
La frequenza non è obbligatoria ma fortemente consigliata.
Il corso è erogato in lingua italiana.

Tutte le informazioni tecniche e organizzative sull'insegnamento, nonché il materiale didattico, saranno caricati su piattaforma Moodle. Si invita lo studente ad iscriversi ed a consultare tale piattaforma con regolarità.

Testi di riferimento

- P. Foggia, M. Vento. «Algoritmi e strutture dati - Astrazione, progetto e realizzazione», McGraw-Hill, 2011

- S. Dasgupta, C.H. Papadimitriou, U.V. Vazirani. «Algorithms», McGraw-Hill, 2006

- B. Eckel, "Thinking in C++", 2nd Edition, Volume 1 http://www.mindviewinc.com/

- Slide e materiale a cura del docente disponibile su Moodle

Verifica dell'apprendimento

Durante l'anno si svolgono almeno 6 prove scritte e 4 di laboratorio. Il punteggio massimo assegnato ad ognuna delle due prove è 32. Per partecipare alla prova di laboratorio è necessario superare la prova scritta con una votazione di almeno 16/32. Il voto finale è determinato come media pesata delle due prove: 20% voto dello scritto, 80% voto del laboratorio.

La prova scritta mira a verificare la capacità dello studente di scrivere funzioni e codificare algoritmi sulle strutture dati viste a lezione, di codificare funzioni ricorsive e di padroneggiare i principali aspetti dell'uso della memoria dinamica e della programmazione modulare e della compilazione.

La prova scritta può essere sostenuta anche attraverso il superamento di due prove intermedie. La prima prova si svolge circa a metà del corso e la seconda prova al termine del corso in concomitanza con le prime due prove scritte. La somma del punteggio massimo delle due prove è 32.

La prova di laboratorio ha l'obiettivo di verificare la capacità dello studente di scrivere applicazioni per casi di studio reali attraverso la scrittura di moduli software che coinvolgono le strutture dati viste a lezione e lo sviluppo di makefile.

Maggiori informazioni sulla modalità d'esame sono disponibili nel documento delle FAQ scaricabile dal sito Moodle del corso dove sono inoltre disponibili prove d'esame passate.

Risultati attesi

Conoscenza e capacità di comprensione: Tramite le lezioni, lo studente avrà solide conoscenze e capacità di comprensione di soluzioni implementative per le strutture dati liste, alberi e grafi, e i relativi algoritmi. Inoltre, lo studente sarà in grado di comprendere e realizzare makefile per la costruzione di progetti in C++ e la documentazione software.

Capacità di applicare conoscenza e comprensione: Tramite esercitazioni pratiche al computer e lo svolgimento di esercizi di laboratorio, lo studente sarò in grado di applicare le conoscenze acquisite durante il corso.

Autonomia di giudizio: Tramite lo svolgimento di attività di laboratorio, lo studente sarà in grado di valutare, esporre e discutere criticamente le scelte progettuali adottate per la realizzazione di applicazioni in C++ che riguardano gli aspetti avanzati di programmazione, le strutture dati e gli algoritmi visti a lezione.


Capacità di apprendimento: Le attività descritte consentiranno allo studente di acquisire gli strumenti metodologici per proseguire gli studi e per potere provvedere autonomamente al proprio aggiornamento, particolarmente cruciale in un ambito come quello informatico di gestione dell'informazione, dove le tecnologie sono in continua evoluzione.