Fondamenti di Informatica

Finalità del corso

L’obiettivo principale del corso è prendere confidenza con il "pensiero algoritmico", attraverso un processo di astrazione e modellazione di problemi a cui trovare soluzioni procedurali. Centrale è lo studio e lo sviluppo di algoritmi e il ragionare sulle loro proprietà, tra cui correttezza, efficienza, ottimalità. Il corso quindi si propone di presentare i concetti di base relativi all’elaborazione automatica dell’informazione. Tali concetti sono sia analizzati da un punto di vista teorico che presentati in pratica. Scopo del corso è anche l’apprendimento di un linguaggio di programamazione per la realizzazione degli algoritmi. Il linguaggio utilizzato è il Python.

Il programma

INTRODUZIONE AL CORSO - Informatica: definizione e cenni storici - Le nozioni di problema, algoritmo e programma. L’organizzazione del calcolatore. Linguaggi di programmazione. Processi e processori. La macchina a registri illimitati URM come modello di macchina universale. Semplici algoritmi e programmi per la URM.

PARTE I - ARCHITETTURA DEI CALCOLATORI

Obiettivo: Fornire i concetti principali relativi alla rappresentazione dell’informazione, all’architettura di un calcolatore ed ai linguaggi di programmazione.

Codifica binaria dell’informazione: Sistemi numerici posizionali a base fissa. Conversioni di base. Rappresentazione di numeri negativi in modulo e segno e in complemento a due. Rappresentazione di numeri reali in virgola mobile normalizzata. Operazioni aritmetiche. Algebra di Boole e principali funzioni logiche. Codifica caratteri e immagini. Architettura dei calcolatori: Modello di von Neumann. Linguaggio macchina. Il linguaggio assemblatore. Linguaggi di alto livello. Compilatori e iterpreti.

PARTE II - PROGRAMMAZIONE

Obiettivo: introdurre i costrutti fondamentali del linguaggio di programmazione Python.

Ambiente di programmazione Python: compilatore e interprete. Struttura di un programma Python. Concetto di variabile. Operazioni elementari: lettura, scrittura, assegnazione e confronto. Tipi semplici, rappresentazione interna e operazioni. Espressioni numeriche e logiche. Diagrammi di flusso. Pseudo-codice. Struttura di controllo se-allora-altrimenti. Cicli con pre-condizione e post-condizione. Progettazione di algoritmi con controlli e cicli. Costrutti base del Python (if-else, if-elif-else, for, while).
Tipi strutturati: stringhe, liste, tuple, pile, code, insiemi, dizionari, matrici. Algoritmi di base su tipi strutturati (lettura, scrittura, ricerca,inserimento e cancellazione di elementi). Riferimenti a tipi strutturati. Tipo file. Primitive per la gestione sequenziale dei files.
Funzioni: concetto di sottoprogramma. Progettazione top-down. Dichiarazione di funzioni. Passaggio di parametri per valore e per riferimento; variabili globali e locali. Visibilità e ciclo di vita delle variabili. Mascheramento di variabili. Stack e record d’attivazione. Ricorsione.

PARTE III - COMPLESSITA’ E ALGORITMI

Obiettivo: introdurre alla complessità computazionale, studiare alcuni algoritmi di base e valutare la loro complessità in base a profilazione e analisi della complessità.
Complessità dei programmi: funzioni calcolabili e non calcolabili. Efficienza dei programmi e modelli di costo. Caso migliore, caso medio e caso peggiore. Complessità computazionale. Notazione asintotica. Delimitazioni alla complessità di un problema.
Algoritmi fondamentali: Ricerca sequenziale, Ricerca binaria e Algoritmi di ordinamento: profilazione e analisi della complessità nel caso peggiore. Introduzione agli alberi e loro rappresentazione. Algoritmi di visita di alberi binari.

Testo di riferimento

Concetti di informatica e fondamenti di Python, C. Horstmann, R.D. Necaise, Apogeo, 2014

Testi integrativi:

- Informatica arte e mestiere, D. Mandrioli et al., McGrawHill, 2014
- Programmazione in Python - Seconda edizione, Kenneth A, Lambert, Apogeo, 2018

Altro materiale fornito dal docente

Lucidi del corso
Dispensa del docente sulla macchina URM
Codice programmi in Python

Tutoraggio

Il corso prevede 30 ore aggiuntive di tutoraggio che saranno tenute dalla Dott. Ing. Alessia Di Fonzo.

Gestione Esami: La prova di esame consiste di uno scritto e di un orale da sostenere nello stesso giorno di appello. La parte dello scritto relativa alla programmazione può essere sostituita da un elaborato, da concordare con il docente, che lo studente discuterà durante l'orale. L'elaborato dorà essere preparato secondo quanto descritto in questo documento.

Organizzazione Parziali a.a. 2022-23: La prova del primo parziale si terrà in presenza e in orario di lezione nei giorni 22/11/2022 e 24/11/2022. Gli studenti sono tenuti a prenotarsi sul file Prenotazione_paziali presente sul canale teams del corsto. La prova verterà sulla programmazione in Python e su argomenti di teoria.

La seconda prova parziale si terrà in presenza e in orario di lezione in giorni da definire. Come la prima prova, la seconda verterà sulla programmazione in Python e su argomenti di teoria. Non potranno presentarsi alla seconda prova gli studenti che hanno ricevuto una valutazione insufficiente alla prima.

Esiti delle prove di esonero a.a. 2023-24.

Prove parziali novembre 2023, gennaio 2024 e votazione finale

Per la registrazione del voto gli studenti dovranno prenotarsi e presentarsi ad uno degli appelli di esame, dove potranno sostenere una prova orale.

Esiti delle prove di esonero a.a. 2022-23.

Prove parziali novembre 2022, gennaio 2023 e votazione finale

Per la registrazione del voto gli studenti dovranno prenotarsi e presentarsi ad uno degli appelli di esame, dove potranno sostenere una prova orale.