Vai al contenuto

Esercizi del 08/10/2021⚓︎

Esercizio 1 – Somma di due numeri⚓︎

Dati due numeri interi \(a\) e \(b\), calcolarne la somma. Non è accettabile come soluzione \(a + b\).

Prendiamo, ad esempio, due numeri \(5, 7\). Siamo in grado di sommare questi due numeri utilizzando le dita della mano e il risultato è \(12\). Come è stato ottenuto questo risultato? Incrementando di uno, tante volte il primo numero quante volte è il secondo numero, ovvero \(5 + 1 + \cdots + 1\).

Il problema è stato appena risolto, è ora necessario descriverlo in modo tale che chiunque sia in grado di comprendere le operazioni che sono state appena effettuate, dunque:

Somma, v1
1
2
3
4
5
6
Prendere il valore di a
Prendere il valore di b
Incrementare a di 1
Decrementare b di 1
SE (b > 0) ANDARE a 3
risultato := a

Il precedente è un possibile metodo di risoluzione. È necessario notare che la parola-chiave ANDARE è un termine bandito. Bisogna scrivere questa soluzione in maniera differente.

Cosa accadrebbe nel caso in cui \(a, b \geq 0\)?

Cambiare il valore di \(a\) non fa differenza, ma cambiando il valore di \(b\) la soluzione potrebbe essere errata e quindi la procedura restituirebbe un risultato diverso da quello atteso.

Quindi:

Somma, v2
1
2
3
4
5
6
7
Prendere il valore di a
Prendere il valore di b
SE (b = 0) ANDARE a 7
Incrementare a di 1
Decrementare b di 1
SE (b > 0) ANDARE a 4
risultato := a

Anche questo procedimento non è scritto correttamente dato l'uso di ANDARE.

Cosa succederebbe se \(b < 0\)?

La procedura non restituirebbe alcun risultato.

Ogni vincolo specificato nei dati va sempre controllato e non va mai dato per scontato.

È necessario scrivere una procedura che non contenga alcun salto arbitrario, tenendo sempre conto del fatto che le operazioni vengono eseguite dall'alto verso il basso. Per effettuare dei salti, questi devono essere controllati da delle condizioni specifiche che vedremo in seguito.

Questa soluzione è, per ora, accettabile. Una volta visto come effettuare dei salti in maniera controllata, non lo sarà più.

Esercizio 2 – Conversione da binario a decimale⚓︎

Dato un numero in base binaria \(a_{2}\), convertire lo stesso in base decimale \(a_{10}\). Dunque:

Conversione, v1
Prendere la prima cifra di a2
Moltiplicare questa per 2 elevato alla posizione della cifra

Non è possibile scrivere ANDARE a 1, tantomeno di prendere la penultima cifra poiché la lunghezza del numero non è nota.

È necessario utilizzare un contatore il cui valore venga incrementato di uno dopo ogni iterazione. Poiché non conosciamo la lunghezza del numero, è necessario esplicitare quest'ultima tramite altri mezzi, dunque:

Conversione, v2
1
2
3
4
5
p := 0
Prendere la cifra di a2 in posizione p
Moltiplicare questa per 2^p
Incrementare il valore di p di 1
ANDARE a 2

Nonostante l'utilizzo del contatore p, questa soluzione non è funzionale. Come è possibile capire quando fermarsi? Ovviamente quando terminano le cifre, ma come lo si può determinare? Bisogna inserire un controllo.

Conversione, v3
1
2
3
4
5
p := 0
Prendere la cifra di a2 in posizione p
Moltiplicare questa per 2^p
Incrementare il valore di p di 1
SE (p < C )ANDARE a 2

Dove \(C\) indica la lunghezza di \(a_2\).

Questa procedura rende l'idea di come risolvere il problema, ma non è ancora corretta poiché bisogna sommare le cifre ottenute al risultato finale.

Conversione, v4
1
2
3
4
5
6
p := 0
Prendere la cifra di a2 in posizione p
Moltiplicare questa per 2^p
Sommare questo valore al risultato
Incrementare il valore di p di 1
SE (p < C) ANDARE a 2

Sono spesso necessarie delle informazioni che il problema non fornisce e spetta a chi trova la soluzione individuarle. Ad esempio, se sono presenti delle sequenze di simboli e/o di numeri, è necessario conoscere la lunghezza degli stessi, anche se la traccia non lo esplicita.