"Diario" (comprendente i programmi
svolti/discussi in laboratorio) delle lezioni
relative al corso di Laboratorio di Calcolo I
Lezione del 4/3
Presentazione degli obbiettivi e degli strumenti del
corso.
Lezione del 5/3
Struttura di un calcolatore (cenni): schema
dell'hardware, classificazione del software, schema
della CPU e del suo funzionamento; linguaggi a basso
livello (assembler). Per approfondimenti, si consiglia la
lettura del primo capitolo delle Note su linguaggio C e
dintorni, accessibile al punto 1
di questa pagina
web.
Lezione del 8/3
Generalità sulla struttura fisico/logica dei
dischi; partizioni e MBR (=Master Boot Record). Per
approfondimenti, si consiglia la lettura del paragrafo 6.3
delle Note su linguaggio C e dintorni, accessibile
al punto 1 di questa
pagina web.
La struttura ad albero delle directories; breve
introduzione all'utilizzo dei
comandi di linea
"essenziali" in Linux.
Consegna
del questionario
riguardante le caratteristiche del proprio
hardware. Compilare correttamente
il questionario
permetterà di frequentare in modo proficuo
una delle installezioni che verranno svolte,
a cominciare dalla settimana seguente, in aula di laboratorio.
Lezione del 11/3
Alcuni tipi di dati in linguaggio C: gli interi e i
numeri in virgola mobile (per approfondimenti, si consiglia
la lettura del capitolo 4 delle Note su linguaggio C e
dintorni, accessibile al punto 1
di questa pagina
web).
I numeri in virgola mobile rappresentabili sul
calcolatore: numero massimo, numero positivo minimo
e "errore di macchina".
Introduzione dei diagrammi di flusso.
Esercizio (elementare)
Stampa della taglia (in bytes) di vari tipi di dati:
ne si leggano e capiscano le istruzioni, lo si compili e
lo si esegua.
Lezioni del 12/3 - 15/3
Descrizione dell'algoritmo che consente di calcolare
l'"errore di macchina" e della traduzione in C di
tale algoritmo.
Primo contatto con la distribuzione GNU/Linux
installata sul disco rigido dei PC in laboratorio: esempio
di sessione di lavoro "minima" con la distribuzione
GNU/Linux attualmente installata in laboratorio,
possibilmente da replicare "a casa" sul proprio PC, dopo
avervi completato un'installazione.
Scrittura in laboratorio del nostro primo programma;
esso effettua il calcolo dell'"errore di macchina":
Prima installezione: modifica delle
chiavette USB di alcuni studenti (numero max. <= 20), in
modo che esse possano emulare un CD di installazione di una
distribuzione GNU/Linux. La procedura descritta durante
l'installezione dovrà essere
proseguita da ciascuno studente "a casa propria", in modo
da completare l'installazione, così come
descritto dai video accessibili a partire
da questa
pagina web (in verità, quegli stessi video
sono direttamente accessibili, senza utilizzare la rete,
quando il sistema operativo GNU/Linux viene avviato sul
proprio computer da quelle stesse chiavette USB).
Esercizi proposti
Calcolo del minimo numero positivo rappresentabile
sul calcolatore:
(questo programma include delle istruzioni che verranno
descritte nelle lezioni successive; pertanto, al fine di
comprendere meglio la rappresentazione dei numeri in
virgola mobile, esso è interessante da eseguire,
ma non è utile come esercizio di
programmazione).
Lezione del 18/3
Descrizione di un algoritmo di calcolo della radice
quadrata; studio della convergenza (che si rivela essere di
tipo quadratico) alla soluzione; cenni agli algoritmi
"alla Newton".
Lezioni del 19/3 - 22/3
Scrittura del programma che traduce in C l'algoritmo di
calcolo della radice quadrata precedentemente descritto:
Seconda installezione: modifica delle
chiavette USB di alcuni studenti (numero max. <= 20), in
modo che esse possano emulare un CD di installazione di una
distribuzione GNU/Linux. La procedura descritta durante
l'installezione dovrà essere
proseguita da ciascuno studente "a casa propria", in modo
da completare l'installazione, così come
descritto dai video accessibili a partire
da questa
pagina web (in verità, quegli stessi video
sono direttamente accessibili, senza utilizzare la rete,
quando il sistema operativo GNU/Linux viene avviato sul
proprio computer da quelle stesse chiavette USB).
Lezione del 25/3
Descrizione del metodo di bisezione; confronto
delle caratteristiche fondamentali del metodo di
bisezione e degli algoritmi "alla Newton".
Lezioni del 26/3 - 5/4
Scrittura del programma che traduce in C il metodo
di bisezione descritto nella lezione precedente:
Brevi cenni a proposito dei cicli do - while,
while e for, con particolare attenzione
alle relazioni che intercorrono fra di essi.
Esercizi proposti
Si consiglia di svolgere i primi due esercizi della
scheda di lavoro numero 4, tra quelle a cura del
prof. A. Giorgilli, che sono accessibili al punto 2
di questa pagina
web.
Lezione del 8/4
Descrizione dell'algoritmo che consente di passare
dalla rappresentazione decimale a quella binaria e viceversa.
Cenni al passaggio di argomenti per indirizzo
nella scrittura di una function, così come viene
implicitamente effettuato quando compare un vettore tra gli
argomenti di quella function.
Lezioni del 9/4 - 12/4
Scrittura individuale (da parte di ciascuno
studente) del programma che traduce in C l'algoritmo
che consente di passare
dalla rappresentazione decimale a quella binaria e
viceversa (così come descritto nella lezione
precedente):
Riscrittura individuale (da parte di ciascuno
studente) del programma presente in
conv_bin.c
(descritto ai punti precedenti), in modo tale da
utilizzare le function:
Si consiglia di svolgere tutti i restanti esercizi
(a parte i primi due) della scheda di lavoro numero 4,
tra quelle a cura del prof. A. Giorgilli, che sono
accessibili al punto 2
di questa pagina
web.
Lezione del 15/4
Brevi cenni riguardanti l'utilizzo e la scrittura delle
function; discussione di un esempio elementare:
Descrizione dell'algoritmo che consente di calcolare
la somma di due numeri interi in rappresentazione
binaria utilizzando solamente gli operatori logici e non il
"+".
Descrizione dell'algoritmo che consente di calcolare
il logaritmo per mezzo della sua espansione in serie di
potenze.
Lezioni del 16/4 - 19/4
Scrittura individuale (da parte di ciascuno
studente) del programma che traduce in C l'algoritmo
che consente di calcolare la somma di due numeri interi
in rappresentazione binaria utilizzando solamente gli
operatori logici e non il "+" (così come
descritto nella lezione precedente):
Scrittura individuale (da parte di ciascuno
studente) del programma che traduce in C l'algoritmo
che consente di calcolare il logaritmo per mezzo della
sua espansione in serie di potenze (così come
descritto nella lezione precedente):
Scrittura di un programma che calcola il prodotto di
due numeri interi in rappresentazione binaria utilizzando
solamente gli operatori logici e non il "*":
Si consiglia di affrontare il
tema
d'esame del settembre 2007, che richiede di
svolgere la sottrazione e la divisione di due numeri in
rappresentazione binaria utilizzando solamente gli
operatori logici e non il "-" o il "/". La soluzione
è disponibile a partire
da questa pagina che
raccoglie i temi d'esame precedentemente assegnati agli
studenti.
Lezione del 22/4
Cenni agli operatori bitwise, utilizzati per
esempio per effettuare la somma di due numeri interi
senza usare il "+":
Descrizione dell'algoritmo che consente di calcolare
simultaneamente le funzioni coseno e seno, per
mezzo delle loro espansioni in serie di potenze.
Lezione del 23/4
Scrittura individuale (da parte di ciascuno
studente) del programma che traduce in C l'algoritmo
che consente di calcolare
simultaneamente le funzioni coseno e seno, per
mezzo delle loro espansioni in serie di potenze
(così come descritto nella lezione precedente):
Si consiglia di affrontare il
tema
d'esame del settembre 2007, che richiede di
svolgere la sottrazione e la divisione di due numeri in
rappresentazione binaria utilizzando solamente gli
operatori logici e non il "-" o il "/". La soluzione
è disponibile a partire
da questa pagina che
raccoglie i temi d'esame precedentemente assegnati agli
studenti.
Scrittura di un programma che effettua il calcolo
delle soluzioni di un'equazione polinomiale di secondo
grado all'interno di una function:
Introduzione alle function ricorsive; cenni alla pila
(=stack) di attivazione con procedura LIFO (=Last In
First Out); discussione di un esempio: il programma che
effettua il calcolo del fattoriale con un
metodo ricorsivo:
Puntatori alle functions; discussione del programma che
traduce in C il metodo di bisezione (descritto in
una delle lezioni precedenti), facendo uso di un puntatore
a una function:
Discussione di un metodo di calcolo numerico degli
integrali definiti: il metodo del punto medio;
studio dell'errore numerico commesso utilizzando tale
metodo in funzione del numero di sotto-intervalli
(in cui viene suddiviso l'intervallo di integrazione).
Lezioni del 30/4 e del 3/5
Brevissima introduzione all'utilizzo del software
per la grafica gnuplot. Come esempio di
applicazione, viene prodotto un grafico a partire dal
file integrale.out
(che raccoglie dei dati prodotti in output dal programma
integrale.c);
tale grafico viene prodotto utilizzando i comandi inclusi
nel seguente file:
non occorre fare altro che
digitare il seguente comando (all'interno di una finestra
di terminale che ha come directory corrente quella in
cui sono presenti i
files integrale.out
e integrale.gnp):
gnuplot
poi
load "integrale.gnp"
e, infine,
quit
per terminale l'esecuzione del programma gnuplot.
Scrittura individuale (da parte di ciascuno
studente) del programma che traduce in C l'algoritmo
di calcolo numerico degli integrali definiti
utilizzando il metodo del punto medio (così
come descritto nella lezione precedente):
Le lezioni del 29/4, 30/4 e 3/5 sono le ultime concernenti
l'analisi matematica; quelle seguenti riguarderanno argomenti
di algebra lineare. Di conseguenza, tutti
i temi d'esame degli appelli
precedenti che trattano argomenti di analisi (e
che sono facilmente distinguibili da quelli basati
sull'algebra lineare) possono essere affrontati come
esercizi impegnativi ed utili alla preparazione dell'esame di
LC1.
Lezione del 6/5
Descrizione di alcune istruzioni elementari che
consentono di effettuare le operazioni di Input/Output
su file:
fopen, fclose, fprintf e fscanf.
Matrici (cioè array
bi-dimensionali) come argomenti delle functions;
accesso alle singole righe delle matrici, grazie
al meccanismo di passaggio degli argomenti per
indirizzo.
Discussione di un programma che verifica che una
matrice (i cui valori degli elementi vengono letti da un
file esterno di input) è ortogonale; questo
programma è strutturato in modo tale da utilizzare
le nozioni discusse in precedenza:
Scrittura individuale (da parte di ciascuno
studente) del programma che traduce in C l'algoritmo
che verifica se una matrice (letta da un file esterno di
input) è ortogonale (così come descritto
nella lezione precedente):
Inoltre, per poter funzionare, il suddetto programma deve
essere eseguito all'interno di una directory
(=cartella) che contiene anche il seguente file
di input:
Nota: tale programma (alla fine della sua
esecuzione) scriverà la matrice ortogonale
"risultato" nel suddetto file di
outputmatr_ort.inp,
che è il file di input
per matr_ort.c.
Lezione del 13/5
Discussione del metodo di Laplace per il
calcolo del determinante di una matrice.
Successioni di numeri pseudocasuali, utilizzo
delle functions srand, rand e time; un
primo esempio elementare di scrittura di un programma su
tali argomenti:
Scrittura individuale (da parte di ciascuno
studente) del programma che traduce in C l'algoritmo
che permette di calcolare il determinante di una matrice
con il metodo di Laplace (così come
descritto nella lezione precedente):
Studio dell'occupazione della CPU richiesta dal
calcolo di un elemento della successione di Fibonacci:
confronto tra il tempo necessario al calcolo secondo il
metodo iterativo, con quello richiesto dal metodo
ricorsivo.
A tale scopo, quando si manda in esecuzione il programma
dalla finestra di terminale, è utile premettere il
comando (Linux/Unix) time all'istruzione che
avvia il file eseguibile.
Utilizzando il software gnuplot si
effettui (in scala semi-logaritmica)
Alcuni approfondimenti riguardanti le funzioni
ricorsive; Cenni riguardanti l'analisi della
complessità computazionale del programma che
effettua il calcolo degli elementi della successione di
Fibonacci con un metodo ricorsivo:
Breve analisi della complessità
computazionale; dell'algoritmo iterativo e
confronto con quella relativa
all'algoritmo ricorsivo.
Discussione del metodo di Cramer per la
soluzione dei sistemi lineari.
Breve comparazione dell'efficienza
algoritmica tra il metodo di Cramer e
quello di eliminazione alla Gauss, per la
soluzione dei sistemi lineari.
Approfondimenti riguardanti alcune procedure per la lettura
da file; utilizzo (combinato) delle istruzioni
fgets e sscanf.
Un primo esempio elementare di utilizzo della function
fgets, allo scopo di leggere correttamente un file
di input di cui non si conosce a priori il numero di
righe:
Ulteriori approfondimenti riguardanti
alcune procedure per la lettura da file; utilizzo
(combinato) delle istruzioni
fgets, sscanf e strchr
o strstr. Discussione del programma
Il suddetto programma matr_ort_new.c
è un'opportuna riscrittura di
matr_ort.c, in
modo tale da poter leggere un file di input contenente una
matrice i cui elementi sono disposti nel modo tradizionale,
cioè "per righe e colonne". Come
in matr_ort.c,
il
programma matr_ort_new.c
effettua anche la verifica che la matrice letta da file
è ortogonale.
Lezione del 21/5
Scrittura individuale (da parte di ciascuno
studente) del programma che traduce in C l'algoritmo
che permette di risolvere sistemi lineari con il metodo
di Cramer (così come descritto nella
lezione precedente):
Inoltre, per poter funzionare, il suddetto programma deve
essere eseguito all'interno di una directory
(=cartella) che contiene anche il seguente file
di input:
Infine, quando la sua esecuzione sta per essere terminata,
il suddetto programma produce il seguente file di output
(che sarà contenuto sempre all'interno della
stessa directory, o cartella):
Inoltre, per poter funzionare, il suddetto programma deve
essere eseguito all'interno di una directory
(=cartella) che contiene anche il seguente file
di input:
Esercitazione "speciale" proposta in laboratorio:
un tema d'esame a scelta tra quelli assegnati durante uno
degli anni accademici precedenti.
Lezione del 3/6
Discussione del metodo delle potenze per il
calcolo dell'autovalore massimo (in valore assoluto) di una
matrice e del corrispondente autovettore.
Discussione del metodo delle potenze inverse
per il calcolo degli autovalori e autovettori delle
matrici.
Brevi cenni riguardanti i teoremi
di Gershgorin, che permettono di localizzare le
regioni del piano complesso all'interno delle quali sono
compresi gli autovalori di una matrice.
Lezioni del 4/6 e del
7/6
Scrittura individuale (da parte di ciascuno
studente) del programma che traduce in C l'algoritmo
che consente di determinare gli autovalori e autovettori
(di una particolare matrice), applicando il metodo
delle potenze inverse (così come descritto
nella lezione precedente):
Inoltre, per poter funzionare, il suddetto programma deve
essere eseguito all'interno di una directory
(=cartella) che contiene anche il seguente file
di input:
Si consiglia di affrontare i temi d'esame del 4 giugno
2007 e del 25 giugno 2008, che riguardano
gli argomenti discussi a lezione. Entrambi i testi e le
soluzioni sono disponibili alla
pagina dei temi d'esame.