Programmazione con laboratorio (2017/2018)

Codice insegnamento
4S02751
Docente
Ugo Solitro
Coordinatore
Ugo Solitro
crediti
12
Settore disciplinare
INF/01 - INFORMATICA
Lingua di erogazione
Italiano
Periodo
II sem., I sem.

Orario lezioni

Vai all'orario delle lezioni

Obiettivi formativi

L'insegnamento si propone fornire gli strumenti fondamentali per analizzare e risolvere problemi attraverso l'utilizzo di strumenti computazionali e, in particolare, lo sviluppo di programmi.

Scopo del corso è l'apprendimento dei principi fondamentali della programmazione imperativa e ad oggetti, dei linguaggi di programmazione e l'acquisizione delle seguenti competenze:

- comprensione e analisi dei problemi, la loro descrizione rigorosa per mezzo del linguaggio matematico e la definizione delle specifiche delle eventuali soluzioni;
- progettazione delle soluzioni e confronto di possibili soluzioni secondo diverse metodologie;
- codifica delle soluzioni per mezzo di linguaggi di programmazione sia imperativi che orientati agli oggetti;
- sviluppo di soluzioni articolate per problemi di piccole e medie dimensioni per mezzo di opportuni ambienti software;
- valutazione degli algoritmi, sia in termini di efficienza che di correttezza.

Programma

CONTENUTI

INTRODUZIONE: aspetti generali

- Problemi e soluzioni: caratterizzazione matematica, analisi di problemi descritti in linguaggio naturale e loro descrizione rigorosa nel linguaggio della matematica, specifica della soluzione.
- Modelli di computazione: modelli informali, macchina astratta, nozione di algoritmo.
- Linguaggi: introduzione ai linguaggi formali e alle grammatiche BNF, compilatore e interprete.

Attività pratica.

Ambienti di sviluppo: cenni introduttivi al sistema operativo Linux; uso di terminale, editor e ambienti di sviluppo integrato.

Linguaggi di programmazione: introduzione elementare al Python; il linguaggio Java.

PARTE I - Problemi, algoritmi e programmi.

- Principi di programmazione strutturata: costanti, variabili, espressioni; istruzioni fondamentali: assegnamento, composizione sequenziale, condizionale e iterazione, raggruppamento; struttura di un semplice programma.
- I tipi di dati. Nozione generale di tipo; rappresentazione dei dati; caratterizzazione dei tipi di dati; tipi di dati astratti.
- I tipi di dati primitivi: caratteristiche, uso e problemi; tipi di dati numerici e non; tipi enumerativi.
- Tipi di dati strutturati: array (e record), file, puntatori, stringhe, definizione di tipo.
- I sotto-programmi: funzioni, procedure e metodi; struttura di un sottoprogramma; passaggio dei parametri; regole di località e di visibilità; ricorsione.
- Introduzione agli oggetti (in Java): oggetti e classi; componenti di classe e di istanza; costruttori, campi e metodi; modificatori principali.
- Strutture dati avanzate: rappresentazione di sequenze, vettori, matrici. caratterizzazione induttiva di tipi; definizione ricorsiva di strutture dati; realizzazione concreta in Java.
- Introduzione alla programmazione ad oggetti avanzata: estensione di classi; ereditarietà e polimorfismo; interfacce e classi astratte (introduzione)

PARTE II - Analisi degli algoritmi.

- Correttezza degli algoritmi: terminazione; proprietà logiche; correttezza parziale e totale rispetto alle specifiche.
- Efficienza degli algoritmi. Introduzione alla valutazione dell'efficienza degli algoritmi: prestazioni e complessità. Elementi di complessità: misure di tempo e spazio; costo computazionale in tempo e spazio; stime asintotiche del costo computazionale; caso peggiore e caso medio; costo ammortizzato.
- Casi di studio rilevanti Sequenze statiche e dinamiche: definizione astratta; implementazione; operazioni di base; Algoritmi di ricerca (semplice e binaria), ordinamento (insertion, selection, merge, quick sort), concatenazione e fusione. Sequenze, Matrici e Vettori: implementazione, operazioni e algoritmi. Liste: definizione astratta e implementazione; operazioni di base; introduzione a Pile e Code. Alberi (introduzione): definizione astratta di alberi binari e implementazione; operazioni di base; alberi bilanciati e di ricerca. Introduzione ai grafi: definizione matematica; implementazione elementare.

## Pratica di Laboratorio.

- Apprendimento dei linguaggi di programmazione presentati nel corso attraverso esercizi pratici e sviluppo di progetti di piccole e medie dimensioni, anche attraverso attività collaborative.
- Esame di costrutti principali dei linguaggi studiati.
- Valutazione dei problemi legati allo sviluppo concreto delle soluzioni.

MODALITÀ DIDATTICHE

Le attività didattiche dell'insegnamento sono strutturate indicativamente secondo lo schema seguente:

- presentazione dell'argomento della lezione;
- analisi di problemi legati all'argomento e discussione delle possibili soluzioni;
- proposta di esercitazioni di difficoltà progressiva volti alla soluzione di un problema significativo e
- risoluzione collettiva di alcuni esercizi;
- risoluzione individuale e/o di gruppo degli altri con il supporto di tutor d'aula (quando disponibili)
- correzione collettiva o, quando possibile, individuale delle esercitazioni.
- eventuale discussione sintetica finale.

Le modalità didattiche possono variare in dipendenza dell'argomento e delle risorse disponibili.

Testi di riferimento
Autore Titolo Casa editrice Anno ISBN Note
Bertossi, Alan e Montresor, Alberto Algoritmi e strutture di dati Città Studi Edizioni, De Agostini Scuola 2010 9788825173567
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein Introduction to Algorithms (Edizione 3) MIT Press 2009 0-262-03384-4
Walter Savitch Programmazione con Java (seconda edizione) (Edizione 2) Pearson 2013 9788871929613

Modalità d'esame

L'esame finale riguarda tutti gli argomenti trattati durante le lezioni e le attività di laboratorio.

L'esame è così strutturato in tre prove:
- prova (peso)
----------------------
- scritta (0.5 )
- pratica (0.2 )
- orale (0.3 )

Il voto finale si ottiene mediante il calcolo della media pesata della valutazione delle tre parti.

## Prova scritta

La prova scritta è a sua volta suddivisa in due sezioni:

- Nozioni generali (peso 1/3).
- Esercizi (peso 2/3).

### Nozioni generali

Questa sezione è costituita da alcune domande (da 3 a 5) volte a verificare la conoscenza delle nozioni fondamentali alla base dell'insegnamento.

### Esercizi

Questa sezione è costituita da alcuni esercizi (da 3 a 5) il cui scopo è verificare la capacità del candidato di comprendere problemi proposti in linguaggio naturale, risolverli tramite opportuni algoritmi codificati nel linguaggio di programmazione, valutarne la correttezza e l'efficienza.

In particolare attraverso lo svolgimento degli esercizi il candidato dovrà dimostrare di saper

- analizzare un problema e formulare le specifiche rigorose della soluzione algoritmica;
- comprendere le specifiche e verificare se una soluzione proposta le rispetta suggerendo eventuali correzioni e modifiche;
- sviluppare e codificare, a partire dalla descrizione informale di un problema, un algoritmo risolutivo completo di specifiche rigorose;
- valutare la correttezza di un algoritmo;
- stimare l'efficienza di una soluzione con la metodologia più appropriata.

La prova scritta può essere sostituita dal superamento delle prove parziali proposte in corso d'anno.

## Attività pratica

Il candidato dovrà dimostrare di aver svolto con profitto le attività pratiche proposte durante lo svolgimento delle lezioni. La verifica si svolgerà attraverso la discussione della stessa attività ed eventualmente di un progetto concordato con il docente e sviluppato anche in forma collaborativa.

## Colloquio finale

L'esame si conclude con un colloquio orale nel quale saranno discussi alcuni aspetti della prova scritta e dell'attività pratica.

Inoltre il candidato dovrà rispondere ad alcune domande (in genere 2 o 3) relative ai contenuti generali dell'insegnamento.

## Parametri di valutazione

La valutazione terrà conto in particolare dei seguenti parametri:

- la pertinenza e la correttezza,
- la chiarezza e il rigore,
- la capacità di sintesi.

Si valuterà infine positivamente la partecipazione e il corretto svolgimento delle attività proposte durante il corso.

Opinione studenti frequentanti - 2017/2018