Seleziona l'Anno Accademico:     2016/2017 2017/2018 2018/2019 2019/2020 2020/2021 2021/2022
Docente
LUCA DIDACI (Tit.)
Periodo
Primo Semestre 
Modalità d'Erogazione
Convenzionale 
Lingua Insegnamento
ITALIANO 



Informazioni aggiuntive

Corso Percorso CFU Durata(h)
[70/89]  INGEGNERIA ELETTRICA, ELETTRONICA E INFORMATICA [89/30 - Ord. 2016]  INFORMATICA 5 50
[70/89]  INGEGNERIA ELETTRICA, ELETTRONICA E INFORMATICA [89/66 - Ord. 2016]  INFORMATICA ON LINE E IN PRESENZA (BLENDED) 5 50

Obiettivi

Il corso di Programmazione Avanzata ed Elementi di Ingegneria del Software si pone due obiettivi principali. Il primo obiettivo è fornire allo studente gli strumenti necessari a comprendere i principi fondamentali della progettazione del software sia su piccola sia su media scala, seguendo un approccio modulare. Questo significa non solo apprendere metodi, ma anche e soprattutto capire i fondamenti sui quali questi si basano in modo da poter estendere quanto appreso nel prosieguo del corso di studi e nella pratica professionale. Il secondo obiettivo è rafforzare le competenze di programmazione, in particolare in Linguaggio C, e la conoscenza degli algoritmi fondamentali per l’elaborazione delle informazioni.

Conoscenza e capacità di comprensione
Alla fine del corso lo studente avrà una buona comprensione dei seguenti temi
- fondamenti dell'ingegneria del software come scienza che studia strumenti e metodologie per la pianificazione, lo sviluppo e la valutazione di applicazioni software complesse.
- principali modelli di progettazione e la loro attuazione nel linguaggio di programmazione C.
- alcuni algoritmi di base, strutture di dati e la loro implementazione in C per la risoluzione di problemi complessi
- i principali metodi per il calcolo della complessità computazionale di un algoritmo


Capacità di applicare conoscenze e capacità di comprensione

Alla fine del corso lo studente sarà in grado di:
- comprendere i principi e l'organizzazione dei moderni processi di produzione del software, con particolare riferimento alla modularità, all'incapsulamento e all'astrazione.
- progettare e implementare software basato sui principali algoritmi di elaborazione delle informazioni e utilizzando i principali modelli di progettazione
- applicare i concetti appresi nello sviluppo di programmi C.



Autonomia di giudizio
Alla fine del corso si prevede che lo studente sia in grado di:
- valutare il grado di modularità e portabilità dei prodotti software
- valutare i pro e i contro dell'utilizzo di un modello di progettazione specifico per un problema specifico
- valutare la complessità computazionale degli algoritmi

Abilità comunicative
Alla fine del corso, lo studente dovrebbe aver acquisito adeguate competenze linguistiche in relazione al contenuto del corso, in modo che possa essere compreso in modo completo da un interlocutore con adeguate conoscenze tecniche e di trasmettere i concetti essenziali anche a un interlocutore non tecnicamente competente.

Capacità di apprendere in modo indipendente
Alla fine del corso, lo studente dovrebbe avere la capacità di approfondire le sue conoscenze nel campo della progettazione e dello sviluppo del software. Lo studente sarà in grado di estendere le sue capacità di progettazione e programmazione a linguaggi di programmazione orientati agli oggetti e a sistemi software più complessi.

Prerequisiti

Prerequisiti stringenti in termini di abilità di programmazione e conoscenza del linguaggio C, in particolare capacità di sviluppare semplici programmi in C, utilizzando costrutti condizionali e iterativi, tipi di dati semplici e strutturati, I/O standard, file testo e funzioni.
Nel dettaglio, si daranno per acquisite le seguenti competenze, maturate nei corsi precedenti:

• Sintassi, tipi di dato e costrutti base del linguaggio C.
• Conoscenza dei tipi di dato semplici (int, float, double, char) e strutturati (vettori, struct).
• Conoscenza e comprensione di puntatori e aritmetica dei puntatori.
• Conoscenza di funzioni e comprensione del meccanismo di passaggio dei parametri.
• Conoscenze base sulla gestione della memoria dinamica (allocazione e de-allocazione di memoria)
• Operazioni su file in C.

Contenuti

Introduzione al corso
Ingegneria del software: visione d'insieme
Qualità del software
Principi dell'ingegneria del software
Tecniche di modularizzazione
- La struttura modulare e la sua rappresentazione
- Interfaccia, implementazione e information hiding
- Notazioni per la progettazione
- Categorie di moduli
- Tecniche specifiche per la progettazione in vista del cambiamento
- Raffinamento per passi successivi

Programmazione in C
Tipi strutturati in C e l’utilizzo di puntatori
Le funzioni e le tecniche di modularizzazione
Strutture dati statiche e dinamiche e loro realizzazione in C
- rappresentazione dei dati in memoria e gestione della memoria in runtime
- puntatori
- strutture linkate
- alberi e liste

Design patterns
- scopo e ruolo dei design pattern
- descrizione di alcuni design pattern
- implementazione in C

Algoritmi fondamentali e loro implementazione in C
Studio della complessità computazionale
Implementazione di algoritmi di ricerca e ordinamento in C
- ordinamenti iterativi (bubble sort, selection sort)
- ordinamenti ricorsivi (mergesort, quicksort)
Algoritmi e strutture dati per la manipolazione di grafi

Metodi Didattici

Il corso si basa su un approccio didattico tradizionale (lezioni frontali) al quale si unisce una significativa parte di esercitazioni su tutti gli argomenti del programma (esercizi assegnati per casa e corretti in aula, alle quali si aggiungono esercitazioni interattive).


Per soddisfare esigenze didattiche specifiche connesse alla situazione epidemiologica, è prevista la possibilità di lezioni in diretta streaming o registrate. Inoltre, le esercitazioni potranno essere svolte mediante forme di interazione a distanza con i supporti informatici disponibili.


Plan del corso:
Lezioni frontali: 35 ore
Esercizi: 15 ore
Tutorato: 35 ore

Verifica dell'apprendimento

L'esame consiste in una prova scritta, comprendente quesiti di teoria ed esercizi di programmazione in C.

La prova scritta si compone solitamente di alcuni esercizi volti a verificare l'effettiva acquisizione dei risultati di apprendimento attesi, toccando la maggior parte del programma a diversi livelli di dettaglio e includendo sia esercizi di programmazione che domande di teoria.
La valutazione è oggettiva, definita sulla base della percentuale di correttezza di ogni risposta (alla quale è associato un punteggio fisso, non noto al candidato, sulla base del livello di difficoltà).
La prova è valutata con un punteggio massimo di 33. In caso di punteggio maggiore o uguale a 32, viene data la lode. In caso di punteggio uguale a 31, viene dato 30.

Ove la situazione epidemiologica lo richiedesse, la valutazione potrebbe essere svolta mediante una prova fiduciaria di autovalutazione, online, e successivamente un orale conclusivo.

Lo studente è stimolato ad andare al di là del semplice studio finalizzato alla risoluzione di un esercizio, applicandosi su problemi che richiedono la capacità di passare dal concetto astratto alla sua applicazione pratica. Allo studente è sempre chiesto di motivare la risposta fornita. Un tale approccio alla stesura del compito rende possibile l'accertamento delle competenze e della capacità di applicarle a semplici problemi, in funzione del livello raggiunto, ma permette anche di valutare le capacità comunicative e l'autonomia di giudizio.

Il numero di appelli è definito in accordo con il regolamento di Facoltà.

Testi

Dispense del corso, fornite gratuitamente agli studenti tramite il sito del corso e corrette/aggiornate ogni anno.

Testi adottati:
Sulla parte metodologica:
- Sommerville - Ingegneria del Software 10 ed. , 2017

Sulla parte C:
- Linguaggio C 5/ed- Di: Alessandro Bellini e Andrea Guidi - ISBN 9788838668210
- Algoritmi in C. Di: Robert Sedgewick

Sulla parte dedicata agli algoritmi:
T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein, Introduzione agli algoritmi e strutture dati

Altri testi di consultazione

Sui principi dell’ingegneria del software validi ancora oggi, si vedano i paper di David Parnas:
- Some Software Engineering Principles
- On the Criteria To Be Used in Decomposing Systems into Modules
- Designing Software for Ease of Extension and Contraction


Linguaggio C
C Primer Plus (Sixth Edition) - Stephen Prata

Altre Informazioni

Il materiale didattico verrà reso disponibile nel sito moodle di Ateneo


Il materiale didattico (dispense) è stato usato dal docente per creare le diapositive proiettate in aula a lezione. È fondamentale che gli studenti prendano appunti in aula e si confrontino con il materiale didattico a casa. Vengono resi disponibili esercizi che verranno corretti in aula.

Questionario e social

Condividi su: