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

First partial exam

Informatica A Cognome ________________________________ Matricola _______________________ Nome ________________________________ Firma _______________________ Istruzioni • Non separate questi fogli. Scrive te la soluzione solo sui fogli d istribuiti , utilizzando il retro delle pagine in caso di necessità . Cancella te le parti di brutta (o ripudiate) con un tratto di penna . • Ogni parte non cancellata a penna sarà considerata parte integrante della sol uzione. • È possibile scrivere a matita (e no n ricalcare al momento della consegna!). • È vietato utilizzare calcolatrici o telefoni . Chi tenti di farlo ved rà annullata la sua prova. • È ammessa la consulta zion e 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: 2 h 30 m Valore degli esercizi, voti parziali e voto finale : Esercizio 1 ( 2 punti ) __________ Esercizio 2 ( 4 punti ) __________ Esercizio 3 ( 4 punti ) __________ Esercizio 4 ( 6 punti ) __________ Esercizio 5 ( 7 punti ) __________ Esercizio 6 ( 4 punti ) __________ Totale: ( 29 punti ) _________ 2 Esercizio 1 - Algebra di Boole, Aritmetica Binaria, C odifica delle Informazioni (2 punti) (a) Si costruisca la tabella di verità della seguente espressione booleana, badando all a precedenz a tra gli operatori logici. (1 punto). ( A or ( B and C ) ) and ( ( A and ( not C ) ) and C ) (b) Si stabi lisca il minimo numero di bit sufficiente a rappresentare in complemento a due i numeri A = 26dec e B = –11 8dec , li si converta , se ne calcolino la somma (A+B) e la differenza (A –B) in complemento a due e si indichi se si genera riporto sulla colonna dei bit più significativi e se si verifica overflow (1 punto). 3 Esercizio 2 ( 4 punti ) Si consideri il seguente schema di base di dati che vuole tenere traccia di alcune attività di una catena di supermercati. SUPERMERCATO (CodiceSM, N ome, Indirizzo, Città, Tel, Responsabile) PRODOTTO (CodiceProdotto, Nome, Produttore, Prezzo) CLIENTE (CF, NumTessera, Nome, Cognome, Indirizzo, Città, Tel) RIGASCONTRINO (NumTessera, CodiceSM, Data, Ora, CodiceProdotto, Quantità) Scrivere in SQL l'interr ogazione che trova nome e cognome dei clienti che non hanno mai fatto la spesa due volte nello stesso giorno. 4 SUPERMERCATO (CodiceSM, Nome, Indirizzo, Città, Tel, Responsabile) PRODOTTO (CodiceProdotto, Nome, Produttore, Prezzo) CLIENTE (CF, NumTessera, Nome, Cognome, Indirizzo, Città, Tel) RIGASCONTRINO (NumTessera, CodiceSM, Data, Ora, CodiceProdotto, Quantità) Scrivere in SQL l'interrogazione che trova codice e nome dei prodotti che sono stati venduti il numero maggiore di volte. 5 Esercizio 3 ( 4 p unti ) Si dica cosa stampa il seguente codice #include #define N 4 int mistero(int a, int b); int main() { int x=0, y; while(xnumeri, k); if (i > k) { tmp = malloc(sizeof(NodoI)); if (tmp == NULL) { // gestione dell'errore return NULL; } tmp ->numero = i; tmp ->next = head; head = tmp; } iteratore = iteratore ->next; } return head; } 7 8 Esercizio 5 ( 7 punti ) Si consideri no due list e concatenat e semplic i di dati , una contenente dati di studenti e una contenente dati di esami . La struttura dell a list e è: typedef struct Date { int giorno; int mese; int anno; } Data; typedef struct Item { int matricola ; char * cognome; char * nome; char * corsoDiStudi ; int numEsamiSuperati; float media; struct Item * next } Studente ; typedef Stud ente * ListaDi Stud enti; typedef struct Node { int matricola ; char * corso; int voto; Data data; struct Node * next; } Esame ; typedef Esame * Lista Di Esami ; La lista di esami è ordinata per data. Si codifichi una funzione che, ricevu ta in ingresso una lista di studenti e una lista di esami, proceda a assegnare i valori corretti ai campi “numEsameSuperati” e “media” degli studenti in base ai dati contenuti nella lista degli esami. void f1(ListaDiStudenti studenti, ListaDiEsami esami) { ListaDiStudenti itStudenti = studenti; ListaDiEsami itEsami; int voto = 0; while (itStudenti != NULL) { itStudenti ->numEsamiSuperati = 0; itEsami = esami; while (itEsami != NULL) { if (itEsami ->matricola = itStudenti ->matricola && itEsami ->voto >= 18) { voto += itEsami ->voto; itStudenti ->numEsamiSuperati += 1; } itEsami = itEsami -> next; } if (itStudenti ->numEsamiSuperati > 0) { itStudenti ->media = voto / itStudenti ->numEsamiSuperati; } itStudenti = itStudenti -> n ext; } } int cerca(int matricola, ListaDiEsami esami) { ListaDiEsami itEsami = esami; while (itEsami != NULL) { if (itEsami ->data.anno > 2003) { return 1; } itEsami = itEsami ->next; } return 0; } 9 10 Si codifichi una funzione che, ricevut a in ingresso una lista di studenti e una lista di esami, proceda a eliminare dalle due liste gli studenti che non hanno superato esami dopo il 31 -12 -2003 . void elimina(int matricola, ListaDiEsami *esami) { ListaDiEsami prev = NULL, itEsami = *esami, tmp ; while (itEsami != NULL) { if (matricola == itEsami ->matricola) { tmp = itEsami; if (prev == NULL) { itEsami = tmp ->next; esami = &itEsami; } else { prev ->next = tmp ->next; itEsami = tmp ->next; } free(tmp); } els e { prev = itEsami; itEsami = itEsami ->next; } } } void f2(ListaDiStudenti *studenti, ListaDiEsami *esami) { ListaDiStudenti itStudenti = *studenti, prev = NULL, tmp; while (itStudenti != NULL) { if (cerca(itStudenti ->matricola, *esami)) { elimina(itStudenti ->matricola, esami); tmp = itStudenti; if (prev == NULL) { itStudenti = tmp ->next; studenti = &itStudenti; } else { prev ->next = tmp ->next; itStudenti = tmp ->next; } free(tmp); } else { prev = i tStudenti; itStudenti = itStudenti ->next; } } } 11 12 Esercizio 6 ( 4 punti ) Si consideri la seguente definizione di un albero binario typedef struct EL { int dato; struct EL * left, right; } node; typedef node * tree; Si scriv a una funzione che prende in ingresso un albero binario e restituisce 1 se è completo (cioè se tutti i nodi o sono foglie o hanno 2 figli e se tutte le foglie sono alla stessa profondità) , 0 altrimenti. int aux(tree t, counter) { int fromLeft; int fromR ight; if (t ->left == NULL && t ->right == NULL) { return counter; } else if ((t ->left == NULL && t ->right != NULL) || (t->left != NULL && t ->right == NULL)) { return -1; } else { fromLeft = aux(t ->left, counter + 1); fromRight = aux (t->right, counter + 1); if (fromLeft != fromRight) { return -1; } else { return fromLeft; } } } int f(tree t) { if (t == NULL) { return 0; } if (aux(t, 0) >= 0) { return 1; } else { return 0; } } 13 14