FONDAMENTI DI INFORMATICA I A.A. 2006-2007 - prof. Angelo GALLIPPI [email protected] Data inizio: 5 marzo 2007 Data fine: 25 giugno 2007 Totale ore: 90 n° crediti: 10 Orario Lunedì Martedì Mercoledì 14-15.45 11.30-13.15 14-15.45 Aula 3 PP2 Aula 8 PP2 Aula 3 PP2 TEST D’INGRESSO • Cosa indicano le seguenti sigle: NMOS, NAND, DRAM, CD-ROM? 1. Come si chiama il fisico che ha realizzato il primo microprocessore? Qual è la sua nazionalità? 3. Come si chiama il fisico, premio Nobel, che ha inventato il circuito integrato? 4. Cos’è una memoria cache? 5. Cosa si misura in Megahertz? E in Megabyte? 6. Qual è il risultato della seguente operazione: “9 modulo 4”? 7. Cosa indica la parola inglese “file”? 8. Quali sono I primi 5 termini della successione di Fibonacci? 9. A cosa può servire il triangolo di Tartaglia? 10. Quanto valgono le seguenti espressioni: 2-3 ; 0,54 ; 161/2 ? PROGRAMMA Le basi dei calcolatori digitali Sistemi di numerazione binari • Codifica binaria pura (Conversioni di base. Operazioni) • Sistema esadecimale • Codifica BCD • Codici binari alfanumerici (Codifiche ASCII, EBCDIC) • Codici rilevatori di errori • Codifica delle grandezze fisiche (Digitalizzazione di una forma d’onda analogica. Digitalizzazione di una immagine. Vantaggi della digitalizzazione). Algebra di Boole •Operatori AND, OR, NOT •Tabelle di verità •Operatore OR esclusivo (XOR) •Addizionatore binario •Operatore NOR •Operatore NAND •Operatori logici orientati al bit Macchina di Turing •Macchina sommatrice •Macchina copiatrice Architettura di un elaboratore elettronico • Macchina di von Neumann • Unità centrale di elaborazione (processori Intel, AMD, Alpha, Mips, SPARC, ARM) • ROM BIOS • Bus di sistema e di espansione (ISA, MCA, EISA, SCSI) • Memoria (RAM, cache) • Scheda madre. Disco rigido (RAID, ATA seriale) • Lettori di floppy disc, CD-ROM, DVD • Porte seriali e parallele Algoritmi. Diagrammi di flusso. Il controllo del programma (Selezione binaria. Selezione multipla. Iterazione). Strutturazione degli algoritmi. Struttogrammi. Iterazione enumerativa (for). Iterazione con guardia all’inizio (while). Calcolo del fattoriale. Iterazione con guardia alla fine (do-while). Calcolo della radice quadrata. Cicli nidificati. Confronto tra do-while e while. Iterazione e ricorsività (Definizione ricorsiva di fattoriale e di potenza). Algoritmi di ricerca (lineare; binaria; tempo di esecuzione). Notazione O-grande. Algoritmi di ordinamento (a bolle; per selezione; per inserimento; Shell Sort; Heap Sort; per fusione; Quicksort; esterno; fusione bilanciata). Cifratura RSA (Chiavi asimmetriche. Cifratura e decifrazione. Strutture dati. Tipi dati predefiniti (Tipi dati semplici. Tipi dati strutturati). 3. La programmazione nel linguaggio C •Introduzione: la modularità •Funzioni: main(), printf() •Commenti •Tipi di dati, dichiarazioni e visualizzazioni •Assegnazioni, indirizzi e ingresso interattivo •Selezione (if, switch) •Iterazione (while, for, do-while) •Funzioni definite dall’utente •Tipi di dati complessi (array, indirizzi, puntatori, stringhe, strutture) 4. Software di base •Sistemi operativi (processi; memoria virtuale; file e indirizzari; strati del sistema operativo; utilità) •Cenni ai sistemi operativi Dos e Windows •Gerarchia e tipologie dei linguaggi di programmazione 5. Il sistema operativo Linux • Cenno sulle principali distribuzioni (SuSE, DLD, Mandrake, RedHat, Slackware, Turbo) • Shell e utilità • Principi di amministrazione • Il kernel • Processi e comunicazioni • Il file system • Il sistema X Windowing TESTI CONSIGLIATI: Gallippi, A. Dizionario di informatica Inglese/Italiano, Tecniche Nuove, Milano, 2006 Deitel, H.M. C Corso completo di programmazione, Apogeo, Milano, 2004. Medri, D. Linux facile, Edizioni Seven Star, Roma, 2001. Missiroli, M. Linux da zero, Edizioni Seven Star, Roma, 2002. INTRODUZIONE Il termine informatica deriva dalla contrazione delle parole informazione e automatica, e indica appunto il trattamento automatico delle informazioni, di tipo numerico o no, reso possibile da quelle macchine che sono i computer o calcolatori elettronici costruiti a partire dagli anni ’40. Gli attuali computer sono praticamente tutti di tipo digitale, cioè elaborano i dati considerandoli come dei numeri costituiti da un numero finito di cifre (in inglese digit). Tuttavia questa scelta non si è imposta con immediatezza ai progettisti dei primi calcolatori, i quali avevano di fronte anche l’alternativa analogica, se non altro perché su essa era basato il più diffuso strumento di calcolo allora esistente: il regolo calcolatore. Le due concezioni si sono confrontate per un certo periodo, fino a che la scelta digitale è risultata vincente, relegando i calcolatori analogici in nicchie applicative assai specializzate. Nel seguito ci interesseremo esclusivamente dei calcolatori digitali. LE BASI DEI CALCOLATORI DIGITALI Affinché una macchina basata sull’elettricità possa compiere in modo automatico delle operazioni matematiche (ma anche di altro tipo) sono necessari evidentemente tre passaggi: la trasformazione dei numeri (o di altri tipi di informazioni) in segnali elettrici; la disponibilità di dispositivi in grado di eseguire su tali segnali elettrici le stesse operazioni che gli operatori matematici eseguono sui numeri; la possibilità di eseguire istruzioni precedentemente impartite dall’uomo, ed eventualmente delle scelte fra più alternative. Ebbene, a partire dagli anni ’40 queste tre esigenze sono risultate contemporaneamente soddisfatte, grazie all’esistenza di tre costruzioni logiche fondamentali sviluppate in tempi diversi e in modo indipendente l’una dall’altra. Esse sono: il sistema di numerazione binario di Leibniz; l’algebra di Boole; la macchina di Turing. Essenziale dal punto di vista pratico per la applicazione pratica di questi risultati, e quindi per la realizzazione del computer, è stata la realizzazione di dispositivi elettronici sufficientemente veloci, piccoli ed economici quali • il transistore, realizzato nel 1948 da John Bardeen, Walter Houser Brattain e William Bradford Shockley ai Bell Telephone Labs (Nobel 1956); • il circuito integrato, realizzato nel 1958 da Jack St. Clair Kilby, alla Texas Instrument (Nobel 1970); • il microprocessore, realizzato nel 1971 da Federico Faggin alla Intel. Sistemi di numerazione binari Il sistema di numerazione binario, ideato dal filosofo tedesco Gottfried Wilhelm Leibniz [1], consente di rappresentare un qualsiasi numero usando i due soli simboli o cifre (in inglese digit) “0” e “1”, e di compiere con essi tutte le usuali operazioni aritmetiche. [1] Leibniz espose il suo sistema in diversi scritti, tra i quali De progressione dyadica che porta la data del 15 marzo 1679, una lettera a Claudio Filippo Grimaldi del gennaio/febbraio 1697 e una al padre gesuita Joachim Bouvet del 18 maggio 1703. In quest’ultima, in particolare, Leibniz scrive: Erano ben più di venti anni che avevo in testa questa aritmetica fondata sullo 0 e sull’1, della quale vedevo le mirabili conseguenze per condurre la scienza dei numeri a una perfezione che supera tutto quello che possediamo. from the Postdoctoral Thesis by Johann Bernard Wiedeburg of Jena (1718) Leibniz’s medallion for the Duke of Brunswick from the Postdoctoral Thesis by Johann Bernard Wiedeburg of Jena (1718) Le stesse cifre 0 e 1 consentono di codificare anche dati testuali o alfabetici e, attraverso il processo di digitalizzazione, una qualsiasi grandezza analogica, cioè variabile in maniera continua nel tempo. Le cifre 0 e 1 - o, più in generale, i termini antitetici “vero-falso”, “sì-no” e simili - possono essere rappresentate dagli stati fisici (“acceso-spento”, “aperto-chiuso”, “conduttore-isolante”, ecc.) di dispositivi quali lampadine, interruttori e transistori, e ciò determina la grande versatilità dei calcolatori elettronici. Codifica binaria pura La rappresentazione di un numero tramite le sole cifre “0” e “1” può avvenire secondo diversi criteri; la codifica binaria pura (detta semplicemente “binaria”, senza altra specificazione) rappresenta i numeri in modo che continuino a valere le stesse regole dell’aritmetica decimale. Negli altri tipi di notazione binaria, invece, i risultati della conversione non possono essere impiegati in operazioni aritmetiche, perché non fornirebbero i risultati corretti. Il sistema binario è, come quello decimale, di tipo “posizionale”, in quanto la posizione di una cifra in un numero determina il valore o “peso” di quella cifra. Ciò a differenza, per esempio, del sistema di numerazione degli antichi romani, che era solo parzialmente posizionale. MDCCXIV Per esempio, nei due numeri 300 e 3.000 la stessa cifra 3 ha un valore diverso, in quanto nel primo viene moltiplicata per 100, nel secondo per 1.000 (come si avverte anche leggendo i due numeri). Ciò si esprime dicendo che le cifre (prima della virgola) di un numero decimale vengono moltiplicate per le successive potenze con esponente positivo del numero 10 (detto base del sistema di numerazione), che sono: Invece le cifre dopo la virgola di un numero in base 10 vengono moltiplicate per le successive potenze con esponente negativo del numero 10, che sono: Anche nel sistema binario le cifre di un numero vanno pensate moltiplicate per una opportuna potenza, in questo caso della base 2. Per quanto riguarda la parte prima della virgola di un numero in base 2, tali potenze sono: Per quanto riguarda la parte dopo la virgola di un numero in base 2, le successive potenze del 2 sono: Vediamo le regole per convertire un numero dal sistema decimale a quello binario e viceversa. Conversione da base 10 a base 2 (parte intera) Per convertire la parte intera di un numero da base 10 a base 2 si può seguire il seguente algoritmo delle divisioni successive: •si divide il numero per 2 annotando il quoziente e il resto della divisione •si ripete l’operazione fino a ottenere per quoziente 0 •la successione dei resti ottenuti, scritti dall’ultimo al primo, fornisce la conversione desiderata. Per indicare esplicitamente che un numero è scritto nel sistema di numerazione decimale, gli si aggiunge il pedice 10; se il numero è scritto nel sistema binario si aggiunge il pedice 2. Ad esempio, la conversione in binario di 3710 si effettua secondo lo schema seguente: Quindi 3710 1001012. Conversione da base 10 a base 2 (parte dopo la virgola) Per convertire la parte dopo la virgola di un numero da base 10 a base 2 si può seguire il seguente algoritmo delle moltiplicazioni successive: •si moltiplica il numero per 2, annotando la prima cifra del prodotto se essa vale “1”, altrimenti annotando “0”; •si ripete la moltiplicazione del risultato ottenuto, terminando il procedimento quando si ottiene come prodotto una potenza del 10 •la successione degli “0” e “1” ottenuti, scritti a partire dal primo, fornisce la conversione desiderata. Nel caso, ad esempio, del numero 0,812510 la conversione si effettua secondo lo schema seguente: Quindi 0,812510 0,11012. Esercizio. Convertire il numero 0,310 in base 2. Si ottiene: 0,310 → 0,01(0011)2 Quindi nel convertire la parte dopo la virgola di un numero da base 10 a base 2 può succedere che il numero, non periodico nel primo sistema di numerazione, diventi periodico nel secondo. Questo fatto può comportare una perdita di esattezza quando si eseguano operazioni tra numeri con la virgola che siano stati convertiti nel sistema binario. Conversione da base 2 a base 10 Per convertire un numero da base 2 a base 10 si segue il seguente algoritmo: si moltiplica ogni bit del numero per il valore dalla corrispondente potenza del 2, e si sommano i valori così ottenuti. Nel caso, ad esempio, del numero 1011012 la conversione si effettuerebbe secondo lo schema seguente: Quindi 1001012 3710. Osserviamo che tale procedimento si applica sia alla parte intera sia a quella decimale del numero. Quindi nel caso, ad esempio, del numero 0,11012 la conversione si effettua secondo lo schema seguente. Operazioni nel sistema binario Le operazioni sui numeri binari si eseguono secondo le regole ordinarie dell’aritmetica, con l’ulteriore semplificazione derivante dall’operare su due sole cifre. Somma. La somma si esegue allineando i numeri sulla destra e applicando alle cifre sulla stessa verticale le regole della somma binaria riportate in tabella. Per esprimere in modo più uniforme i 4 risultati indicati in tabella, conviene ragionare in termini di: “due addendi / un risultato e un riporto”, ossia: Tuttavia, dato che in pratica si sommano numeri costituiti da più di una cifra binaria, conviene utilizzare ragionare in termini di “due addendi e un riporto / un risultato e un riporto”, ossia Ad esempio, la somma di 10110 e 11111 si esegue secondo lo schema seguente: Moltiplicazione. Anche la moltiplicazione tra due numeri si esegue come nel sistema decimale; in particolare: • si applicano ai prodotti parziali delle singole cifre le regole della tabella seguente • quindi si sommano i prodotti parziali con le regole della somma viste in precedenza. Osserviamo che la tabella costituisce un sottoinsieme della familiare tavola pitagorica (scritta, di solito, senza la riga e la colonna dello “0”). Sottrazione. La sottrazione nel sistema binario si potrebbe eseguire come nel sistema decimale ma di fatto, per evitare la situazione di dovere “prendere in prestito” una unità dalla cifra di sinistra quando una cifra del sottraendo superi quella corrispondente del minuendo, conviene eseguire la sottrazione tramite due operazioni più semplici per i circuiti binari: la complementazione e l’addizione. Ricordiamo che nel sistema decimale il complemento a 9 di un numero è quel numero che sommato al primo dà un risultato costituito da tutte cifre 9. Quindi il complemento di un numero di due cifre si ottiene sottraendo il numero da 99, di uno a tre cifre sottraendo il numero da 999 e così via. Per esempio il complemento di 13 è (99 - 13) = 86. L’uso del complemento evita di eseguire una sottrazione, sostituendola con un’addizione. Infatti, per esempio nell’identità 13 – 9 = 4 si può sottrarre 99 a entrambi i membri, ottenendosi 13 – 9 – 99 = 4 – 99 e, cambiando segno a entrambi i membri, (99 – 13) + 9 = (99 – 4) Dato che la parentesi a primo membro rappresenta il complemento del minuendo e quella a secondo membro il complemento del sottraendo, se ne trae la seguente regola: Per eseguire una sottrazione si può: • eseguire il complemento a 9 del minuendo, • sommargli il sottraendo, • eseguire il complemento a 9 della somma ottenuta. La stessa regola vale ovviamente anche nel sistema binario - dove anzi risulta di applicazione ancora più semplice - sostituendo il complemento a 9 con il complemento a 1. Complemento a 1. Si definisce complemento a 1 di un numero quel numero che sommato al primo dà un risultato costituito da tutte cifre 1. Ad esempio il complemento a 1 di 11012 è 00102 dato che 11012 + 00102 = ----11112 Si vede che: il complemento a 1 di un numero si ottiene cambiando i suoi 0 in 1 e viceversa. Applichiamo allora la regola precedente alla sottrazione 13 – 9: Tuttavia, nel sistema decimale si considera anche il complemento a 10 di un numero, definito come quel numero che sommato al primo dà tutte cifre 0 (trascurando la cifra di riporto più a sinistra). Complemento a 2. Allo stesso modo, nel sistema binario si considera il complemento a 2 di un numero, definito come quel numero che sommato al primo dà un risultato costituito da tutte cifre 0 (trascurando il bit di riporto più a sinistra). Ad esempio, il complemento a 2 di 1101 è 0011 dato che 1101 + 0011 = -----1 0000 Si vede che: il complemento a 2 di un numero si ottiene sommando 1 al complemento a 1 del numero. Usando il complemento a 2, la sottrazione si può eseguire con la seguente regola: Per eseguire una sottrazione si può: • sommare al minuendo il complemento a 2 del sottraendo • sopprimere la cifra più a sinistra della somma ottenuta. Applichiamo questa regola alla solita sottrazione 13 – 9 Sistema esadecimale Molto usato in informatica è il sistema di numerazione esadecimale, che impiega i 16 simboli 0 1 2 3 4 5 6 7 8 9 A B C D E F Pertanto anche le “lettere” A-F vanno considerate cifre, di valori rispettivamente: A=10 B=11 C=12 D=13 E=14 F=15 Anche il sistema esadecimale è di tipo posizionale, in quanto le cifre di un numero vanno pensate moltiplicate per una opportuna potenza, in questo caso della base 16. Per quanto riguarda la parte prima della virgola di un numero esadecimale (la sola di effettivo utilizzo) tali potenze sono: Nel linguaggio C i numeri esadecimali iniziano con le cifre 0x. Così, ad esempio, vale la conversione 0x2A7F 10.87910 in quanto Questo è pertanto il metodo per convertire un numero da base 16 a base 10. Conversione da base 16 a base 2. Per convertire un numero esadecimale in binario si convertono successivamente, le sue cifre tramite gruppi di 4 bit, secondo la corrispondenza della tabella a fianco. Lo stesso criterio vale ovviamente per il passaggio inverso binario > esadecimale, con l’avvertenza di iniziare la sostituzione partendo dal gruppo di 4 bit meno significativi (quelli più a destra). Conversione da base 10 a base 16. Per questa conversione conviene passare attraverso la base 2. Quindi, ad esempio: 3710 0010 01012 0x25 Codifica BCD Un altro tipo di codifica binaria è costituito dalla notazione BCD (da Binary Coded Decimal, decimale codificato in binario), nella quale ogni cifra di un numero decimale viene rappresentata tramite le quattro cifre della sua codifica in binario puro. Ad esempio, il numero 2310 viene rappresentato in BCD come 0010 0011 dato che questi due gruppi di 4 cifre sono gli equivalenti binari rispettivamente dei numeri 2 e 3. Questo tipo di codifica non consente di eseguire le operazioni aritmetiche applicando le solite regole, e presenta quindi un interesse minore rispetto alla codifica in binario puro. CODICI BINARI ALFANUMERICI Come abbiamo detto, l’uso delle cifre “0” e “1” permette di codificare anche dati testuali o alfabetici[1]. [1] Il primo esempio di codifica binaria delle lettere dell’alfabeto si deve a Francis Bacon, il quale escogitò il codice omnia per omnia al fine di cifrare i suoi messaggi diplomatici segreti. Il suo codice sostituiva a ogni lettera dell’alfabeto un gruppo di cinque lettere costituito da varie combinazioni della a e della b. Ulteriori elaborazioni erano poi eseguite per garantire la segretezza della comunicazione. Naturalmente questi comprendono come loro sottoinsieme anche i dati numerici (e allora si parla, più propriamente, di caratteri alfanumerici), ma quando si parla di dati alfabetici, si esclude implicitamente che su di essi si possano eseguire le operazioni aritmetiche. Per esempio un numero quale un codice di avviamento postale, sul quale non si dovranno eseguire né addizioni né sottrazioni, può essere codificato convenientemente in forma testuale o alfanumerica, considerando le sue cifre alla stregua degli altri simboli presenti su una tastiera. A differenza della codifica dei dati numerici, quella dei dati alfanumerici è puramente convenzionale, nel senso che non c’è alcuna ragione particolare per attribuire a una lettera una certa successione di “0” e “1” piuttosto che un’altra. Le due codifiche più diffuse sono i codici ASCII ed EBCDIC. Codifica ASCII. Il codice ASCII (da American Standard Code for Information Interchange, Codice standard americano per lo scambio di informazioni) è impiegato in quasi tutti i personal computer e in buona parte dei sistemi di elaborazione mediograndi. Usa una codifica a 7 bit per codificare 128 simboli standard, mentre un ottavo bit può essere impiegato per codificare in modo non standard lettere di particolari alfabeti, caratteri semigrafici o simboli speciali, oppure per aggiungere un controllo di parità. I primi 32 caratteri del codice corrispondono a codici di controllo, cioè non codificano i tasti presenti su una tastiera, ma determinano particolari operazioni quando sono ricevuti da una periferica. Nel codice ASCII i caratteri minuscoli vengono dopo quelli maiuscoli, e sono “sfasati” rispetto a essi di 32 caratteri; ciò consente di trasformare un carattere minuscolo in maiuscolo sottraendo 32 al numero che lo codifica. Per esempio, il numero 1234 avrebbe nel codice ASCII la codifica seguente. Codifica EBCDIC. Il codice EBCDIC (da Extended Binary Coded Decimal Interchange Code, Codice di scambio decimale codificato in binario esteso) è un codice a 8 bit impiegato in prevalenza dai mainframe IBM. In esso non tutte le 256 posizioni sono occupate, la collocazione delle lettere dell’alfabeto è discontinua e alcuni caratteri del codice ASCII sono assenti (ma vale anche il viceversa). Pertanto non vi è una corrispondenza tra i due codici, cosicché nel collegare personal computer a mainframe IBM si devono utilizzare dispositivi di traduzione specifici. Dec Hex Code Dec Hex 0 00 NUL 32 1 01 SOH 2 02 3 03 4 04 5 05 Dec Hex Code Dec Hex Code 20 64 40 space 96 60 - 33 21 65 41 97 61 / STX 34 22 66 42 98 62 ETX 35 23 67 43 99 63 36 24 68 44 100 64 37 25 LF 69 45 101 65 6 06 38 26 ETB 70 46 102 66 7 07 39 27 ESC 71 47 103 67 8 08 40 28 72 48 104 68 9 09 41 29 73 49 105 69 10 0A 42 2A 74 4A [ 106 6A | 11 0B VT 43 2B 75 4B . 107 6B , 12 0C FF 44 2C 76 4C < 108 6C % 13 0D CR 45 2D ENQ 77 4D ( 109 6D _ 14 0E SO 46 2E ACK 78 4E + 110 6E > 15 0F SI 47 2F BEL 79 4F |! 111 6F ? 16 10 DLE 48 30 80 50 & 112 70 17 11 49 31 81 51 113 71 18 12 50 32 82 52 114 72 19 13 51 33 83 53 115 73 20 14 52 34 84 54 116 74 21 15 53 35 85 55 117 75 22 16 54 36 86 56 118 76 23 17 55 37 87 57 119 77 24 18 CAN 56 38 88 58 120 78 25 19 EM 57 39 89 59 121 79 ‘ 26 1A 58 3A 90 5A !] 122 7A : 27 1B 59 3B 91 5B $ 123 7B # 28 1C IFS 60 3C 92 5C * 124 7C @ 29 1D IGS 61 3D 93 5D ) 125 7D ‘ 30 1E IRS 62 3E 94 5E ; 126 7E = 31 1F IUS 63 3F 95 5F ^ 127 7F " HT DEL BS Code SYN EOT NAK SUB Dec Hex 128 80 129 81 130 131 Code Dec Hex 160 A0 a 161 A1 82 b 162 83 c 163 132 84 d 133 85 134 86 135 136 Code Dec Hex Code Dec Hex Code 192 C0 { 224 E0 \ ~ 193 C1 A 225 E1 A2 s 194 C2 B 226 E2 A3 t 195 C3 C 227 E3 T 164 A4 u 196 C4 D 228 E4 U e 165 A5 v 197 C5 E 229 E5 V f 166 A6 w 198 C6 F 230 E6 W 87 g 167 A7 x 199 C7 G 231 E7 X 88 h 168 A8 y 200 C8 H 232 E8 Y 137 89 i 169 A9 z 201 C9 I 233 E9 Z 138 8A 170 AA 202 CA 234 EA 139 8B 171 AB 203 CB 235 EB 140 8C 172 AC 204 CC 236 EC 141 8D 173 AD 205 CD 237 ED 142 8E 174 AE 206 CE 238 EE 143 8F 175 AF 207 CF 239 EF 144 90 176 B0 208 D0 } 240 F0 0 145 91 j 177 B1 209 D1 J 241 F1 1 146 92 k 178 B2 210 D2 K 242 F2 2 147 93 l 179 B3 211 D3 L 243 F3 3 148 94 m 180 B4 212 D4 M 244 F4 4 149 95 n 181 B5 213 D5 N 245 F5 5 150 96 o 182 B6 214 D6 O 246 F6 6 151 97 p 183 B7 215 D7 P 247 F7 7 152 98 q 184 B8 216 D8 Q 248 F8 8 153 99 r 185 B9 217 D9 R 249 F9 9 154 9A 186 BA 218 DA 250 FA 155 9B 187 BB 219 DB 251 FB 156 9C 188 BC 220 DC 252 FC 157 9D 189 BD 221 DD 253 FD 158 9E 190 BE 222 DE 254 FE S Codici rilevatori di errori Quando si trasmettono caratteri codificati mediante stringhe di “0” e “1” attraverso una rete dati, può succedere che uno degli “0” o degli “1” venga modificato da disturbi di trasmissione, trasformandosi nel bit opposto: uno “0” in un “1” o viceversa. È allora utile che il sistema di comunicazione sia in grado di rilevare quando un bit della stringa è stato modificato, in modo da segnalare la necessità di ripetere la trasmissione. Per potere rilevare un cambiamento di un singolo bit, è necessario che nel codice adottato non ci siano due caratteri la cui rappresentazione differisca di un solo bit. Se così non fosse, infatti, il risultato sarebbe la codifica dell’altro carattere e non sarebbe possibile rilevare l’errore avvenuto. Se per esempio si inviassero i bit della codifica ASCII del carattere “A” A 1 0 0 0 0 0 1 e si verificasse un cambiamento nella sesta posizione da sinistra, verrebbe inviato il codice del carattere “C” C 1 0 0 0 0 1 1 e non vi sarebbe modo di accorgersi che si è verificato un errore. Una possibilità per trasformare il codice ASCII in modo che non vi siano codici che differiscano in una sola posizione consiste nel fare seguire ai 7 bit che codificano un carattere un ottavo bit detto di parità. Esso viene scelto in modo che il numero totale dei bit “1” di qualsiasi codice sia pari o, come anche si dice, che ogni gruppo di 8 bit abbia parità pari (naturalmente si potrebbe anche scegliere l’ottavo bit in modo che il gruppo abbia una parità dispari). Dato che due sequenze di bit che abbiano entrambe parità pari non possono differire per un solo bit (ma almeno per due), ne concludiamo che l’aggiunta di un bit di parità fornisce un codice rilevatore di errori per la codifica dei caratteri. Se, infatti, nell’esempio precedente aggiungiamo il bit di parità ai codici ASCII delle lettere “A” e “C”, otteniamo rispettivamente le stringhe A 1 0 0 0 0 0 1 0 C 1 0 0 0 0 1 1 1 che, come è evidenziato, differiscono in due posizioni (la sesta e l’ottava da sinistra). Osserviamo che utilizzando n bit si possono costruire 2n sequenze diverse, e quindi codificare 2n caratteri; se tuttavia si aggiunge un bit di parità, il numero di caratteri codificabili si dimezza, a parità di numero di bit impiegati. Codifica delle grandezze fisiche Oltre ai dati numerici o testuali, un computer può ovviamente elaborare anche grandezze fisiche quali una temperatura o una pressione. Per esempio un computer potrebbe essere collegato costantemente con una termocoppia che gli invia una tensione elettrica proporzionale alla differenza di temperatura tra due punti, in maniera da eseguire determinate operazioni a seconda dei valori di temperatura rilevati. La prima operazione che si deve compiere perché un sistema informatico possa memorizzare, elaborare e trasmettere i dati relativi a una grandezza fisica, è quella di trasformarla in una forma adatta a essere trattata dal sistema stesso. Date le caratteristiche degli attuali calcolatori elettronici, tale forma è quella cosiddetta digitale binaria, nella quale cioè i dati vengono dapprima trasformati in una serie di numeri (ingl. digit), che successivamente vengono espressi secondo il sistema di numerazione binario (forma binaria). Una volta che i dati siano stati così codificati in una opportuna successione di “0” e “1”, essi potranno essere trattati direttamente dai circuiti elettronici del computer. Naturalmente, dopo il trattamento essi subiranno la trasformazione inversa, riassumendo la forma originaria o comunque una comprensibile agli utenti del sistema. Digitalizzazione di una forma d’onda analogica. Vediamo su un esempio schematico come sia possibile codificare un segnale analogico, cioè variabile nel tempo in modo continuo, in un segnale digitale, cioè costituito da una serie di numeri (interi), che successivamente sono convertiti in forma digitale. Consideriamo il diagramma seguente, che potrebbe essere per esempio il grafico di un segnale audio analogico o di un’onda di pressione acustica. Per trasformarlo in una serie di numeri si considera un certo numero di punti sull’asse x e sull’asse y. Quindi si segnano sulla curva i punti in cui essa interseca le ordinate alzate dai punti considerati sull’asse x (procedimento detto di campionamento), e si legge sull’asse y l’ordinata dei punti della curva, assegnando a ciascuno di essi il valore più vicino tra i valori discreti considerati sull’asse y (procedimento detto di quantizzazione). In pratica ciò equivale a sostituire una curva continua con una spezzata, per cui si vede che quanto più ravvicinati sono i punti considerati sui due assi, tanto meglio la spezzata approssima la curva. In particolare, se l’asse y è stato suddiviso in 2 intervalli si parla di quantizzazione a 1 bit, se è stato suddiviso in 4 intervalli si parla di quantizzazione a 2 bit, in 8 intervalli a 3 bit e così via. Digitalizzazione di una immagine. Vediamo come sia possibile digitalizzare una immagine, iniziando dal caso più semplice che essa sia in bianco/nero. 1. Immaginiamo di sovrapporre alla immagine da digitalizzare una griglia a maglie quadrate (in questo caso di 34 righe e 32 colonne). 2. In ogni quadratino della griglia scriviamo “0” se esso è riempito per meno della metà, “1” se è riempito per metà o più. 3. Abbiamo così ottenuto 34 numeri binari da 32 bit ciascuno, che permettono di ricostruire l’immagine di partenza riga per riga (ovviamente al crescere del numero dei quadratini della griglia cresce la definizione della digitalizzazione). I singoli elementi che costituiscono l’immagine digitalizzata si chiamano pixel (da picture element), e nel caso di immagini in bianco/nero valgono 0 o 1. Se l’immagine da digitalizzare è a colori, a ogni suo pixel si associa un valore variabile in un intervallo più ampio, che ne codifica il colore (prevalente). Per codificare 8 colori servono 3 bit, per 16 colori 4 bit e così via. In pratica, a ciascun colore si associa un numero esadecimale di 6 cifre del formato #RRGGBB, dove RR rappresenta la quantità del colore fondamentale rosso (Red), GG la quantità di verde (Green), BB la quantità di blu (Blue) presenti in quel colore. Sono possibili in tal modo 2563 = 16.777.216 sfumature diverse di colori. La figura seguente mostra i nomi dei 16 colori standard e i loro codici esadecimali. Vantaggi della digitalizzazione. La digitalizzazione di una grandezza analogica comporta diversi vantaggi, qui di seguito illustrati: possibilità di compressione. Una volta digitalizzati, i testi, i segnali audio e le immagini video e possono venire “compressi”, cioè occupare uno spazio anche molte volte inferiore a quello originario, senza perdita apprezzabile di informazione. La forma compressa è particolarmente adatta per trasmettere velocemente o per memorizzare in spazi ridotti le informazioni, che quando serve vengono “decompresse” in modo assai facile; integrazione di media diversi. Il fatto di trattare informazioni di natura diversa – quali testi e disegni, brani audio, immagini video – nella stessa forma digitale consente la loro integrazione in prodotti “multimediali” e “interattivi”, dei quali l’esempio forse più conosciuto è costituito dalle diffuse “Enciclopedie multimediali”; · possibilità di manipolazione. Sulle informazioni di tipo digitale sono possibili diversi tipi di manipolazioni, quali per esempio la formattazione automatica di un testo secondo una varietà di parametri (tipo e grandezza del carattere, lunghezza e spaziatura delle righe, giustificazione del margine, divisione in sillabe, ecc.), l’eliminazione di un rumore di fondo in un brano audio, la trasformazione di un colore in una immagine, la generazione automatica di immagini (effetti speciali, attori virtuali nei film); · qualità della riproduzione. Se si duplica ripetutamente una registrazione audio, una videocassetta o una immagine tramite fotocopia, la qualità del duplicato peggiora progressivamente a ogni copia successiva. Invece la duplicazione digitale conferisce al duplicato la stessa qualità dell’originale, consentendo una riproducibilità all’infinito; · crittazione sicura. Le informazioni digitali si possono cifrare in maniera estremamente difficile da decifrare, e quindi si possono trasmettere con elevati margini di sicurezza. •utilizzo più efficiente della larghezza di banda. La trasmissione di segnali radiofonici e televisivi in forma digitale richiede una disponibilità di frequenze inferiore di 4-5 volte rispetto a un'analoga trasmissione in tecnica analogica, e costituisce uno dei rincipali vantaggi della prossima televisione digitale terrestre. Quest'ultima richiede anche una potenza di emissione minore - a parità d copertura - della televisione analogica.