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à

Non sono previste propedeuticità

Prerequisiti

Per il proficuo raggiungimento degli obiettivi formativi del corso, è auspicabile che lo studente possieda alcune conoscenze pregresse relative ai fondamenti dell'informatica e della programmazione, nonché ai principi base del ragionamento logico e ipotetico-deduttivo, che costituiscono prerequisiti essenziali per la comprensione e l'applicazione consapevole dei contenuti trattati.

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

Da concordare con il docente inviando una email a: antonino.longominnolo@uniroma5.it

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