Ingegneria Informatica e Intelligenza artificiale L-8
Programmazione Object Oriented
| Settore scientifico disciplinare | Numero crediti formativi (CFU) | Docente |
| ING-INF/05 (IINF-05/A) | 6 | Antonino Longo Minnolo |
Obiettivi Formativi
L'insegnamento si propone di fornire agli studenti le nozioni fondamentali della programmazione, con particolare riferimento al paradigma della programmazione orientata agli oggetti (Object Oriented Programming). Il linguaggio di riferimento adottato è Python.
Vengono trattati i concetti di base dell'informatica e della programmazione strutturata (variabili, tipi di dati, strutture decisionali e iterative, funzioni e moduli), per poi introdurre le strutture dati fondamentali (liste e stringhe) e i principi della programmazione a oggetti: classi, oggetti, incapsulamento, ereditarietà e polimorfismo. Particolare attenzione è dedicata alla progettazione del software e alla modellazione tramite diagrammi UML.
Al termine del corso lo studente avrà acquisito:
- Comprensione dei principi fondamentali della programmazione: capacità di analizzare e risolvere problemi mediante algoritmi, strutture di controllo e funzioni in linguaggio Python.
- Padronanza del paradigma orientato agli oggetti: capacità di progettare e implementare classi, gestire l'incapsulamento, l'ereditarietà e il polimorfismo.
- Conoscenza delle strutture dati e degli strumenti di progettazione: comprensione dell'uso di liste e stringhe e della modellazione tramite diagrammi UML.
Risultati di apprendimento attesi
Conoscenza e capacità di comprensione
Lo studente dovrà aver acquisito conoscenza e capacità di comprensione:
- dei principi fondamentali della programmazione, inclusi i tipi di dati, le strutture decisionali e iterative, le funzioni e i moduli.
- degli strumenti e delle metodologie di progettazione degli algoritmi, applicandoli correttamente per la risoluzione di problemi di diversa complessità.
- dei principi della programmazione orientata agli oggetti, comprendendo i concetti di classe, oggetto, incapsulamento, ereditarietà e polimorfismo e le loro principali applicazioni.
Capacità di applicare conoscenza e comprensione
Lo studente dovrà sviluppare la capacità di applicare le conoscenze acquisite, con particolare riferimento:
- all'analisi e alla risoluzione di problemi mediante la scrittura di programmi Python che utilizzino variabili, espressioni, strutture di controllo e funzioni.
- all'utilizzo delle strutture dati fondamentali (liste e stringhe) per la gestione e l'elaborazione delle informazioni.
- alla progettazione e all'implementazione di soluzioni software basate sul paradigma a oggetti, definendo classi e gerarchie di ereditarietà per interpretare e risolvere problemi pratici.
Abilità di giudizio
Lo studente dovrà aver sviluppato capacità di giudizio critico nell'analisi e nell'applicazione dei concetti affrontati. In particolare, dovrà essere in grado di:
- valutare la correttezza delle soluzioni adottate nella stesura di un programma, identificando eventuali errori e proponendo alternative più appropriate.
- interpretare criticamente i risultati dell'esecuzione dei programmi, verificandone la coerenza con la specifica del problema.
- scegliere le strutture dati e i paradigmi di programmazione più idonei in funzione delle caratteristiche del problema (programmazione strutturata, procedurale o orientata agli oggetti).
Abilità di comunicare
Lo studente svilupperà, anche attraverso l'interazione con i docenti, la capacità di:
- esprimere in modo chiaro e rigoroso concetti e procedure relativi alla progettazione e allo sviluppo del software, utilizzando la terminologia tecnica appropriata.
- redigere documentazione tecnica su esercitazioni, progetti e analisi di programmi, presentando codice e risultati in forma comprensibile e strutturata.
- comunicare efficacemente con interlocutori tecnici e non tecnici, spiegando i principi fondamentali e le applicazioni pratiche della programmazione a oggetti.
- utilizzare strumenti informatici e di modellazione grafica, come i diagrammi UML, per rappresentare la struttura dei programmi e facilitare la comprensione delle soluzioni progettate.
Capacità di apprendimento
Lo studente dovrà aver acquisito le basi necessarie per:
- saper individuare autonomamente fonti di approfondimento (libri, articoli, documentazione ufficiale, risorse digitali) per consolidare e ampliare le conoscenze di programmazione.
- essere in grado di aggiornare le proprie competenze in relazione all'evoluzione dei linguaggi e delle tecnologie di sviluppo software.
- applicare metodi di studio e di problem solving per affrontare nuovi problemi legati alla progettazione e all'implementazione di programmi.
- collegare le conoscenze acquisite con altre discipline informatiche, favorendo un apprendimento interdisciplinare e continuo.
Programma del Corso
Modulo 1 – Introduzione all'informatica e alla programmazione
- Computer e programmi: hardware e software, CPU, RAM, memoria di massa e dispositivi di I/O.
- Memorizzazione dei dati: sistema binario, bit e byte, codifiche ASCII e Unicode, rappresentazione di numeri, immagini e suoni.
- Funzionamento di un programma: ciclo fetch-decode-execute, dal linguaggio macchina ai linguaggi ad alto livello, compilatori e interpreti.
- Approfondimento sui linguaggi di programmazione: caratteristiche, paradigmi e traduzione dei programmi.
- Introduzione a Python: installazione, interprete interattivo e script, ambiente di sviluppo IDLE.
Modulo 2 – Progettazione e algoritmi
- Il ciclo di sviluppo e le fasi di progettazione di un programma; pseudocodice e diagrammi di flusso.
- Ingegneria del software: ciclo di vita del software e programmazione strutturata.
- Problemi, algoritmi ed esecutori: definizione e tipologie di problemi.
- La descrizione degli algoritmi: tipologie di frasi del linguaggio e sequenze di esecuzione.
- Diagrammi di flusso: elementi fondamentali ed esempi.
- Diagrammi di flusso: blocchi di iterazione (ciclo while e do-while).
Modulo 3 – Output, variabili ed espressioni in Python
- Output nei programmi Python: input, elaborazione e output; la funzione print e le stringhe.
- Variabili e tipi di dati: regole di utilizzo delle variabili.
- Input da tastiera, concatenazione di stringhe e commenti.
- Espressioni ed operatori: eseguire calcoli, precedenza, parentesi, conversioni e costanti.
- Formattazione dell'output: le f-string, specificatori di formato, allineamento e ampiezza.
Modulo 4 – Strutture decisionali
- Strutture decisionali ad alternativa singola: l'istruzione if, espressioni booleane e operatori relazionali.
- Strutture ad alternativa doppia, confronto di stringhe e strutture decisionali nidificate.
- Operatori logici e variabili booleane.
- Applicazioni: massimo tra tre numeri, equazioni di secondo grado, fattoriale.
Modulo 5 – Strutture iterative
- Strutture iterative: ciclo while, ciclo for, la funzione range e le sue varianti.
- Calcolo di totali parziali, sentinelle, cicli di convalida dell'input e cicli nidificati.
Modulo 6 – Funzioni e moduli
- Introduzione alle funzioni: funzioni void e loro chiamata.
- Variabili locali e passaggio di argomenti alle funzioni.
- Variabili globali, funzioni produttive e restituzione di diversi tipi di dato.
- La libreria standard: i moduli random e math.
- Organizzazione del codice in moduli e programmazione modulare.
Modulo 7 – Liste
- Sequenze e liste: iterazione e accesso agli elementi.
- Modifica e concatenazione di liste.
Modulo 8 – Stringhe
- Modalità di accesso alle stringhe e operazioni di base.
- Porzioni di stringhe (slicing).
Modulo 9 – Programmazione a oggetti: classi e oggetti
- Programmazione procedurale e a oggetti: classi, istanze, attributi privati e metodo __str__.
- Attributi di istanza, metodi accessori e mutatori, passaggio di oggetti a funzioni e serializzazione.
- Diagrammi UML, identificazione delle classi in un problema e responsabilità delle classi.
Modulo 10 – Ereditarietà e polimorfismo
- Introduzione all'ereditarietà: creazione e utilizzo di superclassi e sottoclassi.
- Ereditarietà e polimorfismo: progettazione, formalizzazione e simulazione.
- Polimorfismo: overriding dei metodi nelle sottoclassi e uso del polimorfismo nei programmi.
Testi consigliati
Object-Oriented Programming with Python: Best Practices and Patterns - ISBN-13: 979-8896650386 di Robert Johnson - Editore HiTeX Press
Calendario
Modalità di accertamento dei risultati di apprendimento acquisiti dallo studente
Modalità di verifica dell'apprendimento L'acquisizione dei risultati di apprendimento previsti viene accertata attraverso la verifica del completamento delle attività di autovalutazione presenti alla fine di ogni sezione dell'insegnamento e attraverso la prova di esame. I test di autovalutazione permettono allo studente di monitorare la propria comprensione degli argomenti somministrati e, nel caso ci siano delle difficoltà, di attivarsi per colmare le lacune o chiedere ulteriori spiegazioni al docente tramite incontri di didattica interattiva. Tutti i contenuti trattati nell'ambito dell'insegnamento costituiscono oggetto di valutazione. La valutazione delle competenze acquisite dallo studente avverrà in forma scritta nelle date d'appello previste dall'Ateneo e pubblicate in piattaforma. La valutazione prevede l'identificazione del raggiungimento degli obiettivi previsti ed in particolare, per ogni argomento, saranno valutati:
- il grado di acquisizione della conoscenza degli argomenti trattati (50% del punteggio).
- la capacità di sintesi e correlazione tra i vari argomenti, oltre a una corretta terminologia (25% del punteggio).
- la comprensione e la capacità di interpretazione degli algoritmi e delle soluzioni implementate (25% del punteggio).
Modalità di esame
Propedeuticità
Prerequisiti
Organizzazione didattica
Modalità di erogazione del corso
Sono comprese videolezioni e attività di didattica interattiva.
I contenuti delle videolezioni sono parte integrante del programma d'esame, ma per numerosi argomenti sono necessari ulteriori approfondimenti ed è raccomandata la consultazione dei libri di testo indicati dai docenti.
Attività didattiche previste
Le attività di didattica, suddivise tra didattica erogativa (DE) e didattica interattiva (DI), saranno costituite da 7 ore per CFU e ripartite secondo una struttura di almeno 2,5 ore di DE (5 ore, tenuta in considerazione la necessità di riascolto) e di 2 ore di DI per ciascun CFU.
Attività didattica erogativa (45 ore)
- 35 lezioni frontali, videoregistrate, della durata di circa 30 minuti ciascuna, sempre disponibili in piattaforma didattica (ogni videolezione corrisponde a 1 ora di didattica erogativa considerando la necessità di riascolto).
Attività didattica interattiva (18 ore)
- Le 18 ore in forma di esercitazioni interattive in aula virtuale, svolte in modalità sincrona, organizzate in date e orari concordati e su tematiche specifiche del programma per gli studenti che preparano l'esame.
- Forum di approfondimento tematici: ha lo scopo di approfondire gli argomenti del corso che risultano di difficile comprensione per gli studenti o che interessano maggiormente. Si tratta di uno strumento che dà a ciascun studente la possibilità di aggiungere un argomento di discussione che verrà successivamente approfondito insieme al docente.
Attività di autoapprendimento
- Test di autovalutazione con domande a scelta multipla, alla fine di ogni lezione.
- Materiale di studio ed esempi di codice inerenti ai contenuti del corso sono disponibili in piattaforma per l'approfondimento degli argomenti trattati da parte degli studenti.
L'articolazione tra DE e DI, per ciascun modulo, sarà organizzata coerentemente con gli obiettivi formativi specifici dell'insegnamento.
Ricevimento studenti
Lezioni
Progettazione di un programma
Computer e Programmazione
Ingegneria del Software per la progettazione di programmi
Memorizzazione dei dati
Problemi, algoritmi, ed esecutori
Funzionamento di un programma
La descrizione degli algoritmi
Approfondimento sui Linguaggi di Programmazione
Diagrammi di flusso
Introduzione a Python
Diagrammi di flusso: i Blocchi di iterazione
Output nei programmi Python
Funzioni void
Variabili e tipi di dati
Strutture decisionali ad alternativa singola
Variabili locali e passaggio di argomenti in funzioni
Input, output testuale e commenti nei programmi Python
Strutture decisionali ad alternativa doppia e nidificate
Funzioni produttive, variabili e costanti globali
Programmazione a oggetti e classi
Ereditarietà nella programmazione a oggetti
Operatori matematici e costanti con nome in Python
Operatori logici e variabili booleane in Python
Strutture iterative: cicli while e for
Librerie e moduli
Accesso, modifica e passaggio a funzione di oggetti
Esercitazione su ereditarietà e polimorfismo
Output formattato con le f-string
Esercitazione: strutture decisionali e iterative
Accumulatori, sentinelle, cicli di convalida e nidificati
Memorizzazione delle funzioni nei moduli
Liste
Operazioni sulle stringhe
Tecniche per la progettazione di classi
Polimorfismo