...

Esercizi di Informatica Generale

by user

on
Category: Documents
107

views

Report

Comments

Transcript

Esercizi di Informatica Generale
Esercizi di
Informatica
Generale
Edizione 1 – Gennaio 2010
di
Luca Andrea Ludovico
Insegnamento di Informatica Generale
Scienze e tecnologie per i Beni Culturali
SOMMARIO
SOMMARIO ............................................................................................................. 1 1 | Circuiti digitali sequenziali................................................................................. 6 1.1 | Operatori logici ............................................................................................ 6 1.1.1 | Operatore NOT.................................................................................... 6 1.1.2 | Operatore AND ................................................................................... 7 1.1.3 | Operatore OR ....................................................................................... 8 1.1.4 | Operatore XOR .................................................................................... 9 1.1.5 | Operatore NAND .............................................................................. 10 1.1.6 | Operatore NOR.................................................................................. 11 1.1.7 | Operatore XNOR .............................................................................. 12 1.2 | Equazioni e circuiti.................................................................................... 13 1.2.1 | Esercizio .............................................................................................. 14 1.2.2 | Esercizio .............................................................................................. 15 1.2.3 | Esercizio .............................................................................................. 16 1.3 | Tabelle della verità ..................................................................................... 17 1.3.1 | Esercizio .............................................................................................. 18 1.3.2 | Esercizio .............................................................................................. 19 1.3.3 | Esercizio .............................................................................................. 20 1.4 | Studio di funzioni logiche ........................................................................ 21 1.4.1 | Esercizio .............................................................................................. 22 1.4.2 | Esercizio .............................................................................................. 24 2 | Bit e Byte ........................................................................................................... 26 2.1 | Dimensionamento delle stringhe ............................................................ 27 1
2.1.1 | Esercizio .............................................................................................. 27 2.2 | Calcoli su bit e byte ................................................................................... 28 2.2.1 | Esercizio .............................................................................................. 28 2.2.2 | Esercizio .............................................................................................. 29 2.2.3 | Esercizio .............................................................................................. 30 2.2.4 | Esercizio .............................................................................................. 31 3 | Memorie di massa............................................................................................. 32 3.1 | Prestazioni delle unità disco ..................................................................... 32 3.1.1 | Esercizio .............................................................................................. 32 3.1.2 | Esercizio .............................................................................................. 34 3.1.3 | Esercizio .............................................................................................. 35 3.1.4 | Esercizio*............................................................................................. 36 3.2 | Capacità dei dischi magnetici ................................................................... 38 3.2.1 | Esercizio .............................................................................................. 39 3.2.2 | Esercizio .............................................................................................. 40 4 | Rappresentazione dei numeri ......................................................................... 41 4.1 | Conversioni da base n a base 10 .............................................................. 41 4.1.1 | Esercizio .............................................................................................. 42 4.1.2 | Esercizio .............................................................................................. 43 4.1.3 | Esercizio .............................................................................................. 44 4.1.4 | Esercizio*............................................................................................. 45 4.1.5 | Esercizio .............................................................................................. 46 4.2 | Conversioni da base 10 a base n .............................................................. 47 4.2.1 | Esercizio .............................................................................................. 48 4.2.2 | Esercizio .............................................................................................. 49 4.2.3 | Esercizio .............................................................................................. 50 2
4.2.4 | Esercizio .............................................................................................. 52 4.2.5 | Esercizio .............................................................................................. 53 4.3 | Conversioni da base m a base n ............................................................... 55 4.3.1 | Esercizio .............................................................................................. 56 4.3.2 | Esercizio .............................................................................................. 57 4.3.3 | Esercizio .............................................................................................. 58 4.3.4 | Esercizio .............................................................................................. 59 4.3.5 | Esercizio .............................................................................................. 60 4.3.6 | Esercizio*............................................................................................. 61 4.4 | Operazioni aritmetiche ............................................................................. 62 4.4.1 | Esercizio .............................................................................................. 63 4.4.2 | Esercizio .............................................................................................. 65 4.4.3 | Esercizio .............................................................................................. 67 4.4.4 | Esercizio .............................................................................................. 70 4.5 | Numeri negativi ......................................................................................... 72 4.5.1 | Esercizio .............................................................................................. 73 4.5.2 | Esercizio .............................................................................................. 74 4.5.3 | Esercizio .............................................................................................. 75 4.5.4 | Esercizio .............................................................................................. 77 4.6 | Somme in complemento a 2 .................................................................... 79 4.6.1 | Esercizio .............................................................................................. 80 4.6.2 | Esercizio .............................................................................................. 82 5 | Extensible markup language ........................................................................... 83 5.1 | Correttezza della forma ............................................................................ 83 5.1.1 | Esercizio .............................................................................................. 83 5.1.2 | Esercizio .............................................................................................. 84 3
5.1.3 | Esercizio .............................................................................................. 85 5.1.4 | Esercizio .............................................................................................. 86 5.1.5 | Esercizio .............................................................................................. 87 5.2 | Documenti XML ....................................................................................... 88 5.2.1 | Esercizio .............................................................................................. 88 5.2.2 | Esercizio .............................................................................................. 89 5.2.3 | Esercizio .............................................................................................. 90 5.3 | Interpretazione di DTD ........................................................................... 91 5.3.1 | Esercizio .............................................................................................. 92 5.3.2 | Esercizio .............................................................................................. 93 5.3.3 | Esercizio .............................................................................................. 94 5.3.4 | Esercizio .............................................................................................. 95 5.3.5 | Esercizio .............................................................................................. 97 5.4 | Formulazione di DTD .............................................................................. 99 5.4.1 | Esercizio ............................................................................................100 5.4.2 | Esercizio ............................................................................................101 5.4.3 | Esercizio ............................................................................................102 5.4.4 | Esercizio ............................................................................................103 6 | Gestione degli errori ......................................................................................104 6.1 | Rilevamento degli errori .........................................................................104 6.1.1 | Esercizio ............................................................................................105 6.1.2 | Esercizio ............................................................................................106 6.1.3 | Esercizio ............................................................................................107 6.2 | Correzione degli errori............................................................................108 6.2.1 | Esercizio ............................................................................................109 6.2.2 | Esercizio ............................................................................................109 4
6.2.3 | Esercizio ............................................................................................110 6.2.4 | Esercizio ............................................................................................111 6.2.5 | Esercizio ............................................................................................112 7 | Database ..........................................................................................................113 7.1 | Algebra relazionale ..................................................................................114 7.1.1 | Esercizio ............................................................................................115 7.1.2 | Esercizio ............................................................................................116 7.2 | Structured Query Language ...................................................................118 7.2.1 | Esercizio ............................................................................................118 7.2.2 | Esercizio ............................................................................................120 5
1 | CIRCUITI DIGITALI SEQUENZIALI
In questo primo capitolo verrà affrontato lo studio dei circuiti digitali
sequenziali tramite tabelle della verità e si introdurrà il metodo delle mappe di
Karnaugh per giungere all’ottimizzazione delle equazioni logiche nella prima
forma canonica (POS, product of sums) e nella seconda forma canonica (SOP,
sum of products).
1.1 | O PERATORI LOGICI
1.1.1 | O PERATORE NOT
Si tratta di un operatore unario, che accetta un unico ingresso e produce
un’uscita. Rappresenta la negazione logica, o il complemento.
Equazione logica:
z = NOT a
[informatica]
z= a
[algebra]
z = a
[logica]
Simbolo circuitale:
a
z
Tabella della verità:
a
0
1
6
z
1
0
1.1.2 | O PERATORE AND
Si tratta di un operatore binario, che accetta due ingressi e produce un’uscita.
Rappresenta il prodotto logico.
Equazione logica:
z = a AND b
[informatica]
z=ab=a·b=ab
[algebra]
z =a b
[logica]
Simbolo circuitale:
a
z
b
Tabella della verità:
a
0
0
1
1
b
0
1
0
1
z
0
0
0
1
Si osservi che è sufficiente la presenza di uno 0 in ingresso per produrre
un’uscita pari a 0. L’unico caso in cui l’uscita è posta a 1 è che la coppia di
ingressi sia posta a 1.
Esiste una versione n-aria dell’operatore, ossia con n ingressi. In tal caso,
l’uscita è pari a 1 se e solo se tutti gli ingressi sono posti a 1.
7
1.1.3 | O PERATORE OR
Si tratta di un operatore binario, che accetta due ingressi e produce un’uscita.
Rappresenta la somma logica.
Equazione logica:
z = a OR b
[informatica]
z=ab
[algebra]
z =a b
[logica]
Simbolo circuitale:
a
z
b
Tabella della verità:
a
0
0
1
1
b
0
1
0
1
z
0
1
1
1
Si osservi che è sufficiente la presenza di un 1 in ingresso per produrre
un’uscita pari a 1. L’unico caso in cui l’uscita è posta a 0 è che la coppia di
ingressi sia posta a 0.
Esiste una versione n-aria dell’operatore, ossia con n ingressi. In tal caso,
l’uscita è pari a 0 se e solo se tutti gli ingressi sono posti a 0.
8
1.1.4 | O PERATORE XOR
Si tratta di un operatore binario, che accetta due ingressi e produce un’uscita.
Rappresenta l’OR esclusivo (aut aut) ed è un operatore di disuguaglianza.
Equazione logica:
z = a XOR b
[informatica]
z=ab
[algebra]
Simbolo circuitale:
a
z
b
Tabella della verità:
a
0
0
1
1
b
0
1
0
1
z
0
1
1
0
Si osservi che l’uscita viene posta a 1 se e solo se gli ingressi sono differenti.
9
1.1.5 | O PERATORE NAND
Si tratta di un operatore binario, che accetta due ingressi e produce un’uscita.
Rappresenta la negazione del prodotto logico.
Equazione logica:
z = a NAND b = NOT (a AND b)
z = a  b = ab
[algebra]
Simbolo circuitale:
a
z
b
Tabella della verità:
a
0
0
1
1
10
b
0
1
0
1
[informatica]
z
1
1
1
0
1.1.6 | O PERATORE NOR
Si tratta di un operatore binario, che accetta due ingressi e produce un’uscita.
Rappresenta la negazione della somma logica.
Equazione logica:
z = a NOR b = NOT (a OR b)
z = ab
[algebra]
Simbolo circuitale:
a
z
b
Tabella della verità:
a
0
0
1
1
11
b
0
1
0
1
[informatica]
z
1
0
0
0
1.1.7 | O PERATORE XNOR
Si tratta di un operatore binario, che accetta due ingressi e produce un’uscita.
Rappresenta la negazione dell’OR esclusivo (aut aut) ed è un operatore di
uguaglianza.
Equazione logica:
z = a XNOR b
[informatica]
z=ab
[algebra]
Simbolo circuitale:
a
z
b
Tabella della verità:
a
0
0
1
1
b
0
1
0
1
z
1
0
0
1
Si osservi che l’uscita viene posta a 1 se e solo se gli ingressi sono uguali.
12
1.2 | E QUAZIONI E CIRCUITI
Data un’equazione logica, è sempre possibile fornire una rappresentazione
grafica dello schema circuitale sotteso. Analogamente, è possibile partire dallo
schema circuitale per ricavare la corrispettiva equazione logica.
Nelle nostre convenzioni grafiche, i segnali si propagano da sinistra verso
destra, pertanto gli ingressi saranno posti sul lato sinistro e le uscite su quello
destro.
Volendo rappresentare lo schema circuitale di un’equazione logica, si parte
dagli operatori con massima priorità che agiscono direttamente sugli ingressi,
per poi procedere nel disegnare gli operatori con priorità più bassa, fino a
giungere all’uscita o alle uscite.
Si ricorda che l’operatore con priorità più alta è il NOT, seguito dall’AND e
infine dall’OR. Per modificare l’ordine naturale di valutazione degli operatori,
si possono introdurre le parentesi tonde. Le versioni negate a NAND b e
a NOR b ai fini della priorità possono essere rispettivamente considerate
come NOT (a AND b) e NOT (a OR b).
13
1.2.1 | E SERCIZIO
Testo
Si eliminino le parentesi superflue dalle seguenti equazioni logiche:
z1 = (a AND (NOT b)) OR c
z2 = (NOT a) AND (b OR c)
z3 = NOT ((a AND b) NOR c)
Soluzione
Le parentesi in z1 inducono a valutare dapprima il NOT, poi l’AND e infine
l’OR. Ma questo è proprio l’ordine dettato dalla priorità degli operatori in
questione, pertanto
z1 = (a AND (NOT b)) OR c = a AND NOT b OR c
Per quanto concerne z2, le parentesi danno priorità massima alla valutazione
di (NOT a) e di (b OR c). Nel primo caso, le parentesi possono essere
omesse, mentre nel secondo sono strettamente necessarie, altrimenti
(NOT a) AND b avrebbe la priorità. Dunque:
z2 = (NOT a) AND (b OR c) = NOT a AND (b OR c)
Per valutare la parentetizzazione di z3, espandiamo l’operatore NOR in NOT
OR.
z3 = NOT ((a AND b) NOR c) =
= NOT (NOT((a AND b) OR c))
L’ordine imposto dalle parentesi è: innanzi tutto la valutazione dell’AND più
interno, seguito dall’OR, dal NOT interno e dal NOT esterno. L’unica
parentesi eliminabile è quella che abbraccia (a AND b). Stabilito questo, e
ricordando che NOT(NOT(x)) = x:
z3 = NOT (NOT(a AND b OR c)) = a AND b OR c
14
1.2.2 | E SERCIZIO
Testo
Si fornisca una rappresentazione grafica del circuito relativo alla seguente
equazione logica:
z = ab + ( a + c ) = a AND b OR (NOT(a) OR NOT(c))
Soluzione
I primi operatori da valutare sono

x1 = a AND b

x2 = NOT(a)

x3 = NOT(c)
Al secondo livello viene valutato y = x2 OR x3.
Al terzo livello, si giunge infine a z = x1 OR y.
Graficamente:
a
x2
x1
z
b
y
c
15
x3
1.2.3 | E SERCIZIO
Testo
Si fornisca una rappresentazione grafica del circuito relativo alla seguente
equazione logica:
z = a + (b  (a · b)) = a OR (b XNOR (a AND b))
Soluzione
Gli operatori vanno valutati nell’ordine:
1. x = a AND b
2. y = b XNOR x
3. z = a OR y
Graficamente:
a
z
x
y
b
16
1.3 | T ABELLE DELLA VERITÀ
La tabella della verità descrive l’uscita o le uscite di un circuito in funzione di
tutte le possibili combinazioni in ingresso. In un sistema binario, ingressi e
uscite possono assumere solo i valori 0 e 1.
Nella rappresentazione grafica tabellare, escludendo la riga di intestazione, la
tabella della verità di una funzione con m ingressi ed n uscite contempla:

2m righe

m + n colonne
Ad esempio, la tabella della verità dell’operatore NOT presenta 1 ingresso, e
dunque 21 combinazioni, e 1 uscita: è una tabella 22 (2 righe e 2 colonne).
La tabella della verità dell’operatore AND nella versione binaria presenta 2
ingressi, e dunque 22 = 4 combinazioni, e 1 uscita: è una tabella 43 (4 righe e
3 colonne).
Per funzioni più complesse rispetto agli operatori logici elementari, è
possibile (e talvolta auspicabile) introdurre colonne aggiuntive che tengano in
considerazione i risultati parziali. Queste non appartengono strettamente alla
tabella della verità che descrive la funzione logica.
Una funzione logica è descritta da una e una sola tabella della verità.
Viceversa, la stessa tabella della verità può corrispondere a più funzioni
logiche (a questo proposito, si vedano gli esercizi successivi). Due funzioni
che presentano la stessa tabella della verità sono equivalenti.
Si osservi che una tabella della verità dà una descrizione
della funzione logica in stile black box (scatola nera), ossia
osservandone solo il comportamento esterno: all’applicazione
di certi valori in ingresso corrisponde un dato valore in
uscita.
17
1.3.1 | E SERCIZIO
Testo
Si verifichi tramite confronto delle tabelle della verità la proprietà
commutativa dell’operatore AND, e poi si faccia altrettanto per l’operatore
OR.
Soluzione
Per verificare la proprietà commutativa, è necessario provare che:
a AND b = b AND a
Questo si può fare spezzando l’equazione logica nei suoi due membri:
z1 = a AND b
z2 = b AND a
e confrontando le 2 tabelle della verità. Se esse saranno identiche, significa
che le due equazioni logiche sono equivalenti. Facendo corrispondere le
combinazioni di ingressi nelle due tabelle e applicando quanto mostrato in
1.1.2:
a
0
0
1
1
b
0
1
0
1
z1
0
0
0
1
b
0
1
0
1
a
0
0
1
1
z2
0
0
0
1
In modo analogo, per quanto riguarda l’operatore OR:
w1 = a OR b
w2 = b OR a
a
0
0
1
1
18
b
0
1
0
1
w1
0
1
1
1
b
0
1
0
1
a
0
0
1
1
w2
0
1
1
1
1.3.2 | E SERCIZIO
Testo
Si verifichi tramite confronto delle tabelle della verità il primo teorema di De
Morgan, che afferma:
NOT (a AND b) = (NOT a) OR (NOT b)
Si verifichi poi il secondo teorema di De Morgan, che afferma:
NOT (a OR b) = (NOT a) AND (NOT b)
Soluzione
Siano:
z1 = NOT (a AND b)
z2 = (NOT a) OR (NOT b)
a
0
0
1
1
b
0
1
0
1
a AND b
0
0
0
1
z1
1
1
1
0
a
0
1
0
1
b
0
0
1
1
NOT a
1
0
1
0
NOT b
1
1
0
0
z2
1
1
1
0
Il confronto tra le due colonne relative all’uscita, a parità di combinazioni in
ingresso, mostra che z1 = z2.
Ora siano invece:
w1 = NOT (a OR b)
w2 = (NOT a) AND (NOT b)
a
0
0
1
1
b
0
1
0
1
a OR b
0
1
1
1
w1
1
0
0
0
a
0
1
0
1
b
0
0
1
1
NOT a
1
0
1
0
NOT b
1
1
0
0
w2
1
0
0
0
Anche in questo caso, il confronto tra le due colonne relative all’uscita, a
parità di combinazioni in ingresso, mostra che w1 = w2.
19
1.3.3 | E SERCIZIO
Testo
Si verifichi tramite confronto delle tabelle della verità la possibilità di
rappresentare gli operatori logici AND, OR e NOT utilizzando solo porte
logiche NAND, come mostrato sotto:
NOT a = a NAND a
a AND b = (a NAND b) NAND (a NAND b)
a OR b = (a NAND a) NAND (b NAND b)
Soluzione
Si confrontino l’ultima colonna (che contiene la tabella della verità
dell’operatore sostituito) con la penultima (che contiene la tabella della verità
con soli operatori NAND). L’identità delle uscite a parità di valori in ingresso
prova le equazioni logiche sopra riportate.
a
0
1
20
a AND a
0
1
a
b
0
0
1
1
0
1
0
1
a
b
0
0
1
1
0
1
0
1
a NAND a
1
0
w
=
a NAND b
1
1
1
0
w1
=
a NAND a
1
1
0
0
NOT a
1
0
w NAND w
a AND b
0
0
0
1
0
0
0
1
w2
=
b NAND b
1
0
1
0
w1 NAND w2
a OR b
0
1
1
1
0
1
1
1
1.4 | S TUDIO DI FUNZIONI LOGICHE
Nel presente paragrafo verranno mostrati esercizi di applicazione delle tabelle
della verità al fine di studiare il comportamento delle uscite dei circuiti in
funzione degli ingressi.
Verrà inoltre introdotto il metodo delle mappe di Karnaugh per sintetizzare
le reti combinatorie a uno o più livelli.
Una mappa di Karnaugh è un metodo grafico che ha come obiettivo quello
di ridurre la complessità delle funzioni booleane espresse in forme canoniche.
Essa si costruisce a partire dalla tabella della verità di una funzione booleana,
nel processo di sintesi di una rete combinatoria.
Le mappe di Karnaugh permettono di costruire in modo semplice la forma
minima di una funzione come somma di prodotti logici (forma congiuntiva)
o come prodotto di somme logiche (forma disgiuntiva) e quindi
semplificazioni della funzione booleana spesso più immediate di quelle
ottenibili con modifiche algebriche.
Le mappe di Karnaugh risultano applicabili efficacemente solo a funzioni con
al più 5 - 6 variabili.
21
1.4.1 | E SERCIZIO
Testo
Si consideri la seguente equazione logica:
z = NOT ((NOT a AND b AND c) OR b OR (NOT a AND b AND NOT c))
Si studi il comportamento dell’uscita z in funzione degli ingressi a, b e c
tramite tabella della verità.
Si proceda alla semplificazione del circuito tramite mappe di Karnaugh,
giungendo all’equazione logica nella forma SOP (prima forma canonica).
Soluzione
Il presente esercizio può essere risolto per via tradizionale, ossia studiando le
singole funzioni logiche partendo da quelle più interne nel livello di
parentetizzazione (ossia quelle più vicine agli ingressi nello schema circuitale)
per poi porre i risultati ottenuti come ingressi degli operatori più esterni.
Procedendo in tal senso, si ha:
z = NOT ((NOT a AND b AND c) OR b OR (NOT a AND b AND NOT c)) =
[detti e = NOT a e f = NOT c]
= NOT ((e AND b AND c) OR b OR (e AND b AND f)) =
[detto g = e AND b]
= NOT ((g AND c) OR b OR (g AND f)) =
[detti h = g AND c e i = g AND f]
= NOT (h OR b OR i) =
[detto l = h OR b]
= NOT (l OR i) =
[detto m = l OR i]
= NOT m
a
0
0
0
0
1
1
1
1
22
b
0
0
1
1
0
0
1
1
c
0
1
0
1
0
1
0
1
e
1
1
1
1
0
0
0
0
f
1
0
1
0
1
0
1
0
g
0
0
1
1
0
0
0
0
h
0
0
0
1
0
0
0
0
i
0
0
1
0
0
0
0
0
l
0
0
1
1
0
0
1
1
m
0
0
1
1
0
0
1
1
z
1
1
0
0
1
1
0
0
Pertanto:
z = 1 per
a = 0, b = 0, c = 0
a = 0, b = 0, c = 1
a = 1, b = 0, c = 0
a = 1, b = 0, c = 1
z=0
altrimenti.
Una soluzione più rapida si basava sull’analisi del contenuto della parentesi
esterna, che è un OR tra tre blocchi, rispettivamente:
1. (NOT a AND b AND c)
2. b
3. (NOT a AND b AND NOT c)
Si ricorda che la caratteristica dell’OR è dare uscita 0 se e solo se tutti i suoi
ingressi sono 0. Dobbiamo quindi verificare quando questo avvenga.
Il blocco 1 è un AND a tre ingressi, ed è falso in tutti i casi salvo:
a = 0, b = 1, c = 1.
Il blocco 3 è un AND a tre ingressi, ed è falso in tutti i casi salvo:
a = 0, b = 1, c = 0.
Con queste osservazioni, la tabella di verità risultava molto semplificata:
a
0
0
0
0
1
1
1
1
b
0
0
1
1
0
0
1
1
c
0
1
0
1
0
1
0
1
blocco 1
0
0
0
1
0
0
0
0
blocco 3
0
0
1
0
0
0
1
0
OR a 3 ingressi
0
0
1
1
0
0
1
1
z
1
1
0
0
1
1
0
0
Mappa di Karnaugh:
ab
c
23
00 01 11 10
Per la prima forma canonica (SOP, Sum of
Products) è necessario raggruppare gli 1. Ne
0
0
1
1
0
consegue:
1
0
1
1
0
z = NOT b
1.4.2 | E SERCIZIO
Testo
Si considerino le seguenti equazioni logiche:
x = f1(a, b, c) = ((a NAND b) OR c) AND (b XOR c)
y = f2(a, b, c) = (b XOR c) OR (a OR NOT b)
Se ne fornisca una rappresentazione circuitale grafica congiunta. Si studino
singolarmente i comportamenti delle uscite x e y in funzione degli ingressi a, b,
c tramite tabelle della verità. Si proceda infine alla semplificazione dei circuiti
tramite mappe di Karnaugh, mostrando il procedimento per via grafica e il
risultato ottenuto e scegliendo la forma canonica più opportuna in ciascun
caso.
Soluzione
a
d
f
x
b
e
c
y
g
a
0
0
0
0
1
1
1
1
b
0
0
1
1
0
0
1
1
c
0
1
0
1
0
1
0
1
d
1
1
1
1
1
1
0
0
e
0
1
1
0
0
1
1
0
Pertanto:
x = 1 per
a = 0, b = 0, c = 1
a = 0, b = 1, c = 0
a = 1, b = 0, c = 1
x = 0 altrimenti
24
h
f
1
1
1
1
1
1
0
1
x
0
1
1
0
0
1
0
0
d = a NAND b
e = b XOR c
f = d OR c
x = f AND e
a
0
0
0
0
1
1
1
1
b
0
0
1
1
0
0
1
1
c
0
1
0
1
0
1
0
1
e
0
1
1
0
0
1
1
0
g
1
1
0
0
1
1
0
0
h
1
1
0
0
1
1
1
1
y
1
1
1
0
1
1
1
1
e = b XOR c
g = NOT b
h = a OR g
y = e OR h
Pertanto:
y = 0 solo per a = 0, b = 1, c = 1
y = 1 altrimenti
Mappa di Karnaugh per x:
ab
c
00 01 11 10
0
0
1
0
0
1
1
0
0
1
Essendoci un numero esiguo di 1, è conveniente
scegliere la prima forma canonica (SOP, Sum of
Products).
Raggruppando gli 1 come in figura:
x = (NOT a AND b AND NOT c) OR (NOT b AND c)
Mappa di Karnaugh per y:
ab
c
00 01 11 10
0
1
1
1
1
1
1
0
1
1
Essendoci un solo 0, è conveniente scegliere la
seconda forma canonica (POS, Product of Sums).
Raggruppando gli 0 come in figura:
y = a OR NOT b OR NOT c
25
2 | BIT E BYTE
In questo capitolo verranno proposti esercizi assortiti al fine di prendere
dimestichezza con le unità di misura fondamentali nella rappresentazione
dell’informazione.
A questo proposito, ricordiamo che l’unità atomica è data dal bit, che può
assumere solo il valore 0 o il valore 1. Proprio da tale caratteristica deriva il
nome bit, che è la contrazione di binary digit (cifra binaria). I bit vengono
convenzionalmente raggruppati a gruppi di otto, a formare i byte. Pertanto,
una stringa di 8 bit è una stringa da 1 byte. Ma il byte stesso è un’unità di
misura sovente troppo piccola per gli usi pratici.
I multipli comunemente adottati per il byte sono:

1 KB (Kilobyte) = 210 byte = 1024 byte

1 MB (Megabyte) = 220 byte = 1024 KB

1 GB (Gigabyte) = 230 byte = 1024 MB

1 TB (Terabyte) = 240 byte = 1024 GB
Per ogni altra unità di misura, il prefisso kilo indica 103, il prefisso mega sta
per 106 e via dicendo. Nel campo dell’Informatica, tali potenze di 10 sono
approssimazioni (non sempre accettabili) delle potenze di 2 sopra citate.
Ad esempio, un hard disk della capacità di 80 GB contiene esattamente
85˙899˙345˙920 byte, ossia 5˙899˙345˙920 byte in più rispetto al suo valore
approssimato.
26
2.1 | D IMENSIONAMENTO DELLE STRINGHE
In generale, quando si ha il problema di rappresentare x oggetti tramite
stringhe binarie, si deve prevedere un numero n di bit tale che:
2n ≥ x con n .
Infatti, tramite n bit è possibile rappresentare 2n differenti combinazioni di
valori binari, cui si possono far corrispondere i più svariati significati. Alcune
di queste combinazioni possono anche non venire assegnate: è il caso tipico
di quando i diversi valori da rappresentare non sono potenze di 2.
Si veda al riguardo il seguente esercizio.
2.1.1 | E SERCIZIO
Testo
Si dimensionino correttamente le stringhe di bit atte a contenere le seguenti
informazioni:

i semi delle carte da gioco napoletane;

i nomi delle note della scala musicale;

i mesi dell’anno;

i codici prodotto di un distributore automatico con 100 scomparti.
Soluzione
Nel caso dei semi, x = 4 e dunque n = 2. Ad esempio:
00 ↔ bastoni, 01 ↔ denari, 10 ↔ spade e 11 ↔ coppe.
Nel caso delle note, x = 7 e dunque n = 3. Una delle 8 combinazioni risulterà
inutilizzata.
Nel caso dei mesi dell’anno, x = 12 e dunque n = 4. Quattro delle sedici
combinazioni risulteranno inutilizzate.
Infine, per identificare x = 100 prodotti servono almeno n = 7 bit.
27
2.2 | C ALCOLI SU BIT E BYTE
2.2.1 | E SERCIZIO
Testo
Sapendo che una canzone ha durata media t = 3' 18'' e viene compressa in
formato MP3 a 256 kbps1 (1 kbit = 103 bit), si determini quante canzoni
possono trovare posto su un supporto CD-ROM di dimensione pari a 800
MB (1 MB = 220 byte). E quante canzoni possono stare su una chiavetta USB
da 4 GB?
Soluzione
t = 3’ 18’’ = (3 · 60 + 18) s = 198 s
La codifica di ogni secondo della canzone richiede 256˙000 bit, e dunque
ogni canzone mediamente occupa 50˙688˙000 bit = 6˙336˙000 byte =
= 6,04 MB.
Dunque un CD-ROM da 800 MB può contenere circa 800 / 6,04 = 132
canzoni.
Per quanto riguarda la chiavetta, essa contiene 4096 MB e dunque circa 678
canzoni di tale durata media.
1
28
1 kbps = 1 kbit / s = 1000 bit al secondo.
2.2.2 | E SERCIZIO
Testo
Si consideri il formato del CD-DA da 74 minuti, che codifica ogni secondo di
musica con 44100 campioni da 16 bit/campione e in stereo, ossia su 2 canali.
Si calcoli la capacità di tale supporto in termini di MB.
Soluzione
Un secondo di musica in formato CD-DA contiene 88200 campioni (44100
per il canale destro, 44100 per il sinistro), ognuno dei quali è costituito da una
sequenza di 16 bit (ossia 2 byte) che ne individua il valore.
Quindi, un secondo di musica occupa
2 · 44100 · 2 byte = 176˙400 byte = 172,3 KB
e un minuto occupa 10˙584˙000 byte (10,1 MB).
In un CD-DA da 74 minuti sono contenuti 747,4 MB (74 minuti · 10,1 MB).
Nota: i CD-R da 74 minuti contengono circa 650 MB di
dati o circa 747,4 MB di audio. Il formato CD-ROM
impiega i 100 MB di differenza per codici di correzione
d'errore supplementari, vista la delicatezza del formato. Per
questo motivo i MB disponibili all'utente risultano solo
650.
29
2.2.3 | E SERCIZIO
Testo
Si calcoli quanta memoria occupa in un calcolatore un’immagine A di
dimensione 640 × 480 pixel e in bianco e nero.
Si ripeta il calcolo per un’immagine B avente uguali dimensioni in pixel e
profondità di colore sufficiente a rappresentare una palette di 16 colori.
Si consideri infine un’immagine C di dimensioni quadrate, profondità di
colore pari a 24 bit e occupazione in memoria pari a 12 KB. Quali sono le
sue dimensioni in pixel?
Soluzione
L’immagine A è formata da (640 · 480) pixel = 307˙200 pixel.
Poiché il numero di colori da rappresentare è pari a 2, ad ogni pixel è
sufficiente riservare un unico bit per l’informazione di colore. Dunque
l’immagine occupa 307˙200 bit = 38˙400 byte = 37,5 KB.
L’immagine B è a 16 colori, e ciò significa che occorrono log216 = 4 bit per
ogni singolo pixel. Dunque un’immagine di 640 × 480 pixel a 16 colori
occupa (640 · 480 · 4) bit = 1˙228˙800 bit, cioè 153˙600 byte o 150 KB.
Infine si procede per C in modo inverso. Dalla dimensione d in MB e dalla
profondità di colore p (ossia dal numero di bit necessari per codificare
l’informazione di colore di ciascun pixel) si risale a n, numero complessivo di
pixel che formano l’immagine, secondo la formula:
n=d/p
avendo però cura di usare unità di misura omogenee.
n = (12 · 1024 · 8 / 24) pixel = 4096 pixel
Essendo l’immagine quadrata, le sue dimensioni lineari a e b espresse in pixel
sono date da:
a = b = √ = 64 pixel
30
2.2.4 | E SERCIZIO
Testo
Si consideri un supporto magnetico quale il floppy disk da 1,44 MB la cui
capacità esatta è pari a 1˙474˙560 byte.
Si calcoli quanti caratteri codificati in ASCII esteso vi possono essere salvati,
ricordando che tale codifica richiede 8 bit per carattere.
Si effettui nuovamente il calcolo considerando una codifica in UTF-32
supponendo che il testo sia disposto in 10 file. Nota: si ricorda che UTF-32
rappresenta ciascun carattere su 32 bit, e richiede la scrittura della stringa
esadecimale 00 00 FE FF (di lunghezza 4 byte, come si vedrà nel Capitolo 4)
come prefisso di ogni file.
Soluzione
In ASCII esteso, ogni carattere occupa 8 bit = 1 byte. Ne consegue che un
floppy delle caratteristiche citate possa contenere
nASCII = 1˙474˙560 caratteri
In UTF-32, ogni carattere occupa 32 bit = 4 byte.
Per quanto concerne il prefisso dei file, lo spazio complessivamente
impiegato è pari a 10 file · 4 byte/file = 40 byte.
Ora il numero di caratteri contenuti è
nUTF-32 = (1˙474˙560 - 40) / 4 = 368˙630 caratteri
31
3 | MEMORIE DI MASSA
3.1 | P RESTAZIONI DELLE UNITÀ DISCO
3.1.1 | E SERCIZIO
Testo
Si consideri un disco fisso con le seguenti caratteristiche:2

capacità totale c = 80 GB;

velocità di trasferimento dati (o data transfer rate) vtrasf = 150 MB/s;

tempo medio di posizionamento tpos = 9 ms;

velocità di rotazione vrot = 7200 rpm.
Si calcoli il tempo complessivamente richiesto per leggere e trasferire 320 KB
di dati, ricordando che 1 K = 210 e 1 M = 220.
Soluzione
Il computo del tempo complessivo ttot passa per la valutazione di tre addendi:
ttot = tpos + tlat + ttrasf
ove:

tpos è il tempo di posizionamento, ossia il tempo necessario per
spostare le testine di lettura/scrittura da una traccia a un’altra;

tlat rappresenta il tempo di latenza, detto anche ritardo di rotazione,
pari a metà del tempo necessario al disco per eseguire una rotazione
completa. In altri termini, questo è il tempo medio perché i dati
richiesti giungano sotto la testina di lettura/scrittura;
2
32
Queste sono le caratteristiche reali del disco fisso Maxtor SATA2 2M da 80 GB.

infine, ttrasf è il tempo richiesto per il solo trasferimento dei dati alla
velocità determinata da vtrasf.
Si presti attenzione, nei calcoli, a utilizzare le medesime unità di misura per i
tre addendi.
Nel caso delle unità disco, solitamente l’unità più
appropriata è il millisecondo, abbreviato in ms.
Dal testo, si evince che il tempo di posizionamento tpos = 9 ms.
Il tempo di latenza tlat si calcola sulla base della velocità di rotazione
vrot = 7200 rpm (revolutions per minute, rotazioni al minuto).
Al secondo,
vrot = (7200 / 60) rps = 120 rps.
Per definizione, si deve determinare il tempo richiesto per eseguire mezza
rotazione. Pertanto si imposta la seguente proporzione:
120 : 1 = 0,5 : tlat
tlat = (0,5 / 120) s = 0,00417 s = 4,17 ms
Infine è necessario calcolare il tempo necessario per trasferire 320 KB di dati.
150 · 220 : 320 · 210 = 1 : ttrasf
ttrasf = (320 / (150 · 1024)) s = 0,00208 s = 2,08 ms
In definitiva:
ttot = tpos + tlat + ttrasf = (9 + 4,17 + 2,08) ms = 15,25 ms
Si osservi che la capacità totale del disco, che pure è uno dei
parametri fondamentali per descriverne le caratteristiche,
non ha alcun impatto sulla soluzione dell’esercizio.
33
3.1.2 | E SERCIZIO
Testo
Si consideri un disco fisso con le seguenti caratteristiche:3

capacità totale c = 150 GB;

velocità di trasferimento dati vtrasf = 3 Gb/s;4

tempo medio di posizionamento in lettura tpos = 4,2 ms;

velocità di rotazione vrot = 10000 rpm.
Si calcoli il tempo complessivamente richiesto per leggere e trasferire 2 MB di
dati, considerando 1 MB = 220 byte e 1 Gb = 109 bit.
Soluzione
Il computo del tempo complessivo ttot passa per la valutazione di tre addendi:
ttot = tpos + tlat + ttrasf
Dal testo, si evince che il tempo di posizionamento tpos = 4,2 ms.
Il tempo di latenza tlat si calcola sulla base della velocità di rotazione
vrot = 10000 rpm (revolutions per minute, rotazioni al minuto).
Al secondo,
vrot = (10000 / 60) rps = 166,67 rps.
Ora si imposta la seguente proporzione:
166,67 : 1 = 0,5 : tlat
tlat = 0,003 s = 3 ms
Infine è necessario calcolare il tempo necessario per trasferire 2 MB di dati.
vtrasf = 3 Gb/s = 3/8 · 109 byte/s = 0,375 · 109 byte/s
0,375 · 109 : 221 = 1 : ttrasf
ttrasf = 0,00559 s = 5,59 ms
Infine:
ttot = tpos + tlat + ttrasf = (4,2 + 3 + 5,59) ms = 12,79 ms
Queste sono le caratteristiche reali del disco fisso Western Digital VelociRaptor SATA2 da
150 GB.
4 Attenzione: si tratta di gigabit per secondo.
3
34
3.1.3 | E SERCIZIO
Testo
Si consideri un unità floppy con le seguenti caratteristiche:5

velocità di trasferimento dati vtrasf = 500 KB/s;

tempo di posizionamento = 3 ms per traccia;

velocità di rotazione vrot = 300 rpm.
Si calcoli il tempo complessivamente richiesto per spostare la testina di
lettura di 10 tracce e trasferire 250 KB di dati, considerando 1 K = 210.
Soluzione
Si osservi che un floppy disk è significativamente più lento di un hard disk,
innanzi tutto per il diverso regime di rotazione (max 300 rpm contro max
15000 rpm). Anche i restanti tempi hanno ordini di grandezza superiori.
Pertanto, potrebbe risultare più agevole esprimere il risultato in secondi.
Il calcolo del tempo complessivo ttot passa sempre per la valutazione di tre
addendi:
ttot = tpos + tlat + ttrasf
Tempo di posizionamento tpos = 3 ms/traccia · 10 tracce = 30 ms = 0,03 s.
Il tempo di latenza tlat si calcola sulla base della velocità di rotazione
vrot = 300 rpm = 5 rps. Pertanto:
5 : 1 = 0,5 : tlat
tlat = 0,1 s
Infine è necessario calcolare il tempo necessario per trasferire 250 KB di dati.
500 · 210 : 250 · 210 = 1 : ttrasf
ttrasf = 0,5 s
Dunque si ottiene:
ttot = tpos + tlat + ttrasf = (0,03 + 0,1 + 0,5) s = 0,63 s
5
35
Queste sono le caratteristiche reali del floppy drive Nec FD1231H da 1.44 MB, 3.5 pollici.
3.1.4 | E SERCIZIO *
Testo
La velocità di rotazione è uno dei parametri che incidono di più sulle
prestazioni generali. Un’elevata velocità di rotazione dei piatti significa che un
numero superiore di dati passa sotto la testina di lettura/scrittura nell'unità di
tempo.
L’unità di misura in cui si è soliti esprimere il regime di rotazione sono le
revolutions per minute, abbreviate in rpm e traducibili come rotazioni al minuto.
Gli hard disk da 3.5” per server e workstation ruotano a 10000 o 15000 giri al
minuto, mentre quelli per desktop solitamente lavorano a 7200 giri al minuto.
I drive per notebook tipicamente sono più lenti; in questo settore troviamo
principalmente drive da 5400 o 4200 rpm, anche se esistono modelli da 7200
rpm. Una ragione per la velocità inferiore riguarda il consumo energetico che
aumenta con l'aumentare della velocità di rotazione, e – come è noto – la
durata della batteria è un aspetto particolarmente caro ai costruttori di
portatili.6
Si consideri un disco magnetico con le seguenti caratteristiche:

velocità di trasferimento dati vtrasf = 1 Gb/s;

tempo medio di posizionamento in lettura tpos = 4 ms;
Si voglia trasferire 4 KB di dati, con 1 K = 210.
Si valutino le prestazioni del disco al variare della velocità di rotazione vrot,
considerando rispettivamente i valori 4200 rpm, 5400 rpm, 7200 rpm,
10000 rpm e infine 15000 rpm.
Si calcoli infine di quanto è più veloce il disco da 15000 rpm rispetto a quello
da 4200 rpm.
Si osservi che questo esercizio, pur considerando regimi di
rotazione reali, ha carattere più teorico che pratico. Infatti,
tipicamente anche i restanti parametri del disco, quali il
6
36
I dati riportati nel testo fanno riferimento all’anno 2009.
tempo di posizionamento e la velocità di trasferimento,
vengono progettati a seconda delle caratteristiche desiderate.
Soluzione
Il calcolo della somma:
ttot = tpos + tlat + ttrasf
per questo esercizio è fatto di due addendi fissi (tpos e ttrasf) e di uno variabile
(tlat). Cominciamo dal calcolo dei primi due.
Dal testo, si evince che il tempo di posizionamento è in ogni caso tpos = 4 ms.
Per quanto riguarda il tempo di trasferimento:
vtrasf = 1 Gb/s = (1/8) · 109 byte/s = 0,125 · 109 byte/s
0,125 · 109 : 212 = 1 : ttrasf
ttrasf = 0,000032768 s = 0,03 ms
Procediamo al calcolo dei tempi di latenza al variare dei regimi di rotazione.
vrot,4200 = 70 rps; tlat,4200 = (0,5 / 70) s = 7,14 ms; ttot,4200 = 11,17 ms
vrot,5400 = 90 rps; tlat,5400 = (0,5 / 90) s = 5,56 ms; ttot,5400 = 9,59 ms
vrot,7200 = 120 rps; tlat,7200 = (0,5 / 120) s = 4,17 ms; ttot,7200 = 8,2 ms
vrot,10000 = 166,67 rps; tlat,10000 = (0,5 / 166,67) s = 3 ms; ttot,10000 = 7,03 ms
vrot,15000 = 250 rps; tlat,15000 = (0,5 / 250) s = 2 ms; ttot,15000 = 6,03 ms
Per calcolare di quanto è più veloce il disco da 15000 rpm rispetto a quello da
4200 rpm, si può impostare la proporzione:
11,17 ms : 6,03 ms = 1 : x
x = 1,85 = 185%
Tale risultato mostra che il disco con regime di rotazione più alto ha
prestazioni poco meno che doppie rispetto all’altro.
Potrebbe sorprendere che un disco in grado di ruotare 3,5
volte più velocemente ottenga tempi meno che dimezzati, ma
si tenga in opportuna considerazione l’impatto notevole
dell’addendo fisso tpos.
37
3.2 | C APACITÀ DEI DISCHI MAGNETICI
I dischi magnetici sono caratterizzati dai seguenti parametri:

numero di piatti (platters) np – il numero di dischi magnetici vincolati a
ruotare assieme attorno a un perno centrale. Per i floppy, np = 1;

numero di testine (heads) nh – normalmente nh = 2·np dato che i piatti
hanno 2 superfici;

numero di tracce (tracks) o cilindri (cylinders) nc per lato – il numero di
tracce concentriche presenti su ciascuna faccia del disco e su cui le
testine possono leggere/scrivere i dati;

numero di settori (sectors) per traccia ns – il numero di archi in cui è
suddiviso
ciascuna
traccia
del
disco.
Nelle
nostre
ipotesi
semplificative, i dischi avranno lo stesso numero di settori su ogni
traccia, indipendentemente dalla distanza della traccia dal centro;

numero di byte per settore nb – storicamente tale valore è quasi
sempre di 512 byte/settore.
La capacità C di un hard disk composto fisicamente da più dischi è data
dalla relazione:
C = (nh · nc · ns · nb ) byte
38
3.2.1 | E SERCIZIO
Testo
Si calcoli la capacità di un disco magnetico con le seguenti caratteristiche:7
nc = 80 cilindri; nh = 2 testine; ns = 18 settori/traccia; nb = 512 byte/settore;
Si risolva poi l’esercizio ponendo nc = 40 cilindri e ns = 9 settori/traccia.8
Soluzione
C1 = (80 · 2 · 18 · 512) byte = 1474560 byte = 1440 KB ≈ 1,44 MB
C2 = (40 · 2 · 9 · 512) byte = 368640 byte = 360 KB
Qui sotto è riportata una tabella con i più comuni formati dei floppy disk.9
Platform
Size
Density
Bytes/sector
Sectors/track
Tracks/side
Sides
Capacity
RPM
IBM
(3740 format)
8 in
single
128
26
74
1
250.25 KB
360
1
113.75 KB
2
227.50 KB
1
140 KB
2
280 KB
1
400 KB
2
800 KB
2
1440 KB
1
170 KB
2
340 KB
13
Apple II
5¼ in
double
256
35
16
Apple II,
Apple
Macintosh
3½ in
(90 mm)
double
512
Variable
(8-12)
80
high
512
18
80
Commodore
(8-bit)
5¼ in
double
Commodore
Amiga
3½ in
(90 mm)
double
5¼ in
IBM PC
compatibles
3½ in
(90 mm)
high
double
256
512
Atari 8-bit
3½ in
(90 mm)
5¼ in
11
22
35
80
2
150
1
160/180 KB
2
320/360 KB
2
1200 KB
high
15
80
9
80
720 KB
18
80
1440 KB
21
80
21
82
1720 KB
36
80
2880 KB
512
15
1024
8
single
128
18
enhanced
128
26
double
256
18
high
80
2
2
300
300
double
512
300
880 KB
40
high
CLV
1760 KB
8/9
512
extended
NEC PC98
Variable
(17-21)
300
1680 KB
1200 KB
1280 KB
300
360
300
360
90 KB
40
1
127 KB
288
180 KB
Queste sono le caratteristiche reali del floppy disk da 3.5’’ a doppia faccia e alta densità per
PC IBM compatibili.
8 Queste sono le caratteristiche reali del floppy disk da 5.25’’ a doppia faccia e doppia densità
per PC IBM compatibili.
9 Fonte: http://en.wikipedia.org/wiki/Floppy_disk_format
7
39
3.2.2 | E SERCIZIO
Testo
Si calcoli la capacità dei seguenti dischi:
 Disco 1: Western Digital Caviar AC2170
o nh = 6 testine;
o nc = 1010 cilindri;
o ns = 55 settori/traccia;
o nb = 512 byte/settore;
 Disco 2: Quantum Fireball 1080AT
o nh = 16 testine;
o nc = 2112 cilindri;
o ns = 63 settori/traccia;
o nb = 512 byte/settore;
Soluzione
C1 = (6·1010·55·512) byte = 170649600 byte = 162,7 MB
C2 = (16·2112·63·512) byte = 1089994752 byte = 1039,5 MB ≈ 1 GB
40
4 | RAPPRESENTAZIONE DEI NUMERI
4.1 | C ONVERSIONI DA BASE N A BASE 10
Nel corso del presente paragrafo e dei seguenti, si adotterà la notazione a
pedice per indicare esplicitamente la base in cui è scritto un numero. Ad
esempio, la notazione x = 1012 significa che il numero x è espresso in base 2
e pertanto le cifre 101 devono essere interpretate in base 2, e non lette come
“centouno”.
Gli esercizi contrassegnati con un asterisco sono da considerarsi di
approfondimento.
41
4.1.1 | E SERCIZIO
Testo
Si svolgano i seguenti esercizi di conversione da base 2 a base 10:
x = 11012
y = 100101012
z = 1010010112
Soluzione
x = 11012 =
= (1·23 + 1·22 + 0·21 + 1·20)10 =
= (8 + 4 + 0 + 1)10 =
= 1310
y = 100101012 =
= (1·27 + 0·26 + 0·25 + 1·24 + 0·23 + 1·22 + 0·21 + 1·20)10 =
= (128 + 16 + 4 + 1)10 =
= 14910
z = 1010010112 =
= (1·28 + 0·27 + 1·26 + 0·25 + 0·24 + 1·23 + 0·22 + 1·21 + 1·20)10 =
= 33110
42
4.1.2 | E SERCIZIO
Testo
Si svolgano i seguenti esempi di conversione da base 16 a base 10:
x = CD16
y = 10A16
z = B7F16
Soluzione
x = CD16 =
= (12·161 + 13·160)10 =
= 20510
y = 10A16 =
= (1·162 + 0·161 + 10·160)10 =
= 26610
z = B7F16 =
= (11·162 + 7·161 + 15·160)10 =
= 294310
43
4.1.3 | E SERCIZIO
Testo
Si svolgano i seguenti esempi di conversione da base n a base 10:
x = 3415
y = 1526
z = 5348
Soluzione
x = 3415 =
= (3·52 + 4·51 + 1·50)10 =
= 9610
y = 1526 =
= (1·62 + 5·61 + 2·60)10 =
= 6810
z = 5348 =
= (5·82 + 3·81 + 4·80)10 =
= 34810
44
4.1.4 | E SERCIZIO *
Testo
Si determinino due possibili basi a e b tali da rendere verificata la seguente
uguaglianza: 32a = 22b
Soluzione
Portando entrambi i membri dell’uguaglianza in base 10, si ha:
32a = (3·a1 + 2·a0)10 = (3a + 2)10
e
22b = (2·b1 + 2·b0)10 = (2b + 2)10
Di conseguenza:
a = (2/3)b
Convenzionalmente, le basi sono numeri interi maggiori di 1. Ad esempio la
scelta b = 2 sarebbe accettabile su b, ma non su a (che risulterebbe non
intera). Per rispettare tali vincoli, va scelto per b un qualsiasi valore intero
positivo multiplo di 3. In termini matematici:
b = 3k, con k 
Ad esempio, per b = 3 e dunque a = 2) si ha:
32a = 322 = 810
22b = 223 = 810.
Analogamente, per b = 6 e dunque a = 4, si ha:
32a = 324 = 1410
22b = 226 = 1410.
45
4.1.5 | E SERCIZIO
Testo
Si svolgano i seguenti esempi di conversione da base n a base 10, aventi per
soggetto numeri frazionari:
x = 100,1012
y = 1202,113
z = 32,024
Soluzione
x = 100,1012 =
= (1·22 + 1·2-1 + 1·2-3)10 =
= (4 + 1/2 + 1/8)10 =
= 4,62510
y = 1202,113 =
= (1·33 + 2·32 + 2·30 + 1·3-1 + 1·3-2)10 =
= (27 + 18 + 2 + 1/3 + 1/9)10 ≈
≈ 47,4310
z = 32,024 =
= (3·41 + 2·40 + 2·4-2)10 =
= (12 + 2 + 2/16)10 =
= 14,12510
46
4.2 | C ONVERSIONI DA BASE 10 A BASE N
Nel corso del presente paragrafo saranno proposti esercizi di conversione da
base 10 a base n su numeri interi e su numeri frazionari in virgola fissa. Nel
primo caso sarà sufficiente l’applicazione del cosiddetto metodo delle
divisioni successive. Invece, per quanto riguarda la sola parte frazionaria dei
numeri (ove presente), sarà richiesta l’applicazione del metodo delle
moltiplicazioni successive.
47
4.2.1 | E SERCIZIO
Testo
Si utilizzi il metodo delle divisioni successive per convertire da base 10 a base
3 il numero intero x = 4610. Si utilizzi in seguito il processo di conversione da
base 3 a base 10 come verifica del risultato ottenuto.
Soluzione
Il metodo delle divisioni successive impone di dividere ripetutamente per la
base, mantenendo traccia tanto del quoziente intero (cui va applicata la
divisione successiva) quanto del resto della divisione intera. Il processo ha
termine quando si ottiene un valore 0 come quoziente. A questo punto, il
risultato della conversione è dato dalla lettura ordinata dei resti, ove la cifra
più significativa è data dall’ultimo resto ottenuto e la meno significativa dal
primo. Nel caso di una rappresentazione grafica come quella sotto proposta,
la colonna di destra va letta dal basso verso l’alto.
46 3
15 1
5 0
1 2
0 1
x = 12013 = (1·33 + 2·32 + 1·30)10 = (27 + 18 + 1)10 = 4610
48
4.2.2 | E SERCIZIO
Testo
Si utilizzi il metodo delle divisioni successive per convertire da base 10 a base
8 il numero intero x = 648. Si utilizzi in seguito il processo di conversione da
base 8 a base 10 come verifica del risultato ottenuto.
Soluzione
Tramite il metodo delle divisioni successive:
64 8
8 0
1 0
0 1
x = 1008 = (1 · 82)10 = 6410
Osservazione di carattere generale: quando il numero da convertire è una
potenza esatta della base, il risultato sarà dato dalla cifra 1 seguita da un
numero di cifre 0 pari all’esponente di tale potenza.
Ad esempio, si voglia esprimere x = 4910 in base 7. Come è noto, 4910 = (72)10
pertanto il numero risultate sarà dato da una cifra 1 seguita da 2 zeri. In
effetti: x = 1007 = (1 · 72)10 = 4910
Analogamente, y = 6410 = (26)10 = 10000002
49
4.2.3 | E SERCIZIO
Testo
Si utilizzi il metodo delle moltiplicazioni successive per convertire da base 10
a base 2 il numero frazionario x = 0,562510. Si utilizzi in seguito il processo di
conversione da base 2 a base 10 come verifica del risultato ottenuto.
Soluzione
Il metodo delle moltiplicazioni successive si applica alla sola parte frazionaria
di un numero. Si osservi che in questo caso il numero x da convertire
presenta solo parte frazionaria.
L’algoritmo richiede di moltiplicare per la nuova base (in questo caso per 2)
la parte frazionaria, ottenendo così un numero virtualmente composto da una
parte intera (non sempre presente) e una frazionaria. Le due parti vengono
scorporate in vista del passaggio successivo. Nella rappresentazione grafica
sotto riportata, la parte intera trova posto nella colonna di sinistra e quella
frazionaria nella colonna di destra. Se il risultato della moltiplicazione
presenta solo parte frazionaria, nella prima colonna si segna uno zero. Al
passaggio successivo, si effettua nuovamente la moltiplicazione della sola
parte frazionaria ottenuta al passaggio precedente.
L’algoritmo ha termine quando:
1. la parte frazionaria risultante è pari a 0, oppure
2. si è svolto il numero di passaggi richiesto (si osservi che ogni
passaggio calcola una nuova cifra dopo la virgola).
Infine, il risultato è dato dalla sequenza delle sole parti intere (nella nostra
rappresentazione la colonna di sinistra). Queste vanno lette dalla prima, che
dà la cifra più significativa, all’ultima, che fornisce la meno significativa (nel
nostro caso, dall’alto verso il basso).
50
0,5625 2
0,5625 · 2 = 1,125 = 1 + 0,125
1 0,125 0,125 · 2 = 0,25 = 0 + 0,25
0 0,25
0,25 · 2 = 0,5 = 0 + 0,5
0 0,5
0,5 · 2 = 1 = 1 + 0
1 0
x = 0,10012 = (1/2 + 1/16)10 = 0,562510
Si osservi che in questo caso specifico l’algoritmo ha termine in quanto
compare uno zero nella colonna di destra dopo un numero finito di passaggi.
Questo peraltro garantisce che la parte frazionaria sia esprimibile nella nuova
base senza commettere alcun errore di arrotondamento.
51
4.2.4 | E SERCIZIO
Testo
Si converta da base 10 a base 5 il numero frazionario x = 29,2410. Si utilizzi in
seguito il processo di conversione da base 5 a base 10 come verifica del
risultato ottenuto.
Soluzione
In questo caso, il numero x presenta una parte intera ed una parte frazionaria.
E’ dunque necessario procedere scomponendo x nella sola componente
intera x1 = 2910 e nella sola parte frazionaria x2 = 0,2410.
Su x1 si utilizzerà il metodo delle divisioni successive, mentre su x2 il metodo
delle moltiplicazioni successive.
Tramite il metodo delle divisioni successive:
29 5
5 4
1 0
0 1
x1 = 1045 = (1·52 + 4·50)10 = 2910
Tramite il metodo delle moltiplicazioni successive:
0,24 5
1 0,2
0,24 · 5 = 1,2 = 1 + 0,2
0,2 · 5 = 1 = 1 + 0
1 0
x2 = 0,115 = (1·5-1 + 1·5-2)10 = (1/5 + 1/25)10= 0,2410
In definitiva x = x1 + x2 = 104,115
La controprova di conversione da base 5 a base 10 è già stata effettuata sulle
singole componenti. Ovviamente, poteva essere eseguita in un unico
passaggio anche dopo il calcolo del risultato finale.
52
4.2.5 | E SERCIZIO
Testo
Si converta da base 10 a base 2 il numero frazionario x = 13,310 fermandosi
all’ottava cifra dopo la virgola. Si utilizzi in seguito il processo di conversione
da base 2 a base 10 per calcolare e1, ossia l’errore di arrotondamento
introdotto. Si valuti infine l’errore e2 che si sarebbe commesso fermandosi alla
sola seconda cifra dopo la virgola.
Soluzione
Anche in questo caso, il numero x presenta una parte intera ed una parte
frazionaria. E’ dunque necessario procedere scomponendo x nella sola
componente intera x1 = 1310 e nella sola parte frazionaria x2 = 0,310.
Tramite il metodo delle divisioni successive:
13 2
6 1
3 0
1 1
0 1
x1 = 11012
Si osservi che qualsiasi numero intero, in qualsiasi base, è
sempre esprimibile tramite un numero finito di cifre. Infatti,
la cifra meno significativa del risultato ha la granularità
delle unità.
53
Tramite il metodo delle moltiplicazioni successive:
0,3 2
0,3 · 2 = 0,6 = 0 + 0,6
0 0,6
0,6 · 2 = 1,2 = 1 + 0,2
1 0,2
0,2 · 2 = 0,4 = 0 + 0,4
0 0,4
0,4 · 2 = 0,8 = 0 + 0,8
0 0,8
0,8 · 2 = 1,6 = 1 + 0,6
1 0,6
0,6 · 2 = 1,2 = 1 + 0,2
1 0,2
0,2 · 2 = 0,4 = 0 + 0,4
0 0,4
0,4 · 2 = 0,8 = 0 + 0,8
0 0,8
0,8 · 2 = 1,6 = 1 + 0,6
x2 = 0,010011002
Si osservi che, in mancanza dell’indicazione sul numero di cifre da calcolare
(e dunque sul numero di passaggi da effettuare), l’algoritmo non avrebbe mai
raggiunto un punto finale. Ad esempio, confrontando il II e il VI passaggio,
si nota il ripetersi di un’identica situazione (parte intera = 1, parte
frazionaria = 0,2). Pertanto il risultato ottenibile sarà sempre approssimato, e
l’approssimazione sarà via via migliore procedendo nel calcolo.
x = x1 + x2 ≈ 1101,010011002 = (13 + 1/4 + 1/32 + 1/64)10 = 13,29687510
Errore e1 = x - xapprox = 13,3 - 13,296875 = 0,003125.
Errore e2 = 13,3 - 13,25 = 0,05 ossia un errore assai più rilevante rispetto a e1.
54
4.3 | C ONVERSIONI DA BASE M A BASE N
Poiché rappresentare un numero in una base piuttosto che in un’altra non ne
varia il significato semantico (ossia la quantità sottesa dal numero) ma solo la
scrittura, è sempre possibile convertire un numero da una base m a una base n
con m ed n generici.
Un primo metodo, puramente basato su quanto visto in precedenza, consiste
nell’utilizzare la base 10 come passaggio intermedio. In altri termini, il
numero x viene prima convertito da base m a base 10, per poi essere
nuovamente convertito da base 10 a base n.
In alcuni casi, è invece possibile (e particolarmente semplice) effettuare una
conversione diretta, senza passare dalla base 10: ciò avviene quando
n = mk oppure m = nk, con k 
In altri termini, se le basi di origine e di destinazione sono l’una potenza
dell’altra, è applicabile un metodo di conversione diretta. Questa può essere
svolta per sostituzione di gruppi di cifre invece che con algoritmi di divisione.
Se n = mk, allora k cifre del numero nella base originaria m vengono sostituite
con singole cifre nella nuova base n. E’ il caso di m = 2 ed n = 16, ad
esempio.
Viceversa, se m = nk, allora ogni singola cifra del numero nella base originaria
m viene espansa in k cifre nella nuova base n. E’ il caso di m = 9 ed n = 3, ad
esempio.
Nel seguito si proporranno anche esercizi di conversione diretta.
55
4.3.1 | E SERCIZIO
Testo
Si converta x = 249 in binario.
Soluzione
La soluzione prevede una doppia conversione: da base 9 a base 10, quindi da
base 10 in base 2.
x = 249 = (2·91 + 4·90)10 = 2210
Con il metodo delle divisioni successive:
22 2
11 0
5 1
2 1
1 0
0 1
x = 249 = 101102
56
4.3.2 | E SERCIZIO
Testo
Si converta x = 102345 in base 7.
Soluzione
La soluzione prevede una doppia conversione: da base 5 a base 10, quindi da
base 10 in base 7.
x = 102345 = (1·54 + 2·52 + 3·51 + 4·50)10 = 69410
Con il metodo delle divisioni successive:
694 7
99 1
14 1
2 0
0 2
x = 102345 = 20117
57
4.3.3 | E SERCIZIO
Testo
Si converta il numero binario x = 110110002 in esadecimale utilizzando il
metodo diretto.
Allo stesso modo si converta il numero esadecimale x = AD0216 in binario.
Soluzione
Le basi di origine e destinazione sono rispettivamente m = 2 ed n = 16, ed n è
una potenza di m. In particolare, n = m4 il che rende possibile operare la
conversione tramite un algoritmo di sostituzione: 4 cifre del numero in base
m verranno sostituite da 1 cifra del numero in base n, secondo lo schema:
2
16
0000
0
0001
1
0010
2
0011
3
0100
4
0101
5
0110
6
0111
7
1000
8
1001
9
1010
A
1011
B
Per evidenziare graficamente i gruppi di cifre da sostituire, si utilizzeranno
delle linee verticali.
Pertanto:
x = 110110002 = 11012|10002 = D816
Procedendo invece per espansione, si ottiene:
y = A16|D16|016|216 = 10102|11012|00002|00102 = 10101101000000102
58
1100
C
1101
D
1110
E
1111
F
4.3.4 | E SERCIZIO
Testo
Si converta il numero binario x = 10010112 in ottale utilizzando il metodo
diretto.
Soluzione
Le basi di origine e destinazione sono rispettivamente m = 2 ed n = 8, ed n è
una potenza di m. In particolare, n = m3 il che suggerisce di raggruppare le
cifre in gruppi da 3 ed applicare lo schema di sostituzione:
2
8
000
0
001
1
010
2
011
3
100
4
101
5
110
6
111
7
Procediamo ora all’evidenziazione dei gruppi da sostituire. Si osservi che in
questo caso il numero di cifre di x in base 2 non è un multiplo di 3.
Sarebbe errato procedere a un raggruppamento di questo tipo:
x = 1002|1012|12
in quanto tale scrittura sottende implicitamente y = 1001010012 ed è
immediato verificare (ad esempio convertendo entrambi in base 10) che
x ≠ y.
Il modo corretto di procedere è il seguente: aggiungere le cifre necessarie ad
arrivare a un multiplo di 3 ponendo degli zeri come cifre più significative, in
quanto:
10010112 = 0010010112
Ragionando in base 10, sarebbe come riscrivere il numero
45 come 045 o 0045: ne cambia la rappresentazione
grafica, ma non la semantica. Diverso sarebbe riscrivere 45
come 405 o 4500!
A questo punto, si può procedere nel raggruppamento:
x = 0012|0012|0112 = 1138
59
4.3.5 | E SERCIZIO
Testo
Si converta il numero x = 2123 in base 9, ed il numero y = 8319 in base 3.
Soluzione
Nel caso di x, le basi di origine e destinazione sono rispettivamente m = 3 ed
n = 9, con n = m2. Di conseguenza è necessario raggruppare le cifre in gruppi
da 2, aggiungere eventuali zeri all’inizio ed applicare lo schema di
sostituzione:
3
9
00
0
01
1
02
2
10
3
11
4
12
5
20
6
21
7
22
8
Ne risulta:
x = 2123 = 023|123 = 259
Come verifica, è sempre possibile convertire entrambe le rappresentazioni in
base 10 e verificarne l’uguaglianza.
x = 2123 = (2·32 + 1·31 + 2·30)10 = (18 + 3 + 2)10 = 2310
x = 259 = (2·91 + 5·90)10 = (18 + 5)10 = 2310
Per quanto riguarda y:
y = 8319 = 223|103|013 = 2210013
Verifica:
y = 8319 = (8·92 + 3·91 + 1·90)10 = (648 + 27 + 1)10 = 67610
y = 2210013 = (2·35 + 2·34 + 1·33 + 1·30)10 = (486 + 162 + 27 + 1)10 =
= 67610
60
4.3.6 | E SERCIZIO *
Testo
Si consideri la codifica US-ASCII dei caratteri alfanumerici.
Si codifichi la parola “Computer” in esadecimale sfruttando la seconda
colonna della tabella sotto riportata, e si provveda quindi a rappresentarla in
base 2 come una stringa di 8 bit.
Soluzione
Sfruttando la tabella della codifica ASCII si giunge alla seconda riga della
tabella sotto riportata. Infine, la terza riga è ottenuta per espansione dei
caratteri esadecimali.
C
4 3
o
6 F
6
m
D
p
7 0
u
7 5
t
7 4
e
6 5
r
7 2
01000011 01101111 01101101 01110000 01110101 01110100 01100101 01110010
61
4.4 | O PERAZIONI ARITMETICHE
In questo paragrafo verrà affrontato l’argomento delle operazioni aritmetiche
elementari in base 2. Tali operazioni sono:

addizione o somma

sottrazione o differenza

moltiplicazione o prodotto

divisione
Si rammenta che la scelta della base non influenza le proprietà delle
operazioni aritmetiche, che pertanto si mantengono anche in base 2. Ad
esempio, le proprietà commutativa e associativa della somma sono
indipendenti dalla base, così come il fatto che lo 0 ne sia l’elemento neutro10
(in qualunque base lo si rappresenti).
Analogamente, i procedimenti appresi nei propri studi primari potranno
essere applicati alla nuova base, considerando però che il numero di regole da
imparare per ciascun operatore aritmetico è limitato a 22. Infatti, per ogni
operatore a 2 ingressi, l’uscita generica è data dallo studio di tutte le
combinazioni in ingresso, che nell’algebra binaria sono 2 per ciascun
ingresso.
In base 10, la determinazione di tutte le combinazioni in
ingresso porta allo studio di 102 casi differenti. Ad esempio,
le regole dell’addizione (operatore +) contemplano:
0 + 0 ; 0 + 1 ; 0 + 2; … ; 9 + 7 ; 9 + 8 ; 9 + 9.
Nel corso del presente paragrafo si prenderanno in considerazione i numeri
non negativi (sia come operandi che come risultati delle operazioni
aritmetiche), rimandando al prossimo paragrafo la rappresentazione dei valori
negativi e le relative operazioni.
Il risultato della somma di un qualsiasi numero n con lo 0 (elemento neutro) dà il numero
n stesso. L’elemento neutro della moltiplicazione è l’1.
10
62
4.4.1 | E SERCIZIO
Testo
Una volta convertiti gli addendi dalla base 10 alla base 2, si effettui
l’operazione di addizione in base 2 avendo cura di evidenziare gli eventuali
riporti; infine si verifichi il risultato riconvertendolo in base 10.
v = a + b = 1310 + 610
w = c + d = 910 + 710
x = e + f = 7310 + 1010
y = g + h = 9110 + 4610
z = i + l = 5,7510 + 2,510
Soluzione
Le quattro regole da applicare sono le seguenti:

0+0=0

0+1=1

1+0=1

1 + 1 = 0 con il riporto di 1
Alla luce di queste semplici regole, è possibile procedere nel calcolo seguendo
i procedimenti appresi nei propri studi primari lavorando in base 10.
a = 1310 = 11012
1101 +
110 =
b = 610 = 1102
1
v = 100112 = (1·2 + 1·2 + 1·2 )10 = 1910
4
1
0
10011
c = 910 = 10012
1001 +
111 =
d = 710 = 1112
1 1 1
w = 100002 = (1·2 )10 = 1610
4
e = 7310 = 10010012
f = 1010 = 10102
x = 10100112 = (1·26 + 1·24 + 1·21 + 1·20)10 = 8310
63
10000
1001001 +
1010 =
1
1010011
g = 9110 = 10110112
1011011 +
101110 =
h = 4610 = 1011102
1 1 1 1 1 1
y = 100010012 = (1·27 + 1·23 + 1·20)10 = 13710
10001001
Attenzione: considerando i riporti, sulla quarta cifra da destra si verifica la
necessità di calcolare 1 + 1 + 1, che non è immediatamente risolvibile
applicando le quattro regole elementari sopra esposte. In questo caso,
intuitivamente, si può estendere la regola “1 + 1 = 0 con il riporto di 1”
considerando “1 + 1 + 1 = 1 con il riporto di 1”. Però, in generale serve
saper gestire la somma di un numero arbitrario di 1 in colonna.11 In casi
particolarmente complessi, è possibile applicare la proprietà associativa della
somma:
a + b + c = (a + b) + c
In tal modo, l’operazione può essere suddivisa in più operazioni elementari,
ove risultano sempre applicabili le regole base dell’addizione.
i = 5,7510 = 101,112
101,11 +
10,10 =
l = 2,510 = 10,12
1 1 1 1
z = 1000,012 = (1·23 + 1·2-2)10 = 8,2510
1000,01
La somma di numeri espressi in virgola fissa segue le stesse regole sopra
esposte,
con
l’accortezza
di
allineare
le
virgole
e
aggiungere
conseguentemente degli 0 come cifre meno significative ove richiesto.
Si vedano a questo proposito gli esercizi sulla moltiplicazione, che per essere risolti
manualmente richiedono la somma di tanti addendi quante sono le n cifre non nulle del
secondo fattore. In tal caso, si potrebbero trovare fino a n 1 da sommare in colonna.
11
64
4.4.2 | E SERCIZIO
Testo
Una volta convertiti i valori dalla base 10 alla base 2, si effettui l’operazione
di sottrazione in base 2 avendo cura di evidenziare gli eventuali prestiti; infine
si verifichi il risultato riconvertendolo in base 10.
v = a - b = 1310 - 410
w = c - d = 2310 - 1310
x = e - f = 2610 - 510
y = g - h = 910 - 710
z = i - l = 12, 510 - 110
Soluzione
Le quattro regole da applicare sono le seguenti:

0-0=0

0 - 1 = 1 con il prestito di 1

1-0=1

1-1=0
Alla luce di queste semplici regole, è possibile procedere nel calcolo seguendo
i procedimenti appresi nei propri studi primari lavorando in base 10.
a = 1310 = 11012
1101 100 =
1001
b = 410 = 1002
v = 10012 = (1·23 + 1·20)10 = 910
c = 2310 = 101112
10111 +
1101 =
d = 1310 = 11012
1
w = 10102 = (1·2 + 1·2 )10 = 1010
3
1
e = 2610 = 110102
f = 510 = 1012
x = 101012 = (1·24 + 1·22 + 1·20)10 = 2110
65
1010
11010 +
101 =
1
1
10101
g = 910 = 10012
1001 +
111 =
h = 710 = 1112
1
y = 102 = (1·21)10 = 210
0010
Attenzione: considerando i prestiti, sulla terza cifra da destra si verifica la
necessità di calcolare 0 – (1 + 1), che non è immediatamente risolvibile
applicando le quattro regole elementari sopra esposte. In questo caso, si può
tenere presente che (1 + 1)2 = 102 e procedere da qui in avanti ponendo le 2
cifre più significative di h a 10. In casi più complessi, è possibile applicare la
proprietà:
a – (b + c) = (a – b) – c
In tal modo, l’operazione può essere suddivisa in più operazioni elementari,
ove risultano sempre applicabili le regole base della sottrazione.
i = 12,510 = 1100,12
1100,1 +
1,0 =
l = 110 = 12
1 1
z = 1011,12 = (1·2 + 1·2 + 1·2 + 1·2 )10 = 11,510
3
1
0
-1
1011,1
La differenza di numeri espressi in virgola fissa segue le stesse regole sopra
esposte,
con
l’accortezza
di
allineare
le
virgole
e
aggiungere
conseguentemente degli 0 come cifre meno significative ove richiesto.
L’introduzione della notazione in complemento a 2 per
rappresentare i valori negativi renderà sostanzialmente
inutile l’operazione di differenza, che verrà implementata
come operazione di somma tra valori con segno. Ad
esempio, l’operazione
a=b–c
verrà gestita come
a = b + (-c)
66
4.4.3 | E SERCIZIO
Testo
Una volta convertiti i fattori dalla base 10 alla base 2, si effettui l’operazione
di moltiplicazione in base 2; infine si verifichi il risultato riconvertendolo in
base 10.
v = a · b = 910 · 210
w = c · d = 9210 · 410
x = e · f = 2810 · 510
y = g · h = 2310 · 710
z = i · l = 2,510 · 310
Soluzione
Le quattro regole da applicare sono le seguenti:

0·0=0

0·1=0

1·0=0

1·1=1
Tali regole possono anche essere sintetizzate come segue: qualsiasi cifra
moltiplicata per 0 dà 0, e qualsiasi cifra moltiplicata per 1 dà la cifra stessa.
Nell’ottica del procedimento manuale di risoluzione, si osservi che in
generale qualsiasi numero moltiplicato per 0 dà 0, e qualsiasi numero
moltiplicato per 1 dà il numero stesso. Queste regole rendono
particolarmente agevole la costruzione degli addendi che poi portano al
risultato finale. Graficamente, nell’addizione conclusiva si utilizzerà un
trattino (che rappresenta più propriamente una cifra 0) come segno di
spaziatura.
a = 910 = 10012
b = 210 = 102
v = 100102 = (1·24 + 1·21)10 = 1810
67
1001 ×
10 =
0
100110010
c = 9210 = 10111002
d = 410 = 1002
w = 1011100002 = (1·28 + 1·26 + 1·25 + 1·24)10 =
= 36810
1011100 ×
100 =
0
01011100-101110000
Dall’analisi dei risultati in binario ottenuti per v e w,
enunciamo una regola generale: moltiplicando una stringa di
bit arbitraria per un’altra stringa costituita da un solo 1
seguito da n 0 (che chiaramente corrisponde a una potenza
di 2), si ottiene uno shift verso sinistra della prima stringa
per un numero di posizioni n (riempite con altrettanti 0 nel
risultato).
Dal punto di vista matematico, questo è facilmente
deducibile. Ragionando in base 10 sul primo esempio:
10012·102 = ((1 · 23 + 1 · 20) · 21)10 =
= (1 · 23 · 21 + 1 · 20 · 21)10 =
= (1 · 24 + 1 · 21)10 =
= 100102
e = 2810 = 111002
f = 510 = 1012
x = 100011002 = (1·27 + 1·23 + 1·22)10 = 14010
11100 ×
101 =
11100
011100-1 1 1
10001100
g = 2310 = 101112
h = 710 = 1112
y = 102 = (1·21)10 = 210
10111 ×
111 =
10111
1011110111-1
?????01
68
In questo caso sulla terza colonna si verifica la necessità di sommare quattro
1. Applicando la proprietà distributiva della somma, è possibile computare il
risultato spezzando la somma in due operazioni di addizione:
t = (10111 + 101110)2
y = t + 10111002 = 101000012 = 16110
i = 2,510 = 10,12
l = 310 = 112
z = 111,12 = (1·22 + 1·21 + 1·20 + 1·2-1)10 = 7,510
69
10,1 ×
11 =
10 1
101 111,1
4.4.4 | E SERCIZIO
Testo
Una volta convertiti dividendi e divisori dalla base 10 alla base 2, si effettui
l’operazione di divisione intera in base 2; infine si verifichi il risultato
riconvertendolo in base 10.
x = a / b = 2510 / 510
y = c / d = 2310 / 710
z = e / f = 13410 / 210
Soluzione
Le regole da applicare si riconducono a soli 2 casi:

o il divisore è contenuto 1 volta nel dividendo, e il resto è dato da
dividendo meno divisore;

oppure il divisore è contenuto 0 volte nel dividendo, e il resto è dato
dall’intero dividendo.
x = a / b = 2510 / 510 = 110012 / 1012
I passaggio: quante volte sta 101 in 1? 0
11001 / 101 = 00101
volte con il resto di 1 – 0 = 1.
11
II passaggio: aggiungo in coda al resto la
110
seconda cifra del dividendo, ossia 1.
10
Quante volte sta 101 in 11? 0 volte con il
101
resto di 11 – 0 = 11.
0
III passaggio: aggiungo in coda al resto la terza cifra del dividendo, ossia 0.
Quante volte sta 101 in 110? 1 volta con il resto di 110 – 101 = 1.
IV passaggio: aggiungo in coda al resto la quarta del dividendo, ossia 0.
Quante volte sta 101 in 10? 0 volte con il resto di 10 – 0 = 10.
V passaggio: aggiungo in coda al resto la quinta cifra del dividendo, ossia 1.
Quante volte sta 101 in 101? 1 volta con il resto di 101 – 101 = 0.
x = 110012 / 1012 = 1012 = 510 con resto 0.
70
y = c / d = 2310 / 710 = 101112 / 1112
I passaggio: quante volte sta 111 in 1? 0
10111 / 111 = 00011
volte con il resto di 1 – 0 = 1.
10
II passaggio: aggiungo in coda al resto la
101
seconda cifra del dividendo, ossia 0.
1011
Quante volte sta 111 in 10? 0 volte con il
1001
resto di 10 – 0 = 10.
10
III passaggio: aggiungo in coda al resto la terza cifra del dividendo, ossia 1.
Quante volte sta 111 in 101? 0 volte con il resto di 101 – 0 = 101.
IV passaggio: aggiungo in coda al resto la quarta del dividendo, ossia 1.
Quante volte sta 111 in 1011? 1 volta con il resto di 1011 – 111 = 100.
V passaggio: aggiungo in coda al resto la quinta cifra del dividendo, ossia 1.
Quante volte sta 111 in 1001? 1 volta con il resto di 1001 – 111 = 10.
x = 110012 / 1012 = 112 = 310 con resto 102 = 210.
z = e / f = 13410 / 210= 100001102 / 102
10000110 / 10 = 01000011
10
00
00
00
01
11
10
0
z = 100001102 / 102 = 10000112 = 6710 con resto 0.
71
4.5 | N UMERI NEGATIVI
Esistono differenti metodi alternativi per rappresentare i numeri negativi in
binario. Tra questi, ricordiamo:
1. Segno e modulo;
2. Complemento a 1;
3. Complemento a 2;
4. Notazione in eccesso n.
Nei primi tre casi, il bit più significativo è utilizzato per la codifica del segno:
0 denota il segno positivo e 1 denota il segno negativo. Si osservi che i
numeri non negativi presentano la stessa codifica in segno e modulo,
complemento a 1 e complemento a 2.
Nel quarto caso, invece, le stringhe binarie il cui bit più significativo è posto
a 1 indicano valori non negativi, mentre le stringhe che iniziano per 0
rappresentano valori negativi.
72
4.5.1 | E SERCIZIO
Testo
Si indichi esplicitamente l’intervallo di valori rappresentabili con i 4 metodi
sopra esposti quando il numero di bit n che compone la stringa binaria è pari
a 5.
Soluzione
Ricordiamo che in segno e modulo ed in complemento a 1 l’intervallo di
valori rappresentabili è:
[–(2n - 1 – 1) … +(2n - 1 – 1)]
Pertanto, per n = 5:
[–(24 – 1) … +(24 – 1)]
[–15 … +15]
In complemento a 2 e in notazione eccesso x, l’intervallo di valori
rappresentabili diventa:
[–2n - 1 … +(2n - 1 – 1)]
Pertanto, per n = 5:
[–16 … +15]
Attenzione: in questo caso, il quarto metodo non prende il
nome di notazione eccesso 5. Infatti, il valore numerico che
segue la parola “eccesso” è dato dalla differenza tra il valore
positivo normalmente codificato dalla stringa 10000
(quindi ignorando il bit di segno)12 e quello attribuito
arbitrariamente a tale combinazione di bit, ossia lo 0. Con
5 bit, si parla di notazione eccesso 16.
12 Più genericamente, da una stringa di n bit in cui il solo bit più significativo è posto a 1 e
tutti i successivi bit sono posti a 0.
73
4.5.2 | E SERCIZIO
Testo
Si considerino i quattro metodi di rappresentazione dei numeri negativi sopra
esposti. Sia n = 4 il numero di bit disponibile per la codifica dei valori
numerici. Si dica quali metodi consentono di rappresentare il valore +7, e
quali il valore -8.
Soluzione
Applicando le formule dell’esercizio precedente, si evince che gli intervalli di
valori rappresentabili con 4 bit sono rispettivamente

Segno e modulo: [–7 … +7]

Complemento a 1: [–7 … +7]

Complemento a 2: [–8 … +7]

Notazione eccesso 8: [–8 … +7]
Di conseguenza, tutti i metodi sono in grado di rappresentare il valore +7,
mentre solo gli ultimi due presentano all’interno dell’intervallo il valore –8.
Tentare di rappresentare il valore –8 in segno e modulo o in complemento a
1 provocherebbe un errore di overflow, ossia di travalicamento dell’intervallo di
valori rappresentabili.
74
4.5.3 | E SERCIZIO
Testo
Si rappresentino i seguenti valori rispettivamente nelle notazioni in segno e
modulo, complemento a 1 e complemento a 2. Si utilizzino 8 bit per le
stringhe binarie così ottenute.
a = 1310
b = –310
c = –1510
d = –2010
e = –7210
Soluzione
a ha valore positivo, per cui la sua rappresentazione è identica in tutte le
notazioni. E’ sufficiente preporre come bit più significativo lo 0 (segno +) e
quindi rappresentare sui restanti 7 bit il modulo di a. Utilizzando ad esempio
il metodo delle divisioni successive, si ottiene |a| = 1310 = 11012. Pertanto:
a= 0 0 0 0 1 1 0 1
Nel caso di valori negativi, è comunque necessario calcolare la
rappresentazione binaria su n bit del modulo.
|b| = 310 = 112
In segno e modulo:
b= 1 0 0 0 0 0 1 1
In complemento a 1, la rappresentazione su 8 bit del modulo va
complementata.
|b|= 0 0 0 0 0 0 1 1
b= 1 1 1 1 1 1 0 0
Infine, il complemento a 2 condivide i primi passi della procedura del
complemento a 1, ma infine è necessario sommare 1 al complemento.
|b|= 0 0 0 0 0 0 1 1
b= 1 1 1 1 1 1 0 1
Si osservi qual è il legame tra |b| e b in complemento a 2:
la stringa binaria, letta da destra verso sinistra, è identica
75
fino al primo 1 compreso, e viene complementata per i
restanti bit. Tale regola è del tutto generale, e può essere
utilizzata validamente come scorciatoia nei calcoli o come
verifica della correttezza del risultato.
Ripetiamo ora il procedimento per c.
|c| = 1510 = 11112
In segno e modulo:
c=
1 0 0 0 1 1 1 1
In complemento a 1:
|c|=
0 0 0 0 1 1 1 1
c= 1 1 1 1 0 0 0 0
Infine, il complemento a 2 condivide i primi passi della procedura del
complemento a 1, ma infine è necessario sommare 1 al complemento.
|c|=
0 0 0 0 1 1 1 1
c= 1 1 1 1 0 0 0 1
Analogamente:
|d| = 2010 = 101002
In segno e modulo:
d= 1 0 0 1 0 1 0 0
In complemento a 1:
|d|= 0 0 0 1 0 1 0 0
d= 1 1 1 0 1 0 1 1
In complemento a 2:
|d|= 0 0 0 1 0 1 0 0
d= 1 1 1 0 1 1 0 0
Infine:
|e| = 7210 = 10010002
In segno e modulo:
e=
1 1 0 0 1 0 0 0
In complemento a 1:
|e|=
0 1 0 0 1 0 0 0
e= 1 0 1 1 0 1 1 1
In complemento a 2 :
|e|=
76
0 1 0 0 1 0 0 0
e= 1 0 1 1 1 0 0 0
4.5.4 | E SERCIZIO
Testo
Si considerino le seguenti stringhe di 4 bit. Le si interpreti come valori interi
espressi rispettivamente in segno e modulo, complemento a 1, complemento
a 2 e notazione in eccesso 8.
a = 01112
b = 11012
c = 10102
Soluzione
Secondo i primi tre metodi, a ha valore positivo dato che il suo bit di segno è
posto a 0. Pertanto, una volta scorporato il bit di segno13, nelle tre notazioni
a = (1·22 + 1·21 + 1·20)10 = 710.
Per valutare il valore in eccesso 8, è necessario calcolare di quanto la stringa
in oggetto preceda o segua la rappresentazione convenzionale dello 0, che in
questo caso (con 4 bit) è 1000.
0000
-8
0001
-7
0010
-6
0011
-5
0100
-4
0101
-3
0110
-2
0111
-1
1000
0
1001
1
1010
2
1011
3
La stringa 0111 precede immediatamente la stringa 1000, e dunque a = –110.
Considerando ora b = 11012, il bit più significativo è posto a 1 e pertanto si
tratta di un numero negativo in tutte le notazioni. Fa eccezione l’eccesso 8 in
cui, come si evince dalla tabella sopra, b = 510.
In segno e modulo, scorporando il bit più significativo dai restanti 3 si evince
che
|b| = 1012 = 510
e dunque
b = –510.
13
77
Scorporare il bit di segno non è strettamente necessario, essendo posto a 0.
1100
4
1101
5
1110
6
1111
7
In complemento a 1, è necessario complementare i 4 bit per determinare il
modulo.
|b| = 00102 = 210
e dunque
b = –210.
Infine, in complemento a 2 è necessario dapprima sottrarre 1 per poi
complementare i 4 bit risultanti al fine di determinare il modulo.
|b| = 00112 = 310
e dunque
b = –310.
Considerando infine c = 10102, il bit più significativo è posto a 1 dunque si
tratta ancora una volta di un numero negativo in tutte le notazioni tranne che
in eccesso 8, ove b = 210.
In segno e modulo, scorporando il bit più significativo dai restanti 3 si evince
che
|c| = 0102 = 210
e dunque
c = –210.
In complemento a 1, è necessario complementare i 4 bit per determinare il
modulo.
|c| = 01012 = 510
e dunque
c = –510.
Infine, in complemento a 2 è necessario dapprima sottrarre 1 per poi
complementare i 4 bit risultanti al fine di determinare il modulo.
|c| = 01102 = 610
e dunque
c = –610.
78
4.6 | S OMME IN COMPLEMENTO A 2
Negli elaboratori viene solitamente adottata la notazione in complemento a 2.
Tra i suoi vantaggi più rilevanti:

lo 0 ha una sola rappresentazione (0|00…00), in quanto la sequenza
1|00…00 rappresenta l’intero -2n-1;

la sottrazione viene trattata esattamente come la somma, a patto di
codificare i valori con il loro segno.
L’operazione
a=b+c
viene eseguita dallo stesso circuito che si occupa di calcolare
a = b – c = b + (–c)
oppure
a = –b – c = (–b) + (–c)
In termini implementativi, è un grande vantaggio avere un unico circuito
sommatore in grado di effettuare anche l’operazione di differenza.
Per eseguire la somma tra due interi in complemento a 2 con n bit si esegue la
somma bit a bit dei due numeri ignorando sempre l’eventuale riporto che
cade oltre il bit più significativo. Questo può originare problemi di overflow,
quando il risultato dell’operazione di somma travalichi il limite superiore o
inferiore dell’intervallo di valori rappresentabili.
Si noti che solo una somma tra valori negativi o tra valori
positivi può portare a situazioni di overflow. L’overflow
invece non ha mai luogo quando si somma un valore
negativo x a un valore positivo y, in quanto il risultato
rientrerà matematicamente nell’intervallo [x … y], che è di
certo contenuto in [-2n-1…2n-1-1] dato che x e y possono
essere rappresentati su n bit.
In complemento a 2 gli errori di overflow sono rilevabili in
quanto due addendi di segno positivo originano un risultato
di segno negativo, o viceversa.
79
4.6.1 | E SERCIZIO
Testo
Si effettuino le seguenti addizioni rappresentando gli addendi con 4 bit in
complemento a 2. Si curi di mostrare tutti i riporti e di evidenziare eventuali
situazioni di overflow.
w = a + b = (–7 + 2)10
x = c + d = (7 – 2)10
y = e + f = (7 + 2)10
z = g + h = (7 + 2)10
Soluzione
Innanzi tutto, osserviamo che in complemento a 2 l’intervallo di valori
rappresentabili con n bit è:
[–2n - 1 … +(2n - 1 – 1)]
Pertanto, per n = 4:
[–8 … +7]
Di conseguenza, esistono almeno 2 motivi a priori per cui è lecito aspettarsi
che w e x non originino overflow:
1. si tratta di somme tra addendi rappresentabili con 4 bit e di segno
opposto;
2. il risultato dell’operazione in base 10 non valica i limiti dall’intervallo.
Per gli stessi motivi, y e z potrebbero generare overflow (punto 1) e il calcolo
del risultato in base 10 (punto 2) ce lo conferma.
a = –710 = 10012
1001 +
0010 =
1011
b = 210 = 102
w = 10112 = –510
c = 710 = 01112
d = –210 = 11102
x = 01012 = 510
80
0111 +
1110 =
1
1 1
(1)0101
Si noti che aver scartato il riporto oltre i 4 bit non inficia il risultato
dell’operazione, e non va considerata una situazione di overflow.
e = 710 = 01112
0111 +
0010 =
f = 210 = 00102
1 1
y = 10012 = –710 (overflow)
1001
Della situazione di overflow ci si può accorgere semplicemente confrontando
i bit di segno degli addendi, che pur essendo concordi generano un risultato
di segno opposto.
g = –710 = 10012
h = –210 = 11102
z = 01112 = 710 (overflow)
1001 +
1110 =
1
1 1
(1)0111
L’overflow non è dato dalla necessità di scartare il bit più significativo in
quinta colonna, bensì dal fatto che i bit di segno sulla quarta colonna siano
concordi per gli addendi e diversi da quello del risultato.
81
4.6.2 | E SERCIZIO
Testo
Si effettuino le seguenti addizioni rappresentando gli addendi con 6 bit in
complemento a 2. Si curi di mostrare tutti i riporti e di evidenziare eventuali
situazioni di overflow.
w = a + b = (30 + 2)10
x = c + d = (24 – 16)10
y = e + f = (–19 – 1)10
z = g + h = (–12 + 8)10
Soluzione
a = 3010 = 0111102
011110 +
000010 =
b = 210 = 0000102
1 1 1
w = 1000002 = –3210 (overflow)
100000
c = 2410 = 0110002
011000 +
110000 =
d = –1610 = 1100002
x = 10002 = 810
1
e = –1910 = 1011012
f = –110 = 1111112
w = 1011002 = –2010
g = –1210 = 1101002
h = 810 = 0010002
z = 1111002 = –410
82
1
(1)001000
101101 +
111111 =
1
1 1 1 1 1
(1)101100
110100 +
001000 =
111100
5 | EXTENSIBLE MARKUP LANGUAGE
Nei paragrafi di questo capitolo verranno considerati dapprima i documenti
in XML, di cui si dovrà studiare la correttezza della forma (well formedness), per
poi analizzare le Document Type Definition, legate ai concetti di classe di
documenti e di validità (validity).
5.1 | C ORRETTEZZA DELLA FORMA
Negli esercizi proposti di seguito si richiede di concentrarsi unicamente sugli
aspetti sintattici dell’XML, ignorando eventuali implicazioni semantiche
(ossia relative al significato intrinseco della codifica dell’informazione).
5.1.1 | E SERCIZIO
Testo
Si provveda a evidenziare e correggere gli errori nel seguente blocco XML:
<agenzia codice="M13">
<titolare><NOME>Pippo</titolare></NOME>
</agenzia>
Soluzione
L’ordine di chiusura dei tag deve essere inverso rispetto a quello di apertura.
Dunque il tag <NOME> va chiuso prima della chiusura di <titolare>.
<agenzia codice="M13">
<titolare><NOME>Pippo</NOME></titolare>
</agenzia>
83
5.1.2 | E SERCIZIO
Testo
Si descrivano e correggano i 3 errori di well formedness che si presentano nel
seguente blocco XML.
<libro>
<TITOLO>Appunti</TITOLO lingua="ita">
<autore nome=Luca Ludovico />
</Libro>
Soluzione
Procedendo dall’esterno verso l’interno, il primo errore consiste nella
chiusura del tag <libro> con l’iniziale maiuscola. Si ricorda che l’XML è case
sensitive, dunque fa distinzione tra maiuscole e minuscole. Anche se può dar
origine a una scrittura poco elegante, non dà problemi usare indistintamente
tag con identificatori tutti minuscoli, o tutti maiuscoli, o con la sola iniziale
maiuscola; è però fondamentale mantenere la coerenza tra tag di apertura e di
chiusura.
In secondo luogo, l’elemento TITOLO presenta un attributo nel tag di
chiusura, sintassi non consentita dall’XML.
Infine, il valore dell’attributo nome dell’elemento autore non è incluso tra
apici doppi o singoli.
<libro>
<TITOLO lingua="ita">Appunti</TITOLO>
<autore nome="Luca Ludovico" />
</libro>
84
5.1.3 | E SERCIZIO
Testo
Si dica se il seguente blocco di codice XML è ben formato, in caso contrario
si evidenzino e correggano gli errori.
<archivio>
<scheda id="32">ABCDEF</scheda>
<scheda id="33">123456</scheda>
<scheda id="34"></scheda>
<scheda id="35" />
<scheda id="36">
</archivio>
Soluzione
Analizzando la sintassi XML, l’unico errore che emerge è la mancanza del tag
di chiusura per l’ultima occorrenza dell’elemento scheda. Tale errore può
essere corretto imitando la sintassi della scheda 34 o della scheda 35. Non è
invece errato (almeno da un punto di vista sintattico) avere degli elementi
vuoti, scritti in modo esteso (vedi scheda 34) o compatto (vedi scheda 35).
<archivio>
<scheda id="32">ABCDEF</scheda>
<scheda id="33">123456</scheda>
<scheda id="34"></scheda>
<scheda id="35" />
<scheda id="36" />
</archivio>
85
5.1.4 | E SERCIZIO
Testo
Si evidenzino e correggano gli eventuali errori di correttezza della forma nel
seguente blocco XML.
<negozio>
<cuccioli>
<animale></animale>
<animale specie="gatto">Fufi</animale>
<animale specie='cane'>"Pongo</animale>
</cuccioli>
</negozio>
Soluzione
Nel blocco XML riportato non vi sono errori, e dunque si tratta di XML ben
formato. Non dà problemi (dal punto di vista sintattico) la presenza di un
elemento vuoto e privo di attributi; non dà problemi nemmeno l’uso di apici
singoli anziché doppi per delimitare il valore degli attributi.
Infine, la presenza di un apice doppio aperto e non chiuso come contenuto
dell’ultima occorrenza di animale anch’essa non genera errore, in quanto il
contenuto testuale di un elemento può essere una qualsiasi combinazione di
caratteri alfanumerici, compresi i segni di interpunzione. Il nome dell’animale
Pongo preceduto da un apice doppio rappresenterà presumibilmente un
errore, ma non dal punto di vista sintattico.
86
5.1.5 | E SERCIZIO
Testo
Si evidenzino e correggano gli errori di correttezza della forma nel seguente
blocco XML.
<appunto>In data <data formato=gg/mm/aaaa>12/11/2000<data>
la
gara
d’appalto
è
stata
vinta
da
<impresa>Asfalti
&
Bitumi S.p.A.</impresa ragione_sociale="spa">. Gli importi
concordati
ammontano
a
<importi
valuta="euro"
cifra="120000" valuta="dollari" cifra="3495" /></appunto>.
Soluzione
Nel blocco in esame, non costituisce un problema il fatto che il contenuto
dell’elemento appunto sia misto (ossia una combinazione di testo semplice e
di sottoelementi).
Un primo errore è dato dalla mancanza di apici attorno al valore dell’attributo
formato.
Inoltre, l’elemento data non viene chiuso da un end tag.
L’attributo ragione_sociale è stato erroneamente inserito in un tag di
chiusura.
Infine vengono duplicati i nomi degli attributi valuta e cifra all’interno di
uno stesso tag.
Si noti che l’elemento importi non viene usato propriamente da un punto di
vista semantico, in quanto il suo contenuto non marchia un blocco di testo
dell’appunto (in altre parole, leggendo l’intero testo senza tag, l’ultima frase
diventa “Gli importi concordati ammontano a”). In ogni caso, questo non
costituisce un errore sintattico.
87
5.2 | D OCUMENTI XML
Gli esercizi proposti di seguito hanno l’obiettivo di codificare informazione
in XML tramite l’elaborazione di un documento ben formato. Si tratta di casi
di studio singoli, pertanto non viene richiesta l’analisi di una classe di
documenti né l’implementazione sotto forma di DTD (si veda il prossimo
paragrafo).
Implicitamente, ciascun esercizio si presta a una molteplicità di soluzioni
tutte accettabili. Per verificare la well formedness di soluzioni differenti rispetto
a quelle proposte, si suggerisce di risolvere i testi proposti all’interno di un
editor XML e di invocare la verifica della correttezza della forma.
5.2.1 | E SERCIZIO
Testo
Si rappresenti in sintassi XML ben formata la descrizione di un CD audio dal
titolo “One” e contenente le tracce “Help” e “Yesterday”.
Possibili soluzioni
<cd titolo="One">
<traccia titolo="Help" />
<traccia titolo="Yesterday" />
</cd>
<cd titolo="One">
<traccia>Help</traccia>
<traccia>Yesterday</traccia>
</cd>
<cd>
<titolo>One</titolo>
<tracce>
<traccia>Help</traccia>
<traccia>Yesterday</traccia>
</tracce>
</cd>
e via dicendo…
88
5.2.2 | E SERCIZIO
Testo
Si crei un documento XML ben formato contenente le informazioni su un
rivenditore di auto usate.
Il rivenditore dispone di più autovetture.
Le auto devono essere raggruppate per casa automobilistica tramite
un’opportuna marcatura.
Ogni auto, infine, è caratterizzata da una targa, un colore, un anno di
immatricolazione e un chilometraggio attuale (esprimibile in km o in miglia).
Il documento XML deve contenere almeno un attributo e almeno un
elemento vuoto.
Si dia esempio di tale documento ipotizzando un totale di 3 auto, di cui due
della stessa casa automobilistica.
Possibile soluzione
<rivenditore>
<casa nome="FIAT">
<auto targa="BJ324TT">
<colore>rosso</colore>
<anno>2000</anno>
<chilometraggio unità="km" valore="20000" />
</auto>
<auto targa="AD766FG">
<colore>grigio</colore>
<anno>2005</anno>
<chilometraggio unità="km" valore="72000" />
</auto>
</casa>
<casa nome="Rover">
<auto targa="HG721RE">
<colore>verde</colore>
<anno>1999</anno>
<chilometraggio unità="miglia" valore="33100" />
</auto>
</casa>
</rivenditore>
89
5.2.3 | E SERCIZIO
Testo
Si voglia creare un documento XML di esempio per descrivere una singola
canzone. In particolare:

la canzone è caratterizzata da uno e un solo titolo;

la canzone presenta un anno di pubblicazione;

la canzone può avere uno o più autori, ciascuno associabile a un ruolo
specifico;

la canzone può avere uno o più interpreti, ciascuno associabile a un ruolo
specifico.
Si esemplifichi quanto richiesto tramite codice ben formato, facendo uso di
almeno un elemento vuoto e di elementi con uno o più attributi.
Nella risoluzione dell’esercizio si utilizzino i seguenti dati:

Titolo: Volare;

Anno di pubblicazione: 1958;

Autori: Domenico Modugno (musica), Franco Migliacci (testo);

Interpreti: D. Modugno (voce).
Possibile soluzione
<canzone>
<titolo>Nel blu dipinto di blu</titolo>
<pubblicazione anno="1958"/>
<autori>
<autore ruolo="musica">Domenico Modugno</autore>
<autore ruolo="testo">Franco Migliacci</autore>
</autori>
<interpreti>
<interprete ruolo="voce">D. Modugno</interprete>
</interpreti>
</canzone>
90
5.3 | I NTERPRETAZIONE DI DTD
Nel presente paragrafo verrà richiesto di esaminare la sintassi di una DTD
per giungere a proporre un esempio di documento XML valido rispetto alla
DTD stessa.
Negli esercizi in cui si richiede di esemplificare tramite un documento quanto
stabilito nella DTD, si sottolinea che non è fondamentale comprenderne il
significato semantico; è sufficiente un’applicazione pedissequa delle regole
codificate. Allo stesso modo, i valori assegnati agli attributi o il contenuto
degli elementi testuali possono essere stringhe di esempio, quali “abc123”, o
eventualmente abbreviate con i puntini di sospensione.
Ogni esercizio si presta a una molteplicità di soluzioni corrette. Questo
aspetto influenza tanto la struttura del documento (ad esempio, quante volte
annidare un sottoelemento la cui cardinalità nella DTD è 0..n) quanto
l’inserimento di valori di prova per gli attributi e per gli elementi testuali (ad
esempio, quale stringa inserire come valore dell’attributo Autore).
Per testare la corretta risoluzione di un esercizio, si suggerisce di copiare
all’interno di un editor XML dotato di funzioni di validazione sia il DTD
(testo dell’esercizio) sia il documento (soluzione), sfruttando la possibilità
sintattica dell’XML di utilizzare i DTD interni. Il documento risultante avrà il
seguente aspetto:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Prova [
<!ELEMENT Prova (ElementoA,ElementoB)>
<!ELEMENT ElementoA EMPTY>
<!ELEMENT ElementoB (#PCDATA)>
<!ATTLIST ElementoA Attributo1 CDATA #IMPLIED>
]>
<Prova>
<ElementoA Attributo1="Prova" />
<ElementoB>Prova</ElementoB>
</Prova>
ove si nota la coesistenza della sintassi DTD e della sintassi propria del
documento XML. Tale codice può essere non solo verificato rispetto alla
correttezza della forma, ma anche validato.
91
5.3.1 | E SERCIZIO
Testo
Dato il seguente DTD, si proponga un documento di esempio.
<!DOCTYPE NEWSPAPER [
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (TITLE,BODY)>
<!ELEMENT BODY (#PCDATA)>
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>
]>
Possibile soluzione
<NEWSPAPER>
<ARTICLE AUTHOR="Luca" DATE="5/2/2010">
<TITLE>Botti di capodanno</TITLE>
<BODY>Anche quest'anno il numero di feriti...</BODY>
</ARTICLE>
<ARTICLE AUTHOR="Giovanni" EDITOR="Marco">
<TITLE>Inter in fuga</TITLE>
<BODY>Il campionato sta per...</BODY>
</ARTICLE>
</NEWSPAPER>
Osservazioni
Tutti gli identificatori (elementi ed attributi) vanno scritti completamente in
caratteri maiuscoli, come imposto dal DTD.
L’attributo AUTHOR di ARTICLE è richiesto, dunque deve esistere per ogni
occorrenza di ARTICLE. Gli altri attributi invece sono tutti opzionali, e si è
scelto arbitrariamente di esemplificare DATE e EDITOR, ma si sarebbero potuti
inserire tutti in ogni occorrenza di ARTICLE così come si sarebbero potuti
sempre omettere.
I sottoelementi TITLE e BODY devono comparire esattamente in quest’ordine.
92
5.3.2 | E SERCIZIO
Testo
Dato il seguente DTD, si proponga un documento di esempio.
<!DOCTYPE Legge [
<!ELEMENT Legge (TitoloLegge,Articolato) >
<!ELEMENT TitoloLegge (#PCDATA)>
<!ELEMENT Articolato (Capo+)>
<!ELEMENT Capo (Rubrica?,Articolo+)>
<!ELEMENT Rubrica (#PCDATA)>
<!ELEMENT Articolo (Rubrica?,Comma+)>
<!ELEMENT Comma (#PCDATA)>
<!ATTLIST Capo Num CDATA #REQUIRED>
<!ATTLIST Articolo Num CDATA #REQUIRED>
<!ATTLIST Comma Num CDATA #REQUIRED>
]>
Possibile soluzione
<Legge>
<TitoloLegge>Disciplina delle associazioni</TitoloLegge>
<Articolato>
<Capo Num="I">
<Rubrica>DISPOSIZIONI GENERALI</Rubrica>
<Articolo Num="1">
<Rubrica>Finalità e oggetto della legge</Rubrica>
<Comma Num="1">La Repubblica...</Comma>
</Articolo>
</Capo>
<Capo Num="II">
<Articolo Num="1">
<Comma Num="1">La Repubblica...</Comma>
<Comma Num="2">I soggetti...</Comma>
</Articolo>
</Capo>
</Articolato>
</Legge>
93
5.3.3 | E SERCIZIO
Testo
Dato il seguente DTD, si proponga un documento di esempio.
<!DOCTYPE Catalogo [
<!ELEMENT Catalogo (Dipinto|Scultura)+>
<!ELEMENT Dipinto (Autore,Titolo)>
<!ELEMENT Scultura (Autore,Titolo)>
<!ELEMENT Autore EMPTY>
<!ELEMENT Titolo (#PCDATA)>
<!ATTLIST Catalogo UltimoAggiornamento CDATA #REQUIRED>
<!ATTLIST Dipinto Tecnica (acquerello|tempera|olio|mista)
#REQUIRED>
<!ATTLIST Autore Nome CDATA #REQUIRED>
<!ATTLIST Autore Cognome CDATA #REQUIRED>
<!ATTLIST Autore Alias CDATA #IMPLIED>
]>
Possibile soluzione
Ricordando che la sintassi (Dipinto|Scultura)+ significa scegliere da 1 a n
volte uno dei due sottoelementi:
<Catalogo UltimoAggiornamento="12/10/2009">
<Scultura>
<Autore Nome="Antonio" Cognome="Canova"/>
<Titolo>Amore e Psiche</Titolo>
</Scultura>
<Dipinto Tecnica="acquerello">
<Autore Nome="Giovanni Antonio" Cognome="Canal"
Alias="Canaletto"/>
<Titolo>Veduta di Piazza San Marco</Titolo>
</Dipinto>
<Scultura>
<Autore Nome="Donato" Cognome="di Niccolò di Betto
Bardi" Alias="Donatello"/>
<Titolo>David</Titolo>
</Scultura>
</Catalogo>
94
5.3.4 | E SERCIZIO
Testo
Osservando il DTD e i documenti XML sotto riportati, si evidenzino gli
errori di validazione per ciascuno di essi.
<!DOCTYPE ESEMPIO [
<!ELEMENT ESEMPIO (P1, P2)>
<!ELEMENT P1 EMPTY>
<!ELEMENT P2(#PCDATA)>
<!ATTLIST P1 attributo CDATA #REQUIRED>
]>
Documento 1:
<Esempio>
<p1 attributo="valore" />
<p2>Bla bla bla</p2>
</Esempio>
Documento 2:
<ESEMPIO>
<P2>Bla bla bla</P2>
</ESEMPIO>
Documento 3:
<ESEMPIO>
<P1 />
<P2>Bla bla bla</P2>
</ESEMPIO>
Documento 4:
<ESEMPIO>
<P2>Bla bla bla</P2>
<P1 attributo="valore" />
</ESEMPIO>
Documento 5:
<ESEMPIO>
<P1 attributo="valore">Bli bli bli</P1>
<P2>Bla bla bla</P2>
</ESEMPIO>
95
Soluzione
Documento 1 non viene validato in quanto i tag non rispettano maiuscole e
minuscole imposte dalla DTD. Si ricorda che XML è case sensitive. Si osservi
che invece un semplice controllo della correttezza della forma non avrebbe
dato errore, in quanto i tag vengono aperti e chiusi in modo coerente.
Più in generale, si osservi che tutti i documenti proposti nella
soluzione risultano ben formati ma non validi. Essi non
violano regole sintattiche dell’XML, bensì le regole
aggiuntive imposte dalla specifica DTD.
Documento 2 non viene validato in quanto manca il sottoelemento P1, la cui
presenza è richiesta prima dell’occorrenza di P2.
Documento 3 non viene validato poichè in P1 manca l’attributo richiesto.
Documento 4 non viene validato in quanto P1 e P2, correttamente compilati,
si trovano però in posizione invertita rispetto a quanto richiesto dalla DTD.
Infine, Documento 5 presenta del contenuto testuale all’interno di P1, che
invece era stato dichiarato con empty content.
96
5.3.5 | E SERCIZIO
Testo
Osservando il DTD e il documento XML sotto riportato, si provveda a
renderlo ben formato e valido evidenziando gli errori dell’uno e dell’altro
tipo.
<!DOCTYPE FAMIGLIA [
<!ELEMENT FAMIGLIA (PERS*)>
<!ELEMENT PERS (#PCDATA)>
<!ATTLIST PERS NP ID #REQUIRED>
<!ATTLIST PERS PADRE IDREF #IMPLIED>
<!ATTLIST PERS MADRE IDREF #IMPLIED>
]>
<FAMIGLIA>
<PERS NP="a1">Susanna</PERS>
<pers NP=a2>Carlo</pers>
<PERS NP='a3' MADRE="a1">Maria</PERS>
<PERS NP="a4" PADRE="a2">Luca</PERS>
<PERS NP="a4" PADRE="a5">Stefano
</Famiglia>
Soluzione
Evidenziamo e risolviamo dapprima gli errori sintattici che portano il
documento a non essere ben formato secondo i dettami dell’XML.
<FAMIGLIA>
<PERS NP="a1">Susanna</PERS>
<pers NP=_a2_>Carlo</pers>
<PERS NP='a3' MADRE="a1">Maria</PERS>
<PERS NP="a4" PADRE="a2">Luca</PERS>
<PERS NP="a4" PADRE="a5">Stefano___
</Famiglia>
che pertanto diventa:
<FAMIGLIA>
<PERS NP="a1">Susanna</PERS>
<PERS NP="a2">Carlo</PERS>
<PERS NP='a3' MADRE="a1">Maria</PERS>
<PERS NP="a4" PADRE="a2">Luca</PERS>
<PERS NP="a4" PADRE="a5">Stefano</PERS>
</FAMIGLIA>
97
Analizzando ora il documento alla luce del DTD, si osserva innanzi tutto che
a4 è utilizzato due volte come valore di NP, il che non è ammesso per un
tokenized attribute di tipo ID.
Analogamente, l’attributo PADRE nell’ultima occorrenza di PERS è di tipo
IDREF, ma non punta ad alcun valore specificato per attributi di tipo ID.
Una possibile soluzione è la seguente:
<FAMIGLIA>
<PERS NP="a1">Susanna</PERS>
<PERS NP="a2">Carlo</PERS>
<PERS NP='a3' MADRE="a1">Maria</PERS>
<PERS NP="a4" PADRE="a2">Luca</PERS>
<PERS NP="a5" PADRE="a2">Stefano</PERS>
</FAMIGLIA>
Si osservi che un validatore effettua solo controlli di correttezza della forma e
di validità, ma non di coerenza semantica.
Dunque, non darebbe problema una riga quale
<PERS NP="a5" PADRE="a5">Stefano</PERS>
che afferma che Stefano è padre di se stesso, oppure quale
<PERS NP="a5" MADRE="a2">Stefano</PERS>
che individua implicitamente Carlo come madre di Stefano.
98
5.4 | F ORMULAZIONE DI DTD
Nel presente paragrafo verrà richiesto di studiare una classe di documenti per
giungere alla formulazione sintattica di una DTD. L’obiettivo dunque non
sarà più codificare in XML ben formato una ricetta di cucina, un brano di
musica o la nota relativa ad un appuntamento, bensì scrivere una DTD per
poter codificare (secondo i requisiti specificati) qualsiasi ricetta di cucina,
qualsiasi brano di musica o qualsiasi nota.
I documenti XML che rispettano queste regole aggiuntive potranno essere
verificati non solo per quanto concerne la well formedness, ma anche contro la
rispettiva DTD al fine di testarne la validity.
99
5.4.1 | E SERCIZIO
Testo
Si consideri il problema di progettare una DTD per codificare in XML le
singole e-mail. Ogni e-mail deve avere un singolo mittente, deve avere uno o
più destinatari in chiaro, può avere da 0 a molti destinatari in copia carbone
(CC), può avere da 0 a molti destinatari invisibili (BCC), può avere
un’intestazione e può avere un corpo testuale. Tutti gli elementi citati hanno
contenuto alfanumerico.
Inoltre, l’e-mail presenta alcuni attributi:

la lingua, che è di tipo testuale e la cui specificazione è opzionale;

la priorità, il cui valore è uno a scelta tra NORMAL, LOW e HIGH e
il cui valore predefinito è NORMAL.
Soluzione
<!DOCTYPE EMAIL [
<!ELEMENT EMAIL (FROM, TO+, CC*, BCC*, SUBJECT?, BODY?)>
<!ATTLIST EMAIL
LANGUAGE CDATA #IMPLIED
PRIORITY (NORMAL|LOW|HIGH) "NORMAL">
<!ELEMENT TO (#PCDATA)>
<!ELEMENT FROM (#PCDATA)>
<!ELEMENT CC (#PCDATA)>
<!ELEMENT BCC (#PCDATA)>
<!ELEMENT SUBJECT (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
]>
100
5.4.2 | E SERCIZIO
Testo
Si consideri il problema di progettare una DTD per rappresentare i metadati
di catalogo di una canzone. Ogni canzone deve avere un titolo, può non
avere autore o può averne più d’uno, può appartenere o meno a un singolo
album. Tutti gli elementi citati hanno contenuto alfanumerico.
Tramite un attributo, è necessario specificare quale sia il ruolo dell’autore,
scegliendo tra i valori “musica”, “testo” e “altro”.
Se la canzone appartiene a un album, è possibile (ma non richiesto)
specificarne la posizione tramite un attributo dell’elemento album.
Inoltre, ogni canzone si presta a una catalogazione opzionale in generi
musicali. I generi devono essere raggruppati all’interno di un sottoelemento
di canzone. Ogni genere è un elemento vuoto il cui valore (ad esempio
“pop”, “dance”, “rock”) viene specificato tramite un attributo richiesto.
Soluzione
<!DOCTYPE canzone [
<!ELEMENT canzone (titolo, autore*, album?, generi?)>
<!ELEMENT titolo (#PCDATA)>
<!ELEMENT autore (#PCDATA)>
<!ATTLIST autore
ruolo CDATA (musica|testo|altro) #REQUIRED>
<!ELEMENT album (#PCDATA)>
<!ATTLIST album
posizione CDATA #IMPLIED>
<!ELEMENT generi (genere+)>
<!ELEMENT genere EMPTY>
<!ATTLIST genere
descrizione CDATA #REQUIRED>
]>
Si osservi che la cardinalità di
luogo al più una sola volta.
101
generi
è 0..1, in quanto la catalogazione ha
5.4.3 | E SERCIZIO
Testo
Si consideri il problema di progettare una DTD per rappresentare le
informazioni di un corso prematrimoniale. Al corso possono partecipare solo
coppie di futuri sposi, in numero che varia da 0 a n coppie.
Di ciascuna persona si devono indicare come sottoelementi il nome e il
cognome, mentre l’età viene codificata come attributo richiesto.
Si proponga una soluzione in cui l’elemento
corso
e un’altra soluzione in cui invece
direttamente annidati nell’elemento
corso,
coppia
fidanzato
Soluzione
<!DOCTYPE corso [
<!ELEMENT corso (coppia*)>
<!ELEMENT coppia (fidanzato, fidanzata)>
<!ELEMENT fidanzato (nome, cognome)>
<!ELEMENT fidanzata (nome, cognome)>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT cognome (#PCDATA)>
<!ATTLIST fidanzato
età CDATA #REQUIRED>
<!ATTLIST fidanzata
età CDATA #REQUIRED>
]>
<!DOCTYPE corso [
<!ELEMENT corso (fidanzato, fidanzata)*>
<!ELEMENT fidanzata (nome, cognome)>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT cognome (#PCDATA)>
<!ATTLIST fidanzato
età CDATA #REQUIRED>
<!ATTLIST fidanzata
età CDATA #REQUIRED>
]>
102
e
fidanzata
siano
pur mantenendo la logica della
presenza consecutiva di entrambi.
<!ELEMENT fidanzato (nome, cognome)>
sia figlio dell’elemento
5.4.4 | E SERCIZIO
Testo
Si crei una DTD per rappresentare una classe di documenti incentrata sulla
singola automobile. L’automobile presenta una marca, un modello, una targa,
un colore della carrozzeria e un anno di immatricolazione:

marca, modello
e
anno
sono sottoelementi richiesti, da porre esattamente
in questo ordine, e di tipo alfanumerico;

targa

colore
è un attributo richiesto di automobile;
della carrozzeria è un attributo opzionale di automobile.
 Infine un'auto può aver avuto un elenco di proprietari, di numero
compreso tra 0 e n. I proprietari sono sottoelementi vuoti con attributi
richiesti nome e cognome.
Si presenti infine un esempio di documento XML conforme a tale DTD.
Possibile soluzione
DTD
<!DOCTYPE automobile [
<!ELEMENT automobile (marca, modello, anno, proprietario*)>
<!ELEMENT marca (#PCDATA)>
<!ELEMENT modello (#PCDATA)>
<!ELEMENT anno (#PCDATA)>
<!ELEMENT proprietario EMPTY>
<!ATTLIST automobile
targa CDATA #REQUIRED
colore CDATA #IMPLIED >
<!ATTLIST proprietario
nome CDATA #REQUIRED
cognome CDATA #REQUIRED >
]>
Documento
<automobile targa="AB123CD">
<marca>Opel</marca>
<modello>Corsa</modello>
<anno>1998</anno>
<proprietario nome="Mario" cognome="Rossi" />
<proprietario nome="Giovanni" cognome="Bianchi" />
</automobile>
103
6 | GESTIONE DEGLI ERRORI
Nei paragrafi di questo capitolo verranno analizzate ed applicate le principali
tecniche per il semplice rilevamento e per la correzione degli errori nei
dispositivi di trasmissione e memorizzazione dell’informazione digitale.
6.1 | R ILEVAMENTO DEGLI ERRORI
Negli esercizi proposti verrà adottata la tecnica del bit di parità, che consente
la rilevazione di un numero dispari di errori (tipicamente errori singoli). La
tecnica comunemente consiste nell’aggiungere un bit alla stringa originaria,
costituita da un numero arbitrario di bit, al fine di ottenere una stringa
risultante contenente:

un numero pari di 1 (bit di parità pari)

oppure un numero dispari di 1 (bit di parità dispari).
Il valore del bit aggiuntivo serve per l’appunto a rendere pari (nel primo caso)
oppure dispari (nel secondo caso) il numero complessivo di bit posti a 1 nella
stringa. Tale valore può essere posto a 0 o a 1 a seconda delle esigenze.
Si affronti il primo esercizio proposto per comprendere come la tecnica
opera.
104
6.1.1 | E SERCIZIO
Testo
Si consideri un canale trasmissivo che pone in collegamento un mittente A a
un destinatario B. A e B concordano la trasmissione di stringhe binarie sotto
forma di singoli pacchetti da 8 bit cui viene aggiunto un bit di parità dispari.
Si consideri il pacchetto 00110101, si aggiunga il bit di parità dispari, si
ipotizzi un errore sul canale di trasmissione per quanto riguarda un singolo
bit e si illustri il processo di rilevamento dell’errore.
Si ha anche correzione dell’errore?
Cosa avverrebbe se gli errori sul pacchetto fossero 2?
Soluzione
Alla stringa 00110101 viene aggiunto il bit di parità posto a 1, di modo che il
numero complessivo di bit posti a 1 sia dispari. Supponiamo che questo
abbia luogo nella posizione più significativa, generando dunque la stringa
100110101.
Un errore singolo sulla stringa implica che un bit originariamente posto a 1
venga erroneamente trasmesso come uno 0, o viceversa. Si osservi che tale
errore potrebbe aver luogo anche sul bit di parità stesso, senza però inficiare
la validità della tecnica.
Quando la stringa giunge a B, il destinatario (che si aspetta una parità dispari)
analizza il numero di 1 e scopre che è diventato pari. Questo avviene per
qualsiasi bit si sia deciso di alterare, tramutando uno 0 in un 1 o viceversa.
Inoltre, ciò ha luogo per qualsiasi numero di alterazioni dispari della stringa
originaria. Pertanto B desume che si sia verificato un errore in fase di
trasmissione, e chiede la ritrasmissione della stringa.
B non ha modo di sapere su quale bit si sia verificato l’errore, e dunque quella
del bit di parità è solo una tecnica di rilevamento, ma non di correzione
dell’errore.
Con un numero pari di errori, la tecnica avrebbe fallito in quanto non
sarebbe stata alterata la proprietà di parità/disparità degli 1.
105
6.1.2 | E SERCIZIO
Testo
Si aggiunga un bit di parità dispari alle seguenti stringhe, ponendolo come bit
più significativo.
0110
11100
10010
00000
10000000
Soluzione
10110
011100
110010
100000
010000000
106
6.1.3 | E SERCIZIO
Testo
Si aggiunga un bit di parità pari alle seguenti stringhe, ponendolo come bit
più significativo.
11
100
0011
100010
01101110
Soluzione
011
1100
00011
0100010
101101110
107
6.2 | C ORREZIONE DEGLI ERRORI
Gli esercizi proposti utilizzano i codici di Hamming per il rilevamento e la
correzione degli errori.
Nella teoria dell'informazione, la distanza di Hamming tra due stringhe di
ugual lunghezza è il numero di posizioni nelle quali i simboli corrispondenti
sono diversi. In altri termini, la distanza di Hamming misura il numero di
sostituzioni necessarie per convertire una stringa nell'altra, o il numero di
errori che hanno trasformato una stringa nell'altra.
Ad esempio, è pari a 2 la distanza di Hamming tra le due stringhe seguenti:
1011101
1001001
Nei codici di Hamming, i simboli da trasmettere sono codificati con stringhe
ridondanti di bit proprio per supportare la robustezza agli errori.
Detta dmin la minima distanza di Hamming, calcolata tra tutte le diverse
combinazioni di simboli, si ricava che
Numero di errori rilevabili er = dmin – 1
Numero di errori correggibili ec =  (dmin – 1) / 2 
ove i simboli  e  stanno a indicare l’arrotondamento all’intero
immediatamente inferiore.
108
6.2.1 | E SERCIZIO
Testo
Nella tecnica di rilevamento e correzione degli errori basata su codici di
Hamming, quanti errori permette di rilevare e quanti errori consente di
correggere una distanza di Hamming minima dmin = 3? E se dmin = 5?
Soluzione
Considerando le formule precedentemente introdotte, per dmin = 3 il numero
di errori rilevabili è pari a 2 mentre il numero di errori correggibili è pari a 1.
Per dmin = 5 il numero di errori rilevabili è pari a 4 mentre il numero di errori
correggibili è pari a 2.
6.2.2 | E SERCIZIO
Testo
Si consideri un dizionario di 4 simboli rappresentati su stringhe di 4 bit. Si
debba garantire una distanza di Hamming minima dmin = 2 bit. Date le
stringhe s1 = 1100, s2 = 0011 e s3 = 0000, si proponga una combinazione di
bit per s4.
Soluzione
Per garantire dmin = 2 bit, la nuova configurazione deve avere almeno 2 bit
differenti rispetto a qualsiasi altra stringa già presente.
Soluzioni ammissibili (alternative tra loro)
1111
0101
1010
1001
0110
109
6.2.3 | E SERCIZIO
Testo
Sia dato il seguente codice di Hamming:
Simbolo
Codifica
A
100
B
010
C
001
Si ipotizzi che, per un errore sul canale trasmissivo, un dispositivo riceva la
stringa X = 110. Applicando il codice di Hamming sopra riportato, il
dispositivo si accorge dell’errore?
Il dispositivo riesce a correggere l’errore?
Se sì, con quale carattere viene interpretata la stringa X?
Soluzione
Da una rapida analisi, si evince che dmin = 2 bit, pertanto er = 1 ed ec = 0.
La stringa contiene presumibilmente un singolo errore, e proviene dalla
trasmissione della codifica di A o di B. Non si può però escludere che si tratti
di 3 errori di trasmissione sulla stringa C.
In ogni caso, X viene riconosciuta come errata in quanto non ha controparte
tra le codifiche ammesse dal codice in uso.
Non è possibile ricondurre X a una delle codifiche ammesse, in quanto essa
presenta distanza di Hamming minima pari a 1 tanto rispetto ad A quanto a
B.
110
6.2.4 | E SERCIZIO
Testo
Si consideri il seguente codice di Hamming per rappresentare le cifre
utilizzate in base 10.
Simbolo
0
1
2
3
4
5
6
7
8
9
Codifica
11000
10100
10010
10001
01100
01010
01001
00110
00101
00011
Se ne calcoli la distanza minima di Hamming, e si proceda a determinare il
numero massimo di errori rilevabili e correggibili.
Come agirebbe il sistema se giungesse una stringa quale 00000? E se
giungesse 10000?
Soluzione
dmin = 2 bit, pertanto er = 1 ed ec = 0.
Si noti che la stringa 00000 implica certamente un duplice errore di
trasmissione, in quanto nel dizionario iniziale tutte le stringhe contengono
due 1 e tre 0. Il sistema in questo caso si accorge dell’errore, nonostante
teoricamente er = 1, dato che la stringa non ha una controparte nel dizionario
supportato. Però si osservi che in generale la compresenza di 2 errori di
trasmissione potrebbe non essere rilevata: si pensi ad esempio alla doppia
alterazione di 11000 in 10100 (secondo e terzo bit), che manda la codifica del
simbolo 0 sul simbolo 1 e non viene pertanto rilevato l’errore.
Invece, in caso di alterazione di un solo bit l’errore è certamente rilevato. E’ il
caso della stringa 10000, che potrebbe derivare dall’alterazione di un solo bit
tra le stringhe che seguono:

11000 (secondo bit)

10100 (terzo bit)

10010 (quarto bit)

10001 (quinto bit)
In accordo con la teoria, però, tale errore non è correggibile. Infatti, la stringa
errata è equidistante da tutte quelle citate.
111
6.2.5 | E SERCIZIO
Testo
Si consideri il seguente codice di Hamming per rappresentare quattro simboli
differenti.
Simbolo
giallo
verde
rosso
blu
Codifica
00000000
10100110
01011001
11111111
Se ne calcoli la distanza minima di Hamming, e si proceda a determinare il
numero massimo di errori rilevabili e correggibili.
Si alteri un solo bit di una delle stringhe originarie e si mostri come agisce la
tecnica di correzione.
Soluzione
dmin = 4 bit, pertanto er = 3 ed ec = 1.
Dunque è lecito aspettarsi che, qualunque stringa si scelga e comunque la si
alteri (a patto di modificare solo un bit), l’algoritmo sia in grado di risolvere
l’errore.
Consideriamo ad esempio la stringa relativa al rosso e modifichiamone il
primo bit. La stringa alterata diventa 11011001. Calcoliamone la distanza
rispetto a tutti i simboli.

Distanza rispetto a giallo: 5 bit

Distanza rispetto a verde: 7 bit

Distanza rispetto a rosso: 1 bit

Distanza rispetto a blu: 3 bit
Pertanto è univocamente fissato il simbolo più vicino alla stringa ricevuta.
Infine, per via del tutto empirica, si noti che questo risultato generale non si
sarebbe ottenuto supportando la modifica di 2 bit. Consideriamo
nuovamente la stringa del rosso e modifichiamo il quarto e il quinto bit. La
stringa risultante è ora 01000001, che dista per costruzione 2 bit dalla codifica
del rosso ma 2 bit anche dalla codifica del blu.
112
7 | DATABASE
Nei paragrafi di questo capitolo si tratteranno 3 argomenti:
113

Algebra relazionale

Structured Query Language

Progettazione di database con il formalismo E-R
7.1 | A LGEBRA RELAZIONALE
Gli esercizi proposti nel corso di questo paragrafo implicano l’applicazione
della teoria sull’Algebra relazionale ai database relazionali.
Nel seguito verranno utilizzate le seguenti convenzioni:

gli insiemi sono rappresentati da lettere maiuscole (ad esempio A) o
da etichette dall’iniziale maiuscola (ad esempio Studenti);

si farà altrettanto per le relazioni, che sono in effetti insiemi dato che
rappresentano sottoinsiemi del prodotto cartesiano;

i nomi degli attributi saranno indicati in lettere minuscole (ad esempio
nome);

i valori degli attributi saranno indicati tra apici doppi quando questi
rappresentano delle stringhe (ad esempio “Luigi”).
Per quanto concerne gli operatori, dati gli insiemi D1, D2, … , Dn:

prodotto cartesiano: D1×D2×…×Dn

relazione R sugli insiemi D1, D2, … , Dn: R ⊆ D1×D2×…×Dn

unione U degli insiemi D1(X) e D2(X): U = D1(X)  D2(X) ove i due
insiemi presentano lo stesso insieme di attributi X;

intersezione I degli insiemi D1(X) e D2(X): U = D1(X)  D2(X) ove i
due insiemi presentano lo stesso insieme di attributi X;

differenza A tra gli insiemi D1(X) e D2(X): A = D1(X) – D2(X) ove i
due insiemi presentano lo stesso insieme di attributi X;

ridenominazione di un attributo dell’insieme D:
nuova etichetta  vecchia etichetta (D)

selezione in base a una condizione sull’insieme D: condizione (D)

proiezione su uno o più attributi dell’insieme D: lista attributi (D)

join sulla base di un predicato tra gli insiemi D1 e D2: D1 predicato D2

join naturale tra gli insiemi D1 e D2: D1  D2
Infine, gli operatori logici avranno le seguenti forme: (AND),  (OR),
 (NOT).
114
7.1.1 | E SERCIZIO
Testo
Si calcoli la cardinalità del prodotto cartesiano P = A × B ove A è l’insieme
dei punti cardinali mentre B è l’insieme dei colori di un semaforo. Si
provveda quindi a verificare il risultato ottenuto mostrando il risultato
dell’operazione di prodotto cartesiano.
Soluzione
A = {Nord, Sud, Ovest, Est}
B = {Rosso, Giallo, Verde}
La cardinalità di P = A × B è |P| = |A| × |B| = 12.
Come controprova, mostriamo il risultato del prodotto cartesiano:
A
Nord
Sud
Ovest
Est
Nord
Sud
Ovest
Est
Nord
Sud
Ovest
Est
B
Rosso
Rosso
Rosso
Rosso
Giallo
Giallo
Giallo
Giallo
Verde
Verde
Verde
Verde
Si ricordi che l’ordine in cui vengono presentate le tuple è del tutto
indifferente ai fini del risultato.
115
7.1.2 | E SERCIZIO
Testo
Si considerino le tabelle sotto riportate, ove la chiave primaria risulta
sottolineata.
Deputati
codice
cognome
nome
commissione
provincia
collegio
SG01
Silvestro
Giuseppe
bil
PZ
1
RM02
Rossi
Mario
cul
TO
2
FF03
Filippi
Francesca
cul
TO
1
SA04
Stabile
Angelo
aff
PZ
2
BR05
Biase
Roberto
bil
PZ
1
BR06
Biase
Roberto
bil
PZ
2
Collegi
provincia
numero
nome
PZ
1
Melfi
PZ
2
Lagonegro
TO
1
Settimo Torinese
TO
2
Ivrea
Commissioni
codice
nome
presidente
bil
Bilancio
BR06
aff
Affari Costituzionali
SA04
cul
Cultura
FF03
Si risponda ai seguenti quesiti in termini di algebra relazionale:
1. elencare i soli nomi e cognomi dei deputati;
2. elencare i nomi di tutte le commissioni, rinominando l’attributo “nome”
in “commissione”;
3. estrarre i codici e i cognomi dei deputati eletti in collegi della provincia
PZ;
116
4. estrarre le intere tuple relative a deputati che operano in commissione
“bil” o il cui numero di collegio sia superiore a 1;
5. estrarre il nome e il codice delle commissioni in cui operano deputati
provenienti da uno dei collegi della provincia TO;
6. si ricavi il nome di tutti i collegi dei deputati elencati in Deputati,
osservando che (provincia, numero) sono chiavi esterne della tabella
Deputati verso la tabella Collegi.
Soluzione
1. nome, cognome (Deputati)
2. commissione  nome (nome (Commissioni))
3. provincia=“PZ” (codice, cognome (Deputati))
4. commissione = “bil”  collegio > 1 (Deputati)
5. nome, codice (Commissioni codice = commissione (provincia = “TO” (Deputati)))
Analizzando la soluzione dall’interno verso l’esterno, la prima operazione
eseguita è la selezione dei soli deputati provenienti dalla privincia “TO”.
Nel nostro caso, è una tabella T il cui numero di colonne rimane
invariato rispetto a Deputati, mentre il numero di righe è ridotto a solo
due. Si procede poi a effettuare il join tra la tabella così ottenuta e la
tabella Commissioni, imponendo che
Commissioni.codice = T.commissione
L’uso della notazione puntata avrebbe evitato le possibilità di confusione
tra colonne che presentano lo stesso nome in tabelle differenti.
Infine, della tabella S risultante interessano solo le colonne nome e
codice, per cui si procede a operare una proiezione.
6. nome (Collegi provincia = provincia  numero = collegio (nome_dep  nome (Deputati)))
La ridenominazione dell’attributo Deputati.nome è opportuna in quanto
esso andrebbe a configgere con il nome del collegio, altro attributo
presente nella tabella derivante dal join. In alternativa, sarebbe stato
possibile filtrare gli attributi “utili” di Deputati (in questo caso provincia e
collegio) tramite una proiezione su tali colonne.
117
7.2 | S TRUCTURED Q UERY L ANGUAGE
In questo paragrafo si affronteranno alcuni costrutti alla base delle
interrogazioni (o query) SQL.
7.2.1 | E SERCIZIO
Testo
Data la tabella Automobili qui riportata
casa
modello
targa
anno
chilometri
Fiat
Multipla
DA265GF
2007
50000
Fiat
Ritmo
BJ342ND
1983
160000
Ferrari
Scaglietti
CB732AK
2007
12500
Ferrari
Testarossa
AH223TJ
1985
43000
Lancia
Delta
AT729YJ
1998
80200
Alfa Romeo
Mito
DE172HK
2009
2000
si scrivano le interrogazioni SQL per estrarre:
1. le tuple complete relative ad automobili Fiat;
2. il modello e la targa di tutte le vetture del parco auto;
3. le targhe delle automobili il cui anno di immatricolazione è successivo al
2000;
4. i modelli delle automobili immatricolate prima del 2009 e con un numero
di chilometri minore di 30000;
5. il numero di vetture presenti nel parco auto e di marca Ferrari;
6. il numero di vetture la cui targa inizia per “A”;
7. l’elenco dei valori distinti (senza ripetizioni) delle case automobilistiche
rappresentate nel parco auto;
8. l’elenco dei modelli in ordine alfabetico inverso;
9. l’elenco di casa, modello e targa delle auto che rispettino le seguenti
condizioni: avere una targa che termina per J, un chilometraggio
superiore a 20000 e anno di immatricolazione diverso dal 1985;
10. il chilometraggio massimo presente nella tabella.
118
Soluzione
1.
Questa query può essere considerata a tutti gli effetti una pura selezione
(nei termini dell’Algebra relazionale).
SELECT * FROM Automobili WHERE casa = "Fiat";
2.
Questa query può essere considerata a tutti gli effetti una pura proiezione
(nei termini dell’Algebra relazionale).
SELECT modello, targa FROM Automobili;
3. SELECT targa FROM Automobili WHERE anno > 2000;
4. SELECT modello FROM Automobili WHERE anno < 2000 AND
chilometri < 30000;
5. SELECT COUNT(*) FROM Automobili WHERE casa = "Ferrari";
6. SELECT COUNT(*) FROM Automobili WHERE targa LIKE "A%";
7. SELECT DISTINCT casa FROM Automobili;
si osservi che l’assenza della clausola DISTINCT avrebbe portato a
ripetizioni nell’elenco dei risultati;
8. SELECT modello FROM Automobili ORDER BY modello DESC;
9. SELECT casa, modello, targa FROM Automobili WHERE
targa LIKE "%J" AND chilometri > 20000 AND anno <> 1985;
10. SELECT MAX(chilometri) AS massimo FROM Atuomobili;
119
7.2.2 | E SERCIZIO
Testo
Date le tabelle sotto riportate:
Cantanti
id
nome
cognome
data_nascita
luogo_nascita
1
Vasco
Rossi
07/02/1952
Zocca
2
Eros
Ramazzotti
28/10/1963
Roma
3
Laura
Pausini
16/05/1974
Faenza
Album
id
titolo
anno
etichetta
cantante
1
Liberi liberi
1989
EMI
1
2
Primavera in anticipo
2008
Atlantic Records
3
3
Dove c’è musica
1996
BMG Ricordi
2
4
Gli spari sopra
1993
EMI
1
5
Io canto
2006
Atlantic Records
3
6
Stupido hotel
2001
EMI
1
si scrivano le interrogazioni SQL per estrarre:
1. tutti gli album incisi dall’etichetta EMI, in ordine di anno di
pubblicazione;
2. tutti i titoli degli album al cui interno compare la stringa “ri” oppure la
stringa “ho”;
3. tutti i titoli degli album di cantanti il cui cognome inizia per “R”;
4. i soli identificativi degli album (ridenominati come colonna album)
composti dopo il 2000 e il cui cantante abbia un cognome che inizia per
“P”;
Soluzione
1. SELECT * FROM Album WHERE etichetta = "EMI" ORDER BY anno;
2. SELECT titolo FROM Album WHERE titolo LIKE "%ri%"
OR titolo LIKE "%ho%";
3. SELECT titolo FROM Album, Cantanti WHERE
Album.cantante = Cantanti.id AND cognome LIKE "R%";
120
4. SELECT Album.id AS album FROM Album, Cantanti WHERE
Album.cantante = Cantanti.id
AND anno > 2000
AND cognome LIKE "P%";
Nella soluzione del terzo e del quarto quesito, si è scelto di eseguire il JOIN
eguagliando in modo esplicito gli attributi coinvolti.
In alternativa, il JOIN si sarebbe potuto ottenere con la sintassi:
SELECT * FROM Album JOIN Cantanti ON Album.cantante = Cantanti.id
Si osservi che in generale, quando la soluzione richiede un join tra due
tabelle, appare una condizione ulteriore rispetto a quelle elencate nelle
richieste. Si tratta della condizione di JOIN, che permette di associare tuple
dell’una e dell’altra tabella secondo una certa logica. In assenza della
condizione di JOIN, si otterrebbe come risultato un prodotto cartesiano tra
le tuple delle due tabelle, eventualmente filtrate secondo le condizioni della
clausola WHERE.
Ad esempio, in mancanza della condizione di JOIN:
SELECT titolo FROM Album, Cantanti WHERE cognome LIKE "R%";
avrebbe ridotto la tabella Cantanti a sole 2 tuple, non avrebbe filtrato la
tabella Album (6 tuple) e come risultato avrebbe restituito il prodotto
cartesiano tra le due relazioni, per un totale di 12 tuple.
In generale, se le tabelle da porre in JOIN sono n allora compariranno n-1
condizioni di JOIN.
Nell’esprimere le condizioni di JOIN si è utilizzata la notazione puntata per
evitare ambiguità, in quanto il campo
id
esiste in entrambe le tabelle. Non
sarebbe stato strettamente necessario esplicitare
Album.cantante,
in quanto
l’attributo cantante è già univocamente definito tra le tabelle coinvolte dal
JOIN.
121
Fly UP