compito-12-07

Transcript

compito-12-07
Compito di Programmazione
12/07/12
Lo studente ha 3 ore per completare tutti gli esercizi, il voto complessivo varia in [0,16] a cui andranno
aggiunti 8+8 punti per il progetto + orale. Per tutti gli esercizi anche se non indicato lo studente può
strutturare il codice suddividendolo in funzioni che può riutilizzare ovunque nel compito.
1. Sia Q ∈ Rn×n formata dalle colonne [q0 , . . . , qn−1 ]. La matrice si dice ortonormale se tutti i vettori
colonna sono unitari, e sono q
a due a due ortogonali. Quindi: ∀i ∈ [0, n) ||qi || = 1 ∧ ∀j ∈ [0, n), i 6=
j, (qi , qj ) = 0. Dove ||x|| =
scalare.
Pn−1 2
Pn−1
i=0 xi è l’usuale norma euclidea e (v, w) =
i=0 xi yi è il prodotto
Scrivere in C, le seguenti funzioni/predicati:
• dot(Q,i,j,n) che calcola il prodotto scalare tra le colonne i e j di Q.
• isOrtonormale(Q,n) che verifica se la matrice Q è ortonormale. Fare attenzione alla corretta
implementazione del test (qi , qj ) = 0 considerando gli errori dovuti all’approssimazione dei numeri
floating point.
• normalizza(Q,col,n): che normalizza il vettore colonna qcol di Q i.e. qcol = qcol /||qcol ||
Se Q non è ortonormale ma [q0 , . . . , qn−1 ] formano un insieme linearmente indipendente, è possibile
costruire Y ortonormale, dove Y = [y0 , . . . , yn−1 ], e le colonne sono:
y0 =
q0
,
||q0 ||
e
∀ i < n,
t i = qi −
i−1
X
(yj , qi )yj ,
j=1
yi =
ti
||ti ||
• Scrivere una funzione GramSchmidt che ortonormalizza Q.
2. Un albero binario Te associato ad un espressione e = (3 + 6) ∗ (4 − 8) ha nelle foglie i valori contenuti
nell’espressione, e nei nodi interni l’operatore da applicare. Quindi Te = ((3, 6, +), (4, 8, −), ∗) dove
ogni tripla è (sinistro,destro,padre).
I calcolatori possono svolgere direttamente solo operazioni aritmetiche tra due operandi. Pertanto per
eseguire l’epressione e bisogna in realtà svolgere le operazioni: t1 = 3 + 6, t2 = 4 − 8, t3 = t1 ∗ t2 .
Scrivere:
• Un tipo di dato albero, che contiene nelle foglie i valori e nei nodi interni le operazioni aritmetiche.
(Descrivere come si fa a rappresentare con un unico tipo di dato entrambi questi valori).
• Una funzione che dato un albero, stampa sul file albero op.txt la sequenza delle operazioni di
base da svolgere (suggerimento: per ogni nodo interno si deve generare un espressione nuova, che
coinvolge i sottoalberi destro e sinistro).
• una funzione che apre il file albero op.txt, prende in input due interi i, j e crea un nuovo file
albero new.txt che contiene le righe di albero op.txt da i a j include.