Dipartimento di Elettronica, Informazione e Bioingegneria 20133 Milano (Italia) Piazza Leonardo da Vinci, 32 Tel. (+39) 02-2399.3400 Fax (+39) 02-2399.3411 Politecnico di Milano Informatica ed Elementi di Informatica Medica Luglio 28, 2016 Prof. Marco D. Santambrogio Nome: Cognome: #Matricola: Tema A Tema B Tema C Esercizio 1 (20%) Esercizio 2 (35%) Esercizio 3 (45%) Totale Lo studente DEVE selezionare UNO tra i tre temi proposti e svolgere SOLO ed UNICAMENTE gli esercizi del temi selezionato. Il tempo previsto per il completamento della prova (Info) è di 2 ore. La prova è superata con un minimo di 60 punti su 100. Gli orali sono obbligatori nella fascia 55-65. Una insufficienza viene considerata non grave, se non inferiore a 50 punti su 100. E’ possibile portare all’esame libri, appunti, slide, ma questo materiale potrà essere usato se e solo se verrà prima consegnata la prova di Elementi di informatica medica. NON è possibile tenere acceso alcun dispositivo elettronico (e.g. portatile, cellulare, calcolatrice, tablet, etc.). Gli studenti che verranno trovati a copiare, a far copiare, o con dispositivi elettronici accessi verranno automaticamente ESPULSI dalla prova. La visione della prova e gli eventuali orali si terranno alle 2.30pm del 3 Agosto 2016 e il primo Settembre 2016 alle 10am presso la Sala Riunioni del NECST Lab. Tema d’esame A Esercizio 1 Date due matrici di interi definite come segue: #define DM1 14 #define DM2 3 int M1[DM1][DM1]; int M2[DM2][DM2]; Si supponga che M1 e M2 siano state popolate, si scriva in C la funzione che ricevute in ingresso M1 ed M2, restituisce quante volte M2 è contenuta in M1. Valgono anche le sovrapposizioni parziali. Esercizio 2 Siano S1 ed S2 due sequenze di interi di lunghezze note (la lunghezza di S1 è pari a 100, quella di S2 è pari a 10) in cui i singoli valori sono compresi tra 0 e 9. Si scriva una funzione ricorsiva che, data la sequenza S1 ed S2, dica quante volte S2 è contenuta in S1 senza ammettere sovrapposizioni. NOTA: l’esercizio richiede solo la scrittura della funzione ricorsiva. Esercizio 3 Il codice riportato rappresenta il listato di un programma che, data una matrice di dimensione 10x7, chiede all’utente di definirne le effettive dimensione, richiede quindi l’inserimento dei dati e poi ne mostra il contenuto. Si dica, giustificando la risposta, quale è l’output a video di foo se m=n=2. void foo (int*,int,int); int main () { int arr[10][7]={0},i,j,n,m; [… inseriti m ed n coerenti con R e C popola arr] foo(arr,n,m); return 0; } void foo(int *punt,int n,int m) { int i, j; for(i=0;i<n;i++) { printf("\n"); for(j=0;j<m;j++) printf("%d",*(punt+(i*m)+j)); } printf("\n"); } Tema d’esame B NOTA: Quando si richiede una funzione, non è detto che sia necessaria solo ed unicamente una funzione. Potrebbe risultarvi comodo usarne anche altre. Esercizio 1 Si scriva una funzione ricorsiva in C che, date due stringhe, verifica, restituendo 1, 0 altrimenti, che una sia la permutazione della seconda. ESEMPIO1: S1: caab, S2: abac – Output 1 ESEMPIO1: S1: abab, S2: abaa – Output 0 Esercizio 2 Si esamini il seguente codice. float foo(int n1, int n2){ int tmp1=0, tmp2=1, cont; float n3=1, n4; if(n2<0){ n2=-n2; tmp1=1; } for(cont=0;cont<n2;cont++) n3=n3*n1; if(tmp1) n3=1.0/n3; n4=tmp2*n3; return n4; } Si dica chiaramente quale è l’obiettivo della funzione foo. Esercizio 3 Si scriva una funzione ricorsiva in C che ordina un array di interi attraverso il seguente algoritmo: • caso base: un array di 0 o 1 elemento è ordinato • caso induttivo: dividere l'array in 2 metà, ordinarle tramite chiamate ricorsive e poi farne la fusione ordinata Tema d’esame C NOTA: Quando si richiede una funzione, non è detto che sia necessaria solo ed unicamente una funzione. Potrebbe risultarvi comodo usarne anche altre. Esercizio 1 Data una matrice M1 di massimo MxN interi, si permetta all’utente di ridefinire le dimensioni di M1 (RxC), con le necessarie verifiche. Si scriva quindi una funzione in C che, dopo aver fatto inserire gli RxC numeri, ne calcola la trasposta M2 di dimensione CxR. Il prototipo della funzione e’: void trasposta (int *M1, int R, int C, int *M2); Esercizio 2 Si consideri il seguente programma C e si indichi l'effetto della sua esecuzione, motivando adeguatamente la risposta. #include <stdio.h> int main() { float f; int i; f=0.6; for (i=1; i<10; i++) f = f+0.6; printf("\nIl numero 0.6*10 (f: %f) ", f); if (f != 6.0) printf("non "); printf("e' uguale a %f\n", 6.0); return 0; } Esercizio 3 Si scriva una funzione ricorsiva in C che, data una matrice di N dimensioni di un tipo di dato definito da voi, calcola il quantitativo di memoria che deve essere allocato per contenere la matrice.