Sei sulla pagina 1di 4

Fondamenti di Informatica 18/11/2019

Nome e Cognome Matricola

Domanda 1 (2 punti ). Quali tra le seguenti codifiche per numeri interi consente, a parità di bit, di rappresentare un
intervallo più ampio di valori?
Modulo e segno;
complemento a uno;
complemento a due;
le tre codifiche consentono di rappresentare lo stesso intervallo.

Domanda 2 (2 punti ). Cosa viene memorizzato nell’Instruction Register ?


Il risultato dell’ultima istruzione eseguita;
la codifica, in linguaggio macchina, dell’istruzione da eseguire;
l’indirizzo dell’istruzione da eseguire;
il valore degli operandi dell’istruzione da eseguire.

Domanda 3 (2 punti ). Per una lista concatenata con collegamento singolo, quale operazione di inserimento ha comples-
sità inferiore?
Inserimento in testa;
inserimento in una posizione centrale;
inserimento in coda;
la complessità è la stessa per le tre operazioni elencate.

Domanda 4 (3 punti ). Effetturare le seguenti conversioni tra rappresentazioni binarie in modulo e segno (·)M S e
complemento a due (·)C2 . In tutti i casi si usino esattamente 6 bit.
 
(101101)M S =
C2
 
(010011)M S =
C2
 
= 101101)C2
MS
 
= 001101)C2
MS
Domanda 5 (4 punti ). Progettare una rete logica con ingressi x, y, z che calcoli il risultato F della seguente espressione
booleana:
+ → OR,
· → AN D,
F = (x + z) + x · z + x · y · z,
⊕ → XOR,
x → N OT x.
Prima di procedere con la progettazione della rete, si semplifichi l’espressione in modo che richieda il minor numero
possibile di porte logiche.

Espressione semplificata : F =

Domanda 6 (6 punti ). Si consideri l’array


int a [10] = {0 , 15 , 58 , 54 , 52 , 4 , 79 , 97 , 80 , 38};
determinare l’ordine dei suoi elementi dopo ciascuna delle prime tre iterazioni dell’algoritmo ‘bubblesort’ (ciascuna
iterazione consiste in un’esecuzione del corpo del ciclo più esterno).

(i)

(ii)

(iii)
Domanda 7 (6 punti ). Determinare i valori stampati nel corso dell’esecuzione del programma seguente:
# include < stdio .h >

void f ( int *x , int * y )


{
int t ;
t = *x;
*x = *y;
*y = t;
}

int g ( int u )
{
int v = 2;
f (& u , & v );
v = 2;
f (& u , & v );
return u + v ;
}

int main ()
{
int a = 1;
int b = 3;
int * c ;
c = &a;
f (& b , c );
printf ( " % d % d % d \ n " , a , b , * c ); /* (i) */
a = g ( b );
printf ( " % d % d % d \ n " , a , b , * c ); /* ( ii ) */
return 0;
}

(i)

(ii)
Domanda 8 (7 punti ). Senza fare uso di funzioni di libreria, scrivere una funzione C che, dato un array di numeri interi
con valori tra 1 e 100, restituisca l’ampiezza del più grande intervallo di valori (sempre tra 1 e 100) in cui non compare
nessuno degli elementi.
Ad esempio, nel caso dell’array
int v [9] = {42 , 21 , 87 , 96 , 29 , 73 , 76 , 87 , 50};
la funzione dovrà restituire il valore 22. Infatti l’intervallo 51–72 contiene esattamente 22 elementi, nessuno dei quali
appare in v. Tutti gli altri intervalli vuoti sono più piccoli, inclusi quegli agli estremi, che vanno comunque considerati
(1–20 e 97-100 per l’array di esempio).
L’intestazione della funzione dovrà essere la seguente:
int in te rv al lo_ ma ss im o ( int *v , int n )
{
/* ... */
}
dove n rappresenta il numero di elementi dell’array v.
Dopo aver scritto la funzione, se ne determini la complessità asintotica in tempo nel caso peggiore, espressa come numero
di operazioni sugli elementi di v e in funzione della sua lunghezza.

Note
• Non è consentito l’uso di calcolatrici, appunti o testi di alcun genere;
• alle domande a risposta multipla corrisponde una e una sola risposta esatta;
• le risposte vanno riportate nello spazio predisposto in coda alla rispettive domande;
• oltre a questo documento non verranno ritirati altri fogli.

Potrebbero piacerti anche