CODICE 48382 ANNO ACCADEMICO 2025/2026 CFU 6 cfu anno 2 MATEMATICA 9011 (LM-40) - GENOVA 6 cfu anno 1 MATEMATICA 11907 (LM-40 R) - GENOVA 6 cfu anno 3 MATEMATICA 8760 (L-35) - GENOVA 7 cfu anno 2 STATISTICA MATEM. E TRATTAM. INFORMATICO DEI DATI 8766 (L-35) - GENOVA SETTORE SCIENTIFICO DISCIPLINARE INF/01 LINGUA Italiano SEDE GENOVA PERIODO 1° Semestre MATERIALE DIDATTICO AULAWEB PRESENTAZIONE L'insegnamento introduce la programmazione orientata a oggetti, che è un paradigma adottato da molti linguaggi moderni per organizzare il software attraverso classi ed ereditarietà; la nozione di tipo di dato (controparte teorica delle classi), alcuni tipi di dato classici (pila, coda, dizionario) utili nella costruzione dei programmi; la complessità computazionale degli algoritmi e tecniche per valutarla. Sono presentati i linguaggi Java e Python con esercitazioni pratiche. OBIETTIVI E CONTENUTI OBIETTIVI FORMATIVI L'insegnamento introduce i principi della programmazione orientata a oggetti, di cui si fara' esperienza pratica in laboratorio attraverso i linguaggi Java e Python. Introduce le nozioni di tipo di dato, implementazione, complessita' computazionale, e le tecniche fondamentali per la valutazione della complessita' di algoritmi e strutture dati. Dopo avere frequentato l'insegnamento, lo studente conoscera' la programmazione orientata a oggetti; sara' in grado di sviluppare un progetto programmativo utilizzando componenti di libreria e algoritmi, essendo consapevole della complessita' computazionale insita nelle scelte implementative. OBIETTIVI FORMATIVI (DETTAGLIO) E RISULTATI DI APPRENDIMENTO L'insegnamento introduce principi di programmazione più avanzati rispetto a Programmazione 1, presentando anche i modelli teorici che stanno alla base della produzione di software bene organizzato ed efficiente. Il paradigma orientato a oggetti consente di organizzare modularmente il software attraverso classi (di fatto moduli software) collegate da gerarchie di ereditarietà. Controparte teorica della classe è il tipo di dato, comprendente valori e operazioni che vi agiscono. L'implementazione è il processo che porta dal tipo di dato al modulo software, e comporta decisioni riguardo alle strutture dati (per memorizzare i valori) e gli algoritmi (per eseguire le operazioni). L'analisi della complessità computazionale consente di valutare l'impatto di queste scelte implementative sulle prestazioni (occupazione di memoria, tempo di esecuzione) del software che si andrà a realizzare. La versione da 7 cfu presenterà anche tecniche per analizzare sperimentalmente le prestazioni di un programma, validando ex post la complessità valutata in teoria. L'attività di laboratorio, pari a quasi la metà delle ore di didattica, è fondamentale per imparare a programmare nei due linguaggi scelti e per mettere in pratica le nozioni teoriche viste a lezione. Chi avrà seguito l'insegnamento: Conoscerà il paradigma di programmazione orientato a oggetti e le parti fondamentali dei linguaggi Java e Python. Sarà in grado di valutare la complessità di strutture dati ed algoritmi semplici. Conoscerà alcuni algoritmi classici e alcuni tipi di dato classici, saprà come sono implementati e come adoperarli convenientemente. Sarà in grado di sviluppare un progetto software di piccola/media dimensione, applicando i principi visti. E nella versione da 7 cfu anche: Sarà in grado di analizzare sperimentalmente la complessità; computazionale di un programma. PREREQUISITI Conoscere i concetti basilari della programmazione con linguaggio imperativo. Conoscere concetti matematici e logici di base. E' consigliato, ma non obbligatorio, avere già sostenuto l'esame di Programmazione 1. MODALITA' DIDATTICHE L'insegnamento prevede lezioni in aula e in laboratorio coordinate fra loro, con circa metà delle ore in laboratorio. Per il laboratorio si chiederà di formare gruppi di due studenti. Saranno assegnati esercizi settimanali in Java e in Python, che possono essere facoltativamente consegnati per ottenere utili commenti. Saranno anche assegnati due progetti, in Java e in Python, da svolgere in gruppo con consegna obbligatoria, che costituiscono parte della prova d'esame. La versione da 7 cfu includerà un ulteriore piccolo progetto (una breve relazione), che costituisce parte della prova d'esame. PROGRAMMA/CONTENUTO Paradigma di programmazione object-oriented e linguaggio Java: Classi e oggetti, uguaglianza e copia di oggetti, costruttori, clientship, ereditarietà, overriding, eccezioni. Con esercitazioni pratiche e sviluppo di un progetto. Linguaggio Python: Interprete interattivo, tipaggio dinamico, tipi contenitori (liste, tuple, dizionari), funzioni, classi, ereditarietà, eccezioni. Con esercitazioni pratiche e sviluppo di un progetto. Concetti di Tipo di dato, algoritmo, implementazione. Introduzione alla complessità; spaziale e temporale, tecniche di valutazione della complessità (per algoritmi iterativi e algoritmi ricorsivi). Alcuni tipi di dato classici: pila, coda, dizionario. Alcuni algoritmi per problemi classici: ricerca e/o ordinamento e/o operazioni sui grafi. Per la versione da 7 cfu: Analisi sperimentale della complessità di un programma. TESTI/BIBLIOGRAFIA Il materiale didattico sarà; erogato tramite aulaweb, dove verranno pubblicati: dispense relative agli argomenti delle lezioni, link a risorse on-line relative ai linguaggi utilizzati (manuali e tutorial), testi degli esercizi di laboratorio, correzioni degli esercizi consegnati, ecc. In generale, gli appunti presi durante le lezioni e il materiale su aulaweb (uniti alla necessaria pratica di laboratorio) sono sufficienti per la preparazione dell'esame. Come appoggio possono essere usati i seguenti libri, come anche altri libri di contenuto equivalente. Libri in inglese: M.T.Goodrich, R.Tamassia. M.H.Goldwasser, Data structures and algorithms in Java. John Wiley & Sons (2014) C.Horstmann, R.D.Necaise. Python for everyone. John Wiley & Sons (2018) Traduzioni italiane: M.T.Goodrich, R.Tamassia, M.H.Goldwasser. Algoritmi e strutture dati in Java. Apogeo (2015) C.Horstmann, R.D.Necaise. Concetti di informatica e fondamenti di Python. Apogeo (2019) DOCENTI E COMMISSIONI PAOLA MAGILLO Ricevimento: Ricevimento su appuntamento concordabile via email (paola.magillo@unige.it) LEZIONI INIZIO LEZIONI Le lezioni inizieranno in accordo con l'anno accademico (primo semestre). Orari delle lezioni L'orario di questo insegnamento è consultabile all'indirizzo: Portale EasyAcademy ESAMI MODALITA' D'ESAME L'esame consiste in: Due progetti di laboratorio da consegnare durante il semestre Una prova orale I progetti sono da realizzarsi uno in Java e uno in Python. Il secondo dovrà essere accompagnato da un documento scritto che valuti la complessità computazionale del codice sviluppato. La versione da 7 cfu prevede un terzo e più breve progetto relativo all'analisi sperimentale della complessità computazionale. I progetti devono essere svolti a gruppi di due studenti e sono un requisito necessario per accedere alla prova orale. La data limite per la consegna è di norma la fine del semestre. Dopo la consegna eè previsto un breve colloquio, mirato a verificare che entrambi i membri del gruppo siano partecipi del lavoro svolto. La valutazione dei progetti avviene secondo una scala a livelli (sufficiente, benino, bene, ottimo). I progetti valgono per tutto l'anno accademico, dalla sessione di gennaio fino a quella di settembre compresa. Non sono previsti progetti di recupero per chi non avrà; consegnato entro i termini. La prova orale consiste in domande relative a gli argomenti visti durante il semestre e puo' includere la scrittura di esempi in codice (Java o Python) o pseudocodice. Il voto finale terrà conto della prova orale e dei progetti, con peso prevalente della prova orale. Gli studenti con DSA possono fare riferimento a questa pagina https://corsi.unige.it/corsi/8766/studenti-disabilita-dsa per richiedere adattamenti in sede d'esame. MODALITA' DI ACCERTAMENTO Per il codice consegnato nei progetti, verrà valutato il comportamento corretto rispetto alle specifiche, l'organizzazione generale, la complessità computazionale, lo stile di programmazione; per la documentazione testuale si valuterà se il contenuto è; corretto, completo, adeguatamente motivato e chiaramente esposto. Nel colloquio di verifica che segue alla consegna dell'esercitazione, i due membri del gruppo dovranno essere in grado di illustrare i passaggi salienti del loro elaborato. Per superare la prova orale bisognerà mostrare di aver compreso i concetti ed essere in grado di applicare le tecniche viste a lezione, e di padroneggiare la sintassi dei due linguaggi di programmazione Java e Python. ALTRE INFORMAZIONI Rivolgersi al docente per ulteriori informazioni non comprese nella scheda insegnamento. Agenda 2030 Istruzione di qualità Parità di genere