| Nome |
Cognome |
Matricola |
| Soluzione esame 15/09/2025 | ||
|---|---|---|
| Domanda | Risposta | |
| 1 |
Scrivere le istruzioni C per inserire nella variabile b l'indirizzo della variabile a e nella variabile c il valore della variabie a. Assumendo che gli indirizzi di a, b e c siano 9, 3, e 4 e che il valore di a sia 5, disegnare lo stato della memoria con un diagramma a scaffale. |
Il valore di una variabile è il nome della variabile. L'indirizzo di una variabile è il nome preceduto da il simbolo &. In questo caso: b = &a; c = a; L'indirizzo di a è 9, il suo valore 5. Quindi b si trova all'indirizzo 3 e contiene 9 mentre c si trova all'indirizzo 4 e contiene 5.
|
| 2 |
Convertire il numero esadecimale 11 e il numero decimale -12 in binario, complemento a due a sei bit. Effettuare la somma dei due numeri binari in complemento a due e convertire il risultato in esadecimale. |
I numeri esadecimali si possono convertire cifra per cifra dato che 16 è multiplo di 2: è la sua quarta potenza (16 = 2 × 2 × 2 × 2), quindi ogni cifra esadecimale sono quattro bit. Il numero esadecimale 11 è 00010001 in binario, ossia 010001 a sei bit. Dato che è un numero positivo, non va complementato. La conversione del numero decimale -12 richiede invece le divisioni successive e il complemento. 12 0 6 0 3 1 1 1 → 1100 Le divisioni successive producono i resti dal basso verso l'alto 1100, quindi 001100 a sei bit. Il complemento si ottiene invertendo tutti i bit e sommando uno.
1
110011
1
-------
110100
La somma di due numeri in complemento a due è indipendente dai segni. È una normale somma. 11 010001 110100 --------- 1000101 Si elimina il bit in eccesso e si ottiene 000101. È positivo perché il primo bit è zero, quindi si converte senza complementarlo. Si converte in esadecimale a gruppi di quattro bit: gli ultimi quattro 0101 valgono cinque, i precedenti 00 sono zero. Il risultato in esadecimale è quindi 05, oppure 5. |
| 3 |
Scrivere il codice Python che verifica se ognuno dei nodi di un grafo diretto è collegato ad almeno altri due, non importa il verso dell'arco. Disegnare un esempio di grafo di quattro nodi e quattro archi che soddisfa questa condizione e di uno che non la soddisfa. |
Per ogni nodo, occorre verificare se esistono due altri nodi che sono o successori o predecessori. Si tratta quindi di un ciclo sui nodi del grafo, in cui basta un nodo che non soddisfa la condizione per ritornare False: programma completo.
# verifica se tutti i nodi sono collegati ad almeno altri due
def almenodue(grafo):
for n in grafo.insiemenodi():
conta = 0
for a in grafo.insiemenodi() - set({n}):
if grafo.arco(n, a) or grafo.arco(a, n):
conta = conta + 1
if conta < 2:
return False;
return True;
Un grafo che soddisfa la condizione:
Uno che non la soddisfa:
|
| 4 |
Scrivere l'espressione regolare che collima con le stringhe che iniziano con due, quattro o cinque a seguite da un carattere diverso da a, e il resto della stringa contiene caratteri qualsiasi. |
Si tratta di una successione di tre sottostringhe: le prime a, il singolo carattere diverso, la stringa qualsiasi.
Nel mettere insieme le espressioni occorre tenere anche conto delle precedenze inserendo le opportune parentesi. (aa|aaaa|aaaaa)[^a].* |
| 5 |
Il problema di verificare se un grafo contiene un nodo collegato a tutti gli altri è nella classe di complessità P? È nella classe NP? Spiegare il perché. |
Il problema si risolve in questo modo: per ogni nodo si determina se è collegato a tutti gli altri. È un problema di verificare se esiste qualcosa (un nodo a) che soddisfa una condizione (è collegato a tutti gli altri nodi b). La condizione richiede tempo lineare, dato che si tratta di un ciclo su tutti altri nodi. Quindi il problema è in NP. Dal momento che numero di soluzioni candidate (il nodo a) è lineare nella grandezza dell'input, anche l'intera verifica richiede tempo polinomiale. Quindi il problema è anche in P. |
NOTA: risposte prive di esauriente motivazione (es. i passaggi delle operazioni numeriche) verranno considerate nulle.