Fondamenti di Informatica 2
Transcript
Fondamenti di Informatica 2
Fondamenti di Informatica 2 Soluzione della prova scritta del 25 Marzo 2005 Esercizio 1 (2 punti) Convertire in formato binario, ed esadecimale il numero 372. Mostrare il procedimento usato per ottenere il risultato. Soluzione 372 mod 2 = 0 186 mod 2 = 0 93 mod 2 = 1 46 mod 2 = 0 23 mod 2 = 1 11 mod 2 = 1 5 mod 2 = 1 2 mod 2 = 0 1 mod 2 = 1 (317)10 = (101110100)2 = (174)16 Esercizio 2 (2 punti) Illustrare in modo chiaro e sintetico le funzioni svolte dai diversi componenti dell’architettura di Von Neumann. Appunti del corso Esercizio 3 (9 punti) 1. Si consideri il seguente frammento di codice: char stringa[]=”Schermata di avvio”; char *P = stringa; for(;*P;P++) if(*P > ‘a’ && *P < ‘z’] *P -= ‘a’ – ‘A’; printf(“%s”, stringa); dire quale output viene prodotto dall’istruzione di stampa, motivando la risposta. (3 punti) 2. Dato il seguente frammento di codice int A[4]; A[0] = 7; A[1] = A[0]/2; A[2] = A[1]/2; A[3] = A[2]/2; riscriverlo utilizzando uno dei costrutti iterativi messi a disposizione dal linguaggio C. (3 punti) 3. Quale è il valore finale della variabile p al termine dell’esecuzione del seguente frammento di codice? Motivare la risposta. (3 punti) int p=0; int i; int A[]={2,3;4}; int B[]={-1,5,-3} for(i=0;i<3;i++) p+=A[i]*B[i]; Soluzione 1. Il codice cambia le lettere minuscole in maiuscole della stringa contenuta nella variabile stringa. L’istruzione di stampa produce l’output SCHERMATA DI AVVIO. 2. int i; for(i=1,A[0]=7;i<4;i++) A[i]= A[i-1]/2; 3. Il codice calcola il prodotto scalare dei due vettori A e B e memorizza il risultato nella variabile p. Il risultato è pari a 1. Fondamenti di Informatica 2 Prova Scritta del 25 Marzo 2005 1 Esercizio 4 (5 punti) Dire quale operazione è implementata dal seguente codice C (3 punti). In particolare, spiegare l’operazione implementata dalla funzione mistero (2 punti). #include <stdio.h> #include <string.h> int mistero(char *s); int main(int argc, char *argv[]) { int i,c; FILE *fp; char parola[50]; fp=fopen(argv[1],”r”); c = mistero(argv[2]); for(i=0;i<c;i++) { fscanf(fp,”%s”,parola); printf(“%s ”, parola); } int mistero(char *s) { int i,n; for(i=0,n=0;s[i] >= ‘0’ && s[i] <= ‘9’;i++) n = 10 * n + s[i] – ‘0’; return n; } Soluzione La funzione accetta sulla linea di comando due parametri interpretati come segue: il primo deve contenere il nome del file da cui leggere un elenco di stringhe, mentre il secondo contiene il numero di stringhe da leggere. Dal momento che i parametri passati sulla linea di comando vengono memorizzati come stringhe, la funzione mistero converte un numero memorizzato come stringa in un valore di tipo intero. Per far questo, ciascuna cifra è convertita ad intero sottraendo al codice ASCII della cifra il codice ASCII della cifra ‘0’. Per ogni ulteriore cifra, si moltiplica il risultato precedente per 10 (infatti esaminando una stringa da sinistra verso destra, si incontrano per prime le cifre più significative). Fondamenti di Informatica 2 Prova Scritta del 25 Marzo 2005 2 Esercizio 5 (5 punti) Si consideri un file di dati che contiene un elenco di valori di temperature relativi ad un intervallo di tempo pari ad un’ora. Le temperature vengono rilevate ogni minuto. Il file contiene una intestazione contenente il GIORNO MESE ANNO ORA MINUTI relativi all’inizio dell’intervallo di misurazione, seguito dai valori misurati. 1. Definire una struttura timestamp che contenga le informazioni relative a data e ora (2 punti); 2. Definire una struttura VariazioniTemperatura che contenga due campi, uno per memorizzare valori di temperatura, l’altro per memorizzare un intervallo di tempo espresso in minuti (1 punto); 3. Definire una struttura AndamentoTemperatura che contenga 4 campi così definiti: un campo per memorizzare data e ora di inizio misurazione, un campo per memorizzare la temperatura iniziale, un campo per memorizzare l’elenco delle variazioni di temperatura con associato il tempo trascorso dall’ultima variazione, ed un campo per memorizzare il numero di variazioni di temperatura memorizzate nell’elenco di cui al campo precedente. (2 punti) Soluzione typedef struct { int giorno; int mese; int anno; int ora; int minuti; } timestamp; typedef struct { float Variazione; int intervallo; }VariazioniTemperatura; typedef struct { timestamp data; float TemperaturaIniziale; VariazioniTemperatura *VarTemp; int dim; } AndamentoTemperatura; Fondamenti di Informatica 2 Prova Scritta del 25 Marzo 2005 3 Esercizio 6 (7 punti) Con riferimento all’esercizio precedente, scrivere una funzione che legge il file e memorizza i dati in una variabile del tipo definito al punto 3. La funzione ha come prototipo void leggi(AndamentoTemperatura *A, char *NomeFile); La funzione legge il file e memorizza l’elenco di temperature in un array temporaneo. Durante la lettura dei valori memorizza il numero di volte in cui c’è una variazione di temperatura rispetto alla temperatura precedente. Questo valore deve essere utilizzato per allocare dinamicamente la memoria per il terzo campo della struttura AndamentoTemperatura. Successivamente, si calcolano le variazioni di temperatura e il relativo intervallo temporale rispetto all’ultima variazione e si inseriscono nella variabile A void leggi(AndamentoTemperatura *A, char *NomeFile); { FILE *fp; int i,m; int n; int indice; float temp[60]; fp=fopen(NomeFile,”r”); fscanf(fp,”%d”,&A->data.giorno); fscanf(fp,”%d”,&A->data.mese); fscanf(fp,”%d”,&A->data.anno); fscanf(fp,”%d”,&A->data.ora); fscanf(fp,”%d”,&A->data.minuti); fscanf(fp,”%f”,&temp{0}); A->TemperaturaIniziale = temp[0]; for(i=1,n=0;i<60;i++) { fscanf(fp,”%f”,&temp{i}); if(temp[i] != temp [i-1]) n++; } fclose(fp); A->dim = n; A->VarTemp = (VariazioniTemperatura *)malloc(n*sizeof(Variazionitemperatura); for(i=1,m=0,indice=0;i<60;i++) if(temp[i] != temp [indice]) { A->VarTemp[m].Variazione = temp[i] – temp[indice]; A->VarTemp[m].Intervallo = i – indice; indice = i; m++ } } Fondamenti di Informatica 2 Prova Scritta del 25 Marzo 2005 4 Esercizio 7 (3 punti) Illustrare sinteticamente le principali differenze fra gli algoritmi di ordinamento select-sort, bubble-sort, merge-sort e quick-sort dal punto di vista dell’efficienza. Fondamenti di Informatica 2 Prova Scritta del 25 Marzo 2005 5