Obiettivi formativi
Un obiettivo del Modulo A del corso è quello di far acquisire allo studente le conoscenze di base per la progettazione e la realizzazione di semplici programmi scritti in un linguaggio di programmazione convenzionale. In particolare lo studente acquisirà conoscenze approfondite sugli strumenti di programmazione messi a disposizione dal sottoinsieme del linguaggio C++ relativo alla programmazione imperativa.
Il Modulo A del corso mira anche a fornire allo studente la capacità di applicare le tecniche di analisi dei problemi e le conoscenze sugli strumenti di programmazione acquisite, per risolvere in modo algoritmico semplici problemi pratici (quali, ad esempio, problemi di calcolo matematico, di ordinamento di dati, di gestione di archivi) e quindi tradurre tali soluzioni in programmi eseguibili tramite calcolatore.
Infine il Modulo A del corso mira a sviluppare nello studente più generali capacità di analisi, di astrazione (intesa principalmente come capacità di descrivere e comprendere un'entità in termini delle funzioni offerte piuttosto che dei dettagli della sua implementazione), di scomposizione di problemi in sottoproblemi, e di sviluppo di soluzioni “dall'alto al basso” (“top.down”) e per raffinamenti successivi.
Il Modulo B del 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 Modulo B del 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
Nozioni di base su funzioni e insiemi e su connettivi ed espressioni logiche.
Nozioni di base su organizzazione fisica di un calcolatore e sulla rappresentazione dell'informazione.
Contenuti dell'insegnamento
Il Modulo A del corso introduce i fondamenti della programmazione imperativa, utilizzando come linguaggio di programmazione di riferimento il frammento imperativo del C++.
In particolare, nella prima parte vengono introdotte nozioni fondamentali per la programmazione quali quelle di algoritmo, diagramma di flusso, variabili, tipi di dato semplici e strutturati, espressioni e statement per il controllo di sequenza.
Nella seconda parte si affronta lo sviluppo di programmi più complessi, introducendo, da una parte, la nozione di sottoprogramma e altre nozioni a questa collegate, come funzioni ricorsive e regole di scope, dall'altra altre forme di gestione dei dati, come l'input/output da file e la manipolazione di strutture dati dinamiche con puntatori.
Per entrambe le parti viene mostrata la realizzazione di semplici programmi C++ che utilizzano le nozioni introdotte.
Il Modulo B del corso introduce i fondamenti della programmazione “object-oriented” e modulare, utilizzando come linguaggi di riferimento C++ e 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
MODULO A.
FONDAMENTI.
Problemi e algoritmi - La nozione di algoritmo. I diagrammi di flusso.
Risoluzione di semplici problemi.
Linguaggi e ambienti di programmazione - Linguaggi esistenti (cenni). Modalita' d'esecuzione (cenni). Ambienti integrati di sviluppo programmi (IDE).
Variabili: caratteristiche, dichiarazione. Identificatori. Costanti. Espressioni: sintassi, valutazione (associativita' e precedenza), tipo. Assegnamento.
Tipi di dato: definizione, tipi semplici e strutturati, primitivi e definiti da utente. Costruttori di tipo. Strutture dati astratte e concrete. Utilita' dei tipi. Compatibilita' e conversioni di tipo.
Nomi, ambienti e regole di "scope": struttura a blocchi, ambiente locale e non-locale,
variabili globali.
Programmazione strutturata - Strutture di controllo. Teorema di Bohm-Jacopini. Statement
goto. Progetto "top-down" e sviluppo programmi "per raffinamenti successivi".
LINGUAGGIO C++.
Dichiarazione di variabile. Tipi semplici primitivi: valori, costanti, operazioni.
Dichiarazione di costante.
Input/output di base. Operatori di estrazione ed inserimento. Input/output a caratteri
(funzioni get e put).
Assegnamento e statement composto. Espressioni.
Statement per il controllo di sequenza: if, switch, while, do_while, for, break.
Esempio. Verifica dell'input.
Tipi strutturati. Array: dichiarazione, selezione elementi, memorizzazione, operazioni.
Array bi-dimensionali. Matrici. Esempi operazioni su matrici e vettori (in partic.,
ordinamento per selezione). Stringhe: realizzazione tramite array, operazioni,
funzioni di libreria. struct: dichiarazione, selezione elementi, operazioni.
Tabelle: definizione, realizzazione tramite array di struct.
Dichiarazione e chiamata di funzione. Passaggio parametri: per valore, per riferimento.
Passaggio parametri di tipo array. Funzioni void.
Strutturazione di un programma e regole di "scope".
Input/output su file. Creazione ed apertura di uno stream. Lettura/scrittura "tipata" e a caratteri.
Puntatori ed allocazione dinamica della memoria (operatore new). Operazioni su puntatori. Puntatori ed array. Esempio: liste concatenate.
Sviluppo di semplici programmi nel frammento imperativo del C++. Utilizzo di funzioni
di libreria.
MODULO B.
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.
- R. Miller, D. Clark, B. White, e W. Knottenbel: An Introduction to the Imperative Part of C++, 1999, disponibile su WEB all'indirizzo http://www.doc.ic.ac.uk/~wjk/C++Intro/CourseStructure.html#S
- Dispense del corso, disponibili nella pagina web del corso (elly.smfi.unipr.it)
- Programmi C++ e Java mostrati a lezione, disponibili nella pagina web del corso (elly.smfi.unipr.it)
- 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.
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 scritti in C++ che verranno resi disponibili sulla piattaforma di e-learning dell'Ateneo (https://elly2022.smfi.unipr.it/).
Le esercitazioni prevedono l'assegnazione da parte del docente, indicativamente ogni dieci giorni, 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 (https://elly2021.smfi.unipr.it/). 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, con il docente e gli eventuali suoi collaboratori.
Modalità verifica apprendimento
L'esame finale del corso e' costituito da una prova di teoria ed una prova di programmazione per il Modulo A e da una prova di teoria ed una prova di programmazione per il Modulo B.
Una prova di teoria consiste nella risposta su carta a dieci domande chiuse a crocette sull’intero programma del corso. Tale prova serve da sbarramento per la seconda prova di programmazione. Per il superamento della prova di teoria e l’accesso alla prova di programmazione è richiesto rispondere correttamente al 70% delle domande. Nel caso lo studente non risponda correttamente ad almeno il 70% delle domande, l’esame si considera non superato e non potrà accedere alla prova di programmazione.
Una prova di programmazione consiste nella soluzione (su carta) di alcuni esercizi di programmazione.
Fondamenti di programmazione A+B: Ad ogni modulo (parte A e parte B) è assegnato un voto in trentesimi. L’esame di Fondamenti di Programmazione A+B si ritiene superato se la media aritmetica fra il voto ottenuto in Fondamenti di Programmazione A e quello ottenuto in Fondamenti di Programmazione B è maggiore o uguale a 18 e ciascuno dei due voti è maggiore o uguale a 16.
È prevista una prova in itinere (non obbligatoria) che verra' svolta alla fine del mese di febbraio dell'a.a. in corso.
Per accedere all'esame, compresa la prova in itinere, è necessario aver risolto e consegnato almeno il 70% degli esercizi assegnati durante lo svolgimento del corso.
Altre informazioni
- - -
Obiettivi agenda 2030 per lo sviluppo sostenibile
- - -