FONDAMENTI DI PROGRAMMAZIONE B
cod. 1000749

Anno accademico 2021/22
1° anno di corso - Secondo semestre
Docente
- Vincenzo ARCERI - Gianfranco ROSSI
Settore scientifico disciplinare
Informatica (INF/01)
Field
Discipline informatiche
Tipologia attività formativa
Caratterizzante
72 ore
di attività frontali
9 crediti
sede: PARMA
insegnamento
in ITALIANO

Obiettivi formativi

Il corso si pone l'obiettivo di far acquisire allo studente le conoscenze di base per la progettazione e la realizzazione di programmi “object-oriented”, nonchè conoscenze approfondite sugli strumenti di programmazione messi a disposizione dal C++ e da Java per la programmazione “object-oriented”.

Il corso mira anche a fornire allo studente le capacità di applicare le tecniche di analisi dei problemi e le conoscenze sugli strumenti di programmazione acquisite per realizzare programmi C++ e Java concreti, eseguibili tramite calcolatore.

Prerequisiti

I concetti e le tecniche di base della programmazione imperativa forniti nel corso di Fondamenti di Programmazione A

Contenuti dell'insegnamento

Il corso introduce i fondamenti della programmazione “object-oriented” e modulare, utilizzando come linguaggio di riferimento principale il C++, ma analizzando, nella parte finale del corso, anche il linguaggio Java.

Il corso presenta anche alcuni costrutti e meccanismi avanzati del C++ e di Java, quali l'overloading di funzioni ed operatori e la gestione delle eccezioni, nonchè alcune nozioni e strumenti non strettamente legati alla programmazione “object-oriented”, ma comunque di fondamentale importanza, quali le nozioni di tipo di dato astratto e di ciclo di sviluppo del software.

Programma esteso

COSTRUTTI E MECCANISMI
Il costrutto class: dichiarazione, creazione di oggetti, funzioni proprie ed invocazione di funzioni, inizializzazione di oggetti (costruttori), es. classe data semplificata. Nozioni di "information hiding" e "incapsulamento".
Overloading di funzioni ed operatori. Ridefinizione operatori di inserimento ed estrazione.
Parametri "const reference" e "reference return". Parametri di default.
Gestione delle eccezioni. Motivazioni, meccanismi.
Classi e funzioni template: dichiarazione, istanziazione.

TIPI DI DATO ASTRATTI(ADT)
La nozione di tipo di dato astratto. Esempi di tipi di dato astratti realizzati in C++. Classe razionale. Classe intLista. Classe predefinita string. Classe intPila e pila<t>: con allocazione statica e con allocazione dinamica; definizione e uso distruttore. Classe vett<t>: ridefinizione operatori [] e = (assegnamento); definizione e uso costruttore di copia.
Standard Template Library (STL). Cenni ai "contenitori" della STL, in particolare vector.

PROGRAMMAZIONE "OBJECT-ORIENTED" (O-O)
Nozione di oggetto, classe (attributi, metodi), istanza, sistema ad oggetti.
Ereditarietà: dichiarazione, ridefinizione funzioni e dati. Campi protected. Ereditarieta' multipla (cenni). Esempio classe persona e classe studente.

PROGETTAZIONE E PROGRAMMAZIONE MODULARE
Ciclo di sviluppo dei programmi (cenni). "Programming-in-the-large" vs. "Programming-in-the-small".
La nozione di modulo. La modularizzazione nella fase di progettazione e di realizzazione. Classi e modularizzazione in C++. Programmi divisi in piu' file. Funzioni e campi di classi static.
Progettazione ed implementazione di un'applicazione in C++.

LINGUAGGIO JAVA
Cenni all'evoluzione di Java. Caratteristiche e componenti. Modalita' di esecuzione: compilazione vs. interpretazione. La Java Virtual Machine.
Struttura di un programma Java. Tipi semplici primitivi. I/O di base. Costrutti di controllo. Tipi strutturati: array. Reference e oggetti. Garbage collection. Stringhe (cenni). Metodi statici e non. Passaggio parametri.
Il costrutto class. Dichiarazione e istanziazione. Esempio classe Razionale. Ereditarieta'. Esempio classi Rettangolo e Quadrato. Reference this e super. Polimorfismo. Principio di sostituibilita' tra classe base e sottoclasse e "down-casting". Gerarchia di classi (classe java.lang.Object). Tipi "wrapper". Interfacce e implementazioni. Interfacce ed ereditarieta'. Realizzazione ereditarieta' multipla in Java (cenni).

Bibliografia

- L.J. Aguilar. Fondamenti di programmazione in C++ , McGraw-Hill, 2008.

- Programmazione in Java (2nd edizione). Roberto Bruni, Andrea Corradini, Vincenzo Gervasi, Apogeo, 2011

- C.S. Horstmann , Concetti di informatica e fondamenti di Java, Apogeo, 2010.

- M.Cadoli, M.Lenzerini, P.Naggar, A.Schaerf. Fondamenti della progettazione di programmi. Principi, tecniche e loro applicazioni in C++, CittaStudiEdizioni di UTET Libreria, 1997.

- Programmi C++ e Java mostrati a lezione e in laboratorio, disponibili su Web agli indirizzi http://people.math.unipr.it/gianfranco.rossi/Teaching/FondProgr/EsempiLezioneParteB/index.html e http://lea.unipr.it/course/view.php?id=324

Metodi didattici

L'insegnamento si svolge principalmente tramite lezioni frontali ed esercitazioni su computer, sia assistite che svolte in modo autonomo dallo studente.

Le lezioni prevedono tra l'altro la presentazione di numerosi esempi pratici di problemi e relativi programmi per la loro soluzione scritti in C++ e Javva che verranno resi disponibili su Web nel sito del corso (all'indirizzo http://people.math.unipr.it/gianfranco.rossi/Teaching/FondProgr/EsempiLezioneParteB/index.html).

Le esercitazioni prevedono l'assegnazione da parte del docente, con cadenza settimanale, di uno o piu' esercizi, inerenti gli argomenti trattati a lezione, che lo studente dovrà svolgere in modo autonomo e consegnare entro una settimana, avvalendosi della piattaforma di e-learning di Ateneo LEA (http://lea.unipr.it/course/view.php?id=324 ). La piattaforma permette tra l'altro al docente di monitorare la consegna degli esercizi e di fornire suggerimenti per il loro svolgimento.

Per gli studenti che incontrano difficoltà nella realizzazione degli esercizi assegnati sono previsti incontri in Laboratorio, a cadenza settimanale, con il docente e gli eventuali suoi collaboratori.

Modalità verifica apprendimento

L'esame finale del corso e' costituito da una prova di programmazione ed una prova di teoria.

La prova di programmazione consiste nella soluzione (su PC o su carta) di alcuni esercizi di programmazione, utilizzando le possibilità "Object-Oriented" del C++ e di Java presentate nel corso.

La prova di teoria consiste nella risposta (su carta) ad alcune domande (da 5 a 10) sugli aspetti più di base e generali trattati nell'intero corso.

Per gli studenti del Corso di Laurea in Informatica la prova d'esame è integrata con quella del corso di Fondamenti di Programmazione A, che prevede una prova scritta ed una prova orale. La prova scritta consiste nella soluzione (su carta) di alcuni esercizi di programmazione, utilizzando il frammento imperativo del linguaggio C++ presentato nel corso di Fondamenti di Programmazione A.

Ad ognuna delle prove (scritta, pratica e orali) è assegnato un voto in trentesimi. Le prove sono ritenute superate se il voto è maggiore od uguale a 16/30. L'esame è superato se sono superate tutte le prove da cui è costituito e il voto finale è maggiore od uguale a 18/30. Il voto finale è ottenuto come media aritmetica dei voti riportati nelle singole prove.

Altre informazioni

Il corso prevede una sua pagina Web per tutte le informazioni generali, gestita direttamente dal docente (http://people.math.unipr.it/gianfranco.rossi/Teaching/FondProgr/index.html) e una pagina sul sistema di Web Learning dell'Ateneo per la gestione delle esercitazioni (http://lea.unipr.it/course/view.php?id=324).