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.