Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
•La necessità di una comunicazione tra progettista ed esecutore implica che la descrizione
debba essere fatta in un linguaggio comprensibile dall’esecutore.
•Un algoritmo è dunque scritto in termini di operazioni elementari che l’esecutore può
comprendere immediatamente, e che è in grado di eseguire, in una certa quantità di tempo e
con un effetto ben preciso.
•L’esecuzione di queste operazioni nella sequenza ordinata stabilita dall’algoritmo consente
all’esecutore di risolvere un problema (o un insieme di problemi, uno alla volta).
•Il numero di queste operazioni (istruzioni) contenute nell’algoritmo, per quanto grande, deve
essere finito, perché l’esecuzione deve finire (non importa quando), o il problema non si potrà
mai considerare risolto.
- Algoritmo-esempio:
PROBLEMA: preparare un caffè
ALGORITMO (che genera la soluzione al problema)
1.metti acqua in A fino alla valvola
2.metti B in A
Questo è un 3.riempi B di caffè
algoritmo
4.metti C su A
descritto con un
5.avvita C
linguaggio
naturale 6.Mettere l’oggetto montato su un fornello
7.Accendere il fornello
8.Aspettare che l’acqua finisca di uscire in C
9.Spegnere il fornello
In generale un algoritmo deve essere scritto in un Perché l’algoritmo sia efficace, è sempre opportuno che
linguaggio comprensibile dall’esecutore scelto o il linguaggio sia formale e ben definito, per non
che è a disposizione incorrere per esempio in ambiguità o ridondanza.
- Sistema di calcolo
MOLTO GENERALMENTE:
• Un calcolatore è una macchina per l’esecuzione di algoritmi in maniera automatica.
• Deve essere in grado di memorizzare dati e di eseguire su di essi un certo numero di operazioni, per ottenere altri dati.
• Un’operazione viene eseguita solo se il calcolatore riceve il comando di esecuzione di un’operazione, detto istruzione.
• Un sistema di calcolo si compone di almeno due livelli (a loro volta decomponibili in altri livelli):
•Hardware: componenti elettroniche, meccaniche, ottiche, fisiche in generale...
•Software: insieme di programmi (sistema operativo e applicazioni).
• Chi usa un sistema di calcolo interagisce con esso attraverso il livello più alto, cioè quello Software:
•L’utente utilizza applicazioni;
•Il sistema operativo nasconde tutto ciò che avviene, al punto che l’utente può anche non sapere a che livello
vengono eseguite le operazioni che richiede e in quante altre vengono eventualmente scomposte.
•Un UOMO è un esempio di esecutore di algoritmi sa:
-Leggere da un libro e scrivere su un quaderno (interazione con l’esterno)
-Effettuare calcoli a mente o con semplici strumenti (capacità logico/aritmetica)
-Interpretare ed eseguire le istruzioni (capacità di controllo)
-Ricordare dati e istruzioni (capacità di immagazzinare informazioni)
(almeno) una unità logico/aritmetica per eseguire i calcoli (capacità logico/aritmetica) →ALU
(almeno) una unità di controllo che interpreta e decodifica le istruzioni e le trasferisce alle altre CPU
componenti (capacità di controllo) →CU
(almeno) una memoria per conservare i dati e le istruzioni stesse La memoria è organizzata logicamente
come una lista di LOCAZIONI DI
(capacità di immagazzinare informazioni)
MEMORIA (o celle di memoria).
- L’alba
• Volendo ripercorrere le idee che hanno portato fino ad immaginare e poi progettare macchine da calcolo dovremmo
andare molto dietro nel tempo. Tuttavia, quello che ci interessa davvero è la storia del «calcolatore elettronico digitale»,
che ha rivoluzionato la tecnologia del XX secolo, caratterizzando un'epoca.
• Non ci si sarebbe arrivati senza lo studio e i tentativi di alcune personalità notevoli, che precorrendo i tempi avevano
cominciato a progettare e costruire macchine calcolatrici già nei secoli precedenti.
•Tra questi, scegliamo di citare Blaise Pascal (1623-1662, francese), che nella Francia della metà del XVII secolo
progettò, costruì e vendette la prima macchina calcolatrice funzionante, interamente meccanica (azionata a manovella), in
grado di compiere egregiamente somme e sottrazioni.
•La sua macchina fu ripresa ed ampliata da Leibniz (1646-1716, tedesco) in una che potesse eseguire anche
moltiplicazioni e divisioni.
• Leibniz espresse chiaramente l'opportunità di far compiere ad una macchina calcoli che comportavano solo una noiosa
perdita di tempo per gli studiosi.
• Questo tema fu mantenuto e portato avanti anche nell'opera di un'altra grande personalità quale l'inglese Charles
Babbage (1792-1871) che progettò dettagliatamente la Macchina Analitica (Analytical Engine).
• A lui si deve probabilmente anche il primo accordo tra uno scienziato ed un governo: egli riuscì ad ottenere supporto
economico per il proprio progetto in Inghilterra, ma per il susseguirsi di difficoltà impreviste e per l'inadeguatezza dei
tempi, la macchina non fu mai realizzata.
• Il suo progetto però prevedeva un'unità aritmetica, la capacità di realizzare salti condizionati e cicli, e una memoria
integrata.
• Sarebbe inoltre stata programmabile: Ada Lovelace scrisse per questa macchina un programma in grado di calcolare i
numeri di Bernoulli.
• L'insieme dei principi alla base della macchina di Babbage è a tutti gli effetti vicinissimo a quello che ha ispirato
successivamente il progetto dei veri e propri calcolatori funzionanti.
• La tecnologia divenne matura per l'interesse verso i calcolatori,
sia in Europa che negli Stati Uniti, solo dopo l'inizio del XX Interessante è la visita al sito web del National
secolo. Museum of Computing a Bletchley Park,
• Già nei primi anni 40 l'americano John Atanasoff (1903-1995) anche nota come Stazione X, ovvero una
scriveva del progetto di una macchina elettronica ad aritmetica tenuta situata a nord ovest di Londra.
binaria per la risoluzione di un sistema di equazioni lineari, ma Durante la Seconda Guerra Mondiale,
le sue idee non ebbero la fortuna meritata a causa Bletchley Park fu il sito dell'unità principale di
dell'inadeguatezza della tecnologia del suo tempo. crittoanalisi del Regno Unito, nonché sede
• Il vero stimolo per lo sviluppo che portò ai calcolatori della Scuola governativa di codici e cifrazione.
elettronici venne dalla Seconda Guerra Mondiale: primi tra tutti, In questo museo c’è un’intera galleria dedicata
gli inglesi si impegnarono nella costruzione del segretissimo a COLOSSUS e altre esposizioni riguardo la
computer COLOSSUS (1943) per interpretare i messaggi rottura di ENIGMA.
tedeschi cifrati da ENIGMA, con anche il contributo (1912-
1954) del grande matematico Alan Turing.
LA MACCHINA DI TURING
• Le caratteristiche teoriche generali di una macchina in grado di eseguire procedure logiche e matematiche in modo
automatico sono state definite proprio da Turing nel 1937. La sua intenzione era di formalizzare il concetto di algoritmo
fino ad individuarne i limiti nell’applicazione.
• Turing ideò una macchina teorica in grado di simulare il comportamento di un uomo intento a eseguire un calcolo
aritmetico.
• La macchina di Turing ha una precisa struttura logica, funziona eseguendo una successione di passi discreti e il suo
comportamento è determinato da un insieme finito di regole: specificando in modo opportuno le regole, una macchina di
Turing può eseguire calcoli di qualsiasi natura e complessità.
• Egli dimostrò poi che è possibile progettare una macchina UNIVERSALE, in grado cioè di imitare qualsiasi altra
macchina di Turing, attraverso un processo di codifica che assomiglia molto al nostro moderno concetto di programma.
Dimostrò anche che la sua macchina universale poteva risolvere qualsiasi problema a patto che esso fosse
RISOLVIBILE, ovvero che esistesse un algoritmo per la sua soluzione.
• Anni di studi di informatica teorica che ritrovavano sempre le conclusioni di Turing fanno oggi valere la famosa Tesi di
Church: «L’insieme dei problemi effettivamente risolvibili con qualsivoglia metodo meccanico coincide con quello dei
problemi risolvibili dalla macchina di Turing.»
• Sebbene nemmeno concepita per essere realizzata, la macchina di Turing è stata ispirazione per le progettazioni
successive.
In memoria di Alan Turing è stato istituito nel 1966 dalla ACM (Association for Computing Machinery) l’A.M.
Turing Award (Premio Turing). Considerato da molti il «premio Nobel dell’informatica», viene assegnato ogni
anno a una personalità che eccelle per i contributi di natura tecnica offerti alla comunità informatica.
• Il primo vero computer di uso generale realizzato e funzionante, si deve però ad Howard Aiken e al suo gruppo di lavoro
della Harvard University: il Mark I (progetto iniziato nel 1939 e terminato nel 1943).
• Era un dispositivo digitale elettromeccanico, basato su relè (interruttori azionati da un elettromagnete), composto da 72
parole di 23 cifre decimali, con un tempo di istruzione di 6 secondi e un nastro di carta per l'input e l'output.
• Questo calcolatore rimase a disposizione della Marina Militare degli Stati Uniti per tutta la Seconda Guerra Mondiale ed
ebbe un alto impatto mediatico, permettendo la nascita e lo sviluppo del laboratorio universitario di Harvard.
• Il Mark I e i suoi successori ebbero un breve successo, presto messi a confronto con i calcolatori elettronici che
sfruttavano valvole termoioniche.
• Nel 1954 il germanio viene sostituito con un altro semiconduttore, il silicio, molto più diffuso ed economico.
• La memoria negli anni 60 era costituita da nuclei di ferrite.
• Il primo (super)calcolatore a transistor fu costruito presso i Lincoln Laboratory del M.I.T., nel 1956 e fu chiamato TX-0
(Transistorized eXperimental computer 0).
• Seguì il più evoluto TX-2, precursore della macchina messa in commercio solo diversi anni dopo (1961) dalla nascente
Digital Equipment Corporation (DEC), la PDP-1 (Programmed Data Processor 1), osteggiata dagli stessi finanziatori che
non credevano potesse esserci mercato per i computer.
• il DEC PDP-1 (1960) è stato il primo calcolatore commerciale a transistor, nonché il primo con monitor e tastiera.
• Intanto IBM nel 1959 costruiva un calcolatore a transistor sul modello 709, l'IBM 7090, con prestazioni doppie rispetto
al PDP-1, ma che costava diversi milioni di dollari, contro i 120000 dell'altra.
• tra i progettisti del prototipo dell'IBM 7090 c'era il giovane promettente Ph.D. Michael J. Flynn;
• questa macchina fu venduta all’Aeronautica Militare degli Stati Uniti, che vi calcolava le traiettorie di volo dei
missili Saturno della NASA.
• Furono vendute decine di PDP negli anni 60.
• Il PDP-1, di cui fu fornito anche il M.I.T, aveva uno schermo e la capacità di disegnare punti in qualsiasi zona di questo
schermo: è stato il primo computer con monitor e tastiera. Gli studenti del M.I.T. lo programmarono per giocare a
spacewar di fatto inventando il primo videogioco della storia.
• L'IBM, che pure con la 7094 (macchina ad aritmetica binaria parallela su registri a 36 bit) si imponeva sul mercato,
cominciò a fare veri profitti vendendo quasi contemporaneamente una piccola macchina per le aziende, chiamata 1401
(aveva una «sorella» pensata per gli scienziati, modello 1620), in grado di leggere e scrivere nastri magnetici, leggere e
perforare schede e stampare output alla stessa velocità del 7094 ma ad una frazione del prezzo.
- Supercalcolatori
• Nel 1964 una sconosciuta società, la Control Data Corporation (CDC) produsse il modello 6600 (CDC 6600), disegnato
da Seymour Cray (1925-1996, figura rimasta leggendaria come Von Neumann), con prestazioni di un ordine di grandezza
maggiori del 7094, grazie all'alto parallelismo e fu subito amato dai matematici numerici.
• Era una macchina dotata di diverse unità funzionali che potevano lavorare contemporaneamente e necessitava di
un'attenta programmazione.
• Inoltre, la CPU veniva dedicata interamente ai calcoli veri e propri, mentre tutti gli altri dettagli di gestione del
programma e dell'input/output venivano affidati a CPU secondarie.
• In pratica, questa macchina conteneva idee chiave per i calcolatori prodotti decine di anni dopo ed è stato il primo
supercalcolatore così chiamato.
• Tecnologia detta VLSI (Very Large Scale Integration) perché con l’avvicinarsi degli anni ‘80 si inserivano sullo stesso
chip sempre più transistor, da migliaia a milioni. E i computer diventarono sempre più piccoli e più veloci. Nelle
università si poteva fornire di computer ogni dipartimento, e con il crollo dei prezzi, anche i privati potevano
permettersene uno: nascevano i personal computer, destinati ad usi nuovi, come l'elaborazione di testi, l'amministrazione
domestica o videogiochi, e venduti in scatole di montaggio, senza software.
• Nel 1973 Gary Kildall (1942-1994) aveva scritto il sistema operativo CP/M, scritto per il processore Intel 8080, i cui
concetti fondamentali sarebbero stati la base per MS-DOS.
• A Albuquerque Bill Gates (1955 – vivente) e Paul Allen (1953 – 2018) il 4 aprile 1975 diedero vita a Microsoft, creata
dopo che Gates – forse un po’ spinto da Allen, più interessato all’informatica di lui – abbandonò gli studi presso
l'Università di Harvard (in legge).
è una società concentrata sul SOFTWARE (sistemi operativi in particolare) ma inizia una fortunata
collaborazione con la società produttrice di hardware IBM agli inizi degli anni 80 (durata fino al ‘91).
• Siamo nel 1976 quando Steve Wozniak (1950-vivente) progetta l'Apple, e riesce ad ottimizzarlo ma soprattutto a
commercializzalo grazie al suo amico ed ex compagno di studi Steve Jobs (1955-2011).
• Il 1º aprile 1976 i due fondarono, insieme all'amico Ronald Wayne, la società Apple Computer
vendendo il furgoncino Volkswagen di Jobs e la calcolatrice HP di Wozniak, misero insieme alcune migliaia di
dollari con cui acquistarono i componenti necessari a iniziare la produzione.
• Paul Terrell, che aveva da poco aperto The Byte Shop, la prima catena di negozi dedicati ai computer, fu molto
impressionato dalla macchina e propose a Jobs l'acquisto di 50 computer già assemblati e pronti all'uso per 500 $
cadauno, da consegnare in 30 giorni.
• Jobs accettò, ben sapendo che il costo dei componenti necessari a realizzare tutti quei computer era molto al di là delle
loro possibilità.
• Nonostante ciò, riuscì a convincere un fornitore di componenti ad accettare un pagamento a 30 giorni senza interessi.
• Con i componenti disponibili, i computer furono assemblati da Wozniak presso la sua postazione di lavoro alla
Hewlett-Packard e poi testati e immagazzinati prima della vendita nel garage dei genitori di Steve Jobs.
APPLE 1
• L'Apple I è semplicemente una scheda madre completamente assemblata.
• Per ottenere un computer funzionante bisogna aggiungervi un paio di alimentatori in grado di fornirle le tensioni
elettriche richieste, una tastiera e collegarlo ad uno schermo (un televisore), che andavano acquistati a parte da altri
fornitori.
• È per questo motivo che molti Apple I vennero assemblati in case di legno: non essendoci all'epoca un mercato di case,
molti utenti se lo costruirono da soli e spesso utilizzavano il legno.
• Wozniak era l'unica persona che poteva offrire assistenza per quella macchina, avendola progettata e costruita
personalmente.
• Seguì nel 1977 l'Apple II (il primo calcolatore della Apple a grande diffusione), che aggiungeva al testo scritto anche
grafica e colori, veniva venduto già assemblato e con il sistema operativo AppleDOS.
• Questo personal computer ebbe grande diffusione tra privati e scuole, e, con la forza della loro semplicità di utilizzo,
resero immediatamente la Apple (società fondata per l'occasione) un pericoloso concorrente per le altre compagnie.
• Intel cominciò a distribuire il processore Intel 8080 con il CP/M su floppy disk, con tanto di file system e interprete di
comandi scritti da tastiera (shell).
• Ma dopo il successo ottenuto dalla Apple, anche l'IBM si diede ai personal computer.
• Nel 1981, IBM introdusse sul mercato, con tanto di libro degli schemi e dei diagrammi dei circuiti, il suo PC IBM, con
sistema operativo Microsoft MS DOS, che divenne subito il computer più venduto (e più clonato) della storia (IBM PC
5150).
• Microsoft aveva comprato (per soli 100000 dollari) da altra società una prima versione del DOS che aveva poi fatto
modificare allo stesso creatore, che non aveva un contratto esclusivo con la società di origine, per adattarlo al 5150.
•IBM però non vuole comprare la licenza (i diritti restano Microsoft), e si accordano per la fornitura dei sistemi operativi.
• Intanto Apple produceva prima l'Apple Lisa, per la prima volta dotato di interfaccia grafica.
LISA
• Il nome è in onore della figlia di Jobs, a cui fu collegato il poco significativo acronimo Local Integrated System
Architecture.
• L'interfaccia grafica del Lisa nacque da un accordo con la Xerox: lo Xerox Alto fu il primo computer con una
interfaccia grafica, che introduceva la metafora della scrivania (Desktop) e il mouse. Tutte le sue novità vennero
perfezionate e riversate nel Lisa.
• Il Lisa fu il primo computer dotato di interfaccia grafica (GUI) ad entrare nelle case della gente comune.
• Il Lisa era dotato di processore Motorola 68000, di 1 MB di RAM e di 2 dischi floppy da 5,25 pollici, in grado di
memorizzare fino a 871 kB.
• …e poi nel 1984 il più fortunato, Macintosh a cui Microsoft fornisce il pacchetto Office.
• La Microsoft di Bill Gates cominciò a sviluppare, seguendo le idee della Apple l'interfaccia grafica per MS-DOS
chiamata Windows che divenne poi un vero e proprio sistema operativo evolutosi negli anni.
Windows 1.0 viene messo sul mercato nell’ 85, ma ha scarso successo e non fornisce un sistema
operativo completo, è solo un’estensione di MS-DOS, con molti limiti.
Con Windows 2.0 nell’ 87 inizia una prima rudimentale distribuzione del pacchetto Office (Word ed
Excel).
Con Windows 3.0 inizia la fortuna del sistema, e nasce l’ormai famosissimo logo.
• In questo modo la concorrenza di IBM e Microsoft alla Apple era spietata, nonostante non potessero competere in
termini tecnologici, perché i loro prodotti risultavano più economici.
• Il Macintosh sopravvisse a stento a questa guerra, e la società si è ripresa davvero soltanto a metà degli anni 90.
• Del 1981 è anche la comparsa del primo (?) calcolatore portatile, Osborne-1 della Osborne Computer Corporation,
società che fallì poco dopo, incapace di battere la concorrenza.
• Intel realizzò diversi processori sull'onda della valida architettura 8080, di cui ebbe particolare fortuna l’80386 (1985),
con tutti i suoi figli, compresi i Pentium (1993, Pentium II nel 1997, Pentium III nel 1999).
• Nel 1989 Tim Berners-Lee propone il progetto World Wide Web al CERN.
• Microsoft dagli anni ‘90 prosegue i propri progetti affiancando le produzioni Intel, di fatto detronizzando IBM.
• Nel 1992 DEC presentò Alpha, una macchina RISC a 64 bit, dalle prestazioni nettamente superiori a tutti i precedenti,
ma le macchine a 64 bit hanno cominciato a diffondersi solo molto dopo.
ESEMPIO
Il numero intero K=18 (in base b=10) può essere rappresentato in base b=2 come K=10010
10010 = 0*2^0 + 1*2^1 + 0*2^2 + 0*2^3 + 1*2^4= 0+2+0+0+16 = 18
ESEMPIO
Se MAX=127, quanto fa 60+70?
-127<60<127 quindi 60 è rappresentabile,
-127<70<127 quindi 70 è rappresentabile,
60+70=130>127 non è rappresentabile!!
Se MAX=127, quanto fa 60+70-40?
-127<40<127 quindi anche 40 è rappresentabile
(60+70) –40 non è rappresentabile, ma
60 + (70-40) è rappresentabile
• La situazione per cui il risultato di una operazione tra due numeri rappresentabili non è rappresentabile è detta
OVERFLOW.
ESEMPIO
Se la base è b=2, e la parola è lunga L=32 (situazione reale!), allora il massimo rappresentabile è: 𝑀𝐴𝑋=2𝐿−1−1≅109
Se K=13 e ne calcoliamo il FATTORIALE: K! = 6227020800 >𝑀𝐴𝑋x
Quindi 13! è una operazione che provoca overflow.
ESEMPIO
Proposizione P: «Napoli è in Campania»
• Per rappresentare i due valori in memoria sarebbe sufficiente un solo bit MA poiché la minima quantità di memoria
indirizzabile è la locazione di memoria il tipo di dato logico è rappresentato utilizzando un’intera locazione.
• Se b = 2, L = 8:
2 bit per i
due segni,
4 per la
mantissa, 2
per
l’esponente
Proviamo a rappresentare x = 6.5
Binario: x = 110.1
Floating point: x= +0.1101 · 2^11
Proviamo a rappresentare y = -0.21875
Binario: y = -0.00111
Floating point: y= -0.1110 · 2^ (-10)
Proviamo a rappresentare z = 5.75
Binario: z = 101.11
Floating point: z= +0.10111 · 2^11
Proviamo a rappresentare w = 9.0
Binario: w = 1001.0
Floating point: w= 0.1101 · 2^100
Anche la rappresentabilità di un dato di tipo reale dipende dalla lunghezza della parola!
Non tutti i numeri sono rappresentabili!
• 2 vincoli
PRECISIONE FINITA: sul numero di cifre della mantissa
o Il numero di cifre a disposizione per la mantissa t si chiama precisione del sistema aritmetico
o Tutti i numeri reali che hanno più di t cifre non possono essere rappresentati esattamente
RANGE LIMITATO: sul numero di cifre dell’esponente
o Se q il numero di cifre a disposizione per le cifre dell’esponente, abbiamo
o 𝐸𝑚𝑖𝑛 = −(𝑏𝑞−1 − 1) è il minimo esponente rappresentabile
o 𝐸𝑚𝑎𝑥 = 𝑏𝑞−1 − 1 è il massimo esponente rappresentabile
o Gli esponenti al di fuori del range [𝐸𝑚𝑖𝑛, 𝐸𝑚𝑎𝑥] non possono essere rappresentati esattamente.
• ESEMPI
Sistema aritmetico 1: b=10, t= 3, 𝐸𝑚𝑖𝑛= -5, 𝐸𝑚𝑎𝑥=5
Il massimo numero reale POSITIVO rappresentabile è R=0.999 · 10^5
Il minimo numero reale POSITIVO rappresentabile è R=0.100 · 10^ (-5)
Sistema aritmetico 2: b=10, t= 5, 𝐸𝑚𝑖𝑛= -10, 𝐸𝑚𝑎𝑥=10
Il massimo numero reale POSITIVO rappresentabile è R= 0.99999 · 10^10
Il minimo numero reale POSITIVO rappresentabile è R= 0.10000 · 10^ (-10)
• L’insieme finito dei numeri reali esattamente rappresentabili su una macchina con un dato sistema aritmetico floating
point a precisione finita è detto: insieme dei numeri macchina.
• Nel 1989 viene definito lo standard IEEE 754 che rappresenta il formato di rappresentazione f.p. più diffuso.
• Disponibile in singola (32 bit), doppia (64 bit) e quadrupla (128 bit) precisione.
• Permette anche la rappresentazione di situazioni eccezionali come infinito, forme indeterminate e i numeri
denormalizzati.
• Per la singola precisione (32 bit) il sistema è caratterizzato da:
Base b=2
Precisione t=23
Esponente minimo 𝐸𝑚𝑖𝑛= -126
Esponente massimo 𝐸𝑚𝑎𝑥=127
• Dunque, dato il numero reale 𝑥=𝑓∗𝑏𝑒, se non è un numero macchina vale almeno una delle seguenti
𝑒 > 𝐸𝑚𝑎𝑥: OVERFLOW, rappresentazione impossibile
𝑒 < 𝐸𝑚𝑖𝑛: UNDERFLOW, 𝑥 si rappresenta con 0
la mantissa ha più di t cifre: 𝑥 si rappresenta con un numero vicino che sia un numero macchina
• Esempi: b=10, t= 3
𝑥 = 0.1251 · 102 si rappresenta con 𝑓𝑙(𝑥) = 0.125 · 102
𝑥 = 0.1259 · 102 si rappresenta con 𝑓𝑙(𝑥) = 0.126 · 102
𝑓𝑙(𝑥) è la rappresentazione floating point di 𝑥, si ottiene per:
Troncamento (si eliminano le cifre decimali
in eccesso)
• 𝑓𝑙 (0,1251 ∗ 102) = 0,125 ∗ 102
• 𝑓𝑙 (0,1259 ∗ 102) = 0,125 ∗ 102
Arrotondamento (si approssima x con il
numero macchina più vicino)
• 𝑓𝑙 (0,1251 ∗ 102) = 0,125 ∗ 102
• 𝑓𝑙 (0,1259 ∗ 102) = 0,126 ∗ 102
• Sul tipo di dati reale sono definite le tradizionali operazioni:
Addizione f.p.
Sottrazione f.p.
Moltiplicazione f.p.
Divisione f.p.
• Analogamente al tipo di dato intero, il risultato è definito solo se gli operandi sono rappresentabili, e il risultato è
rappresentabile.
• ATTENZIONE: Alcune proprietà dell’aritmetica tradizionale non valgono in aritmetica floating point a precisione finita
(associativa, commutativa, distributiva…)!
• La parte che precede il punto di radice viene detta parte intera e quella che segue il punto di radice viene detta parte
frazionaria.
• Se lavoriamo con una base generica b, è importante indicare in quale base è espresso un numero dato, in quanto il suo
valore varia al variare di b.
• ESEMPI
123.110 = 1 × 102 + 2 × 101 + 3 × 100 + 1 × 10−1 = 123.110
123.17 = 1 × 72 + 2 × 71 + 3 × 70 + 1 × 7−1 = 66.142857142...10
123.14 = 1 × 42 + 2 × 41 + 3 × 40 + 1 × 4 – 1 = 27.251010
• Lo stesso numero necessita di un numero di cifre maggiore o uguale, al diminuire della base b.
• ESEMPIO
25310 = 𝐹𝐷16 = 3758 = 111111012
Come convertire un numero reale FINITO da una base 𝑏1 a una base 𝑏2.
Caso 𝒃𝟐 = 𝟏𝟎
Vi sono due possibili algoritmi per calcolare il valore decimale (che potrebbe non essere finito) di un numero reale
(finito) espresso in base qualsiasi 𝑏1:
1. Utilizzo della notazione posizionale: si calcola il valore utilizzando la definizione
n
𝑎=± (𝑎𝑛𝑎𝑛-1𝑎𝑛-2…𝑎2𝑎1𝑎0 *𝑎−1𝑎−2𝑎−3…) 𝑏=± ∑ ai b
ⅈ
i=−∞
• ESEMPI:
• 2401.23145 = 2×53 + 4×52 + 0×51 + 1×50 + 2×5−1 + 3×5−2 + 1×5−3 + 4×5−4 = 351.534410
• 110110.1012 = 1×25 + 1×24 + 0×23 + 1×22 + 1×21 + 0×20 + 1×2−1 + 0×2−2 + 1×2−3=54.62510
2. Utilizzo dell’Algoritmo di Horner: si considerano separatamente la parte intera e la parte frazionaria del numero e
poi si procede come segue:
•Parte intera: Partendo dalla prima cifra significativa alla sinistra, verso destra, si moltiplica il valore per la base
𝑏1e si aggiunge la cifra successiva. Il risultato si moltiplica per la base 𝑏1e si aggiunge la cifra successiva, e così
via sino all’esaurimento delle cifre. Ovvero:
(𝑎𝑛𝑎𝑛 − 1𝑎𝑛−2 … 𝑎2𝑎1𝑎0) 𝑏 = ((… ((𝑎𝑛 × 𝑏1 + 𝑎𝑛−1) × 𝑏1+𝑎𝑛−2) × 𝑏1+⋯) × 𝑏1 + 𝑎1) × 𝑏1 + 𝑎0
•Parte frazionaria: Partendo dalla prima cifra significativa alla destra della parte frazionaria, verso sinistra, fino al
punto di radice si divide il valore per la base 𝑏1e si aggiunge la cifra precedente.
•Il risultato si divide per la base 𝑏1e si aggiunge la cifra precedente e così via sino all’esaurimento delle cifre,
terminando con una divisione per 𝑏1. Ovvero:
(0. 𝑎−1𝑎−2𝑎−3…𝑎−𝑚+1𝑎−𝑚) 𝑏= ((… ((𝑎−𝑚: 𝑏1 + 𝑎−𝑚+1): 𝑏1+𝑎−𝑚+2): 𝑏1 + ⋯): 𝑏1 + 𝑎−1): 𝑏1
•ESEMPIO: 110110.1012 = 54.12510
parte intera ((((1×2+1) ×2+0) ×2+1) ×2+1) ×2+0=5410
parte frazionaria ((1∶2+0) ∶2+0) ∶2 = 0.12510
Caso 𝒃𝟏=𝟏𝟎
Per calcolare il valore in base 𝑏2(che potrebbe non essere finito) di un numero reale (finito) espresso in base 10, bisogna
distinguere la parte intera dalla parte frazionaria ed operare in modo differente:
Parte intera:
• L’algoritmo di conversione ha sempre termine e consiste nell’effettuare iterativamente delle divisioni per la nuova base
𝑏2, fermandosi solo quando si ottiene un quoziente nullo.
• I resti delle divisioni effettuate, presi in ordine inverso a quello con cui sono stati calcolati, formano la parte intera del
numero convertito.
• I resti ottenuti sono dei numeri decimali il cui valore è < 𝑏2.
• Se 𝑏2 > 10, per formare il numero nella nuova base, ai resti decimali vanno sostituiti (se necessario) i corrispondenti
simboli della nuova base di numerazione.
Parte frazionaria:
• Si moltiplica ripetutamente per la base 𝑏2 e si tolgono le parti intere che, prese nell’ordine, formeranno la parte
frazionaria del numero espresso nella nuova base 𝑏2.
• Le parti intere ottenute sono dei numeri decimali il cui valore è < 𝑏2
• Se 𝑏2> 10, per formare il numero nella nuova base ad essi vanno sostituiti (se necessario) i corrispondenti simboli della
nuova base di numerazione.
ESEMPIO
Convertire 93.62510 in base 2
Parte intera: 1011101 Parte frazionaria: 101
•93/2 = 46 con resto 1 •0.625∗2=1.25 parte intera 1
•46/2 = 23 con resto 0 •0.25∗2=0.5 parte intera 0
•23/2 = 11 con resto 1 •0.5∗2=1 parte intera 1
•11/2 = 5 con resto 1 •0.0∗2=0
•5/2 = 2 con resto 1
•2/2 = 1 con resto 0
•1/2 = 0 con resto 1
93.62510 = 1011101.1012 = 0.10111011012×27
ESEMPIO
Sia 𝑥=10.1294 e una sua approssimazione (generica) 𝑥∗=10.1253 𝑥∗ è
un’approssimazion
Un modo per misurare la bontà della approssimazione è calcolare
e corretta a 2 cifre
𝐸𝐴=|𝑥−𝑥∗|=|10.1294−10.1253|=0.0041=0.41x10−2 decimali
ERRORE ASSOLUTO
ESEMPIO 𝑦∗ è «migliore» di 𝑥∗
perché rispetto a un
Siano
numero molto più
𝑥= 10.1294 e una sua approssimazione (generica) 𝑥∗= 10.1253 grande!
𝑦= 2410.1294 e una sua approssimazione (generica) 𝑦∗= 2410.1253
𝐸𝐴=|𝑥−𝑥∗|=|10.1294−10.1253|=0.0041=0.41x10−2
𝐸𝐴=|𝑦−𝑦∗|=|2410.1294−2410.1253|=0.0041=0.41x10−2 Otteniamo altre
L’ ERRORE ASSOLUTO è lo stesso ma intuitivamente il loro valore è diverso informazioni se lo
«pesiamo» rispetto al
numero approssimato
ESEMPIO
𝑦 e 𝑦∗hanno 6 cifre
𝑦∗ è
- Errori di rappresentazione un’approssimazione
ESEMPIO: corretta a 6 cifre
significative
In un sistema aritmetico floating point normalizzato F = {b=10, t=5, E min= -9, Emax=9}
• 𝑥=10.4534 non è esattamente rappresentabile, quindi si rappresenta con f𝑙(𝑥)=0.10453 x102
• Che errore si commette rappresentando 𝑥con f𝑙(𝑥)?
• Osservazione: La mantissa di f𝑙(𝑥) contiene le cifre significative del numero
|x−x ¿|
• Studiamo l’errore relativo E R= Errore relativo di round-off (di rappresentazione)
|x|
IN GENERALE:
• 𝑥= 𝑓×𝑏𝑒, f𝑙(𝑥)=𝑓′×𝑏𝑒 con 1/𝑏 ≤ 𝑓 < 1
• 𝑓 e 𝑓′ hanno t cifre in comune
• Quindi
|x−fl ( x )| |f −f '| 1−t | x−fl ( x )| |f −f '| b
( 1−t )
E R= = ≤b ER= = ≤
|x| |f | |x| |f | 2
Troncamento Arrotondamento
• Il massimo errore relativo che si commette rappresentando 𝑥 con f𝑙(𝑥) si dice: Massima Accuratezza Relativa
• e si esprime come u=max 〖∨x−fl( x )∨¿ ¿
• È una COSTANTE DELLA MACCHINA: è diversa per ogni macchina
• Esempi:
•F = {b=10, t=5, Emin=-9, Emax=9} u = 0.5 x 10 -4
•F = {b=2, t=23, Emin=-127, Emax=128} (IEEE s.p.) u=2-23~ 0.119x10-6
•F = {b=2, t=52, Emin=-1023, Emax=1024} (IEEE d.p.) u=2-52~ 0.222x10-15
Linguaggio macchina
• Nelle locazioni di memoria è possibile memorizzare solo sequenze di bit.
• L’insieme di istruzioni rappresentate come sequenze di bit è detto LINGUAGGIO MACCHINA.
• In un linguaggio macchina ad ogni operazione che l’ALU può eseguire corrisponde un codice operativo.
• È l’unico linguaggio direttamente eseguibile dal calcolatore.
• Il linguaggio macchina di un calcolatore non è eseguibile su calcolatori con architettura differente.
| |
Per eseguire 2 * 4 + 3
Fase 1:
• Prelevare i dati (2 e 4) da locazioni 1000 e 1001
• Eseguire 2 * 4
• Memorizzare il risultato (8) in locazione 1100
Fase 2:
• Prelevare i dati (8 e 3) da locazioni 1100 e 1010
• Eseguire 8 + 3
• Memorizzare il risultato (11) in locazione 1110
ESEMPIO DI LINGUAGGIO MACCHINA
MOLTIPLICAZIONE:
• Codice operativo (c. o.) 0010 Codice operativo Indirizzo Op1 Indirizzo Op2 Indirizzo Risultato
- Linguaggio assembly
• Sostituiamo
• Il codice operativo con un nome che ne ricordi la funzione (es. add, mult...)
• L’indirizzo di un dato con un nome che viene dato alla parola di memoria
• Otteniamo il Linguaggio assemblativo (o Assembly)
• Stessa struttura dell’istruzione, ma più comprensibile!!!
| |
ASSEMBLY
MOLTIPLICAZIONE:
• Codice operativo (c. o.) 0010
• Istruzione a tre indirizzi
• 2*4 si codifica: 0010 1000 1001 1100
• In Assembly: mult A B P
ADDIZIONE:
• Codice operativo (c. o.) 0001
• Istruzione a tre indirizzi
• 8+3 si codifica: 0001 1100 1010 1110
• In Assembly: add P C S
| |
• Un programma scritto in Assembly non è eseguibile direttamente dal calcolatore.
• È necessario un programma che traduca l’Assembly in linguaggio macchina (programma assemblatore o Assembler).
• Fase 1: traduzione del programma assembly in linguaggio macchina.
- Assembler
• Preleva una istruzione in assembly dalla memoria (dati
dell’assemblatore).
• Sostituisce mediante una tabella il nome dell’operazione con il
corrispondente codice operativo.
• Sostituisce al nome delle parole in memoria il corrispondente
indirizzo.
• Memorizza l’istruzione in linguaggio macchina (risultati
dell’assemblatore).
• Il linguaggio assemblativo risolve alcuni problemi del linguaggio
macchina: leggibilità, maggiore facilità di programmazione.
• Rimangono altri problemi
• profonda dipendenza dalla macchina,
• codici lunghi anche per semplici problemi.
- Gerarchia di memoria
• Il processore è collegato alla MEMORIA. (Meglio dire ALLE MEMORIE)
• Da un punto di visto logico, qualunque dispositivo capace di memorizzare dati o istruzioni è una memoria.
• Dal punto di vista pratico in un calcolatore esistono diversi tipi di memoria, con caratteristiche e funzioni diverse.
• Tutte queste memorie sono organizzate gerarchicamente, ovvero esiste una Gerarchia di memoria.
• Le principali caratteristiche che differenziano le varie
memoria sono: il tempo di accesso e la dimensione.
• Memorie di alto livello: veloci (pochi ns) e piccole (MB
GB); adatte a fornire dati alla CPU ad una adeguata velocità;
utilizzate solo dai programmi in esecuzione.
• Memorie di basso livello: lente (alcuni ms e grandi TB);
adatte a conservare grandi quantità di dati e programmi in
maniera permanente; utilizzate per conservare dati e
programmi non utilizzati dalla CPU in quel momento.
- Registri
• I registri sono memorie molto piccole (e costose) ad alta velocità di accesso, e per questo di solito molto vicine se non
interne alla struttura del microprocessore. Possono essere generici o speciali.
• Quelli generici fungono da luoghi di memorizzazione temporanea per i dati elaborati conservano i dati in ingresso e
forniscono uno spazio di memorizzazione immediato per i risultati ottenuti.
• Per eseguire un’operazione su qualunque dato la CU deve prima trasferirlo nei registri generici, informare l’ALU della
nuova posizione e della posizione in cui portare il risultato.
• Per trasferire i dati, l’unità centrale e la memoria principale (o centrale) sono collegate da un insieme di fili denominati
BUS.
• Tramite il bus, la CPU è in grado di leggere i dati dalla memoria principale (o centrale) nei registri, specificando
l’indirizzo della relativa cella di memoria.
• In modo simile la CPU può scrivere dati dai registri in memoria, attraverso l’indirizzo della cella di destinazione.
- Cache
• Tra la memoria principale e i registri c’è in genere un ulteriore livello (o anche più livelli) detto di CACHE.
• La cache si può vedere come una memoria di appoggio che è più veloce e più «vicina» al processore della memoria
principale, ma più piccola.
• Per velocizzare il tempo di accesso medio alla memoria principale, quando la CU porta un dato dalla memoria attraverso
il BUS, lo porta con altri dati a lui «vicini» e lascia tutto in cache prima di portare il necessario nei registri.
È infatti in genere molto probabile che si riaccederà agli stessi dati o a dati vicini nelle prossime operazioni, e
trovarli già in cache accelererà il loro recupero (principio di località).
Solo quando i dati non sono in cache verranno cercati nella memoria principale, e dunque saranno portati in cache
in sostituzione di altri riportati in memoria (eventualmente variati rispetto a quando sono stati caricati).
- Memoria di massa
• I computer sono forniti di dispositivi aggiuntivi chiamati sistemi di memoria di massa (o memoria secondaria)
Dischi magnetici,
CD, DVD, BluRay, …
Nastri magnetici,
Unità flash,
Dischi a stato solido.
• Non sono volatili (o lo sono meno); Hanno grandi capacità di memorizzazione; Possono in genere essere facilmente
rimossi, allontanati, sostituiti; Sono lenti; Sono più esposti ai guasti meccanici.
- Hard disk
• Uno degli esempi più comuni di memoria di massa è il disco magnetico o hard disk drive (HDD), che conserva i dati su
un sottile disco rotante con rivestimento magnetico.
• Le testine di lettura/scrittura sono poste sopra e sotto
il disco, in modo che durante la rotazione ciascuna
testina percorra un cerchio chiamato traccia.
• Riposizionando le testine di lettura/scrittura lungo il
raggio del disco è possibile accedere a tracce
concentriche diverse.
• Spesso i sistemi a disco consistono di più dischi
montati su un perno comune uno sull’altro, con spazio
sufficiente affinché le testine si spostino tra i piatti,
muovendosi simultaneamente.
• Ogni volta che le testine sono posizionate diventa accessibile un nuovo insieme di tracce, chiamato cilindro.
• Poiché una traccia può contenere più informazioni di quante se ne vogliano manipolare contemporaneamente (di solito),
essa è anche divisa in archi, detti settori, su cui i dati vengono registrati come una stringa continua di bit.
• Nei sistemi a disco più semplici ciascuna traccia all’interno di un sistema a dischi contiene lo stesso numero di settori, e
ogni settore contiene lo stesso numero di bit, quindi i bit posti nei settori delle tracce più vicine al centro del disco sono
memorizzati in modo più compatto rispetto a quelle vicine al bordo esterno.
• La capacità di un sistema a dischi dipende dal numero di piatti utilizzati dalla densità con cui sono disposti settori e
tracce. I sistemi più capaci contengono oggi da tre a sei piatti su un perno comune.
• Il tempo di accesso ai dati su un disco magnetico dipendono dal:
Tempo di posizionamento: della testina da una traccia a un’altra.
Ritardo di rotazione: metà del tempo per eseguire una rotazione completa, cioè tempo medio perché la testina
raggiunga un particolare dato sulla traccia.
• Si dovrà considerare poi la velocità di trasferimento: relativa al tempo per portare un dato unitario dal disco alla
memoria principale o viceversa.
• Per aumentare la velocità di rotazione le testine non toccano il disco ma «fluttuano» sopra la superficie a distanza tanto
piccola da poter essere riempita da una sola particella di polvere infiltrata che distruggerebbe disco e testina.
I dischi vengono venduti sigillati dalla fabbrica.
- Sistemi ottici
• I Compact Disc (CD) sono dischi di diametro 12 cm in materiale riflettente con un rivestimento protettivo chiaro.
• Le informazioni si memorizzano creando minuscoli fori sulle superfici riflettenti e si recuperano tramite un raggio laser
(rosso) che rileva le irregolarità sulla superficie quando il disco gira.
• La traccia è una sola e gira a spirale sulla superficie del disco, come il solco dei dischi in vinile, ma in senso contrario,
cioè dal centro verso l’esterno.
• La traccia è divisa in settori da 2 KB
• I Digital Versatile Disc (DVD) sono costituiti da più livelli
semitrasparenti che funzionano come superfici distinte
quando vengono lette da un raggio puntato con precisione, e
sono molto più capaci dei CD.
• I Bluray Disc (BD) sono letti tramite un laser la cui luce
rientra nello spettro blu-viola (e non rosso), che può
focalizzarsi con precisione altissima, per cui tali dischi
possono essere capaci anche 5 volte più dei DVD.
- Unità flash
• Una delle caratteristiche comuni ai sistemi di memoria di massa basati sulle tecnologie magnetica e ottica è che per
recuperare i dati è necessario un movimento fisico.
• Sono enormemente lenti rispetto ai circuiti elettrici della memoria RAM, per esempio.
• La tecnologia flash memorizza i bit inviando segnali elettrici direttamente al dispositivo di memorizzazione, dove gli
elettroni vengono intrappolati in piccole celle di biossido di silicio, alterando così le caratteristiche di piccoli circuiti
elettrici.
• Le celle possono contenere gli elettroni per molti anni anche senza alimentazione esterna, perciò tale tecnologia è ideale
per la memorizzazione portatile e non volatile dei dati.
• I dati si indirizzano in piccoli gruppi ma le cancellazioni ripetute danneggiano progressivamente le celle di biossido di
silicio, dunque questa tecnologia non è adatta ad utilizzi in cui il contenuto si riscrive più volte al secondo.
• Non è sensibile agli shock fisici, dunque è perfetta per gli utilizzi portatili:
Dischi per laptop e portatili
Schede di memoria Secure Digital (SD)
Piccoli dispositivi USB
• Dischi a stato solido (SSD), o unità flash di grandi capacità, possono sostituire le unità disco magnetiche, con i vantaggi
di maggiore resistenza, minore rumorosità, e minori tempi di accesso. Ma sono ancora molto più costosi e hanno un
periodo di vita limitato.
- Sistema operativo
• Un programma (scheduler) si occupa dell’ordine con cui i programmi devono essere in esecuzione
• Con la multiprogrammazione e il time sharing si riducono i tempi medi di attesa e ogni utente ha la sensazione di essere
l’unico utente del sistema.
- Processi
• Un programma in esecuzione prende il nome di processo
• Un processo attraversa varie fasi:
New: viene allocato lo spazio in memoria
Ready: il processo è pronto, ed aspetta il suo turno
Running: il processo utilizza la CPU
Waiting: il processo attende il completamento di un’operazione di I/O
Terminated: viene liberato lo spazio in memoria
• C’è sempre un solo processo running (per ogni CPU)
• Ci sono in genere molti processi ready o waiting
- Problema: frammentazione
• Con la multiprogrammazione si alloca ad un processo uno spazio della
dimensione del processo stesso
• Quando i processi finiscono si creano dei buchi (holes) in memoria
• Resta, dunque, a volte anche parecchio spazio disponibile in memoria ma
non utilizzabile perché non contiguo
Si verifica il fenomeno della FRAMMENTAZIONE.
- Soluzione: swapping
• L’idea è di conservare:
in memoria centrale solo la pagina con la sezione di codice da eseguire
in memoria di massa il resto delle pagine
• Un programma del sistema operativo (swapper) si occupa della sostituzione delle pagine in memoria.
• La memoria virtuale è allora lo spazio di indirizzamento effettivamente utilizzabile dall’utente:
Lo scambio tra memoria centrale e disco è automatico;
Lo spazio logico degli indirizzi è più grande dello spazio fisico.
• In questo modo un maggior numero di processi può concorrere all’uso della CPU.
• NOTA: Sono meccanismi analoghi a quelli per lo scambio di informazioni tra memoria principale e memorie cache, che
convivono apparendo come un unico sistema di memoria centrale.
- File system
• Dal punto di vista dell’utente, le informazioni sul disco sono organizzate in strutture
chiamati file, che possono essere distribuiti su più settori.
• Il file è la più piccola unità di memoria secondaria accessibile agli utenti, tutti i dati
presenti nella memoria secondaria devono essere organizzati in file.
• Un sistema operativo può gestire milioni di file, di differenti utenti, di tipi
differente, necessità di organizzare logicamente i file.
• L’organizzazione logica dei file di un sistema operativo è chiamata FILE SYSTEM.
• Il File system organizza i file e gestisce l’accesso ai dati.
• È responsabile dell’integrità dei file e della gestione dei metodi di accesso
(lettura/scrittura).
• Nasconde all’utente l’organizzazione fisica del disco.
• Dà all’utente una visione dei file indipendente dai dispositivi fisici.
• Lo strumento più comune usato per realizzare un file system è la directory (o cartella).
• Di solito, gli elementi di una directory possono essere file o altre directory in maniera da creare una struttura ad albero
• Una directory principale (root directory, master file directory) indica la radice dell’albero dalla quale partono le
directory di secondo livello.
• Windows e Unix sono organizzati in questo modo.
- Pseudolinguaggi
• In generale la scrittura di un algoritmo (prima che diventi programma per una macchina) avviene in una sorta di
«versione rilassata» di un linguaggio di programmazione, che consente di esprimere informalmente le idee e descriverle
in maniera sufficientemente chiara.
• Questo passaggio è estremamente utile quando l’algoritmo da progettare è molto grande e complesso, troppo per stare
tutto costantemente nella mente umana.
• Pseudolinguaggi molto usati sono quelli che vengono dall’Algol o dal Pascal.
• Quello che vedremo più avanti lo chiameremo Pascal-Like.
• Sono diventati recentemente molto usati anche pseudolinguaggi più simili a Java e C, in quanto per molti programmatori
sono i più facili da leggere.
• Uno pseudocodice deve avere una notazione coerente e concisa per la rappresentazione delle strutture semantiche
ricorrenti (dichiarazione, assegnazione, confronto, operazioni elementari, cicli…).
- Flow Chart
ALGORITMO
Sequenza di istruzioni non ambigue che in un numero finito di passi risolvono una
classe di problemi.
Un primo pseudolinguaggio per descrivere un algoritmo è il flow chart
Gli elementi del linguaggio sono:
• Ovale (inizio e fine);
• Rettangolo (comandi);
• Rombo (verifica condizione);
• Rettangolo con angolo tagliato (Input);
• Foglio (Output).
ESEMPIO
Problema: calcolare la circonferenza del cerchio per molteplici valori del raggio:
Raggio = 1 SOLUZIONE: circonferenza = 2 ∗ 𝜋 ∗ 1
Raggio = 2.5 SOLUZIONE: circonferenza = 2 ∗ 𝜋 ∗ 2.5
Raggio = 5 SOLUZIONE: circonferenza = 2 ∗ 𝜋 ∗ 5
Alcuni dati in queste soluzioni sono costanti (2 e 𝜋): restano gli stessi per ogni esecuzione.
Altri dati sono variabili (raggio e circonferenza): il raggio sarà dato in input con la variabile R, la circonferenza in output
nella variabile C.
- Pascal-like
• La prima scrittura di un algoritmo, prima ancora che diventi un codice in un linguaggio
comprensibile da una macchina, dovrebbe avvenire sempre in un linguaggio generale ma
che costringa allo sforzo di astrazione e permetta poi di passare facilmente ad altri
linguaggi effettivi.
• Per questo scopo è stato inventato il Pascal like un linguaggio per la descrizione degli
algoritmi (anche chiamato pseudo-linguaggio) derivato dal Pascal, che costringe a
sviluppare algoritmi in maniera più strutturata del semplice flow chart.
• L’istruzione read R legge un valore dall’unità di input e lo assegna alla variabile R
• L’istruzione print C visualizza sull’unità di output il contenuto della variabile C
• In Pascal-like l’istruzione di assegnazione è in genere indicata con la notazione:=.
Qui e in seguito scriviamo solo = per mantenere la somiglianza con Python.
• In Pascal-like le variabili devono essere dichiarate PRIMA che cominci il programma.
• In una istruzione del tipo «R = P» come distinguere i due casi seguenti?
# Assegna a R il contenuto della variabile P # Assegna a R il carattere P (costante)
• In una istruzione del tipo «C = 6», come distinguere i due casi seguenti?
# Assegna a C il numero intero 6 (costante) # Assegna a C il carattere 6 (costante)
• Bisogna stabilire modi diversi di riferirsi a costanti diverse, e che siano anche diversi dalla scrittura dei nomi di variabili.
• Le costanti di tipo carattere sono racchiuse tra una coppia di apici. # Esempio: ‘casa’, ‘Napoli’, ‘Maria’
• Le costanti di tipo logico sono racchiuse tra una coppia di punti.
# Esempio: .true. , .false.
• Le costanti di tipo intero sono sequenze di cifre eventualmente con segno.
# Esempio: +80, -45, 981
• Le costanti di tipo reale sono sequenze di cifre con il punto decimale.
# Esempio: 45.23, 0.0032, -23.12,
• Per il tipo reale è possibile utilizzare anche la notazione esponenziale.
# Esempio: 12.3e5, 0.e0, 0.1e-6
• Nell’algoritmo per il calcolo della circonferenza il valore del simbolo (costante) 𝜋 è ambiguo.
• Specificando il valore come una costante di tipo reale si ottiene la versione finale dell’algoritmo.
• L’assegnazione di un valore ad una variabile può avvenire in due modi.
• Tramite lettura (istruzione read).
• Tramite assegnazione (operatore =).
• Utilizzando una ulteriore variabile (PG), l’algoritmo per il calcolo della circonferenza
può essere riscritto come riportato.
• Tutte le variabili devono essere definite prima di essere utilizzate.
• Il valore dell’espressione deve essere dello stesso tipo di quello della variabile a cui è
assegnato. Se PG fosse stata dichiarata di tipo intero, sarebbe stato un errore assegnargli
un valore reale.
• Nella definizione di una variabile, prima si valuta l’espressione al secondo membro, e dopo si
assegna il valore ottenuto alla variabile al primo membro.
• Una variabile può essere utilizzata più volte ridefinendo il suo valore nel corso dell’algoritmo.
-
- PASCAL-
LIKE:
strutture di
controllo
• Spesso in un algoritmo occorre eseguire operazioni diverse a seconda del valore (vero o falso) di una condizione logica.
ESEMPIO:
Trovare il massimo tra due numeri.
Dati di input: i due numeri (A e B)
Dati di output: il massimo (MAX)
Idea: si confrontano i due numeri (A e B). Se il primo è maggiore del secondo il massimo
(MAX) è A, altrimenti è B.
Come si realizza?
• In Pascal like la struttura di selezione è realizzata con la struttura
if-then-else-endif.
• In generale:
1. Viene valutata l’espressione logica (if)
2. Se è vera viene eseguito il blocco di istruzioni prima di else (Istr 1)
3. Se è falsa viene eseguito il blocco di istruzioni dopo di else (Istr 2)
• L’istruzione endif segnala la fine della struttura.
Nella valutazione dell’espressione logica è possibile verificare la veridicità di una o più condizioni
basate su operatori relazionali
> (maggiore) < (minore) == (uguale) /= (diverso)
combinate tra loro mediante operatori logici
AND OR NOT. In Pascal-like l’istruzione di assegnazione è in
Esempio: genere indicata con la notazione := e
l’espressione per il controllo dell’uguaglianza
(A > B) AND (X == 0)
si indica con il semplice =. Qui e in seguito
• Il risultato dell’espressione logica deve scriviamo solo = per le assegnazioni e == per i
essere sempre vero o falso. controlli di uguaglianza, per mantenere la
• Gli operatori relazionali vengono valutati somiglianza con Python.
prima degli operatori logici.
+ PYTHON INRODUZIONE
Algoritmo
SOMMA DI 5 NUMERI
Algoritmo
Somma di N numeri
Esempio
Qual è il risultato della
somma se nell’algoritmo
Start=11,
Start=1 End=5, Step=-2?
End=N
Passo=1
+ PYTHON
IDEA
• Leggere un numero alla volta (NUM) e confrontarlo con la
variabile che contiene il massimo dei numeri esaminati (MAX).
• Se NUM è maggiore di MAX si cambia il valore di MAX.
• Occorrono 2 strutture innestate:
• «for – endfor» per leggere i numeri uno alla volta;
• «if-endif» per confrontare NUM e MAX. ESEMPIO
Input:
• N = 5 (la quantità di numeri
da esaminare)
• NUM = 5; 6; 1; 8; 2
Algoritmo Output:
Massimo tra N numeri • Il massimo MAX=8
Input:
• N (la quantità di numeri da esaminare)
• NUM = ogni volta un numero
Output:
• Il massimo MAX
+ PYTHON
LEZIONE 10: RIPETIZIONE PROGRAMMAZIONE + PYTHON
LEZIONE 11: VARIABILI STRUTTURATE E ARRAY + PYTHON
- PASCAL-LIKE: variabili strutturate
• Dati due vettori geometrici A e B di lunghezza N
A = (a1, a2, …, aN)
B = (b1, b2, …, bN)
• Calcolare il vettore C, somma dei precedenti due
C = (c1, c2, …, cN)
• Dove ci = ai + bi per ogni i=1, ..., N
• È necessario conservare tutti i valori di C
• Individuiamo con un singolo nome un insieme di dati organizzati secondo un fissato criterio
• Ogni dato viene trattato come una singola variabile
• VARIABILI STRUTTURATE
• Le variabili strutturate definiscono il modo di organizzare ed accedere in maniera efficiente gruppi di dati.
• Caratteristica comune: omogeneità degli elementi che compongono la struttura.
• Varie strutture dati: alberi, liste, pile, code, heap, … array.
- PASCAL-LIKE: array
• Gli array sono strutture dati che nascono con l’obiettivo di rappresentare in maniera efficiente i principali elementi del
calcolo scientifico:
• vettori e matrici
• Dimensione fissata (non modificabile)
• Tutti gli elementi sono dello stesso tipo
• Si accede agli elementi mediante un indice che indica la posizione del corrispondente elemento
• Osservazione: a secondo dei linguaggi l’indice può partire da:
• 1 (ad es. Fortran)
• 0 (ad es. C, C++, Java, Python)
• Come per tutte le variabili,
prima di utilizzare una struttura dati è necessario dichiararla.
• Dichiarare il tipo della struttura.
• Dichiarare il tipo di elementi.
• Esempio: var NOMI(6): array of character.
• Con la dichiarazione viene determinata la dimensione massima della
struttura.
• La dichiarazione permette al compilatore di riservare un adeguato spazio in
memoria per tutti gli elementi dell’array.
• Gli elementi di un array sono allocati in memoria in locazioni consecutive
(logicamente).
IDEA
Algoritmo
Esaminare uno alla volta gli N elementi
Calcolare il
dell’array e incrementare una variabile C
numero di
quando si trova un elemento nullo
ricorrenze
dell’elemento O
in un array
Input:
• N (la lunghezza
EFFETTIVA dell’array A)
• A vettore di N numeri
Output: Il numero di
elementi nulli C
• Mediante gli array è possibile trattare anche tabelle
• array a 2 dimensioni
Esempio
Per memorizzare i voti in varie materie di un gruppo di studenti è
necessaria una tabella dove
• Le righe rappresentano gli studenti
• Le colonne rappresentano i voti nelle diverse materie
Al momento della dichiarazione è necessario definire il numero di righe e il
numero di colonne che compongono l’array
Esempio
var voti(5, 3) : array of integer dichiara una array di interi di 5 righe e 3
colonne
Sono necessari due indici:
• Il primo indice identifica la riga
• Il secondo indice identifica la colonna
voti(i, j) si riferisce al j-mo voto dell’i-mo studente
( )( )( )
1 2 3 5 6 7 6 8 10
1 0 −1 + 0 1 0 = 1 1 −1
3 2 1 7 6 5 10 8 6
Per ogni elemento è necessario calcolare:
C(i,j) = A(i,j)+B(i,j) i=1,..,N j=1,..,N.
• ALGORITMO: scambio di due righe
Data la matrice A di ordine NxM, scambiare la riga r con la riga c.
Esempio: se N=4, M=3, r=2, c=4.
[ ] [ ]
1 3 7 1 3 7
2 4 8 1 1 2
A= → A=
9 7 0 9 7 0
1 1 2 2 4 8
Scambio di A (r, j) con A (c, j), per j=1, ...M.
DOMANDA
Cosa accade se il dato di input A=0?
Cosa accade se il dato di input B=0?
SOLUZIONE
Bisogna eseguire il test su B
PRIMA della divisione
La scelta dipende da
• Numero di iterazioni noto a priori;
• Necessità di verificare la condizione prima o dopo le istruzioni da
ripetere.
- PASCAL-LIKE: procedure
PROBLEMA:
• Siano dati due array di reali A e B rispettivamente di lunghezza N e M.
• Si vuole scrivere un algoritmo che calcoli il massimo MAX dei due valori medi MediaA e MediaB dei due array.
Esempio: N=8 M=10
A = (3; 6; 2; 9; 10; 1; 2; 5) --> MediaA = 4,75
B = (8; 3; 5; 2; 4; 9; 10; 0; 5; 7) --> MediaB = 5,3
MAX = 5,3
ALGORITMO:
1. Leggi N e l’array A
2. Leggi M e l’array B
3. Calcola la media MediaA dei valori di A
4. Calcola la media MediaB dei valori di B
5. Calcola il massimo MAX tra MediaA e mediaB
6. Stampa il valore di MAX
NOTA 1: Le istruzioni relative all’array B (blu) sono le stesse di quelle relative
all’array A (rosse): cambiano i dati su cui le istruzioni agiscono.
NOTA 2: Nel caso in cui il numero di array non sia 2 ma sia arbitrario,
contenuto di una variabile NUM data in input, non è possibile scrivere
l’algoritmo: quante volte scrivere il gruppo di istruzioni nell’algoritmo?
SOLUZIONE: trovare un modo per scrivere le istruzioni una sola volta e
riutilizzarle quando occorre.
• Si supponga di avere a disposizione un sottoalgoritmo MEDIA che ha come
• dati di input: un array e la sua lunghezza
• dati di output: la media degli elementi dell’array
• Si supponga inoltre che tale sottoalgoritmo MEDIA sia in grado di ricevere e
restituire dati ad un altro algoritmo.
• È possibile affidare il calcolo della media a tale sottoalgoritmo ogni volta che
occorre.
• Una procedura è un sottoalgoritmo richiamabile da un altro algoritmo in cui
l’input e l’output non avvengono mediante le istruzioni read e print, MA
scambiando dati con l’algoritmo chiamante
• Operativamente:
• rimozione delle istruzioni read e print;
• sostituzione dell’inizio dell’algoritmo con la testata della procedura
contenente i dati di input e output.
ESEMPIO
Sviluppare un algoritmo somma per la somma di due vettori C = A + B
• Si procede individuando i passi fondamentali ed esprimendoli sotto forma di
procedure, individuandone gli argomenti di input e output.
• Le procedure leggivettore e stampavettore rispettivamente leggono e stampano un
vettore.
• leggivettore
• Dati di input: nessuno
• Dati di output: un array e la sua lunghezza
• stampavettore
• Dati di input: un array e la sua lunghezza
• Dati di output: nessuno