Indice
8. L'elaborazione dei dati e la programmazione
8.1 La rappresentazione digitale dei dati
I dati sono rappresentati in maniera:
- analogica quando possono assumere infiniti valori
- digitale se possono assumere solo un numero prefissato di valori
Si dice che un'informazione analogica è espressa in forma continua mentre una digitale in forma discreta (o numerica).
Ad esempio l'ora indicata da un orologio con le lancette è un'informazione analogica perché le lancette si spostano in maniera graduale su tutto il quadrante. Viceversa l'ora indicata da un orologio digitale è un'informazione digitale perché i valori che possono assumere le ore, i minuti e i secondi sono “solo” 60 (ad esempio tra le 10:09:59 e le 10:10:00 non c'è un valore intermedio).
Internamente i computer trattano solo informazioni digitali. Per questo motivo quando abbiamo a che fare con dati analogici occorre prima codificare le informazioni, cioè trasformarle in informazioni digitali.
I computer rappresentano le informazioni in maniera digitale utilizzando il sistema binario. In questo sistema ogni informazione è espressa numericamente con una sequenza di cifre binarie - i bit - che possono assumere solo due valori: 0 o 1. Dentro un computer allora ogni informazione (numeri, istruzioni, dati, immagini, suono, ecc.) è codificata nel sistema binario. Il motivo per cui si è adottata la codifica binaria è che a livello hardware le informazioni corrispondono a dei segnali elettrici che possono avere solo due valori: tensione alta (1) o tensione bassa (0).
Con un solo bit è facile rappresentare informazioni che presentano solo due stati (come acceso o spento, vero o falso) basta far corrispondere una condizione a 0 e l'altra a 1. Per rappresentare informazioni più complesse (numeri, caratteri, ecc.) invece è necessaria una codifica. Per cominciare vediamo come è possibile rappresentare un numero nel sistema binario.
Un po' di matematica: trasformare numeri decimali in binari e viceversa
Per capire il sistema di numerazione binario ragioniamo su come funziona quello decimale: ogni numero è rappresentato da una serie di cifre che corrispondono, da destra a sinistra, alle unità, decine, centinaia, ecc. Ad esempio il numero 245 corrisponde a:
2x100 + 4x10 + 5x1 = 245
Il sistema binario funziona allo stesso modo ma ogni cifra può valere solo 0 o 1 e corrisponde, da destra a sinistra, a 1, 2, 4, 8, 16, ecc. Per esempio il numero binario 1011 (che si legge uno-zero-uno-uno e non mille-e-undici) corrisponde a:
1011 = 1x8 + 0x4 + 1x2 + 1x1 = 11 (in decimale)
I valori che moltiplichiamo per 0 o per 1 non sono altro che le potenze del due (infatti 20=1, 21=2, 22=4, ecc.) mentre nel sistema decimale erano le potenze di 10 (100=1, 101=10, 102=100, ecc.).
Abbiamo visto a quale numero decimale corrisponde un numero binario. Ma come si codifica un numero decimale in binario? Il procedimento è un po' più complicato: bisogna dividere il numero decimale per 2, segnare il risultato e il resto e continure dividendo ogni volta il risultato per 2 fino ad ottenere 0. Il numero binario corrisponde alla sequenza formata dai resti partendo dall'ultima divisione. Ad esempio per convertire il numero decimale 13 si procede così:
13:2 = 6 resto 1 6:2 = 3 resto 0 3:2 = 1 resto 1 1:2 = 0 resto 1 il numero decimale 13 in binario è 1101 (verifica: 1101 = = 1x8 + 1x4 + 0x2 + 1x1 = 13)
L'unità di misura elementare di un informazione digitale è il bit (il nome sta per binary-digit) ma più spesso si utilizza un suo multiplo, il byte, che è formato da 8 bit. Con un bit si può rappresentare un'informazione che ha solo due valori, con un byte un'informazione che ha 28=256 possibili valori (ad esempio un carattere della tastiera).
Le dimensioni dei file, la capacità di un hard disk o di un modulo di RAM sono espresse nei multipli del byte descritti nella tabella seguente:
unità di misura | simbolo | valore | esempio |
---|---|---|---|
bit | bit | 1 bit | vero/falso |
byte | B | 8 bit | un carattere |
kilobyte | kB | 1024 byte | una pagina di testo |
megabyte | MB | 1024 kilobyte | un file MP3 |
gigabyte | GB | 1024 megabyte | un video divx di 2 ore |
terabyte | TB | 1024 gigabyte | capacità di un hard disk |
In un computer i caratteri sono spesso codificati utilizzando 8 bit con il codice ASCII. Questo codice fa corrispondere ad ognuno dei 256 (28) valori possibili una lettera o un numero o un simbolo di punteggiatura. Ad esempio la lettera “A” (a maiuscola) corrisponde al codice binario 01000001 (65 in decimale) e il simbolo “,” (virgola) al codice 00101100 (44 in decimale). Per avere più di 256 simboli a disposizione si utilizza il codice Unicode a 16 bit che, con più di 65 mila simboli a disposizione, può rappresentare i caratteri di tutte le lingue.
Anche le immagini sono rappresentate da sequenze di bit. Il caso più semplice possibile è quello in cui ogni pixel che forma l'immagine può essere solo bianco o nero; allora basta far corrispondere ad ogni pixel un bit per distinguere due colori. Per le immagini a colori si assegna ad ogni pixel un numero maggiore di bit. Ad esempio le macchine fotografiche digitali assegnano ad ogni pixel 24 bit; 8 per il rosso, 8 per il verde e 8 per il blu. Con questa tecnica è possibile formare 16 milioni di colori diversi per ogni pixel mescolando le tre tonalità di rosso, verde e blu.
8.2 Come si affrontano i problemi
Lo scopo dell'informatica è risolvere problemi con l'aiuto dei computer. Per far questo occorre:
- analizzare e definire con precisione il problema
- scomporlo in sottoproblemi per i quali è più facile trovare una soluzione
- individuare la soluzione e descrivere tutti i passaggi per ottenerla
- “tradurre” questi passaggi in un programma utilizzando un linguaggio di programmazione
- eseguire il programma
In questo processo hanno un ruolo fondamentale l'astrazione e la generalizzazione: quando si risolve un problema si cerca di trovare una soluzione generale non riferita ad un singolo caso specifico. Ad esempio per calcolare l'area di un quadrato di 10 centimetri di lato si potrebbe usare una formula valida solo per quel quadrato:
area = 10 x 10
oppure una formula più generale:
area = lato x lato
che usando lato
al posto di 10
(astrazione) permette di calcolare l'area di qualunque quadrato o addirittura questa:
area = base x altezza
che calcola l'area di qualunque rettangolo e quindi anche di un quadrato, dove base e altezza sono uguali (generalizzazione). Insomma, l'astrazione e la generalizzazione permettono di trovare soluzioni valide per una vasta gamma di problemi e di riutilizzarle in altri problemi.
I termini lato
, base
e altezza
delle formule precedenti sono esempi di variabili. In informatica una variabile è un nome a cui viene assegnato un valore che può cambiare durante l'esecuzione di un programma. Una costante è invece un nome a cui è assegnato un valore che non cambia mai. Ad esempio se il problema è quello di calcolare la circonferenza di un cerchio useremo la formula:
circonferenza = diametro x pigreco
dove diametro
è una variabile che assume un valore diverso per ogni cerchio e pigreco
è una costante che vale sempre 3,14.
8.3 Gli algoritmi e i diagrammi di flusso
Un algoritmo descrive il procedimento per ottenere la soluzione di un problema passaggio per passaggio. Per poter essere eseguito da un computer un algoritmo deve avere queste caratteristiche:
- generalità: deve permettere di risolvere un gruppo di problemi
- finitezza: il tempo per trovare la soluzione non può essere infinito
- non ambiguità: il procedimento deve essere descritto con precisione in modo che non siano possibili diverse interpretazioni
Il modo più semplice di rappresentare un algoritmo è con un diagramma di flusso. Si tratta di una descrizione grafica del procedimento che mette in evidenza in maniera chiara e generica i passaggi da svolgere. Sarà il programmatore, in una fase successiva, a tradurre questi passaggi in un programma usando un linguaggio di programmazione a sua scelta.
Nei diagrammi di flusso il procedimento è descritto usando dei blocchi, che indicano il tipo di operazione da svolgere, collegati con delle frecce. I simboli usati sono i seguenti:
Il blocco ovale indica l'inizio e la fine dell'algoritmo; il parallelogramma serve per immettere dati (input) o scriverli in uscita (output); il rettangolo rappresenta le singole operazioni; il rombo indica la scelta tra due alternative in base a una condizione; le frecce indica la sequenza delle operazioni nel procedimento.
Per fare un esempio consideriamo l'algoritmo che calcola il valore assoluto della differenza tra due numeri. Se A è il primo numero e B il secondo il valore assoluto della differenza è indicato con |A-B| e vale A-B se A è maggiore di B altrimenti vale B-A. Il diagramma di flusso che rappresenta questo algoritmo è il seguente:
L'algoritmo usa tre variabili: A
, B
e C
. Alle prime due viene assegnato un valore letto dalla tastiera, il terzo viene calcolato in maniera diversa a seconda che la condizione A - B > 0
sia vera o falsa. L'operazione di assegnazione è indicata dalla freccia verso sinistra (←).
8.4 I linguaggi di programmazione
Quando un programma viene eseguito su un computer è rappresentato come una sequenza di 0
e 1
I programmi eseguibili da un PC sono rappresentati da una sequenza di 0
e 1
in quello che viene chiamato linguaggio macchina. Scrivere un programma in questo linguaggio sarebbe molto difficile; per questo di solito si scrive il programma in un linguaggio di alto livello. Questi linguaggi sono più simili al linguaggio umano ma non presentano ambiguità e sono adatti a descrivere un algoritmo con pochi comandi facili da ricordare.
Il testo del programma scritto in un liguaggio di alto livello è chiamato codice sorgente (source code) e non è direttamente eseguibile dal computer. A seconda del linguaggio scelto per eseguire il programmi bisogna:
- compilare il programma, cioè trasformare il codice sorgente in linguaggio macchina per poi eseguirlo
- oppure utilizzare un interprete, cioè un altro programma che traduce al volo il codice sorgente in linguaggio macchina mentre lo esegue
I due approcci hanno vantaggi e svantaggi. In genere i programmi compilati sono eseguiti più velocemente; quelli interpretati sono più facili da programmare e possono essere eseguiti su piattaforme diverse (Windows, Mac, Linux).
8.5 La programmazione strutturata: istruzioni sequenziali
Nei linguaggi di programmazione l'ordine con cui vengono eseguite le varie operazioni è governato da tre fondamentali strutture di controllo:
- la sequenza
- la selezione o struttura condizionale
- il ciclo o struttura iterativa
Nella sequenza le istruzioni vengono semplicemente eseguite una dopo l'altra e possono essere di tre tipi:
- lettura (o ingresso o input), ad esempio quando si legge un dato da tastiera
- scrittura (o uscita o output), ad esempio quando si visualizza qualcosa sullo schermo
- assegnazione, quando si attribuisce ad una variabile un valore calcolato con un espressione
Ad esempio l'algoritmo che calcola l'area di un quadrato può essere rappresentato con questo diagramma di flusso:
Si tratta di una sequenza con un operazione di lettura, due di assegnazione e una di scrittura. In questo esempio compare l'operazione matematica del prodotto; ogni linguaggio di programmazione ha una serie di funzioni già pronte per svolgere le operazioni più comuni - come quelle aritmetiche - raccolte in librerie. Usare le funzioni di una libreria è comodo perché:
- per svolgere un'operazione complicata basta sapere come si chiama la funzione che ci serve e di quali dati ha bisogno; non è necessario capire come funziona
- è possibile riutilizzarle in problemi diversi
8.6 La programmazione strutturata: le selezioni
Spesso accade che un programma debba seguire un procedimento diverso al verificarsi o meno di una condizione. E' quello che avviene nelle strutture condizonali o selezioni, dove viene controllata una certa condizione (test) e si seguono percorsi alternativi a seconda che sia vera o falsa. Abbiamo già visto questa struttura nell'esempio sul valore assoluto del paragrafo 8.3, dove il risultato è diverso se la condizione |A - B| > 0
è vera o falsa.
Nei vari linguaggi di programmazione questa struttura viene realizzata con le istruzioni IF
e ELSE
che in Inglese significano “se” e “altrimenti”, ad esempio:
if <condizione> <azione> else <azione>
8.7 La programmazione strutturata: le iterazioni o cicli
Nei programmi accade che certe operazioni debbano essere ripetute molte volte. E' quello che avviene nei cicli dove si ripetono un gruppo di istruzioni fino a che non si verifica una certa condizione.
Esistono due tipi di cicli:
- quelli dove viene ripetuto un gruppo di istruzioni finché una condizione è vera (cicli WHILE)
- quelli dove viene ripetuto un gruppo di istruzioni un numero prestabilito di volte (cicli FOR)
Vediamo un ciclo WHILE: l'algoritmo chiede di indovinare un numero (7 in questo caso) leggendo un valore dalla tastiera e attribuendolo alla variabile N. Il ciclo continua finché il numero non viene indovinato.
Infine vediamo un esempio di ciclo FOR: il diagramma di flusso seguente stampa tutti i numeri da 1 a 100.
Nei cicli FOR è sempre presente una variabile chiamata indice che conta quante volte è stato ripetuto il ciclo. Nell'esempio sopra è la variabile N.
Navigazione
Torna all'indice.