Nome
                       
Cognome
                       
Matricola
          
Soluzione esame 27/01/2026
DomandaRisposta
1

Scrivere le dichiarazioni che permettono la compilazione delle seguenti istruzioni senza errori:

a = 1;
b = &a;
c = *b;

Assumendo che le tre variabili a, b e c abbiano indirizzi 9, 4 e 6, disegnare lo stato della memoria al termine dell'esecuzione.

La variabile a contiene un valore intero, quindi si può dichiarare come int a;. La variabile b contiene l'indirizzo di una variabile intera, quindi è int *b;. La variabile c viene assegnata al valore all'indirizzo contenuto in b, e questo valore è ancora un intero: int c;.

int main() {
	int a;
	int *b;
	int c;
	
	a = 1;
	b = &a;
	c = *b;
}

La prima istruzione inserisce il valore 1 nella variabile a. Quindi la posizione di memoria 9 contiene 1. La seconda istruzione inserisce in b questa posizione 9. Quindi nella posizione 4 va il valore 9. Infine, c prende il valore contenuto nella posizione 9 della memoria, quindi 1.

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

2

Convertire il numero esadecimale A e il numero ottale -11 in binario, complemento a due a sei cifre totali. Sommare i due numeri binari e convertire il risultato in decimale.

Le cifre esadecimali sono 0 1 2 3 4 5 6 7 8 9 A B C D E F, quindi A è il valore 10. Dato che dieci è otto più due, in binario è 1010. Essendo un numero positivo, la sua rappresentazione in complemento a due si ottiene aggiungendo a sinistra il numero necessario di zeri: 001010.

Il numero ottale 11 è otto più uno, quindi nove. La sua rappresentazione binaria è 1001, otto più uno. La complementazione è va eseguita dato che il numero da convertire è negativo. Si complementa invertendo tutti i bit e sommando uno, oppure invertendo la cifre da destra partendo dal primo uno escluso.

001001
   |
   | inversione
   V
110110 +
     1
------
110111

La somma di due numeri in complemento a due si effetta come una comune somma di numeri senza segno.

001010 +
110111
------
000001

Il risultato è uno.

3

Dire cos'è un grafo bipartito e un ciclo Hamiltoniano. Mostrare un esempio di grafo bipartito che contiene un ciclo hamiltoniano.

Un grafo è bipartito se i nodi si possono dividere in due gruppi, e ogni nodo è collegato solo a nodi dell'altro gruppo.

Un ciclo Hamiltoniano è un ciclo (un percorso che termina dove inizia) che contiene tutti i nodi del grafo senza ripetizioni, cioè non passa due volte per lo stesso nodo.

Un esempio di grafo bipartito dotato di ciclo Hamiltoniano è il seguente.

1 ----- 3
  \   /
    X
  /   \
2 ----- 4

Il primo gruppo di nodi è composto da 1 e 2, il secondo gruppo è composta da 3 e 4. Il ciclo Hamiltoniano è 13241.

4

Disegnare un automa a stati finiti che accetta esattamente le stringhe collimanti con l'espressione regolare [bc]*a+(b*|c+).

L'espressione regolare collima con stringhe che sono composte di tre parti: una sequenza qualsiasi di lettere bc seguita da una sequenza non vuota di a seguita da una sequenza di b oppure una sequenza non vuota di c.

L'automa si ottiene simulando ogni parte con stati: una sequenza si ottiene con un arco all'indietro, una alternativa con più archi uscenti dallo stesso stato. Le due cose vengono combinate per la sequenza [bc]*, che è una alternativa fra le due lettere ripetuta un numero arbitrario di volte.

                            b
                  -- b --> (2)
> (0) -- a --> (1) 
  bc            a -- c --> (3)
                            c

I due stati a destra sono uguali perché una sequenza vuota di b è uguale a una sequenza vuota di c, quindi (b*|c+) è uguale a (b*|c*).

5

Disegnare l'automa interno della macchina di Turing che accetta solo la stringa composta da una singola a.

La stringa da riconoscere si trova inizialmente sul nastro preceduta e seguita da blank, con la testina sopra il suo primo carattere.

L'automa interno della macchina di Turing ha come ingresso il carattere sotto la testina e come uscite il comando di movimento della testina (destra o sinistra) e il carattere da scrivere.

In questo caso non è necessario scrivere niente. Quello che importa è che il primo carattere deve essere a e lo spostamento a destra deve portare al carattere blank che segna la fine della stringa di ingresso.

     a/D       ␣
> 0 -----> 1 -----> A

Dallo stato iniziale 0 parte un solo arco che viene seguito solo nel caso il primo carattere sia a, e che porta a uno spostamento a destra della testina e a un passaggio allo stato 1. In questo stato la lettura del blank porta allo stato accettante. Il secondo movimento è irrilevante.

NOTA: risposte prive di esauriente motivazione (es. i passaggi delle operazioni numeriche) verranno considerate nulle.