Fondamenti di Informatica 2 Soluzione della prova scritta del 31 Gennaio 2006 Esercizio 1 (4 punti) Elencare i tipi di dato predefiniti del linguaggio C, precisandone il dominio e le operazioni principali definite su di essi. Esercizio 2 (7 punti) Definire una struttura dati per rappresentare i dati di un Libro. I dati di interesse sono: il nome dell Autore, il Titolo e l anno di pubblicazione (3 punti). Scrivere un programma che prende in ingresso i dati di un libro e li stampa a video con un opportuno messaggio (4 punti). #include <stdio.h> #include <stdlib.h> typedef char Stringa[30]; Stringa Autore ; Stringa Titolo; int Anno; Libro; main() Libro unlibro ; printf("qual e' l Autore del libro? "); gets(unlibro.autore); printf("qual e' il Titolo del libro? "); gets(unlibro.titolo); printf("qual e' l Anno di pubblicazione del libro? "); scanf("%d", &unlibro.anno); printf("autore: %s\ttitolo: %s\tanno: %d\n", unlibro.autore, unlibro.titolo, unlibro.anno); Fondamenti di Informatica 2 Prova Scritta del 31 Gennaio 2006 1
Esercizio 3 (8 punti) Definire una struttura dati per rappresentare un elenco di Libri. (Per la rappresentazione di libro potete usare quella definita nell esercizio precedente). (2 punti) Si supponga che la struttura dati contenga già memorizzato un elenco di libri. Scrivere una funzione che prende in ingresso l elenco di libri e restituisce l indice dell Elenco cui corrisponde il libro meno recente (4 punti) Dire quale modifica deve essere apportata alla funzione precedente affinché restituisca l indice dell Elenco relativo al libro più recente (2 punti). Libro A[100] ; int NumLibri; Elenco; int LibroMenoRecente(Elenco *E) int i,indicemin=0; int min = E->A[0].Anno; for(i=1;i<e->numlibri;i++) if(min > E->A[i].Anno) min = E->A[i].Anno; indicemin = i; return indicemin; La modifica da effettuare è nella condizione dell if: non > ma <. Coerentemente dovrebbe essere modificato il nome della variabile min in max Fondamenti di Informatica 2 Prova Scritta del 31 Gennaio 2006 2
Esercizio 4 (4 punti) Dire quale operazione è implementata dalla funzione mistero. #define DIM 100 int leggidati(char *nomefile) FILE *fp int i=0; int m=1; int *A; fp = fopen(nomefile r ); A = (int *)malloc(dim * sizeof(int)); while(!feof(fp)) if(i >= m*dim) m++; A = mistero(a,m); fscanf(fp, %d,&a[i]); i++; return i; int * mistero(int *A, int m) int i; int *B; B = (int *)malloc(m*dim*sizeof(int)); for(i=0;i<(m-1)*dim;i++) B[i] = A[i]; free(a); return B; Soluzione La funzione mistero incrementa lo spazio di memoria allocato al vettore A, nel caso in cui la sua dimensione non sia sufficiente a memorizzare i dati presenti nel file. Inizialmente la funzione leggidati alloca spazio per il vettore A pari a DIM. Se i dati da memorizzare fossero in numero maggiore, la funzione mistero alloca spazio in un nuovo array pari alla dimensione corrente di A aumentata di DIM (la variabile m memorizza la dimensione dell array A in termini di multiplo di DIM). Successivamente copia il contenuto di A nel nuovo array e restituisce il puntatore di quest ultimo alla funzione leggidati, dopo aver liberato la memoria originariamente assegnata ad A. NOTA: l operazione svolta dalla funzione mistero è implementata dalla funzione di libreria realloc Fondamenti di Informatica 2 Prova Scritta del 31 Gennaio 2006 3
Esercizio 5 (6 punti) Si consideri una matrice di interi memorizzata in una variabile di tipo int righe colonne; int **A; Matrice; e un vettore di interi memorizzato in una variabile di tipo int dimensione; int *A; Vettore; Scrivere una funzione che calcoli il prodotto matrice-vettore restituendo il risultato in una variabile di tipo Vettore. La funzione, prima di eseguire il prodotto, deve verificare che matrice e vettore siano compatibili. Nel caso in cui non siano compatibili, la funzione restituisce una variabile Vettore i cui campi valgono rispettivamente 0 e NULL. Il prototipo della funzione è Vettore Prodotto(Matrice *M, Vettore *V); Allocare dinamicamente la memoria per il risultato. Soluzione Vettore Prodotto(Matrice *M, Vettore *V) int i,j; Vettore Ris; if(m->colonne!= V->dimensione) Ris.dimensione=0; Ris.A = NULL; return Ris; Ris.A = (int *)malloc(m->righe * sizeof(int)); Ris.dimensione = M->righe; for(i=0; i < M->righe; i++) Ris.A[i] = 0; for(j=0;j< M-> colonne;j++) Ris.A[i]+= M->A[i][j]*V->A[j]; return Ris; Fondamenti di Informatica 2 Prova Scritta del 31 Gennaio 2006 4
Esercizio 6 (4 punti) Di seguito si riporta la funzione partition dell algoritmo di ordinamento quicksort. Questa funzione è relativa all ordinamento di un array di int. int partition (int* A, int l, int r) int pivot = A[l], i=l-1, j=r+1; int temp; for (; ;) do j--; while (A[j]>pivot); do i++; while (A[i]<pivot); if (i<j) temp=a[i]; A[i]=A[j]; A[j]=temp; else return j; Modificare opportunamente la funzione in modo tale che ordini in senso crescente un array di stringhe di caratteri. Usare la funzione di libreria strcmp per confrontare le stringhe e la funzione strcpy per copiare le stringhe. (Suggerimento: usare la variabile pivot per memorizzare l indice dell array di stringhe che contiene l elemento pivot) int partition (char** A, int l, int r) int pivot = l, i=l-1, j=r+1; char temp[50]; for (; ;) do j--; while (strcmp(a[j],a[pivot])>0); do i++; while (strcmp(a[i],a[pivot])<0); if (i<j) strcpy(temp, A[i]); strcpy(a[i],a[j]); strcpy(a[j], temp); else return j; Fondamenti di Informatica 2 Prova Scritta del 31 Gennaio 2006 5