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