Nome
                       
Cognome
                       
Matricola
          
Soluzione esame 15/09/2025
DomandaRisposta
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.

  +-----+
  |     | 0
  +-----+
  |     | 1
  +-----+
  |     | 2
  +-----+
b |  9  | 3
  +-----+
c |  5  | 4
  +-----+
  |     | 5
  +-----+
  |     | 6
  +-----+
  |     | 7
  +-----+
  |     | 8
  +-----+
a |  5  | 9
  +-----+
  |     |

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:

1 ---> 2
|      ^
|      |
v      |
3 ---> 4

Uno che non la soddisfa:

1 ---> 2
|    ^ ^
|   /  |
v /    |
3      4

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.

  • Le prime tre a possono essere due, quattro e cinque, quindi è una scelta: aa|aaaa|aaaaa.
  • Il singolo carattere diverso da a è [^a].
  • 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.