Fondamenti di Informatica 2 della prova scritta del 21 Dicembre 2007 Esercizio 1 (7 punti) Scrivere una funzione che prende in ingresso un array di numeri reali A di n elementi ed un array di numeri reali B di m elementi e stampi gli elementi di una matrice M di dimensione n x m calcolata come: coni 0,..., n 1 M i j A i B j con j 0,..., m 1. float *V; int dim; Vettore; void ProdottoVettore(Vettore *VettA, Vettore *VettB) int i, j; for(i=0; i< VettA->dim; i++) for(j=0; j< VettB->dim; j++) printf( %f\t, VettA->V[i] * VettB->V[j]); printf( \n ); Esercizio 2 (6 punti) Date le seguenti variabili char nome[20]; char sede[20]; int annofondazione; Editore; Editore E; int annoedizione; Libro; Definite un elenco di elementi di tipo Libro e scrivete la porzione di codice che allochi dinamicamente la memoria per l'elenco e stampi a video tutti i libri (E e annoedizione) tali che l anno di edizione sia precedente al 1999. Libro *L; Fondamenti di Informatica 2 Prova Scritta del 21 Dicembre 2007 1
ElencoLibri; int N; ElencoLibri el; el.l = (Libro*)malloc(el.N * sizeof(libro)); int i; for(i=0; i<el.n; i++) if(el.l[i].annoedizione < 1999) printf( %s\t%s\t%d\t%d\n,el.l[i].e.nome,el.l[i].e.sede, el.l[i].e.annofondazione,el.l[i].annoedizione); Esercizio 3 (7 punti) Definite una struttura dati per rappresentare un elenco di dischi prodotti da una casa discografica, dove ciascun disco è rappresentato da un codice identificativo, un nome, un anno di produzione ed il nome d arte del cantante. Definite inoltre una struttura dati che rappresenti un elenco di cantanti sotto contratto con quella casa discografica, dove per ciascun cantante si riporta solo il nome d arte. (4 punti) Scrivete una funzione che abbia in ingresso due parametri: l elenco di dischi e dei cantanti come definiti sopra. La funzione deve stampare sul monitor l'elenco dei nomi dei dischi prodotti dai cantanti. (3 punti) stringa codice; stringa nome; stringa nomecantante; Disco; Disco D[100]; int numdischi; ElencoDischi; stringa nomecantante[100]; int numcantanti; ElencoCantanti; void trovadisco(elencodischi *eldis, ElencoCantanti *elcan) int i, j; for(i=0; i<elcan->numcantanti; i++) Fondamenti di Informatica 2 Prova Scritta del 21 Dicembre 2007 2
for(j=0; j<eldis->numdischi; j++) if(strcmp(eldis->d[j].nomecantante, elcan->nomecantante[i])==0) printf( %s\n eldis->d[j].nome); Esercizio 4 (5 punti) Dire quale operazione è implementata dalla funzione mistero motivando adeguatamente la risposta. void mistero(float *A, int N) float y = A[0]; float x = A[0]; for(i=1; i<n; i++) if(y<a[i]) y = A[i]; if(x>a[i]) x = A[i]; for(i=0; i<n; i++) A[i] /= (y x)/2; La funzione mistero trova il valore massimo e minimo dell array A e lo memorizza nelle variabili rispettivamente y ed x. Successivamente aggiorna l array A dividendo ciascun elemento per la media del valore massimo e minimo di A. Esercizio 5 (7 punti) Data la seguente struttura dati: stringa marca; stringa modello; float prezzo; Moto; Si consideri un file di testo che contenga dei dati relativi ad un elenco di moto. Per ciascuna moto, in ogni riga, sono riportati nell ordine: Marca, Modello, Anno di produzione e Prezzo. Scrivere un programma che legga tutto il file, conti le sue righe e memorizzi i dati in una variabile che rappresenta l Elenco di moto (definire la struttura dati Fondamenti di Informatica 2 Prova Scritta del 21 Dicembre 2007 3
appropriata). L'allocazione della memoria può essere fatta in modo statico o in modo dinamico. (L esercizio vale 8 punti se il nome del file lo passate come parametro sulla linea di comando) #include<stdio.h> #include<stdlib.h> stringa marca; stringa modello; float prezzo; Moto; Moto *M; int nummoto; Elenco; /* Allocazione statica***** * * Moto M[100]; * int nummoto; * Elenco; *************************/ main(int argc, char **argv) Elenco E; FILE *fp; int i; int count = 0; char s[1025]; fp = fopen(argv[1], r ); if(fp!=null) while(fgets(s,1025,fp)!= NULL) count++; else printf( \nimpossibile aprire il file ); fclose(fp); // Questa riga non va scritta in caso di allocazione statica E.M = (Moto*)malloc(count*sizeof(Moto)); Fondamenti di Informatica 2 Prova Scritta del 21 Dicembre 2007 4
fp = fopen(argv[1], r );//si poteva usare anche rewind(fp); if(fp!=null) // if(count < 100)//In caso di allocazione statica for(i=0; i<count; i++) fscanf(fp, %s, E.M[i].marca); fscanf(fp, %s, E.M[i].modello); fscanf(fp, %d, &E.M[i].annoProduzione); fscanf(fp, %f, &E.M[i].prezzo); // // else // printf( Il file è troppo grande! ); // else printf("\nimpossibile aprire il file"); fclose(fp); Fondamenti di Informatica 2 Prova Scritta del 21 Dicembre 2007 5