690 likes | 852 Views
FONDAMENTI DI INFORMATICA I A.A. 2006-2007 - prof. Angelo GALLIPPI angelo.gallippi@uniroma2.it Data inizio: 5 marzo 2007 Data fine: 25 giugno 2007 Totale ore: 90 n° crediti: 10 Orario Lunedì 14-15.45 Aula 3 PP2 Martedì 11.30-13.15 Aula 8 PP2
E N D
FONDAMENTI DI INFORMATICA I A.A. 2006-2007 - prof. Angelo GALLIPPI angelo.gallippi@uniroma2.it Data inizio: 5 marzo 2007 Data fine: 25 giugno 2007 Totale ore: 90 n° crediti: 10 Orario Lunedì 14-15.45 Aula 3 PP2 Martedì 11.30-13.15 Aula 8 PP2 Mercoledì 14-15.45 Aula 3 PP2
TEST D’INGRESSO • Cosa indicano le seguenti sigle: NMOS, NAND, DRAM, CD-ROM? • 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.
[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. 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.
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 cifre0e1- 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 37101001012.
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,8125100,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 10010123710.
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 medio-grandi. 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.