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 su i fogli distribuiti , utilizzando il retro delle pagine in caso di necessità. Cancellate le parti di brutta (o ripudiate) con un tratto di penna . • Ogni parte non cancellata a penna sarà considerata parte integrante della soluzione. • È possibile scrivere a mat ita (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 tent ativo 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 :15m per recupero prima prova + 2h :15m per secon da prova RECUPERO PRIMA PROVA Esercizio 1.1 ( 8 punti ) __________ Esercizio 1.2 ( 6 punti ) __________ SECONDA PROVA Esercizio 2.1 ( 4 punt o ) __________ Esercizio 2.2 ( 7 punti ) __________ Esercizio 2.3 ( 4 punti ) __________ Voto finale: __________ Esercizio 1.1 ( 8 punti ) – RECUP ERO PRIMA PROVA Un archivio di spettacoli teatrali è organizzato nel seguente modo: gli spettacoli sono dispost i in un array e sono ordinat i per codice. Le strutture dati utilizzate sono le seguenti: typedef struct d { int giorno, mese, anno ; } Data ; typed ef struct { char codice[N] , titolo [N] , descrizione[N] ; int costoBiglietto ; Data data; int valido; } Spettacolo ; typedef Spettacolo Spettacoli [1000 0]; 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). Si codifichi in C l a seguent e funzion e: void spettacoli Economici (Spettacoli spe, Spettacoli speEconomici, Dat a oggi ) che riceve l’array spe che contiene tutti gli spettacoli e copia (senza lasciare buchi) nell’array speEconomici gli spettacoli con un costo del biglietto inferiore a 20 euro con data posteriore alla data di oggi (passata come parametro oggi ). Eser cizio 1.2 ( 6 punti ) – RECUPERO PRIMA PROVA Si scriva una funzione che riceve in ingresso un a matrice di interi NxN (con N costante predefinita) e un array di caratteri . Ogni elemento dell ’array contiene solo i caratteri ‘0’, ‘1’ o ‘ \0’ e rappresenta un a stringa che è la codifica binaria di un intero. La funzione restituisce 1 se il numero decimale corrispondente all’intero codificato in binario nell’array è uguale al la media degli interi co ntenuti n ella matrice , 0 altrimenti . Esercizio 2. 1 ( 4 punt i ) SECONDA PROVA Si considerino le tabelle: CATALOGO(ID, Titolo, NumPag, Formato, Data, Durata) CONTIENE(IDCAT,IDPROD, Foto, Descrizione, Sconto) PRODOTTO(ID, Nome, Categoria, CostoListino) Il catalogo descrive delle offerte di vendita con sconti sui pr odotti. Lo sconto è espresso in percentuale. Esprimere in SQL l’interrogazione che estrae il catalogo più recente che offre uno sconto di almeno il 50% relativo al prodotto “Photoshop”. Create view p5d Select CA.id, Ca.Data From prodotto P join contiene C on P.id=C.idProd join catalogo CA on CA.id=C.idCat Where Nome=”Photoshop” and sconto>=50 Select * From p5d Where data=Select max(data) From p5d Esprimere in SQL l’interrogazione che estrae i cataloghi che non contengono prodotti il cui costo scontato è inferiore a 1000 Euro. Create view v Select idcat,costoListino*(1 -sconto /100 ) From prodotto P join contiene C on id=idprod Where costoListino*(1 -sconto /100 )titolo)==0) { if(p== -1) { p=spettacoli ->costoBiglietto; } else if(p > spettacoli ->cos toBiglietto) p = spettacoli ->costoBiglietto; } Spettacoli=spettacoli ->next; } return p; } Si codifichi in C l a seguent e funzion e: Lista Spettacoli elimina Spettacoli Vecchi (Lista Spettacoli spettacoli , Data oggi) che elimina gli spettacoli precedenti rispetto alla data passata nel parametro oggi [4 punti] . ListaSpettacoli eliminaSpettacoliVecchi(ListaSpettacoli spettacoli, Data oggi) { ListaSpettacoli spe=spettacoli; while(spe!=NULL) { if (sv(spe,oggi)== 1) spettacoli=cancella( spettacoli ,spe -> codice); spe=spe ->next; } Return spettacoli; } ListaSpettacoli Cancella (ListaSpettacoli lista, char * codice) { ListaDiElem puntTemp; if( lista!=NULL ) if( strcmp(lista –>codice,codice)==0 ) { puntTemp = lista –>prox; free( lista ); re turn puntTemp; } else lista –>prox = Cancella ( lista –>prox, elem ); return lista; } int sv(spettacolo * spe, Data oggi) { if(compara(spe ->data,oggi)== -1) return 1; else return 0; } Int compara(Data d1,data d2) { If(d1.anno>d2.anno) return 1; else If(d1.anno==d2.anno && d1.mese>d2.mese) return 1; else If(d1.anno==d2.anno && d1.mese==d2.mese && d1.giorno>d2.giorno) return 1; else If(d1.anno==d2.anno && d1.mese==d2.mese && d1.giorno==d2.giorno) return 0; else return -1; } Esercizio 2.3 ( 4 punti ) – SECONDA PROVA Si consideri la seguente definizione di un albero binario: typedef struct EL { int dato; struct EL * lef t, * right; } node; typedef node * tree; Implementare una funzione che, ricevuti in ingresso due alberi binari TA e TB, restituisce 1 se TA contiene un in un nodo un valore uguale alla somma di tutti i nodi foglia di T B e se TB contiene un in un nodo un v alore uguale alla somma di tutti i nodi interni di T A. È consigliato implementare funzioni di supporto. int sommaF(tree T) { if(T==NULL) return 0; if(T ->left==NULL && T ->right==NULL) return T ->dato; return sommaF(T ->left) + sommaF(T ->right); } int sommaI(tree T) { if(T==NULL) return 0; if(T ->left==NULL && T ->right==NULL) return 0; return T ->dato+sommaF(T ->left) + sommaF(T ->right); } Int esiste(tree T,int num){ If(T==NULL) Return 0; If(T ->dato==num) Return 1; Return esiste(T ->left,num ) || esiste(T ->right,num) ; } Int f(tree TA,tree TB){ Return esiste(TA,sommaF(TB)) && esiste(TB,sommaI(TA)); }