Upload
phunganh
View
219
Download
0
Embed Size (px)
Citation preview
10/09/2018
Liceo delle Scienze Applicate
Informatica
Classe prima
Fondamenti
Argomenti:
Introduzione
Hardware e Software
Sistemi di numerazione
Memorizzazione delle informazioni
Il Foglio Elettronico
La formattazione condizionale
Introduzione agli Algoritmi
Appendice
Argomenti Hardware e Software
Cos’è (e cosa non è) l’Informatica
Per iniziare il nostro corso, sarà opportuno illustrarne gli obiettivi e chiarire le idee sui concetti di base
dell’informatica, a proposito dei quali circolano parecchie informazioni errate.
Intanto, nessun corso di informatica si occupa di:
Videogiochi
Messaggi
Social networks
Queste attività, contrariamente a quanto molti ritengono, non sono “alta tecnologia” e NON rendono chi le
pratica un esperto di informatica. Servono piuttosto a usare come giocattolo una macchina di grande
complessità in grado di risolvere problemi in molti settori della conoscenza umana.
Alcuni esempi di cosa fanno veramente i computer:
I computer industriali manovrano
automatismi in grado di costruire
di tutto, dalle manette alle
automobili, e anche altri computer.
I computer scientifici analizzano i
dati delle particelle ad alta energia
nei laboratori del CERN a
Ginevra, o analizzano la struttura
dell’universo negli osservatori
astronomici.
L’economia mondiale potrà
piacere o no, comunque è gestita
attraverso i computer.
Anche se negli anni ’60 erano
meno potenti di un moderno
smartphone, i computer hanno
mandato l’uomo nello spazio.
L’unico “spazio” con cui questi
individui hanno avuto a che fare è
quello che hanno creato nel
portafoglio per acquistare costosi
giocattoli. E sono pure contenti…
Per tornare all’obiettivo iniziale, questo:
NON è un corso per imparare a scrivere testi e documenti;
NON è un corso di tecnologia;
È un corso orientato alla risoluzione di problemi scientifici con l’uso del computer.
Definizioni
Informazione
Sequenza di simboli che registra e consente di trasmettere un concetto.
Scienza dell’Informazione
Si occupa della gestione generale dell’informazione: raccolta, classificazione, analisi, memorizzazione,
manipolazione, cancellazione, reperimento e disseminazione (la raccolta avviene prima di memorizzare; il
reperimento riguarda le informazioni già memorizzate).
N.B. Questo vale in ogni sua forma: scritta (anche manualmente), grafica, orale…
Formato
Come è memorizzato un gruppo di informazioni. A volte (in stampa o su uno schermo) può coincidere con il
loro aspetto visivo. Altre volte segue una codifica: ad esempio, il codice ASCII1 per la lettera A è 65, mentre
quello per la lettera a è 97; in realtà c’è anche una seconda codifica, perché nella memoria di un computer i
valori sono rispettivamente 01000001 e 01100001. Il numero 485 può essere, a seconda dei casi,
memorizzato come 001101000011100000110101 oppure 00000000000000000000000111100101.
Le informazioni possono essere di formato misto, solitamente per rendere più comprensibile il concetto
memorizzato. L’esempio è preso dal regolamento federale del gioco del calcio, dove le immagini vengono
accompagnate alle spiegazioni, al fine di chiarire meglio le situazioni.
Le informazioni sono utili quando possono essere condivise (disseminazione):
Comunicazione
Processo di trasmissione di informazioni tra un mittente e uno o più destinatari.
Messaggio
Contenuto di una comunicazione.
Protocollo
Insieme di regole definite al fine di regolare la comunicazione tra uno o più entità. Tra le varie cose che
descrivono, c’è il formato che determinate informazioni devono avere. Nel caso delle reti di computer, ci
sono anche tutte le caratteristiche del tipo di segnale trasmesso.
1 American Standard Code for Information Interchange, uno dei più usati metodi di codifica delle informazioni.
A picture is worth a thousand words
http://www.aia-figc.it/download
Informatica (da: informazione automatica) – Computer science (CS) – Information Technology (IT)
Studio dei fondamenti teorici della gestione dell’informazione e delle tecniche pratiche per la sua
applicazione in sistemi automatizzati (computer).
L’informatica NON è da confondere con l’uso di software applicativo, come: programmi per l’ufficio,
navigazione Web, videogiochi, condivisione di immagini. L’uso è un aspetto marginale, non è tutto, anche se
è abbastanza naturale che un esperto di informatica sia in grado di usare bene alcuni programmi.
Uno dei maestri dell’informatica, Edsger Dijkstra (1930-2002), ha spiegato chiaramente il
concetto:
Computer science is no more about computers than astronomy is about telescopes
(L'informatica non riguarda i computer più di quanto l'astronomia riguardi i telescopi)
Questo significa che il computer è un mezzo, non un fine. L’informatica è uno studio
completo dell’informazione e degli strumenti teorici e pratici per la sua gestione. Gli aspetti
tecnici (riguardanti computer e dispositivi associati) sono il supporto per conoscere le caratteristiche generali
dello strumento informatico più diffuso, ma non sono tutto. Quindi: “informatica” NON è il solo studio dei
Personal Computer. Inoltre non è molte cose: NON è “abilità nell’usare il Personal Computer”, NON è
“postare immagini”, NON è “usare giocattoli tecnologici”, Chi si ritiene “esperto” perché sa fare queste cose
non ha la minima idea di cosa stia dicendo.
Programma
Sequenza di istruzioni per fare svolgere determinate azioni a un computer. Spesso si tratta di comandi che
sembrano rivolti ad una persona.
Linguaggio di Programmazione
Linguaggio artificiale progettato per comandare le azioni di un computer. Queste operazioni possono essere
di calcolo o di I/O (input/output: servono per comunicare dati e ottenere risultati).
Programmatore
Chi scrive programmi (vedi a fianco). Contrariamente a quanto molti pensano, un
programmatore non vi aggiusterà una stampante o un dispositivo guasto, compito
estraneo alle sue conoscenze.
Sigle utili
GIGO – Garbage In, Garbage Out
Se i dati forniti al computer non hanno senso, nemmeno le risposte ne avranno.
KISS – Keep It Simple, Stupid
Fare le cose in modo semplice: il facile è reso difficile attraverso l’inutile.
RTFM – Read The F***ing Manual
Prima (di fare domande inutili), leggi le istruzioni.
GIYF – Google Is Your Friend
Vallo a cercare su Google.
Saggezza informatica
“I computer sono inutili, possono dare solo risposte” (Pablo Picasso)
“It is the greatest truth of our age: Information is not knowledge” (Caleb Carr)
“I have only one major problem with the Internet: it’s full of liars” (John Lydon/Johnny Rotten)
Simoniy Kàroly (60)
Introduzione Numeri
Come è nato il computer
Hardware: le parti di un computer che puoi prendere a calci;
Software: le parti di un computer che non funzionano.
Più seriamente, lo hardware (=ferramenta) sono i componenti fisici, che si possono toccare; il software sono
i programmi, che sono registrati in qualche unità di computer, ma non sono materiali.
I Greci (ma non solo) erano stati in grado di produrre numerosi congegni, tra i quali un vero e proprio
distributore automatico, come fece (probabilmente nel I secolo A.C.) un certo Erone di Alessandria: egli
costruì un congegno azionato da una moneta che, cadendo su una leva, apriva una valvola che faceva uscire
l’acqua per le cerimonie sacre.
Per quanto riguarda il calcolo, invece, non si andò oltre l’abaco, anche se i Romani lo usavano con tecniche
molto sofisticate. Ancora oggi, in paesi come India e Giappone, l’abaco viene usato comunemente, e c’è chi
riesce a visualizzarlo nella mente senza averne uno disponibile. Ci sono filmati (leggermente inquietanti) che
mostrano alcuni studenti particolarmente abili:
https://www.youtube.com/watch?v=hepU-W8ksEk https://www.youtube.com/watch?v=FgFEckm-rRA
La matematica europea, trascurata durante l’Alto Medioevo, iniziò la sua storia quando, intorno al 1200, un
giovane commerciante, Leonardo da Pisa (detto il Fibonacci), fece conoscere un sistema di cifre inventato
alcuni secoli prima in India, e adottato dagli Arabi, presso i quali Leonardo aveva studiato e lavorato.
La nuova aritmetica, presto furono applicate alla
contabilità e alla finanza2, aumentando la
quantità di calcoli: presto qualcuno iniziò a
pensare a macchine che potessero svolgerli al
posto dell’uomo, senza sviste o stanchezza che
portassero ad errori. Una delle prime calcolatrici
meccaniche, presente in ogni storia del calcolo
automatico, è la “pascalina”, progettata da Blaise
Pascal (1623-1662), che sostanzialmente è il
disegno con il quale funzionarono per secoli i
registratori di cassa, quelli a manovella che si vedono nei vecchi film, ma anche
quelli elettrici. In realtà la prima macchina calcolatrice conosciuta fu costruita
da Wilhelm Schickard nel 1623. Assomiglia in modo impressionante ai primi modelli di computer.
Il primo concetto di “macchina calcolatrice” (nel senso moderno di “calcolo automatico”) è probabilmente
quello di Charles Babbage, che inizialmente intendeva usarla per il calcolo di tavole logaritmiche, e poi ne
discusse i possibili usi per ogni genere di calcolo. Babbage
non costruì mai la sua “macchina analitica”, ma ispirò altri
inventori, in particolare alcuni svedesi: dapprima Pehr e
Edvard Scheutz (padre e figlio) costruirono una macchina
simile (1843), seguiti poi da Martin
Wiberg (1875). Il progetto di Babbage
aveva molti elementi dei computer
moderni: lettore di schede perforate,
memoria, unità centrale, registri di calcolo.
Un’amica dell’inventore, Ada Lovelace3,
pensò anche ad un linguaggio con cui programmare la macchina (ed è per questo considerata
da alcuni la prima programmatrice della storia). Nel 1991, bicentenario della nascita di Babbage, alcuni
tecnici del London Science Museum costruìrono una versione funzionante del suo Analytical Engine,
rispettandone il progetto originale e usando solo materiali e tecnologia disponibili ai suoi tempi.
2 Lo stesso Fibonacci, a suo dire, scrisse il proprio trattato più famoso (il Liber Abbaci, che tratta di matematica e di
economia) per aiutare il padre, commerciante e funzionario doganale della repubblica pisana. 3 Nata Augusta Ada Byron, figlia del celebre poeta George. È passata alla storia come the Enchantress of Numbers.
Pascalina e altre diavolerie
Babbage e la macchina costruita nel 1991
Il disegno di Schickard
Intorno all’inizio del XX secolo esistevano già i “computer”.
Proprio così: ma non erano quelli che conosciamo noi.
Erano persone (per lo più donne, pagate anche poco) che
eseguivano calcoli, generalmente a macchina, ma anche a
mano. Sempre al London Science Museum c’è la foto di una
campionessa di calcolo, Amy Bower, descritta come
compter, oltre che come “la più veloce operatrice del
mondo”, avendo vinto una gara organizzata dalla ditta Felt
& Tarrant, costruttrice di macchine da calcolo. C’è anche il
tempo: 3'50" (non si sa per quante addizioni).
Nei laboratori di astronomia le “computer” avevano anche il compito di esaminare le lastre fotografiche e di
contare le stelle. Queste ragazze, sempre sottopagate, furono indispensabili durante l’esplorazione
dell’universo attraverso i primi grandi telescopi. La più famosa fu Henrietta Swan Leavitt, che divenne poi
un’astronoma di prestigio.
Normalmente, grandi aziende, banche e uffici pubblici avevano saloni pieni di macchine contabili e
macchine da scrivere, con una schiera di operatrici (e anche qualche operatore). L’immagine a destra,
scattata nella redazione di un giornale, è degna di nota per la presenza della sputacchiera.
Henrietta Swan Leavitt Tipiche immagini di operatrici al lavoro
I pionieri moderni
È molto difficile proporre una cronologia accurata dello sviluppo dei
computer, anche perché alcuni Paesi si contendono le priorità per questioni
di orgoglio nazionale. Un personaggio molto rimarchevole, comunque,
appare quello del tedesco Konrad Zuse: quasi da solo costruì un computer
elettro-meccanico (Z1) fino dagli anni ’20, per arrivare, attorno al 1941, a
costruirne uno commerciale (Z4). La sua impresa è ancora più degna di nota
se si pensa alle difficili condizioni della Germania in guerra. Zuse progettò
anche uno dei primi linguaggi di programmazione, chiamato Plankalkül.
Il primo calcolatore digitale totalmente elettronico fu una macchina
chiamata ABC (Atanasoff-Berry Computer), non programmabile, costruita
per risolvere sistemi di equazioni (1942). Fu poi
smantellato durante la guerra, e non ebbe un seguito.
Sempre durante la II guerra mondiale, i servizi segreti
inglesi avevano il compito di decifrare i messaggi in
codice che i tedeschi componevano tramite una macchina
chiamata Enigma. Un gruppo di scienziati, tra cui il
“pioniere informatico” Alan Turing, nascosto in una
palazzina a Bletchley Park (a nord-ovest di Londra), vi
riuscì, proseguendo il lavoro di alcuni crittografi polacchi
e usando una macchina chiamata Bombe. Negli anni finali della guerra, i tedeschi usavano un’altra
macchina, chiamata Lorenz-Schlüsselmaschine; per decifrare quei messaggi gli inglesi costruirono dei
computer segretissimi, chiamati Colossus (10 in tutto), talmente segreti che furono distrutti dopo la guerra e
se ne ebbe notizia circa 50 anni dopo. Il Colossus fu il primo elaboratore elettronico programmabile.
Gli americani, intanto, non stavano a guardare: il loro ENIAC (Electronic Numeric Integrator And Computer,
progettato da John Eckert e John Mauchly), che serviva a calcolare le tabelle di puntamento dei cannoni, fu il
primo calcolatore elettronico programmabile, anche se questo non significava scrivere comandi, ma
riconnettere con nuovi schemi una serie di cavi. Rispetto al modello di Atanasoff, questo computer venne
usato estensivamente e diede origine ad altri modelli, chiamati UNIVAC (UNIVersal Automatic Computer).
La priorità di Atanasoff venne riconosciuta solo nel 1973: il giudice Earl Larson (tribunale del Minnesota)
concluse che “Eckert and Mauchly did not themselves first invent the automatic electronic digital computer,
but instead derived that subject matter from one Dr. John Vincent Atanasoff”.
Konrad Zuse con lo Z1
John Atanasoff, Clifford Berry (USA) e l’ABC
Le macchine tedesche: Enigma e Lorenz Turing Bombe Dorothy Du Boisson e Elsie Booker
al Colossus
Dentro l’ENIAC si poteva
passeggiare
Gloria Ruth Gordon e Esther Gerston
riconnettono i cavi UNIVAC
Di nuovo in Inghilterra, un team dell’Università di Cambridge, guidato da Maurice Wilkes, costruì, nel 1949,
un computer chiamato EDSAC (Electronic Delay Storage Automatic Calculator). Il progetto proseguì con
l’aiuto dalla Lyons, un’industria dolciaria che fece costruire una macchina simile, chiamata LEO (Lyons
Electronic Office), probabilmente il primo computer usato per applicazioni commerciali.
Anche il primo calcolatore distribuito commercialmente fu inglese, e dentro c’era un po’ di Italia: il Ferranti
Mark-1 (1951) era costruito da una ditta di Manchester (scomparsa nel 1993), fondata da Sebastian Ferranti,
figlio di un italiano, Cesare. La Ferranti ha un legame con l’oggi: due suoi programmatori, Conway Berners-
Lee e Mary Lee Woods, si sposarono, e il loro figlio, Tim Berners-Lee, avrebbe inventato, una quarantina
d’ani più tardi, il World Wide Web.
Nascevano anche i primi linguaggi di programmazione: uno dei primi venne chiamato George, e fu
sviluppato nel 1952 da J.Halcombe Laning per inserire equazioni in un computer del MIT, Whirlwind
(Tempesta); tra il 1953 e il 1959 ne nacquero altri, tra i quali FLOW-MATIC, FORTRAN,
COBOL. Difficile stabilire una priorità, ma i più probabili candidati come “primo
linguaggio” sono il Plankalkül di Zuse e lo Short Code, sviluppato da John Mauchly per
l’UNIVAC negli anni ‘40.
Tra un modello e l’altro di computer, sempre più piccoli, ma ancora grandi come armadi,
alla fine degli anni ‘60 resisteva ancora uno strumento manuale, il “regolo calcolatore”
(slide rule).
Le prime calcolatrici tascabili furono costruite in Giappone nel 1970, e mandarono presto in pensione il
regolo. Negli anni ’80 una ditta di detersivi regalava calcolatrici tascabili come gadget nei fustini di detersivo
per lavatrice. Fece poi storia in Italia un convertitore lira-euro distribuito dal governo in carica al momento
della transizione tra le due valute (2001).
Immagini del Ferranti Mark 1
EDSAC LEO Lyons
Regolo calcolatore Calcolo di 2 x 3 = 6
Il Personal Computer
Per molti il PC è un’invenzione americana, ma non è stato così: nella sua storia c’è anche un po’
di Italia. Intorno al 1962 un ingegnere della Olivetti, Piergiorgio Perotto (1930-2002), progettò
una macchina programmabile che per molti versi era un prototipo di PC. Le parole di Perotto, con
qualche piccola variazione dovuta alla moderna tecnologia, potrebbero sembrare scritte ora:
“Sognavo una macchina amichevole alla quale
delegare quelle operazioni che sono causa di fatica
mentale e di errori, una macchina che sapesse
imparare e poi eseguire docilmente, che
immagazzinasse dati e istruzioni semplici e
intuitive, il cui uso fosse alla portata di tutti, che
costasse poco e fosse delle dimensioni degli altri
prodotti per ufficio ai quali la gente era abituata.
Dovevo creare un linguaggio nuovo, che non
avesse bisogno dell'interprete in camice bianco“.
La Programma 101 (proprio così, al femminile) ebbe un discreto successo, fu venduta in 40.000 esemplari,
conquistò il mercato americano, e persino la Nasa acquistò alcuni modelli4. Ma i vertici di Ivrea non seppero
cogliere l’occasione, abbandonando la divisione elettronica (venduta agli americani della General Electric)
per concentrarsi sulle calcolatrici da tavolo. Non sembrava realizzabile l’idea di un computer per tutti,
lontano dall’idea del “Centro di Calcolo” (o “Centro Meccanografico” come si diceva allora) con tecnici in
camice bianco chiusi in asettiche sale sigillate.
Anche il microprocessore è un’invenzione italiana, dovuta
al vicentino Federico Faggin (1941-), guarda caso un ex
impiegato Olivetti. Il microprocessore riunisce tutta
l’unità centrale in un unico componente. Questo avrebbe
permesso, nel giro di pochi anni, la
costruzione di piastre madri modulari.
Il moderno PC nasce nel 1981, con
l’uscita del PC IBM. Prima di allora il
mondo informatico viaggiava con strani modelli con ancora più strani sistemi operativi.
Una volta entrato in campo la ditta più ricca e potente, tutto cambia, e nasce uno standard, che comprende
anche il sistema operativo (Microsoft DOS, seguito poi da Windows).
Non è l’hardware migliore? Non è il software migliore? Forse, o
forse no. Ma le cose vanno spesso così. Lo standard ha reso
possibile la compatibilità dei dispositivi e del software. Solo con
dei modelli comuni è possibile sviluppare un’industria globale e
specializzata: in caso contrario non sarebbe possibile avere
contributi coordinati da personaggi indipendenti, sparsi in tutto il mondo.
Attualmente, tuttavia, il mondo del PC non vede uno standard solo ma tre, ciascuno con i propri sostenitori,
eroi e simboli: tra tostapane, mele e pinguini, ciascuno è in grado di scegliere la propria dimensione.
Un’ultima considerazione: a volte la storia non insegna. Anni
dopo la mancata rivoluzione della Programma 101, la stessa
Olivetti era rientrata nel mondo dei PC con macchine come il
P6060, arrivando all’ottimo M24 (1983). Un’altra occasione
d’oro: ma ancora una volta l’azienda smantellò la divisione
d’avanguardia, entrando poi in un lungo periodo di crisi. Al
momento fa parte del gruppo Telecom Italia.
4 L’ex dirigente NASA David Whittle racconta che la Programma 101 fu usata nel progetto Apollo che arrivò a sbarcare
sulla Luna. L’intervista relativa, risalente al 2006, può essere trovata a:
http://www.jsc.nasa.gov/history/oral_histories/WhittleDW/WhittleDW_2-16-06.pdf
Piergiorgio Perotto e la Programma 101
Olivetti P6060 e M24
Federico Faggin e il microprocessore Intel 4004
Il modello di von Neumann
Nel 1945 il matematico ungherese Neumann János Lajos (nome in lingua inglese: John von
Neumann) pubblicò una relazione nella quale descriveva uno schema di “architettura” per il
sistema di calcolo EDVAC (Electronic Discrete Variable Automatic Computer, un successore
dell’ENIAC). Molte delle idee presentate non erano nuove, ma von Neumann ebbe il merito
di organizzarle, chiarendo una struttura che poteva risultare utile nella progettazione di questi
sistemi: talmente utile che il suo modello è ancora in uso.
L’unità centrale del sistema è una piastra di plastica detta motherboard (scheda madre), che contiene gli
alloggiamenti per le parti essenziali del computer: la CPU (Central Processing Unit: il microprocessore), che
è il vero e proprio calcolatore, e la memoria centrale, chiamata RAM (Random Access Memory).
Quest’ultima contiene programmi e dati, consentendo di disporre
di un sistema general purpose (in grado di essere programmato
per più compiti). La parola random non significa che il sistema è
disorganizzato: forse è più efficace l’espressione italiana
“memoria ad accesso diretto”, nata per distinguere la memoria
centrale dalle unità a nastro usate in tempi remoti. l’accesso alle
quali era sequenziale.
Un programma, memorizzato su un disco, viene copiato (o
caricato) nella RAM al momento dell’attivazione. Parte della
RAM viene destinata ai dati del programma. La CPU, per
effettuare i calcoli, copia al suo interno istruzioni e dati attraverso
memorie ausiliarie ad accesso veloce, dette cache5 (una per le
istruzioni, una o più per i dati): in essa vengono memorizzate
anche più istruzioni, che sono così già disponibili per la CPU.
Le istruzioni vengono eseguite dalla CPU, a sua volta divisa in unità di controllo (CU=Control Unit) e unità
aritmetico-logica (ALU=Arithmetic-Logic Unit). L’unità di controllo “decide” le operazioni da fare, che
vengono eseguite in piccoli (e veloci) registri di memoria da parte della ALU. Tra i registri ce n’è anche
uno, chiamato program counter, che individua a che punto della propria sequenza di istruzioni si trova
ciascun programma. Il traffico dei dati avviene in una serie di circuiti conduttori chiamati BUS; tutti i
procedimenti sono sincronizzati attraverso un orologio interno (clock).
Le comunicazioni del sistema con il mondo esterno sono chiamate operazioni di input-output (I/O), ed
avvengono mediante altri BUS esterni (ad esempio quelli di tipo USB=Universal Serial Bus). L’interfaccia è
costituita da dispositivi di interazione del computer con l’utente (tastiera, mouse, webcam, …).
Le memorie periferiche (secondary storage) servono a conservare le istruzioni e i dati, perché, al contrario
della RAM, sono permanenti (dischi, CD, DVD, pen-drive, nastri).
Esiste un altro tipo di memoria ad accesso diretto, detta ROM (Read Only Memory)6, che solitamente
contiene il cosiddetto firmware, che si può definire come “software che fa funzionare l’hardware”. Il
firmware memorizzato nella scheda madre serve, tra le altre cose, ad avviare il computer; anche le unità
periferiche hanno il proprio firmware specializzato, che si occupa del loro funzionamento e di null’altro.
Altri dispositivi servono per scambiare diversi tipi di messaggi con il sistema: stampanti e scanner per dati
scritti o grafici, altoparlanti e microfoni per dati audio, videocamere e proiettori per dati video, modem e TA
per le comunicazioni telefoniche. Il flusso di input va dalle periferiche all’unità centrale, quello di output
nel verso opposto.
Due utenti di un forum specializzato, Mason Wheeler e Dan Pichelman, hanno fornito una curiosa e
interessante analogia per spiegare il funzionamento di alcuni componenti hardware. Immaginiamo un
falegname al lavoro (CPU). In mano (registri) ha un paio di attrezzi, vicino a sé ha il banco da lavoro
(cache), dove stanno altri oggetti che deve usare frequentemente, mentre nel furgone (RAM) ha altri oggetti,
sempre relativi al lavoro che sta facendo, ma che non servono al momento. Inoltre potrà avere altri attrezzi
nel magazzino (disco), e quello che non ha lo può acquistare nei negozi specializzati (la rete).
5 Antico termine inglese per “magazzino”.
6 A volte indicata come flash ROM, dal nome della tecnologia usata per registrarla.
In giro per i bus
Un bus è un mezzo di trasporto, il cui nome deriva dal latino omnibus (che significa: per tutti).
In un computer, per analogia, un bus è un insieme di conduttori (raggruppate in cavi o stampati direttamente
in una scheda) che consente la comunicazione di dati tra componenti hardware. I dati sono trasformati in
impulsi elettrici e come tali trasmessi lungo i bus.
Ogni bus è costituito da alcune decine di conduttori (tra 50 e 100), divise in tre (a volte quattro) sezioni:
bus di indirizzo
(o “di memoria”)
Trasmettono gli indirizzi di memoria che servono al processore: in essi il
flusso di informazioni è unidirezionale, dal processore alla RAM
bus dati Trasmettono non solo i dati, ma anche le istruzioni; in essi il flusso di
informazioni può essere bidirezionale (I/O)
bus di controllo
(o “di comando”)
Trasmettono segnali di controllo e sincronizzazione tra la CPU e le altre
componenti
bus di alimentazione Servono quando l’unità collegata non ha una fonte di alimentazione, come
nel caso di alcuni dispositivi USB7 esterni.
I terminali dei bus nella scheda madre, chiamati slot (fessure), si differenziano per numero di collegamenti e
velocità, in base a quali unità sono ad essi collegati:
7 USB = Universal Serial Bus. In altri tempi ogni unità aveva un collegamento specifico. L’adozione della tecnologia
USB ha grandemente semplificato le operazioni per l’uso delle periferiche, che usano quasi tutte gli stessi cavi.
Bus usati nel box del computer Bus per periferiche (USB)
I bus vengono misurati secondo la quantità di informazione che possono trasmettere contemporaneamente
(larghezza: il numero di conduttori paralleli) e la frequenza di spedizione/ricezione nell’unità di tempo. La
frequenza viene misurata in Hertz (Hz: 1 Hz corrisponde a 1/1 secondo), ed è inversamente proporzionale al
tempo, secondo queste formule:
1 Hz 1 / 1 secondo Una volta al secondo 1 KHz 1000 Hz 1 / 1000 secondi 1000 volte al secondo 1 MHz 1000 KHz 1 / 106 secondi 1 milione di volte al secondo 1 GHz 1000 MHz 1 / 109 secondi 1 miliardo di volte al secondo
Ad esempio, la massima velocità di trasferimento possibile per un bus con una larghezza di 32 bit e una
frequenza di 133 MHz si può esprimere in vari modi, a seconda dell’unità di misura:
32 * 133 * 106 = 4256 * 106 bit/s 4256 * 106 / 8 = 532 * 106 byte/s 532 * 106 / 103 = 532*103 KB/s 532 * 103 / 103 = 532 MB/s
1 bit = 1 impulso elementare 8 bit = 1 byte (1 carattere) 1024 byte = 1 Kb 1024 Kb = 1 Mb
N.B.: i multipli non sono esattamente per 1000, ma per 1024: questo è dovuto al fatto che il computer
effettua i calcoli secondo le potenze di 2 (come si vedrà più avanti).
I bus fanno capo a due componenti, chiamati chipset, che si possono immaginare come stazioni di
smistamento, ai quali sono collegati tutti i dispositivi (il nome chipset deriva dal fatto che, in origine, essi
comprendevano un gran numero di chip elettronici), e prendono i seguenti nomi:
NorthBridge: trasferisce i dati tra CPU, RAM e scheda grafica: i bus ad esso collegati sono detti interni;
SouthBridge: gestisce la comunicazione con le periferiche: i bus ad esso collegati sono detti esterni.
Il termine bridge è stato usato per descrivere la funzione di collegamento dei chipset, mentre North e South
corrispondono alla rappresentazione abituale del modello di Von Neumann, con l’unità centrale in alto e le
periferiche in basso.
I bus più veloci, che possono fornire risposte più rapidamente, sono quelli collegati al NorthBridge:
FSB (front-side bus) collegato alla CPU ed al clock;
memory bus collegato alla RAM;
graphics bus collegato alla scheda video.
I bus collegati al SouthBridge sono di due tipi:
PCI (Peripheral Component Interconnect), solitamente per collegamenti con dispositivi audio o di rete.
LPC (Low Pin Count) per le altre periferiche.
Il firmware (su ROM) è collegato al SouthBridge perché viene consultato solo al momento dell’accensione, e
i suoi dati significativi sono memorizzati nella RAM fino allo spegnimento del computer.
L’immagine riporta uno schema molto semplificato della rete interna dei bus:
La memoria: dalla scheda perforata al DVD
Le prime memorie erano di carta. Proprio così. Erano
derivate dalle schede perforate che servirono ad
automatizzare i telai, introdotte nel XVIII secolo in
Francia e perfezionate attorno al 1805 dal tessitore e
inventore Joseph-Marie Jacquard (1752-1834).
Lo schema della perforazione delle schede jacquard (la
parola è diventata anche un nome comune) predispone il
telaio per la scelta automatica dei colori e dei disegni.
Anche il telegrafo (brevettato nel 1844) usava il nastro perforato, non essendoci altra
tecnologia per memorizzare le informazioni.
Fu quindi naturale usare memorie cartacee con i primi computer: il
nastro nell’immagine di destra è in tutto simile a quelli manovrati dalle
operatrici in una foto del 1918.
Anche le stampanti potevano essere predisposte con un nastro di carta
avvolto ad anello: ad esempio, 66 fori per usare carta da 11 pollici, 72
fori per carta da 12 pollici.
Nel 1889 venne inventato un altro formato cartaceo, quello
della scheda perforata, ad opera di Herman Hollerith, per il
conteggio del censimento USA. Un cartoncino di circa 18.7x8.2 cm riporta una
griglia 12x80: ogni colonna può contenere una serie di fori rettangolari che
rappresentano un limitato insieme di caratteri (ad esempio, senza le minuscole e
altri simboli come le parentesi, che furono aggiunte più tardi).
Ogni scheda rappresentava UNA RIGA di un testo (programmi o dati), contenente al più 80 lettere o simboli.
Essendo lo spessore del cartoncino di circa 0.018 cm, un programma modesto, con 500 istruzioni, occupava
circa 9 cm in altezza, e si portava in giro in una scatola da scarpe.
Un conteggio molto indicativo, tanto per dare un’idea:
1 riga (1 scheda) = 80 byte
16 Gb = 17179869184 byte
Un pen-drive da 16 Gb equivale a 214.748.364 schede, sufficienti per una
pila di schede alta più di 38 km.
Hollerith fondò la IBM, uno dei cui centri di ricerca è stato progettato come
monumento alla scheda perforata (ora ospita una scuola d’arte).
L’immagine riporta lo schema di codifica di una scheda di programmazione (anni ‘50/’70):
Questa immagine ha all’incirca la dimensione di un
floppy da 8 pollici (una pagina A4 è larga 8.3 pollici). Si
possono notare le zone scoperte del disco: al centro per
il meccanismo di trascinamento, vicino al centro per il
foro di sincronizzazione, in basso per il lettore.
Alan Shugart inventò il floppy disk alla fine degli anni ’60, quando i lettori di hard disk erano dispositivi
esterni, con le dimensioni di una lavatrice. Il disco scorre dentro una custodia di plastica (jacket), trascinato
da una ganascia centrale. Il foro più piccolo serve per la sincronizzazione del lettore.
Per decenni questa memoria periferica è stata la più economica, nelle sue versioni sempre più ridotte (8
pollici – 5.25 – 3.5). I masterizzatori di CD prima e DVD poi sono entrati sul mercato con una lentezza
esasperante, soprattutto nel rendere i costi alla portata di tutti. L’utenza era obbligata ad adattarsi ad una
pessima tecnologia, visto che almeno un paio di floppy per scatola erano da buttare.
La fine definitiva del floppy disk è stato il formato JPG, sviluppato negli anni ’90: un disco che, con 1.44
Mb, poteva contenere forse un paio di immagini, non serviva più a nessuno. In quegli anni l’informatica
usciva dal guscio: uscivano masterizzatori a costi non proibitivi, nasceva il WWW, i PC entravano nelle case.
Ancora qualche anno e sarebbero comparse sul mercato le memorie a stato solido: dai 128 Mb iniziali si è
ora giunti ad un numero spropositato di Gb. Questi dispositivi (detti pen-drive, USB keys, chiavette,
pennette) hanno contribuito alla diffusione e alla distribuzione (non sempre legale) di programmi e dati.
L’interfaccia con l’utente
L’interfaccia dei primi sistemi operativi per PC era testuale: uno schermo nero sul quale si scrivevano i
comandi con la tastiera. In DOS (Disk Operating System), ad esempio, dir s*.gif per elencare tutti i file
di una cartella con iniziale del nome uguale a s, ed estensione gif:
I colori originali (bianco su nero) sono stati modificati (rosso su bianco).
Altri comandi potevano essere:
C:\> copy *.* a: copia tutti i file sul dischetto A: C:\> cls cancella tutte le scritte sullo schermo C:\> print abc.txt stampa il file testo ABC.TXT
Questa modalità esiste ancora nel Prompt dei comandi presente negli accessori, che viene chiamato anche
shell DOS. L’espressione deriva da shell (=guscio), perché si immaginava questo schermo come qualcosa
che divideva l’utente dal sistema operativo.
La moderna interfaccia, che usa il mouse per molte operazioni, è grafica, e viene detta GUI (Graphical User
Interface). Quando è stata introdotta, veniva distinta con la sigla wysiwyg (What You See Is What You Get),
tale era la novità rispetto alla riga di comando singola.
Attraverso l’interfaccia grafica e il mouse (o il touchpad) è possibile svolgere tutte le operazioni di gestione
dei propri dati, come ad esempio la creazione di cartelle, di collegamenti (link) a programmi, a dispositivi o a
URL; attraverso il Drag and Drop (=trascina e rilascia) è possibile spostare o copiare uno o più file o cartelle
da un punto ad un altro. Il click destro permette solitamente di scegliere alcune tra le operazioni più comuni8,
facendo comparire un menu interattivo (popup), detto menu contestuale perché dipende dal tipo di oggetto
che si punta.
Grazie ai collegamenti l’utente può raggiungere un file o attivare un programma da un qualsiasi punto dello
schermo. Il collegamento può essere creato trascinando la relativa icona in un punto libero dello sfondo,
oppure con il Wizard9 (attivato con il click destro), che consente di sfogliare le cartelle alla ricerca del file o
della cartella.
Un volta creato il collegamento è possibile rinominarlo e spostarlo nella posizione desiderata. Se si vuole
modificarne le impostazioni del collegamento, come ad esempio l’icona associata, si può aprire il menu tasto
destro di scelta rapida ed attivare Proprietà.
I collegamenti possono essere eliminati selezionandoli e premendo il tasto Canc, oppure con il menu click
destro. ELIMINANDO UN COLLEGAMENTO NON SI ELIMINA L’OGGETTO.
8 Secondo un vecchio detto, when in doubt, right click
9 wizard=mago
Il sistema operativo mette a disposizione dell’utente un insieme di applicazioni, dette accessori, che vanno
dall’editor di testi, alla calcolatrice, al terminale remoto. Gli accessori vengono scelti in fase di installazione;
per rimuovere uno o più accessori si può andare in Pannello di Controllo / Installazione applicazioni /
Installazione componenti di Windows. Il menu accessori si attiva con Start / Tutti i programmi / Accessori.
Le principali applicazioni presenti sono:
strumenti di accessibilità come Magnifier (per chi ha problemi di interazione)
strumenti di “produttività” come Notepad, Wordpad, Calcolatrice e Paint (proprio per i casi disperati)
strumenti di comunicazione come HyperTerminal (nel caso si debba programmare un dispositivo di rete)
utilità di sistema come Backup, Utilità di deframmentazione dischi, Centro di sicurezza (saltuarie)
Le impostazioni del monitor e della scheda grafica consentono all’utente
di ottenere una visualizzazione consona alle proprie abitudini. Per
effettuare queste impostazioni è opportuno conoscere la risoluzione e la
frequenza massima di refresh10
supportata dal monitor, il numero di
colori e le risoluzioni supportate dalla scheda video. Questi dati sono
solitamente nella documentazione tecnica, e si possono solitamente
ottenere consultando i siti web dei produttori, che contengono anche i
driver11
aggiornati.
Le impostazioni si attivano con Pannello di controllo / Schermo, oppure
con click destro sul desktop seguito da “Proprietà”; poi si sceglie la
linguetta “Impostazioni”.
Risoluzione e impostazione dei colori sono già in evidenza. Talvolta,
quando si modifica un’impostazione, viene richiesta una conferma aggiuntiva. Il pulsante “Avanzate” attiva
una serie di opzioni molto dettagliate per intervenire sul tipo di monitor12
, la frequenza di refresh e la scheda
video: sono consigliate per gli utenti più esperti.
Solitamente ciascuno personalizza il desktop modificando la disposizione o l’aspetto di alcuni componenti,
come: risorse del computer, risorse di rete, collegamento a Documenti, cestino. Esistono anche temi
predefiniti, ciascuno con un insieme di icone, suoni, sfondi e colori associati all’interazione con il computer.
Uno strumento fondamentale è la barra delle applicazioni, anch’essa personalizzabile (click destro sulla
barra/ Proprietà), per regolare queste impostazioni:
bloccare la barra delle applicazioni
nascondere la barra delle applicazioni
mettere la barra delle applicazioni sempre in primo piano
raggruppare le applicazioni
mostrare/nascondere: orologio / Avvio veloce13
/ barra delle lingue
nascondere le icone inattive.
La posizione su disco della barra “Quick Launch” è un po’ complicata da trovare, ed è curiosamente
associata ad “Internet Explorer”. Il nome completo della cartella è:
C:\Documents and Settings\[nome utente]\Dati applicazioni\Microsoft\Internet Explorer\Quick Launch
10 Refresh: indica quante volte l'intero quadro viene rigenerato ogni secondo. Più la frequenza è alta, più è stabile e
realistica l'immagine sullo schermo. Come ogni frequenza, si misura in Hz (Hertz). 11
Un driver è un programma che regola il funzionamento di un dispositivo. 12
L’aspetto dello schermo viene misurato in DPI (Dots Per Inch = Punti per pollice) 13
Avvio veloce (QuickLaunch) sulla barra è destinato a contenere i collegamenti ai programmi che si usano più
frequentemente, per velocizzarne la selezione.
I principali dispositivi di input gestiti da ogni sistema operativo sono la tastiera
e il mouse. Il mouse è uno strumento opzionale, comunque molto utile; la
tastiera è invece un elemento fondamentale senza il quale non si riesce a
lavorare. Le proprietà sono sempre accessibili dal pannello di controllo. I
principali parametri per la tastiera sono la velocità di ripetizione dei caratteri, il
ritardo nella sua attivazione e l’intermittenza del cursore.
Sempre nel “Pannello di controllo”, con “Opzioni internazionali e della lingua” si apre una
finestra da cui, selezionando la scheda “Lingue” e successivamente “Dettagli”, è possibile
definire la lingua (o le lingue) di input ed i relativi layout14
di tastiera.
La configurazione del mouse (Pannello di controllo / Mouse) può riguardare lo scambio dei
pulsanti per i mancini, la velocità del doppio clic e il blocco del clic durante il
trascinamento. Per chi vuole personalizzare i puntatori, è possibile specificare le icone e alcune opzioni di
visualizzazione, destinate soprattutto a chi ha problemi di vista.
Il termine font indica un insieme di caratteri tipografici, generalmente
accomunati da uno stesso stile grafico. I principali sistemi operativi mettono a
disposizione degli strumenti per capire quali font sono attualmente disponibili
nel sistema e per installarne di nuovi. I font sono accessibili da Pannello di
controllo / Caratteri, dove è possibile visualizzarne o stamparne un’anteprima.
L’estensione dei file contenenti i font è normalmente TTF (True Type Font),
che sostituisce quelle vecchie (FON, FNT). Per aggiungere un font si passa dal
menu “File” / “Installa nuovo tipo di carattere”, per effettuare una scelta
interattiva della posizione dove si trova il file TTF. È possibile anche copiare
il file TTF manualmente nella cartella C:\WINDOWS\FONTS.
Le impostazioni multimediali di un sistema operativo permettono di configurare i dispositivi audio del PC,
modificando, ad esempio, il volume degli altoparlanti o il livello del segnale di ingresso del microfono. Potrà
risultare strano ricordare che, in passato, i PC uscivano senza scheda audio: i musicisti che volevano aiutarsi
con il computer erano costretti ad acquistare ed installare anche la scheda. Esistono ancora schede audio di
alta qualità per uso professionale: questi dispositivi hanno generalmente il loro manuale d’uso e un CD con
driver e altre informazioni.
La configurazione dell’audio può essere avviata con Pannello di Controllo / Suoni e periferiche audio. Oltre
ai comandi per il volume, uno per ogni tipo di segnale in uscita, con il pulsante ”Avanzate” nella sezione
“Impostazioni altoparlanti” è possibile specificare il tipo di altoparlanti
usati per migliorarne la resa. Esistono altre impostazioni, come i suoni
del sistema e i microfoni, più l’impostazione “Hardware” che si
consiglia di lasciare agli utenti esperti.
Le impostazioni internazionali in un sistema operativo permettono di
configurare tutti i parametri relativi alla lingua e la formattazione usata
per i numeri, la valuta, la data e l’ora, che sono generalmente impostate
in base alla nazione di riferimento durante l’installazione del sistema
operativo. Oltre alla scelta “Paese e lingua” del Pannello di controllo, è
presente la “barra della lingua” nella barra delle applicazioni.
14 Layout = disposizione (in questo caso dei tasti delle tastiere nazionali)
L’installazione di una nuova stampante può essere effettuata solamente dagli amministratori del sistema.
Occorre selezionare Menu di avvio (o pannello di controllo) – Dispositivi e Stampanti – Aggiungi stampante
(dal menu “file” o con click destro). Viene avviato il wizard per l’installazione di una nuova stampante.
Nella finestra iniziale, l’amministratore di sistema
può specificare che si tratta di una stampante Plug
and Play e che quindi l’installazione può essere
effettuata con la procedura standard (automatica) di
tutte le periferiche PnP.
Proseguendo con il wizard, si seleziona:
tipo stampante (locale o di rete)
porta della stampante (la creazione di una nuova
porta viene spesso usata per l’installazione di
una stampante di rete: si tratta di una porta
TCP/IP con l’indirizzo IP della stampante
Selezione dei driver. per alcuni modelli di
stampanti è possibile servirsi dei due elenchi
presenti nella finestra (in alternativa, si possono scaricare i driver dal sito Web del produttore)
Nome da associare alla stampante
Eventuale impostazione come stampante predefinita.
Richiesta pagina di prova
N.B.: Le stampanti con funzioni un po’ sofisticate sono provviste di un CD di installazione che
provvede a tutto tramite un suo wizard (generalmente anche più completo nella diagnostica), ed anche
l’aggiornamento del driver si può scaricare dal sito del produttore.
Dal menu “Stampante” è possibile effettuare alcune
operazioni di gestione della stampante come “Imposta
come stampante predefinita” e “Proprietà della
stampante”.
Nella finestra “Proprietà”, la scheda “Generale” mostra le
caratteristiche della stampante (stampante a colori, fronte-
retro, ecc..). Le finestre successive variano a seconda del
driver di stampa e della corrispondente complessità delle
funzioni disponibili.
La coda di stampa memorizza tutte le operazioni richieste
su una determinata stampante, eseguendole in sequenza.
Per gestire la coda di stampa o modificare le impostazioni
di una stampante bisogna fare un doppio clic sulla
stampante da gestire (in Stampanti e Fax). Si apre così una
nuova finestra che visualizza la coda dei processi della stampante. E’ possibile mettere in pausa, riavviare o
annullare un processo selezionando il processo di stampa ed agendo sulla voce corrispondente:
Evoluzione degli strumenti di output
I primi output erano decisamente poco sofisticati: si potevano “leggere” i risultati osservando spie
variamente colorate o nastri di carta perforati.
Più avanti, alle perforatrici di nastri si aggiungono quelle, a forma di rullo cilindrico, per le schede perforate:
Negli anni ’60 si usano vari tipi di stampanti. Alcune sono termiche, e necessitano di una speciale carta,
trattata chimicamente, che viene riscaldata nelle zone destinate a diventare colorate (alcuni tipi di stampanti
possono scaldare in modo differenziato la carta, aggiungendo il colore rosso al nero classico).
Altre sono ad aghi, e funzionano premendo con un dispositivo chiamato testina un nastro inchiostrato contro
la carta in uno schema rettangolare, dove l’alternanza di aghi attivati e disattivati forma lettere e cifre.
Le stampanti a margherita (daisy wheel), simili alle macchine da scrivere, hanno i
caratteri impressi ai bordi di una raggiera in plastica: il principio di stampa è sempre a
pressione, con una qualità maggiore rispetto alle stampanti ad aghi, ma una minore
velocità, dovuta alla necessità di ruotare la margherita per ogni carattere diverso.
Spie e pulsanti Nastri perforati
Seconda generazione di memorie cartacee
Schemi di funzionamento delle stampanti ad aghi
Stampanti termiche
Inizialmente, la stampa viene prodotta sui “terminali” detti TTY (teletype), dispositivi muniti anche di
tastiera per l’input, con stampa termica oppure ad aghi; successivamente arrivano stampanti dedicate,
funzionanti a modulo continuo.
La stampa grafica è ancora una faccenda a sé, e viene prodotta con dispositivi chiamati plotter, dotati di una
o più penne o pennarelli, montati su un braccio mobile. Nei plotter da tavolo, un secondo braccio
perpendicolare al primo permette di spostare le penne in qualsiasi direzione; in quelli professionali, sono i
fogli, di formato A0 (circa 1.2m di larghezza, con lunghezza anche di decine di metri) che vengono spostati
orizzontalmente, sotto la postazione delle penne.
L’evoluzione ha poi portato stampanti a getto d’inchiostro (inkjet), già usate dai fotografi fino dagli anni ’50,
e stampanti laser, che di fatto eliminano l’esigenza dei plotter da tavolo (c’è comunque un discreto mercato
di appassionati dell’usato). Queste tecnologie vengono aggiunte ai plotter professionali, dei quali aumentano
prestazioni e qualità di stampa.
Macchine simili ai plotter sono state a lungo usate per il taglio del vetro o di altri materiali, come metalli e
plastica, e successivamente per il taglio e la stampa di tessuti. Le moderne “stampanti 3d” non hanno in
realtà a che fare con documenti e disegni: sono veri e propri stampi programmabili per produrre oggetti
tridimensionali con polimeri, metalli o materiali compositi, che vengono aggiunti a strati seguendo modelli
predisposti da appositi software.
Hardware e Software Foglio Elettronico
Simboli e numeri
I computer sono nati per risolvere problemi di calcolo, quindi il primo problema che si è presentato è stato
quello di memorizzare i numeri. Occorre perciò aver bene presente la nostra idea (umana) di numeri ed il
modo con cui abbiamo scelto di rappresentarli, per poi vedere le soluzioni scelte per trasportarli in un
sistema di elaborazione automatico.
Noi tendiamo a dare troppe cose per scontate, data la familiarità che abbiamo (o dovremmo avere) con i
numeri e le relative operazioni. Tuttavia la storia della matematica presenta soluzioni molto diverse, che solo
nel corso di millenni sono arrivate a quelle ora universalmente accettate.
Alcune civiltà hanno un sistema di numerazione fondato sulle parole che indicano “uno” e “due”, anche in
continenti diversi:
Kawatsa (Papua)
1 = to 2 = tavau 3 = tavau to (2 e 1) 4 = tavau tavau (2 e 2) 5 = tavau tavau to
Gumulgal (Australia)
1 = urapon 2 = ukasar 3 = ukasar urapon 4 = ukasar ukasar 5 = ukasar ukasar urapon
Bakairi (Brasile)
1 = tokale 2 = azage 3 = azage tokale 4 = azage azage 5 = azage azage tokale
Per quanto semplice, questa rappresentazione diventa problematica con numeri grandi, ed è ancora peggio
quando si tratta di eseguire le comuni operazioni aritmetiche.
La situazione non migliora con i geroglifici egiziani, in cui vengono usati simboli:
1 = asta 10 = rotolo di fune 1000 = fiore di loto 10000 = dito 100000 = rana
Per rappresentare il numero 315202 occorre mettere
in fila 3 rane, 1 dito, 5 fiori di loto, due rotoli di
fune, due aste verticali. Immaginiamoci di dividerlo
anche solo per due: con i rotoli di fune va bene, ma
con le rane un po’ meno (mezza rana sono 5 dita)
Anche i Romani, che pure come ingegneri se la cavavano piuttosto bene, con i numeri erano un po’ persi:
1 = I 5 = V 10 = X 100 = C 500 = D 1000 = M
2016 non è molto difficile da scrivere (MMXVI),
ma eseguire le operazioni è uno strazio. Guardando
2016/6 (che fa 336) non c’è alcuna logica che
consenta di ottenere i risultati con regole generali:
MMXVI / VI = CCCXXXVI
Possiamo solo tentare di immaginare lo scenario quando arrivarono in Europa i numeri detti “arabi” o “indo-
arabi”, appresi durante i commerci con gli arabi, e originari dell’India, attribuiti ai due maggiori matematici
di quel Paese, Aryabhat (V secolo) e Brahmagupta (VI secolo):
Cifre indiane:
Sebbene perfino un papa (Gilberto di Aurillac, divenuto Silvestro II), nel decimo secolo, avesse cercato di
diffondere in Europa la numerazione ancora chiamata solamente “indiana”, l’ingresso ufficiale nella
contabilità europea risale agli inizi del 13° secolo, grazie al matematico pisano Leonardo Fibonacci. Molti
“ragionieri” dell’epoca (anche se allora non si chiamavano così), atterriti dalla velocità con cui gli esperti
della nuova numerazione eseguivano i calcoli, non esitarono a definire tutto il sistema come opera del
demonio, con buona pace di Gilberto-Silvestro.
Il successo della nuova numerazione è dovuto a due grandi innovazioni:
La notazione posizionale
L’uso dello zero
La notazione posizionale fa in modo che ogni cifra abbia, oltre al proprio significato normale, un altro
significato legato alla sua posizione, che si lega ad una potenza di 10 (da destra: 1, 10, 100, 1000, ecc.).
Lo zero consente di individuare una posizione vuota, senza spostare le altre cifre dalla posizione corretta.
Così 27509 è scomposto in:
2*104 + 7*103 + 5*102 + 0*101 + 9*100
Possiamo notare che il 2 conta molto di più del 9, grazie alla sua posizione.
Lo sviluppo del numero è un polinomio ordinato secondo le potenze di 10, e grazie a questa forma si possono
fare calcoli più facilmente di ogni Gumulgal, Bakairi, Egizio o Romano.
Il numero 10 è la base di numerazione perché corrisponde al numero di simboli usato (da 0 a 9, compresi).
Se osserviamo alcune caratteristiche della notazione posizionale, potremo trovarle anche con altre basi di
numerazione.
La base è il più piccolo numero di due cifre
Il numero precedente alla base corrisponde alla cifra più grande
Le potenze della base si scrivono tutte con 1 seguito da un certo numero di zeri
I numeri precedenti alle potenze della base sono formati solo dalla cifra più grande ripetuta
Spostare una cifra di una posizione equivale a moltiplicarla (o dividerla) per la base
Con la nascita dell’algebra, alcuni matematici si sono posti il problema di usare altre basi di numerazione
(non è dato sapere il perché). Un vescovo spagnolo, che, oltre alla teologia, si occupava di ingegneria
militare, propose l’uso della base 2 in un libro del 1669: “Mathesis biceps. Vetus, et noua”. Il suo nome era
Juan Caramuel y Lobkowitz. Anche matematici più illustri, come Nepero (John Napier) e Leibniz,
studiarono la base 2 e la sua aritmetica, così come Gorge Boole, che se ne occupò in un trattato del 1847.
Ma la definitiva affermazione dell’aritmetica binaria e della sua consociata, l’algebra di Boole, fu dovuta
all’invenzione dei calcolatori elettronici. Essa venne buona sia nella tecnologia, sia nella programmazione:
nel primo caso per la facilità con cui si potevano memorizzare in un computer i numeri e la velocità con cui
si potevano elaborare; nel secondo per la semplicità con cui si potevano codificare i procedimenti di calcolo
con cui si potevano istruire i computer.
La semplicità della base 2 è evidente: 2 soli simboli, risultati parziali semplici. Nella tecnologia, l’uso di
correnti e campi magnetici (che si presentano in 2 stati) si è combinata alla perfezione con l’uso di questa
notazione. Inoltre la velocità dei componenti, anche negli anni dei pionieri, permetteva di superare
l’inconveniente della base 2, che necessita di molte cifre per rappresentare numeri anche di uso comune15
.
Altre basi di numerazione che hanno a che fare con l’informatica sono 8 (sistema ottale) e 16 (sistema
esadecimale); sono correlate anche con il 2, dato che:
8=23 e 16=24.
15 I calcoli vengono eseguiti dalla macchina, che è comunque più veloce degli operatori umani.
Numeri in base 2
Dov’è il trucco per la base 2? Considerando che ci sono solo due simboli a disposizione, 0 e 1, per
proseguire nella numerazione occorre usare i riporti. Tra l’altro, almeno per i primi numeri, possiamo notare
una lontana somiglianza con alcuni sistemi già visti, ad esempio quello dei Gumulgal, che arrivano a
distinguere 1 da 2 (l’analogia si ferma lì, perché manca il resto dell’aritmetica).
Procedimento Binario Calcoli Gumulgal Il primo numero è ZERO Il secondo numero è UNO 1+1 fa ZERO con riporto di 1 +1 non c’è riporto +1 ci sono 2 riporti +1 non c’è riporto sulle "unità" +1 c’è 1 riporto alla 2.cifra +1 non c’è riporto sulle "unità" +1 di nuovo un 1 seguito da zeri
0 1
10 11 100 101 110 111
1000
0 1 2+0 2+1 4+0+0 4+0+1 4+2+0 4+2+1 8+0+0+0
1 = urapon 2 = ukasar 3 = ukasar urapon 4 = ukasar ukasar 5 = ukasar ukasar urapon ... (si complica troppo)
Considerando un numero qualunque (senza dimenticare che abbiamo a disposizione solo 2 cifre), e
applichiamo la scomposizione come polinomio (tenendo conto che la base è 2, non 10):
10110102 = 1*26+0*25+1*24+1*23+0*22+1*21+0*20
Il numero 10110102 non è altro che 9010. Se si hanno ben presenti le potenze del 2, la traduzione di un numero in base 2 non è difficile: ad esempio,
167 corrisponde a 128+32+4+2+1, quindi:
16710=101001112
Le prime potenze di 2 sono: 128 64 32 16 8 4 2 1 Per i meno matematici, il procedimento per tradurre un numero da base 10 a base 2 è semplice, anche se i
passi possono essere numerosi. Riprendiamo il 167:
167 : 2 = 83 resto 1 83 : 2 = 41 resto 1 41 : 2 = 20 resto 1 20 : 2 = 10 resto 0 10 : 2 = 5 resto 0 5 : 2 = 2 resto 1 2 : 2 = 1 resto 0 1 : 2 = 0 resto 1
La sequenza dei resti, presa alla rovescia, è la codifica binaria del numero di partenza. Possiamo riassumere
i due passaggi in questo modo:
Per passare da base 2 a base 10, si moltiplica per 2
Per passare da base 10 a base 2, si divide per 2
Ci sono 10 tipi di persone al mondo: quelli che capiscono il binario e quelli che non lo capiscono
Come si fa
Per semplicità, useremo il formato più piccolo per la memorizzazione dei numeri interi, che prevede 8 cifre
binarie. In realtà l’ottava cifra non viene usata per i numeri positivi: più avanti vedremo come venga usata
per memorizzare il segno (in particolare: 0 per i positivi, 1 per i negativi).
Il numero “positivo” minore è: 000000002 010
Il numero positivo maggiore è: 011111112 12710
Un modo pratico per ottenere il formato binario di un numero decimale è incolonnare i numeri che si
ottengono con le divisioni e i resti. Si può iniziare con la sequenza delle divisioni (1), mentre i resti possono
essere facilmente aggiunti anche dopo (2). Alla fine (3) è consigliato aggiungere gli zeri mancanti per
ottenere le 8 cifre.
ULTIMA CIFRA CON ZERO SI TERMINA
(1) 18 9 4 2 1 0
(2) 0 1 0 0 1
9 dispari 1 dispari
Risultato (8 cifre) (3) 00010010
Altri esempi:
50 25 12 6 3 1 0
0 1 0 0 1 1
115 57 28 14 7 3 1 0
1 1 0 0 1 1 1
12 6 3 1 0
0 0 1 1
35 17 8 4 2 1 0
1 1 0 0 0 1
80 40 20 10 5 2 1 0
0 0 0 0 1 0 1
5 2 1 0
1 0 1
00110010 01110011 00001100 00100011 01010000 00000101
Alcuni accorgimenti possono risultare utili per controllare i risultati.
1
Un numero come 35 può anche essere scomposto: 00100011 = 35 00100000 = 32 (valore dell’ultima cifra, se fosse da sola) 00000011 = 3 (valore delle prime due, se fossero da sole)
2
Il primo resto di 35 è 1, il primo resto di 80 è 0 Se consideriamo che il primo resto (prima cifra) corrisponde ad un valore di 1, mentre tutte le altre corrispondono a numeri pari (2,4,8,...), i numeri dispari DEVONO avere come prima cifra 1.
3 Se osserviamo la scomposizione di 5, notiamo che la scomposizione è la stessa che si ha con 80, dopo che il quoziente raggiunge il 5.
4 Ogni sequenza termina con (3-1-0) o con (2-1-0)
Esercizi
Qualche esercizio per fare pratica. Le soluzioni sono alla pagina seguente
base 10 - base 2 base 2 - base 10 110 10111100 85 100001 19 111100 250 11000100 30 110001 60 10111110 150 10011000 80 1001000 160 1111111 245 10001011 50 10000001 112 101000 48 110100 200 10101110 151 10000000 89 110011 78 10110111 39 1000000 75 10010011 150 10011101 100 101111 80 1010100 5 1101100 99 10000111 49 10001110 15 11001000 65 1101100 66 10101100 41 1010100 51 11000101
Soluzioni
base 10 - base 2 base 2 - base 10 110 1101110 10111100 188 85 1010101 100001 33 19 10011 111100 60 250 11111010 11000100 196 30 11110 110001 49 60 111100 10111110 190 150 10010110 10011000 152 80 1010000 1001000 72 160 10100000 1111111 127 245 11110101 10001011 139 50 110010 10000001 129 112 1110000 101000 40 48 110000 110100 52 200 11001000 10101110 174 151 10010111 10000000 128 89 1011001 110011 51 78 1001110 10110111 183 39 100111 1000000 64 75 1001011 10010011 147 150 10010110 10011101 157 100 1100100 101111 47 80 1010000 1010100 84 5 101 1101100 108 99 1100011 10000111 135 49 110001 10001110 142 15 1111 11001000 200 65 1000001 1101100 108 66 1000010 10101100 172 41 101001 1010100 84 51 110011 11000101 197
Operazioni in base 2
45+54=101101+110110
I risultati delle singole somme sono sempre 0 o 1. Anche con il riporto il massimo che si può ottenere è un 3,
che comunque non si scrive 3, ma 1 con riporto di 1.
1+0 = 1 Riporto 0
0+0+1 = 1 Riporto 0
0+1+1 = 0 Riporto 1
1+1+0 = 0 Riporto 1
1+0+1 = 0 Riporto 1
1+1+1 fa 1 Riporto 1
Solo riporto
101101 110110 1
0 101101 110110 11
0 101101 110110 011
1 101101 110110 0011
1 101101 110110 00011
1 101101 100110 100011
1 0101101 0100110 1100011
1100011 = 1*26+1*25+0*24+0*23+0*22+1*21+1*20
45+54 = 99 = 64+32+2+1 Con la moltiplicazione le cose si complicano, ma non dimentichiamo che questi calcoli sono fatti per essere
eseguiti da un computer, la cui velocità compensa per il numero di operazioni che vanno svolte. Con gli
stessi numeri di prima, 45*54 fa 2430 (un numero di 12 cifre binarie, essendo superiore a 2048=211):
101101 110110 -------------- * 000000 11101101. 1101101.. 1000000... 1101101.... 101101..... -------------- 100101111110
In ogni riga parziale abbiamo solo due possibilità:
000000 (tutti zeri, se la cifra è 0) 101101 (il primo numero, se la cifra è 1)
Nella colonna contrassegnata con * il riporto è doppio (il risultato della colonna
precedente è 4)
Qui i conteggi sono più numerosi, ma il computer somma sempre 2 numeri per volta, quindi non fa una
somma di 6 numeri, ma 5 somme di 2 numeri.
Alcuni trucchetti per cavarsela con la base 2 (alcuni sono già visti):
Un numero dispari termina con 1, uno pari con 0
Un 1 seguito da zeri è una potenza di 2 (esponente=numero di zeri)
Un repunit (tutti 1) precede di 1 una potenza di 2
Aggiungendo uno zero a destra, il numero raddoppia
Togliendo l’ultima cifra a destra, in numero si dimezza (senza resto)
Per calcolare un numero con molti 1, costruire un repunit e sottrarre le posizioni corrispondenti agli zeri
(al posto di sommare le posizioni presenti). Ad esempio, trovandosi davanti 1111011 conviene ricordare
(se possibile) che 1111111 precede 27, quindi è 127, poi togliendo il 4 si ottiene 123.
I primi repunit corrispondono a:
11111111 1111111 111111 11111 1111 111 11 1
255 127 63 31 15 7 3 1
Esercizi
Qualche somma per fare pratica. Le soluzioni sono alla pagina seguente
1001010 10111100 111011 100001
11111 11000100 11111 110001
1010 10011000
1111111 1001000
11101000001 10001011 10000010 10000001
100010000 110100 100101100 10101110
11101110 110011
1111 10110111
10101001010 10010011 101010100 10011101
1000000000001 1010100 11111111111 1101100
100000001 10001110 101111111 11001000
111101 10101100
11011010 1010100
Soluzioni
Le somme sono in rosso, sotto i rispettivi addendi:
1001010 10111100 111011 100001
10000101 11011101 11111 11000100 11111 110001 111110 11110101 1010 10011000
1111111 1001000 10001001 11100000
11101000001 10001011 10000010 10000001
11111000011 100001100 100010000 110100 100101100 10101110 1000111100 11100010 11101110 110011
1111 10110111 11111101 11101010
10101001010 10010011 101010100 10011101
11010011110 10110000 1000000000001 1010100 11111111111 1101100
1100000000000 11000000 100000001 10001110 101111111 11001000 1010000000 101010110
111101 10101100 11011010 1010100 100010111 100000000
Base 8 e base 16
I numeri in base 8 e 16 sono usati per rappresentare GRUPPI di cifre binarie. La base 8, in verità, non si
incontra più molto spesso, dato che la crescente potenza dei computer. Osservando la tabella, si nota la
ciclicità delle rappresentazioni: le 8 cifre ottali corrispondono a tutte le combinazioni di 3 cifre binarie, le 16
cifre esadecimali a quelle di 4 (e 4 è molto meglio di 3, almeno in elettronica). Nella tabella viene inclusa,
per completare i confronti, anche la base 4 (non in uso):
Base 2 Base 4 Base 8 Base 16 Base 10
0000 0 0 0 0 0001 1 1 1 1 0010 2 2 2 2 0011 3 3 3 3 0100 10 4 4 4 0101 11 5 5 5 0110 12 6 6 6 0111 13 7 7 7 1000 20 10 8 8 1001 21 11 9 9 1010 22 12 A 10 1011 23 13 B 11 1100 30 14 C 12 1101 31 15 D 13 1110 32 16 E 14 1111 33 17 F 15
10000 100 20 10 16 10001 101 21 11 17 10010 102 22 12 18 10011 103 23 13 19 10100 110 30 14 20
... ... ... ... ...
I numeri in base 8 sono più che altro una curiosità storica: solo i numeri in base 16 sono usati per evidenziare
i contenuti della memoria, visto che con due cifre in base 16 si può rappresentare un byte.
La conversione tra basi che sono una potenza dell’altra è piuttosto semplice: da base 2 a base 8 o 16 si
suddivide in numero in gruppi di 3 o 4 cifre; da base 8 o 16 a base 2 ogni cifra genera un gruppo di 3 o 4
cifre.
1011011101012=(101)(101)(110)(101)=55658
10110111101012=(1)(0110)(1111)(0101)=16F516
1658=(001)(110)(101)=11101012
7816=(0111)(1000)=11110002
A17416=(1010)(0001)(0111)(0100)=10100001011101002
L’importante è iniziare i gruppi dall’ultima cifra a destra. Esempio:
trasformare in base 16: 11011111012
1101.1111.012=DF216 ERRORE MADORNALE
11.0111.11012=37D16 corretto (non DF2)
Esercizi
Qualche esercizio per fare pratica. Le soluzioni sono alla pagina seguente.
base 2 - base 16 base 16 - base 2 111110101 170
1101011 A193
10101011110101101011000 4583
101111 4
111111111111110001 9B
1111010 134C
1101110100100010 DA9F
100000000011110010 3B
1000001 AA66
1000111 60
10100111 A107D
101011010001011011 111AD
101011101011011010101 91
1001101 1C
10000000 FF92
11101010110100110 1DC51
10000100 8E
1111000000001010100 1029
10101111 1B
10111010110101011110 2B153
1110010 EC98
10110100 35
11100011100011111000 14
10100100 BB3D
111101010101101011 1C66
11111111111110110 DD139
10101110 A196
101110101010011100 29
1000111 FA29
101011101011101010110 1ABC20
Soluzioni
base 2 - base 16 base 16 - base 2 1.1111.0101 1F5 170 101110000
110.1011 6B A193 1010000110010011
1010101.1110.1011.0101.1000 55EB58 4583 100010110000011
10.1111 2F 4 100
11.1111.1111.1111.0001 3FFF1 9B 10011011
111.1010 7A 134C 1001101001100
1101.1101.0010.0010 DD22 DA9F 1101101010011111
10.0000.0000.1111.0010 200F2 3B 111011
100.0001 41 AA66 1010101001100110
100.0111 47 60 1100000
1010.0111 A7 A107D 10100001000001111101
10.1011.0100.0101.1011 2B45B 111AD 10001000110101101
1.0101.1101.0110.1101.0101 15D6D5 91 10010001
100.1101 4D 1C 11100
1000.0000 80 FF92 1111111110010010
1.1101.0101.1010.0110 1D5A6 1DC51 11101011001010001
1000.0100 84 8E 10001110
111.1000.0000.0101.0100 78054 1029 1000000101001
1010.1111 AF 1B 11011
1011.1010.1101.0101.1110 BAD5E 2B153 101011000101010011
111.0010 72 EC98 1110110010011000
1011.0100 B4 35 110101
1110.0011.1000.1111.1000 E38F38 14 10100
1010.0100 A4 BB3D 1011101100111101
11.1101.0101.0110.1011 3D56B 1C66 1110001100110
1.1111.1111.1111.0110 1FFF6 DD139 11011101000100111001
1010.1110 AE A196 1010000110010110
10.1110.1010.1001.1100 2EA9C 29 101001
100.0111 47 FA29 1111101000101001
1.0101.1101.0111.0101.0110 15D756 1ABC20 110101011110000100000
Esercizi
Qualche esercizio per fare pratica. Le soluzioni sono alla pagina seguente.
base 2 - base 8 base 8 - base 2 111110101 170
1101011 7103
10101011110101101011000 4563
101111 4
111111111111110001 345
1111010 134
1101110100100010 77531
100000000011110010 32322
1000001 66
1000111 60
10100111 771005
101011010001011011 11156
101011101011011010101 71
1001101 12
10000000 4452
11101010110100110 10051
10000100 844
1111000000001010100 1023
10101111 14
10111010110101011110 2153
1110010 111565
10110100 35
11100011100011111000 14
10100100 7764
111101010101101011 166
11111111111110110 5513
10101110 166
101110101010011100 244
1000111 3321
101011101011101010110 176520
Soluzioni
base 2 - base 8 base 8 - base 2 111.110.101 765 170 1.111.000
1.101.011 153 7103 111.001.000.011
10.101.011.110.101.101.011.000 25365530 4563 100.101.110.011
101.111 57 4 100
111.111.111.111.110.001 777761 345 11.100.101
1.111.010 172 134 1.011.100
1.101.110.100.100.010 156442 77531 1.111.111.010.110.014
100.000.000.011.110.010 400362 32322 11010011010010
1.000.001 101 66 110.110
1.000.111 107 60 110.000
10.100.111 247 771005 111.111.001.000.000.101
101.011.010.001.011.011 532133 11156 1.001.001.101.110
101.011.101.011.011.010.101 5353325 71 111.001
1.001.101 115 12 1.010
10.000.000 200 4452 100.100.101.010
11.101.010.110.100.110 352646 10051 1.000.000.101.001
10.000.100 204 644 110.100.100
1.111.000.000.001.010.100 1700124 1023 1.000.010.011
10.101.111 257 14 1.100
10.111.010.110.101.011.110 2726536 2153 10.001.101.011
1.110.010 162 111565 1.001.001.101.110.101
10.110.100 261 35 11.101
11.100.011.100.011.111.000 3434370 14 1.100
10.100.100 244 7764 111.111.110.100
111.101.010.101.101.011 752553 166 1.110.110
11.111.111.111.110.110 377766 5513 101.101.001.011
10.101.110 256 166 1.110.110
101.110.101.010.011.100 565234 244 10.100.100
1.000.111 107 3321 11.011.010.001
101.011.101.011.101.010.110 5353523 176520 1.111.110.101.010.000
Altre basi di numerazione
Per convertire un numero in base 10 in qualsiasi altra base si usano sempre divisioni e resti. In realtà, nella
storia le uniche altre basi che sono state usate con una certa efficacia sono state 12, 20, 60. La base 12 deriva
dall’uso delle falangi di una mano (pollice escluso); la base 20 deriva dalle 20 dita normalmente possedute
tra mani e piedi; la base 60 è di origine incerta, ma è stata usata per il fatto che il numero 60 ha parecchi
divisori interi, e nel commercio permetteva di fare calcoli con velocità.
Ogni numero può essere usato come base, con regole analoghe a quelle già viste. Ad esempio, in base 7 ci
sono 7 cifre (0,1,2,3,4,5,6) e i numeri sono sempre polinomi nelle potenze crescenti della base:
60417 = 6*73+0*72+4*71+1*70 = (2058+0+28+1)10 = 208710
Alcuni esempi:
45110=33015 45110=1012013 45110=38011 45110=10A21
451:5=90 resto 1 90:5=18 resto 0 18:5= 3 resto 3 3:5= 0 resto 3
451:3=150 resto 1 150:3= 50 resto 0 50:3= 16 resto 2 16:3= 3 resto 1 3:3= 1 resto 0 1:3= 0 resto 1
451:11=41 resto 0 41:11= 3 resto 8 3:11= 0 resto 3
451:21=21 resto 10 (A) 21:21= 1 resto 0 1:21= 0 resto 1
Quando le basi non sono collegate tra loro come 2-16 o 2-8, conviene passare attraverso la base 10.
Ad esempio, trasformiamo 4256 in base 9:
1 da base 6 a base 10 4256 = 4*62 + 2*61 + 5*60 = 16110
2 da base 10 a base 9
161 : 9 = 17 resto 8 17 : 9 = 1 resto 8 1 : 9 = 0 resto 1
Risultato 1889
Alcuni esercizi (le soluzioni sono alla pagina seguente):
Numero Nuova base Risultato 7311 5
11004 15 2027 3 2446 9 2224 7 469 12
21213 9 1546 11 3324 7 5212 14
Soluzioni
Numero Nuova base Risultato 7311 5 3105
11004 15 5515 2027 3 102013 2446 9 1219 2224 7 607 469 12 3612
21213 9 779 1546 11 6411 3324 7 1167 5212 14 4614
Notazione binaria complementare
Nell’aritmetica del computer i numeri interi sono memorizzati in base 2. Normalmente occupano 32 cifre,
che possono coprire, senza segno, i numeri da 0 a 4294967295 (il repunit di 32 cifre binarie vale 232-1).
Va tuttavia tenuto conto che devono essere memorizzati anche i numeri negativi. Per fare questo viene tenuta
da parte una cifra binaria (la prima) per il segno. I numeri con segno memorizzabili sono quindi quelli
compresi tra -2147483648 e +2147483647. Sono tanti quanti quelli da 0 a 4294967295, ma sono
equamente distribuiti tra positivi e negativi.
I seguenti esempi, per semplicità, faranno uso di 8 cifre binarie (numeri compresi tra -128 e +127).
I numeri negativi sono memorizzati con la prima cifra uguale ad 1 (segno), ma non sono memorizzati come
quelli positivi. Per essi si fa uso della notazione binaria complementare: un numero negativo viene sostituito
con quello che manca al corrispondente positivo ad arrivare a 256 (questo vale in 8 cifre).
Rappresentazione di -12
Si parte da +12: 00001100
Si rovesciano i bit: 11110011 (ogni cifra viene sottratta da quella più grande nella base, che è 1)
Si aggiunge 1 00000001
Risultato 11110100
La notazione è detta complementare perché il risultato, in apparenza 244 , è ciò che manca a 12 per arrivare
a 256 (244+12=256). Vediamo due esempi di sottrazione:
Somma 20-12 (RISULTATO POSITIVO)
20 00010100
12 11110100
Risultato 100001000
La prima cifra 1 corrisponde a 256, e viene
scartata: in questo modo si mantiene un
numero di 8 cifre
Somma 7-12 (RISULTATO NEGATIV0)
7 00000111
12 11110100
Risultato 11111011 (*)
Questo numero, se fosse positivo (ma non lo è),
varrebbe 251, quindi per arrivare a 256 mancherebbe
5, che corrisponde al risultato della sottrazione. Per
verificarlo, cambiamo segno al risultato::
Si rovesciano i bit: 00000100 Si aggiunge 1 00000001 Risultato 00000101
L’opposto del numero negativo è 5, quindi il
numero negativo (*) è -5 (non 5)
Solo in visualizzazione/stampa un numero negativo viene convertito e presentato con il segno MENO.
I motivi per l’uso della notazione complementare sono 10:
1 le operazioni di complemento a 1 (che corrisponde al rovesciamento dei bit) sono molto veloci in
elettronica;
10 la somma tra numeri interi con segno è sempre eseguita come un’addizione (anche con i negativi, si
usano gli stessi registri della somma: i registri sottrattori, complessi e lenti, non sono più usati).
Anche in base 10 si può usare la notazione complementare, che consente di trasformare ogni sottrazione in
una sequenza di sottrazioni più semplici. Prendiamo come esempio l’operazione 1205-892. Visto che
abbiamo al massimo 4 cifre, ne usiamo 4 anche per il minuendo. Ogni cifra del numero 0892 viene sottratta
dalla cifra più grande (che in base 10 è 9), poi si aggiunge 1: risulta inizialmente 9107, poi 9108. La
somma risulta quindi:
1205+ 9108= -------- 10313
Scartando la sesta cifra, il risultato è (come ci si doveva aspettare) 313. Si noti che nell’esempio non viene
considerato il segno: l’obiettivo è solo di mostrare il procedimento in base 10.
La sottrazione non esiste
Non proprio. La verità è che i numeri negativi sono memorizzati in notazione binaria complementare.
Prendiamo il numero -2. Si parte dal valore assoluto +2, poi si applicano le operazioni di complemento:
210 00000010 Valore assoluto
-210
11111101 1
11111110
Complemento a 1 Somma con 1 NUMERO COMPLEMENTATO A 2
Altro esempio, con -10:
1010 00001010 Valore assoluto
-1010
11110101 1
11110110
Complemento a 1 Somma con 1 NUMERO COMPLEMENTATO A 2
Altro esempio, con -15:
1510 00001111 Valore assoluto
-1510
11110000 1
11110001
Complemento a 1 Somma con 1 NUMERO COMPLEMENTATO A 2
Altro esempio, con -127:
12710 01111111 Valore assoluto
-12710
10000000 1
10000001
Complemento a 1 Somma con 1 NUMERO COMPLEMENTATO A 2
Quindi, come si fa una sottrazione? Esattamente come una somma, ma con i numeri negativi in forma
complementare. Questo semplifica grandemente l’elettronica necessaria per costruire i registri e la ALU.
Non esiste 85-10, ma 85+(-10). Non esiste -4-5, ma +(-4)+(-5), come mostrato nei due esempi:
riporti 1 1 1 1
85 0 1 0 1 0 1 0 1 positivo (così com’è)
-10 1 1 1 1 0 1 1 0 negativo (complementato a 2)
risultato 1 0 1 0 0 1 0 1 1 la nona cifra viene scartata
riporti 1 1 1 1 1
-4 1 1 1 1 1 1 0 0 negativo (complementato a 2)
-5 1 1 1 1 1 0 1 1 negativo (complementato a 2)
risultato 1 1 1 1 1 0 1 1 1 la nona cifra viene scartata
Sommando due opposti, dobbiamo aspettarci 0 come risultato, ed è esattamente quello che avviene:
riporti 1 1 1 1 1 1
-4 1 1 1 1 1 1 0 0 negativo (complementato a 2)
+4 0 0 0 0 0 1 0 0 positivo
risultato 1 0 0 0 0 0 0 0 0 la nona cifra viene scartata
Le limitazioni del computer
Nella notazione binaria a 8 bit, il numero che fa eccezione è -128, perché non ha un corrispondente positivo
(infatti i numeri positivi arrivano a +127). Se proviamo a fare il complemento a 2, si ottiene uno strano
risultato:
12810 10000000 Valore assoluto
-12810
01111111 1
10000000
Complemento a 1 Somma con 1 NUMERO COMPLEMENTATO
In pratica, l’opposto di -128 è lo stesso numero -128. Questo succede perché abbiamo esaurito le cifre
disponibili, ed è un limite fisico del computer. La stessa cosa avviene con un numero maggiore di cifre.
Un altro caso curioso si ha con numeri troppo grandi, come vedremo con 120+80:
riporti 1 1 1
120 0 1 1 1 1 0 0 0 positivo
80 0 1 0 1 0 0 0 0 positivo
risultato 1 1 0 0 1 0 0 0 negativo?
riporti 1 1 1 Troviamo il valore assoluto
0 0 1 1 0 1 1 1 Complemento a 1
1 Somma con 1
0 0 1 1 1 0 0 0 +56
Il risultato paradossale di 120+80 è -56 (possiamo anche notare che 120+80+56=256). Questa condizione
si chiama overflow, ed è un altro caso nel quale sono stati oltrepassati i limiti fisici dei numeri binari a 8 bit.
Ovviamente, i costruttori di computer non si limitano a questo tipo di numeri. Normalmente vengono usati
interi a 16 o 32 bit, con o senza segno, ma esistono anche memorizzazioni a 64 e a 128 bit, per usi altamente
professionali. I limiti numerici variano a seconda se viene usato il segno o no, come si vede nella tabella:
8 senza segno
min 0
max 255
con segno min -128
max +127
16 senza segno
min 0
max 65.536
con segno min -32.768
max +32.767
32
senza segno min 0
max 4.294.967.295
con segno min -2.147.483.648
max +2.147.483.647
64 senza segno
min 0
max 18.446.744.073.709.551.615
con segno min −9.223.372.036.854.775.808
max +9.223.372.036.854.775.807
128 senza segno
min 0
max 340.282.366.920.938.463.463.374.607.431.768.211.455
con segno min −170.141.183.460.469.231.731.687.303.715.884.105.728
max 170.141.183.460.469.231.731.687.303.715.884.105.727
Esercizi
Qualche esercizio per fare pratica. Le soluzioni sono alla pagina seguente.
Notazione binaria complementare – 8 bit Base 10 Valore assoluto Complemento
-1
-20
-40
-15
-100
-18
-50
-97
-111
-48
-2
-5
-90
-80
-70
-25
-101
-102
-10
-11
-106
-82
-29
-30
-12
-8
-63
-31
-64
-98
Soluzioni
Notazione binaria complementare – 8 bit Base 10 Valore assoluto Complemento
-1 00000001 11111111
-20 00010100 11101100
-40 00101000 11011000
-15 00001111 11110001
-100 01100100 10011110
-18 00010010 11101110
-50 00110010 11001110
-97 01100001 10011111
-111 01101111 10010001
-48 00110000 11010000
-2 00000010 11111110
-5 00000101 11111011
-90 01011010 10100110
-80 01010000 10110000
-70 01000110 10111010
-25 00011001 11100111
-101 01100101 10011011
-102 01100110 10011010
-10 00001010 11110110
-11 00001011 11110101
-106 01101010 10010110
-82 01010010 10101110
-29 00011101 11100011
-30 00011110 11100010
-12 00001100 11110100
-8 00001000 11111000
-63 00111111 11000001
-31 00011111 11100001
-64 01000000 11000000
-98 01100010 10011110
Foglio Elettronico Foglio Elettronico
Cosa c’è nelle memorie
Nelle memorie del computer tutte le informazioni sono binarie, essendo tutti i dispositivi usati a due
componenti. Nei mezzi di trasmissione si usano correnti o segnali luminosi (segnale presente/segnale
assente), nelle memorie si usano componenti magnetici (nord/sud) oppure ottici (plastica scavata oppure no).
La capacità di memoria di un singolo componente è minima (2 informazioni): esso viene chiamato, in
qualunque forma sia, bit (contrazione di binary digit=cifra binaria). Per motivi di praticità i bit sono
raggruppati a 8 per volta, costituendo unità dette byte.
Un byte è diviso in due semibyte o nibble (nibble e bite indicano, in inglese, l’azione di mordere), ed è
quindi rappresentabile in due modi:
Notazione binaria 00000000 01001010 11111111
Notazione esadecimale 0 0 4 A F F
Un byte può assumere 256 configurazioni (28=256), quindi anche la sua capacità informativa non è molto
alta, per cui è stato associato al singolo carattere (maiuscole, minuscole, cifre, segni di punteggiatura). La
scelta del byte di 8 bit è stata effettuata negli anni ’50, e si è dimostrata più che adeguata nel nascente mondo
dell’informatica, superiore, ad esempio, ad una differente a 6 bit. Il raggruppamento dei bit a 4+4 si è
rivelato molto più pratico, anche per questioni di elettronica.
In particolare, prendendo spunto da codici usati in telegrafia16
, un
comitato dell’ASA (American Standard Institute) elaborò, tra il
1960 e il 1963, una codifica detta ASCII (American Standard
Code for Information Interchange), inizialmente usata come
codice a 7 bit per le telescriventi. L’ottavo bit veniva usato per il
controllo della trasmissione, quindi non compariva nella codifica.
Sulle 128 combinazioni disponibili (27=128), poi, le prime 32 non venivano
usati per la rappresentazione dei caratteri, ma per codici di controllo della telescrivente (TTY=teletype), ad
esempio per andare a capo, tabulare, o far suonare il campanello di fine riga.
Essendo basata sull’alfabeto inglese, è stata adottata nel mondo occidentale, in
particolare nella codifica delle informazioni per i minicomputer e i primi PC.
Negli anni ’80 si è diffusa, con i PC IBM e
compatibili, la codifica “ASCII estesa” (extended
ASCII), che NON è un aggiornamento o una
estensione dell’ASCII, anche se i primi 128 caratteri
sono corrispondenti: in essa viene usato anche l’ultimo bit, consentendo di
raggiungere tutte le 256 configurazioni di un byte. In questo modo si sono potuti
codificare caratteri speciali presenti in varie lingue. Sono state introdotte numerose
versioni di ASCII esteso, distinte per code page: la pagina originale 437 (Nord
America), ad esempio, contenendo i caratteri accentati tipici di alcune lingue
romanze, poteva essere abbinata alla tastiera italiana.
La codifica introdotta dalla IBM per i suoi mainframe è nota come EBCDIC
(Extended Binary Coded Decimal Interchange Code), ed era stata usata anche
su altre piattaforme hardware (Siemens, Unisys).
La codifica a 6 bit realizzata per i computer della CDC17
era chiamata, senza tante sigle, “Display code”. Non più in
uso nelle memorie dei computer per le sue limitazioni,
viene usata in alcuni obiettivi per macchine fotografiche digitali.
16 Ad esempio, le codifiche Morse, Manchester, Miller, Baudot.
17 CDC (Control Data Corporation): fu la prima costruttrice di “supercomputer”.
ASCII in action
Con i 7 bit ASCII si possono rappresentare 128 simboli (27). I codici (quelli adottati per i primi PC
all’inizio degli anni ‘80) sono i seguenti:
PRIMO NIBBLE (0..7)
0000 0001 0010 0011 0100 0101 0110 0111
SECONDO NIBLLE (0..15)
0000 NUL DLE 0 @ P ` p
0001 SOH DC1 ! 1 A Q a q
0010 STX DC2 “ 2 B R b r
0011 ETX DC3 # 3 C S c s
0100 EOT DC4 $ 4 D T d t
0101 ENQ NAK % 5 E U e u
0110 ACK SYN & 6 F V f v
0111 BEL ETB ‘ 7 G W g w
1000 BS CAN ( 8 H X h x
1001 TAB EM ) 9 I Y i y
1010 LF SUB * : J Z j z
1011 VT ESC + ; K [ k {
1100 FF FS , < L \ l |
1101 CR GS - = M ] m }
1110 SO RS . > N ^ n ~
1111 SI US / ? O _ o DEL
La tabella va letta combinando il primo nibble (o semibyte) con il secondo, costruendo così il byte
corrispondente. Teniamo sempre presente che il primo bit è sempre 0. Esempi:
0 0011-0000 32+16 48
4 0011-0100 32+16+4 52
@ 0100-0000 64
A 0100-0001 64+1 65
F 0100-0110 64+4+2 70
[ 0101-1011 64+16+8+2+1 91
\ 0101-1100 64+16+8+4 92
] 0101-1101 64+16+8+4+1 93
a 0110-0001 64+32+1 97
f 0110-0110 64+32+4+2 102
{ 0111-1011 64+32+16+8+3+1 123
| 0111-1100 64+32+16+8+4 124
} 0111-1101 64+32+16+8+4+1 125
Lo SPAZIO è codificato come 3210-2016-001000002.
Anche sui PC attuali è possibile inserire un carattere tramite il codice ASCII: il numero corrispondente va
scritto tenendo premuto il tasto Alt, usando il tastierino numerico. La conoscenza (anche a grandi linee)
della codifica permette a volte di cavarsi d’impaccio con una tastiera sconosciuta, come capita quando ci si
trova all’estero.
Esame del contenuto di un file testo
Un semplice modo di vedere la codifica ASCII si ha memorizzando un file testo con un programma tipo
“Blocco note” o direttamente dal prompt dei comandi. Esempio di file testo (che si suppone memorizzato su
disco con il nome testo.txt):
Come sul capo al naufrago L'onda s'avvolve e pesa L'onda su cui del misero Alta pur dianzi e tesa, Scorrea la vista a scernere Prode remote invan;
Attivando un programma di gestione esadecimale (uno dei
più noti: Free Hex Editor Neo), si ha una vista più completa
(a destra):
Il primo gruppo di dati rappresenta gli indirizzi dei byte
all’interno del file. Il contenuto del file viene presentato in
notazione esadecimale (2 nibble per volta) nella parte centrale, in forma più visibile nella colonna di destra.
Il trattino in mezzo alla colonna esadecimale è solo per comodità. Si può notare che per andare a capo viene
usata una sequenza di 2 caratteri, corrispondenti ai codici ASCII 13 e 10 (13=torna a inizio riga, 10=nuova
riga).
Man mano che l’informatica è andata diffondendosi, è nata l’esigenza di codificare un numero sempre
maggiore di simboli, sia per tener conto di alfabeti non europei, sia per altre
notazioni presenti, ad esempio, nella letteratura scientifica o musicale.
La codifica accettata come standard informatico è quella del consorzio Unicode, che
usa fino a 4 byte per carattere nella versione chiamata UTF-8. Il consorzio ha
iniziato i lavori tra il 1987 e il 1988, ed è giunto alla versione 6.0. Con 4 byte a
disposizione, il numero di combinazioni possibili è circa 232 (4.294.967.295).
La lunghezza della codifica è variabile:
i primi 128 caratteri (US-ASCII) occupano 1 byte;
i successivi 1920 (sufficienti a coprire tutti gli alfabeti latini ed altri come il cirillico e il greco)
occupano 2 byte;
i caratteri di altri alfabeti (tra cui cinese e giapponese) occupano 3 byte;
i caratteri meno comuni, inclusi alcuni archeologici, e una serie di altri simboli (tra cui gli
emoticon) occupano 4 byte.
Attualmente sono codificati oltre 109.000 caratteri provenienti da 93 alfabeti. Alcuni esempi:
€ Euro 20AC
Pi greco 03C0
Infinito 221E
QUI (Tsalagi o ᏣᎳᎩ )18
13C8
TLU (Tsalagi o ᏣᎳᎩ ) 13E1
☃
Snowman 9731
Chiave di violino 1D11E
Chiave di basso 1D122
18 La lingua scritta della nazione degli Aniyounwiya, noti (erroneamente) come Cherokee. L’alfabeto fu creato da un
loro membro chiamato Sequoyah (ca.1767-1843), da cui ha preso il nome un albero (Sequoia Sempervirens). La cosa
interessante è che egli era analfabeta.
Sistemi di numerazione Formattazione condizionale
Gli inizi
Il foglio elettronico è stato inventato attorno al 1980 da Dan Bricklin e Bob Frankston19
, fondatori di una
ditta chiamata “Software Arts”. Il loro programma si chiamava VisiCalc, ed è stato seguito da molti altri, che
hanno lasciato qualche traccia nella storia iniziale del PC: Lotus 1-2-3,
Symphony, Quattro, MultiPlan, SuperCalc, Works. Attualmente i più noti
fogli elettronici sono Microsoft Excel e Open Office Calc. In questo corso
viene usato Open Office Calc.
Il corrispondente termine inglese “spreadsheet”, nella contabilità manuale,
indicava il libro dove venivano riportati i dati delle fatture, con le spese
separate in colonne distinte: lo stesso formato è stato adottato per le tabelle elettroniche di
calcolo. I fogli di calcolo sono spesso usati per memorizzare ed elaborare informazioni finanziarie o
scientifiche, data la loro proprietà di ricalcolare automaticamente i valori delle celle dopo ogni variazione.
In realtà, quando si attiva il programma, più che un foglio elettronico compare una cartella con più fogli
(normalmente 3).
Un foglio è formato da celle organizzate in righe e colonne. Le righe sono numerate, le colonne sono
indicate da lettere. Per superare i limiti dell’alfabeto esistono lettere multiple: dopo Z c’è AA, AB, AC; dopo
ZZ c’è AAA, AAB, AAC, … L’ultima colonna disponibile è AMJ, corrispondente a 1024 (210
). Le righe
disponibili sono 1048576 (220
).
Le celle possono contenere valori costanti, ad esempio numeri, testi20
, date.
I valori calcolati a partire da altri dati (per esempio, usando altre celle) sono detti formule o funzioni.
Una cella viene selezionata con le frecce direzionali o puntando il mouse. Abbinando il tasto “maiuscolo”
alle frecce o trascinando il mouse, è possibile selezionare un’area rettangolare di più celle. Una riga o una
colonna possono essere selezionate facendo click sulla loro intestazione (il numero o la lettera). L’intero
foglio può essere selezionato facendo click sull’intestazione vuota presente nell’angolo superiore sinistro
(vicino ad A1). Abbinando il tasto “Ctrl” con il click del mouse, è possibile selezionare celle anche non
adiacenti.
La selezione può essere tagliata/copiata e incollata con i comandi standard, che possono essere:
nel menu “Modifica”
nelle icone della barra “Modifica”
Ctrl-C, Ctrl-V, Ctrl-X
Possono essere inserite righe e colonne con il menu “Inserisci”. Per inserire più righe o colonne
contemporaneamente, è necessario selezionarne un certo numero: il numero di righe o colonne inserite è pari
al numero di righe o colonne selezionate.
19 Il padre di Bob si chiamava in realtà Frankenstein. Cambiò nome per motivi comprensibili.
20 I testi sono compresi tra virgolette: ad esempio, “questo è un testo”.
Le selezioni possono essere indicate con l’elenco delle celle (separato da “punto e virgola”) o con le
coordinate degli angoli (separati da “due punti”).
Negli esempi sottostanti, la prima selezione può essere indicata con A2;B4;C1, la seconda con B1:C2 (o
anche con C1:B2, nel qual caso il programma la converte automaticamente in B1:C2).
La cella che rimane evidenziata è l’ultima selezionata. Una selezione rettangolare viene solitamente
effettuata da “alto-sinistra” verso “basso-destra”: nelle esercitazioni seguenti verrà sempre considerata come
“ultima cella” quella in basso a destra.
Uno degli aspetti più significativi dei fogli di calcolo è la possibilità di inserire dati dinamici21
attraverso le
formule o le funzioni.
Una formula è indicata da un segno di uguale seguito da un polinomio, nel quale possono essere inclusi
valori costanti o riferimenti a celle (valori variabili). La sintassi della formula deve rispettare le comune
regole dell’algebra (parentesi e simboli di operazioni).
+ Addizione
- Sottrazione
* Moltiplicazione
/ Divisione
^ Elevamento a potenza22
Esempi:
=A1/2 (v. esempio a fianco)
=A1^2+3*A2^3+2*(5)
Il carattere dinamico del dato inserito come formula si nota quando essa contiene un riferimento ad una
cella. Modificando il valore della cella relativa, si ha la modifica immediata del risultato della formula
(questo è il significato dell’espressione “dato dinamico”).
21 Si intende che possono cambiare anche in modo automatico.
22 Attenzione !!! Questo simbolo non viene solitamente usato nei linguaggi di programmazione che verranno studiati
nel seguito di questo corso.
Se la cella B1 contiene la formula =A1/2,
ogni variazione della cella A1 viene riportata
immediatamente nella cella B1
Semplificando molto, si può dire che, in matematica, una funzione è una associazione tra un valore
(argomento; può essere anche un insieme di più valori) ed uno corrispondente (detto valore o, a volte,
immagine). Anche nei fogli elettronici esistono funzioni, che sono indicate da un segno di uguale all’inizio,
una parola chiave che indica cosa calcola la funzione, e una coppia di parentesi, contenente uno o più
argomenti.
Le funzioni più comuni sono =SOMMA() e =MEDIA(). Esse hanno come argomento una selezione di celle
(volendo, anche una sola, sebbene non abbia molto senso). Un esempio per verificarne il comportamento:
Scrivere valori numerici nelle celle tra A1 e B2
Nella cella A3 scrivere =SOMMA(A1;A2) Copiare la cella A3 nella cella B3: verrà trasformata in =SOMMA(B1;B2)
Nella cella A4 scrivere =SOMMA(A1:B2) In un’altra cella scrivere =SOMMA(A1;A2;B1;B2)
Il punto e virgola ; separa due indicazioni di cella. I due punti : indicano gli angoli di un’area rettangolare.
La funzione =MEDIA() ha un comportamento analogo, con le seguenti particolarità:
le celle vuote sono escluse dal calcolo; quelle contenenti ZERO sono incluse
Se la somma calcolata è nulla, nella cella esce il messaggio di divisione per zero: #DIV/0!
Esempio:
Come visto in precedenza, una formula =SOMMA(A1;A2), se copiata nella cella a fianco, viene trasformata
in =SOMMA(B1;B2). Questo potrebbe essere un effetto non voluto, perché capita a volte di voler effettuare i
calcoli su una zona fissa del foglio.
Per copiare una formula o una funzione senza modificare i riferimenti alle celle, si può usare il segno di $
(dollaro) davanti a una o a entrambe le coordinate del riferimento. La coordinata preceduta dal segno $ non
verrà modificata copiando la formula in un’altra cella.
=SOMMA($A$1:$A$2) selezione invariata =SOMMA($A1:$A2) colonna invariata =SOMMA(A$1:A$2) riga invariata
N.B.: la modifica delle coordinate non avviene se la formula viene spostata in un’altra cella (taglia+incolla).
Funzioni di aritmetica intera
Nell’aritmetica intera vengono spesso usati gli operatori INT e RESTO, in formule e funzioni che hanno a
che fare con divisioni intere:
=A1/2 Divisione esatta (possibili decimali) =INT(VALORE) Parte intera =INT(FORMULA) =RESTO(DIVIDENDO;DIVISORE) Gli argomenti devono essere interi
Al posto degli argomenti evidenziati in rosso si può indicare qualsiasi cosa sia numerica (valori, riferimenti
a celle, formule, funzioni). Gli argomenti vanno separati da ; (punto e virgola). Per provare l’effetto, basta
inserire dei numeri in qualche cella e scrivere una di queste formule in un’altra. Esempio:
In A1 scrivere 15; in B1 scrivere 4; in C1 scrivere =RESTO(A1;B1). Risultato: 3
Una volta completato l’inserimento della formula-
funzione, la cella A7 mostrerà il valore 5,4.
Come prevedibile, la funzione è dinamica:
modificando, ad esempio, la cella A5 perché
contenga 6, la media verrà ricalcolata in 5,6.
Applicazione delle formule SOMMA e MEDIA ad una zona.
Vediamo come la zona sia preferibilmente indicata con :, mentre l’elenco ottenuto con ; si traduce in una
scrittura complessa:
=SOMMA(a1:a6) la formula corretta =SOMMA(a1;a2;a3;a4;a5;a6) perdita di tempo
Applicazione delle formule MIN e MAX ad una zona.
In questo esempio, dove la zona è rettangolare, vediamo che l’elenco ottenuto con ; porta ad un errore.
Applicazione della formula RESTO a tutte le celle di una zona. Come già visto in precedenza, il resto della
divisione per 2 è associato alla parità di un numero (immagini iniziali)..
In questo caso la soluzione è scrivere la formula solo per una riga, poi usare le funzioni copia/incolla per
applicare la formula alle altre celle:
La formula RESTO con divisore 10 permette di estrarre le cifre delle unità da una cella:
Spesso accade di applicare una funzione al risultato di un’altra funzione (operazione detta composizione).
Questo implica l’uso di una parentesi che contiene un’altra parentesi, come può accadere in algebra. Come in
algebra, le parentesi si “svolgono” dall’interno verso l’esterno: l’ordine di esecuzione, quindi, non essendo
“da destra a sinistra”, è meno immediato da cogliere. Per individuare il concetto di “e poi” legato alla
successione temporale occorre individuare le parentesi dalle più interne alle più esterne.
Due esempi di calcolo composto, uno con sole operazioni aritmetiche e uno con funzioni:
Formula (ordine: 1-2) Calcolo 1 Calcolo 2 =(A1*(B1+C1)) B1+C1 A1*(risultato1) =INT(RESTO(A1;100)/10) RESTO(A1;100) INT(risultato1/10)
Questa funzione richiama un costrutto molto usato nella programmazione, detto “istruzione condizionale”.
Semplificando molto, si prevedono due possibili formule da calcolare: quale delle due viene scelta dipende
del risultato di un confronto tra valori. Il valore è condizionato, perché dipende da altri calcoli.
Il confronto può avere due risultati, vero o falso: la scelta del valore da assegnare alla cella viene per questo
motivo detta binaria o alternativa. Anche i confronti possibili sono binari, e sono i cosiddetti “operatori
relazionali” usati anche in programmazione. Sono 3 coppie di operatori contrapposti:
= Uguale
<> Diverso
>= Maggiore o uguale
< Minore
<= Minore o uguale
> Maggiore
Nelle formule condizionali vengono indicati il confronto e i due possibili risultati o calcoli (il primo se la
condizione risulta vera, l’altro in caso contrario), separati tra loro da ;
=SE(A1>0;"Positivo";"Non positivo") =SE(A2<>"";"non vuota";"vuota") =SE(A3=1;0;1) =SE(A2<>"";INT(A2/2);"")
La funzione =SE() è suddivisa in 3 parti:
=SE( controllo ; se-vero ; se-falso) 1 2 3
La (1) deve necessariamente essere un controllo (a volte detto “test”). Il risultato di un controllo può essere
solamente vero o falso. In base al risultato la cella potrà mostrare il valore (2) oppure il (3). Il secondo
valore (parte 3 della funzione) potrebbe anche mancare, ma non è una pratica consigliabile: in caso di
controllo “falso” il programma mostrerebbe un messaggio di errore.
Nel seguente esempio, si controlla se il contenuto di qualche cella è >=0 oppure <0. In una cella vicina si
vuole che compaia la scritta corrispondente (N.B.: solo la scritta, nessun calcolo).
Alcuni valori di esempio sono stati inseriti nelle celle D1, E1, F1. Nelle celle D2, E2, F2 è stata inserita la
funzione riportata in verde nella terza riga (la terza riga è presente solo per mostrare a formula).
A B C D E F 1 VALORE 2 -3 0 2 CALCOLO >=0 <0 >=0 3 =se =SE( D1>=0 ; ">=0" ; "<0")
N.B.: l’opposto di < non è >, è >=
È uno degli errori più comuni.
1
Esaminare il contenuto di una cella (ad esempio, quelle
della colonna A).
Scrivere, nella cella a fianco, se il numero in A è multiplo
di 10 oppure no.
In questo caso occorre usare la funzione “resto”. La
formula va scritta nella cella B1, poi copiata nel seguito
della colonna B:
=SE( RESTO(A1;10)=0; "multiplo di 10"; "non multiplo di 10")
Un altro modo di porre il problema potrebbe essere: verificare se un valore termina con zero.
L’espressione “termina con zero” non è algebrica: deve essere trasformata in qualcosa che il programma può
fare. Questo “qualcosa” è un’operazione di “resto”: nel caso specifico un resto con divisore 10.
2 Esaminare il contenuto di una cella (ad esempio, quelle
della colonna A).
Se il numero è pari, la cella in B deve mostrare il doppio
della cella in A.
Se il numero è dispari, la cella in B deve mostrare il triplo
della cella in A.
L’espressione “pari” va trasformata usando la funzione
“resto uguale a ZERO” (il divisore è, ovviamente, 2): =SE( RESTO(A1;2)=0; A1*2; A1*3)
3
Confrontare due celle (nei 3 esempi: A1 con B1, A2 con B2, A3
con B3), e inserire nella cella a fianco un simbolo che descrive la
relazione tra le due celle.
Se la prima è maggiore della seconda, si dovrà visualizzare >
Se i valori sono uguali, si dovrà visualizzare =
Se la prima è minore della seconda, si dovrà visualizzare <
Questa situazione è complicata dal fatto che ci sono tre possibili risultati. La soluzione è un “doppio SE”:
uno dei casi della funzione SE contiene a sua volta una funzione “SE”.
=SE( A1<B1; "<"; SE( A1=B1; "="; ">") )
Confronti complessi
Quando devono essere verificate più condizioni contemporaneamente il controllo (parte 1 della funzione SE)
diventa “composto”. Per fare questo si può usare un connettivo logico tra DUE confronti distinti (analoghi ai
vari “et”, “vel”, “non” della logica matematica).
Mentre nella maggior parte dei linguaggi di programmazione questi connettivi sono delle parole inglesi
(normalmente AND, OR, NOT), nel foglio di calcolo dobbiamo usare la versione italiana.
Le funzioni logiche sono: E, O, NON.
(c1) E (c2) risulta VERO se entrambi in controlli sono veri, FALSO in ogni altro caso.
(c1) O (c2) risulta VERO se almeno uno dei due controlli è vero, FALSO solo se entrambi sono falsi
NON(c) è una negazione, tra parentesi ci va solo una condizione.
Nel seguente esempio le cose si complicano. Il confronto della funzione SE è a sua volta una funzione.
Nasce quindi una parentesi all’interno di un’altra. Mentre in algebra esistono differenti parentesi (tonde,
quadre, graffe), in informatica si usano solo le rotonde. Questo genera inizialmente un po’ di difficoltà, ma è
necessario abituarsi, perché le parentesi multiple si incontrano molto spesso.
Per evitare errori, occorre prestare molta attenzione nella chiusura delle parentesi interne. Se possibile, si
consiglia di aggiungerle in momenti successivi, in modo da controllare le possibili cause di errore una per
volta.
Esempio
Calcolare le cifre di un numero in notazione binaria. Il numero è contenuto
nella cella A1, i risultati parziali vanno scritti sotto (colonna A) e a destra
(colonna B).
Come è noto, per trasformare un numero in base 2 occorre una sequenza di
divisioni e resti per 2. I risultati delle divisioni saranno in colonna A, i resti
in colonna B. I due esempi di fianco rappresentano i numeri 25 e 80.
Una prima soluzione (semplificata) si ottiene con le formule:
=INT(A1/2) (cella A2)
=RESTO(A1;2) (cella B1)
Copiando le formule si ha un risultato corretto, ma non molto efficace nella visualizzazione.
Occorre ottenere l’effetto presentato nelle immagini precedenti. In pratica, sotto il valore
zero che viene incontrato nella colonna A bisogna che non si vedano valori, e
analogamente bisogna che non si vedano resti “non significativi” sotto l’ultimo “1” che si
calcola.
La soluzione NON è andare a cancellare il contenuto delle celle. Questa non è una
soluzione: è una perdita di tempo. La soluzione consiste invece nel verificare, attraverso le
formule di confronto, SE un valore è da visualizzare o se la cella deve apparire vuota.
Un valore vuoto viene rappresentato con "" (virgolette aperte e chiuse, VUOTE).
Quindi, per verificare se una cella è vuota, essa va confrontata con "".
Nella soluzione, le operazioni vanno eseguite solo se la cella sopra (la divisione) o la cella a fianco (il resto)
è NON VUOTA e contiene un numero MAGGIORE DI ZERO. Come si può notare, questa è proprio una
condizione doppia.
Le formule vanno sistemate con un operatore E che raggruppa i due confronti. Se i confronti non sono
verificati il valore visualizzato nella cella deve essere "" (virgolette vuote):
=SE( (A1<>"") E (A1>0); INT(A1/2) ; "") (cella A2) =SE( (A1<>"") E (A1>0); RESTO(A1;2) ; "") (cella B1)
4 Verificare se un numero è compreso tra altri due. Ad esempio, controlliamo se il
valore della cella B1 è compreso tra quelli delle celle A1 e C1, mettendo in D1
una risposta (“SI” oppure “NO”).
In questo caso sono necessari due confronti. Nella cella D1 potrebbe andare
questa formula:
=SE( (A1<=B1) E (B1<=C1); "SI"; "NO")
=SE(A1<=B1<=C1;"SI";"NO") ERRORE
La seconda formula si incontra nei testi di algebra, dove si preferisce per la sua compattezza. Tuttavia non è
solitamente presente nell’informatica. Purtroppo generazioni di studenti si intestardiscono nel vano tentativo
di farla accettare ad un foglio di calcolo o in un linguaggio di programmazione, con l’unico risultato di
ottenere un messaggio di errore.
In realtà la soluzione è più complessa. La formula proposta va bene solo se i valori sono in sequenza
crescente. Per controllare anche una sequenza decrescente è necessario controllare due condizioni, con la
funzione O(), che risulta vera quando lo è almeno una (in totale abbiamo quindi quattro confronti):
=SE( ((A1<=B1) E (B1<=C1)) O ((A1>=B1) E (B1>=C1));"SI";"NO")
5 Verificare se due numeri sono entrambi pari. Nella riga 1 la condizione è vera (la
formula visualizza "A"), nelle altre righe la condizione è falsa (la formula visualizza
"B").
In questo caso sono necessari due controlli su resti della divisione per 2. La
condizione “pari” deve valere contemporaneamente, quindi è necessario un E().
La cella C1 potrebbe contenere questa formula:
=SE( (RESTO(A1;2)=0) E (RESTO(B1;2)=0); "A"; "B")
6 Verificare se almeno uno tra due numeri è pari. Nella riga 4 la condizione è falsa (la
formula visualizza "B"), nelle altre righe la condizione è vera (la formula visualizza
"A").
Anche in questo caso sono necessari due controlli su resti della divisione per 2, ma
questa volta basta una condizione “pari”, quindi useremo un O().
La cella C1 potrebbe contenere questa formula:
=SE( (RESTO(A1;2)=0) O (RESTO(B1;2)=0); "A"; "B")
7 Verificare se le distanze tra due coppie di numeri sono uguali. Come in
geometria, per “distanza” si intende “differenza”.
Qui c’è un piccolo inganno: sono coinvolte 3 celle, ma la formula è semplice:
basta confrontare 2 distanze. La cella D1 potrebbe contenere questa formula:
=SE( C1-B1=B1-A1; "S"; "N")
Funzioni Data
Il foglio elettronico è nato per eseguire dei calcoli, ma anche delle previsioni di bilancio. È quindi naturale
che presenti una serie di funzioni per l’elaborazione delle date, che entrano in molti calcoli finanziari.
Con un foglio vuoto, possiamo rapidamente inserire una serie di formule per le cosiddette “funzioni data”.
Inserimento di una data Data corrente =oggi()
ANNO – MESE – GIORNO Data assegnata con 3 numeri =data(2005;12;5)
Data assegnata con 3 numeri + correzione =data(2005;12;35)
Data assegnata con 3 numeri: variabile =data(A1;B1;C1)
Scadenze Data + giorni (anche in negativo) =F4+87 =F4-15
Data + mesi (anche in negativo) =data.mese(A1;A2)
Calcoli con due date Anni tra 2 date (*) =anni(A4;B4;0)
Anni tra 2 date, con decimali (*) =frazione.anno(A4;B4;1)
Numero giorni tra due date =giorni(A4;B4)
(stessa cosa con la differenza) =B4-A4
Calcoli sull’anno Giorni dell'anno di una data =giorni.anno(F5)
Bisestile? 0=no; 1=si (serve una data) =anno.bisestile(F5)
Pasqua di un anno =domenica.di.pasqua(F5)
Calcoli sul mese Numero giorni (serve una data) =giorni.mese(F5)
Informazioni riguardanti la data Estrazione dell’anno da una data =anno(H5)
Estrazione del mese da una data =mese(H5)
Estrazione del giorno da una data =giorno(H5)
Settimanale: 1=domenica; 7=sabato (*) =giorno.settimana(F5;1)
Le prime due formule di assegnazione di una data non si incontrano mai in questa forma.
Sono state messe a scopo dimostrativo, per vedere come il programma sistema gli errori.
Ad esempio, con i valori 2005;12;35 il foglio considera i 4 giorni di troppo del mese di dicembre e li
aggiunge al mese successivo, ottenendo così 04/01/2006. Naturalmente, se ci sono errori nel mese, i mesi
eccedenti il 12 vengono sommati al gennaio successivo. In caso di errori ancora più grandi, il foglio farà tutti
i calcoli possibili per sistemare la data, avanzando o indietreggiando del dovuto.
I calcoli sull’anno e sul mese si possono fare indicando tra parentesi una data o un numero:
Le informazioni riguardanti la data, invece, prevedono tra parentesi solo una data;
Il calcolo della scadenza può essere fatto anche con numeri negativi (si va indietro nel calendario);
La scadenza per mese prevede come primo argomento una data, come secondo argomento un numero;
Le 3 formule segnalate con (*) hanno più modalità di calcolo, ottenibili variando l’ultimo argomento: le
impostazioni scritte sono quelle consigliate per calcoli più complessi.
Formattazione
Può capitare che una data venga visualizzata in forma numerica, come nell’esempio
riportato a sinistra (in realtà il contenuto della cella è 30/12/2012).
La soluzione rapida a questo problema è di selezionare la
cella, attivare Formato – Celle, poi selezionare “Data”
nella linguetta “Numeri”.
Più avanti si vedrà una soluzione più elegante.
Esercizi
Supponiamo di avere un foglio con alcuni dati:
A1, B1 contengono due date;
A2, A3, A4 contengono tre numeri;
C1 contiene un numero.
I tre numeri nella colonna A, se associati in una formula =DATA, determinano una data (nell’esempio è una
data corretta, ma nell’esercizio 10 verificheremo casi errati come la combinazione 2012, 15, 17).
Ci sono 12 domande; le risposte sono nella pagina successiva.
Ogni domanda prevede la scrittura di una formula che può andare in qualsiasi cella, e che viene calcolata in
base ai valori indicati, che fanno parte delle celle riportate nell’esempio.
ATTENZIONE !!! I valori sono solo degli esempi. Se fossero diversi, i risultati potrebbero
cambiare. Non ci dovrebbe mai essere un valore costante in una formula, a
parte date sicuramente esistenti come potrebbero essere il primo di un mese o
l’ultimo di un anno (in quei casi, e solo in quelli, i numeri 1, 12 e 31 sarebbero
giustificati),
Quindi nessuna formula dovrebbe contenere i numeri delle celle: 29, 12, 11, 17, 3, 34. L’unica
eccezione è il 12, quando si cerca l’ultimo giorno di un determinato anno.
1 La data in B sommata con i giorni in C
2 Calcolare la data di Pasqua dell’anno successivo
3 Calcolare l’ultimo giorno del mese di una data.
4 Calcolare l’ultimo giorno dell’anno di una data.
5 Calcolare quanti giorni mancano alla fine del mese
6 Calcolare quanti giorni mancano alla fine dell’anno
7 Visualizzare 1 se nella prima metà del mese, 2 se nella seconda
8 Visualizzare "P" se il mese è pari, "D" se il mese è dispari
9 La stessa data tra un anno
10 Visualizzare "SI" se 3 celle contengono una data corretta (A-M-G), "NO" altrimenti
11 Visualizzare "SI" se il giorno esiste anche nel mese successivo, "NO" altrimenti
12 Visualizzare "SI" se il giorno della settimana di due date è lo stesso, "NO" altrimenti.
13 Calcolare la domenica precedente.
14 Calcolare la domenica successiva.
Soluzioni
1 La data in B sommata con i giorni in C =B1+C1 (N.B.:C1 è un numero puro)
2 Calcolare la data di Pasqua dell’anno successivo =DOMENICA.DI.PASQUA(ANNO(A1)+1)
3 =DATA(ANNO(A1);MESE(A1);GIORNI.MESE(A1))
4 =DATA(ANNO(A1);12;31)
5 Calcolare quanti giorni mancano alla fine del mese =GIORNI.MESE(A1)-GIORNO(A1)
6 Calcolare quanti giorni mancano alla fine dell’anno =GIORNI(DATA(ANNO(A1);12;31);A1)
7 Visualizzare 1 se nella prima metà del mese, 2 se nella seconda
=SE(GIORNO(A1)<=GIORNI.MESE(A1)/2;"1";"2")
La funzione GIORNI.MESE conta i giorni del mese; basta dividere per 2.
8 Visualizzare “P” se il mese è pari, “D” se il mese è dispari
=SE(RESTO(MESE(A1);2)=0;"P";"D")
La funzione MESE combinata con la funzione RESTO della divisione per 2.
9 La stessa data tra un anno
=DATA.MESE(A1;12) Soluzioni quasi identiche sono le seguenti:
=DATA(ANNO(A1)+1;MESE(A1);GIORNO(A1)) =A1+GIORNI.ANNO(A1)
Soluzione 1: usa la funzione DATA.MESE per avanzare di un certo numero di mesi.
Soluzione 2: usa la funzione ANNO per trovare l’anno successivo, abbinata alla funzione DATA. La prima
soluzione è più sicura, visto che il mese non viene modificato. La seconda fallisce solo se la cella di partenza
contenga il 29 Febbraio di un anno bisestile: in quel caso porta al 1 Marzo dell’anno seguente.
Soluzione 3: poco efficiente quando ci sono di mezzo anni bisestili. Sconsigliabile.
10 Visualizzare SI se 3 celle contengono una data corretta, NO altrimenti
=SE(E(MESE(DATA(A2;A3;A4))=A3;ANNO(DATA(A2;A3;A4))=A2); "SI";"NO")
Per “data corretta” si intende che i tre numeri sono ben combinati per formare una data.
In questo caso la cella visualizza SI. Potrebbe non essere così se, ad esempio, A3 contenesse 15, oppure A4
contenesse 45. In quel caso, il foglio calcolerebbe una data alterata per far tornare i conti, e quindi ci sarebbe
un mese a sua volta alterato, non più corrispondente alla cella A3.
11 Visualizzare SI se il giorno esiste anche nel mese successivo, NO altrimenti
=SE(GIORNO(A1)<=GIORNI.MESE(DATA.MESE(A1;1));"SI";"NO") =SE(GIORNO(DATA.MESE(A1;1))=GIORNO(A1);"SI";"NO")
La risposta negativa ci sarebbe se A1 contenesse una data con giorno 31 in un mese seguito da uno di A1,
oppure se fosse uno degli ultimi giorni di gennaio. Ad esempio, un giorno come 31/08/2012 , oppure
come 30/01/2012.
Soluzione 1: La funzione GIORNI.MESE applicata al mese successivo.
Soluzione 2: La funzione DATA.MESE per avanzare di un mese, abbinata alla funzione GIORNO.
12 Visualizzare SI se il giorno della settimana è lo stesso (2 date), NO altrimenti
=SE(GIORNO.SETTIMANA(A1)=GIORNO.SETTIMANA(B1);"SI";"NO")
13 =B1-GIORNO.SETTIMANA(B1;1)+1
14 =B1-GIORNO.SETTIMANA(B1;1)+8
Foglio Elettronico Algoritmi
La formattazione condizionale
Rispetto al vecchio VisiCalc, i moderni fogli
elettronici hanno una vasta scelta di colori ed effetti
grafici, adatti per distinguere e separare le varie fasi
di un procedimento di calcolo.
Una definizione dell’aspetto visivo di una cella, o di
un gruppo di celle, viene chiamata stile: tra le
specifiche di uno stile è possibile progettare:
tipo di carattere (font)
colore di testo
colore di sfondo
presentazione dei dati (formato di output)
L’organizzazione degli stili è accessibile attraverso Formato-Stili e Formattazione, oppure premendo il
tasto F11. La finestra che esce mostra gli stili associati al programma Calc, uno dei quali è quello predefinito
(detto anche default).
Gli stili possono essere aggiunti o modificati con alcuni click del mouse. Con un click destro su uno degli
stili, viene attivato un menu nel quale è possibile scegliere di definire un nuovo stile (derivato da quello
selezionato) o modificare quello selezionato:
Le varie impostazioni dello stile sono
sparse nelle linguette disponibili:
nome Gestione
font Carattere
colore Effetto carattere
sfondo Sfondo
Bisogna passare per tutte queste fasi
per definire uno stile, che in seguito
potrà essere attivato tramite il nome
assegnato.
N.B.: ogni stile dovrebbe avere un nome che non sia “Senza nome1” come propone il programma.
Gestione dei formati – stili derivati
In alcune situazioni c’è bisogno di stili simili tra loro, ma comunque facilmente distinguibili. Esiste una
scorciatoia che permette di creare un nuovo stile partendo da uno già definito, facendo in modo che abbia le
stesse caratteristiche, senza dover perdere tempo a ridefinire tutto.
Per definire un nuovo stile, selezionare “Predefinito”, poi click destro e “Nuovo”.
Supponiamo di aver definito uno stile, chiamato “topo”, con queste caratteristiche:
font stencil, dimensione 20
colore rosso
sfondo giallo
Supponiamo che, per qualche esigenza visuale, sia necessario uno stile simile, ma
bianco su arancio (come a fianco), che chiameremo “gatto”.
Per evitare di perdere tempo ridefinendo tutte le caratteristiche dello stile, la strada
migliore è di creare uno stile derivato dal precedente e non dal predefinito. Si fa quindi click destro su
“topo”, poi “nuovo”, poi si prosegue come nel caso precedente.
In questo modo tutte le caratteristiche del nuovo stile sono “ereditate” da quello vecchio, ed è possibile
modificare solo quelle che devono essere diverse. Nel nostro esempio l’unica cosa da modificare sarebbero i
colori in “Effetto carattere”. Il vantaggio è che non c’è bisogno di impostare il resto, perché il nuovo stile è
già definito come il vecchio.
Si noti che modificando il formato dell’elenco degli stili in “gerarchico”, se ne ha una visione più chiara:
Questa procedura è più importante di quello che sembra. In questa situazione serve solo per
un giochino di colori, ma in studi avanzati diventa uno strumento fondamentale.
Stili e celle – formattazione condizionale
Assegnare uno stile ad una selezione di celle è immediato: basta scegliere lo stile desiderato nella finestra
“Stili e formattazione” e attivare il “modo riempimento” facendo click sull’icona con il barattolo di vernice.
Ogni cella su cui si fa click con il cursore trasformato in barattolo assume il formato selezionato.
Formattazione condizionale
L’assegnazione manuale dello stile è un lavoro molto modesto, e non ha nulla a che fare con l’elaborazione
automatica delle informazioni.
Il foglio elettronico dispone invece di uno strumento per la scelta automatica del formato in base al contenuto
delle celle. Un esempio molto semplice (anche se non molto utile) potrebbe essere una formula per colorare i
numeri pari diversamente dai numeri dispari.
Nell’esempio sottostante (che verrà risolto nella prima esercitazione proposta) sono stati inseriti dei numeri
nel foglio. Sono stati preparati due stili, chiamati blu e rosso, in cui l’unica differenza è il colore di testo (che
corrisponde, ovviamente, al nome dello stile). L’effetto che si vuole raggiungere è il seguente:
Inoltre, appena uno dei numeri del riquadro viene variato, deve rispondere immediatamente all’inserimento
del valore con la corrispondente variazione di colore (questo è l’automatismo che deve scattare).
È questa la formattazione condizionale: il formato viene scelto in base a una condizione. Le istruzioni da
inserire nel foglio per ottenere l’effetto desiderato sono infatti molto simili a quelle già incontrate nelle
formule condizionali (operatori relazionali e logici, in pratica confronti e condizioni composte).
Come salvare gli stili
Per eseguire diverse esercitazioni con gli stessi stili, può risultare comodo
memorizzare un gruppo di impostazioni in modo che ad ogni nuova apertura
del programma si presentino già predisposte.
Supponiamo di avere preparato tre stili (blu, rosso, verde) e li vogliamo
conservare per il futuro. Il foglio dovrebbe essere vuoto (altrimenti anche i dati
presenti si ripresenteranno ad ogni nuova apertura).
Fase 1: salvataggio delle impostazioni
Attivare:
File – Modelli – Salva
Mettere un nome nella casella “Nuovo modello” (esempio: liceo)
Premere OK (N.B.: non ci sono effetti visibili)
Fase 2: memorizzazione modello
Attivare: File – Modelli – Gestisci
Fare doppio click su “Personalizzati”, dovrebbe comparire il nostro nuovo stile (liceo).
Nella scelta “Comandi” (sulla destra) attivare “Imposta come modello predefinito (anche in questo caso non
ci sono effetti visibili immediati). Da questo momento, ogni nuovo foglio avrà gli stessi stili al momento in
uso.
Per riattivare il modello “predefinito” si entra sempre in questa fase “Gestisci”, solo che nella scelta
“Comandi” compare, come ultima voce, “Ripristino del modello predefinito”, seguito da “Foglio
Elettronico”. Dopo questa scelta, il modello per ogni nuovo foglio sarà nuovamente quello standard.
Zone e conteggi
Le zone di un foglio elettronico sono selezioni rettangolari di celle contigue. Alle zone spesso si assegna un
nome, più significativo e comodo da usare rispetto alla definizione fatta usando le coordinate delle celle
estremanti.
L’esempio seguente contiene attori e personaggi del film “Quella sporca dozzina”. Le date di nascita e di
morte si riferiscono ai personaggi, non agli attori23
.
L’intervallo A3:A14, ad esempio, potrebbe essere chiamato “attori”; l’intervallo C3:C14 potrebbe essere
chiamato “condanne”; e così via, identificando un particolare intervallo con una parola, che è solitamente più
significativa dell’indicazione delle celle.
La procedura è semplice: dopo aver selezionato la zona, si attiva l’elenco dei nomi di zona con la sequenza
Inserisci-Nomi-Definisci, oppure con la combinazione CTRL+F3. In questo riquadro si può scrivere il nuovo
nome, ed è anche possibile modificare il riferimento alle celle (che si trova in basso).
Si può notare che i riferimenti contengono tutti il segno $, ad indicare che sono tutti riferimenti fissi (anche il
nome del foglio): tali debbono rimanere, altrimenti non sarà possibile costruire formule corrette. Il nome del
foglio, comunque, è di importanza molto trascurabile rispetto alla zona, che solitamente abbiamo sotto gli
occhi.
23 Le date sono puramente indicative. L’unico riferimento nel film è che l’ambientazione è nella primavera del 1944.
In LibreOffice, nonostante le guide in linea suggeriscano la stessa procedura di OpenOffice, la gestione
dei nomi (comunque accessibile con CTRL+F3) è sepolta nei menu, e si raggiunge con:
Foglio-Aree con Nome ed espressioni-Gestisci
Funzioni di conteggio
I conteggi sulle celle possono essere effettuati con tre funzioni:
=CONTA.VALORI(zona) Conteggio celle non vuote
=CONTA.VUOTE(zona) Conteggio celle vuote (attenzione: non sono quelle con valore 0)
=CONTA.SE(zona;criterio) Conteggio condizionato
Supponiamo di avere una zona chiamata “numeri”, con limiti A1:C5, ed un paio
di celle campione (E1, E2).
I risultati di CONTA.VALORI(numeri) e CONTA.VUOTE(numeri) sono 15 e 0.
Questi valori, ovviamente, mutano se vengono effettuate modifiche (come
variazione di celle, inserimenti e/o cancellazioni di righe o celle).
Vediamo alcuni esempi di conteggi condizionati numerici. Il confronto più semplice è l’uguaglianza, dove
l’unico criterio è il numero campione. Come già visto in altre situazioni, non essendo una buona pratica usare
valori costanti (1 e 2), i confronti sono effettuati con una cella (3 e 4).
Il criterio di uguaglianza può essere scritto con il segno di =, che DEVE essere tra virgolette. In questo caso,
però, occorre fare attenzione quando il confronto è con una cella: segno e cella DEVONO essere collegati da
un & (ampersand). Questa notazione composta diventa obbligatoria con gli altri operatori relazionali:
<>(diverso), >, <, >=, >=. Qualche esempio:
uguaglianze altro
=CONTA.SE(numeri;20) 2 =CONTA.SE(numeri;"<19") 11
=CONTA.SE(numeri;"=19") 2 =CONTA.SE(numeri;"<"&E2) 11
=CONTA.SE(numeri;E1) 1 =CONTA.SE(numeri;">="&E2) 4
=CONTA.SE(numeri;"="&E2) 2 =CONTA.SE(numeri;"<>"&E2) 13
Con le stringhe la faccenda non è così semplice. La ricerca normale verifica se l’oggetto del criterio è
presente nella zona (non importa in quale posizione della cella). Con una zona “nomi” F1:H5, avremo:
=CONTA.SE(nomi;"q") 2
=CONTA.SE(nomi;"<>sp") 9
=CONTA.SE(nomi;J1) 4
=CONTA.SE(nomi;"<>"&J2) 9
Le cosiddette espressioni regolari (regexp) permettono di controllare il contenuto della stringa in varie
posizioni, secondo i seguenti criteri:
^xxx inizia con ... N.B.: esistono anche altre clausole per le
regexp, ma non sono parte di questo corso. xxx$ termina con ...
.* qualsiasi cosa
Negli esempi ci sono espressioni tra virgolette; in realtà si dovrebbero usare le celle, come in (*):
=CONTA.SE(nomi;"sp") contiene "sp" 3
=CONTA.SE(nomi;".*sp.*") Equivalente 3
=CONTA.SE(nomi;"^sp$") ESATTAMENTE UGUALE a "sp" 1
=CONTA.SE(nomi;"q$") termina con "q" 1
=CONTA.SE(nomi;"tto$") termina con "tto" 2
=CONTA.SE(nomi;"^ga") inizia con "ga" 2
(*) =CONTA.SE(nomi;J5) inizia con "g";termina con "e" 3
=CONTA.SE(nomi;"^g.*la.*e$") inizia con "g";termina con "e";in mezzo "la" 2
Nell’ultimo esempio vanno distinti 5 componenti: g + qualsiasi + la + qualsiasi + e
Per gestire i criteri di ricerca sulle stringhe, attivare Strumenti – Opzioni – OpenOffice Calc – Calcola:
Attivando “Celle intere”, la stringa cercata deve coincidere con l’intero contenuto della cella. In quel caso, il
conteggio =CONTA.SE(nomi;"sp") includerebbe solo le celle il cui contenuto è "sp".
I conteggi degli esempi precedenti sono stati ottenuti con la configurazione riportata nell’immagine, grazie
alla quale è sufficiente che la stringa di ricerca sia presente all’interno delle celle.
1 - pari e dispari Risolviamo l’ultimo esempio proposto. La prima cosa da fare è definire i due stili blu e rosso. Qualunque
font e formato va bene, l’importante in questo esercizio non è fare un’opera d’arte, ma imparare a derivare
gli stili.
Evitiamo di perdere tempo a definire gli stili separatamente. Prima di tutto non si rendono le cose più
semplici, e nemmeno più rapide; in secondo luogo, non avrebbe senso in un’esercitazione sugli stili derivati.
Possiamo poi creare il nostro “campo di gara”, come si dice in gergo: altro non è che lo spazio nel foglio nel
quale mettiamo i nostri dati e applichiamo le nostre formule.
Non c’è bisogno di andare a scrivere i numeri cella per cella; in realtà si può preparare lo schema usando 4
celle (1). Trascinando il quadratino nero che c’è in fondo alla selezione, si copia verso il basso (2), poi verso
destra (3):
1 2 3
Per applicare la formattazione condizionale, la cosa più comoda è selezionare nuovamente il campo di gara
nella maniera abituale (da alto-sinistra a basso-destra): in questo modo la cella evidenziata sarà J13. Questo
vale nell’esempio riportato: se il campo di gara è diverso, la cella in basso a destra potrebbe essere diversa.
L’importante è sapere qual è la cella evidenziata da un contorno nero.
Le condizioni
Nel menu “Formato”, scegliere “Formattazione condizionale”. Compare un riquadro come il seguente:
È possibile specificare tre formati condizionati, spuntando le caselle corrispondenti; in questo esercizio ne
basteranno due (visto che la scelta è tra numeri pari e numeri dispari).
Attenzione !!! Nelle due condizioni va indicata una formula, non un valore (per verificare la parità di un numero occorre
un calcolo), quindi in entrambe le condizioni va selezionato “La formula è”.
Nello spazio a fianco va messa la formula che deve essere verificata. Nella formula va messa la cella
evidenziata dal contorno nero; sarà il programma a calcolarla per tutte le celle della selezione.
La prima condizione è applicata ai numeri pari, quindi la formula descrive un “resto della divisione per 2
uguale a zero”. La seconda condizione è quella opposta (resto maggiore di zero).
Le formule vanno scritte esattamente come se fossero dentro una formula =SE.
Si può anche includere la clausola SE, l’effetto non cambia. Volendo proprio perdere del tempo, si può
metterci anche il segno di =: il programma lo scarterà senza fare una piega. Sono quindi equivalenti:
RESTO(J13;2)=0
SE(RESTO(J13;2)=0) clausola inutile
=SE(RESTO(J13;2)=0) una vera perdita di tempo
2 - Divisori di un numero Il risultato che vogliamo ottenere è di visualizzare i divisori di un numero in un riquadro 10x10.
Nell’immagine sottostante sono visualizzati i tre formati che verranno usati.
I numeri considerati non saranno superiori a 100.
Come già visto, per inserire i valori nel foglio bastano quattro celle:
Con due trascinamenti si completa il quadro:
GLI STILI
Passiamo poi a definire 3 stili, ciascuno derivato dal precedente. Solo il primo è derivato da “Predefinito”:
Predefinito
divisore (derivato da “Predefinito”)
non divisore (derivato da “divisore”)
titolo (derivato da “non divisore”)
Il font usato negli esempi è “Stencil” con grandezza 20. Il formato “titolo” serve più che altro per le
intestazioni; non è molto importante per gli stili, ma solo come “stile derivato”.
LE CELLE
Il campo di gioco (NON il foglio) va sottoposto a formattazione condizionale. Come nell’esercizio
precedente, le celle interessate potrebbero essere diverse. In questo esempio, la cella i1 contiene il divisore,
la zona sottoposta a formattazione condizionale termina nella cella j12. Le formule seguono queste
indirizzi, quindi va osservato che:
$i$1 necessita dei segni $ perché il dividendo è unico, e la sua cella deve essere fissa
j12 corrisponde alla cella rimasta evidenziata dalla selezione (solitamente quella in basso a destra).
ALTRI CALCOLI
Se vogliamo contare quanti sono i divisori occorre predisporre
una zona analoga a quella dei numeri, contenente i resti delle
divisioni del dividendo per essi. Per quella zona potrà essere
attivato un conta.se, per contare quanti sono i valori zero.
Sempre con il valore 70, in questo esempio i resti sono stati
sottoposti ad una formattazione condizionale inversa rispetto ai
divisori.
Per la zona dei resti basta UNA cella, le altre sono copie:
3 - TIC-TAC-TOE IL GIOCO
Questo gioco è noto con diversi nomi:
tic-tac-toe Stati Uniti d’America
noughts and crosses Inghilterra
X’s and O’s Irlanda
tres en linea Spagna
ristinolla Finlandia
amőba Ungheria
tris Italia
hiruko artzain-joko Paesi Baschi
Come sicuramente ben noto, i giocatori si alternano nell’occupare le caselle di una griglia 3x3 con i rispettivi
simboli (X e O), e vince chi riesce ad allineare tre simboli, orizzontalmente, verticalmente o diagonalmente.
Se giocato bene, finisce sempre in parità: per questo motivo è considerato un gioco per bambini.
Questa esercitazione non fa queste considerazioni, né si propone di costruire un programma di gioco.
Il suo obiettivo è di fare un po’ di pratica con i nomi di zona, la formattazione condizionale e le
operazioni di conteggio in un foglio elettronico.
IL FOGLIO DI CALCOLO
Per realizzare il nostro gioco, possiamo organizzare il foglio di calcolo in questo modo:
Una zona 3x3 (a1:c3) costituisce il campo di gioco. Verranno usati alcuni accorgimenti di stile per
evidenziare la partita in corso. Per ogni giocatore ci sono 8 zone di calcolo, che consentono di stabilire il
risultato della partita. Sono 8 perché corrispondono agli 8 modi con i quali può essere vinta la partita (3
righe, 3 colonne, 2 diagonali). Altre due celle sono usate per i messaggi di partita terminata (“vince X”
oppure “vince O”).
Attenzione !!! Come nelle altre esercitazioni, le celle indicate sono relative agli esempi visualizzati. Se le zono scelte non
fossero le stesse, gli indirizzi andrebbero modificati di conseguenza.
LE ZONE
Per facilitare il riconoscimento delle celle, si possono definire 6 zone corrispondenti a righe e colonne del
campo di gioco. Altre due zone sono quelle per i calcoli. Per quanto riguarda le diagonali, non è possibile
costruire zone che non siano rettangolari: quindi le celle di calcolo corrispondenti dovranno sommare i
risultati delle 3 celle interessate con una formula.
Righe e colonne del campo di gioco sono larghe (o alte) 3 celle. Le zone che servono per l’esercitazione
sono 8 (alle quali vanno aggiunte le diagonali, che vanno calcolate a parte):
riga1, riga2, riga3 le righe del campo di gioco
col1, col2, col3 le colonne del campo di gioco
calcoliO, calcoliX servono a calcolare il numeri di simboli per ogni giocatore
Lo schema delle zone sarà il seguente:
GLI STILI
Prima di iniziare, scaricare il font Tycho (freeware) ed installarlo sul proprio computer. Il file va copiato
nella cartella c:\windows\fonts.
Passiamo poi a definire 3 stili, ciascuno derivato dal precedente. Solo il primo è derivato da “Predefinito”:
Predefinito
x (derivato da “Predefinito”)
o (derivato da “x”)
invisibile (derivato da “o”)
Come si può intuire, lo stile “x” e lo stile “o” servono a visualizzare i simboli dei giocatori; lo stile
“invisibile”, invece, serve a nascondere ogni altro simbolo inserito.
Il font consigliato è Tycho grassetto. con grandezza 20. Per predisporre lo stile “invisibile” occorre
assegnare lo stesso colore al carattere e allo sfondo (si consiglia un colore chiaro, ad esempio: GrigioBlu).
Ancora una volta, evitiamo di perdere tempo a definire i colori separatamente. Basterà definire uno
sfondo nello stile principale “x”: poi si potranno scegliere tre colori diversi per il carattere, accertandosi solo
che l’ultimo sia uguale allo sfondo, per ottenere l’effetto24
“invisibile”.
24 È un “effetto” perché in realtà, qualsiasi cosa contenga la cella, sembrerà vuota.
LE CELLE
Predisporre le celle del campo di gioco con larghezza e altezza 0.90 cm.
Questo vale per usare il font consigliato. Se si cambiano font o dimensioni, si dovranno sistemare i numeri
per ottenere un effetto gradevole.
Il campo di gioco (NON il foglio) è sottoposto a formattazione condizionale.
ATTENZIONE !!!
In questa esercitazione, le prime due condizioni sono legate a valori specifici del gioco (X e O); quindi nella
loro definizione dovremo usare la clausola “Il valore della cella è…”.
Come sempre, le celle indicate sono relative agli esempi visualizzati. Se le zono scelte non sono le stesse, gli
indirizzi andranno modificati di conseguenza. Lo stesso vale se la cella campione non è la C3.
ATTENZIONE !!!
I valori usati non sono numerici, quindi vanno indicati tra virgolette;
Lo stile “invisibile” nasconde qualsiasi cosa che non sia “X oppure O”;
La terza condizione è una formula (ha più possibilità di un “valore”);
La formula contiene un’espressione logica composta, visto che i valori da verificare sono due.
Ecco un possibile effetto della formattazione a partita in corso:
I CALCOLI
Ci sono 8 modi per vincere la partita, quindi 8 zone serviranno per verificare la presenza di 3 simboli uguali:
6 dovrebbero avere un nome (di riga o di colonna), altre 2 non si possono definire con un nome perché sono
rettangolari, ma i calcoli ci devono essere comunque.
Le zone di conteggio sono sempre doppie, visto che i giocatori sono 2.
In colonna G ci sono i calcoli per le X, in colonna H per le O. Lo schema dell’esempio è il seguente:
G5 X sulla riga 1 H5 O sulla riga 1
G6 X sulla riga 2 H6 O sulla riga 2
G7 X sulla riga 3 H7 O sulla riga 3
G8 X sulla colonna 1 H8 O sulla colonna 1
G9 X sulla colonna 2 H9 O sulla colonna 2
G10 X sulla colonna 3 H10 O sulla colonna 3
G11 X sulla diagonale principale H11 O sulla diagonale principale
G12 X sulla diagonale secondaria H12 O sulla diagonale secondaria
G13 Eventuale vittoria di X H13 Eventuale vittoria di O
Le zone corrispondenti alle righe e alle colonne dovrebbero avere già un nome, quindi i conteggi devono
fare riferimento ad esso.
Due esempi di calcoli (G5 e H10):
Le altre celle di calcolo possono essere preparate con formule simili, tranne nel caso delle diagonali, dove si
dovrà procedere elencando direttamente le celle.
Nella cella G12 si contano le X sulla diagonale secondaria (C1-B2-A3). Occorre fare tre conteggi diversi
e sommare i risultati. La formula sarà quindi:
Le altre celle per le diagonali avranno formule simili.
La vittoria di uno dei due giocatori si ha quando una delle zone di calcolo contiene tre X oppure tre O.
Normalmente solo una zona sarà vincente, ma esiste anche una remota possibilità di trovare una “doppia”
vittoria (ad esempio, una riga e una colonna che vengono completate contemporaneamente).
Per non avere troppi problemi, basterà una formula che dia la segnalazione quando almeno una zona risulta
vincente. La seguente formula serve per l’eventuale vittoria del giocatore O (quindi va in H13):
Attenzione !!! L’esercitazione si ferma qui. Ci sono molte cose che mancano per produrre un
programma di gioco funzionante. Ad esempio, non viene controllata la regolarità delle
mosse, che prevede l’inserimento dei simboli alternati: volendo, si possono inserire tre
X in fila e il foglio darà comunque X vincente, anche se la partita è irregolare.
Le celle devono contenere una sola “x” o una sola “o” (per
questo sono necessarie le regexp e ).
4 - Battaglia navale ATTENZIONE !!!
Come nell’esercitazione precedente, non si tratta di costruire un gioco completo. Non ci sono controlli sulla
regolarità della partita, dato che l’obiettivo è di fare pratica sulla formattazione condizionale. Un programma
di gioco è ben oltre gli obiettivi di questo corso.
IL FOGLIO DI CALCOLO
Possiamo organizzare due fogli di calcolo (attacco e difesa) in questo modo:
L’ipotesi è che si disponga di una flotta da 15 celle, che potrebbe essere così formata:
1 portaerei da 4 celle (4);
2 incrociatori da 3 celle (6)
2 caccia-torpediniere da 2 celle (4)
1 motoscafo da 1 (1).
Le zone A1:J10 potranno essere chiamate “mare” (servono due zone, una
per ciascun foglio: qui sono chiamate mare_attacco e mare_difesa).
Per l’attacco e la difesa servono 2 zone di calcolo, che consentono di stabilire il risultato della partita. Per
calcolare le informazioni note, tn attacco si contano le celle “colpite”, in difesa si contano le celle “a galla”.
Se le celle colpite sono 15, l’attacco vince
Se le celle “a galla” sono zero, la difesa perde
LE ZONE
Per facilitare il riconoscimento delle celle, si possono definire 4 zone corrispondenti alle zone di mare e a
quelle di calcolo.
Queste ultime (chiamate punti_attacco e punti_difesa) sono composte da una cella ciascuna, e devono
servire a contare, rispettivamente, quante celle della flotta nemica sono state colpite e quante celle della
propria flotta sono ancora a galla.
GLI STILI
Prima di iniziare, scaricare il font Tycho (freeware) ed installarlo sul proprio computer.
Passiamo poi a definire 4 stili, ciascuno derivato dal precedente (solo il primo è derivato da “Predefinito”):
nave (derivato da “Predefinito”)
colpito (derivato da “nave”)
mancato (derivato da “x”)
affondato (derivato da “o”)
Il font da usare è Tycho grassetto. con grandezza 20. Ogni stile potrà essere “invisibile”, con lo stesso
colore per il carattere e lo sfondo (quello che deve comparire è una cella colorata, non un carattere
particolare.
Con lo stile “nave” si può inserire la propria flotta, segnando le navi con delle “x”. Lo stile usato
nell’esempio è “grigio su grigio”. Per il “colpito” si può usare il “+”, per il “mancato” il “-“. Un altro stile
“affondato” dovrà essere di color diverso dal “colpito”, e si potrà usare, ad esempio, una lettera “a”.
Esempio:
Attacco Difesa
+ Colpito x Nave “a galla”
- Mancato + Colpito
a Affondato - Mancato
LE CELLE
Predisporre le celle dei due “mari” con larghezza 0.72 cm e altezza 0.81 cm.
Come sempre, questa è una scelta fatta in base al font scelto. In caso di situazioni
diverse, le dimensioni andranno adattate.
Il campo di gioco (NON il foglio) è sottoposto a formattazione condizionale.
FOGLIO MARE_ATTACCO
Il foglio di attacco non può visualizzare la flotta nemica, tranne per le navi colpite o affondate. Mantiene
comunque traccia dei colpi andati a vuoto, attraverso i colori.
La cella/zona punti_attacco visualizza il totale delle celle della flotta nemica colpite + quelle affondate.
Nell’esempio è L2.
FOGLIO MARE_DIFESA
In difesa sono visibili le celle per tutta la propria flotta (a galla e colpita):
La cella/zona punti_difesa visualizza il totale delle celle della propria flotta rimaste “a galla”.
Anche qui è L2.
I CALCOLI
Contenuto della cella/zona punti_attacco
Contenuto della cella per la vittoria
Contenuto della cella/zona punti_difesa
Contenuto della cella per la sconfitta
5 - CALENDARIO ATTENZIONE !!! Questa esercitazione è complessa (6 pagine), e perché serva a qualcosa,
si consiglia di:
procedere con calma;
non risolvere le cose con metodi infantili;
accertarsi di avere finito una fase prima di passare a quella successiva.
L’obiettivo finale è quello di ottenere un calendario annuale (come quelli da parete) con diversi effetti visivi,
come schematizzato sotto (un’intestazione con il nome del mese in alto, i giorni di ciascun mese incolonnati
con le domeniche in evidenza. L’anno deve comparire solamente in una cella. Tutto deve essere calcolato.
GLI STILI
Servono 3 stili, ciascuno derivato dal precedente. Solo il primo è derivato da “Predefinito”:
Predefinito
mese (derivato da “Predefinito”)
domenica (derivato da “mese”)
settimana (derivato da “domenica”)
Mese serve per l’intestazione del mese (Gennaio, Febbraio, …): nell’esempio è “bianco su arancio);
Domenica serve per le domeniche: nell’esempio è “rosso su bianco”;
Settimana serve per gli altri giorni della settimana; nell’esempio è “blu su giallo”.
Gli stili devono essere definiti per visualizzare delle date, quindi nel riquadro “Numeri” andrà
selezionato “Data”. Ci sarà anche bisogno di inserire formati particolari, in una zona del riquadro
che si trova in basso a sinistra, e che serve per i formati definiti dall’utente. Il particolare è
riportato nell’immagine a destra.
Il formato “mese” dovrà avere come codice del formato “MMMM AAAA”, gli altri due “GGGG G”. La
differenza sta nell’effetto provocato: MMMM AAAA indica “nome del mese + anno”, GGGG G indica “nome
del giorno + giorno. Se il secondo stile è derivato dal primo (o anche dal “Predefinito”, occorrerà modificare
solo questa parte del formato. Se il terzo stile è derivato dal secondo, NON CI SARÀ BISOGNO DI
MODIFICARE IL FORMATO DATA, SOLO I COLORI.
Particolare del formato
definito dall’utente
LO SCHEMA
L’intero calendario può essere calcolato a partire da 7 celle. In realtà le celle che vanno riempite direttamente
sono 4, le altre 3 potrebbero anche essere copiate:
A1 contiene l’anno (valore numerico), in modo che il calendario sia VARIABILE: l’obiettivo è fare in
modo che basti cambiare questa cella per ricalcolare immediatamente tutto il calendario dell’anno;
A2 contiene il primo dell’anno, senza indicare il valore dell’anno: viene preso dalla cella A1;
B2 contiene il primo del mese successivo di A2 (il primo Febbraio), attraverso;
A4 contiene il giorno SUCCESSIVO DI A3 (il secondo del mese, sempre di Gennaio).
A B
1 2012
2 =data($a$1;1;1) =data.mese(a2;1)
3 =data($a$1;1;1) =data.mese(b2;1)
4 =a3+1 =b3+1
Le altre celle dello schema (A3, B3, B4) si possono copiare da quelle esistenti:
la riga 3 dalla riga 2
la cella B4 da B3
In tutto lo schema c’è solo una cella con il valore dell’anno. Tutte le altre sono calcolate.
Il risultato sul foglio sarà il seguente:
È probabile che le celle nella colonna B siano visibili con valori non formattati (in pratica, le date dovrebbero
essere in un formato numerico interno usato dal programma), ma siamo ancora agli inizi dell’esercitazione:
siamo ancora in tempo a sistemare il foglio.
NON PERDERE TEMPO A CAMBIARE IL FORMATO CON
“FORMATO-CELLE”, altrimenti l’esercitazione, oltre a
diventare inutile, è destinata a non funzionare.
A questo punto potremo applicare gli stili definiti in precedenza.
GLI STILI
La cosa più semplice e immediata è sistemare le intestazioni dei mesi. Selezioniamo le celle A2 e B2. Dalla
finestra “Stili e formattazione” (F11), dopo aver scelto lo stile “mese”, facciamo click sul pulsante del
“modo riempimento”, poi click sulla selezione celle con il cursore trasformato in barattolo di vernice.
Il formato MMMM AAAA visualizza la data con il nome del mese seguito dall’anno con 4 cifre, come in
“Gennaio 2012” (nell’esempio è bianco su arancio):
Ora passiamo alle quattro date che fanno parte dell’elenco dei giorni. Selezioniamo le quattro celle
A3:B4, poi . “Formato-Formattazione condizionale”
Nelle formule si indica la cella B4 perché è quella dove termina la selezione. Va applicato lo stile
“domenica” alle domeniche, lo stile “settimana” agli altri giorni: basta controllare il valore della funzione
giorno.settimana e sistemare la formula di conseguenza (domenica=1; altri giorni: da 2 a 7).
Le celle prima e dopo l’applicazione della formattazione condizionale
COMPLETAMENTO
A questo punto lo schema del calendario è quasi completo. Possiamo provare a selezionare la riga 4 e a
copiarla fino alla riga 33, avremo quasi finito.
Manca solo un dettaglio: togliere i giorni finali di Febbraio, che, come si può notare, sono in realtà i
primi giorni di marzo. Lo stesso vale per i mesi di 30 giorni.
Quello che dobbiamo fare è inserire una formula che provveda automaticamente alla cancellazione. Se
dobbiamo usare il foglio elettronico per modificare manualmente i dati, allora tanto vale usare carta e
penna.
Inseriamo nella cella A4 la seguente formula:
=SE(E(A3<>"";MESE(A3+1)=MESE(A$2));A3+1;"").
Notiamo un riferimento fisso alla riga 2, che contiene il primo giorno del mese. Il significato della
formula è di controllare se il contenuto della cella corrisponde al mese del giorno 1. Se appartiene ad un
mese successivo, la formula risulterà falsa e la cella conterrà il valore vuoto.
Se le cose sono state fatte per bene, i giorni in più risultano vuoti. Rimane lo sfondo, ma anche questo si
può cancellare con una formula.
ATTENZIONE !!!
La formula finale riguarda il contenuto, quindi è stata inserita direttamente nelle celle;
La formula per lo sfondo riguarda la stile, quindi va inserita attraverso la formattazione condizionale.
IL TOCCO FINALE
Modifichiamo la formattazione condizionale tra A3 e B33, per togliere lo sfondo dalle celle vuote:
E(B33<>"";GIORNO.SETTIMANA(B33;1)=1)
E(B33<>"";GIORNO.SETTIMANA(B33;1)>1) (vedi immagine)
Con queste formule, le celle indesiderate appaiono completamente vuote:
Ora si può copiare febbraio negli altri 10 mesi, e il calendario è finito:
Mitchel Resnick, coordinatore
del progetto Scratch Paolo Santi, ideatore
di AlgoBuild
Formattazione condizionale Appendice
Cos’è un algoritmo
Un algoritmo è una sequenza di operazioni che servono per effettuare uno specifico compito.
Il nome algoritmo deriva da Abu Abdallah Muhammad ibn ben-Musa al-Khwarizmi, uno dei pionieri della
matematica, scienziato vissuto nell’Impero persiano nel IX secolo. Khwarizm (latinizzato in Chorasmia) è il
nome della sua regione di nascita, attualmente divisa tra Turkmenistan e Uzbekistan.
Durante il corso abbiamo incontrato algoritmi, senza usare questo nome:
Problema Descrizione procedimento Esempio
Trasformazione di numero
da base 10 a base 2.
Dividere il numero per 2, tenendo la
parte intera e trascrivendo il resto.
Dividere il quoziente per 2, tenendo la
parte intera e trascrivendo il resto.
Proseguire fino ad ottenere 0.
La sequenza dei resti, rovesciata, è il
numero cercato.
Numero = 25
25 / 2 = 12 r 1 12 / 2 = 6 r 0 6 / 2 = 3 r 0 3 / 2 = 1 r 1 1 / 2 = 0 r 1
2510 = 110012
Trovare l’opposto di un
numero binario in notazione
complementare.
Trasformare ogni 1 in 0, ogni 0 in 1.
Aggiungere 1 al risultato parziale.
Numero = 10100111
10100111 01011000 1 01011001
Anche le formule del foglio elettronico sono procedimenti per risolvere determinati problemi, con la
differenza che si tratta di formule valide per una sola cella. Procedimenti complessi possono essere descritti
con più celle, contenenti formule simili o comunque relative al problema da risolvere, come nel caso del
calendario, dove una zona comprende più date dello stesso periodo:
In Informatica, un algoritmo viene solitamente tradotto in un linguaggio di programmazione per costruire un
programma (ora spesso chiamato applicazione) in grado di risolvere specifici problemi. Questo capitolo non
si occupa di scrivere programmi, ma di descrivere come si ragiona per farlo. La programmazione sarà
oggetto di corsi successivi.
Cos’è Scratch
Il software per installare Scratch è reperibile al seguente indirizzo:
http://scratch.mit.edu/scratch2download/
che può essere trovato anche inserendo "download scratch 2" in un qualsiasi motore di ricerca. Può
essere eseguito direttamente, oppure scaricato su disco per una successiva installazione.
In realtà, verranno installati due programmi:
Adobe AIR (Adobe Integrated Runtime)
Scratch
Una volta avviato, il programma Scratch si presenta con il seguente schermo (la freccia indica il pulsante per
il cambio della lingua25
):
25 Questo pulsante ogni tanto è necessario: un problema di Scratch 2 è che tende a perdere l’impostazione della lingua.
Il software “Scratch” nasce da un progetto del Lifelong Kindergarten Group del MIT, con l’obiettivo di
insegnare a programmare in maniera semplice ed interattiva. Sebbene progettato per la fascia di età tra 8
e 16 anni, è usato da milioni di persone, che creano progetti con Scratch a casa, a scuola ma anche in
musei, biblioteche e centri ricreativi. Con Scratch è possibile programmare storie interattive, giochi ed
animazioni; oltre a questo, nella comunità online i progetti possono essere condivisi. Il tutto è reso
disponibile gratuitamente.
Scratch è stato progettato per aiutare a raggiungere, tra le altre, queste capacità:
pensare in modo creativo
ragionare in maniera sistematica
collaborare
Definite “capacità essenziali nel XXI secolo”, sono le principali caratteristiche richieste ai programmatori
per svolgere al meglio il proprio lavoro.
testo tratto da: http://scratch.mit.edu/about
ATTENZIONE: Non installare la versione 1.4
Icona di Scratch
Lo schermo di Scratch è diviso in quattro zone:
Stage (il palcoscenico dove avviene l’animazione/storia)
Elenco elementi (sfondi e personaggi protagonisti)
Elenco comandi (il comportamento degli elementi)
Script (sequenze di comandi per ciascun personaggio presente sullo stage)
I personaggi sono chiamati anche sprite, un termine in uso già negli anni ’70 per descrivere singole immagini
o animazioni. Gli script Scratch sono dei veri e propri programmi.
Appena attivato Scratch, compare uno stage bianco con un personaggio solo, il gatto scelto come simbolo del
programma:
I comandi sono suddivisi per categorie:
Movimento, Aspetto, Suono, Penna, Sensori Animazione e svolgimento storia
Situazioni, Controllo Gestione del programma in base alle situazioni
Variabili e Liste, Operatori Gestione dati
Altri Blocchi Costruzione di nuovi blocchi composti
Le prime due categorie di comandi, che consentono l’interazione con il programma, sono solitamente di
facile comprensione, soprattutto per chi ha già usato videogiochi.
Variabili, Liste, Operatori sono invece molto vicini ai linguaggi di programmazione, ed occuperanno la parte
principale della trattazione.
La sezione “Altri Blocchi” consente di creare blocchi di comandi composti da comandi elementari.
Far eseguire un comando ad un personaggio è immediato: per esempio, nel gruppo di comandi “Suono” un
click il primo blocco fa miagolare il gatto (è possibile associare anche altri suoni ad ogni personaggio):
Preparazione di uno script
Per costruire un nuovo progetto si può eliminare il gatto (con click destro seguito da cancella) e scegliere un
nuovo personaggio con uno dei modi proposti nell’elenco “Nuovo sprite”. È possibile disegnare il proprio
personaggio, ma la scelta consigliata è quella di sceglierne uno nell’abbondante libreria del programma. In
alternativa, si può usare una qualsiasi immagine presente sul disco, oppure generare la sprite a partire dalla
propria webcam.
La libreria offre numerosi personaggi, selezionabili per categoria, tema e tipo. Ad esempio, il tema Castello
presenta vari personaggi da favola (draghi, fantasmi, cavalieri, maghi):
Ogni personaggio può avere il proprio script. Per prepararlo, occorre prima selezionare la sprite nell’elenco,
in modo che diventi il destinatario dello script.
Poi, trascinando nell’area “script” i blocchi desiderati, si possono programmare le azioni del personaggio. Un
breve esempio è il seguente, con blocchi presi da Situazioni, Controllo e Movimento. I blocchi vengono
combinati facendo coincidere sporgenze e rientranze. Come si può notare, alcuni blocchi possono essere solo
all’inizio o solo alla fine dello script, mancando delle tacche in alto o in basso:
Questo script viene attivato quando si effettua un click sulla bandierina verde sul margine alto dello stage. Il
nostro personaggio è destinato a ruotare per sempre, o almeno fino a quando non si termina lo script con un
click sul segnale ottagonale di stop, vicino alla bandierina verde.
Le variabili
Uno dei concetti fondamentali della programmazione è quello di “variabile”. Una variabile è un dato che ha
un nome e un valore. È attraverso i valori delle variabili che i programmi risolvono i problemi di calcolo.
Al contrario del foglio di calcolo, dove le variabili sono le celle della griglia, nei programmi le variabili
devono essere dichiarate. Inoltre il loro valore non viene modificato con la scrittura diretta, ma attraverso
altre operazioni (dette normalmente di assegnazione).
Dichiarazione di una variabile
Per aggiungere una variabile al progetto, premere “Nuova variabile” nel gruppo
“Variabili e Liste” (arancione). Compare un riquadro con uno spazio per il nome della
variabile e i pulsanti per la conferma e la rinuncia. Si può lasciare selezionata l’opzione
“Per tutti gli sprite”, che rende disponibile la variabile per tutti i personaggi (in questo
caso viene definita pubblica). L’elenco delle variabili compare nello spazio centrale del
programma: il segno di spunta indica se la variabile compare sullo stage.
Valore
Come si può intuire dal nome, il valore di una variabile può cambiare (altrimenti non avrebbe quel nome).
Ci sono più modi di modificare una variabile:
blocco “porta” (assegnazione)
blocco “cambia” (modifica: il valore PRECEDENTE della variabile più qualcosa)
blocco “porta” proveniente da una risposta
Il blocco “porta” prende un valore costante, un’altra variabile o un’espressione, e ne assegna il valore (o il
risultato) alla variabile selezionata.
Il blocco “cambia” conserva la memoria del precedente valore della variabile, aggiungendo (o togliendo)
qualcosa.
In entrambi questi casi la variabile da modificare può essere selezionata dal relativo elenco (attivabile con la
freccetta nera visibile nel blocco). Il valore da assegnare può essere scritto direttamente nello spazio bianco;
se si tratta di un’altra variabile o di un’espressione, il nuovo dato va invece trascinato in quello spazio.
dichiarazione elenco
blocco "porta"
Elenco valori sullo stage
blocco "cambia"
Interazione
Ora vediamo come chiedere il valore di una variabile, con una sequenza di blocchi chiedi-porta. Le
operazioni sono, nell’ordine:
Richiesta: lo script si blocca, in attesa che l’utente scriva qualcosa nell’apposito spazio;
Assegnazione: il contenuto della risposta viene trasferito in una variabile.
1 Richiesta
Il blocco è nel gruppo “Sensori” (azzurro). Il testo viene proposto dal personaggio con un fumetto; la risposta
viene inserita nel riquadro che compare sotto lo stage:
2 Assegnazione
La risposta ha una sua icona azzurra (arrotondata, come le variabili). Per assegnarla ad una variabile, si
inserisce questa icona in un blocco “porta”:
In realtà, quando si ha a che fare con un problema matematico, la maggior parte delle variabili deve
contenere valori numerici (non possiamo immaginare cosa risulta da scarpa/2, e non è di certo sca). Per
evitare di operare su valori insensati, esiste un trucchetto aritmetico, che consiste nel moltiplicare per 1 la
risposta, rimediando così ad errori di inserimento, secondo questa logica:
se il numero è scritto correttamente, non viene modificato
in caso contrario, la moltiplicazione risulta zero, che almeno è un valore numerico.
Assegneremo quindi alla variabile “risposta*1”. Per fare questo, prendiamo il blocco di moltiplicazione
dagli operatori (sezione verde), inseriamo la “risposta” in uno degli spazi e scriviamo 1 nell’altro:
Una volta assegnato il valore richiesto alla variabile, esso viene visualizzato nell’elenco (solitamente
presente sullo stage). È comunque preferibile fare in modo che il personaggio, una volta chiesto il numero, lo
visualizzi attraverso un fumetto (secondo script). L’effetto è nell’immagine a destra:
script Input OK (5 e 6) Input errato (5 e 0)
Elaborazione
Il tipico programma di gestione attraversa tre fasi in sequenza: leggi-elabora-scrivi. Al contrario di un foglio
di calcolo, dove alcune celle possono contenere formule che vengono calcolate simultaneamente, in un
normale programma occorre dare le istruzioni esplicitamente e in sequenza.
Le fasi sono così riassumibili:
1. Il personaggio chiede un numero (o due, o tre, …) 2. Lo script del personaggio esegue delle operazioni di calcolo 3. Il personaggio “pronuncia” la risposta
Ogni script deve quindi riprodurre queste fasi, rispettando la sequenza:
1. Blocchi per l’input 2. Blocchi per l’elaborazione 3. Blocchi per l’output
Esempio 1: calcolo di una radice quadrata
Nell’immagine sono evidenziate le tre fasi dello script (l’input, come visto, occupa due blocchi).
L’operazione di radice quadrata è nel gruppo “Operatori”, e si chiama sqrt (square root). Una volta inserito
il valore della variabile x, si assegna a z la sua radice. In caso di calcolo impossibile (quando il numero
scritto è negativo), il risultato assume il valore particolare NaN (sigla per: Not a Number).
Esempio 2: calcolo di un quoziente
In questo caso occorrono due variabili (quindi due input). Come nel caso precedente, anche la divisione non
è sempre possibile. Quando il divisore è zero, il risultato è Infinity (infinito). Matematicamente questa
assunzione è falsa come Giuda, e viene giustificata con il fatto che un divisore piccolo provoca un risultato
grande (ciò non cancella che la divisione per zero non è definita in aritmetica).
Come visto nel capitolo riguardante il foglio elettronico, per risolvere queste situazioni occorre una struttura
decisionale, che possa scegliere differenti azioni in base a determinate condizioni (ad esempio, l’essere non
negativo per l’estrazione di radice, o l’essere il divisore non nullo per la divisione). Il nome struttura riflette
il fatto che si tratta di più blocchi organizzati.
Prima, però, vediamo un altro modo di rappresentare i procedimenti di calcolo.
script Input OK (9) Input errato (-9)
Diagrammi di flusso
Tra gli aspetti positivi, il programma Scratch offre immediatezza e semplicità; è invece un po’ problematico
nella scrittura manuale su carta. Per schematizzare un procedimento di calcolo può essere utile usare un
metodo storico, quello dei “diagrammi di flusso”, che descrive la sequenza delle operazioni con blocchi di
varie forme, collegati da frecce. Se questo metodo è decisamente antiquato per quanto riguarda progetti
complessi, può ancora risultare utile con semplici problemi di elaborazione, essendo piuttosto intuitivo da
seguire.
Uno degli usi dei diagrammi di flusso è per dare un’idea di un ragionamento. In America, è molto popolare
una semplificazione dei lavori di riparazione in casa, che qualche buontempone ha trasformato in diagramma
di flusso:
Handyman flow chart Diagramma per il riparatore
You only need two tools Servono solo due attrezzi
It moves and shouldn’t? Use the hammer. Non si muove e dovrebbe? Usate il martello.
It doesn’t move and should? Use duct tape. Si muove e non dovrebbe? Usate il nastro.
Quando si descrive un procedimento di calcolo o di gestione, i diagrammi possono essere un po’ complessi:
Disegno ed esecuzione di diagrammi
Analogamente a quanto accade con Scratch, i blocchi di un diagramma descrivono diverse operazioni,
indicate da diverse forme geometriche; le forme più usate sono le seguenti:
La sequenza delle operazioni è identificata da frecce, che non possono presentare ambiguità. Ovviamente, il
blocco iniziale ha solo una freccia in uscita e quello finale solo una in entrata; ogni blocco intermedio ha una
freccia in entrata e una in uscita, tranne il blocco “decisionale” o “condizionale” che ha due possibili uscite:
Esistono molti programmi che permettono di disegnare diagrammi di flusso. In questo corso è stato scelto
AlgoBuild, un software poco appariscente ma che facilita la costruzione di diagrammi semplici e corretti,
avendo una rigida struttura di inserimento e collegamento dei blocchi.
Per i sistemi Windows è sufficiente copiare il programma algobuild.exe nella cartella dove si intendono
memorizzare i lavori; con altri sistemi c’è una procedura leggermente più complessa, che può essere
visualizzata in questa pagina (alla sezione “Avviare il programma”):
http://algobuild.com/docsonline/ab_075/manuale-it/manuale-it.html
Ogni diagramma di flusso necessita di un inizio e una fine; per questo motivo AlgoBuild propone
automaticamente un diagramma minimo con solo tali blocchi (Start/End):
Per aggiungere un blocco, si avvicina il cursore alla freccia che separa i blocchi esistenti, facendo comparire
un riquadro NEW, poi con un click si attiva la scelta del tipo di blocco o di struttura. Come blocchi singoli si
può scegliere tra Assegnamento, Input, Output; come strutture tra If, For, While (esiste un’altra struttura, ma
è sconsigliata in quanto rende più complessi i ragionamenti). Con questi strumenti è possibile costruire
qualsiasi algoritmo.
Come esperimento, si può scegliere un blocco “Output”, ed inserire come “Nuovo Output” un messaggio tra
apici (non tra virgolette), ad esempio, ‘ciao’.
L’algoritmo può essere eseguito tramite un click sulla freccia verde che si trova sopra l’area del diagramma.
Normalmente, per passare da un blocco al successivo la freccia va sempre attivata, a meno che non venga
deselezionata l’opzione “Passo passo”. Il risultato dell’operazione di output viene visualizzato nel riquadro
in basso a sinistra.
L’algoritmo può essere eseguito tramite un click sulla freccia verde che si trova sopra l’area del diagramma.
In questo modo si attiva un vero e proprio programma. Valgono le seguenti considerazioni, che possiamo
verificare direttamente, e sono evidenziate nell’immagine:
normalmente, per passare da un blocco al
successivo la “freccia verde” va ogni volta
attivata;
disattivando l’opzione “Passo passo”, il
programma avanza automaticamente;
il tempo di transizione da un blocco
all’altro, normalmente di 500 msec, può
essere modificato;
il risultato dell’operazione di output viene
visualizzato nel riquadro in basso a
sinistra.
L’uso delle variabili non è molto diverso che in Scratch (tutti gli ambienti di programmazione sono simili da
questo punto di vista), e non necessita di dichiarazioni. Vediamo due esempi, il primo con l’input, il secondo
con l’assegnamento diretto di un valore ad una variabile chiamata a. In entrambe le situazioni, il nome della
variabile va scritto da solo, senza apici:
Vediamo i due differenti diagrammi. Ovviamente, l’esecuzione del programma con l’input viene sospesa in
attesa del nostro inserimento del valore di a:, mentre l’altro programma procede senza interruzioni.
output *** PROGRAMMA main inizia. INPUT: a=51 var: | a=51.0 | OUTPUT a: 51.0 *** PROGRAMMA main termina.
output *** PROGRAMMA main inizia. ASSEGNA: a <- 48.0 var: | a=48.0 | OUTPUT a: 48.0 *** PROGRAMMA main termina.
Strutture di controllo
Il seguente esempio, che fa uso di tre variabili, mostra il differente comportamento del programma con o
senza l’opzione “Traccia”. Nel primo caso, ogni operazione viene visualizzata nel riquadro di output,
insieme all’elenco delle variabili ad ogni cambiamento; nel secondo caso, vengono visualizzati solo i risultati
delle operazioni di output.
output *** PROGRAMMA main inizia. ASSEGNA: a <- 48.0 var: | a=48.0 | ASSEGNA: b <- 29.0 var: | a=48.0 | b=29.0 | ASSEGNA: c <- 77.0 var: | a=48.0 | b=29.0 | c=77.0 | OUTPUT c: 77.0 *** PROGRAMMA main termina.
output *** PROGRAMMA main inizia. 77.0 *** PROGRAMMA main termina.
In Scratch ci eravamo interrotti Per vedere come funzionano i blocchi decisionali (e i relativi connettori),
ripeteremo gli esempi precedenti, mostrando come evitare le operazioni non definite (quelle
matematicamente impossibili). Faremo in modo che il diagramma/programma prenda una decisione,
scegliendo una tra due elaborazioni, per poi proseguire con altre operazioni.
Questa “decisione” è analoga alla funzione =SE(...) del foglio elettronico: anche qui la scelta avviene
controllando se una data condizione è vera o falsa. Il blocco decisionale è fatto in modo che le due diverse
sequenze escano dagli angoli laterali (T=true/vero; F=false/falso). I seguenti diagrammi traducono
gli esempi visti precedentemente in Scratch, tenendo conto anche di quando la soluzione non esiste. La
decisione è un confronto tra dati, che a volte (come nel primo esempio) si scrive in forma di domanda; il
segno per “diverso” (nel secondo esempio y deve essere diverso da 0) è!= .
Nella programmazione non sempre occorre indicare due soluzioni distinte. Esiste anche
una struttura senza il “caso contrario”, dove basta lasciare vuota una delle due
alternative, come si può vedere nell’immagine a fianco.
Alcuni (come anche i programmatori di Scratch) identificano le due strutture come “se-
allora-altrimenti” e “se-allora”.
In Scratch i blocchi decisionali sono orientati diversamente (le soluzioni sono in
verticale, non affiancate), comunque le differenti soluzioni sono ben distinte, che siano
una o due (se…allora, oppure se…allora…altrimenti). Si può notare il posto
vuoto per il blocco angolato, analogo a quello dei diagrammi, dove può essere inserito
un confronto, preso dalla sezione “operatori”.
Scratch non ha un blocco per “diverso”. In questo caso occorre combinare un blocco
“non” con un blocco “uguale”. Anche per “maggiore o uguale” occorre combinare le
due condizioni singole con un blocco “o”.
Quindi, x!=0 si indica con non(x=0), e x>=0 si indica con (x>=0) o (x=0):
A questo punto, riproponiamo gli stessi esempi con Scratch.
Esempio 1 – Radice quadrata
La scelta del programma è determinata dal valore della variabile x:
se negativo, la soluzione è impossibile;
in caso contrario, è possibile applicare l’operatore sqrt senza
errori.
È possibile mettere un blocco “dire” in ciascuna delle due
alternative, ma risulta più semplice modificare il valore della
variabile z che viene visualizzata.
Al posto di un blocco “dire” a tempo, è possibile inserire un blocco
di attesa, che sospende l’esecuzione dello script fino al verificarsi
di una determinata condizione. Spesso si usa come condizione la
pressione di un tasto: in questo caso il tasto più “semplice” a
disposizione è lo spazio.
Il blocco di attesa non dovrebbe essere particolarmente difficile da decifrare.
Esempio 2 – quoziente
La soluzione è analoga alla precedente, con la scelta determinata
dal valore della variabile y:
se nullo, la soluzione è impossibile;
in caso contrario, è possibile applicare la divisione senza errori.
Rispetto all’esempio precedente è stata leggermente modificato
l’output del risultato da parte del personaggio, accompagnando il
messaggio “Soluzione :” al valore della variabile y, tramite il
blocco operativo “unione”. In questo modo il messaggio risolutivo
è più comprensibile:
Anche in questo esempio è presente l’attesa dell’evento “tasto
spazio premuto” per sospendere e riprendere l’esecuzione dello
script dopo la visualizzazione del risultato.
Attenzione !!!
Il blocco di attesa non serve a “terminare lo script”. Serve a “sospendere l’esecuzione”. Se lo script termina è
solo perché il blocco successivo è “arresta tutto”.
Differenze tra diagrammi di flusso e script Scratch
Come in tutte le imprese tecnologiche, anche la programmazione necessita di standard. Procedere in modo
coerente riduce le possibilità di errore e le perdite di tempo.
Struttura di uno script
I progetti Scratch più semplici possono essere costruiti con lo script di un solo personaggio. Per avere un
inizio e una fine, una soluzione è quella di iniziare con una “bandiera verde” e terminare con un “arresta
tutto” preceduto da un blocco di attesa. In questo modo si possono controllare i risultati dello script senza
problemi di timer: per sbloccare lo script e portarlo al termine, si preme “spazio” o si fa click con il mouse.
Input
Uno script semplice inizia con l’input di una o due variabili. Per non lavorare troppo di fantasia, può essere
di aiuto predisporre un progetto vuoto con alcune variabili già pronte: a, b, c, x, y, z. Quante di queste
andranno usate dipenderà dal problema proposto. Il progetto finito potrà essere salvato con altro nome.
Output
Un modo per visualizzare i risultati è usare i fumetti di un personaggio (“dire” o “pensa”). Per combinare
frasi fisse (stringhe costanti) con risultati variabili si deve usare un blocco unione:
Differenze tra diagramma di flusso e progetto Scratch
DIAGRAMMA DI FLUSSO SCRATCH
Un blocco “input” è sufficiente
Al blocco “chiedi” va aggiunto un blocco “porta” per
memorizzare la risposta in una variabile, assegnando
zero in caso di numeri mal scritti
L’assegnazione di una variabile va fatta con una
formula algebrica; il nome della variabile deve essere
scritto a sinistra di un simbolo di assegnazione “=”
L’assegnazione di una variabile va fatta attraverso un
blocco “porta”: la variabile si trova comunque nella
parte sinistra del blocco
Per modificare il valore già esistente di una variabile
occorre una formula con la stessa variabile dalle due
parti del segno “=”: a = a + 1
La modifica di una variabile può essere fatta anche
attraverso un blocco “cambia”. Sono equivalenti:
porta x a x+1 cambia x di 1
Un blocco “output” è sufficiente
Un blocco “dire” andrebbe sempre completato con
(almeno) una scritta e un risultato: in caso contrario si
avrebbe un messaggio poco leggibile
Condizioni composte: and (&&) or (||) not (!)
a==0 && b==0 a==0 || a==b !( a==b )
Blocchi condizionali composti: e o non
Il resto della divisione
Come già visto in altre situazioni, in molti problemi si farà uso di RESTI DI DIVISIONE:
resto per 2 per determinare se il valore di una variabile è pari
resto per 10 per calcolare la cifra delle unità
parte intera divisione per 10 per calcolare la cifra delle decine
resto tra due variabili per determinare multipli e sottomultipli
Il controllo di un resto va fatto con un blocco angolato di confronto.
Il resto (o modulo) è un’operazione frequente con i numeri interi. La differenza tra il diagramma e Scratch è
nel come viene rappresentata:
b % 2
Resto nei blocchi condizionali
Spesso un resto viene controllato in una condizione (blocco angolato). Ad esempio, per controllare se la
variabile “b” è una “decina” (multiplo di 10):
Il doppio segno di uguale è una caratteristica di alcuni linguaggi di programmazione.
Resto nei calcoli
Qualche volta non c’è il blocco angolato: questo avviene quando si sta eseguendo un calcolo. Ad esempio,
per calcolare la cifra delle unità di una variabile:
Per le decine si usa la “parte intera”, che AlgoBuild chiama “floor” e Scratch chiama “intero inferiore”:
Multipli e sottomultipli
Un resto tra due variabili può essere utile quando si cercano dei divisori. La domanda “z è divisore di b?”
diventa:
Problemi non risolti
1. Chiedere un numero. Rispondere se è pari o dispari.
2. Chiedere due numeri a e b. Rispondere se b é divisore di a.
3. (vedi immagini) Chiedere due numeri a e b. Rispondere se:
Uno dei due è zero;
a é divisore di b;
b é divisore di a;
nessuna delle precedenti.
4. Chiedere un numero; controllare se di tratta di un numero pari o dispari: nel primo caso lo aumenta di 1,
nel secondo lo diminuisce di 1.
Applicazioni
Dato un numero a (input).
SE non ha esattamente due cifre, non si va avanti e si manda un messaggio di errore.
ALTRIMENTI procedere in sequenza con le seguenti operazioni:
1) calcolare il quadrato b;
2) “dividerlo” in due parti x e y, di 2 cifre ciascuna (attenzione: non sono due metà);
3) se a è uguale a x+y (come con a=45, o con a=55) allora si dice che a è un numero di Kaprekar.
Quindi la risposta finale del personaggio (a parte il caso precedente) è un sì o un no
ESEMPI 45 (a) al quadrato fa 2025 (b) va diviso in 2 parti: 20 (x) e 25 (y) anziché usare la divisione per 10, si usa la divisione per 100.
20 + 25 == 45 La proprietà è verificata
14 (a) al quadrato fa 0196 (b) va diviso in 2 parti: 01 (x) e 96 (y) non importa se 1 ha una 1 cifra
01 + 96 != 14 La proprietà NON è verificata
Le due versioni:
Problema 1
QUANTE CIFRE HA UN NUMERO (fino a 3)?
Ci sono alcuni “se” perché il programma deve
scegliere quale risposta dare.
Per facilitare le risposte, eliminando il caso in cui il
numero è negativo, possiamo usare il valore assoluto
(negli operatori è indicato con abs).
Problema 2
QUAL E’ LA DECINA SUCCESSIVA?
N.B.: con “decina” si intende un multiplo di 10
esempi:
con 10 o 13 la risposta è 20
con 49 la risposta è 50
Possiamo chiamare la variabile risultato d
Non ci sono “se” perché i calcoli sono in sequenza e
sono gli stessi per qualsiasi numero.
La soluzione è solo un elenco di blocchi “porta”.
N.B.: questo diagramma è incompleto.
Problema supplementare
Chiedere un numero all’utente, poi controllare se è positivo o negativo. Se positivo aumentarne il valore di 1,
se negativo diminuirlo di 1. Visualizzare il risultato ottenuto.
La tabella segue i movimenti delle variabili nel tempo:
i c b OUTPUT
10 3 54 54
36 36
N.B.: la sequenza di output è formata dai soli valori che
vengono visualizzati (associati alle variabili, ma non sempre
uguali ad esse), e risulta:
54 36
Go with the flow - Trace
Le istruzioni di un diagramma di flusso possono essere seguite con carta e penna, operazione chiamata
“trace” nella letteratura. Non si tratta di un esercizio sterile: nei casi più complessi, saper interpretare un
diagramma può permettere di analizzare i procedimenti e migliorarli.
In pratica, quello che va fatto è seguire il flusso delle operazioni, tenendo una traccia scritta (trace) dei valori
delle variabili, annotando le loro variazioni nel tempo, ed eseguendo le operazioni di output (di solito in una
sequenza separata). Occorre quindi calcolare e scrivere quello che farebbe un programma in ciascun
momento del suo flusso temporale.
Il caso più semplice è un diagramma puramente sequenziale, composto da soli assegnamenti:
Il programma AlgoBuild permette di seguire il flusso del diagramma, con o senza trace, e comunque con la
sequenza di output:
Con TRACE Senza TRACE (solo OUTPUT)
*** PROGRAMMA main inizia. ASSEGNA: i <- 10.0 var: | i=10.0 | ASSEGNA: c <- 3.0 var: | c=3.0 | i=10.0 | ASSEGNA: b <- 54.0 var: | b=54.0 | c=3.0 | i=10.0 | OUTPUT b: 54.0 ASSEGNA: b <- 36.0 var: | b=36.0 | c=3.0 | i=10.0 | OUTPUT b: 36.0 *** PROGRAMMA main termina.
*** PROGRAMMA main inizia. 54.0 36.0 *** PROGRAMMA main termina.
Sviluppo passo-passo
1 il valore della variabile i è 10
2 il valore della variabile c è 3
3 il valore di b è 54, ottenuto con 9 * 6.
4 l’output è 54, corrispondente a b
5 il valore di b diventa 36
6 l’output è 32, corrispondente a b-4
a b x y OUTPUT
45 2025 20 25 Kaprekar
a b x y OUTPUT
46 2116 21 16 Non Kaprekar
a b x y OUTPUT
121 Impossibile
Una struttura condizionale presenta il problema della scelta
dell’azione da intraprendere, identificata da una delle frecce
che escono dal blocco romboidale.
Riprendendo un esercizio precedente (relativo ai numeri di
Kaprekar), osserviamo le differenti scelte del programma in
casi diversi.
Vediamo i possibili contenuti della tabella e i diversi
comportamenti del diagramma:
Nella descrizione delle azioni di AlgoBuild sono state aggiunte le direzioni prese per ogni condizione
incontrata:
Con TRACE Senza TRACE (solo OUTPUT)
*** PROGRAMMA kaprekar inizia. INPUT: a=45 var: | a=45.0 | IF a<10 || a>99 valutata FALSE ( ) SINISTRA ASSEGNA: b <- 2025.0 var: | a=45.0 | b=2025.0 | ASSEGNA: x <- 20.0 var: | a=45.0 | b=2025.0 | x=20.0 | ASSEGNA: y <- 25.0 var: | a=45.0 | b=2025.0 | x=20.0 | y=25.0 | IF a == x+y valutata TRUE ( ) DESTRAOUTPUT b: Kaprekar *** PROGRAMMA kaprekar termina.
*** PROGRAMMA main inizia. 45 Kaprekar *** PROGRAMMA main termina.
*** PROGRAMMA kaprekar inizia. INPUT: a=46 var: | a=46.0 | IF a<10 || a>99 valutata FALSE ( ) SINISTRA ASSEGNA: b <- 2116.0 var: | a=46.0 | b=2116.0 | ASSEGNA: x <- 21.0 var: | a=46.0 | b=2116.0 | x=21.0 | ASSEGNA: y <- 16.0 var: | a=46.0 | b=2116.0 | x=21.0 | y=16.0 | IF a == x+y valutata FALSE ( ) SINISTRAOUTPUT b: non Kaprekar *** PROGRAMMA kaprekar termina.
*** PROGRAMMA main inizia. 46 non Kaprekar *** PROGRAMMA main termina.
*** PROGRAMMA kaprekar inizia. INPUT: a=121 var: | a=121.0 | IF a<10 || a>99 valutata TRUE ( ) DESTRAOUTPUT: Impossibile *** PROGRAMMA kaprekar termina.
*** PROGRAMMA main inizia. 121 Impossibile *** PROGRAMMA main termina.
La tabella riporta anche le decisioni prese nel blocco
centrale della sequenza:
i b DIREZIONE OUTPUT
0 0 destra 1
1 3 destra 4
2 6 destra 7
3 9 destra 10
4 12 destra 13
5 in basso
Sequenza di output:
1 4 7 10 13
Più complesso ancora il caso di un ciclo, quando il diagramma ripete parti di sé stesso, sempre in base ad una
condizione (che in questo caso è destinata ad essere calcolata più volte):
Attenzione: con AlgoBuild la disposizione dei blocchi è leggermente diversa, come vedremo più avanti.
I risultati sono i seguenti:
Con TRACE Senza TRACE (solo OUTPUT)
*** PROGRAMMA main inizia. ASSEGNA: i <- 0.0 var: | i=0.0 | ASSEGNA: b <- 0.0 var: | b=0.0 | i=0.0 | OUTPUT b+1: 1.0 ASSEGNA: i <- 1.0 var: | b=0.0 | i=1.0 | ASSEGNA: b <- 3.0 var: | b=3.0 | i=1.0 | OUTPUT b+1: 4.0 ASSEGNA: i <- 2.0 var: | b=3.0 | i=2.0 | ASSEGNA: b <- 6.0 var: | b=6.0 | i=2.0 | OUTPUT b+1: 7.0 ASSEGNA: i <- 3.0 var: | b=6.0 | i=3.0 | ASSEGNA: b <- 9.0 var: | b=9.0 | i=3.0 | OUTPUT b+1: 10.0 ASSEGNA: i <- 4.0 var: | b=9.0 | i=4.0 | ASSEGNA: b <- 12.0 var: | b=12.0 | i=3.0 | OUTPUT b+1: 13.0 ASSEGNA: i <- 5.0 *** PROGRAMMA main termina.
*** PROGRAMMA main inizia. 1.0 4.0 7.0 10.0 13.3 *** PROGRAMMA main termina.
Il valore culminante per la struttura è il 5, che rende falsa la condizione e fa proseguire ai blocchi successivi.
Il seguente diagramma non si può disegnare con AlgoBuild, dal momento che presenta alcune complicazioni
che sono state inserite solo per fare un po’ di esercizio (in effetti, non è buona pratica far entrare più frecce
nello stesso blocco, come avviene in questo esempio). La soluzione è alla pagina successiva.
i DIREZIONE Scelta 1 a DIREZIONE Scelta 2 b
1 a destra 3 (output)
2 a destra 6 (output)
3 a destra 9 (output)
4 a destra 12 (output)
5 a destra 15 (output)
6 a destra 18 (output)
7 a destra 21 (output)
8 a destra 24 (output)
9 a destra 27 (output)
10 a destra 30 (output)
11 in basso 55 a destra (dispari)
54
55 165 (output)
56 in basso 280 in basso (pari) 165 (output)
FINE
Sequenza di output: 3 6 9 12 15 18 21 24 27 30 165 165
Cicli semplici: progressioni aritmetiche
In una progressione aritmetica, si produce una sequenza di numeri tale che la differenza tra ogni numero e il
successivo (detta ragione) ha lo stesso valore. Ad esempio, una delle sequenze più semplici è:
0 1 2 3 4 5 6 7 8 9
In questo caso la progressione è regolare, ed assomiglia al procedimento del conteggio.
In un diagramma AlgoBuild (ed anche nella maggior parte dei linguaggi di programmazione), la struttura
predisposta per produrre questo tipo di progressioni è chiamata for. La struttura necessita di una variabile
solitamente chiamata indice (perché con il suo valore indica a che punto siamo), che attraversa una
sequenza di valori. Per riprodurre l’esempio appena visto, i valori sono i numeri interi da 0 a 9 (per un totale
di 10 ripetizioni).
La struttura AlgoBuild ha il seguente aspetto:
In Scratch la struttura è leggermente diversa, e ci sono due possibilità:
Vediamo quindi le sequenze nei due programmi:
*** ... inizia. 0.0 1.0 2.0 3.0 ... 9.0 *** ... termina.
Scratch
AlgoBuild
L’obiettivo di questo esercizio preparatorio è di trovare le cifre di un numero (anche in questo caso, fino a
tre: unità, decine, centinaia). Consideriamo una variabile chiamata x, con un valore iniziale di 482.26
Una prima soluzione è il calcolo diretto di tre variabili:
u cifra delle unità di x 2
d cifra delle unità della parte intera della divisione di x per 10 48, poi 8
c parte intera della divisione di x per 100 4
Il calcolo delle decine non è complesso come può sembrare, essendo
una sequenza di due operazioni (una divisione intera, seguita da un
resto). In questi casi, occorre combinare più blocchi di calcolo,
trascinando il primo in uno degli spazi vuoti del secondo. Come con le
parentesi in algebra, è il blocco interno, non quello esterno, ad essere
eseguito per primo.
Una seconda soluzione estrae progressivamente le cifre della x, in questo modo:
Valore di partenza x è 482
Troviamo la cifra delle unità e la portiamo in una variabile (u) u diventa 2
Dividiamo x per 10 e teniamo la parte intera x diventa 48
Troviamo la cifra delle unità e la portiamo in una variabile (d) d diventa 8
Dividiamo x per 10 e teniamo la parte intera x diventa 4
Troviamo la cifra delle unità e la portiamo in una variabile (c) c diventa 4
Dividiamo x per 10 e teniamo la parte intera x diventa 0
L’ultima divisione non è strettamente necessaria: serve solo a mantenere la simmetria con le operazioni
precedenti, che sono sempre a coppie (un resto, una divisione). Più avanti vedremo come ripetere
automaticamente una sequenza di operazioni (che siano una, due, o un qualsiasi numero).
26 Un programma deve funzionare sempre nello stesso modo, indipendentemente dai valori. Con un numero diverso, i
calcoli danno risultati diversi, ma il metodo è sempre lo stesso.
u = x % 10
x = floor(x/10)
d = x % 10
x = floor(x/10)
c = x % 10
x = floor(x/10)
OUT c
OUT d
output u
Calcoli sintetici
*** PROGRAMMA inizia. INPUT: x=482 var: | x=482.0 | OUTPUT x: 482.0 ASSEGNA: x <- 48.0 var: | x=48.0 | OUTPUT x: 48.0 ASSEGNA: x <- 4.0 var: | x=4.0 | OUTPUT x: 4.0 ASSEGNA: x <- 0.0 var: | x=0.0 | *** PROGRAMMA termina.
L’estrazione delle cifre di un numero è stata eseguita limitatamente a tre cifre, perché il procedimento usato
era piuttosto elementare. Vediamo ora un metodo per demolire un numero qualunque, controllando non le
cifre in posizioni note, ma sfruttando il fatto che, dividendo in modo intero un numero, si elimina la cifra
delle unità: a forza di dividere, prima o poi troveremo zero.
Questo “prima o poi” è il fulcro del blocco “ripeti”, che continua ad eseguire una sequenza di blocchi fino al
momento in cui si verifica una determinata condizione. Ovviamente, occorre conoscere e definire quale sia
questa condizione. Con le divisioni intere non è un problema: continuando a dividere si ottiene zero.
In AlgoBuild e nei linguaggi di programmazione, questo tipo di sequenza non
aritmetica è chiamato while (immagine a destra).
La traduzione di questo concetto è che non c’è bisogno di ripetere i blocchi,
basta ripetere l’esecuzione di una sola sequenza, a patto di indicare
correttamente la condizione di arresto. Nel nostro caso è necessario ridurre il
quoziente alla sua parte intera (altrimenti il numero non raggiungerà lo zero),
usando l’operatore “intero inferiore”:
Se, ad esempio, il numero scritto fosse 482, le rispettive sequenze di risposta sarebbero:
Notiamo che il valore finale 0 non viene visualizzato: esso fa terminare il
ciclo, quindi uscire dal blocco “ripeti”, e dopo il blocco c’è la fine dello
script. Per visualizzare anche il valore finale, occorre un nuovo blocco
“dire” dopo la fine del ciclo (e non c’è scampo: non esiste un altro modo
semplice per farlo).
Se non si eseguisse la divisione intera (usando solo x/10), la sequenza delle
risposte sarebbe:
482 48.20 4.82 0.48 0.05 0.004820000000005 ...
e così via con numeri sempre più piccoli, fino circa al 323° decimale o giù di lì. A quel punto, anche Scratch
considera nullo il valore della variabile e il ciclo finalmente termina, per andare poi alla fine dello script.
Schemi per la gestione delle cifre di un numero
Ogni volta che si affronta un problema con le cifre di un numero, occorre ripetere il procedimento visto
prima. Questo diventa uno schema che varierà solo nella parte centrale del ciclo.
1) Conteggio delle cifre 2) Somma delle cifre 3) Trovare la cifra maggiore
4) Conteggio delle cifre pari 5) Doppio conteggio: le cifre maggiori di 5 e le altre
Schemi per le progressioni
Ogni volta che si affronta un problema con una progressione (sequenza regolare), si suggerisce l’uso di una
struttura for, che può o meno contenere un filtro.
Esempio: data in input una variabile a, scrivere una sequenza ascendente da 1 ad a, triplicando il numero
scritto.
Esempio: data in input una variabile a, scrivere la sequenza ascendente dei divisori di a. Il filtro consiste nel
controllare quali numeri della sequenza vanno scelti.
Algoritmi
Come ottenere l’indirizzo MAC della scheda wireless
L’accesso di ogni computer alla rete di istituto richiede un permesso. Questo viene assegnato ad ogni scheda
di rete, che è identificata da un codice chiamato indirizzo MAC (Media Access Control), ed è una sequenza
di 12 numeri o lettere, solitamente scritti a gruppi di 2, separati da - o :, in questo modo:
f5-60-c2-e9-87-1d
f6:6f:cc:e9:42:a1
Le lettere sono comprese tra a e f, essendo cifre in base 16.
I portatili hanno solitamente almeno due schede, una Ethernet (che funziona tramite un cavo di rete) e una
Wi-fi (Wi=Wireless, senza cavo). Per controllare i propri indirizzi MAC su sistemi Windows, aprire il
prompt dei comandi, che si presenta come una finestra nera, con il nome assegnato all’utente attuale
(indicato genericamente con xxxxx) e un cursore lampeggiante (evidenziato in rosso).
Scrivere il comando ipconfig/all (alla fine premere Enter). Nell’elenco che viene visualizzato, che può
occupare più righe di quante presenti contemporaneamente nella finestra, cercare la connessione wireless,
eventualmente scorrendo lungo la finestra. La sequenza a fianco è l’indirizzo MAC cercato.
Nell’elenco che compare, scorrere fino a trovare la dicitura Scheda LAN wireless Wi-Fi , e leggere il dato
denominato Indirizzo fisico, quello da usare come chiave di accesso. Nell’esempio è visualizzato in
rosso:
... Scheda LAN wireless Wi-Fi: Suffisso DNS specifico per connessione: homenet.telecomitalia.it Descrizione . . . . . . . . . . . . . : Qualcomm Atheros ... Indirizzo fisico. . . . . . . . . . . : 30-52-00-6D-1B-37 DHCP abilitato. . . . . . . . . . . . : Sì Configurazione automatica abilitata : Sì Indirizzo IPv6. . . . . . . . . . . . : fe80::b556:bfa... Indirizzo IPv4. . . . . . . . . . . . : 192.168.1.234(Preferenziale) Subnet mask . . . . . . . . . . . . . : 255.255.255.0 Lease ottenuto. . . . . . . . . . . . : martedì 21 novembre 2017 18:40:01 Scadenza lease . . . . . . . . . . . : mercoledì 22 novembre 2017 00:40:01 Gateway predefinito . . . . . . . . . : 192.168.1.1 Server DHCP . . . . . . . . . . . . . : 192.168.1.1 IAID DHCPv6 . . . . . . . . . . . . . : 87053003 DUID Client DHCPv6. . . . . . . . . . : 00-01-00-01-1D-B8-D9-29-F0-76-1C-FB-EE-BE Server DNS . . . . . . . . . . . . . : 192.168.1.1 NetBIOS su TCP/IP . . . . . . . . . . : Attivato ...
Come leggere l’indirizzo MAC della scheda wireless sui sistemi MAC
N.B.: l’indirizzo MAC (Media Access Control) non ha nulla a che fare con il nome del sistema.
Esistono due modi per conoscere l’indirizzo della propria scheda.
Modo 1 (interattivo)
Scegliere Preferenze di Sistema dal menu generale, e da lì selezionare Rete:
Scegliere la scheda wireless, poi comparirà l’indirizzo MAC
Modo 2 (a comando)
Attivare Terminale da applicazioni/utilità:
Scrivere ifconfig nella finestra Terminale e premere Enter/Return.
Nell’elenco visualizzato, cercare le voci en0 e en1, che rappresentano le schede di connessione
rispettivamente con cavo e wireless. Se sono entrambe presenti, l’indirizzo MAC da annotare è il secondo.
Se il Sistema ha solo la connessione wireless, ovviamente ci sarà un solo indirizzo MAC.
Come installare AlgoBuild su Mac
Andare sul sito ufficiale di AlgoBuild e scaricarlo per versione Mac;
Una volta scaricato cliccare l’icona di AlgoBuild; compare una icona che indica di scaricare SDK di Java;
sotto tale icona compaiono due opzioni: “ok” o “più informazioni”; scegliere “più informazioni”;
Compare questa pagina, scaricare il file cerchiato (Java SE Download):
Una volta scaricato, compare questa pagina dove va selezionato il JDK associato a Mac OS X.