logo
  • userLoginStatus

Welcome

Our website is made possible by displaying online advertisements to our visitors.
Please disable your ad blocker to continue.

Current View

Mathematical Engineering - Informatica A

Second partial exam

Informatica A – Seconda Prova in Itinere Cognome ________________________________ Matricola _______________________ Nome ________________________________ _______ Istruzioni Non separate questi fogli. Scrivete la soluzione solo sui fogli distribuiti , utilizzando il retro delle pagine in caso di necessità. Cancellate le parti di brutta (o ripudiate) con un tra tto di penna . Ogni parte non cancellata a penna sarà considerata parte integrante della soluzione. È possibile scrivere a matita (e non ricalcare al momento della consegna!). È vietato utilizzare calcolatrici o telefoni . Chi tenti di farlo vedrà annullata la sua prova. È ammessa la consultazione di libri e appunti , purché con pacata discrezione e senza disturbare. Qualsiasi tentativo di comunicare con altri studenti comporta l’espulsione dall’aula. È possibile ritirarsi senza penalità . Non è possibile lasciare l’aula conservando il tema della prova in corso. Tempo a disposizione: 1h: 00 m per recupero prima prova 2h:15 m per seconda prova RECUPERO PRIMA PROVA Esercizio 1.1 ( 7 punti ) __________ Esercizio 1.2 ( 7 punti ) __________ SECONDA PROVA Esercizio 2.1 ( 4 punti ) __________ Esercizio 2.2 ( 4 punt i ) __________ Esercizio 2.3 ( 7 punti ) __________ Esercizio 2.4 ( 4 punti ) __________ Voto finale: __________ 2 Esercizio 1.1 ( 7 punti ) – RECUPERO PRIMA PROVA In un festival della birra si susseguono degustazioni di birre artigianali. Le strutture dati utilizzate sono le seguenti: #define N 100 typedef struct { int giorno, mese, anno; } Data; typedef struct { char nome[N]; //si suppone essere diverso per ogni bir ra int gradoAlcolico ; char descrizione[N] ; int valido; } Birra; typedef struct { char nome[N]; Data data; Birra Degustate[N] ; int valido; } Degustazione ; typedef Degustazione Degustazion i[N]; Il campo “valido” serve a dire se la casella dell’array contiene contenuto valido (nel caso l’attributo ha valore 1) o è da considerarsi vuota (nel caso l’attributo ha valore 0). Non necessariamente le caselle valide sono tutte contigue. Si codifichi in C la seguente funzione: void f(Degustazioni D , Degustazioni ECCESSIVE , int limite ) che riceve un array D di degustazioni, un array ECCESSIVE di degustazioni inizialmente vuoto e un intero limite che rappresenta un tasso alcolico limite. La funzione deve copiare le degustazioni del mese di gennaio 2016 che prevedevano (almeno) una birra con tasso alcolico sup eriore al limite ammesso nell’array ECCESSIVE (riempiendo l’array dall’inizio e senza lasciare buchi) e deve eliminarle da D. 4 Esercizio 1.2 ( 8 punti ) – RECUPERO PRIMA PROVA Operando con le matrici spesso è necessario “comprimere” matrici grandi in mat rici più piccole che contengono in ogni casella un valore ottenuto come media aritmetica dei valori di più caselle della matrice di partenza. Si scriva una fun zione f che riceve in input una matrice quadrata M1 con N righe e N colonne e una matrice quadrat a M2 con N/2 righe e N/2 colonne. void f(int M1[][N], int M2[][N/2] ) La matrice deve comprimere M1 in M2 inserendo in ogni casella di M2 la media (troncata) di 4 caselle adiacenti di M 1 come nell’esempio: 2 3 7 3 1 2 6 5 1 9 3 5 7 6 4 7 1 1 7 9 4 1 1 1 9 5 2 4 6 7 5 8 7 6 1 4 diventa (2+3+6+5)/4 (7+3+1+9)/4 (1+2+3+5)/4 (7+6+7+9)/4 (4+7+4+1)/4 (1+1+1+1)/4 (9+5+5+8)/4 (2+4+7+6)/4 (6+7+1+4)/4 quindi 4 5 2 7 4 1 6 4 4 6 Esercizio 2.1 ( 4 punti ) SECONDA PROVA Si dica cosa stampa il seguente codice #include #include #include int f( char * x, char * y, int k ) { if( !k ) printf(" & "); else { printf("%c", y[k%2]); k = f( x, y, k -1 ); printf("%c", y[k%2]); k++; } return k; } int main() { int i = 3; char inutile; char x[] = "CI", y[] = "MO"; i++; printf("%c", x[i%2]); i = f( x, y, i -1 ); fflush(stdin); scanf("%c",&inutile); return 0; } Esercizio 2. 2 ( 4 punti ) SECONDA PROVA Il seguente schema descrive i dati di degustazioni di birre BIRRA ( Nome , Descrizione , GradoAlcolico ) DEGUSTAZIONE ( Nome , Data, Luogo ) ASSAGGI (NomeDegustazione , NomeBirra , Quantità ) Estrarre in SQL le degustazion i in cui si assaggiano più di 5 birre. SELECT NomeDegustazione FROM Assaggi GROUP BY NomeDegustazione HAVING count(*)>5 8 BIRRA ( Nome , Descrizione , GradoAlcolico ) DEGUSTAZIONE ( Nome , Data, Luogo ) ASSAGGI (NomeDegustazione , NomeBirra , Quantità ) Estrarre in SQL la degustazione col più alto tasso alcolico medio delle birre degustate. SELECT NomeDegustazione, avg(GradoAlcolico) FROM Assaggi JOIN Birra ON NomeBirra=Nome GROUP BY NomeDegustazione HAVING avg(GradoAlcolico) >= ALL SELECT avg(GradoAlcolico) FROM Assaggi JOIN Birra ON NomeBirra=Nome GROUP BY NomeDegustazione Esercizio 2. 3 ( 7 punti ) SECONDA PROVA #define N 100 typedef struct { int giorno, mese, anno; } Data; typedef struct BEL { char nome[N]; //si suppone essere diverso per ogni birra int gradoAlcolico ; char descrizione[N] ; struct BEL * next ; } Birra; typedef struct DEL { char nome[N]; Data data; Birra * Birre ; struct DEL * next ; } Degustazione ; typedef Degustazione * Degustazion i; Si codifichi in C la seguente funzione: Degustazioni f(Degustazioni * D, int limite ) che riceve una lista D di degustazioni (si noti che è passato il puntatore al puntatore al primo elemento) e un intero limite che rappresenta un tasso alcolico limite. La funzione restituisce la lista delle degustazioni del mese di gennaio 2016 che prevedevano (almeno) una birr a con tasso alcolico superiore al limite ammesso e elimina queste degustazioni da D. Degustazioni f(Degustazioni * D, int limite ) { Degustazioni P, temp=*D ,temp2 ; while(temp!=NULL){ if(verificaPericolo(*temp,limite)){ temp2= temp ->next; *D=cancella(*D,*temp); P=insInTesta(P,*temp); temp=temp2; } else temp=temp ->next; } return P; } int verificaPericolo(Degustazione d,int limite){ Birra * temp=d.Birre; while( temp!=NULL) { if(temp ->gradoAlcolico > limite ) return 1 //scorri temp =temp ->next; } return 0; } Degustazioni InsInTesta ( Degustazioni lista , Degustazioni d) { Degustazioni punt; punt = d; punt –>next = lista; return punt; } Degustazioni Cancella ( Degustazioni lista, Degustazione elem ) { 10 Degustazioni puntTemp; if( lista!=NULL) if( strcmp( lista –>info .Nome, elem .Nome) == 0 ) { puntTemp = lista –>prox; return puntTemp; } else lista –>prox = Cancella ( lista –>prox, elem ); return lista; } {} {} 12 Esercizio 2.4 ( 4 punti ) – SECONDA PROVA Si consideri la seguente definizione di un albero binario: typedef struct EL { int dato; struct EL * left, * right; } node; typedef node * tree; Implementare una funzione void f (tree TA, tree TB, tree TRES) che ricev e in ingresso tre alber i binar i con la stessa profondità e di cui uno ( TRES ) completo (cioè ogni nodo fino alle foglie escluse ha esattamente due figli e tutte le foglie hanno la stessa profondità. La funzione inserisce in ogni nodo di TRES la somma degli elementi corrispondenti (nella stessa posizione) di TA e TB se esistono entrambi, il valore del nodo corrispondente di TA se esiste solo il nodo corrispondente di TA , il valore del nodo corrispondente di TB se esiste solo il nodo corris pondente di TB , 0 se non esiste nessuno dei due. void f (tree TA, tree TB, tree TRES) { if(TRES==NULL) return; if(TA!=NULL && TB!=NULL) TRES ->dato=TA ->dato + TB ->dato; f(TA ->left,TB ->left,TRES ->left); f(TA ->righ t,TB ->righ t,TRES ->righ t); else if(TA!=NULL) TRES ->dato=TA ->dato; f(TA ->left, NULL ,TRES ->left); f(TA ->righ t,NULL ,TRES ->righ t); else if(TB!=NULL) TRES ->dato=T B->dato; f(NULL, TB->left ,TRES ->left); f( NULL, TB->righ t,TRES ->righ t); else TRES ->dato=0; f(NULL ,NULL ,TRES ->left); f(NULL ,NULL ,TRES ->righ t); } {}{}{}{}{} 14