I tutor del corso hanno creato un gruppo Telegram dedicato agli studenti per risolvere problemi legati all'installazione e all'uso del software, e alla soluzione dei problemi di programmazione proposti.
Verranno inoltre organizzate delle sessioni di esercitazione in vista degli appelli di esame.
Al gruppo non partecipa alcun docente, e i tutor potranno comunicare ai docenti il contenuto delle richieste ricevute solo se necessario, e comunque in forma anonima.
Il docente è disponibile il martedì dalle 10:00 alle 12:00 presso il suo studio (edificio CU002, quarto piano, stanza 9). Si consiglia di comunicare via e-mail la richiesta di ricevimento.
Appuntamenti in altri orari possono essere concordati via e-mail.
Vengono illustrati i principi fondamentali del'informatica
e della programmazione, utilizzando il linguaggio Python.
Vengono presentati alcuni algoritmi fondamentali per problemi di
ordinamento, ricerca e selezione, alcuni problemi numerici,
evidenziandone le caratteristiche di efficienza.
Vengono descritti i principali metodi di codifica dell'informazione.
Alla fine del corso lo studente sarà in grado di:
scrivere, compilare ed eseguire semplici programmi
nel linguaggio Python;
utilizzare ambienti di programmazione Python
progettare semplici algoritmi e valutarne in maniera informale la complessità
computazionale.
Componenti di un sistema di elaborazione: hardware, software, principali unità periferiche.
Interazione con un sistema operativo basato su finestre.
Il sistema operativo: funzioni principali, gestione dei processi, gestione della memoria, file system.
Concetto di cartella, documento, applicazione/programma.
Rappresentazione dell'informazione: codifica di informazioni numeriche - sistemi di numerazione posizionali,
codifica binaria, ottale, esadecimale, conversioni di base. Rappresentazione di numeri interi negativi.
Rappresentazione in virgola mobile. Codifica di caratteri.
Concetto di algoritmo.
Esempi di algoritmi in linguaggio naturale.
Generalità sui linguaggi di programmazione, compilatori.
Programmazione in linguaggio Python: uso dell'interprete interattivo, ambienti di programmazione, preparazione di script in linguaggio Python.
Costrutti essenziali del linguaggio: variabili, espressioni.
Assegnazioni, metodi di input/output, istruzioni di selezione, ed iterazione.
Sequenze, slicing di sequenze. Dizionari. Gestione delle eccezioni.
Definizione di funzioni, parametri.
Accesso a file e scrittura su file.
Consultazione della documentazione Python.
Algoritmi fondamentali:
Ricerca sequenziale, ricerca dicotomica su un vettore ordinato.
Ordinamento: insertion sort, merge sort.
Algoritmo di Euclide per la ricerca del Massimo Comun Divisore (MCD). Algoritmo per la ricerca del k-esimo elemento. Algoritmi di base su matrici.
Introduzione alla complessità computazionale: concetto di complessità di un algoritmo, valutazione informale della complessità computazionale degli algoritmi studiati.
Allen Downey,
Pensare in Python - Come pensare da Informatico,
seconda edizione
versione pdf (in italiano) disponibile gratuitamente su github
secondo la GNU Free Documentation License
versione cartacea (in italiano) edita da Egea.
Capitoli (rif. versione 2.2.23 del testo) 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12.1-12.3, 13.1-13.5, 14.1-14.5, 19.1-19.2, Appendice A, Appendice B
Per approfondimenti sulla programmazione in Python:
Cay S. Horstmann, Rance D. Necaise
Concetti di informatica e fondamenti di Python
Apogeo, 2019.
Un testo che tratta gli argomenti delle dispense è il
Cormen, Leiserson, Rivest, Stein: Introduzione
agli algoritmi e strutture dati, McGraw-Hill.
Le parti di interesse di questo testo sono indicate nelle dispense all'inizio di ciascun capitolo.
Ceri, Mandrioli, Sbattella:
Informatica arte e mestiere, McGraw-Hill. Cap. 11, pagg. 243-255,
o in alternativa
Ceri, Mandrioli, Sbattella:
Informatica istituzioni, McGraw-Hill.
Cap. 2 fino a 2.2.2 compreso e ad 2.3 alla fine del capitolo, pagg. 29-43
Strumenti di programmazione
ambiente Python interattivo, da installare sul proprio PC, disponibile per qualsiasi piattaforma www.python.org/downloads:
Thonny: un ambiente gratuito multipiattaforma, da installare sul proprio PC, per la scrittura e il debugging di programmi Python
python anywhere: un ambiente utilizzabile via web per la sperimentazione di programmi Python. Una volta creato un account permette di salvare i propri script Python e osservarne l'esecuzione semplicemente disponendo di una connessione al Web
pythontutor.com: un ambiente utilizzabile via web per la scrittura e l'esecuzione animata di programmi Python
Gli studenti che hanno difficoltà nel reperire il software possono rivolgersi al docente.
Utilizzando il software di virtualizzazione VirtualBox è possibile replicare su qualunque PC
lo stesso ambiente di lavoro disponibile sui PC dei laboratori "Paolo Ercoli" di via Tiburtina.
Una volta installato Virtual Box (si raccomanda la versione 6, disponibile su https://www.virtualbox.org) si può
eseguire la macchina virtuale del DSS, disponibile su
https://www.massimolauria.net/informatica2021/vm.html,
avendo così a disposizione esattamente lo stesso ambiente di lavoro che sarà utilizzato durante l'esame in presenza.
Per informazioni più dettagliate consultare la pagina
https://www.massimolauria.net/informatica2021/vm.html
L'esame consiste in una prova pratica di programmazione in Python da svolgere al computer, secondo le modalità utilizzate durante le esercitazioni di laboratorio, contenente
anche domande di teoria a risposta chiusa e a risposta aperta.
Alla prova seguirà un eventuale colloquio a discrezione del docente. Si consiglia di esercitarsi alla prova con le stesse modalità descritte nelle lezioni di laboratorio.
La prova sarà sostenuta nei laboratori di via Tiburtina sulla macchina virtuale del DSS. Si raccomanda di esercitarsi all'uso di questa macchina scaricando la macchina virtuale come descritto in alto.
Durante la prova di programmazione può essere consultata esclusivamente la tavola sinottica disponibile qui in versione PDF.
Esempi di prove di esame
Esempi di prove di esame sul programma degli anni accademici precedenti sono disponibili su
Prova di programmazione
Verificare, utilizzando l'interprete Python 3, qual è il massimo valore float rappresentabile
Sperimentare la differenza tra l'operatore / e l'operatore //, sia con operandi int che con operandi float.
Esprimere 8430 secondi in ore, minuti e secondi.
Generalizzare il problema precedente immettendo da tastiera il numero di secondi.
Calcolare quanti secondi sono 3 ore, 5 minuti e 18 secondi
Generalizzare il problema precedente immettendo da tastiera il numero di ore, minuti e secondi.
Trovare la lunghezza dell'ipotenusa di un triangolo rettangolo i cui cateti misurano
rispettivamente 18.6 metri e 15 metri
Come sopra, immettendo le lunghezze dei cateti da tastiera
Dato capitale iniziale (inserire a piacere) e interesse annuo (ad esempio 4.5 se l'interesse è del 4,5% annuo), calcolare il capitale dopo un anno e
dopo 3 anni.
Dati tre valori float distinti a
piacere, che rappresentano i coefficienti di una equazione di secondo grado in una variabile, trovare le soluzioni (se reali) oppure stampare un messaggio (se complesse). Il programma
deve funzionare correttamente per qualsiasi terna di coefficienti.
Ordina tre numeri. Dati tre numeri interi distinti stamparli in ordine crescente. Si può decidere di eseguire i confronti e stampare i tre valori nell'ordine richiesto oppure di usare altre tre variabili alle quali assegnare rispettivamente il valore minimo, mediano e massimo e poi stampare le tre variabili.
Verifica se tre interi possono essere le misure dei lati di un triangolo e individua il tipo di triangolo.
Per esempio, 3, 2 e 8 non possono esserlo perché ... non si riesce a "chiudere" il triangolo!
Come al punto precedente, ma in caso affermativo decidere se il triangolo è rettangolo, acutangolo
od ottusangolo (suggerimento: se vale il teorema di Pitagora è rettangolo, altrimenti ...)
Date (inserire a piacere questi valori) le coordinate di tre punti a=(xa, ya), b=(xb, yb), c=(xc, yc), calcolare la lunghezza dei lati del triangolo definito dai tre punti
Siano x1, y1, x2, y2, x3, y3, x4, y4 le coordinate (inserire a piacere questi valori) di quattro punti.
Calcolare e stampare le pendenze (coefficiente angolare) della retta passante per (x1, y1) e (x2, y2) e
della retta passante per (x3, y3) e (x4, y4).
Dati due intervalli I1=[a, b] e I2=[c, d], rappresentati nel programma da
quattro variabili int a, b, c, d;, con a<b e c<d, decidere se
l'intervallo I1 contiene l'intervallo I2 (come ad esempio nel caso I1=[3, 40] e I2=[12, 25])
oppure I2 contiene I1, oppure non c'è relazione di contenimento (come ad esempio
nel caso I1=[11, 56] e I2=[28, 80]. Visualizzare gli intervalli e un messaggio che indica
l'eventuale contenimento.
Si vuole studiare un insieme di 5 pazienti a, b, c, d, e, dei quali conosciamo
il peso espresso in kg (pa, pb, pc, pd, pe) e l'altezza espressa in metri (ha, hb, hc, hd, he) (inserire a piacere questi valori).
Calcolare e stampare il body mass index (BMI) dei 5 soggetti.
Il BMI di una persona è definito dal peso in kg diviso il quadrato dell'altezza in metri.
Dato capitale iniziale (inserire a piacere) e interesse annuo (ad esempio 4.5 se l'interesse è del 4,5% annuo), calcolare il capitale dopo un anno e
dopo 3 anni.
Stampare (per ora usando una sequenza di istruzioni molto simili tra loro) una tabella con il valore del seno e del coseno degli angoli da 0 a 90 gradi, con incrementi di 10 gradi.
È anche possibile definire una funzione che, data l'ampiezza x di un angolo in gradi, stampa la riga corrispondente comprendente ampiezza, seno e coseno di x. Basterà poi chiamare ripetutamente questa funzione.
Stack di attivazione delle funzioni. Variabili locali.
Passaggio dei parametri. Assenza di effetti collaterali su parametri
Funzioni vuote, funzioni che restituiscono valori. Parametri ed argomenti.
Listati ed esercizi proposti
dati tre reali maggiori di zero, stampare la media aritmetica e la media geometrica
generare casualmente 5 numeri interi in [1, 6] e stampare:
il massimo
la molteplicità del massimo
(quanti valori sono uguali al massimo)
dato l'orario di inizio di un evento (espresso da tre interi: ore, minuti, secondi, con ore compreso in [0,23], minuti compreso in [0, 59] e secondi compreso in [0, 59]) e data la durata dell'evento (espressa in ore, minuti e secondi con gli stessi vincoli definiti sopra), calcola e stampa l'istante di fine dell'evento (espressa nello stesso modo), indicando se l'istante di fine è nello stesso giorno dell'inizio o nel giorno successivo
Funzione che date le misure di due cateti di un triangolo rettangolo restituisce la misura dell'ipotenusa, con esempio di uso
Funzione che verifica se tre numeri costituiscono una terna pitagorica, cioè se il quadrato di uno dei tre è uguale alla somma dei quadrati degli altri due, con esempi di uso. Questa funzione deve restituire True o False
Esercizi sull'uso di cicli e istruzioni condizionali
Listati ed esercizi proposti
Scrivere un programma che stampa il seno e il coseno degli angoli di ampiezza 0, 10, 20, ..., 90 gradi.
Scrivere un programma che legge da tastiera un intero n e stampa una riga contenente n asterischi. La stampa deve essere ottenuta chiamando una apposita funzione, e senza usare l'operatore di moltiplicazione su stringhe.
Scrivere un programma che mostra quante volte bisogna ripiegare in due un foglio dello spessore di 0,1 millimetri affinché si raggiunga lo spessore di 500 mm.. Stampare lo spessore ottenuto dopo ciascun ripiegamento.
Modificare il programma precedente, stampando solo il numero di ripiegamenti necessari. Deve essere stampato un solo numero. Provare poi a raggiungere la distanza Terra-Luna, circa 380000 km (380.000.000.000 mm, 3.8e+11 mm).
Modificare il programma precedente, definendo una funzione che prende come parametri lo spessore del foglio e la distanza che si intende raggiungere, e restituisce il numero di ripiegamenti necessari. Scrivere un programma che chiama la funzione appena definita con vari valori dei parametri.
Fare in modo che il programma ignoto.py funzioni anche quando a e/o b contengono valori negativi
Scrivere un programma che, dati due numeri naturali a e b, stampa il valore di ab, senza utilizzare l'operatore **
Definire una funzione che restituisce il numero di anni necessari per raggiungere un dato importo
a partire da un capitale iniziale e un tasso di interesse annuo. Alla fine di ciascun anno gli interessi maturati vengono aggiunti al capitale, in modo che nell'anno successivo anche gli interessi aggiunti al capitale diano luogo ad interessi.
Verifica se un naturale è primo. La funzione ha come parametro il numero naturale e restituisce True o False. Per verificare se un numero a è divisibile per b basta verificare se il valore a % b è zero.
Considerazioni sull'efficienza degli algoritmi per il test di primalità.
Stampa il numero di divisori di un naturale (si possono
utilizzare alcune delle idee a proposito del test di primalità)
Scrivere una funzione che stampi i numeri della successione di Fibonacci minori o uguali a un parametro dato.
Scrivere un programma che stampi i primi n elementi della successione di Fibonacci.
scansione delle posizioni for i in range(len(sequenza)):
scansione degli elementi for valore in sequenza:
di una sequenza
Semplici programmi con cicli
Esempi di programmi con cicli e istruzioni di selezione
Listati ed esercizi proposti
Dato un numero naturale n, stampare un quadrato (pieno) di asterischi di lato n.
Il quadrato sarà formato da n righe, ciascuna contenente n asterischi.
Dati due numeri naturali n e b, con b < n/2, stampare un quadrato di asterischi di lato n con il bordo di spessore b.
Ad esempio, se il valore di b fosse 3, il quadrato dovrebbe avere l'aspetto seguente:
Dato un numero naturale n, stampare un triangolo rettangolo (pieno) di asterischi di lato n.
Il triangolo sarà formato da n righe di lunghezza crescente.
*
**
***
****
. . .
*********
**********
Dato un numero naturale n, stampare un triangolo rettangolo (solo il bordo) di asterischi di lato n.
Il triangolo dovrà avere l'aspetto seguente:
*
**
* *
* *
. . .
* *
* *
**********
Stampare la somma dei primi n termini della serie armonica:
1/1 + 1/2 + 1/3 + ... + 1/n
Come sopra, mostrando la differenza tra il risultato ottenuto eseguendo la somma in un senso o in senso opposto:
1/1 + 1/2 + 1/3 + ... + 1/n
rispetto a 1/n + 1/(n-1) + 1/(n-2) + ... + 1/2 + 1/1
Mostrare l'andamento della somma della serie armonica, visualizzandone il valore ogni 100 termini aggiunti fino a un massimo numero di termini immesso da tastiera.
Mostrare che la differenza tra la somma dei primi n termini e il logaritmo naturale (Math.log) di n, al crescere di n, tende a una costante.
Stampa della tavola pitagorica n × n
assumendo che che l'input (n) sia
compreso nell'intervallo [1,18] (Suggerimento: per ottenere la tabella ben incolonnata usare il cosiddetto "modulo tra stringhe" o "string interpolation")
Somme di quadrati
Scrivere un programma che, dato in input un numero naturale n, stampa tutte le coppie di naturali
x, y tali che x^2 + y^2 = z^2, con x, y, z ≤ n.
Per n = 20 le soluzioni dovrebbero essere le seguenti:
Assegnazione vs. copia: riferimenti multipli a liste
Slicing
Funzioni che modificano liste
Funzioni che restituiscono liste
Listati ed esercizi proposti
funzione che restituisce la somma degli elementi di una lista
funzione che restituisce la media degli elementi di una lista
funzione che restituisce minimo e massimo di una lista
funzione che restituisce le posizioni del minimo e del massimo di una lista
funzione che, data una lista di numeri L e una soglia s, restituisce il numero di elementi di L maggiori di s
funzione che crea e restituisce una lista di float random
funzione che moltiplica gli elementi di una lista L, passata come parametro, per una costante data c, passata come parametro. La funzione deve modificare la lista L, senza restituire nulla.
Leggi da tastiera una sequenza di numeri,
memorizzala in una lista, stampa la somma degli elementi
sommaSequenzaInLista.py
Leggi da tastiera una sequenza di double,
memorizzala in una lista, crea un lista che contiene una copia degli elementi della prima lista,
ma in ordine inverso
copiaOrdineInverso.py
Leggi da tastiera una sequenza di interi che rappresentano delle frequenze,
memorizzala in una lista, crea una lista che contiene le frequenze cumulate e stampa, in due colonne,
la sequenza delle frequenze (sulla sinistra) e la sequenza delle frequenze cumulate (sulla destra)
cumula.py
Dizionari: definizione, indicizzazione, scansione con ciclo for, metodi keys(), values(), items().
Condizione in su dizionari.
Il metodo get
Listati ed esercizi proposti
Funzione che a partire da una lista di valori, restituisce un dizionario in cui ciascun valore presente nella lista è associato al numero di occorrenze (frequenza)
frequenza.py.
Funzione che a partire da un dizionario che contiene frequenze assolute delle chiavi, restituisce il dizionario contenente le frequenze relative
delle chiavi frequenzeRelative.py
Scrivere le seguenti funzioni, che hanno tutte come parametri un dizionario esami in cui ogni chiave è il titolo di un insegnamento e il corrispondente valore è il voto riportato, e un secondo dizionario crediti in cui ogni chiave è il titolo di un insegnamento e il corrispondente valore è il numero di crediti.
Restituire il numero di esami sostenuti.
Restituire il numero di esami sostenuti, escluse le idoneità (le idoneità non sono presenti nel secondo dizionario).
Restituire la media (non pesata) dei voti conseguiti, escluse le idoneità.
Restituire il numero di crediti conseguiti, incluse le idoneità.
Restituire una coppia formata dal numero totale di crediti conseguiti e il numero di crediti conseguiti come idoneità.
Restituire la media dei voti conseguiti, escluse le idoneità, pesata in base ai crediti.
Restituire il voto più alto e il voto più basso.
Come il punto precedente, includendo anche i titoli di uno qualsiasi degli esami con voto massimo e uno di quelli con voto minimo. La funzione deve restituire una stringa composta dai due titoli e i rispettivi voti.
Come il punto precedente, includendo tutti gli esami con voto massimo e tutti quelli con voto minimo.
Restituire il dizionario contenente solo gli esami, con i relativi voti, nel cui titolo compare la stringa "Statistic". La stringa da cercare nel titolo può essere un parametro opzionale della funzione.
Come il punto precedente, ma la ricerca della stringa non deve tener conto della differenza tra lettere maiuscole e minuscole.
Per il test, costruire dizionari sufficientemente ricchi.
Metodi write, close. Uso di metodi di str su righe di testo: strip, split, join.
Ciclo for su file in lettura
Listati ed esercizi proposti
Funzione che mostra la scrittura di un file di testo
interiSuFile.py
Lettura di un file di testo
leggiFile.py. Assume che esista un file pippo.txt contente un intero per riga nella stessa cartella.
Funzione che, dati due nomi di file di testo, copia il contenuto del primo file nel secondo file
Funzione che, dato il nome di un file di testo contenente un numero float su ciascuna riga, restituisce il numero di valori maggiori di 10
Funzione che, dato un intero n e il nome di un file, genera un file di testo
contenente n valori random nell'intervallo [0,1)
Funzione che, dati tre nomi di file di testo, legge le righe del primo file
e le copia negli altri due file, separando le righe più lunghe di 10 caratteri (nel secondo file) da quelle più corte (nel terzo file)
Esempio di calcolo delle medie mobili di ordine k di una sequenza di lunghezza n
in tempo O(n) invece di O(nk).
Uso della libreria matplotlib per la visualizzazione.
Per l'installazione utilizzare dal prompt dei comandi (Terminale in Mac OS X o Linux) il comando pip install matplotlib, oppure, in Thonny, andare sul menu' Tools -> Manage packages