CORSO DI LAUREA IN INGEGNERIA ELETTRICA, CHIMICA e MATERIALI Informatica B, C Anno Accademico 2013-2014 Proff. Danilo ARDAGNA, Antonio MIELE Primo appello 14.7.2014 Cognome Nome Matricola Firma Durata: 2h Valutazioni 1 (12) 2 (6) 3 (4) 4 (4) 5 (6) Si ricorda che non è possibile consultare libri o appunti, o utilizzare la calcolatrice. - 1 - punti 12 Si consideri una versione semplificata della battaglia navale in cui le navi possono essere posizionate solo in orizzontale. Il campo di gioco di un singolo giocatore può essere rappresentato tramite un tipo typedef int CampoGioco[10][10]; in cui ogni cella della matrice quadrata assume valore 1 (presenza di una nave) o 0 (mare). Le navi possono essere lunghe da una a cinque celle. Ad esempio, nell istanza della matrice riportata sotto c è un campo di gioco in cui sono presenti 5 navi (per questioni di spazio, il campo è di dimensione 5x5): una nave lunga 4 nella prima riga, una nave lunga 1 nella terza riga, una nave lunga 2 e una lunga 1 nella quarta riga e una nave lunga 4 nella quinta riga. 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 0 Si scriva un sottoprogramma analisicampo che ricevuto in ingresso una matrice quadrata di tipo CampoGioco e qualsiasi altro parametro ritenuto necessario svolga, nell ordine, le seguenti attività: visualizzi per ogni riga, il numero di navi presenti e la loro lunghezza; visualizzi il numero di navi complessivamente presenti; visualizzi, per ogni lunghezza di nave trovata il numero di navi di tale lunghezza. Con riferimento al campo di gioco in questione, il sottoprogramma visualizzerà: Riga 1: 1 nave lunga 4; Riga 3: 1 nave lunga 1; Riga 2: Riga 4: 1 nave lunga 2; 1 nave lunga 1; Riga 5: 1 nave lunga 4; 1
Totale navi: 5 Numero di navi lunghe 1: 2 Numero di navi lunghe 2: 1 Numero di navi lunghe 3: 0 Numero di navi lunghe 4: 2 Numero di navi lunghe 5: 0 2 Soluzione #include<stdio.h> #define MAX_L 5 #define MAX_D 10 typedef int CampoGioco[MAX_D][MAX_D]; void analisicampo(campogioco campo, int dim); void analisicampo(campogioco campo, int dim){ int conteggiotot[max_l], conteggioriga[max_l]; int i, j, l, tot; tot=0; /*inizializzo il conteggio complessivo delle navi*/ for(i=0; i<max_l; i++) conteggiotot[i] = 0; for(i=0; i<dim; i++){ /*scorro tutte le righe*/ /*inizializzo il conteggio delle navi per la riga corrente*/ for(j=0; j<max_l; j++) conteggioriga[j] = 0; /*analizzo la riga corrente*/ l=0; for(j=0; j<dim; j++){ if(campo[i][j]==1) /*incremento la lunghezza della nave corrente*/ l++; if((campo[i][j]==0 j==dim-1) && l>0){ /*abbiamo raggiunto la fine della nave corrente*/ conteggioriga[l-1]++; tot++; l=0; /*riporto le statistiche per la riga corrente ed aggiorno le statistiche complessive*/ printf("riga %d: ",i+1); for(j=0; j<max_l; j++) { if(conteggioriga[j]>0){ conteggiotot[j] = conteggiotot[j] + conteggioriga[j]; printf(" %d nave lunga %d;",conteggioriga[j],j+1); printf("\n"); /*stampo le statistiche complessive*/ printf("totale navi: %d\n",tot); for(l=0; l<max_l; l++) 2
printf("numero di navi lunghe %d: %d\n",l+1,conteggiotot[l]); 3 /*non richiesto dall esercizio*/ void main(){ CampoGioco campo; int i,j; for(i=0; i<max_d; i++){ for(j=0; j<max_d; j++){ scanf("%d",&campo[i][j]); analisicampo(campo,max_d); - 2 - punti 6 Descrivere le attività svolte dal seguente codice Matlab: A = load( dati.txt ) indexes = find(a>2 & A<5) x=-pi:0.1:pi; y = A(indexes(1))*sin(x); plot(x,y) dove dati.txt è un file di testo che contiene su una sola riga il seguente testo 100 2 5 5 20 4 5 2 20 3 3 54 Nella prima riga la funzione load carica nella variabile A un array riga di 12 elementi memorizzato nel file di testo dati.txt. La funzione find della seconda riga restituisce un vettore di indici di A che individuano elementi compresi tra 2 e 5. Nell esempio riportato indexes conterrà gli indici 6, 10 e 11. La terza riga definisce un vettore x contenente una successione di numeri compresi tra π e π, ognuno incrementato rispetto al precedente di una quantità pari a 0.1. La riga quattro calcola il valore del seno per i punti dell array x e lo moltiplica per il valore di A nella posizione 6 (index(1)) cioè 4. Infine plot(x,y) crea un grafico bidimensionale congiungendo mediante segmenti di retta i punti definiti dalle coppie cartesiane (x(i), y(i)). 3
4-3 - punti 4 Indicare l output prodotto a video dal seguente programma C: #include <stdio.h> void main() { int x,y,i; x=1; y=3; printf("i x y\n"); for (i=10; i>=0; i--) { y = y +i%2; if(i%2==0) x=y*2 -i; else if(i%3==0){ y=x+i; x = x + 1; printf("%d %d %d\n",i,x,y); L output a video della printf è: i x y 10-4 3 9-3 5 8 2 5 7 2 6 6 6 6 5 6 7 4 10 7 3 11 13 2 24 13 1 24 14 0 28 14-4 - punti 4 Spiegare per quali motivi nei moderni calcolatori si preferisce utilizzare la rappresentazione in complemento a 2 rispetto a quella in modulo e segno. Stesso hardware per effettuare somme e sottrazioni (aspetto più importante). Inoltre, una sola rappresentazione per lo zero 4
- 5 - punti 6 Dato il seguente schema logico: 5 Cliente (CodiceFiscale, Nome, Cognome, Sesso, DataNascita, Indirizzo) Volo(NumeroVolo, DataVolo, OraPartenza, OraArrivo, CittaPartenza, CittaArrivo) PrenotazioneVolo(CodiceFiscalePasseggero, NumeroVolo, DataVolo, Costo) specificare le chiavi ed i vincoli di integrità referenziale. Formulare inoltre in SQL le seguenti query: a) Indicare nome e cognome dei passeggeri che hanno effettuato almeno un volo con destinazione Barcellona nel 2014 b) Elencare i passeggeri nati nel 1983 residenti a Milano c) Indicare il codice fiscale dei passeggeri che hanno preso voli diretti da Milano Linate a Barcellona il giorno 10/7/2014. Chiavi: Cliente: CodiceFiscale Volo: NumeroVolo, DataVolo PrenotazioneVolo: CodiceFiscalePasseggero, NumeroVolo, DataVolo Vincoli integrità referenziale: CodiceFiscalePasseggero-> CodiceFiscale E tra gli attiibuti (NumeroVolo, DataVolo) di PrenotazioneVolo e la coppia di attributi (NumeroVolo, DataVolo) della relazione Volo a) SELECT Nome, Cognome FROM Cliente, Volo, PrenotazioneVolo WHERE CodiceFiscale= CodiceFiscalePasseggero AND Volo.NumeroVolo= PrenotazioneVolo.NumeroVolo AND Volo.DataVolo = PrenotazioneVolo.DataVolo AND CittaArrivo= Barcellona AND PrenotazioneVolo.DataVolo between 1/1/2014 AND 31/12/2014 b) SELECT * FROM Cliente WHERE DataNascita between 1/1/1983 AND 31/12/1983 AND Indirizzo like %Milano% c) SELECT CodiceFiscalePasseggero FROM Volo, PrenotazioneVolo WHERE Volo.NumeroVolo= PrenotazioneVolo.NumeroVolo AND Volo.DataVolo= PrenotazioneVolo.DataVolo AND CittaPartenza= Milano Linate AND CittaArrivo= Barcellona AND DataVolo=10/7/2014 5