Sei sulla pagina 1di 199

Introduzione allo sviluppo del sw e manuale Turbo Pascal versione 1.

0 Giugno 2005
INDICE
Alcune defnizioni importanti: calcolatore, sistema di elaborazione
elettronico, programmabilit, soluzioni hardware e soluzioni software.
Pag. 1
Logica cablata e logica programmata: soluzioni hardware e soluzioni
software a confronto.
Pag. 2
Dal problema al programma: ciclo di sviluppo (semplifcato del software Pag. 3
!tudio della situazione reale, analisi dei re"uisiti Pag. 3
Analisi dei dati Pag. 4
Algoritmo risolutivo# defnizione, caratteristiche# Pag. 5
Defnizione di programma, linguaggi di programmazione Pag. 6
$ase di codifca Pag. 6
$igura dell%analista, distinzione tra risolutore ed esecutore Pag. 7
$ase di test (alpha, beta e gamma test Pag. 7
$ase di debug Pag. 8
&elease e manutenzione Pag. 8
Dismissione Pag. 8
Architettura hardware e software di un sistema di elaborazione (cpu,
principali dispositivi interni "uali la AL', i registri, decoder
Pag. 9
(iclo di funzionamento di una ()' (fetch * decode * e+ecute Pag. 11
&appresentazione interna delle informazioni, giustifcazione della scelta
digitale
Pag. 14
&appresentazione delle istruzioni Pag. 15
,voluzione dei linguaggi di programmazione (codice macchina, assembl-,
assemblatori, cenni ai diagrammi di .usso
Pag. 16
Linguaggi ad alto livello Pag. 18
Di/erenza tra interpreti e compilatori Pag. 19
La catena della programmazione (editor0D, e programma sorgente Pag. 20
(ompilazione e sue fasi: controllo lessicale, controllo sintattico, codice
oggetto
Pag. 21
0l lin1er e le librerie Pag. 21
L%eseguibile fnale Pag. 22
!truttura di un programma pascal, intestazione ed identifcatori Pag. 23
!ezione dichiarativa# constanti e vantaggi del loro uso Pag. 24
2ariabili Pag. 24
3ipi di dati semplici e loro dominio, forma esponenziale dei .oating point,
codice A!(00
Pag. 25
!ezione esecutiva Pag. 26
Assegnamento, compatibilit di tipo Pag. 26
'so delle parentesi Pag. 27
)rincipali operatori e operatori relazionali utilizzabili suddivisi per tipo di
dato, tipi di errore (onver.ow, under.ow, operazione illegale
Pag. 27
3abella con l%ordine di precedenza di tutti gli operatori visti Pag. 29
(omandi di ingresso4uscita (readln e write4ln Pag. 29
(omandi per il controllo del .usso di esecuzione, programmazione
strutturata
Pag. 30
!elezione ad una via (if then Pag. 31
!elezione a due vie (if then else Pag. 33
'so di condizioni composte con i connettivi logici Pag. 33
!elezione a molte vie (case of Pag. 34
,sercizi riepilogativi sulla struttura selettiva Pag. 36
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1
Introduzione allo sviluppo del sw e manuale Turbo Pascal versione 1.0 Giugno 2005
!truttura iterativa enumerativa (for do Pag. 48
,sercizi riepilogativi sul ciclo for Pag. 50
!truttura iterativa indefnita repeat until Pag. 61
!truttura iterativa indefnita while do Pag. 63
,sercizi riepilogativi sul repeat e sul while Pag. 64
Approfondimento sui .ow chart Pag. 68
0 sottoprogrammi (procedure e funzioni Pag. 83
&egole di visibilit e durata Pag. 108
5li arra- Pag. 110
0 record Pag. 126
0 fles Pag. 131
La ricorsione Pag. 152
Limiti della memoria allocata staticamente Pag. 159
Allocazione dinamica della &A6 (implementazione completa del tipo di
dato astratto lista semplice
Pag. 160
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 2
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Calcolatore? Non solo
7el nostro corso useremo spesso la parola computer (calcolatore. ,d anche se "uesta 8 entrata ormai
a far parte del linguaggio comune, 8 assai riduttiva. 9uesto termine sarebbe infatti appropriato per
"uelle :macchinette: che tenete negli astucci e che sono in grado di svolgere giusto le "uattro
operazioni elementari, l;estrazione di radice e poco pi< (sto volutamente ignorando le cosiddette
calcolatrici programmabili che, di fatto, sono dei personal computer in miniatura, anche se con
funzionalit limitate.
!i dovrebbe infatti parlare di sistea !i ela"ora#ione elettronico !elle in$ora#ioni
%rograa"ile.
!o/ermiamoci su ogni termine:
!istema 0nsieme di componenti, ognuno con la sua specifca funzione, ma con uno scopo
comune: elaborare (si parla di =processing% dati forniti in ingresso (si parla di =input% e fornire
risultati (si parla di =output% adeguatamente presentati.
0n un moderno sistema di elaborazione elettronico possiamo individuare tra i componenti: il
microprocessore (ad esempio 0ntel )entium, A6D Athlon, la memoria di lavoro &A6, il disco fsso
(hard dis1, il monitor, la stampante ecc.
,laborazione >perazione (tra cui i calcoli che trasforma uno o pi< dati4informazioni in altri
dati4informazioni. 9uesti dati possono insomma essere s? tra loro sommati, sottratti ecc. (se sono
numeri# ma possono anche essere confrontati tra loro, spostati o copiati da un punto all;altro
della memoria, inviati ad un dispositivo per la loro visualizzazione (ad esempio il monitor o
stampa.
7>3A: un !ato 8 una misurazione di un aspetto della realt e diventa in$ora#ione solo "uando
sappiamo dare un signifcato ad esso (ecco allora che un numero da anonimo diventa un peso,
un;altezza, un punto di un;immagine sul video ecc.
,lettronico 'n%elaborazione pu@ avvenire anche in modo manuale (come "uando con carta e
penna si mette in ordine alfabetico un elenco di nomi.
!e l;elaborazione avviene senza l;intervento umano si parla allora di elaborazione automatica ( ad
esempio le macchine per lo smistamento della posta .
, se infne i dispositivi automatici non hanno parti meccaniche movimento ma sono costituiti da
circuiti elettrici si parla di elaborazione elettronica (il microprocessore che somma due numeri.
)rogrammabile (on le macchinette calcolatrici non potrete fare altro che i calcoli previsti dal
costruttore. 7on c;8 modo infatti di istruire "uel piccolo congegno a svolgere calcoli diversi. Allo
stesso modo in cui non potete ottenere altro da una lavatrice che le se"uenze (programmi di
lavaggio previste dal costruttoreA , cos? come con una lavatrice potrete lavare solo panni, allo
stesso modo con una calcolatrice potrete usare solo numeriA
'n computer, invece, 8 dotato di una memoria di lavoro elettronica (&A6, &andom Access
6emor-, 6emoria ad accesso casuale in cui possono essere rappresentati numeri, lettere,
immagini e suoni.
7on solo: la memoria contiene anche la se"uenza delle istruzioni che il microprocessore deve
eseguire per svolgere un certo compito (il %rograaA B suCciente caricare (dall;hard dis1, dal
(D, dal D2D ecc. una diversa se"uenza di istruzioni per avere una macchina elettronica in grado
di svolgere un compito anche completamente diverso dal precedente.
3utto sommato, il ciclo di funzionamento di un sistema di elaborazione elettronico programmabile
(ehm, computer d;ora in avanti e solo per comodit 8 assai semplice: prelievo dalla &A6 dalla
prossima istruzione da eseguire, interpretazione dell;istruzione (cosa deve essere fattoD 9uali altri
componenti devono essere attivati ed in che modoD esecuzione (attivare nella giusta se"uenza i
componenti elettronici coinvolti. !i parla di ciclo di fetch (prelievo, decode (decodifca ed
execute (esecuzione.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
N&'() a%%ro$on!irete *+esti argoenti nel corso %arallelo !i ,sistei-
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 2
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
.ogica ca"lata e logica %rograata
9uando un dispositivo elettronico viene costruito in modo da poter funzionare senza un programma (i
circuiti sono scelti e collegati per dare sempre la stessa gamma di risposte viene defnito in logica
ca"lata (dalla parola inglese cable, cavo, flo.
'n altro esempio (avevamo gi visto "uello della lavatrice 8 rappresentato da un orologio digitale di
prima generazione (che di/erenza della lavatrice non presenta parti elettromeccaniche. 0n un orologio
di "uesto tipo non 8 presente alcun microprocessore e nessun programma: i circuiti sono stati stampati
per reagire in modo prefssato alla pressione dei tasti (reset, regolazione orario4data ecc. e per
incrementare l%orario4data.
> ancora: una )la-!tation costruita (per assurdo in logica cablata vi consentirebbe di giocare a "uel
solo gioco corrispondente a "uella particolare predisposizione di dispositivi elettronici e relativi
collegamenti elettrici.
9uando invece 8 presente un microprocessore che esegue istruzioni prelevate da una memoria si parla
di logica %rograata. !pesso la memoria pu@ essere riscritta (come avviene in tutti i personal
computer e il programma 8 cambiato piacere. ,cco allora che il computer pu@ di volta in volta
diventare l;e"uivalente elettronico di una macchina da scrivere (Eord, di una super calcolatrice
(,+cel, simulatore di calcio ($0$A e similiA ecc.
, le soluzioni che sfruttano una logica cablata vengono dette soluzioni /ar!0are (dove con "uesto
termine si indicano le parti fsiche di un sistema di elaborazione# in inglese il termine signifca
letteralmente = ferraglia%. 9uelle che sfruttano invece una logica programmata sono dette soluzioni
so$t0are (i dati e le istruzioni memorizzate sottoforma di un segnale elettrico chiaramente
impalpabile, morbido, soft (che signifca appunto = soCce%.
La soluzione software 8 pi< .essibile: se viene trovato un errore 8 suCciente cancellare "ualche
istruzione e la memoria e sostituirle con "uelle corrette. Lo stesso accade nel caso si decida di
apportare migliorie o adattare il programma a causa, per esempio, di una legge cambiata. 0n un
circuito, invece, se viene trovato un errore "uesto pu@ comportare lo scarto dell;intero circuito stesso e
la realizzazione di un circuito completamente nuovoA
La rigidit delle soluzioni hardware sembrano relegare "ueste ultime ad un ruolo di secondo piano
rispetto alle soluzioni software, ma hanno almeno un grosso pregio che potrebbe essere determinante:
la rapidit nel fornire la rispostaA 6ancando infatti il microprocessore e non essendoci codici
d;istruzione da prelevare nella &A6 nF decodifche da e/ettuare, i dati in input sono trasformati in
"uelli di output ad una velocit molto superiore rispetto ad un programma che compie la stessa
elaborazione.
7el nostro corso ci occuperemo di trovare soluzioni software ai problemi che a/ronteremo. , l;attivit
di programmazione non 8 l;unica da mettere in gioco per risolvere un problema.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. '
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Dal %ro"lea al %rograa 1 ciclo !i s2il+%%o 3se%li4cato5 !el so$t0are
La scrittura del programma 8 solo una delle fasi del processo di sviluppo di un;applicazione
informatica. 3utto inizia con l;esigenza di risolvere un problema con un sistema informatico. La parola
problema deve essere intesa in modo ampio: gestire la contabilit di un;azienda, usare il personal
computer per scrivere documenti, per una simulazione di guida, per svolgere calcoli complessi,
controllare un processo industriale, pilotare un robot eccetera.
)er "uanto ci riguarda, i problemi saranno espressi in forma testuale. ,cco il testo dell;esame di !tato
del GHHI:
Una galleria d'arte ha deciso di creare un sistema che consenta ai suoi clienti di
consultare da casa il catalogo: dei quadri, tramite accesso a una pagina web che
la galleria pu creare presso un fornitore di servizi telematici.
er ogni quadro ! compilata una scheda che riporta l'autore, il titolo, la tecnica
"olio, tempera ecc.#, le dimensioni, il prezzo. $a consultazione del catalogo: pu
avvenire o semplicemente scorrendo avanti e indietro le schede in ordine
alfabetico oppure cercando uno speci%co autore.
&l candidato, fatte le ipotesi aggiuntive che ritiene necessarie,
'# proponga una soluzione per la creazione del sistema illustrandone la struttura a
blocchi e indicando una soluzione di principio per ciascun blocco(
)# proponga e illustri una struttura per il *ata +ase dei quadri,
,# sviluppi in dettaglio la soluzione per almeno una delle seguenti funzioni,
codi%candone un segmento con uno strumento software di sua conoscenza:
a# creazione del *ata +ase,
b# creazione di una semplice pagina web della galleria,
c# interfaccia per consentire al cliente la consultazione del catalogo: e la visione
delle singole schede,
-# facoltativamente proponga una soluzione di principio per realizzare un sistema
che consenta di mostrare al cliente non solo la scheda di catalogo, ma anche una
fotogra%a del quadro.
0l testo va dapprima ha studiato per evidenziare parti poco chiare (sulle "uali sar necessario prendere
delle decisioni ed eventualmente fare ipotesi aggiuntive su aspetti per i "uali il testo non dice come
comportarsi.
Ad esempio, nel testo si parla di prezzo del "uadro ma non viene indicata la
valuta da utilizzare. 'na galleria d;arte spesso a clienti stranieri, per cui la
soluzione di proporre il prezzo in lire (siamo nel =HI... e l;euro non esisteva
ancora e neppure l;obbligo di esporre il doppio prezzo in euro ed in lire forse
non 8 ottimale. ,cco allora la prima ipotesi aggiuntiva (o, se preferite, un primo
chiarimento: i prezzi verranno indicati sia in lire che in dollari.
9uesta fase viene chiamata studio della situazione reale. La letteratura informatica fa riferimento a
"uesta fase anche con il nome di analisi (termine per@ non corretto da un punto di vista matematico.
7aturalmente noi inizieremo con problemi e testi assai pi< semplici. Ad esempio: calcolare la spesa in
euro per una settimana di viaggi andata e ritorno da casa a scuola. Le uniche cose da chiarire
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. )
1
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
potrebbero essere: 8 necessario percorrere strade con pedaggiD 0l numero di chilometri del percorso in
andata 8 identico a "uello del ritornoD
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 5
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
2engono anche presi in considerazione i re*+isiti (cosa deve fare il programma, con "uali vincoli di
velocit, occupazione di memoria, hardware e software a disposizione, se deve funzionare in rete, se
deve sapere interoperare con altri software magari su piattaforme hardware diverse, se deve
funzionare in real time, se deve essere portabile in altri ambienti hardware4software, , che grado di
robustezza, che grado di sicurezza, che tipo di periferiche deve supporatare ecc.
Devono poi essere individuate tutte le informazioni che 8 necessario gestire. 9ueste spesso verranno
memorizzate in una banca dati (data base. 0l risultato di "uesta fase viene di solito sintetizzato con
uno schema che evidenzia i cosiddetti insiemi entit. e le relazioni tra esse.
Ad esempio, 8 possibile individuare l;insieme entit dei "uadri e "uello dei pittori:
)er ogni insieme entit vengono anche indicati gli attributi che descrivono un esemplare di "uell%
insieme. Ad esempio, per l;insieme entit dei pittori si decide che ogni pittore verr descritto tramite
un codice, un nome ed una data di nascita. >gni "uadro verr invece descritto da un codice e da un
titolo. La freccia che da pittori e raggiunge quadri sta ad indicare che per ogni pittore esiste un certo
numero di "uadri. 7ella banca dati verr creata una tabella =pittori% che conterr su ogni sua riga i dati
di un pittore e similmente per i "uadri. >gni "uadro potrebbe essere associato al suo pittore indicando
nel "uadro il codice del pittore.
9uesta fase viene chiamata analisi dei dati.
Anche per "uesta fase inizieremo con situazioni molto semplici. )roseguendo con l;esempio di
problema presentato al punto uno, non 8 diCcile convincersi che i dati di cui abbiamo bisogno sono:
costo di un litro di carburante, numero di chilometri tra la casa e la scuola, numero di chilometri che il
mezzo utilizzato compie con un litro di carburante, costo di eventuali pedaggi.
)er "ueste semplici situazioni uno schema come "uello appena visto 8 esagerato. (i accontenteremo
di elencare i cosiddetti dati in ingresso (input# il programma li elabora (processing per produrre i
risultati, i dati in uscita (output.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. *
Pittori
Codice
pittore
nome
Data di
nascita
Quadri
Codice
quadro
Titolo
2
costo di un litro di
carburante
chilometri tra casa e scuola
chilometri 4 litro del mezzo
costo di eventuali pedaggi.
INPUT
,laborazione svolta dal
programma
ELABORAZIONE
costo di un litro di
carburante
chilometri tra casa e scuola
chilometri 4 litro del mezzo
costo di eventuali pedaggi.
OUTPUT
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Deve essere molto chiara una cosa: per dati in input si intendono "uelli in!is%ensa"ili, "uelli cio8 che
il computer non pu@ calcolare o derivare in altro modo. $acciamo un esempio: se ad un certo punto in
un programma abbiamo disposizione una "uantit espressa in ore e per proseguire 8 necessario
esprimerla i secondi, non cediamo alla pigrizia chiedendo a chi sta usando il programma di inserire
"uesto valore usando la tastiera, pretendendo che sia lui a fare la conversioneA !ar invece il
programma a calcolare autonomamente il valore richiesto moltiplicando per JKLL il numero delle ore...
7>3A: non 8 raro il caso di alunni in diCcolt al momento di individuare i dati in input. 0ntanto diciamo
che non 8 necessario avere la certezza di averli individuati proprio tutti per poter proseguire: 8
normale, dopo avere individuato i pi< importanti ed evidenti, iniziare la fase successiva (trovare un
;modo; di utilizzare i dati in input per giungere alla risultato# si ad un certo punto ci si accorge che
manca "ualche dato per poter proseguire lo si aggiunger semplicemente ai dati di input.
B arrivato il momento di descrivere il modo in cui i dati di input devono essere utilizzati per ottenere i
risultati. 9uesta ;descrizione; 8 chiamata algorito.
Da =Ei1ipedia%, l%enciclopedia libera (http:44it.wi1ipedia.org, con "ualche piccolo adattamento:
0l termine (algoritmo deriva dal nome del (grande matematico arabo AlMNhwarizmiO,
che pubblic@, tra gli altri, il libro dal "uale prende le origini la parola Algebra (ora
sapete chi odiare. 7ei suoi libri ne scrive anche i procedimenti per portare a termine
alcuni tipi di calcolo: "uesti procedimenti presero il nome di algoritmi.
7ella sua defnizione pi< semplice ed intuitiva un algoritmo 8 una se"uenza ordinata di
passi semplici che hanno lo scopo di portare a termine un compito pi< complesso (una
ricetta da cucina, ad esempio, pu@ essere considerata come un algoritmo che partendo
da un insieme di singoli alimenti di base ed eseguendo una se"uenza di passi, produce
come risultato un piatto composto.
In +n o!o %i6 $orale7 %ossiao *+in!i !e4nire l8algorito
coe +na se*+en#a or!inata e 4nita !i istr+#ioni c/e7 !ato +no
o! +na serie !i eleenti in in%+t7 %ro!+ce +no o! +na serie !i
ris+ltati in o+t%+t .
!e"uenza ordinata signifca che esiste un ordine preciso in base al "uale vengono
eseguite le istruzioni (d;altronde sarebbe ben diCcile prima sbattere un uovo e poi
rompere il guscioA.
!e"uenza fnita signifca che le istruzioni possono essere anche veramente tante, ma
non in numero limitato# inoltre il numero di volte che globalmente "ueste istruzioni
vengono eseguite non pu@ essere illimitato.
La se"uenza delle operazioni deve essere chiara, mai ambigua, deve avere un ordine
ben preciso, e deve giungere a termine per ogni input. 3utte le istruzioni devono
comportare delle azioni tra "uelle che l%esecutore 8 in grado di svolgere. 0l risultato di
un algoritmo deve essere sempre uguale indipendentemente da chi lo esegue.
!e, come visto, una ricetta da cucina rappresenta un discreto esempio di algoritmo
direttamente eseguibile da un essere umano, l;istruzione :aggiungere sale "uanto
basta: diCcilmente sar comprensibile per una macchina (ma anche tra gli umani
stessi "uel = "uanto basta% verrebbe sicuramente interpretato in tanti modi diversiA.
'n passo di un algoritmo pu@ essere defnito anche tramite un altro algoritmo
(chiamato in "uesto caso sottoalgoritmo, che suddivide il compito in compiti ancora
pi< elementari. $acciamo un esempio: l;algoritmo :va dal salotto alla cucina: si
compone in realt delle seguenti istruzioni:
esci dal salotto
curva a sinistra
prosegui per il corridoio fno all;ultima porta sulla sinistra
attraversa la porta a sinistra
9uesto 8 certamente fn troppo esplicito per un operatore umano (al "uale gi il
problema originale :va dal salotto alla cucina: sembra probabilmente abbastanza
elementare da non richiedere, in apparenza, suddivisioni, ma nel caso di un robot
richiederebbe di specifcare i passi con ben altra (minore complessit.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. +
3
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
L;algoritmo :attraversa la porta a sinistra: si compone di:
controlla se la porta 8 aperta
nel caso che la porta sia aperta salta il passo seguente
apri la porta
avanza di un metro
L;algoritmo :apri la porta:, compreso nel precedente, a sua volta si compone di:
protendi il braccio
a/erra la maniglia
rotea la mano di JL gradi in direzione antioraria
applica una pressione alla maniglia diretta di fronte a te
...
'n modo dettagliato di rappresentare l;algoritmo :attraversa la porta a sinistra: 8
allora il seguente:
controlla se la porta 8 aperta
nel caso che la porta sia aperta salta il passo seguente
apri la porta
protendi il braccio
a/erra la maniglia
rotea la mano di JL gradi in direzione antioraria
applica una pressione alla maniglia diretta di fronte a te
...
avanza di un metro
'na breve analisi dell;esempio sopra, porta a delineare alcune caratteristiche essenziali
di un algoritmo:
non ambiguo: le istruzioni devono essere univocamente interpretabili#
eseguibile: ogni istruzione deve terminare in tempo fnito.
0noltre, in informatica, si richiede generalmente che un algoritmo sia fnito, ovvero
termini per ogni insieme di dati di ingresso.
'n algoritmo non 8 tale se risolve in un caso particolare di un problema: deve essere utile per
la soluzione di un;intera classe di problemi. $acciamo un esempio: il procedimento che serve a
calcolare l;area del triangolo la cui base misura J m e l;altezza P m, e solo l;area di "uesto
triangolo, non pu@ defnirsi un algoritmo. 0l procedimento invece che descrive come calcolare
l;area di un "ualsiasi triangolo nota la misura della base e dell;altezza, risolve un;intera classe
di problemi (8 una soluzione generale e pu@ defnirsi algoritmo.
'n %rograa 8 la traduzione di un algoritmo in un blocco di istruzioni eseguibili
automaticamente da un sistema di elaborazione elettronico.
Arrivati a "uesto punto dobbiamo confrontarci con l;assoluta inadeguatezza del linguaggio
parlato (il cosiddetto linguaggio naturale per descrivere un algoritmo. Qanalizzo con un
classico esempio:
la vecchia porta la sbarra
9uale signifcato deve essere dato "uesta fraseD !i tratta forse di un;anziana signora china
sotto il peso di una pesante sbarraD > si sta parlando di uscita sbarrata da una vecchia portaD
9uesta ambiguit 8 inaccettabile per un computer: esso deve sapere esattamente come
comportarsi e deve produrre sempre gli stessi risultati se gli vengono sottoposti gli stessi dati
in input.
B necessario servirsi di linguaggi formali, cio8 rigorosamente defniti. 9uesti tipi di linguaggio
sono di solito molto meno ricchi di vocaboli e di regole sintattiche ma hanno il grosso pregio di
non essere ambigui (ogni istruzione 8 chiara, ha un solo signifcato e produce sempre lo stesso
risultato.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ,
4
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
9uesti linguaggi sono chiamati linguaggi di programmazione. La fgura professionale che si
occupa della scrittura dei programmi 8 il %rograatore. la fase di scrittura di un
programma 8 detta di co!i4ca (il programmatore scrive il codice del programma
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. -
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
7on 8 detto che sia il programmatore a studiare il problema e ad ideare l;algoritmo risolutivo: la fgura
professionale specializzata in "uesti compiti preliminari e fondamentali 8 chiamato analista. ,%
certamente vero che il ruolo dell;analista e del programmatore possano essere svolti dalla stessa
persona. )er compiere una buona analisi 8 necessaria molta esperienza, ed 8 per "uesto che spesso si
nasce ;semplici; programmatori per poi diventare analisti o analistiMprogrammatori.
il ruolo del programmatore ; puro; 8 "uello allora di ricevere dall;analista la descrizione dell;algoritmo
per provvedere alla codifca (cio8 scrittura di "uest;ultimo usando un linguaggio di programmazione.
3orneremo presto sulla "uestione della descrizione degli
algoritmi: 8 il tema portante di "uest;anno scolasticoA
7>3A: 8 corretto fare distinzione tra il risol+tore di un problema (colui che ha ideato l%algoritmo che lo
risolve e l-esec+tore materiale dei passi dell%algoritmo. 7el nostro caso il risolutore 8 sempre un
uomo4donna e l%esecutore 8 il computer.
3erminata la scrittura del programma inizia la fase di test. !ottoporre a test un programma
signifca provarlo con tutte le confgurazioni di dati in input normali e particolari. Di nuovo,
facciamo un semplice esempio immaginando di avere scritto un programma che, forniti due
numeri in input, calcola che percentuale 8 il primo rispetto al secondo# ad esempio se il primo
numero fosse PL ed il secondo GPL, il risultato fornito dovrebbe essere JJ,J R periodico (PL 8
infatti un terzo di GPL.... 7on 8 diCcile convincersi che nel programma la formula usata 8:
(primo numero4secondo numeroSGLL
$are il test di "uesto programma con confgurazioni di dati in input ;normali;, signifca provare il
programma con coppie di numeri tipo (GL,TL (PL,GPL eccetera. )oi ci si potrebbe domandare se il
programma fornisce risultati corretti anche "uando il primo numero 8 maggior dal secondo: (TUL,KL# e
scopriremo che la risposta 8 s?: otterremo come valore ULLR (in e/etti, TUL 8 il "uadruplo di KL. , se
usassimo numeri negativiD 7essun problema...
>1, 8 arrivato il momento di essere cattivi: e se usassimo numeri decimaliD 3ipo (GL.T, HV.P D , se il
primo numero fosse zero: (L, JUD Anche con "ueste confgurazioni di valori in input il programma
continua a fornire risultati corretti. 5iunti a "uesto punto, il programmatore inesperto (o pigro
potrebbe concludere che il programma funziona bene in tutti i casi possibili. )urtroppo, la matematica
c;insegna che non 8 possibile dividere per zero: inserendo una confgurazione di input con il secondo
uguale a zero, come in (VT,L, il programma andrebbe letteralmente tiltA 5li informatici in "uesti casi
usano un;espressione assai colorita: il programma va in crashA
0l caso dello zero come secondo numero 8 un cosiddetto caso liite: ogni programma dovrebbe
essere testato in tutti i casi limite che potrebbero presentarsi, anche se con probabilit molto bassaA
La fase di test viene di solito suddivisa a sua volta in:
alpha test: 8 "uello svolto direttamente dal programmatore che ha scritto il codice o comun"ue
da personale interno alla ditta che commercializzer il software# potremmo dire che in "uesta fase
vengono trovati gli errori pi< grossolani#
beta test: "uando il software viene ritenuto suCcientemente stabile viene distribuito, di solito
gratuitamente, ad un numero ristretto di utenti che, in cambio del benefcio di poter disporre in
anteprima del prodotto "uasi fnito, comunicheranno secondo protocolli stabiliti una descrizione
degli errori che capitano durante l;utilizzo# se il prodotto 8 particolarmente complesso, il numero
dei beta tester, pu@ essere elevato: ad esempio, "uando la 6icrosoft rilascia per il beta test una
nuova versione di Eindows lo fa anche a decine di migliaia di utentiA
gamma test: a volte viene defnito un ulteriore livello che si di/erenzia dal precedente solo del
fatto che dovrebbe essere "uasi esente da errori
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 10
5
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
La fase di test ha lo scopo di evidenziare gli errori durante il funzionamento del programma, il che
non vuol dire per@ automaticamente sapere "uale istruzione ha causato il problema.
La fase di !e"+g indica invece l;attivit del programmatore volta ad individuare esattamente la
porzione di codice che contiene l;errore in modo da poter eliminare.
>gni volta che si scopre un errore 8 necessario ritornare alla fase di codifca per modifcare il codice.
A33,7W0>7,AA 'na delle cattive abitudini pi< comuni 8 "uella di non testare nuovamente il programma
dopo l;eliminazione di un errore. )urtroppo l;esperienza insegna che, non cos? raramente come si
potrebbe pensare, le modifche apportate per correggere un errore ne introducono altriA
$inalmente il codice pu@ essere immesso sul mercatoA !i parla di rilascio (release. 6a non 8 fnita
"uiA Anzi, rapportato a GLL, il totale dell;impegno rappresentato da "ueste fasi viene stimato da molti
come non superiore al ULR
,d il resto D !iate sinceri: "uante volte vi 8 capitato di ac"uistare un video game senza essere costretti
ad applicare una cosiddetta patch (letteralmente pezza, correzione. 9uante volte come utenti siamo
rimasti in attesa dell;ennesimo service pac/ (un 1it che contiene molte patch =in un colpo solo% di
Eindows o di >Cce o di altri softwareD 6a anche senza errori, ogni anno vengono immesse sul
mercato nuove versioni ("ualcuno riesce a contare "uelle della serie $0$AD o di $inal $antas-D.
0l KLR che manca di tutto il costo per lo sviluppo del software viene fagocitato dalla cosiddetta
an+ten#ione. (i sono tre tipi di manutenzione:
correttiva: anche dopo aver superato tutte le fasi di test, 8 "uasi impossibile che un software non
contenga ancora almeno un errore# periodicamente, "uindi, vengono rilasciate versioni che si
spera siano di volta in volta meno a/ette da errori#
perfettiva o migliorativa: indica tutti "uegli interventi che non servono a togliere degli
errori ma a migliorare in "ualche modo il prodotto# ad esempio a renderlo pi< veloce, a
diminuire le sue esigenze di spazio sul disco, a renderlo capace di riconoscere nuove
periferiche, a compiere funzioni prima non previste eccetera#
adattiva o adattativi: nessun errore da togliere, nessun miglioramento da portare# ma un
cambiamento nel contesto in cui il software deve funzionare costringe ad apportare delle
modifche: il caso classico che si cita in "uesta situazione 8 la modifca di una legge che forza la
software house a rispettarla, a costo di pesanti modifche del codiceA
0nfne, "uando un;applicazione non 8 pi< utile (perchF superata da altre, perchF le modifche
richieste sono troppe, perchF un evento imprevisto la rende obsoleta eccetera se ne pu@ anche
decretare la morte, la dismissione.
&iassumendo:
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 11
6
7
8
1
Studio della
situazione reale
2
Analisi dei dati
3
Algoritmo/i risolutivo
4
Codifica
5
test
8
Dismissione
6
debug
7
Manutenzione
,% doveroso sottolineare che "uesto processo nel "uale io ho
individuato otto stadi non 8 l;unico modello riconosciuto per lo
sviluppo del software (e a dire la verit l;ho semplifcato rispetto
"uelli che trovate nella letteratura informatica. B per@ facile da
capire e si adatta bene alla maggior parte delle stazioni che ci
troveremo ad a/rontare. Di tanto in tanto ritorneremo su uno degli
stadi per aggiungere maggiore dettaglio.
Questo tipo di modello detto! per
e"identi moti"i! a cascata.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
(rc/itett+ra /ar!0are e so$t0are !i +n sistea !i ela"ora#ione
)er capire cosa sia un linguaggio di programmazione e come utilizzarlo per scrivere programmi, 8
prima necessaria una panoramica che mostri a grandi linee il funzionamento di un sistema di
elaborazione.
SCHEMA A BLOCCHI DI UN SISTEMA DI ELABORAZIONE
Nota: tec!ca"ete #a$%a&o' ! ()##o$t! &! "e"o$!**a*!oe &! "a((a
(oo aco$a #e$!+e$!c,e &! !#)t-o)t#)t. La %o$o !"#o$ta*a / #e$0
ta%e &a "e$!ta$e ) t$atta"eto a #a$te.
0l cuore del sistema 8 la ()' ((entral )rocessing 'nit, 'nit centrale di processo. 7ei personal
computer la ()' 8 rappresentata da un singolo chip (il microprocessore: )entium, (eleron, Athlon,
!empron, )ower)(, non vi dicono nulla "uesti nomiDD
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 12
R
A
M
C1U
1e$!+e$!c,e &!
!#)t 2ta(t!e$a3
1e$!+e$!c,e &!
o)t#)t 2"o!to$3
S)##o$t! &! "e"o$!**a*!oe
&! "a((a 2&!(c,!' a(t$!' CD3
1e$!+e$!c,e &!
!#)t - o)t#)t
2"o&e"3
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
La ()' 8 il =cervello% del sistema. 0l software di base (il Q0>! che controlla direttamente l%hardware,
windows4linu+ cio8 i sistemi operativi, gli strumenti di programmazione ed altre utilit di sistema ed
anche "uello applicativo (programmi di video scrittura, contabilit, giochi ecc. 8 formato da istruzioni,
molte istruzioni. )er avere un idea della complessit, pensate che un software applicativo come Eord 8
formato da milioni di istruzioni ... 9ueste indicano ci@ che va fatto per consentire all%utente di scrivere
un documento usando il computer. ,cco, sinteticamente, come funziona l%intero meccanismo:
'sando l%interfaccia che il sistema operativo mette a disposizione, l%utente comanda il caricamento
delle istruzioni (il programma dai supporti di memorizzazione di massa: nel caso di Eindows si fa
doppio clic1, ad esempio, sull%icona di Eord ....
Le istruzioni (se non tutte almeno "uelle che servono in un primo momento sono trasferite dai lenti
supporti di memorizzazione di massa nella velocissima memoria elettronica (&A6: da "uest%ultima
saranno a disposizione della ()' in tempi molto brevi.
La ()' preleva la prima istruzione del programma dalla &A6 (&andom Access 6emor-, memoria ad
accesso casuale.
La ()' =capisce% cosa gli chiede l%istruzione.
LA ()' invia i necessari comandi a tutti i dispositivi interessati da "uell%istruzione, eseguendola.
!e l%istruzione non 8 "uella fnale, si ritorna al punto J prelevando la successiva istruzione e cos? via ...
Durante l%esecuzione delle istruzioni, la ()' pu@ usare la parte della &A6 rimasta libera per registrare
dati intermedi: 8 sempre per motivi di velocit che si preferisce la memoria elettronica a "uella di
massa (naturalmente si dovr prima o poi provvedere anche alla registrazione dei dati sui supporti di
massa, permanenti, pena la perdita dei dati stessi allo spegnimento del computer. Ad esempio, i
documenti creati con Eord sono prima registrati nella &A6 e solo con un comando esplicito di
registrazione ($ile 4 !alva sono memorizzati sui dischi.
Alcune istruzioni chiederanno alla ()' di controllare l%uso di periferiche di input o di output. !empre
pensando a Eord, non 8 diCcile convincersi che le sue istruzioni debbano fare in modo che la ()'
rimanga in attesa fno a che chi sta usando il programma non preme un tasto "ualsiasi o usa il mouse.
7on appena l%utente preme un tasto, le istruzioni comandano la sua visualizzazione sul video# se con il
mouse viene scelto un comando dal menu, le istruzioni chiederanno alla ()' di comportarsi in modo
appropriato.
0n realt tutto "uesto avviene con la collaborazione del sistema operativo (Eindows o Lilnu+, ad
esempio: "uest%ultimo mette a disposizione di ogni programma una serie di servizi che possono
essere invocati# ad esempio se un carattere deve essere fatto apparire sullo schermo, tutte le
operazioni coinvolte non sono gestite al massimo dettaglio dal programmatore di word (per fortunaA#
"uello che accade 8 che il programmatore che ha scritto Eord =chiede% a Eindows di fare "uesto per
lui. !ono tantissimi i servizi messi a disposizione da un sistema operativo (gestione di tutte le
periferiche, gestione della ram, del fle s-stem, della rete ecc.. 9uando i sistemi operativi non
esistevano ancora od erano molto primitivi, la vita del programmatore era molto pi< dura (doveva
programmare 3'330 i dettagli. Approfondirete "uesti aspetti nel corso di sistemi.
,saminiamo ora in dettaglio il funzionamento di una ()'. ,cco un ingrandimento:
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1'
R
A
M
C
1
U
CU
Cot$o% U!t
Deco&!+!cato$e
ALU
A$!t"et!c
Lo4!c
U!t
1e$ co"a&a$e %a
%ett)$a o %a (c$!tt)$a
I&!$!**! #e$ %e44e$e
o (c$!5e$e %a RAM
(
6)( &at! e(te$o: #$e%e5o ) &ato &a%%a RAM o %o $e4!(t$o &a%%a RAM
$e4!(t$!
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
7on spaventatevi: 8 pi< semplice di "uello che sembra a colpo d%occhio. 7ella zona in grigio della &A6
immaginiamo essere presenti un blocco di istruzioni da eseguire (potrebbero essere "uelle di un
programma come Eord.
La RAM: #e(!a"o%a co"e )a (e7)e*a &! ce%%e' c,!a"ate 68te. I o4! 68te #)0
e((e$e "e"o$!**ato ) &ato' co"e ) !(t$)*!oe o& ) ca$atte$e 25e&$e"o &o#o co"e
e& ! c,e +o$"a3. Ne% &!(e4o 7)! (o#$a (oo (tat! e5!&e*!at! ! 4$!4!o 7)att$o 68te.
O4! ce%%a 268te3 5!ee !&!cata co !% ()o !&!$!**o' c!o/ %a #o(!*!oe a #a$t!$e
&a%%9!!*!o. :!(to c,e (! co"!c!a a cota$e &a *e$o' 7)e(t9)%t!"o / %9!&!$!**o &e%%a #$!"a ce%%a !
a%to e%%a RAM 2(! #a$%a ac,e &! 68te *e$o3. La (eco&a ce%%a &a%%9a%to ,a a%%o$a !&!$!**o )o e
co(; 5!a... I 68te ! 4$!4!o !!*!ao a%%9!&!$!**o c!7)e e te$"!ao 7)att$o 68te #!< a5at!'
a%%9!&!$!**o otto 2co(!&e$a&o !% c!7)e (oo a##)to 7)att$o !&!$!**!3.
I $e4!(t$!: (oo ce%%e &! "e"o$!a (#ec!a%!' !te$e a%%a C1U' )(ate #e$ "e"o$!**a$e
valori per diversi scopi: la ()' impiega pochissimo a trovare o scrivere un dato nei
registri, perchF sono molto vicini ad essa e molto veloci. ,% "uindi assai conveniente
tenere "ui i risultati intermedi delle operazioni e tutto ci@ che si dovrebbe continuamente
rileggere o scrivere nella pi< lenta &A6. )urtroppo la spazio all%interno della ()' 8 veramente minimo:
c%8 spazio solo per alcune decine di registri ... (hiaro che di volta in volta si terr, della &A6, solo ci@
che serve alle istruzioni del momento, poi si dovr sostituire il contenuto dei registri con un altra parte
della &A6. )ur con "ueste limitazioni, lavorare con i registri d grossi benefci rispetto all%uso della sola
&A6.
Alcuni registri hanno poi una funzione speciale: uno, chiamato contatore di programma (program
counter indica a "uale indirizzo della &A6 si trova il dato che rappresenta la prossima istruzione da
eseguire.
'n altro 8 chiamato registro indirizzi: 8 "ui che va depositato un indirizzo ogni volta che si vuole
leggere o scrivere un b-te della &A6 ("uando si vuole leggere il codice della prossima istruzione da
eseguire, il contatore di programma viene infatti copiato "ui.
'n altro 8 chiamato registro istruzioni e contiene il codice numerico dell%istruzione letta nella &A6, che
deve essere eseguita (infatti ogni possibile istruzione 8 rappresentata da un codice numerico.
AL': 8 l%'nit Aritmetico Logica. ,ssa svolge le operazioni aritmetiche (matematiche elementari ed i
confronti logici tra due dati (sa dire se sono uguali, se uno 8 pi< grande o pi< piccolo dell%altro ecc..
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1)
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
(ontrol 'nit: 8 l%unit di controllo. ,% lei che invia a tutti gli altri dispositivi segnali elettrici con cui
comanda tutte le micro operazioni che possono essere svolte. Ad esempio pu@ comandare l%invio del
contenuto di un registro in un altro registro, oppure la lettura di un b-te della &A6 ed il trasferimento
del suo contenuto in un registro (o il contrario, il trasferimento alla AL' di due dati da sommare o da
sottrarre (ed il comando che fa eseguire la somma e la sottrazione. )u@ inviare segnali di comando
anche a dispositivi esterni alla ()': ad esempio pu@ comandare allo scanner di inviare il prossimo
blocco di dati del documento che sta leggendo. 0nsomma 8 il vero regista che regola il funzionamento
di tutti gli altri dispositivi interni od esterni.
Qus: si 8 parlato di invio di comandi dalla control unit, di trasportare b-te dalla &A6 ai registri e
viceversa, di comunicare indirizzi per usare la &A6. (ome viaggiano tutte "ueste informazioni D
!emplice, usano il bus A Qattute a parte, il termine indica i canali fsici lungo i "uali si spostano i
segnali elettrici che rappresentano dati, indirizzi e comandi. (i sono tre tipi di bus:
Qus dati: come suggerisce il nome, trasporta dati (il contenuto di una cella di &A6, di un registro o un
b-te da o verso una periferica. ,siste un bus dati interno, sul "uale viaggiano i dati all%interno della
()', ed uno esterno che permette lo scambio dei dati tra la ()' e dispositivi esterni (e viceversa o tra
dispositivi esterni stessi. Xo rappresentato i bus dati con una linea a tratti piccoli. )er non appesantire
il disegno non ho collegato tutti i dispositivi che si possono scambiare dati grazie al bus interno. Le
frecce indicano naturalmente il senso di percorrenza.
7elle moderne architetture esistono bus specializzati per scambiare dati con periferiche che
consumano "uesti ultimi ad un tasso elevatissimo. 'n esempio 8 rappresentato dalla scheda grafca:
essa sfrutta bus dedicati (connessione A5), oggi in via di sostituzione con i collegamenti !erial Ata.
Qus indirizzi: ogni volta che la ()' legge o scrive un dato dalla &A6 deve prima impostare il relativo
indirizzo # pensate al bus indirizzi come ad un bus dati specializzato nel trasportare indirizzi. Xo
indicato il bus indirizzi con una linea a tratti larghi.
Qus controlli: 8 l%insieme delle linee su cui viaggiano i comandi (segnali elettrici che la (ontrol 'nit
invia a dispositivi esterni# serve anche ai dispositivi esterni per segnalare eventi particolari alla ()':
avete presente cosa accade "uando fnisce la carta della stampante D > "uando il disco che tentate di
scrivere 8 protetto D > "uando non c%8 pi< spazio sul disco D L%ho indicato nel disegno con le tre linee
continue che puntano verso il basso. La control 'nit pu@ attivare o disattivare anche i componenti
interni grazie a delle linee di selezione: le ho indicate con delle linee continue senza frecce: "uando la
(ontrol 'nit vuole attivare un dispositivo, invia lungo una linea di selezione un segnale apposito.
>ra che sono stati descritti tutti i componenti, vediamoli all%opera. 0mmaginiamo che le istruzioni da
eseguire siano contenute nei b-te in grigio:
0l registro program counter, abbiamo detto, contiene l%indirizzo dell%istruzione da eseguire (in "uesto
caso l%indirizzo del primo b-te in grigio. )er poterla leggere dalla &A6 8 necessario che tale indirizzo
sia contenuto nel registro indirizzi. L%unit di controllo comanda allora la copia del contenuto del
program counter in "uesto registro.
L%unit di controllo comanda "uindi al dispositivo di lettura4scrittura della &A6 (non evidenziato nel
disegno per semplicit di leggere il b-te all%indirizzo contenuto ora nel registro indirizzi# il suo valore (il
codice dell%istruzione viene trasferito lungo il bus dati esterno e da l? sul bus dati interno, fno a
depositarlo nel registro istruzioni.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 15
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
L%unit di controllo comanda a "uesto punto al decodifcatore di leggere dal registro istruzioni il codice
numerico dell%istruzione e di =capire% che cosa 8 richiesto.
!ulla base della =risposta% del decodifcatore l%unit di controllo attiva in se"uenza i dispositivi
interessati dall%istruzione# ad esempio (semplifcando se si dovesse calcolare A Y Q Z (
prelevare Q dalla &A6 (indirizzo di Q in registro indirizzi e successiva lettura#
prelevare ( dalla &A6 (indirizzo di ( in registro indirizzi e successiva lettura#
trasferire alla AL' gli operandi e comandare la somma
copiare il risultato nella posizione dove in &A6 si trova =(% (indirizzo di ( in registro indirizzi e scrittura
Ne% +$atte"#o !% #$o4$a" co)te$ / (tato a)to"at!ca"ete !c$e"etato e
!&!ca %9!&!$!**o &e%%a #$o((!"a !(t$)*!oe &a e(e4)!$e. S! #)0 a%%o$a
$!co"!c!a$e &a% #)to 1' +!o a c,e ... !% co"#)te$ 5!ee (#eto = I $ea%t>'
ac,e &o#o c,e !% #$o4$a""a te$"!a' a& e(e"#!o c,!)&e&o ?o$&' )
a%t$o $!"ae ! +)*!oe: 7)e%%o c,e 4!> +)*!oa5a #$!"a &! ?o$&'
?!&o@( ! #e$(oa. I+att! !% (!(te"a o#e$at!5o' e((o (te((o ) !(!e"e &!
#$o4$a""!' / a%%9o#e$a &a% "o"eto &e%%9acce(!oe &e% co"#)te$ +!o
a%%o (#e4!"eto. A)a&o %9)tete co"a&a' )(a&o %9!te$+acc!a 4$a+!ca'
%a #a$te*a &! )9a##%!ca*!oe' %e !(t$)*!o! &! 7)e(t9)%t!"a a++!acao ! RAM 7)e%%e &e% (!(te"a
o#e$at!5o e& !% #$o4$a" co)te$ 5!ee +atto B#)ta$e9 a%%a #$!"a !(t$)*!oe &e%%9a##%!ca*!oe' c,e
!!*!a co(; a& e((e$e e(e4)!ta. A #$o4$a""a te$"!ato (! $!#$e&e a& e(e4)!$e !% (!(te"a
o#e$at!5o. D)$ate !% ()o +)*!oa"eto %9a##%!ca*!oe #)0 $!c,!a"a$e #a$t! &e% (!(te"a
o#e$at!5o 2$!c,!e(ta &! (e$5!*!3: !% #)to a c)! (! e$a a$$!5at! co %9a##%!ca*!oe 5!ee #$!"a
"e"o$!**ato' #e$ #ote$ $!#$e&e$e' &o#o c,e !% (!(te"a o#e$at!5o ,a e(a)&!to %a $!c,!e(ta' !%
#$o4$a""a e(atta"ete &a%%9!(t$)*!oe a c)! e$a (tato !te$$otto.
La +a(e ! c)! (! #$o55e&e a #$e%e5a$e !% co&!ce )"e$!co &e%%9!(t$)*!oe &a e(e4)!$e / c,!a"ata
$ase !i $etc/ (prelievo.
La fase in cui il decodifcatore interpreta l%istruzione, determinando le microoperazioni che verranno
poi eseguite dall%unit di controllo 8 chiamata $ase !i !eco!e (decodifca.
La fase in cui le microoperazioni sono e/ettivamente portate a termine, attivando nella giusta
se"uenza i dispositivi interessati 8 chiamata $ase !i e9ec+te (esecuzione.
0l ciclo fetch, decode ed e+ecute viene ripetuto a velocit incredibili: oggi
miliardi di milioni di volte al secondo (G volta al secondo Y G Xertz Y
GXz# un milione di volte al secondo Y G 6ega Xertz Y G6hz# G5hzY un
miliardo. Le fantastiche capacit di un sistema di elaborazione sono
tutte "ui: una velocit pazzesca ed una memoria perfetta nell%eseguire
istruzioni semplicissime (sposta un b-te di "ua e mettilo di l ... A ,%
come se un muratore usasse mattoni grandi come pezzi del lego (le istruzioni semplicissime ma lo
facesse ad una velocit incredibile, costruendo palazzi meravigliosi, ma solo se "ualcuno lo guida
passo passo (il programma ... 9ualcuno ha infatti defnito il computer uno stupido molto veloce A
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1*
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
&A))&,!,73AW0>7, 073,&7A D,LL, 07$>&6AW0>70
R!"ae &a (c!o4%!e$e aco$a ) o&o !"#o$tate: co"e (oo $a##$e(etate
%e !+o$"a*!o! e%%a RAM e e! $e4!(t$! C E %e !(t$)*!o! C E((e*!a%"ete
&e5oo e((e$e t$attat! )"e$! e ca$atte$!. Le #$!"e "acc,!e ca%co%at$!c!
(attenzione: non sto ancora parlando di computer elettroniciA erano grandi
grovigli di ingranaggi: pur costruite con una precisione ammirabile, gli attriti ed
i tempi di funzionamento di tutte "ueste parti meccaniche costituivano un limite
serio per la velocit di elaborazione.
6entre un ingranaggio impiega un certo tempo per funzionare, un segnale elettrico va alla velocit
della luce (JLL.LLL Nm al secondo A (ome dire, pi< di sette volte il giro della terra in un secondo A
!ono stati ideati dei dispositivi (circuiti elettronici in grado sfruttare i segnali elettrici per
rappresentare le informazioni ed elaborarle. !i 8 anche capito che il miglior modo di procedere sarebbe
stato "uello di rappresentare tutto sotto forma di numeri binari. (erchiamo di arrivare a "uesta
conclusione per gradi.
I (e4a%! e%ett$!c! o (oo #e$+ett!: ) (e4a%e e%ett$!co' "et$e 5!a44!a () ) +!%o'
/ (o44etto a &!(t)$6! e& atte)a*!o! &! 5a$!o t!#o c,e te&oo a &!(to$ce$%o: !
#a$te*a' c!o/' #o((!e&e ce$te ca$atte$!(t!c,e 2+o$"a' #ote*a ecc.3 D a%%9a$$!5o o
(oo #!< e(atta"ete %e (te((e. 1e$ c)! (e (ce%4o &)e (e4a%! a66a(ta*a (!"!%! t$a
%o$o e %! t$a("etto' #ot$e66e ca#!ta$e c,e c,! %! $!ce5e (ca"6! %9)o #e$ %9a%t$o
2e$$o$e3. A)e(ta #o((!6!%!t> c$e(ce co !% )"e$o &e! t!#! &! (e4a%e )(at!. A)e(to
(#!e4a #e$c,E ! #$otot!#! &! ca%co%ato$e c,e ce$ca5ao &! )(a$e tat! (e4a%! &!5e$(!
#e$ $a##$e(eta$e %e c!+$e )"e$!c,e e& ! ca$atte$! &e%%9a%+a6eto o e66e$o "o%to ()cce((o:
(e"#%!ce"ete %a #$o6a6!%!t> &! e$$o$e e$a t$o##o a%ta = Ce$to (e ! t!#! &! (e4a%e +o((e$o &! "eo'
&!"!)!$e66e %a #$o6a6!%!t> &! co+o&e$%! ... F! &o5e #o((!a"o a$$!5a$e C U (o%o (e4a%e o
6a(ta: (a$e66e (e"#$e )4)a%e a (e (te((o e o #o$te$e66e !+o$"a*!oe' "a &)e ... D)e / #$o#$!o
$!()%tato !% )"e$o ott!"a%e: )(a&o (o%o &)e (e4a%! !% #!< #o((!6!%e &!5e$(! t$a %o$o' / 6e
&!++!c!%e c,e ) (e4a%e 5e4a &!(to$to a% #)to ta%e &a co+o&e$%o #e$ %9a%t$o. E9 ata %a logica
digitale (binaria, basata cio8 sull%uso di due soli simboli (che possiamo far corrispondere alle cifre L ed
G. 3utte le informazioni devono essere codifcate (rappresentate con combinazioni diverse di L ed G.
9ueste cifre, dette binarie, sono anche chiamate bit. 'n bit pu@ essere L od G.
0 circuiti digitali sono facili da costruire: digitali, cos? sono chiamati i circuiti in grado di trattare segnali
di due tipi, per confrontarli e combinarli. )urtroppo non 8 possibile neanche accennare alla
realizzazione dei circuiti digitali. 2i basti sapere che 8 relativamente semplice costruire circuiti per
memorizzare, sommare, sottrarre, moltiplicare, dividere, confrontare ecc. due numeri binari. 9uesto
perchF le regole dell%aritmetica binaria (come si fanno le somme, sottrazioni, moltiplicazioni ecc. sono
addirittura pi< semplici di "uelle che usiamo noi con la nostra aritmetica decimale (le cifre dallo L al
H A Qeh, avete un intero corso di elettronica per togliervi certe voglieA
0l sistema binario 8 e"uivalente a "uello decimale: come dire che ogni numero espresso
con la nostra notazione decimale 8 esprimibile anche in binario ed in modo biunivoco. 0l
termine signifca che, dato un "ualsiasi numero espresso in decimale, lo si pu@ convertire
ottenendo un numero in forma binaria# viceversa se si parte da "uesto numero binario e
lo si converte in decimale, si ritorna al numero di partenza. 9uesto 8 molto importante:
signifca poter continuare per noi a fornire dati in decimale all%elaboratore. 9uesti saranno
convertiti in binario ed elaborati. 0l risultato sar di nuovo, per noi, convertito in binario,
con la certezza di non commettere e"uivoci. ,"uivalentemente, signifca che tutte le operazioni
matematiche possibili in decimale lo sono anche in binario e che se una certa operazione in decimale
d un certo risultato, lo stesso verr fornito in binario dall%operazione corrispondente. )otremmo dire,
volgarmente, che il sistema binario 8 =potente% "uanto "uello decimale.
Anche le informazioni non numeriche sono comun"ue rappresentabili sotto forma di numeri.
(onsideriamo caso per caso:
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1+
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Alfanumeriche: le singole cifre numeriche, le lettere dell%alfabeto ed altri caratteri come la
punteggiatura: basta far corrispondere ad ogni carattere un ben preciso codice numerico. 'no tra i
codici pi< di/usi 8 l%(:CII: secondo "uesto codice, ad esempio la lettera =A% 8 codifcata con il numero
KP, la =Q% con KK e cos? via (i numeri precedenti il KP sono usati per altri caratteri. 7aturalmente
l%elaboratore sapr "uando interpretare un numero come tale o come la rappresentazione di un
carattere. 7ota: in fondo al libro troverai un appendice con l%intera tabella A!(00.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1,
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
5rafche: se il disegno 8 di tipo tecnico memorizzo le coordinate numeriche di ogni elemento
geometrico ed altre caratteristiche (coordinate del centro di una circonferenza e la misura del raggio,
le coordinate degli angoli di un rettangolo o degli estremi di una retta ecc.. !e il disegno 8 pittorico,
cio8 fatto per punti (pi+el, si memorizza per ogni pi+el il valore dell%intensit di rosso, verde e blu che
lo caratterizza.
Animazioni e flmati: 8 un caso particolare del precedente. 0nfatti ogni se"uenza di animazione o
flmato 8 formata da tanti fotogrammi, ognuno dei "uali pu@ essere considerato un disegno statico,
ricadendo nel caso precedente. 'n a tecnica molto usata per risparmiare memoria 8 "uella di
memorizzare solo alcuni fotogrammi chiave (1e- frame e dire per ogni fotogramma intermedio cosa
cambia a livello di pi+el (compressioni mpeg 4 div+.
!uoni: ogni suono pu@ essere scomposto, determinando le caratteristiche delle onde sonore che lo
costituiscono. 9uesti caratteristiche sono rappresentate da numeri ... ,sistono dei formati compressi
anche per l%audio (6)J, E6A.
&A))&,!,73AW0>7, D,LL, 0!3&'W0>70:
!i adotta anche in "uesto caso una rappresentazione numerica. ,cco "ui sotto il formato di una
generica istruzione:
codice
operazione
operando G (o suo indirizzo operando T (o suo indirizzo indirizzo risultato
>gni possibile istruzione 8 indicata da un codice numerico. Ad esempio la somma potrebbe essere
indicata con LLG (ricordiamo che i numeri sono binari, ed usano solo lo L e l%G, la di/erenza con LLT
ecc. Dopo aver specifcato il tipo di istruzione 8 necessario indicare gli operandi (ad esempio i numeri
da sommare. 9ualche volta nell%operazione si mettono direttamente i valori da usare, altre volte si
specifca l%indirizzo dove trovare in &A6 i valori che servono. (os? si potrebbe chiedere di sommare
direttamente LLGL (T in binario e LGLL (U in binario oppure intendere che LLGL 8 l%indirizzo in &A6 in
cui trovare il primo numero da sommare e che LGLL 8 l%indirizzo dove trovare in &A6 il secondo
numero da sommare. A seconda del codice dell%istruzione la ()' sa come comportarsi. !e l%istruzione
produce un risultato 8 anche possibile indicare a "uale indirizzo in &A6 depositare il risultato. ,cco
come potrebbe apparire un%istruzione completa:
LLLG LLGL LGLL GGLL
7oterete che sono necessari GK bit, cio8 due b-te, per rappresentarla. 0nfatti, anche se le celle della
&A6 contengono un b-te, spesso sono considerati a gruppi. 0l decodifcatore riceve proprio la se"uenza
completa di bit, la scompone in codice operativo, operandi e indirizzo risultato e comunica alla (ontrol
'nit le se"uenze (microistruzioni di comandi da attivare. Alcune istruzioni, semplici, occupano un solo
b-te, altre molti. La ()' non fa in "uesto caso confusione a causa delle diverse lunghezze: il codice
operativo (il primo ad essere letto nella &A6 chiarisce subito di che tipo di istruzione si tratta e di
"uanti b-te necessita, per ogni sua parte. ,% per "uesto che il program counter pu@ essere
automaticamente aumentato del giusto numero di b-te per =puntare% alla posizione in &A6 in cui si
trova la prossima istruzione.
>!!,&2AW0>7, 06)>&3A73,. !embrerebbe che "ualsiasi aspetto della realt sia perfettamente
rappresentabile e trattabile da un elaboratore ... ma non 8 esattamente cos? A Dobbiamo convincerci
che ci@ che viene costruito nelle memorie di un elaboratore 8 solo un modello (una rappresentazione
semplifcata, parziale, mai perfetta della realt. (erto, "uando scriviamo una lettera con Eord 8
esattamente "uello che si voleva fare: in "uesto caso il modello 8 praticamente perfetto. 6a in altri,
per motivi pratici, sono stati imposti dei limiti. )ensiamo ai numeri interi. )i< sono grandi e pi< bit sono
necessari per rappresentarli, "uesto 8 intuitivo. )er motivi di eCcienza e praticit si 8 deciso di
dedicare sempre lo stesso numero di bit per rappresentare un intero: sono usati cio8 gli stessi bit per
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1-
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
un numero grande che per uno piccolo. ,% un po% come scrivere LLGTI che 8 ancora GTI: stessa cosa
in binario (i bit di pi< ed inutili sono messi a L. 5i, ma "uanti bit D !e ne vengono usati pochi allora
non sar possibile rappresentare numeri grandi. !e ne vengono usati tanti, tutte le volte che si
rappresenta un numero piccolo ne vengono =sprecati% un certo numero ... 9ualun"ue sia la scelta, la
conclusione 8 sempre la stessa: fssato il numero di bit da usare, automaticamente 8 fssato anche il
pi< grande ed il pi< piccolo numero intero (positivo e negativo che si pu@ rappresentare. !tessa cosa
per i numeri reali ("uelli =con la virgola%: in "uesto caso, oltre ai limiti esiste anche un problema di
precisione. 0nfatti un numero pu@ anche essere piccolo ma con un numero infnito di cifre decimali
(pensate al pi greco: se si fssa il numero di bit, pi< di tante cifre decimali non potranno essere
rappresentate. ,cco allora che un numero come J,GUPKVTHUJUPK sar invece memorizzato come
J,GUPKVJ, arrotondando la sesta cifra. Ai fni pratici, per la stragrande maggioranza delle applicazioni,
la "uestione 8 praticamente inin.uente, ma 8 giusto sapere che "uesti limiti esistono e che ci@ che
viene rappresentato all%interno di un sistema di elaborazione pu@ essere soggetto ad approssimazioni.
Attenzione: poichF ogni informazione 8 rappresentata in forma numerica, "uesto signifca che ogni
tipo di informazione 8 soggetto ad approssimazioni (scegliendo, ad esempio, di usare pochi bit per le
intensit dei colori di un immagine, la gamma dei colori risultanti sar povera e discorde da "uella
reale.
E2ol+#ione !ei ling+aggi !i %rograa#ione
>1, tutto "uesto discorso per avere perfettamente chiaro "uesto concetto: nella sua forma pi<
primitiva un programma 8 una se"uenza di valori numerici memorizzati in altrettanti b-te della &A6# il
formato di memorizzazione di "uesti valori 8 "uello binario. 'n programma in "uesta forma 8
immediatamente comprensibile al decodifcatore e di linguaggio in cui 8 espresso 8 chiamato
ling+aggio acc/ina. !i parla anche di ling+aggio "asso li2ello perchF 8 vicino alla macchina e
lontano dal nostro linguaggio naturale.
0 primi programmatori non
avevano molta scelta: non
esisteva la tastiera, non
esistevano i supporti di
memorizzazione di massa ... >gni
istruzione ed ogni dato veniva
comunicato al computer usando le
cosiddette schede perforate
(ormai reperti archeologici A. !ono
tessere di carta, dalle dimensioni
di una grossa banconota, su cui i
numeri binari sono rappresentati
bucando o no piccoli rettangoli
disposti in fle verticali: un buco
all%interno del rettangolino signifca G, niente buco L. 'na fla verticale di rettangolini corrisponde ad
un b-te: "uindi, l%uno di fanco all%altro, sulla stessa scheda possono stare anche pi< b-te (fle di
rettangolini. 0l programmatore, usando un dispositivo chiamato perforatrice, preparava pacchi di
schede, corrispondenti ai programmi che voleva far eseguire. Le schede perforate venivano poi lette
da un lettore meccanico: "uesto scandiva ogni scheda rilevando i fori e comunicando G o L al
computer, che a sua volta memorizzava i b-te nella &A6.
A parte la scomodit fsica di "uesto meccanismo (era facilissimo spiegazzare una scheda, con
conseguente inceppamento del perforatore o del lettore, oppure invertire la posizione di due schede
ecc., la realizzazione e la manutenzione di un programma non era pane per i denti di tutti:
bisognava diventare esperti (in materia di programmazione non sono ammesse mezze misure di
"uel particolare linguaggio riconosciuto dalla ()' usata, fatto di intricate se"uenze di zeri e di
uno: provate ad immaginare la fatica di trovare un piccolo errore in una lista di centinaia di
migliaia di codici binari ...
bisognava essere esperti di aritmetica binaria, visto che tutto 8 espresso in "uella forma#
dato che le istruzioni sono cos? a basso livello, vicino all%hardware, era necessario conoscere alla
perfezione anche "uest%ultimo# se cambia l%hardware i programmi dovevano essere
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 20
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
pesantemente modifcati# se cambiava il microprocessore (la ()', e con esso l%insieme delle
istruzioni accettate, l%intero programma andava riscritto#
)er tutti "uesti motivi era diCcile trovare buoni programmatori e lo sviluppo del software era costoso e
lento. 7onostante "ueste diCcolt i primi abbozzi di sistemi operativi e le prime applicazioni sono stati
scritti proprio cos? ... direttamente linguaggio macchinaA
!i parla di linguaggio perchF come ogni linguaggio parlato ha un suo vocabolario di =parole% (l%insieme
dei codici delle istruzioni che si possono usare ed una sua sintassi, cio8 le regole con cui si possono
formare le =frasi% (le istruzioni e le se"uenze di istruzioni. >gni frase ha poi il suo =signifcato% (l%e/etto
che produce.
'n primo miglioramento (oltre alla di/usione di dispositivi come le tastiere ed i dischi 8 stato
introdotto con l%uso di codici mnemonici al posto delle se"uenze di G e di L. 0l concetto 8 assai intuitivo:
8 molto pi< semplice ricordare "ualche cosa del tipo =!'6 GP TG% che non =GLLGLLGLGLGG%, per
indicare che vanno sommati GP e TG. 0l programmatore pu@ ora scrivere il programma usando un
linguaggio un po% pi< lontano da "uello macchina ma pi< vicino al suo modo di esprimersi. 9uesto
linguaggio 8 chiamato asse"l;. 7aturalmente, prima di sottoporre il programma al computer 8
necessario un processo di traduzione: i codici mnemonici ed i valori espressi in decimale non sono
comprensibile dalla ()' A 'n programma apposito chiamato asse"latore 3asse"ler5 , scritto
ovviamente in linguaggio macchina, traduce ogni codice mnemonico e valore decimale nella
corrispondente se"uenza di G e di L. 0 linguaggi assembl- devono essere considerati, come linguaggio
macchina, di basso livello.
9ui a lato, un esempio di
programma scritto in un
linguaggio assembl-. ,sso
calcola la somma di una
se"uenza di numeri letti
(istruzione 07 G dalla periferica G
(che potrebbe essere la tastiera
fno a che non viene specifcato
lo zero come numero da
sommare. 9uando viene inserito
lo zero si termina il ciclo di
lettura e si invia il risultato
(istruzione >'3 T alla periferica
T (che potrebbe essere il video.
7>3A: non sforzatevi di
comprendere i dettagli (8 ancora troppo prestoA
Qeh, certamente meglio di una sflza di bit, ma ancora piuttosto diCcile da
leggereA 0noltre "uesto stesso programma 8 inservibile con un;altra ()'...
7on solo: un programmatore abituato a programmare per un;altra ()' (e
"uindi con un altro linguaggio assembl- potrebbe non capirci nullaA
(i vorrebbe una specie di linguaggio universale comprensibile a tutti i
programmatori. 'no strumento assai di/uso 8 rappresentato dai cosiddetti
<o0 c/art. La traduzione 8 !iagraa !i <+sso perchF grafcamente
descrive la se"uenza delle istruzioni che verranno eseguite dal computer.
L;idea alla base dei diagrammi di .usso 8 semplice: invece di usare dei
codici letterali che cambiano da una ()' all;altra, usare dei simboli grafci
uguali per tutte le ()'. !uccessivamente il diagramma di .usso guida il
programmatore nella scrittura del programma nel linguaggio assembl- per
la ()' che deve usare. !e un domani gli si chiedesse di riscrivere il
programma per un;altra ()' non dovrebbe cominciare da zero ma potrebbe
sfruttare lo stesso diagramma di .usso. Addirittura il compito potrebbe
essere svolto con la stessa eCcienza anche da un altro programmatore.
9ui a lato, il diagramma di .usso che descrive lo stesso algoritmo di somma
di una se"uenza di numeri terminata da zero vista prima in assembl-.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 21
inizio
totale .& 0
leggi dato
totale .& totale / dato
dato00
1
scrivi totale
2ine
2also
vero
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
2isivamente 8 semplice seguire il .usso del programma: si parte dall;ovale con la scritta ;inizio;, si
giunge ad un ri"uadro in cui si associa all;identifcatore = totale% il numero zero, ovvio valore di
partenza per una somma.
)oi si comanda la lettura di un dato (il pallino che precede indica il punto a cui far ritorno per leggere
altri dati# poi si aggiunge al totale il dato letto# nel rombo si decide se 8 arrivato il momento di
terminare o di chiedere altri dati: se il test (confronto del dato letto con il numero zero d come
risultato = falso% si segue il percorso indicato dalla freccia con l;etichetta corrispondente e si risale al
punto in cui poi, chiedendo un nuovo dato, il ciclo si ripete# se invece il test d come risultato =vero% si
segue l;altra freccia, il ciclo termina, e si provvede a scrivere il totale calcolato.
3orneremo presto a parlare dei diagrammi di .usso. 0nfatti "uesto strumento mantiene la sua validit
anche "uando introdurremo linguaggi di programmazione pi< potenti ed espressivi dell;assembl-.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 22
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
0 linguaggi assembl- sono, infatti, ancora troppo scomodi e so/rono, in fondo, ancora di tutti i problemi
elencati per il linguaggio macchina: hanno reso solo un poco pi< lieve la vita al programmatore, ma
sono ancora molto legati alla ()' usata. 0l passaggio successivo 8 stato lo sviluppo di linguaggi ancora
pi< lontani dal linguaggio macchina e, di conseguenza, pi< vicini al nostro modo di esprimerci. !ono
nati i ling+aggi a! alto li2ello. 9uesti sono caratterizzati da istruzioni molto potenti, con descrizioni
facili da ricordare, che corrispondono anche a centinaia di semplici istruzioni in linguaggio macchina o
assembl-.
,d ecco "ui a lato la versione dello stesso algoritmo codifcata con
il linguaggio di programmazione )ascal (per l;esattezza il suo =
dialetto% 3urbo )ascal.
B molto leggibile, compatto. Dopo un;intestazione che assegna un
nome al programma, il programmatore dichiara i simboli che
vorr utilizzare indicando anche che sono dei numeri interi
(integer.
0l =begin% indica appunto l;inizio del programma. (ome prima
istruzione si azzera il totale e poi si ripetono (repeat due
istruzioni fno a che (until non viene introdotto come dato il
valore zero: la lettura (read del dato e la sua aggiunta al totale.
3erminato il ciclo si provvede alla scrittura del totale calcolato.
!iamo chiaramente ad un livello pi< astratto: il programmatore non deve conoscere i meccanismi
hardware della stampante o della ()': ad esempio, deve solo ricordare che il comando di stampa 8
=write% e che deve specifcare tra parentesi ci@ che vuole sia stampato. (ambia la stampante D 0l
comando rimane sempre "uesto A (ambia la ()' D 0l comando rimane sempre "uesto ... (ambia
addirittura il tipo di computerD 7on devo modifcare o riscrivere tutti i programmi: il )ascal rimane
)ascal...
&icordiamo "ualche nome di linguaggio ad alto livello tra i pi< famosi: $ortran (di/usissimo in ambito
scientifco e storicamente il primo linguaggio ad alto livello, il =(% (di/usissimo in molti ambiti# la sua
capacit di interagire ancora facilmente con l%hardware della macchina gli vale la defnizione in e/etti
di linguaggio di medio livello# molti sistemi operativi, anche per l%eCcienza dei programmi che i
compilatori =(% sono in grado di produrre, sono per "uesto motivo in gran parte sviluppati con "uesto
linguaggio, (obol (di/usissimo in ambito gestionale e commerciale, il mitico Qasic (il linguaggio che
ha aperto, per la sua semplicit, la porta della programmazione a milioni di utenti anche non esperti di
informatica, il )ascal (usatissimo negli ambienti scolastici, il Lisp ed il )rolog (usati per sviluppare
programmi di intelligenza artifciale, il (ZZ (il successore del (. (oncludiamo con un linguaggio che
sta rapidissimamente con"uistandosi i favori dei programmatori perchF molto adatto a sviluppare
programmi funzionanti su 0nternet: [ava (che molto ha in comune con il (ZZ.
Ad ognuno il suo. 6a se "uesta 8 solo una scelta dei principali linguaggi, "uanti sono in tutto D 0l
numero preciso non 8 noto, ma 8 certo che superi "ualche centinaio ... (ome mai D )er lo stesso
motivo per cui esistono in fondo tanti linguaggi anche all%interno del nostro: esiste un linguaggio
matematico (osereste negarlo, pensando all%algebra, alle formule matematiche ecc. D, un linguaggio
flosofco, uno giuridico ecc. A seconda dell%ambito applicativo pu@ convenire usare un linguaggio
specializzato. 0l $ortran deve il suo nome al termine =$ormula 3ranslator%, cio8 traduttore di formule: il
suo dizionario 8 ricco di comandi per calcoli matematici complessi. 0l (obol l%opposto: 8 ricco per@ di
comandi per gestire eCcientemente archivi sui dischi, che 8 proprio ci@ che occorre per sviluppare
programmi di gestione aziendale. Attenzione: non 8 che con un linguaggio si possano fare certe cose
ma non altre, solo ... pi< semplicemente. )rovate a spiegare le e"uazioni senza usare termini
matematici ... ,% possibile, ma che fatica ... )er lo stesso motivo sarebbe anche possibile scrivere in
(obol un programma per il calcolo dell%orbita di un satellite, ma che fatica ... (erto, alcuni linguaggi
sono pi< specializzati di altri. Alcuni sono invece ad uso generale: il Qasic ed il =(% od il (ZZ non
eccellono in nessun campo in particolare ma sono pi< che adeguati per ogni compito. ,% il mercato che
decide la fortuna di un linguaggio.
>vviamente anche per i linguaggi a medio4alto livello 8 necessaria una traduzione in linguaggio
macchina prima di poterli mandare in esecuzioneA
7>3A: tutti i linguaggi diversi dal codice macchina sono chiamati si"olici perchF hanno sostituito dei
simboli L.mnemonici alle se"uenze di G e
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 2'
Progra soa=
2ar totale7 !ato) integer=
"egin
totale )>0=
re%eat
rea!3!ato5=
totale )> totale ? !ato
+ntil !ato>0=
0rite3totale5.
en!.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
,sistono due tipi di traduttori per linguaggi a medio4alto livello:
G. Inter%reti. 0l programmatore scrive le istruzioni usando un programma di video scrittura (e!itor.
9uando si comanda la partenza del programma, l%interprete legge le istruzioni una alla volta, non
opera una vera traduzione ma si limita a riconoscere ci@ che le istruzioni vogliono ed a compiere
l%azione corrispondente# otteniamo "uindi subito, senza attese apprezzabili, il risultato dell;esecuzione
di "uell;istruzione ma non viene prodotto in modo permanente nessun codice binario: se "uesta
istruzione deve essere eseguita di nuovo, anche per GLLL volte, deve essere reinterpretata.
T Co%ilatori: "uesti sono dei veri traduttori. (ome prima, il programmatore scrive le istruzioni
usando un programma di video scrittura(e!itor. 6a, ogni volta che modifca anche un solo carattere
del testo del programma e ne richiede l;esecuzione, il programmatore deve comandare ad uno
specifco programma (co%ilatore la traduzione in linguaggio macchina di tutte le istruzioni che
compongono il programma. (ome approfondiremo meglio in seguito, il risultato della compilazione
prima di poter essere mandato in esecuzione deve essere elaborato anche da un altro programma
(lin@er che, per cos? dire, completa l;opera di traduzione iniziata dal compilatore.
Inter%reti e co%ilatori a con$ronto
Inter%reti Co%ilatori
6inori tempi di attesa durante lo sviluppo: per
vedere il risultato in esecuzione di una modifca
ad un;istruzione o della giunta di una nuova
istruzione, si deve attendere solo
l;interpretazione delle istruzioni che portano a
"uella che interessa# tutto il resto del programma
8 come se venisse ignorato.
6aggiori tempi totali nel fornire il risultato:
l;esecuzione 8 rallentata dal continuo bisogno di
interpretare le righe del programma, anche se
sono gi state interpretate molte volte. 0n certe
situazioni il tempo di esecuzione di un
programma interpretato pu@ essere anche GLL
volte superiore a "uello del corrispondente
programma compilato \
Dipendenza del programma dall%interprete:
l%interprete deve sempre essere gi pronto e
disponibile in memoria.
&elativamente semplici da scrivere.
)ossibili lunghi tempi di attesa durante lo
sviluppo: prima di potere e stare un;istruzione
"ualsiasi di un programma, 8 necessario che tutto
il programma venga tradotto in linguaggio
macchina# se le istruzioni sono poche ("ualche
centinaio le potenze elaborative e la velocit
degli odierni hard dis1 (che a volte non vengono
addirittura utilizzati perchF sono suCcienti le
ormai assai capienti e molto pi< veloci &A6 la
velocit della compilazione 8 tale da sembrare
che si stia utilizzando un interpreteA !e il progetto
consta invece di migliaia, centinaia di migliaia, di
milioni di istruzioni (JL milioni per Eindows HIA
prima di veder partire il programma in seguito ad
una modifca potrebbero rendersi necessari tempi
di attesa anche di parecchi minuti...
,secuzione veloce: tempo per la compilazione a
parte, il codice binario prodotto dalla
compilazioneZlin1 pu@ essere eseguito a grande
velocit senza bisogno di ulteriori traduzioni.
0ndipendenza del programma dal compilatore:
una volta tradotto in binario il programma, il
compilatore non serve pi<.
)i< complessi da realizzare rispetto agli interpreti.
2olendo sintetizzare vantaggi e svantaggi, diciamo che con un interprete risulta velocizzata la fase di
sviluppo: non ci sono i tempi di compilazione e di lin1 che costringono a ritradurre l%intero programma
anche se si sbaglia, letteralmente, una virgola. 'n compilatore produce un programma autonomo che
garantisce il massimo della velocit in esecuzione (anche decine di volte pi< veloce: mentre un
interprete 8 perfetto per lo sviluppo del programma, il compilatore serve a generare prodotto fnale.
)er la verit, "ueste considerazioni erano molto pi< vere "ualche anno fa: i computer erano molto pi<
lenti nel far funzionare i compilatori (()' meno potenti e dischi molto pi< lenti: era allora molto
conveniente usare un interprete nelle fasi iniziali (in cui si commettono molti errori ed il compilatore
per i ritocchi fnali. >ggi i tempi di compilazione e lin1 sono rapidissimi e l%interprete come strumento 8
molto meno appetibile.
!viluppare software, oggi sempre pi< complicato, 8 molto costoso. ,ssere produttivi 8 indispensabile
per avere successo come sviluppatori di software. 5li odierni compilatori e lin1er sono integrati in
ambienti di sviluppo sofsticatissimi, dove alcune parti standard di un programma sono scritte
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 2)
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
automaticamente A Ad esempio, mentre un tempo, per gestire una fnestra come "uelle di Eindows,
era necessario scrivere decine di istruzioni, oggi il programmatore disegna la fnestra con il mouse
(come fareste in )aintbrush per un rettangolo e le istruzioni corrispondenti sono generate in
automatico. Lo stesso per molte fnestre di dialogo, i bottoni, i menu, le caselle con gli elenchi, le
schede di inserimento dati, i pannelli di ricerca di un fle per l%apertura o la registrazione di un archivio
ecc. ,% sempre disponibile anche un potente strumento per la ricerca degli errori (debugger. 9uesti
sono solo alcuni dei moltissimi bonus che un moderno ambiente per lo sviluppo dei programmi 8 in
grado di oCre ...
.a catena !ella %rograa#ione
0l programmatore inizia con lo scrivere le istruzioni (nel linguaggio di programmazione scelto con un
programma chiamato e!itor. 9uesto termine inglese signifca redattore cio8 colui che cura la scrittura
di un testo, ed ha "uindi un signifcato abbastanza generico. 6olto semplicemente, pensate all;editor
come ad un programma di videoscrittura specializzato per la stesura delle istruzioni. 0l fle scritto con
l;editor prende il nome di co!ice sorgente. (source code. 0 primi editor erano molto semplici e
permettevano solo di scrivere il codice (il testo corrispondente alle istruzioni e di salvarlo su disco:
spettava poi al programmatore mandare in esecuzione, manualmente, il compilatore ed il lin1er.
>ggi gli editor sono diventati = intelligenti%:
colorano, o evidenziano automaticamente in altro modo (usando il grassetto, il corsivo, la
sottolineatura ecc le diverse parti di un;istruzione per facilitare la lettura (si parla di sintax
highlightining, cio8 evidenziazione della sintassi# e cos? anche decisamente pi< diCcile
commettere certi errori (tipo dimenticarsi di chiudere delle parentesi aperte#
sono in grado di completare automaticamente la scrittura delle istruzioni (code completion: il
programmatore inizia a scrivere un comando e l;editor pu@ proporre un elenco di tutti i comandi
che iniziano con le stesse lettere# a "uesto punto programmatore pu@ inserire rapidamente il
comando che voleva scrivere senza digitare il resto dei caratteri# pu@ anche usare delle
abbreviazioni di pochissime lettere per far inserire un;istruzione composta anche da molte righe
che poi verr completata#
un;altra caratteristica utilissima 8 rappresentata dai cosiddetti tooltip (suggerimenti: mentre si
sta completando la scrittura di una istruzione complessa sopra il punto di inserimento dei
caratteri appare un piccolo ri"uadro che contiene informazioni sull;istruzione stessa# "uesto
meccanismo consente di risparmiare tantissimo tempo che una volta venire impiegato per andare
a consultare un manuale#
sono integrati con un sistema di aiuto (help in linea ipertestuale (cio8 navigabile facendo clic sui
collegamenti che portano ad approfondimenti, argomenti correlati, esempi# a volte l;help 8
addirittura ipermediale (si possono richiamare flmati, animazioni, commenti vocali ecc..
permettono, addirittura, di =disegnare% parte del programma invece di scriverlo: usando il mouse
il programmatore dispone componenti preconfezionati su "uella che diventer la fnestra del
programma in esecuzione: caselle in cui inserire del testo, bottoni su cui fare clic, men<,
tavolozze che appariranno "uando si vorr far scegliere un colore all;utente, fnestre di dialogo
che permetteranno di cercare un fle sul disco "uando l;utente comander il caricamento di un
documento o il suo salvataggio eccetera# per ogni componente scelto l;editor inserir
automaticamente il codice corrispondenteA 9uando un editor 8 in grado di funzionare in "uesto
modo 8 detto 2is+ale.
sono in grado di richiamare automaticamente il compilatore ed il lin1er e se uno di "uesti due
programmi trova degli errori mostrare a video i relativi messaggi spostando il punto di
inserimento del testo sulla riga del primo errore# se invece il programma non contiene errori pu@
anche essere mandato automaticamente in esecuzione per provarlo: al termine dell;esecuzione si
verr riportati nell;ambiente di lavoro dell;editto. 0n "uesto modo il programmatore 8 in grado di
controllare tutti i passaggi senza mai abbandonare le editor. B per "ueste caratteristiche che oggi,
pi< che di semplici editor, si preferisce parlare di IDE7 Integrate! De2elo%ent
En2inronent 3a"ienti integrati !i s2il+%%o.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 25
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
0 fle dei codici sorgenti vengono registrati sul disco con un;estensione (la parte del nome del fle dopo
il punto che aiuta a riconoscere il linguaggio di programmazione utilizzato. ,cco le principali
estensioni: .pas ()ascal, .c ((, .cpp (c ZZ, .asm (assembl-, .asp (A!), .bas (Qasic.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 2*
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
0l co%ilatore trasforma il codice sorgente nel cosiddetto co!ice oggetto (ob]ect code# ma "uesto
processo di traduzione potrebbe interrompersi per vari motivi:
viene scoperto un simbolo che non appartiene al cosiddetto dizionario delle parole chiave
(@e;0or! proprie del linguaggio e neppure all%insieme dei simboli aggiunti dal programmatore:
ad esempio se il linguaggio prevede un comando write per scrivere "ualche cosa sullo schermo, il
programmatore potrebbe sbagliare e scrivere wrote# "uesta parola viene non verrebbe
riconosciuta come appartenente al linguaggio# viene allora cercata nell%insieme degli simboli (si
parla pi< correttamente di identi%catori introdotti dal programmatore# "uest%ultimo potrebbe
aver dichiarato di voler usare un simbolo chiamato area per memorizzare un valore con la virgola
in cui far calcolare la superfcie del cerchio:
area :Y raggio S raggio S J.GU# dai al simbolo area il valore della formula indicata (S signifca
moltiplicato
naturalmente raggio 8 un altro simbolo introdotto dal programmatore per memorizzare il dato
corrispondente alla misura del raggio \
se un identifcatore non viene trovato neppure nell%insieme defnito dal programmatore, allora il
compilatore decide che ha trovato un errore lessicale# "uesta fase viene infatti chiamata analisi
lessicale e "uella parte del compilatore che la svolge anali##atore lessicale.
Errori sintattici e! anali##atore sintattico. Anche se viene superata la fase di analisi
lessicale ci potrebbero essere ancora errori di tipo sintattico, cio8 che violano una regola sintattica
di "uel linguaggio# le regole sintattiche servono a costruire frasi corrette, al di l del fatto di aver
usato singoli termini riconosciuti. 7ulla di sorprendente: anche con la lingua italiana dovete
rispettare delle regole (soggetto, verbo, complemento oggetto ecc. ricordateD, solo che "uelle di
un linguaggio di programmazione sono decisamente pi< sempliciA ,d anche in italiano, pur
usando tutte parole presenti sul dizionario, 8 facilissimo scrivere frasi senza sensoA
$acciamo un esempio: molti linguaggi hanno la regola che pretende che ogni istruzione sia
terminata con un punto e virgola:
write(=9uesta istruzione contiene un erroreA%
6entre dal punto di vista dell%analizzatore lessicale non ci sono errori, "uello sintattico si accorge
della mancanza della virgola alla fne dell%istruzione.
(ontrollo lessicale e sintattico non esauriscono il compito di un compilatore: esiste anche un controllo
chiamato semantico che non 8 per@ il caso di approfondire in "uesta sede.
7ota: i codice oggetto hanno di solito come estensione .ob]
0l codice oggetto, risultato della compilazione, non 8 ancora in una forma del tutto eseguibile dalla
()': alcune parti del codice sorgente non possono essere tradotte dal compilatore perchF
rappresentano dei riferimenti ( lin@ a dei comandi esterni che non fanno parte direttamente del
linguaggio di programmazione in uso ma sono resi disponibili in raccolte chiamate li"rerie. (librar-.
9ueste ultime sono un preziosissimo strumento per la programmazione: una volta che un problema 8
stato risolto il codice corrispondente (gi tradotto in linguaggio macchina pu@ essere depositato in
una raccolta (la libreria dalla "uale potr essere estratto per essere incorporato in altri programmi che
ne hanno bisogno.
Ad esempio: immaginiamo di avere scritto un comando che disegna sullo schermo una circonferenza
note le sue coordinate sullo schermo del centro e la misura del raggio# il codice sorgente viene
compilato e tradotto in codice oggetto (da notare che anche in "uesto caso ci potrebbero essere della
parti ancora non tradotte\ ed aggiunto con un programma apposito ad una libreria (immaginiamo
che si chiami gra%ca.lib, dove .lib 8 naturalmente l%estensione con cui sono di solito individuate su
disco le librerie. Decidiamo di chiamare crf (abbreviazione di circonferenza il comando in "uestione#
le coordinate del centro e la misura del raggio della circonferenza dovranno essere indicate (come in
"uasi tutti i linguaggi di programmazione tra parentesi tonde al momento dell%uso del comando
stesso,
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 2+
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
0mmaginiamo ora di scrivere un programma di geometria e di avere la necessit di disegnare alcune
circonferenze. ,cco come richiameremmo il comando:
programma geometria#
'!,! grafca#
\
crf( GT , KG , JL#
\
crf( V, UH , TT#
0l compilatore non 8 in grado di tradurre il comando crf (non appartiene a "uelli standard del pascal ed
in mancanza di altre indicazioni dovrebbe interrompersi ed emettere un messaggio di errore (tipo
=simbolo non trovato% in corrispondenza delle righe in cui si richiama il comando crf.
3rovando per@ l%indicazione di utilizzo della libreria gra%ca, lascia nel codice oggetto un cosiddetto
collegamento (lin1 non risolto, cio8 una specie di segnalibro per ricordare che in "uel punto c%8 da
completare la traduzione.
,% compito del programma lin@er analizzare tutti i collegamenti irrisolti dei programmi oggetto che gli
vengono sottoposti al fne di produrre un unico eseguibile (estensione .e+e e cercare nelle librerie
indicate il codice mancante# "uest;ultimo verr estratto in copia ed incorporato nei punti richiesti. ,cco
uno schema che esemplifca il meccanismo:
Abbiamo ora tutte le nozioni necessarie per esaminare in dettaglio il procedimento di scrittura di un
programma.

Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 2,
0l programmatore utilizza in "uesto esempio due volte il comando per
disegnare una circonferenza# il centro della prima ha come coordinate
GT, KG ed un raggio pari a JL# similmente per la seconda.
,% molto importante che il programmatore specifchi dove 8 possibile
trovare il codice oggetto che corrisponde al comando crfA 9uesta
informazione viene fornita con ='!,! grafca%.
)rogram geometria#
'!,! grafca#
\
crf( GT , KG , JL#
\
crf( V, UH , TT#
Pro#ramma ese#ui$ile %inale
t$a&)*!oe ! %!4)a44!o "acc,!a
&e%%e !(t$)*!o! (c$!tte &a%
#$o4$a""ato$e.
&
co&!ce &e%%a c$+ #$e%e5ato &a%%a
%!6$e$!a
c$+
G.
G.
G.
7)a&$ato
G.
G.
Ecc'
&
(
I% co&!ce &e%%a crf
5!ee e(t$atto &a%%a
%!6$e$!a e& !co$#o$ato
e% #$o4$a""a +!a%e.
La %!6$e$!a &! (o%!to
cot!ee !% co&!ce &!
"o%t! co"a&!
Co&!ce So$4ete
2Heo"et$!a.#a(3
co"#!%ato$e
Co&!ce
o44etto
Heo"et$!a.o6I
Co&!ce 6!a$!o
&e% co"a&o c$+
LIBRERIA HRAFICA.LIB
%!Je$
Heo"et$!a.eKe
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
:tr+tt+ra !i +n %rograa Pascal
>gni programma )ascal 8 costituito da tre sezioni:
0ntestazione
Progra ^nome programma_#
,% una riga che inizia con la %arola riser2ata (1e-word program seguita dal nome che si vuol dare al
programma. Le parole riservate sono alcune decine ed il programmatore non pu@ usare identifcatori
con lo stesso nome di una di esse. Ad esempio, non possiamo chiamare un programma proprio
program. 0l nome da dare al programma 8 invece un esempio di i!enti4catore, un nome scelto dal
programmatore.
(i sono alcune regole da rispettare "uando scegliamo un identifcatore:
il suo primo carattere non pu@ essere una cifra numerica (il compilatore penserebbe che in "uel
punto sta iniziando un numero# ad esempio 'arrivato non va bene# arrivato' invece s?#
non pu@ contenere spazi# totale iva non va bene# totale&va o 0otale&va o totale`iva invece s?#
notate in particolare l;uso del carattere di sottolineatura ` che consente di =staccare% le parole
come se avessimo inserito uno spazio#
non pu@ contenere caratteri strani: ad esempio AaDbRcd eccetera# come regola pratica potreste
ricordare che possono essere usate solo lettere (maiuscole e minuscole, cifre numeriche ed il
carattere di sottolineatura# alcuni linguaggi fanno di/erenza tra minuscole e maiuscole (e sono
detti case sensitive per cui gli identifcatori totale e 0otale sono considerati diversi# altri
linguaggi, tra cui )ascal, non distinguono invece minuscole maiuscole (e sono detti case
insensitive#
hanno una lunghezza massima, di solito piuttosto ampia ("uasi sempre almeno JT caratteri#
attenzione perchF 8 superata la lunghezza massima non 8 detto che il compilatore segnali errore
ma potrebbe semplicemente considerare uguali due identifcatori che iniziano con la stessa
se"uenza di caratteri pari a lunghezza massima# se "uesta fosse otto, ad esempio, i due
identifcatori costo0otale e costo0ot potrebbero essere considerati lo stesso identifcatore,
causando situazioni d;errore diCcili da scoprire#
Dopo il nome del programma deve essere messo un punto e virgola. 0l punto e virgola 8 molto usato in
)ascal (ed in genere da molti linguaggi di programmazione: serve a separare due istruzioni# "uesto
signifca che se dopo un;istruzione dev;essere scritta una parola riservata che di per sF non viene
considerata un% istruzione il punto e virgola pu@ anche essere omesso. 0n ogni caso, almeno all;inizio,
potreste ricordare come regola semplifcata "uella di mettere un punto e virgola alla fne di
un;istruzione. ,cco allora "ualche esempio di intestazione corretta:
%rogra prova# %rogra primo)rogramma# %rogra primo`programma#
%rogra capitoloG#
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 2-
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
!ezione dichiarativa
9ui il programmatore assegna un nome (i!enti4catore ai dati che devono essere memorizzati
durante l;elaborazione.
(ostanti
!e un identifcatore viene descritto nella sezione introdotta dalla parola riservata const (abbreviazione
di constant, costante deve anche essere indicato dopo il simbolo dell;uguaglianza (Y il suo valore
che non potr mai variare durante l;esecuzione del programma. Ad esempio il valore del pi greco pu@
essere introdotto in un programma in "uesto modo:
Progra geometria#
const
)0`5&,(> Y J.GUGPHTKP#
0n un programma possono essere introdotte tutte le costanti che si vogliono. 0l tipo del dato (un
numero reale, real in )ascal per una costante viene dedotto dal valore posto dopo il simbolo
dell;uguaglianza. ,cco alcuni altri esempi di costanti:
50>&70`!,3306A7A Y V# esempio di costante di tipo intero (integer in )ascal
&0!)>!3A`A$$,&6A302A Y =!%# esempio di costante di tipo carattere# gli apici sono obbligatoriA
6,!!A550>`,&&>&, Y =!bagliato AA% # esempio di costante di tipo stringa (se"uenza di caratteri
racchiusi tra apici,
string in )ascal
2antaggi dell;uso delle costanti:
aumentano la leggibilit di un programma: 8 pi< facile riconoscere nomi simbolici che numeri
complessi#
aumentano la .essibilit di un programma: se vi 8 la necessit di cambiare il valore associato ad
una costante sar suCciente farlo solamente nella sezione const ed automaticamente il nuovo
valore verr utilizzato in ogni punto del programma in cui 8 stata usata la costante:
migliorano la sicurezza: il programmatore non potr neppure per sbaglio cambiare il valore della
costante perchF il compilatore glielo impedir emettendo un messaggio di errore
7>3A: la sezione delle costanti pu@ anche non essere presente.
2ariabili
9uando invece il valore di un dato pu@ cambiare durante l;esecuzione deve essere memorizzato in una
cosiddetta 2aria"ile. Le variabili devono essere dichiarate in una sezione, individuata dalla parola
chiave var, posta dopo la sezione const:
Progra geometria#
const
)0`5&,(> Y J.GUGPHTKP#
2ar
raggio : integer#
0n )ascal le variabili non possono ricevere un valore di partenza direttamente nella sezione dichiarativa
ma dovr essere usato un apposito comando (assegnamento nella sezione esecutiva. (ome
certamente immaginate "uesto stesso comando non pu@ essere invece utilizzato con le costanti. Dopo
l%identifcatore del nome di una variabile deve essere messo il simbolo =:% (due punti e poi
l;identifcatore di un tipo, ed infne il punto e virgola.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. '0
7el resto del programma invece di essere costretti a ricordare "uesta
scomoda se"uenza di cifre decimali sar possibile utilizzare la costante
)0`5&,(>.
7ota: 8 abitudine dei programmatori usare le maiuscole per gli identifcatori
che rappresentano una costante.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
)i< variabili dello stesso tipo possono essere dichiarate insieme separando gli identifcatori con una
virgola:
2ar
base, altezza: integer#
0l tipo individua l%insieme dei possibili valori che possono essere assunti da una costante o da una
variabile (si parla anche di !oinio. >gni tipo ha infatti i suoi limiti . ,cco la tabella che riassume la
situazione per i principali tipi del )ascal:
IN'EAI
Tipo da a
B8te L 255
S,o$t!t M128 127
Ite4e$ M32768 32767
?o$& L 65535
Lo4!t M2147483648 2147483647
AE(.I
Tipo da a
Rea% 2.NK1L
M38
1.7K1L
38
S!4%e 1.5K1L
M45
3.4K1L
38
Do)6%e 5.LK1L
M324
1.7K1L
3L8
eKte&e& 1.NK1L
M4N51
1.1K1L
4N32
,sempi di numeri reali: J.GU U.VKG,MJ#
0l secondo numero 8 espresso in $ora es%onen#iale: la lettera , seguita da un
numero e"uivale a moltiplicare (o dividere se il numero dopo la , 8 negativo per "uella
potenza del dieci.
9uindi U.VKG,MJ Y U.VK + GL
MJ
Y U.VK 4 GLLL Y L.LLUVK# T.UP,ZU Y T.UP + GL
U
Y
TUPLL
7 >3A: ci si riferisce a "uesto tipo di dato anche con la dicitura <oating %oint, a virgola mobile.
'IP& C(A(''EAE (c/ar. 0l tipo char si usa per il singolo carattere (lettera alfabetica, cifra numerica
da L a H o "ualsiasi altro simbolo rappresentabile con il ).(. come la punteggiatura, ma anche le lettere
dell%alfabeto greco, alcuni caratteri semigrafci tipo cuoricini o faccine, lettere straniere come o
simboli matematici. L%elenco completo forma "uella che viene chiamata la ta"ella (:CII (American
!tandard (ode form 0nformation 0nterchange che esiste in forma orginale (GTI simboli o estesa (TPK
simboli. 0 caratteri vanno racchiusi tra due apici semplici come in =a%, =A%, =e%,%U%.
Attenzione a non confondere una cifra numerica con il carattere corrispondente: G 8 diverso da =G% A
Anche se in un documento di testo i numeri vengono memorizzati con la se"uenza dei codici ascii
corrispondenti, "uesto formato risulta molto ineCciente per svolgere calcoli numerici. 7umeri interi e
reali vengono rappresentati in modo assai diverso ma "uesti argomenti verranno a/rontati in parallelo
nel corso di sistemi.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. '1
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
'IP& B&&.E(N& ("oolean. 0 dati boolean possono assumere solo due valori: vero (true e falso
(false.
'IP& :'AINC( (string 'n dato string 8 un insieme di caratteri racchiusi tra apici. La lunghezza
massima 8 TPP caratteri.
,sempi di string: =6arco%, =GT4LJ4GHHI%#
9uesti appena visti sono dati semplici o non strutturati: non sono ulteriormente scomponibili. )i<
avanti nella dispensa verr introdotta la possibilit di usare dati complessi o strutturati. 2edremo
anche come sia possibile per il programmatore aggiungere nuovi dati (user de%ned t1pe, tipi defniti
dall%utente basandosi su "uelli nativi del pascal (standard t1pe, tipi standard.
7>3A: la sezione delle costanti pu@ anche non essere presente.
)rocedure e $unzioni
Dopo la sezione delle variabili pu@ essere presente "uella dei cosiddetti sottoprogrammi. !i rimanda la
discussione di "uesto argomento ad un momento pi< appropriato, molto pi< avanti nella dispensa\
)er il momento possiamo comportarci come se "uesta sezione non esistesse.
!ezione esecutiva (corpo principale del programma
E9 %a #a$te 5e$a"ete o#e$at!5a &e% #$o4$a""a= Co$$!(#o&e ! #$at!ca a%%a t$a&)*!oe &e%%9a%4o$!t"o. La #a$te
&!c,!a$at!5a / !+att! (o%o #$e#a$ato$!a e (e$5e a% co"#!%ato$e #e$ e((e$e #!< e++!c!ete 2a& e(e"#!o (e coo(ce !
at!c!#o ! t!#! &e%%e 5a$!a6!%! #)0 o$4a!**a$%e #!< e++!c!ete"ete e%%a RAM3 e cot$o%%a$e !% $e(to &e% #$o4$a""a
#e$ a%c)! t!#! &! e$$o$e 2a& e(e"#!o teta$e &! "o&!+!ca$e )a co(tate: co"e #ot$e66e (e o a5e((!"o &!c,!a$ato !
at!c!#o 7)a%! !&et!+!cato$! co(!&e$a$e a((oc!at! a 5a%o$! !"")ta6!%!C3.
A)e(ta (e*!oe !!*!a co %a #a$o%a $!(e$5ata $e#in e te$"!a co %a #a$o%a $!(e$5ata end (e4)!ta &a ) #)to:
#$o4$a" E(e"#!oD Ite(ta*!oe
co(t
G
5a$
G
$e#in
)
end*
TIPI DI I+TRUZIONE C,E +I PO++ONO -ETTERE NELLA +EZIONE E+ECUTI.A
asse#namento: "e"o$!**a ! )a 5a$!a6!%e )a co(tate o##)$e !% 5a%o$e &! )Oa%t$a 5a$!a6!%e o##)$e !% $!()%tato &!
) ca%co%o 2e(#$e((!oe3D ! 1a(ca% !% (!"6o%o &e%%Oa((e4a"eto / 7)e(to: /(
pro#ram E(e"#!D!A((e4a"etoD
5a$
1' 2: !te4e$D K: $ea%D (: (t$!4D
6e4!
1 :P 1LLD 1 :P 2D 1 :P 3Q234 R 23D
K :P 2D K :P 3.14D K :P 1D ( :P Bc!ao
co"e (ta!C9D
e&.
pro#ram A((e4a"et!Co"#at!6!%!D
5a$
c: c,a$D K: $ea%D (: (t$!4D
6e4!
K :P 3 S 7 2Q e7)!5a%e a 1L.L Q3D
c :P BA9D
( :P cD 2Q ) ca$atte$e B(ta9 ! )a (t$!4a
Q3
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. '2
Se*!oe &!c,!a$at!5a
Se*!oe e(ec)t!5a
I% 5a%o$e c,e 5!ee a((e4ato a& )a 5a$!a6!%e &e5e e((e$e &! t!#o co"#at!6!%e.. A)e(to
o (!4!+!ca #e$ +o$*a !&et!co "a c,e 2a%"eo3 !% $!()%tato &e%%Oe(#$e((!oe a%%a &e(t$a
&e% (!"6o%o &! a((e4a"eto (!a co5e$t!6!%e e% t!#o &e%%a 5a$!a6!%e !&!cata a%%a
(!!(t$a.
Co"e $e4o%a #$at!ca $!co$&ate 7)e(ta: ) t!#o #!< 4$a&e #)0 acco4%!e$e )o #!<
B#!cco%o9 "a o !% 5!ce5e$(a.
A& e(e"#!o' (e T / )a 5a$!a6!%e $ea%e: K :P 7 co$$!(#o&e a K :P 7.L e K:P3S7
co$$!(#o&e a K :P 1L.L 24%! !te$! 7 e %O!te$o $!()%tato &e%%Oe(#$e((!oe 3S7 #o((oo
e((e$e co5e$t!t! e% co$$!(#o&ete )"e$o $ea%e (e*a #$o6%e"!3. Ma (e K +o((e )a
5a$!a6!%e !te$a' %Oa((e4a"eto K :P 1.5' a""e((o c,e +o((e accettato' &o5$e66e
t$a(+o$"a$e !% )"e$o $ea%e 1.5 o e% )"e$o !te$o )o o e% )"e$o !te$o &)e co
)a #e$&!ta &! #$ec!(!oe !accetta6!%e e ta%e &a $!c,!e&e$e ) co"a&o e(#%!c!to 2 K :P
t$)c21.53 a& e(e"#!o t$oca !% )"e$o $ea%e $e(t!t)e&o ) !te$o.
T :P 8D co(tate T :P UD 5a$!a6!%e T :P UQ2 S4D e(#$e((!oe
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ''
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
E9 ac,e #o((!6!%e ca%co%a$e e(#$e((!o! +acet! )(o &! #a$ete(!. U co"#)te$ o ,a #e$0 ece((!t> &! +ac!%!ta$(! %a
%ett)$a &! )Oe(#$e((!oe )t!%!**a&o &!5e$(! t!#! &! #a$ete(!: 7)a&$e e 4$a++e o &e5oo e((e$e )(ate= B!(o4a )(a$e
!5ece #!< %!5e%%! &! #a$ete(! to&e:
Come siamo a$ituati noi Come de"0essere scritto con un lin#ua##io di pro#ramma1ione
25 S 43 25 S 43
24 M23 Q 223 SN3 24 M23 Q 223 SN3
V 24 S 63 - 3W Q 223 S 73 2 24 S 63 - 3 3 Q 223 S 73
X V 24 S 63 - 3W Q 223 S 73 Y - 267 R N3 2 2 24 S 63 - 33 Q 223 S 73 3 - 267 R N3
Princi%ali o%eratori %re!e4niti e! o%eratori rela#ionali +tili##a"ili %er i %rinci%ali ti%i !i !ato
C,AR
O$&2 ca$atte$e 3 Co&!ce a(c!! co$$!(#o&ete: o$&2BA93 65D o$&2Ba93 N7D o$&2B193 4N
C,$2 co&!ce a(c!!3 Ca$atte$e co$$!(#o&ete: c,$2653 BA9D c,$2N73 Ba9
U#ca(e2 ca$atte$e3 T$a(+o$"a !% ca$atte$e ! "a!)(co%o: )#ca(e2Ba93 BA9D )#ca(e2BA93 BA9
Co+$ot! 2#$e&!cat!3: P' Z 2"!o$e3' [ 2"a44!o$e3' Z[ 2&!5e$(o3' ZP 2"!o$e o& )4)a%e3' [P 2"a44!o$e o& )4)a%e3.
NOTA: (oo t)tt! &a !te&e$(! ! (e(o a%+a6et!co.
INTERI
S M Q So""a' (ott$a*!oe' "o%t!#%!ca*!oe
a DI: 6 A)o*!ete !te$o t$a a e 6: 12 &!5 4 3D 14 &!5 4 3D
a MOD 6 Re(to !te$o &e%%a &!5!(!oe t$a a e 6
S)cc2 )"e$o 3 S)cce((o$e &e% )"e$o !&!cato: ()cc243 5
1$e&2 )"e$o 3 1$e&ece((o$e &e% )"e$o !&!cato: #$e&253 4
Dec2 )"e$o 3 To4%!e )o a )"e$o: &ec273 6
Dec2)"e$o' 7)at!ta3 To4%!e 7)at!t> a )"e$o: &ec212'53 7
Ic2 )"e$o 3 A44!)4e )o a )"e$o: !c273 8
Ic2)"e$o' 7)at!ta3 A44!)4e 7)at!t> a )"e$o: !c212'53 17
A6(2 )"e$o 3 :a%o$e a((o%)to 2o "o&)%o3 &! )"e$o
S7$2K3 A)a&$ato
MK O##o(to &! K
1o((!6!%! e$$o$!: o"er%lo2 e di"isione per 1ero 2&!5!(!o 68 *e$o3.
Co+$ot! 2#$e&!cat!3: P' Z 2"!o$e3' [ 2"a44!o$e3' Z[ 2&!5e$(o3' ZP 2"!o$e o& )4)a%e3' [P 2"a44!o$e o& )4)a%e3.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ')
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
REALI 3 ricordare c4e sono rappresentati nella %orma x = mantissa * 10
caratteristica
come in 5.28 * 10
6
S M Q - So""a' (ott$a*!oe' "o%t!#%!ca*!oe' &!5!(!oe
S7$t 2K3 Ra&!ce 7)a&$ata
S7$2K3 A)a&$ato
S!2K3' co(2K3' ta2K3'
a$cta2K3
Seo' co(eo' ta4ete' a$cota4ete &! K
A6(2 K 3 :a%o$e a((o%)to 2o "o&)%o3 &! K
MK O##o(to &! K
T$)c2K3 T$oca %a #a$te +$a*!oa$e &! K
Ro)&2K3 A$$oto&a"eto &! K
1o((!6!%! e$$o$!: o"er%lo2 2ca$atte$!(t!ca t$o##o 4$a&e #e$ e((e$e $a##$e(etata3' under%lo2 2ca$atte$!(t!ca t$o##o
#!cco%a #e$ e((e$e $a##$e(etata3' &!5!(!oe #e$ *e$o' a$4o"eto !%%e4a%e 2!%%e4a% a$4)"et' co"e ! sqrt(-10)3.
1$o6%e"! &! #$ec!(!oe: / %!"!tata &a% )"e$o &! 6!t &e&!cat! a%%a "at!((a
1$o6%e"! &! a##$o((!"a*!oe: (oo &o5)t! a%%a co5e$(!oe t$a &ec!"a%e e 6!a$!oD a& e(e"#!o L.1 2! &ec!"a%e3 #)0
e((e$e $a##$e(etat! ! 6!a$!o (o%o co"e )"e$o #e$!o&!co 2L.LLL1 LLL1 LLL1G3 c,e )a 5o%ta co5e$t!to !
&ec!"a%e #)0 &a$e o$!4!e a o"e a##$o((!"at! co"e L.LNNNNNN o N.NNNNNEM2
Co+$ot! 2#$e&!cat!3: P' Z 2"!o$e3' [ 2"a44!o$e3' Z[ 2&!5e$(o3' ZP 2"!o$e o& )4)a%e3' [P 2"a44!o$e o& )4)a%e3.
+TRIN5,E
S Cocatea*!oe: Bc!ao B S Ba t)tt!9 Bc!ao a t)tt!9
Co#82(' !!*!o'
7)at!3
Re(t!t)!(ce &e%%a (t$!4a s %a (otto (t$!4a c,e !!*!a a%%a #o(!*!oe inizio e cot!)a #e$ quanti ca$atte$!
Co+$ot! 2#$e&!cat!3: P' Z 2"!o$e3' [ 2"a44!o$e3' Z[ 2&!5e$(o3' ZP 2"!o$e o& )4)a%e3' [P 2"a44!o$e o& )4)a%e3.
NOTA: (oo t)tt! &a !te&e$(! ! (e(o a%+a6et!co.
ALTRI CO-ANDI UTILI
Le4t,2(3 Re(t!t)!(ce a%%a %)4,e**a 2)"e$o &! ca$atte$!3 &e%%a (t$!4a (
1o(2(1' (23 Re(t!t)!(ce %a #o(!*!oe &e%%a (t$!4a (1 a%%O!te$o &e%%a (t$!4a (2D (e (1 o 5!ee t$o5ata $e(t!t)!(ce *e$o
:a%2(' K' e$$o$e3 Se #o((!6!%e t$a(+o$"a %a (t$!4a ( e% )"e$o co$$!(#o&ete e "e"o$!**a !% $!()%tato e%%a 5a$!a6!%e TD (e
%a co5e$(!oe $!e(ce e%%a 5a$!a6!%e !te$a errore e ,a "e((o !% 5a%o$e *e$oD (e %a co5e$(!oe o $!e(ce !
errore 5!ee e"e((o ) 5a%o$e &!5e$(o &a *e$o
St$2K' (3 Co5e$te !% )"e$o K e%%a (t$!4a co$$!(#o&ete "e"o$!**a&o%a e%%a 5a$!a6!%e (t$!4a (
Ic$e"eto-&ec$e"eto &e% 5a%o$e &! )a 5a$!a6!%e.
K :P K S 1D K a(()"e !% 5a%o$e att)a%e !c$e"etato &! )o 2K &!5eta K !c$e"etato &! )o3
ATTENZIONE: o co+o&ete%o co %a (c$!tt)$a K P 8 S 1 2te(t &! co+$oto t$a !% 5a%o$e cote)to e%%a 5a$!a6!%e K
e 7)e%%o &e%%a 5a$!a6!%e 8 !c$e"etato &! )o.
K :P K S 5.2D K 5!ee !c$e"etata &! 5.2 2e5!&ete"ete !% t!#o &! K / real3
K :P K M1LD K 5!ee !c$e"etata &! 1L
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. '5
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
PRINCIPALI OPERATORI IN ORDINE DECRE+CENTE DI PRECEDENZA
not
Ne4a*!oe %o4!ca 26oo%eaa3D e(e"#!o: ot KP8 2e(#$e((!oe 5e$a (e !% 5a%o$e &e%%a 5a$!a6!%e K / &!5e$(o
&a 7)e%%o &! 83D
Ne4a*!oe 6!t a 6!t 2$it2ise3: ot 1LL1L L11L1
S Mo%t!#%!ca*!oe a$!t"et!ca
4 D!5!(!oe 2t$a )"e$! $ea%!3
div D!5!(!oe !te$a
mod Mo&)%o 2!% $e(to &! )a &!5!(!oe !te$a3 5 "o& 2 1 18 "o& 5 3
and
A& 6oo%eao: 2K[43 a& 2KZ123 2e(#$e((!oe 5e$a (e K ,a ) 5a%o$e co"#$e(o t$a 4 e 123
A& 6!t@!(e: 1LL1 a& 1L11 11L1
Z So""a a$!t"et!ca' cocatea*!oe &! (t$!4,e 2Bc!ao B S Ba t)tt!9 Bc!ao a t)tt!93
M Sott$a*!oe a$!t"et!ca
or
O$ 6oo%eao: 2KZ43 o$ 2K[123 2e(#$e((!oe 5e$a (e K ,a ) 5a%o$e e(te$o a%%9!te$5a%%o 24'123
O$ 6!t@!(e: 1LL1 a& 1L11 1L11
Y Te(t &! )4)a4%!a*a
^_
Te(t &! o )4)a4%!a*a 2&!5e$(o &a3D K Z[ 8 2e(#$e((!oe 5e$a (e !% 5a%o$e &e%%a 5a$!a6!%e K / &!5e$(o &a
7)e%%o &! 83
^ Te(t "!o$e &!
_ Te(t "a44!o$e &!
^Y Te(t "!o$e o )4)a%e &!
_Y Te(t "a44!o$e o )4)a%e &!
comandi di in#resso6uscita: (e$5oo #e$ ac7)!(!$e &at! &a%%a ta(t!e$a o #e$ 5!()a%!**a$e $!()%tat! )"e$!c!' "e((a44!
&! te(to' ca$atte$! (e"!4$a+!c!' #$!"!t!5e 4eo"et$!c,e 2$ette' c!$co+e$e*e3' ()o!' (ta"#a$e ecc.
uscita (scrittura)
2rite7espressione8! espressione9! ):: "o(t$a ()%%o (c,e$"o %a (e7)e*a &e! 5a%o$! &e%%e e(#$e((!o! !&!cate t$a
#a$ete(!D espressione1/2ecc. #)0 e((e$e #$at!ca"ete 7)a%(!a(! co(a 2)a co(tate )"e$!ca')a co(tate (t$!4a'
)a 5a$!a6!%e &! t)tt! ! #$!c!#a%! t!#!' )Oe(#$e((!oe c,e 5e$$e66e #$!"a ca%co%ata e& !% c)! 5a%o$e (a$e66e 7)!&!
5!()a%!**atoD ota: o 5a a ca#o a)to"at!ca"eteD #e$ c)! !% ()cce((!5o co"a&o &! 5!()a%!**a*!oe () 5!&eo
cot!)e$> ()%%a (te((a %!ea &e%%o (c,e$"o 2a "eo c,e (! (!a 4!> a$$!5at! a%%O)%t!"a #o(!*!oe' e% 7)a% ca(o (! 5a
co")7)e a ca#o3D
2riteln7espressione8! espressione9! ):: co"e !% co"a&o write e& ! #!< (! #o(!*!oa a)to"at!ca"ete ()%%a
#$o((!"a %!ea &e%%o (c,e$"o.
E(e"#!: @$!te2123D @$!te2Ba93D @$!te2Bc!ao "o&o93D @$!te2BH!a! ,a B' eta' B a!93D
@$!te%2BI ) (eco%o c! (oo B' 6LQ6LQ24Q365Q1LL.L' B(eco&!93D
NOTA: (e o "o%t!#%!ca((!"o #e$ 1LL.L 2c! a5e5ate 6a&atoC3 otte$$e""o ) "e((a44!o &! e$$o$e #e$c,E !% $!()%tato
()#e$e$e66e !% #!< 4$a&e )"e$o !te$o 2%o4!t3 $a##$e(eta6!%e co !% t)$6o 1a(ca%. I&!ca&o !5ece ) )"e$o
$ea%e !% ca%co%o 5!ee e++ett)ato e% &o"!!o &e! )"e$! $ea%!.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. '*
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
I% +o$"ato &e% $!()%tato )(a %a ota*!oe e(#oe*!a%e: 3.1536LLLLLLESLN. E9 #e$0 #o((!6!%e !&!ca$e &e4%!
!&!cato$! &! a"#!e**a: &etto ! a%t$e #a$o%e #o((!a"o (ce4%!e$e 7)ate #o(!*!o! ()% 5!&eo )t!%!**a$e #e$ %e c!+$e
#$!"a e &o#o !% #)to &ec!"a%e:
@$!te%26LQ6LQ24Q365Q1LL.L/8;/;3 31536LLLLL :1L:L (!4!+!ca 1L #o(!*!o! ! t)tto' &! c)!
L 2e(()a3 #e$ %e c!+$e &o#o !% #)to &ec!"a%e
@$!te%26LQ6LQ24Q365Q1LL.L/8</93 31536LLLLL.LL :13:2 (!4!+!ca 13 #o(!*!o! ! t)tto' &! c)! 2 #e$ %e
c!+$e &o#o !% #)to &ec!"a%e 26!(o4a cota$e
ac,e 7)e(tO)%t!"o3
ingresso (lettura)
readln7 "aria$ile:: !% #$o4$a""a (! "ette ! atte(a &! ) 5a%o$e c,e &e5e e((e$e &!4!tato )(a&o %a ta(t!e$aD !%
t!#o &e% &at! !(e$!to &e5e co$$!(#o&e$e a 7)e%%o &e%%a 5a$!a6!%eD ) 7)a&$at!o o& ) t$att!o %a"#e44!ate
!&!cao %o (tato &! atte(aD !% &ato (! !te&e &!4!tato co"#%eta"ete 7)a&o 5!ee #$e")to !% ta(to !5!o 2ete$
()%%e ta(t!e$e a"e$!cae3D !% 5a%o$e !(e$!to 5!ee "e"o$!**ato e%%a 5a$!a6!%e !&!cata: &a 7)e(to "o"eto !
a5at! &!5eta &!(#o!6!%e e% #$o4$a""a.
Comandi per il controllo del %lusso di esecu1ione
T)tt! ! co"a&! 5!(t! +!o a& o$a (oo &e% t)tto !()++!c!et! #e$ implementare 2$ea%!**a$e ()% co"#)te$3 a%4o$!t"!
ac,e "o%to (e"#%!c!. I""a4!!a"o a& e(e"#!o ) #$o4$a""a c,e c,!e&e a c,! %o (ta )(a&o &! !(e$!$e %Oet>D !%
#$o4$a""a &o5$e66e $!(#o&e$e co ) "e((a44!o a##$o#$!ato a (eco&a c,e c! (! t$o5! &! +$ote a& ) "a44!o$ee
#!)tto(to c,e a ) "!o$ee.
No cO/ "o&o (c$!5e&o (e"#%!ce"ete )O!(t$)*!oe &o#o %Oa%t$a &! $!)(c!$e ! 7)e(to !teto= 1e$ o$a' !+att!' (!a"o
(o%o ! 4$a&o &! !&!ca$e ! (e7)e*a )a (e$!e &! co"a&!. A)e(to / ce$ta"ete )t!%e e& !&!5!&)a %a #$!"a &e%%e
co(!&&ette strutture %ondamentali della pro#ramma1ione' Ne "acao &)e: %a sele1ione e %Oitera1ione' La
(e%e*!oe co$$!(#o&e %a #o((!6!%!t> &! +a$ e(e4)!$e ) 6%occo &! !(t$)*!o! #!)tto(to c,e ) a%t$o a (eco&a &e%
$!()%tato &! ) co+$oto. LO!te$a*!oe co$$!(#o&e !5ece %a #o((!6!%!t> &! +a$ $!#ete$e ) 6%occo &! !(t$)*!o! +!o a%
5e$!+!ca$(! &! )a ce$ta co&!*!oe.
D)e (t)&!o(! ,ao &!"o(t$ato c,e co (e7)e*a' (e%e*!oe e %O!te$a*!oe #o((oo e((e$e (c$!tt! t)tt! ! #o((!6!%!
#$o4$a""! c,e ) "!c$o#$oce((o$e / ! 4$a&o &! e(e4)!$e. S! #a$%a ac,e &! pro#ramma1ione strutturata'
NOTA: (!ete ca%&a"ete !5!tat! a co()%ta$e %Oa##$o+o&!"eto ()! &!a4$a""! &! +%)((o #e$ 5e&e$e co"e (oo
$a##$e(etate %e (t$)tt)$e +o&a"eta%! &e%%a #$o4$a""a*!oe.
C! (oo t$e t!#! &! (t$)tt)$a (e%ett!5a: a& )a 5!a' a &)e 5!e 2&etta ac,e 6!a$!a3' a "o%te 5!e.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. '+
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)

+ELEZIONE AD UNA .IA
Fa e(e4)!$e )a (!4o%a o& ) 6%occo &! !(t$)*!o! 2&e%!"!tate ! 7)e(to ca(o &a%%a co##!a &! #a$o%e c,!a5e begin
end3 (o%o (e %a co&!*!oe !&!cata e 5e$a 2t$)e3. Se %a co&!*!oe / +a%(a %9!(t$)*!oe 2o !% 6%occo &!
!(t$)*!o!3 5!ee (e"#%!ce"ete !4o$ato. Ecco %a (!ta((! 2a (!!(t$a !% ca(o &! (!4o%a !(t$)*!oe e& a &e(t$a
7)e%%o co #!< &! )a !(t$)*!oe:
!+ co&!*!oe t,e
!(t$)*!oeD
ma non sarebbe sbagliato:
!+ co&!*!oe t,e
6e4!
!(t$)*!oeS!4o%a
e&
Do#o istruzione o / (tato &!"et!cato ) #)to e 5!$4o%a: #$!"a &! ) end #)0 e((e$e o"e((a ! 7)ato !% D
(e$5e a (e#a$a$e &)e !(t$)*!o! e %9e& o #)0 e((e$e co(!&e$ato )9!(t$)*!oe "a ) &e%!"!tato$e.
condizione / ) e(#$e((!oe c,e )a 5o%ta 5a%)tata &e5e 4ee$a$e ) 5a%o$e 6oo%eao 25e$o-+a%(o3D %e co&!*!o!
(! e(#$!"oo co 4%! operatori rela1ionali:
O1ERATORE ESEM1I
Z "!o$e T Z 4 KS8 Z * a Z 6Sc O$&2c3 Z 67 213 1a$o%a1 Z 1a$o%a2 223
ZP "!o$e o& )4)a%e T ZP 4 KS8 Z * a Z 6Sc O$&2c3 ZP 67 1a$o%a1 ZP 1a$o%a2
P )4)a%e :otoP6 KS8 P * a P 6Sc 2aS63 &!5 2 P 4 C%!ete1 P C%!ete2
[P "a44!o$e o& )4)a%e Tota%e[P1L KS8 [P * a [P 6Sc T [P (7$t2*3 233 1a$o%a1 [P 1a$o%a2
[ "a44!o$e So""a[1LL KS8 [ * a [ 6Sc T [ (7$2*3 Le4t,2co4o"e3[12 243
Z[ &!5e$(o K Z[ 8 KS8 Z[ * a [ 6Sc T Z[ (7$2*3 Co4o"e1 Z[ Co4o"e2
(1) c / ) ca$atte$eD %a +)*!oe o$& $e(t!t)!(ce !% 5a%o$e &e% ()o co&!ce ASCII c,e 5!ee co+$otato co !%
5a%o$e 67.
(2) !arola1 e !arola2 (oo &)e (t$!4,eD !% co+$oto &e5e e((e$e !te(o ! (e(o %e((!co4$a+!co' c!o/
co(!&e$a&o %a #o(!*!oe c,e c!a(c)a #a$o%a occ)#e$e66e ()% 5oca6o%a$!oD #e$ c)! Bcae9 Z Bca ! a!
%!6$!' e "! (a9D !% t)tto (! a##%!ca ac,e 7)a&o %a (t$!4a cot!ee #!< #a$o%e co"e ! B6e% cae9 Z B6e% 4atto9
(") I% 5a%o$e &e%%a 5a$!a6!%e # 5!ee co+$otato co 7)e%%o &e%%a $a&!ce 7)a&$ata &e% 5a%o$e cote)to e%%a
5a$!a6!%e z
($) S! cot$o%%a (e %a %)4,e**a ! ca$atte$! &e%%a (t$!4a cognome ()#e$a 12
I""a4!!a"o &! 5o%e$ a##%!ca$e )o (coto a% #$e**o &! ) #$o&otto (o%o a! c%!et! a6!t)a%!...
program %pplica&conto'
(ar
costo: real' tipo)liente: string' percentuale&conto:
integer'
begin
writeln(*+nserisci costo prodotto: *)' readln( costo )'
writeln(*+nserisci e(entuale , di sconto: *)'
readln(percentuale&conto )'
writeln(*+nserisci il tipo di cliente: *)'
readln( tipo)liente )'
if tipoCliente=abituale then
costo = costo ! "costo#100$ * percentuale%conto&
writeln(*-uesto cliente paga :./ costo):
readln' (0 un readln senza (ariabile attende fino a c1e non (iene premuto il tasto +2+3)
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ',
!+ co&!*!oe t,e
6e4!
!(t$)*!oe1D
!(t$)*!oe2D
G
!(t$)*!oeN
e&D
NOTA: ! "o%t! &e4%! e(e"#! c,e 5e$$ao #$o#o(t! o c! (!
#$eocc)#e$> &! cot$o%%a$e %a co$$ette**a &e! &at! !(e$!t!
t$a"!te %a ta(t!e$a #e$c,E !% co&!ce (! a##e(at!$e66e e
&!5ete$e66e "o%to #!< &!++!c!%e &a (e4)!$e.
I $!+e$!"eto a% #$o4$a""a 7)! a %ato' a& e(e"#!o' %O)tete
#ot$e66e !(e$!$e ) co(to #a$! a *e$o o e4at!5o' )a
#e$cet)a%e &! (coto (e*a (e(o e& ac,e )a &e(c$!*!oe
#e$ !% t!#o &e% c%!ete c,e #ot$e66e B "ette$e ! c$!(!9 !% te(t
+atto co %9!+: BA6!t)a%e9 co %a A "a!)(co%a o 5e$$e66e
$!coo(c!)to !5a%!&o #e$ %Oa##%!ca*!oe &e%%o (coto.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
end.
A%t$! e(e"#!.
#$o4$a" (e%e*!oeD
5a$
a'6'c: !te4e$D
(1'(2: (t$!4D
c1'c2: c,a$D
6e4!
a:P1D 6:P2D c:P1D
(1:PO$o((!OD (2:PO"a$!oOD
c1:POaOD
c2:PO6OD
!+ aP6 t,e
@$!te%2Oa )4)a%e 6O3D
!+ a[3 t,e
@$!te%2Oa "a44!o$e 3O3D
!+ 6Z6 t,e
@$!te%2O6 "!o$e 6O3D
!+ 3[P4 t,e
@$!te%2OI . "a44!o$e )4)a%e IIO3D
2Q !% (e4)ete co+$oto (e4)e %Oo$&!e a%+a6et!co 2aZ6' 6Zc' ac[a6'
ecc.3 Q3
!+ c1ZPc2 t,e
@$!te%2OI ca$. "!o$e )4)a%e IIO3D
!+ (1Z[(2 t,e
@$!te%2O%e (t$!4,e (oo &!5e$(eO3D
!+ (1[(2 t,e
@$!te%2O%a I (t$!4a 5!ee &o#o %a II ()% &!*!oa$!oO3D
$ea&%
e&.
455354 )3674
I% (o%o +atto &! !&eta$e !% co&!ce o / ()++!c!ete a& !&!5!&)a$e !% 6%occo &e%%e !(t$)*!o! &o#o !% t1enD
e%%Oe(e"#!o c,e (e4)e ac,e (e &a%%O!&eta*!oe / #$o6a6!%e c,e %O!te*!oe &a% #$o4$a""ato$e (!a 7)e%%a &!
+a$ e(e4)!$e %e t$e !(t$)*!o! (o%o 7)a&o !% 5a%o$e &e%%a 5a$!a6!%e 8 / "a44!o$e &! &)e' ! $ea%t> #e$ !% co"#!%ato$e
%O!(t$)*!oe if t1en te$"!a &o#o !% D &! istruzione12%e a%t$e &)e !(t$)*!o! (oo (e"#$e e co")7)e e(e4)!te
!&!#e&ete"ete &a%%Oe(!to &e% cot$o%%o ()%%a 5a$!a6!%e 8). I #$at!ca !% #$!"o (#e**oe &! co&!ce / e7)!5a%ete
a 7)e%%o cet$a%eD ()%%a &e(t$a' !5ece' %a 5e$(!oe co$$etta:
I+ K[2 t,e
I(t$)*!oe1D
I(t$)*!oe2D
I(t$)*!oe3D
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. '-
NOTA2: &o#o ) 6e4! 2o &o#o !% t1en (e c9/ )a
(o%a !(t$)*!oe3 a6!t)ate5!' a&a&o a ca#o' a
$!et$a$e &! ) #a!o &! ca$atte$! e a& a%%!ea$e &!
co(e4)e*a t)tto !% 6%occo &e%%e !(t$)*!o!. Do#o
%9end $!to$e$ete a (c$!5e$e %e !(t$)*!o! a%%!eate
co %9if. A)e(ta tec!ca &! (c$!tt)$a (! c,!a"a
indenta1ione. I&eta$e !% co&!ce a)"eta !
"o&o &$a(t!co %a %e44!6!%!t>=
I(t$)*!oe
I+ K[2 t,e
Be4!
I(t$)*!oeD
I(t$)*!oeD
I(t$)*!oe
E&D
I(t$)*!oeD


NOTA1: a%%O!te$o &e%%a #a$te t1en #)0 e((e$e
"e((a )a 7)a%(!a(! !(t$)*!oe 1a(ca%' 7)!&!
ac,e a%t$e (t$)tt)$e &! cot$o%%o &e% +%)((o co"e
) a%t$o B!+ G t,e G9D ! #$at!ca c! (!
$!t$o5e$e66e co (t$)tt)$e B!+ Gt,e G e%(e9 c,e
e cote4oo &e%%e a%t$e 25e&! #!< a5at!3
I(t$)*!oe
I+ K[2 t,e
Be4!
I(t$)*!oeD
I(t$)*!oeD
I(t$)*!oe
E&D
I(t$)*!oeD
I+ K[2 t,e
I(t$)*!oe1D

I(t$)*!oe2D
I(t$)*!oe3D
I+ K[2 t,e
6e4!
I(t$)*!oe1D
I(t$)*!oe2D
I(t$)*!oe3
e&D
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
+ELEZIONE A DUE .IE
R!(#etto a 7)e%%a a& )a 5!a 5!ee a44!)ta %a #a$te &a e(e4)!$e 7)a&o %a co&!*!oe +a%(a:
!+ co&!*!oe t,e
!(t$)*!oeSe:e$a
e%(e
!(t$)*!oeSeFa%(aD
A)! (o#$a (oo (tat! e(e"#%!+!cat! t)tt! ! #o((!6!%! ca(! c,e (! #o((oo #$e(eta$e a (eco&a c,e (!a #$e(ete )a
(o%a !(t$)*!oe &a e(e4)!$e 2e%%a #a$te t1en o e%%a #a$te else3 #!)tto(to c,e ) 6%occo &! &)e o #!< !(t$)*!o! c,e
5ao 7)!&! $acc,!)(e t$a ) begin e& ) end. Ne% #$!"o e(e"#!o cO/ )a (o%a !(t$)*!oe &a e(e4)!$e (!a c,e %a
co&!*!oe (!a 5e$a (!a c,e (!a +a%(a. Ne% (eco&o e(e"#!o c! (oo N !(t$)*!o! &a e(e4)!$e 7)a&o %a co&!*!oe
5e$a e& )a (o%a 7)a&o %a co&!*!oe +a%(a. Ne% te$*o e(e"#!o cO/ )a (o%a !(t$)*!oe &a e(e4)!$e 7)a&o %a
co&!*!oe 5e$a e& N !(t$)*!o! 7)a&o %a co&!*!oe +a%(a. Ne%%O)%t!"o e(e"#!o #!< &! )O!(t$)*!oe &a e(e4)!$e
(!a e% ca(o %a co&!*!oe (!a 5e$a (!a e% ca(o (!a +a%(a.
Se %a co&!*!oe / 5e$a 5!ee e(e4)!ta %O!(t$)*!oe 2o !% 6%occo &! !(t$)*!o! t$a begin end3 &o#o !% t1en e 5!ee
!5ece !4o$ata %a #a$te else. :!ce5e$(a' (e %a co&!*!oe / +a%(a 5!ee !4o$ata %O!(t$)*!oe 2o !% 6%occo &!
!(t$)*!o! t$a begin end3 &o#o !% t1en e 5!ee e(e4)!ta %a #a$te else.
Co&!*!o! co"#o(te
Le co&!*!o! )(ate +!o a& o$a (oo &e+!!te (e"#%!c!D )(a&o ! connetti"i lo#ici and' or e not #o((!a"o
co"#o$e &! #!< co"#%e((e 2co"#o(te3.
La co&!*!oe co"#o(ta c,e )(a and / 5e$a 7)a&o %o (oo CONTEM1ORANEAMENTE t)tte %e co&!*!o!
co!5o%teD (e ANCHE UNA SOLA &! e((e eO +a%(a' %a co&!*!oe !te$a $!()%te$> +a%(a. O4! co&!*!oe &e5e
e((e$e $acc,!)(a t$a #a$ete(! to&e.
if (a9:1) and (a;:") t1en (0 le parentesi sono 3<<=+>%?35+4 0)
writeln(@a e@@ compreso tra 1 e "@)' (0 3?%: per inserire un apostrofo o un accento in una stringa A
necessario raddoppiarlo (altrimenti il compilatore penserebbe
c1e lB termina la stringa0)
if (s1:@rossi@) and (s2:@mario@) t1en
writeln(@e@@ la persona cercataCC@)'
if (s1:@rossi@) and (eta9:1D) t1en
writeln(@rossi e@@ maggiorenne/ masc1io o femmina@)'
(0 le condizioni possono anc1e essere piu@@ di 2 ... de(ono sempre essere (ere
)3?46!35%4%64?4 0)
if (s1:@rossi@) and (eta91D) and (s2:@femmina@) t1en
writeln(@rossi e@@ maggiorenne/ femmina@)'
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. )0
!+ co&!*!oe t,e
I(t$)*!oeSe:e$a
e%(e
6e4!
I(t$)*!oe1SeFa%(aD
I(t$)*!oe2SeFa%(aD
G
I(t$)*!oeNSeFa%(aD
e&D
!+ co&!*!oe t,e
6e4!
I(t$)*!oe1Se:e$aD
I(t$)*!oe2Se:e$aD
G
I(t$)*!oeNSe:e$aD
e&
e%(e
!(t$)*!oeSeFa%(aD
!+ co&!*!oe t,e
6e4!
I(t$)*!oe1Se:e$aD
I(t$)*!oe2Se:e$aD
G
I(t$)*!oeNSe:e$aD
e&
e%(e
6e4!
I(t$)*!oe1SeFa%(aD
I(t$)*!oe2SeFa%(aD
G
I(t$)*!oeNSeFa%(aD
e&D
455354 )3674: "ette$e !% D #$!"a dell.else. I #a(ca% %9!(t$)*!oe if t1en else
/ co(!&e$ata !&!5!(!6!%e e' %o (a#ete' !% D (e$5e a (e#a$a$e &)e !(t$)*!o!.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
La co&!*!oe co"#o(ta c,e )(a or / 5e$a 7)a&o %o / ALMENO UNA &e%%e co&!*!o! co!5o%te.D / +a%(a
7)a&o %e co&!*!o! (oo +a%(e TUTTE CONTEM1ORANEAMENTE.
+f (mese:.>ennaio.) or (mese:.6arzo.) or (mese:.=uglio.) t1en
umeroEgiorni :: "1'
1$e(tate #a$t!co%a$e atte*!oe a% (e4)ete e(e"#!oD 5a %etto co(;: (e Z6e%%a[ o##)$e Z5ecc,!a e $!cca[ a%%o$a ..
o((e$5ate %e #a$ete(!' OBBLIHATORIE: !+ 2 3 o$ 2 2 3 a& 2 3 3
if (s1:@bella@) or ( (eta9F0) and (s2:@ricca@) ) t1en
writeln(@la sposo in ogni caso ...@)'
:a$!ate ()% te"a G 2#!< &! )a !(t$)*!oe &a e(e4)!$e3
if (s1:@bella@) or ( (eta9F0) and (s2:@ricca@) ) t1en
begin
writeln(@la sposo in ogni caso ...@)'
writeln(@poi forse mi pentiroC@)
end
else
begin
writeln(@in questo caso niente dubbi ...@)'
writeln(@... meglio scapoli CC@)
end'
IF !&!+!cat!: 4%! if #o((oo cotee$e a%t$! ifD (! #a$%a &! if !&!+!cat!:
(0 tro(iamo il massimo tra a b c 0)
if a9:b t1en
if a9:c t1en
writeln(@il ma8 e@@ a@)
else
writeln(@il ma8 e@@ c@)
else
if b9:c t1en
writeln(@il ma8 e@@ b@)
else
writeln(@il ma8 e@@ c@)'
+ELEZIONE A -OLTE .IE
Co"!c!a"o co !% &!$e e o / )a (t$)tt)$a !&!(#e(a6!%e "a (o%o )a co"o&!t>. \ (tata !t$o&otta #e$ (o(t!t)!$e %a
(t$)tt)$a &e4%! if ! ca(cata c,e $!(c,!a &! &!5eta$e #oco %e44!6!%e. Ecco 7)! (otto %e &)e (t$)tt)$e a co+$oto e%
co"#!to &! &ete$"!a$e 7)at! 4!o$! c! (oo ! ) ce$to "e(e &e%%Oao: %a 5a$!a6!%e mese cot!ee ) )"e$o &a 1 a
12D %a 5a$!a6!%e anno !% )"e$o c,e co$$!(#o&e a%%Oao &! $!+e$!"eto.
I+ "e(eP2 t,e
I+ ao "o& 4 P L t,e
H!o$!:P2N 2Q 6!(e(t!%e Q3
E%(e
H!o$!:P28
E%(e
I+ 2"e(eP13 o$ 2"e(eP33 o$ 2"e(eP53
o$ 2"e(eP73 o$ 2"e(eP83 o$ 2"e(eP1L3
o$ 2"e(eP123 t,e
H!o$!:P31
E%(e
H!o$!:P3L

Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. )1
IF ! ca(cata:
!+ co&!*!oe1 t,e
G
e%(e
!+ co&!*!oe2 t,e
G
e%(e
!+ co&!*!oe3 t,e
G.
E%(e
G
Case eta o%
1..11: @$!te%2B (e! ) #o##ate=93D
12..15:
6e4!
@$!te%2BO]' &!""! co"e t! c,!a"!93D
$ea&%2 o"e 3D
e&D
else
6e4!
@$!te%2BMat)(a o a""e((! G93D
@$!te%2B1$e"! !5!o #e$ cot!)a$e93D
$ea&%
e&
endD
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
La (t$)tt)$a &! &e(t$a B(! %e44e9 co(;: e% ca(o !% 5a%o$e &! "e(e (!a 2ca(e "e(e o+ G3 2 +a! !% cot$o%%o #e$ !% 6!(e(t!%e'
e% ca(o !5ece !% 5a%o$e (!a )o t$a 1'3'5'7'8'1L'12 ! 4!o$! (oo 31' a%t$!"et! (oo 3L. I #$at!ca (! e%ecao )o
&o#o %Oa%t$o ! ca(! #o((!6!%! 2! 5a%o$! a(()t! &a%%a 5a$!a6!%e c,e (! (ta cot$o%%a&o3 e #e$ c!a(c) ca(o (! !&!cao %e
!(t$)*!o! &a e(e4)!$e. La (t$)tt)$a c,e e $!()%ta / ce$ta"ete #!< %!ea$e e %e44!6!%e &! 7)e%%a otte!6!%e co )a
(e$!e &! if t1en else a!&at! e-o ! ca(cata: e #!< (oo ! ca(! &a co(!&e$a$e e #!< co5!ee )(a$e 7)e(ta
)o5a (t$)tt)$a. Ma 5e&!a"oe ! &etta4%!o %a (!ta((!:
Case "e(e o%
9/ I+ ao "o& 4 P L t,e
H!o$!:P2N 2Q 6!(e(t!%e Q3
E%(e
H!o$!:P28D
8!<!=!>!?!8;!89/ H!o$!:P31D
else
H!o$!:P3LD
endD

Do#o %a #a$o%a $!(e$5ata case &e5e e((e$e (#ec!+!cata %a 5a$!a6!%e &a cot$o%%a$e: #o((!a"o )(a$e (o%o 5a$!a6!%! &! t!#o
integer e c1ar 2! $ea%t> t)tte %e 5a$!a6!%! &! t!#o ordinale3.
1e$ o4! ca(o c,e (! #$e(eta #o((!a"o e%eca$e:
) (!4o%o 5a%o$e 2co"e !% )"e$o 2 c,e $a##$e(eta +e66$a!o e%%Oe(e"#!o3
#!< 5a%o$! (e#a$at! &a 5!$4o%a co %O!&ea c,e %a 5a$!a6!%e &a cot$o%%a$e #)0 a(()"e$e )o 7)a%(!a(! &! 7)e(t!
5a%o$! #e$ $!ca&e$e ! 7)e(to ca(o
) !te$5a%%o &! 5a%o$!: 1..12 (!4!+!ca &a 1a 12' Ba9..9*9 (!4!+!ca &a%%a Ba9 a%%a B*9
)a (!t)a*!oe "!(ta t$a %e &)e #$ece&et! co"e ! 1'3'5M12 c,e 5e$$e66e !te$#$etato co"e o !% 5a%o$e 1' o !%
5a%o$e 3' o ) 5a%o$e t$a 5 e 12
Do#o %Oe%eco &e! 5a%o$! c,e !&!5!&)ao ) ce$to ca(o (! &e5e "ette$e (!"6o%o / 2&)e #)t!3 e #o! o %O)!ca
!(t$)*!oe &a e(e4)!$e o !% 6%occo &e%%e !(t$)*!o! &a e(e4)!$e $acc,!)(e t$a begin e end. O4! ca(o &e5e e((e$e
(e#a$ato &a% ()cce((!5o co ) #)to e 5!$4o%a.
\ #o((!6!%e' "a o o66%!4ato$!o' !(e$!$e )a #a$te else begin end co %O!&ea &! !&!ca$e %e !(t$)*!o! &a e(e4)!$e
e% ca(o !% 5a%o$e &e%%a 5a$!a6!%e &! cot$o%%o o t$o5! $!(cot$o ! e(()o &e! ca(! #$!"! e%ecat!. A& e(e"#!o e%
cot$o%%o &e% 5a%o$e &e%%a 5a$!a6!%e "e(e (e (!a"o ce$t! c,e !% ()o 5a%o$e / e%%O!te$5a%%o 1..12' &o#o a5e$ cot$o%%ato
c,e o (!a &)e e t)tt! ! 5a%o$! c,e co$$!(#o&oo a "e(! co 31 4!o$!' %a #a$te else o #)0 c,e co$$!(#o&e$e a ca(!
! c)! !% "e(e / )o &! 7)e%%! co 3L 4!o$!. Nat)$a%"ete a5$e""o ac,e #ot)to )(a$e %a +o$"a e(te(a (e*a %a #a$te
else:
Case "e(e o%
9/ I+ ao "o& 4 P L t,e
H!o$!:P2N 2Q 6!(e(t!%e Q3
E%(e
H!o$!:P28D
8!<!=!>!?!8;!89/ H!o$!:P31D
@!A!B!88/ H!o$!:P3LD
endD
I% case 5a (e"#$e coc%)(o co ) end. U9)%t!"a #a$t!co%a$!t>: #$!"a &e%%9else &! ) case
&e5e e((e$e "e((o ) #)to e 5!$4o%a #e$c,E a%t$!"et! #ot$e66e e((e$e co+)(o co %a #a$te
else &! ) if t1en else !(e$!to e%%O)%t!"o ca(oG I+att! e%%Oe(e"#!o 7)! ()%%a &e(t$a (e*a !%
#)to e 5!$4o%a &o#o !% 2L' l.else c,e &o5$e66e e((e$e e(e4)!to 7)a&o !% (o44etto ,a #!< &! 18
a! 2ca(o 9#!4%!at)tto9 &e% case3 5e$$e66e !5ece e$$oea"ete a((oc!ato co %9if c,e cot$o%%a
%e ")%te.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. )2
Case eta o%
8''88/ @$!te%2B (e! ) #o##ate=93D
89''8=/
$e#in
@$!te%2BO]' &!""! co"e t! c,!a"!93D
$ea&%2 o"e 3D
endD
else
$e#in
@$!te%2BMat)(a o a""e((! G93D
@$!te%2B1$e"! !5!o #e$ cot!)a$e93D
$ea&%
end
endD
on A un erroreC
Case eta o%
8''8</ #a4,etta:P5D
8@38?: !+ ")%tePL t,e
#a4,etta:P2LD
else
@$!te%2B:a! a %a5o$a$e=93
endD
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
E+ERCIZI E RIEPILO5ATI.I +ULLA +ELEZIONE
+EL8' difficolt' bassa I(e$!ta )9et> &!$e (e (!a"o ! #$e(e*a &! ) "!o$ee o "a44!o$ee.
1$o4$a" "a44!o$e!1D
)(e(
e@&e%a8' c$tD
5a$
eta: !te4e$D 2Q 5a$!a6!%e ! c)! 5e$$aO "e"o$!**ata %OetaO Q3
2Q NOTA: o )(a$e "a! %e %ette$e accetate #e$ !
o"! &e%%e 5a$!a6!%! = Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
@$!te2OA)at! ,a! ,a!C M[ O3D
$ea&%2eta3D
!+ eta[P18 t,e
@$!te%2OO]' 5e&o c,e (e! "a44!o$ee ...O3
e%(e
@$!te%2OSe! aco$a ) #o##ate' to$a t$a O' 18 M eta' Oa! ==O3D
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
2Q #$o6%e"! a#e$t!: co(a ()cce&e (e c,! )(a !% #$o4$a""a (6a4%!a e& !(e$!(ce
) etaO e4at!5a o t$o##o 4$a&e #e$ e((e$e 5e$a C
"o&!+!ca !% #$o4$a""a #e$ cot$o%%a$e 7)e(te #o((!6!%!taO ==
t$o5! %a (o%)*!oe e% (o$4ete O"a44!o$2.#a(O Q3
e&.
+EL9' di%%icoltC/ $assa I(e$!to ) )"e$o' &!$e (e eO #a$! o &!(#a$!
#$o4$a" #a$!&!(#a$!1D
)(e( e@&e%a8' c$tD
5a$
)"e$o: !te4e$D 2Q 5a$!a6!%e ! c)! 5e$$aO "e"o$!**ata !% )"e$o Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
@$!te2OI(e$!(c! ) )"e$o e t! &!$oOO (e eOO #a$! o &!(#a$! M[ O3D
$ea&%2)"e$o3D
!+ )"e$o "o& 2 P L t,e
@$!te%2OeOO #a$!O3
e%(e
@$!te%2OeOO &!(#a$!O3D
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. )'
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
+EL<' di%%icoltC/ $assa I(e$!to ) ca$atte$e' &!$e (e eO )a 5oca%e o& )a co(oate.
#$o4$a" co(oate:oca%eD
)(e(
e@&e%a8' c$tD
5a$
c: c,a$D 2Q 5a$!a6!%e ! c)! 5e$$aO "e"o$!**ata !% (!4o%o ca$atte$e Q3
2Q co""eto: !% t!#o c,a$ #)0 "e"o$!**a$e ) (o%o ca$atte$eD occ)#a %a
"etaO &e%%o (#a*!o &! )a (t$!4a %)4a ) (o%o ca$atte$e #e$c,E co %e
(t$!4,e ) 68te ()##%e"eta$e (e$5e a "e"o$!**a$e %a %)4,e**a &e%%a
(t$!4a (te((aD 7)e(to o eO !5ece o55!a"ete ece((a$!o #e$ )a
5a$!a6!%e ca$atte$e' %a c)! %)4,e**a eOO (e"#$e 1 Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
@$!te2OI(e$!(c! ) ca$atte$e M[ O3D
$ea&%2c3D
2Q 1RIMA SOLUZIONE Q3
@$!te%2O1RIMA SOLUZIONEO3D
!+ 2 cPOaO 3 o$ 2 cPOeO 3 o$ 2 cPO!O 3 o$ 2 cPOoO 3 o$ 2 cPO)O 3 t,e
@$!te%2OeOO )a 5oca%eO3
e%(e
@$!te%2OeOO )a co(oateO3D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
2Q co""eto: 7)e(ta (o%)*!oe o t!ee coto &e%%e 5oca%! ! "a!)(co%o Q3
2Q SECONDA SOLUZIONE Q3
@$!te%2OSECONDA SOLUZIONEO3D
!+ 2 cPOaO 3 o$ 2 cPOeO 3 o$ 2 cPO!O 3 o$ 2 cPOoO 3 o$ 2 cPO)O 3 o$
2 cPOAO 3 o$ 2 cPOEO 3 o$ 2 cPOIO 3 o$ 2 cPOOO 3 o$ 2 cPOUO 3
t,e
@$!te%2OeOO )a 5oca%eO3
e%(e
@$!te%2OeOO )a co(oateO3D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
2Q co""eto: #$o5ate co %a A: %a #$!"a (o%)*!oe o +o$!(ce ) $!()%tato
co$$etto' %a (eco&a (!OD #e$oOO c! (oo "o%t! te(t ... ecco )a (o%)*!oe
#!)OO e++!c!ete Q3
2Q TERZA SOLUZIONE Q3
@$!te%2OTERZA SOLUZIONEO3D
2Q #$!"a t$a(+o$"!a"o !% ca$atte$e ! "a!)(co%o e #o! +acc!a"o ! te(t
(o%o co %e "a!)(co%eD )#ca(e eO )a +)*!oe c,e $e(t!t)!(ce !%
"a!)(co%o &e% ca$atte$e +o$!to co"e #a$a"et$o t$a #a$ete(!D
(e !% ca$atte$e e$a 4!aO ! "a!)(co%o' $!"ae ! "a!)(co%o Q3
c :P )#ca(e2 c 3D
!+ 2 cPOAO 3 o$ 2 cPOEO 3 o$ 2 cPOIO 3 o$ 2 cPOOO 3 o$ 2 cPOUO 3 t,e
@$!te%2OeOO )a 5oca%eO3
e%(e
@$!te%2OeOO )a co(oateO3D
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ))
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
2Q AUARTA SOLUZIONE Q3
@$!te%2OAUARTA SOLUZIONEO3D
2Q (o%)*!oe co !+ ! ca(cata' #oco %e44!6!%e e %)4a Q3
c :P )#ca(e2 c 3D
!+ 2 cZ[OAO 3 t,e
!+ 2 cZ[OEO 3 t,e
!+ 2 cZ[OIO 3 t,e
!+ 2 cZ[OOO 3 t,e
!+ 2 cZ[OUO 3 t,e
@$!te%2OeOO )a co(oateO3
e%(e
@$!te%2OeOO )a 5oca%e 2U3O3
e%(e
@$!te%2OeOO )a 5oca%e 2O3O3
e%(e
@$!te%2OeOO )a 5oca%e 2I3O3
e%(e
@$!te%2OeOO )a 5oca%e 2E3O3
e%(e
@$!te%2OeOO )a 5oca%e 2A3O3D
2Q co""et!: 7)e(ta (o%)*!oe' #!)tto(to #e(ate' co(ete #e$oO &!
!t$a#$e&e$e a*!o! &!++e$e*!ate a (eco&a &e%%e 5oca%! !cot$ateD
! 6%occ,! ELSE (oo t)tt! ece((a$!= &!5e$(a"ete !(e$e&o 7)e%%a 5oca%e
o 5e$$e66e (ta"#ato )%%a= 1$o5a a to4%!e$e %O)%t!"o 6%occo e& !(e$!(c!
%a A ... Q3
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
2Q AUINTA SOLUZIONE Q3
@$!te%2OAUINTA SOLUZIONEO3D
2Q %a #!)O e++!c!ete' (+$)tta&o )a &e%%e +)*!o! &!(#o!6!%!
#e$ %e (t$!4,e: %a +)*!oe #o( $e(t!t)!(ce %a #$!"a #o(!*!oe &! )a
(t$!4a a%%O!te$o &! ) a%t$aD (e o %a t$o5a $e(t!t)!(ce *e$oD
a& e(e"#!o #o(2O#oO'Oto#o%!oO3 $e(t!t)!(ce 3 #e$c,eO %a (t$!4a O#oO
eO (tata t$o5ata a #a$t!$e &a%%a #o(!*!oe 3 e%%a (t$!4a Oto#o%!oO Q3
!+ #o(2c'OaAeE!IoO)UO3 Z[ L t,e 2Q c t$o5ata &a 7)a%c,e #a$te Q3
@$!te%2OeOO )a 5oca%eO3
e%(e
@$!te%2OeOO )a co(oateO3D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. )5
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
+EL@' di%%icoltC/ $assa I(e$!t! A' B e C &!$e (e B eO co"#$e(o t$a A e CD ! #$at!ca (! cot$o%%a (e B a##a$t!ee
a%%O!te$5a%%o VA'CW
#$o4$a" !te$5a%%oD
)(e(
e@&e%a8' c$tD
5a$
a' 6' c: $ea%D
2Q 5a$!a6!%! ! c)! 5e$$ao "e"o$!**at! ! )"e$! Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
@$!te2OI(e$!(c! %OOe(t$e"o (!!(t$o &e%%OO!te$5a%%o M[ O3D
$ea&%2a3D
@$!te2OI(e$!(c! %OOe(t$e"o &e(t$o &e%%OO!te$5a%%o M[ O3D
$ea&%2c3D
2Q (e ! )"e$! (oo (tat! !(e$!t! e%%Oo$&!e (6a4%!ato' (to# Q3
!+ a[c t,e
@$!te%2OIte$5a%%o !"#o((!6!%e.O3
e%(e
6e4!
@$!te2OI(e$!(c! ) )"e$o e t! &!$oOO (e a##a$t!ee a%%OO!te$5a%%o M[ O3D
$ea&%263D
!+ 2 6[Pa 3 a& 2 6ZPc 3 t,e
@$!te%2OA##a$t!eeO3
e%(e
@$!te%2ONo a##a$t!eeO3
e&D
2Q co""et!: (! eO &ec!(o &! co"#$e&e$e 4%! e(t$e"! 2[P e ZP3 e! cot$o%%!D
otate %e #a$ete(! o66%!4ato$!e ! #$e(e*a &! #!)O &! )a co&!*!oeD
co5!cete5! c,e OR !5ece &! a& (a$e66e (tato ) e$$o$e: ) )"e$o'
#e$ e((e$e e%%O!te$5a%%o Va'cW &e5e e((e$e CONTEM1ORANEAMENTE #!)O
4$a&e 2a% "a((!"o )4)a%e3 &! a e #!)O #!cco%o 2a% "a((!"o )4)a%e3 &! cD
)(a&o %OOR %a co&!*!oe (a$e66e (tata 5e$a ac,e 7)a&o UNA SOLA &e%%e
co&!*!o! eO 5e$aD a& e(e"#!o (e %O!te$5a%%o +o((e V5' 11W' e& !% )"e$o
&a 5e$!+!ca$e +o((e 13' co 2 6[Pa 3 o$ 2 6ZPc 3 a&$e""o ! #$at!ca a
5e$!+!ca$e 2 13[P5 3 o$ 2 13ZP11 3 c,e $!()%te$e66e 5e$a 4$a*!e 13[P5 ac,e
(e eO +a%(o c,e 13ZP11 2e 7)!&! !% #)to o a##a$t!ee a%%O!te$5a%%o=
%Oo$ 2"a co &!5e$(e co&!*!o!3 eO !% coett!5o %o4!co 4!)(to 7)a&o
(! 5)o%e cot$o%%a$e c,e ) #)to (!a ESTERNO a& ) !te$5a%%o:
!+ 2 6Za 3 o$ 2 6[c 3 t,e
@$!te%2ONo a##a$t!eeO3
e%(e
@$!te%2OA##a$t!eeO3
!+att! ) #)to NON a##a$t!ee (e eO #!)O #!cco%o &e%%Oe(t$eo !+e$!o$e
o #!)O 4$a&e &e%%Oe(t$e"o ()#e$!o$e
Q3
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. )*
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
+EL=' di%%icoltC/ $assa I(e$!te &)e "!()$e' )a ! #o%%!c! e %Oa%t$a ! cet!"et$!' &!$e 7)a% / %a "a44!o$e
#$o4$a" cet!"et$!1o%%!c!D
)(e(
e@&e%a8' c$tD
5a$
c": $ea%D 2Q 5a$!a6!%e ! c)! 5e$$aO "e"o$!**ate %a "!()$a ! cet!"et$! Q3
#o: $ea%D 2Q 5a$!a6!%e ! c)! 5e$$aO "e"o$!**ate %a "!()$a ! #o%%!c! Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
@$!te2OI(e$!(c! %a "!()$a ! cet!"et$! M[ O3D
$ea&%2c"3D
@$!te2OI(e$!(c! %a "!()$a ! #o%%!c! M[ O3D
$ea&%2#o3D
2Q $!co$&a&o c,e 1 #o%%!ceP2.54 c" ... Q3
!+ #o Q 2.54 [ c" t,e
@$!te%2OLa "!()$a ! #o%%!c! eOO "a44!o$e 2O' #oQ2.54:4:2' Oc"3O3
e%(e
!+ #o Q 2.54 Z c" t,e
@$!te%2OLa "!()$a ! cet!"et$! eOO "a44!o$eO3
e%(e
@$!te%2OLe &)e "!()$e (oo e7)!5a%et!O3D
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
+EL A' di%%icoltC/ $assa I(e$!te %e "!()$e &e! %at! &! 2 $etta4o%! &!$e 7)a%e &e! &)e ,a %a ()#e$+!c!e "a44!o$e
#$o4$a" co+$otaA$eeD
)(e(
e@&e%a8' c$tD
5a$
61' 62: $ea%D 2Q 5a$!a6!%e ! c)! 5e$$ao "e"o$!**ate %e &)e 6a(! Q3
,1' ,2: $ea%D 2Q 5a$!a6!%e ! c)! 5e$$ao "e"o$!**ate %e &)e a%te**e Q3
a1' a2: $ea%D 2Q 5a$!a6!%e ! c)! 5e$$ao "e"o$!**ate %e &)e a$ee Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
@$!te2OI(e$!(c! %a 6a(e &e% #$!"o $etta4o%o M[ O3D
$ea&%2613D
@$!te2OI(e$!(c! %OOa%te**a &e% #$!"o $etta4o%o M[ O3D
$ea&%2,13D
@$!te2OI(e$!(c! %a 6a(e &e% (eco&o $etta4o%o M[ O3D
$ea&%2623D

Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. )+
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
@$!te2OI(e$!(c! %OOa%te**a &e% (eco&o $etta4o%o M[ O3D
$ea&%2,23D
2Q 1RIMA SOLUZIONE Q3
@$!te%2O1RIMA SOLUZIONEO3D
2Q (e o !te$e((a "e"o$!**a$e ! 5a%o$! &e%%e &)e a$ee (! #)oO #$oce&e$e
a% co+$oto &!$etto &e%%e $!(#ett!5e +o$")%e &! ca%co%o Q3
!+ 61Q,1 [ 62Q,2 t,e
@$!te%2OI% #$!"o $etta4o%o ,a %a ()#e$+!c!e "a44!o$eO3
e%(e
!+ 61Q,1 Z 62Q,2 t,e
@$!te%2OI% (eco&o $etta4o%o ,a %a ()#e$+!c!e "a44!o$eO3
e%(e
@$!te%2OI &)e $etta4o%! ,ao %a (te((a ()#e$+!c!eO3D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
2Q SECONDA SOLUZIONE 2"!4%!o$e3 Q3
@$!te%2OSECONDA SOLUZIONEO3D
2Q ca%co%!a"o #$!"a %e &)e ()#e$+!c! e (a%5!a"o !% $!()%tato ! a1 e a2 Q3
a1 :P 61Q,1D
a2 :P 62Q,2D
2Q #o! )(!a"o a1 e a2 #e$ ! co+$ot! Q3
!+ a1[a2 t,e
@$!te%2OI% #$!"o $etta4o%o ,a %a ()#e$+!c!e "a44!o$eO3
e%(e
!+ a1Za2 t,e
@$!te%2OI% (eco&o $etta4o%o ,a %a ()#e$+!c!e "a44!o$eO3
e%(e
@$!te%2OI &)e $etta4o%! ,ao %a (te((a ()#e$+!c!eO3D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
2Q co""et!: 7)e(ta (eco&a (o%)*!oe )(a &)e 5a$!a6!%! ! #!< #e$0 ,a !%
4$o((o #$e4!o &! o +a$ $!#ete$e !% ca%co%o &e%%e a$eeD !o%t$e
#e$"ette$e66e &! )(a$e ! 5a%o$! &e%%e a$ee ac,e ! )a !#otet!ca
cot!)a*!oe &e% #$o4$a""aD $e&e ac,e #!< (e"#%!ce co"#$e&e$e
7)e%%o c,e (! (ta +ace&o Q3
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ),
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
+EL>' di%%icoltC/ media I(e$!ta )Oet>O' &!$e (e (!a"o ! #$e(e*a &! ) "a44!o$ee o &! )
"!o$eeD cot$o%%a$e ac,e e5et)a%! e$$o$! &! !(e$!"eto &a #a$te &e%%O)tete
#$o4$a" "a44!o$e!2D
)(e( e@&e%a8' c$tD
5a$
eta: !te4e$D 2Q 5a$!a6!%e ! c)! 5e$$aO "e"o$!**ata %OetaO NOTA: o )(a$e "a! %e %ette$e accetate #e$ !
o"! &e%%e 5a$!a6!%! = Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
2Q $!(#etto a%%a (o%)*!oe &e%%Oe(e$c!*!o "a44!o$.#a( !&!c,!a"o e%%a $!c,!e(ta &e%%OetaO ac,e %O!te$5a%%o accettato: &a
L a! 2eoato3 a 12L Q3
@$!te2OA)at! ,a! ,a! 2LM12L3 C M[ O3D
$ea&%2eta3D
2Q SOLUZIONE 1 Q3
2Q cot$o%%!a"o #e$ e$$o$!: etaO e4at!5e o ()#e$!o$! a 12L Q3
@$!te%2OSOLUZIONE 1O3D
!+ 2 etaZL 3 o$ 2 eta[12L 3 t,e
@$!te%2OERRORE: %OOetaOO &e5e e((e$e co"#$e(a t$a L e 12L =O3
e%(e
!+ eta[P18 t,e
@$!te%2OO]' 5e&o c,e (e! "a44!o$ee ...O3
e%(e
@$!te%2OSe! aco$a ) #o##ate' to$a t$a O' 18 M eta' Oa! ==O3D
2Q co""et!: otate %e #a$ete(! OBBLIHATORIE 7)a&o ! ) !+ cOeO #!< &! )a co&!*!oeD otate co"e (!a
#o((!6!%e !!*!a$e )a #a$te ELSE ()6!to co ) a%t$o te(tD 7)e(to t!#o &! (t$)tt)$a
!+ ... t,e
...
e%(e
!+ ... t,e
...
e%(e
!+ ... t,e
ecc. ecc.
eO &etta co !+ ! ca(cata e #e$"ette &! 5e$!+!ca$e ! ()cce((!oe )a (e7)e*a &! co&!*!o!
La (o%)*!oe #$ece&ete o co(ete' ! ca(o &! e$$o$e' &! ca#!$e (e %o (6a4%!o eO $e%at!5o a& )Oet>O "!o$e &! *e$o
o a& )Oet>O t$o##o 4$a&e #e$c,/ %e &)e co&!*!o! (oo te(tate !(!e"e. :e&!a"o co"e ottee$e ) cot$o%%o aco$a
#!)O acc)$ato $!(#o&e&o co "e((a44! &! e$$o$e &!++e$e*!at! e #!)O acc)$at!Q3
2Q SOLUZIONE 2 Q3
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%2OSOLUZIONE 2O3D
!+ 2 etaZL 3 t,e
@$!te%2OERRORE: %OOetaOO o #)oOOe((e$e e4at!5a=O3
e%(e
!+ 2 eta[12L 3 t,e
@$!te%2OERRORE: %OOetaOO o #)oOOe((e$e "a44!o$e &! 12L=O3
e%(e
!+ eta[P18 t,e
@$!te%2OO]' 5e&o c,e (e! "a44!o$ee ...O3
e%(e
@$!te%2OSe! aco$a ) #o##ate' to$a t$a O' 18 M eta' O a! ==O3D
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. )-
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
+EL ?' di%%icoltC/ media Letto ) ca$atte$e' &!$e (e co$$!(#o&e a& )a %ette$a "a!)(co%a e (e (;
&!$e (e eO )a co(oate o& )a 5oca%e.
#$o4$a" "a!)(co%aD
5a$
c: c,a$D
6e4!
@$!te2OI(e$!$e ) ca$atte$e M[ O3D
$ea&%2c3D
2Q 1RIMA SOLUZIONE: SENZA CASE Q3
2Q (e !% co&!ce ASCII &e% ca$atte$e %etto eO co"#$e(o t$a 7)e%%! &! A e Z
a%%o$a (! t$atta &! )a "a!)(co%a ... Q3
@$!te%2OSENZA OOCASEOO ...O3D
!+ 2 o$&2c3[Po$&2OAO3 3 a& 2 o$&2c3ZPo$&2OZO3 3 t,e
6e4!
@$!te%2OHa! !(e$!to )a "a!)(co%aO3D
2Q 5e&!a"o o$a (e c eO )4)a%e a& )a &e%%e 5oca%! Q3
!+ 2cPOAO3 o$ 2cPOEO3 o$ 2cPOIO3 o$ 2cPOOO3 o$ 2cPOUO3 t,e
@$!te%2O... e& eOO )a 5oca%eO3
e%(e
@$!te%2O... e& eOO )a co(oateO3
e&
e%(e
@$!te%2ONo (! t$atta &! )a "a!)(co%aO3D
2Q 1OI SOLUZIONE CON CASE Q3
@$!te%2OCON OOCASEOO ...O3D
2Q !% ca(e #!)O e(te$o e cot!ee !te$a"ete ) a%t$o ! ) ()o ca(o Q3
ca(e o$&2c3 o+
o$&2OAO3..o$&2OZO3: 2Q .. (!4!+!ca &a% 5a%o$e .. a% 5a%o$e Q3
6e4!
@$!te%2OHa! !(e$!to )a "a!)(co%aO3D
2Q 7)e(to ca(e eO cote)to e% #$!"o ca(o &! 7)e%%o #!)O e(te$o Q3
ca(e c o+
OAO'OEO'OIO'OOO'OUO: @$!te%2O... e& eOO )a 5oca%eO3D
e%(e
@$!te%2O... e& eOO )a co(oateO3
e&D
e&D
e%(e
@$!te%2ONo (! t$atta &! )a "a!)(co%aO3D
e&D
$ea&%D
e&.
R!co$&o c,e %a +)*!oe o$&2c3' &o5e c / ) ca$atte$e' $e(t!t)!(ce !% co&!ce ASCII &! 7)e(t9)%t!"o. Cot$o%%a$e c,e
o$&2c3 (!a co"#$e(o t$a o$&2BA93 e o$&2BZ93 (!4!+!ca cot$o%%a$e c,e !% co&!ce ASCII &e% ca$atte$e c (!a co"#$e(o t$a
7)e%%o &e%%a #$!"a e &e%%9)%t!"a %ette$a "a!)(co%a e' ! &e+!!t!5a' c,e c cote4a )a %ette$e "a!)(co%a.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 50
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
+EL B' di%%icoltC/ media D!(e4a !% &!a4$a""a &! +%)((o e (c$!5! ) #$o4$a""a c,e' %ett! t$e )"e$!' %! "etta !
o$&!e c$e(cete
#$o4$a" o$&!a^t$eD
5a$ a'6'c'te"#: !te4e$D
6e4!
@$!te2OI(e$!$e !% #$!"o )"e$o M[ O3D
$ea&%2a3D
@$!te2OI(e$!$e !% (eco&o )"e$o M[ O3D
$ea&%263D
@$!te2OI(e$!$e !% te$*o )"e$o M[ O3D
$ea&%2c3D
2Q eO ece((a$!o a((!c)$a$(! c,e t$e )"e$! (!ao ! o$&!e Q3
2Q #$!"a o$&!a a e 6 t$a %o$o Q3
!+ 6Za t,e
6e4!
te"#:PaD
a:P6D
6:Pte"#
e&D
2Q #o! "ett! c a% #o(to 4!)(to ... Q3
!+ cZa t,e
6e4!
te"#:PaD
a:PcD
c:P6D
6:Pte"#
e&
e%(e
!+ cZ6 t,e
6e4!
te"#:P6D
6:PcD
c:Pte"#
e&D
@$!te% 2a'O O'6'O O'c'O #$e"e$e IN:IO #e$ cot!)a$eO3D
$ea&%D
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 51
a
6 N C
6 c
a
N 6 C
6 c
6Za
cZa
a
6 N 3
6 c a
3 6 N
6 c
cZ6
a
6 N 8
6 c a
6 8 N
6 c
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
+EL 8;' di%%icoltC/ media Lett! t$e )"e$! &a ta(t!e$a' &ete$"!a$e (e #o((oo a##a$tee$e a& )a #$o4$e((!oe
a$!t"et!ca. TRACCIA: ! )a #$o4$e((!oe a$!t"et!ca %a &!++e$e*a t$a &)e )"e$!
co(ec)t!5! eO co(tate. A& e(e"#!o: 1 4 7 1L 13 16 ecc. / %a #$o4$e((!oe ! c)! o4! )"e$o (! ott!ee
(o""a&o 3 a% #$ece&ete. La &!++e$e*a t$a &)e )"e$! co(ec)t!5! 7)a%(!a(! / #a$! a 3.
#$o4$a" #$o4$e((!oeD
5a$ a'6'c'te"#: !te4e$D
6e4!
@$!te2OI(e$!$e !% #$!"o )"e$o M[ O3D
$ea&%2a3D
@$!te2OI(e$!$e !% (eco&o )"e$o M[ O3D
$ea&%263D
@$!te2OI(e$!$e !% te$*o )"e$o M[ O3D
$ea&%2c3D
2Q eO ece((a$!o #$!"a a((!c)$a$(! c,e ! t$e )"e$! (!ao ! o$&!e Q3
2Q #$!"a o$&!a a e 6 t$a %o$o Q3
!+ 6Za t,e
6e4!
te"#:PaD
a:P6D
6:Pte"#
e&D
2Q #o! "ett! c a% #o(to 4!)(to ... Q3
!+ cZa t,e
6e4!
te"#:PaD
a:PcD
c:P6D
6:Pte"#
e&
e%(e
!+ cZ6 t,e
6e4!
te"#:P6D
6:PcD
c:Pte"#
e&D
!+ 26Ma3 P 2cM63 t,e
@$!te%2OSoo ! #$o4$e((!oe a$!t"et!caO3
e%(e
@$!te%2ONON (oo ! #$o4$e((!oe a$!t"et!caO3D
@$!te% 2O#$e"e$e IN:IO #e$ cot!)a$eO3D
$ea&%D
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 52
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
+EL 88' di%%icoltC/ alta :e$!+!ca$e (e )a &ata !(e$!ta &a ta(t!e$a eO co$$etta
#$o4$a" &ataCo$$ettaD
5a$ 44'""'aa: !te4e$D 2Q 44P4!o$o' ""P"e(e' aaPao Q3
oJ^&ata: 6oo%eaD
6e4!
@$!te2OI(e$!$e !% 4!o$o: O3D$ea&%2443D
@$!te2OI(e$!$e !% "e(e: O3D$ea&%2""3D
@$!te2OI(e$!$e %OOao: O3D$ea&%2aa3D
2Q 1RIMA SOLUZIONE SENZA CASE Q3
oJ^&ata:P+a%(eD 2Q (e &ata ()#e$a cot$o%%! oJ^&ata 5e$$aO "e((o a t$)e Q3
!+ 244[L3 a& 244Z323 a& 2""[L3 a& 2""Z133 a& 2aa[L3 t,e
!+ ""P2 t,e 2Q +e66$a!o Q3
6e4!
!+ aa "o& 4 P L t,e 2Q #e$ (e"#%!c!taO: 6!(e(t!%! (e ")%t!#%! &! 4 Q3
6e4!
!+ 44ZP2N t,e
oJ^&ata:Pt$)e
e&
e%(e 2Q o 6!(e(t!%e Q3
!+ 44ZP28 t,e
oJ^&ata:Pt$)e
e&
e%(e 2Q "e(e &!5e$(o &a +e66$a!o ... Q3
!+ 2""P13 o$ 2""P33o$ 2""P53 o$ 2""P73 o$
2""P83 o$ 2""P1L3 o$ 2""P123 t,e 2Q "e(e co 31 4!o$! Q3
6e4!
!+ 44ZP31 t,e
oJ^&ata:Pt$)e
e&
e%(e 2Q "e(e co 3L 4!o$! Q3
!+ 44ZP3L t,e
oJ^&ata:Pt$)eD
@$!te%2OSe*a ca(e:O3D
!+ oJ^&ata t,e
@$!te%2OData co$$etta ... O3
e%(e
@$!te%2OData e$$ata ==O3D
$ea&%D
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 5'
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
2Q 1OI SOLUZIONE CON CASE Q3
oJ^&ata:P+a%(eD
!+ 244[L3 a& 244Z323 a& 2""[L3 a& 2""Z133 a& 2aa[L3 t,e
ca(e "" o+
2: !+ aa "o& 4 P L t,e
6e4!
!+ 44ZP2N t,e
oJ^&ata:Pt$)e
e&
e%(e 2Q o 6!(e(t!%e Q3
!+ 44ZP28 t,e
oJ^&ata:Pt$)eD
1'3'5'7'8'1L'12: !+ 44ZP31 t,e
oJ^&ata:Pt$)eD
e%(e
!+ 44ZP3L t,e
oJ^&ata:Pt$)eD
e&D
@$!te%2OCo !% ca(e:O3D
!+ oJ^&ata t,e
@$!te%2OData co$$etta ... O3
e%(e
@$!te%2OData e$$ata ==O3D
$ea&%D
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 5)
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
+TRUTTURE ITERATI.E
E(a"!e$e"o o$a ! t$e t!#! c%a((!c! &! (t$)tt)$a !te$at!5a e)"e$at!5a 2c!c%o for do3' !&e+!!ta co cot$o%%o !
co&a-)(c!ta #e$ 5e$o 2c!c%o repeat until3 e &e%%a !&e+!!ta co cot$o%%o ! te(ta-)(c!ta #e$ +a%(o 2c!c%o w1ile3.
1$e"e((a: ! $ea%t> #ot$e"o (c$!5e$e ) 7)a%(!a(! #$o4$a""a )t!%!**a&o (o%o )a &e%%e &)e +o$"e &! (t$)tt)$a
!te$at!5a !&e+!!ta. I+att! %a (t$)tt)$a !te$at!5a e)"e$at!5a #)0 e((e$e B(!")%ata9 co )a &e%%e a%t$e &)e' e& /
(e"#$e #o((!6!%e $!(c$!5e$e ) (e4"eto &! co&!ce c,e )t!%!**a )a &e%%e &)e +o$"e &! !te$a*!oe !&e+!!ta )(a&o
%Oa%t$a. Detto ! a%t$e #a$o%e t)tte %e o(t$e e(!4e*e #ot$e66e$o e((e$e (o&&!(+atte o )t!%!**a&o (o%o !% c!c%o repeat
until o )(a&o (o%o !% c!c%o w1ile.
Co"e ,o a5)to 4!> "o&o &! (otto%!ea$e #e$ ! co(t$)tto case %O)(o &! +o$"e &!5e$(e +ac!%!ta %a #$o4$a""a*!oe !
7)e! ca(! ! c)! )a &e%%e +o$"e &! !te$a*!oe e(!(tet! / #a$t!co%a$"ete !&!cata.
+truttura iterati"a enumerati"a
S! c,!a"a co(; #e$c,E #)0 e((e$e )(ata (o%o (e !% )"e$o &! 5o%te c,e %O!(t$)*!oe o& !% 6%occo &! !(t$)*!o! &e5e
e((e$e $!#et)to / oto e% "o"eto ! c)! !% c!c%o !!*!a' e& / #e$ c)! #o((!6!%e +a$ cota$e 2c!o/ e)"e$a$e3 a%
#$o4$a""a !% )"e$o &! 5o%te c,e &e5e $!#ete$e %e !(t$)*!o!. Ecco %a (!ta((!:
Gor (ariabileEdiEcontrollo :: (aloreEinizio to (aloreEfine do
+struzioneD
O##)$e:
Gor (ariabileEdiEcontrollo :: (aloreEinizio to (aloreEfine do
begin
+struzione1'
+struzione2'

+struzione'
end'
La 5a$!a6!%e &! cot$o%%o &e5e e((e$e &! t!#o o$&!a%e 2integer/ longint o c1ar ac,e (e 7)e(tO)%t!"o ca(o / a((a! $a$o3.
A& e((a 5!ee a((e4ato co"e 5a%o$e !!*!a%e 7)e%%o !&!cato &o#o %Oo#e$ato$e &! a((e4a"eto. Se !% 5a%o$e !!*!a%e
/ !+e$!o$e a 7)e%%o !&!cato co"e +!a%e &o#o %a #a$o%a c,!a5e to %e !(t$)*!o! o (oo $!#et)te e##)$e )a 5o%ta.
D!5e$(a"ete !% c!c%o !!*!a e %e !(t$)*!o! (oo e(e4)!te )a #$!"a 5o%taD &o#o c,e / (tata e(e4)!ta %O)%t!"a
!(t$)*!oe %a 5a$!a6!%e &! cot$o%%o 5!ee !c$e"etata &! )a )!t>D (e !% 5a%o$e / !+e$!o$e o )4)a%e a 7)e%%o !&!cato
co"e +!a%e !% c!c%o 5!ee $!#et)to. I% c!c%o te$"!a 7)a&o !% 5a%o$e &e%%a 5a$!a6!%e &! cot$o%%o ()#e$a 7)e%%o !&!cato
co"e 5a%o$e +!a%e.
LOe(e"#!o c,e (e4)e
(ta"#a #e$ c!7)e
5o%te !% "e((a44!o
Bc!ao=9:
#$o4$a" c!c%!D
5a$ !: !te4e$D
6e4!
+o$ !:P1 to 5 &o
@$!te%2Bc!ao=93D

$ea&%D
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 55
#$o4$a" c!c%!D
5a$ !: !te4e$D
6e4!
+o$ !:P1 to 1 &o
@$!te%2Bc!ao=93D

$ea&%D
e&.
I 7)e(to ca(o !% c!c%o
5!ee $!#et)to )a 5o%ta
#$o4$a" c!c%!D
5a$ !: !te4e$D
6e4!
+o$ !:P1 to L &o
@$!te%2Bc!ao=93D

$ea&%D
e&.
I 7)e(to ca(o !% c!c%o o
5!ee $!#et)to eac,e )a
5o%ta
#$o4$a" c!c%!D
5a$ !: !te4e$D
6e4!
+o$ !:P M3 to 3 &o
@$!te%2Bc!ao=93D

$ea&%D
e&.
I% 5a%o$e &O!!*!o o &e5e e((e$e #e$ +o$*a 1.
I% c!c%o c,e (e4)e (ta"#e$> !% "e((a44!o
(ette 5o%te 2o &!"et!c,!a"o c,e &e5e
co(!&e$a$e ac,e !% 5a%o$e L e%%a (e7)e*a
c,e 7)! $!#o$to #e$ !te$o M3 M2 M1 L 1 2 3 3
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
#$o4$a" c!c%!D
5a$ !' 6a(e' a%te**a' 7)at!: !te4e$D
6e4!
@$!te%2BA)at! t$!a4o%! 5)o! e(a"!a$eC93D
$ea&%2 7)at! 3D

+o$ !:P 1 to 7)at! &o
6e4!
@$!te%2BI(e$!(c! %a "!()$a &e%%a 6a(e &e%
t$!a4o%o93D
$ea&%2 6a(e 3D
@$!te%2BI(e$!(c! %a "!()$a &e%%99 a%te**a
co$$!(#o&ete93D
$ea&%2 a%te**a 3D
@$!te%2BLa "!()$a &e%%a ()#e$+!c!e &! 7)e(to t$!a4o%o /: B' 6a(eQa%te**a-23D
$ea&%D
e&D 2Q &e% +o$ Q3
e&.
Cota$e co"e ! 4a"6e$!: e(!(te )a +o$"a %e44e$"ete "o&!+!cata &e% co(t$)tto for c,e co(ete &! co(!&e$a$e !
5a%o$! &e%%a 5a$!a6!%e &! cot$o%%o ! "o&o &ec$e(cete cota&o' #e$ co(; &!$e' a%%O!&!et$o. LOe(e"#!o (e4)ete
(ta"#a ()% 5!&eo ! )"e$! &a 1L a 1:
#$o4$a" c!c%!D
5a$ !: !te4e$D
6e4!
+o$ !:P 1L
&o@to 1 &o
@$!te%2 ! 3D

$ea&%D
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 5*
A)e(to e(e"#!o c,!a$!(ce co"e o (!a ece((a$!o coo(ce$e %Oe(atto 5a%o$e
&e% )"e$o &e%%e 5o%te c,e (a$> $!#et)to !% c!c%o a% "o"eto &e%%a (c$!tt)$a
&e% co&!ce.
\ !5ece ece((a$!o c,e 7)e(to 5a%o$e (!a oto a% "o"eto ! c)! !% c!c%o
&o5$> e((e$e e(e4)!to: oto o (!4!+!ca (a#e$e 7)a%e (a$> e++ett!5a"ete
7)e(to 5a%o$e 2/ %O)tete #$o4$a""a c,e &ec!&e 7)at! (a$ao ! t$!a4o%!
e(a"!at! &!4!ta&o 7)e(to ) 5a%o$e 7)a&o !% #$o4$a""a 4%!e%o c,!e&e3D
(!4!+!ca !5ece (a#e$e c,e 7)e(to 5a%o$e / cote)to ! )a ce$ta 5a$!a6!%e
27)at!3 e& / 7)e(tO)%t!"a c,e #)0 e((e$e )t!%!**ata co"e 5a%o$e te$"!a%e
&e%%a 5a$!a6!%e &! cot$o%%o.
Co"e 5e&ete' / ()++!c!ete !&!ca$e !5ece &! to %a #a$o%a c,!a5e downto e co"e #)to &! !!*!o ) 5a%o$e #!<
4$a&e &! 7)e%%o !&!cato #e$ !% #)to &! +!e.
A)e(to e(e"#!o / "o%to !te$e((ate ac,e #e$ ) a%t$o "ot!5o: &!"o(t$a co"e (!a possi$ile utili11are nelle
istru1ioni del ciclo il "alore assunto in quel momento dalla "aria$ile di controllo.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
E+ERCIZI E RIEPILO5ATI.I +UL CICLO DOR
ITE8' di%%icoltC/ $assa (ta"#a &e! #$!"! N )"e$! at)$a%!' co N %etto &a ta(t!e$a
#$o4$a" )"e$!D
)(e( e@&e%a8' c$tD
5a$
!: !te4e$D 2Q cotato$e c!c%o Q3 : !te4e$D 2Q 7)! 5!ee "e"o$!**ato !% )"e$o %etto &a ta(t!e$a Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
@$!te2OF!o a c,e )"e$o &e5o a$$!5a$eC M[ O3D $ea&%2 3D
+o$ ! :P 1 to &o
@$!te%2 ! 3D
2Q co""et!: eO aco$a "ate$!a &! &!(#)ta t$a "ate"at!c! (e co(!&e$a$e %o
*e$o ) at)$a%eD (e %o (! 5)o%e co(!&e$a$e ta%e !% co&!ce &!5eta:
+o$ ! :P L to M1 &o
@$!te%2 ! 3D
!+att! (e c,!e&e((!"o ! #$!"! 5 at)$a%! &o5$e""o ottee$e: L'1'2'3'4
e (a$e66e 7)!&! ece((a$!o +e$"a$e !% c!c%o a 4' c!oeO M1
Q3
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
ITE9' di%%icoltC/ $assa (ta"#a &e! #$!"! N )"e$! at)$a%!' co N %etto &a ta(t!e$aD %a (ta"#a &e5e a55e!$e &a%
)"e$o #!)O 4$a&e a% #!)O #!cco%o
#$o4$a" )"e$!D
)(e( e@&e%a8' c$tD
5a$
!: !te4e$D 2Q cotato$e c!c%o Q3 : !te4e$D 2Q 7)! 5!ee "e"o$!**ato !% )"e$o %etto &a ta(t!e$a Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
@$!te2OF!o a c,e )"e$o &e5o a$$!5a$eC M[ O3D $ea&%2 3D
+o$ ! :P &o@to 1 &o 2Q NOTATE IL DO?NTO IN:ECE DI TO ==== Q3
@$!te%2 ! 3D
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 5+
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
ITE<' di%%icoltC/ $assa (ta"#a &e! #$!"! N )"e$! at)$a%!' co N %etto &a ta(t!e$aD a +!aco &! c!a(c) )"e$o
!&!ca$e (e eO #a$! o &!(#a$!
#$o4$a" )"e$!D
)(e( e@&e%a8' c$tD
5a$
!: !te4e$D 2Q cotato$e c!c%o Q3 : !te4e$D 2Q 7)! 5!ee "e"o$!**ato !% )"e$o %etto &a ta(t!e$a Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
@$!te2OF!o a c,e )"e$o &e5o a$$!5a$eC M[ O3D $ea&%2 3D
2Q $!co$&o c,e %Oo#e$ato$e MOD ca%co%a !% $e(to &e%%a &!5!(!oe t$a !% )"e$o c,e 5!ee "e((o a%%a ()a (!!(t$a e
7)e%%o c,e 5!ee "e((o a%%a ()a &e(t$aD a& e(e"#!o 7 "o& 3 ca%co%a !% $e(to &e%%a &!5!(!oe t$a 7 e 3' 7)!&! 1D 13
"o& 8 M[ 5D 1N "o& 5 M[ 4D 7)a&o !% #$!"o )"e$o eO ")%t!#%o &e% (eco&o !% $e(to eO *e$o: 4 "o& 2 M[ LD
15 "o& 3 M[ LD 15 "o& 5 M[ LD Q3
+o$ ! :P 1 to &o
6e4!
@$!te2 ! 3D
2Q ! )"e$! #a$! &!5!(! #e$ &)e &ao $e(to L Q3
!+ ! "o& 2 P L t,e
@$!te%2O )"e$o #a$!O3
e%(e
@$!te%2O )"e$o &!(#a$!O3D
e&D
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
ITE@' di%%icoltC/ $assa Sta"#a &e! )"e$! &!(#a$! "!o$! o )4)a%! a N' co N %etto &a ta(t!e$a
#$o4$a" &!(#a$!D
)(e( e@&e%a8' c$tD
5a$
!: !te4e$D 2Q cotato$e c!c%o Q3 : !te4e$D 2Q 7)! 5!ee "e"o$!**ato !% )"e$o %etto &a ta(t!e$a Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
@$!te2OF!o a c,e )"e$o &e5o a$$!5a$eC M[ O3D $ea&%2 3D
+o$ ! :P 1 to &o
6e4!
!+ ! "o& 2 P 1 t,e
@$!te%2 ! 3D
e&D
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 5,
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
ITE=' di%%icoltC/ $assa Sta"#a &e! #$!"! N )"e$! at)$a%! 2N %etto &a ta(t!e$a3 co a +!aco
! $!(#ett!5! 7)a&$at! e c)6!
#$o4$a" #ote*eD
)(e(
e@&e%a8' c$tD
5a$
!: !te4e$D 2Q cotato$e c!c%o Q3
: !te4e$D 2Q 7)! 5!ee "e"o$!**ato !% )"e$o %etto &a ta(t!e$a Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
@$!te2OF!o a c,e )"e$o &e5o a$$!5a$eC M[ O3D
$ea&%2 3D
2Q 1RIMA SOLUZIONE Q3
@$!te%2O1RIMA SOLUZIONEO3D
+o$ ! :P 1 to &o
@$!te%2 !' O O' !Q!' O O' !Q!Q! 3D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
2Q SECONDA SOLUZIONE 2(+$)tta %Oo#e$ato$e (7$ c,e ca%co%a !% 7)a&$ato Q3
@$!te%2OSECONDA SOLUZIONEO3D
+o$ ! :P 1 to &o
@$!te%2 !' O O' (7$2!3' O O' (7$2!3Q! 3D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
2Q TERZA SOLUZIONE
a%%!ea ! )"e$! )(a&o 4otoK82co%oa' $!4a3 #e$ #o(!*!oa$e !% c)$(o$e a%%a co%oa-$!4a &e%%o (c,e$"o
&e(!&e$ataD @,e$eU eO )a +)*!oe c,e $e(t!t)!(ce !% )"e$o &! $!4a &o5e (! t$o5a !% c)$(o$eD 7)!&! 4otoK827'
@,e$eU3 (!4!+!ca co%oa 7' o ")o5e$t! &a%%a $!4a () c)! t! t$o5! ...Q3
@$!te%2OTERZA SOLUZIONEO3D
+o$ ! :P 1 to &o
6e4!
@$!te2 ! 3D
4otoK827'@,e$eU3D @$!te2 (7$2!3 3D
4otoK8214'@,e$eU3D @$!te%2 (7$2!3Q! 3
e&D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 5-
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
ITEA' di%%icoltC/ $assa Sta"#a &e! )"e$! !te$! $e%at!5! &a MN a SN' co N %etto &a ta(t!e$a
#$o4$a" )"e$!D
)(e(
e@&e%a8' c$tD
5a$
!: !te4e$D 2Q cotato$e c!c%o Q3
: !te4e$D 2Q 7)! 5!ee "e"o$!**ato !% )"e$o %etto &a ta(t!e$a Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
@$!te2OF!o a c,e )"e$o &e5o a$$!5a$eC M[ O3D
$ea&%2 3D
+o$ ! :P M to &o
@$!te%2 ! 3D
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
ITE>' di%%icoltC/ $assa Sta"#a &e! )"e$! &a INIZIO a FINE' co INIZIO e FINE %ett! &a ta(t!e$a.
Cot$o%%a$e c,e INIZIO (!a ZP FINE Q3
#$o4$a" )"e$!D
)(e( e@&e%a8' c$tD
5a$
!: !te4e$D 2Q cotato$e c!c%o Q3
!!*!o' +!e: !te4e$D
te"#: !te4e$D 2Q 5a$!a6!%e &! a##o44!o #e$ (ca"6!a$e !!*!o e +!e
(e !(e$!t! e%%Oo$&!e (6a4%!ato Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
@$!te2ON)"e$o &! #a$te*a M[ O3D
$ea&%2 !!*!o 3D
@$!te2ON)"e$o +!a%e M[ O3D
$ea&%2 +!e 3D
2Q 1RIMA SOLUZIONE Q3
@$!te%2O1RIMA SOLUZIONEO3D
!+ !!*!oZP+!e t,e
+o$ ! :P !!*!o to +!e &o
@$!te%2 ! 3
e%(e
+o$ ! :P +!e to !!*!o &o
@$!te%2 ! 3D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
2Q co""et!: (e %O)tete !(e$!(ce !!*!o e +!e e%%Oo$&!e (6a4%!ato
2!!*!o[+!e3 (! e(e4)e ) c!c%o co 4%! e(t$e"! !5e$t!t!D Q3
2Q SECONDA SOLUZIONE Q3
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. *0
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
@$!te%2OSECONDA SOLUZIONEO3D
2Q (e !!*!o e +!e (oo !5e$t!t!' %! (ca"6!o Q3
!+ !!*!o[+!e t,e
6e4!
te"#:P!!*!oD
!!*!o:P+!eD
+!e:Pte"#
e&D
2Q o$a !!*!o e +!e (oo (e*a &)66!o e%%Oo$&!e 4!)(to ... Q3
+o$ ! :P !!*!o to +!e &o
@$!te%2 ! 3D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
ITE?' di%%icoltC/ $assa 4ee$a*!oe &! )"e$! ca()a%!
2Q $a&o".#a(
Co 7)e(to e(e$c!*!o !"#a$e$ete:
M %O)t!%!**o &e%%a +)*!oe $a&o" #e$ 4ee$a$e )"e$! ! "o&o ca()a%e
2)t!%e #e$ (!")%a*!o!' 4!oc,! ecc.
M %O)t!%!**o &e%%a +)*!oe $a&o"!*e #e$ a5e$e (e7)e*e &! )"e$! ca()a%!
(e"#$e &!5e$(e
Q3
#$o4$a" #$o5a^$a&o"D
)(e( e@&e%a8 c$tD
5a$ K'!')": !te4e$D 2Q o ,ao ) (!4!+!cato #a$t!co%a$e Q3
6e4!
c%$(c$D
2Q ES1ERIENZA 1 Q3
2Q $a&o"2N3 $e(t!t)!(ce ) )"e$o ca()a%e co"#$e(o t$a L e NM1 Q3
K:P$a&o"253D 2Q K &!5eta ) )"e$o co"#$e(o t$a L e 4 Q3
@$!te%2OE(#e$!e*a 1: O' K3D
2Q #o((!a"o )(a$e $a&o" &!$etta"ete' (e*a "e"o$!**a$e !% $!()%tato ! K Q3
@$!te%2OE(#e$!e*a 1: O'$a&o"2N33D
$ea&%D
2Q ES1ERIENZA 2 Q3
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. *1
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
2Q 4ee$!a"o )a (e7)e*a &! 1L )"e$! co"#$e(! t$a L e 15 Q3
+o$ !:P1 to 1L &o
@$!te%2OE(#e$!e*a 2: O' $a&o"21633D
$ea&%D
2Q NOTA BENE: t)tte %e 5o%te c,e (! +a $!#a$t!$e !% #$o4$a""a' $a&o" 4ee$a
%a (te((a (e7)e*a &! )"e$! 2o((e$5ate%o co %Oe(#e$!e*a . 2 +ace&o
#a$t!$e !% #$o4$a""a #!)O 5o%te3.
Se (! 5)o%e !!*!a$e o4! 5o%ta co )a (e7)e*a &!5e$(a' )(a$e !% co"a&o
$a&o"!*e: e((o ca"6!a %a (e7)e*a 6a(a&o(! ()% te"#o (ca&!to
&a%%Oo$o%o4!o !te$o &e% co"#)te$ Q3
2Q ES1ERIENZA 3 Q3
2Q $!(c$!5ete !% c!c%o &e%%Oe(#e$!e*a &)e +ace&o%o #$ece&e$e &a% co"a&o
$a&o"!*eD +ate $!#a$t!$e #!)O 5o%te !% #$o4$a""a e otate co"e %a (e7)e*a
&e%%Oe(#e$!e*a 3 ca"6! t)tte %e 5o%te Q3
$a&o"!*eD
+o$ !:P1 to 4 &o
@$!te%2OE(#e$!e*a 3: O' $a&o"21633D
$ea&%D
2Q ES1ERIENZA 4 Q3
2Q I5ece &! ) )"e$o #o((!a"o )(a$e co"e #a$a"et$o #e$ %a $a&o" )a
5a$!a6!%e !te$a Q3
@$!te 2OD!""! ) )"e$o: O3D
$ea&%2)"3D
@$!te%2OO$a 4ee$o )a (e7)e*a &! 1L )"e$! t$a L e O')" M 13D
+o$ !:P1 to 1L &o
@$!te%2OE(#e$!e*a 4: O' $a&o"2)"33D
$ea&%D
2Q 1RO:A DA SOLO ...
1. Co(a acca&e !&!ca&o 1 co"e #a$a"et$o &e%%a $a&o" C
2. Co(a acca&e !&!ca&o L co"e #a$a"et$o &e%%a $a&o" C
3. Co(a acca&e !&!ca&o ) )"e$o e4at!5o co"e #a$a"et$o &e%%a $a&o" C
4. Co(a acca&e !&!ca&o ) )"e$o $ea%e co"e #a$a"et$o &e%%a $a&o" C
5. Co(a acca&e !&!ca&o )a 5a$!a6!%e !te4e$ c,e cot!ee ) 5a%o$e
e4at!5o co"e #a$a"et$o &e%%a $a&o"C
Q3
2Q ESERCIZI SUHHERITI
ES. 1: t$o5ate ) "o&o #e$ 4ee$a$e )"e$! t$a 1 e ND
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
ES. 2: (+$)tta&o 7)ato (co#e$to e%%Oe(e$c!*!o . 1' 4ee$ate )a co%oa
&! $!()%tat! &! )a (c,e&!a &e% totoca%c!oD
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
ES. 3: 4ee$ate ! "o&o ca()a%e %a (e7)e*a &e! o"! #e$ %e !te$$o4a*!o! &! )a c%a((e co (o%o 7)att$o a%)! c,e
(! c,!a"ao 1$!"o' Seco&o' Te$*o' e A)a$toD
SUHHERIMENTI: !% #$o6%e"a (a$aO o e(t$a$$e #!)O 5o%te %o (te((o o"eD +ate co$$!(#o&e$e o4! o"e a& )
)"e$oD 7)a&o 5!ee e(t$atto 7)e% )"e$o' (ta"#ate !% o"e co$$!(#o&ete e #o! Ocace%%ateO 7)e% o"e
co#!a&o e%%a 5a$!a6!%e c,e %o "e"o$!**a )a OTO a% #o(to &e% o"eD (e 4ee$ate ) )"e$o ca()a%e c,e co$$!(#o&e
a& )a T 2o"e 4!aO e(t$atto3 &o5ete #$o5a$e co ) a%t$o )"e$oD #e$ (a#e$e 7)a&o +e$"a$(! 4e(t!te
) cotato$e c,e a)"ete$ete (o%o 7)a&o o t$o5e$ete )a OTO
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM Q3 e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. *2
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
ITEB' di%%icoltC/ $assa )t!%!**a %a $a&o" #e$ e(t$a$$e )"e$! &a 1 a N
#$o4$a" e(t$a!^1^ND
)(e( e@&e%a8' c$tD
5a$ !': !te4e$D
6e4!
c%$(c$D
2Q &ato c,e $a&o"2N3 e(t$ae )"e$! t$a L e& NM1' eO ()++!c!ete a44!)4e$e
1 a% $!()%tato #e$ a5e$e )"e$! t$a LS1P1 e NM1S1PN
Q3
@$!te2OC,e N 5)o! )(a$eC M[ O3D
$ea&%23D
2Q e(t$a!a"o 2L )"e$! &a 1 a Q3
+o$ !:P1 to 2L &o
@$!te%2 $a&o"23S1 3D
2Q CONCLUSIONI
La +o$")%a c,e 4ee$a ) )"e$o ca()a%e t$a 1 e N eO:
RANDOM2N3 S 1
Q3
$ea&%D
e&.
ITE8;' di%%icoltC/ $assa )t!%!**a %a $a&o" #e$ e(t$a$$e )"e$! t$a A e B
#$o4$a" e(t$a!^ABD
)(e( e@&e%a8' c$tD
5a$ !'a'6: !te4e$D
6e4!
c%$(c$D
2Q $a&o"2N3 e(t$ae )"e$! t$a L e& NM1D !""a4!!a"o &! 5o%e$ e(t$a$$e )"e$!
t$a 5 e 12: eO ()++!c!ete a44!)4e$e a 5 ) )"e$o ca()a%e t$a L e 7
!t)!t!5a"ete' !+att!' 5SLP5 e 5S7P12D ! 4ee$a%e &o5$e"o a44!)4e$e
a% #$!"o e(t$e"o 2A3 ) )"e$o ca()a%e t$a L e BMA
Q3
@$!te2OC,e A 5)o! )(a$eC M[ O3D
$ea&%2a3D
@$!te2OC,e B 5)o! )(a$eC M[ O3D
$ea&%263D
2Q e(t$a!a"o 2L )"e$! &a A a B Q3
2Q NOTA: atte*!oe= $a&o"2BMA3 e(t$a$$e66e )"e$! t$a L e 2BMA3 M 1
eO 7)!&! ece((a$!o !&!ca$e $a&o" 2BMAS13 Q3
+o$ !:P1 to 2L &o
@$!te%2 A S $a&o"2BMAS13 3D
$ea&%D
e&.
ITE88' di%%icoltC/ $assa 4ee$a*!oe &! )a co%oa &! )a (c,e&!a &e% totoca%c!o
#$o4$a" co%oa^totoca%c!oD
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. *'
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
)(e( e@&e%a8' c$tD
5a$ !: !te4e$D $!()%tato: !te4e$D
6e4!
c%$(c$D
$a&o"!*eD
2Q o #ote&o e(t$a$$e %a T' )(e$e"o ) )"e$o a% ()o #o(to: !% 3D 4ee$!a"o
a%%o$a 13 )"e$! &a 1 a 3 ... Q3
+o$ !:P1 to 13 &o
6e4!
$!()%tato:P $a&o"233S1D
!+ $!()%tato P 3 t,e
@$!te%2OTO3
e%(e
@$!te%2$!()%tato3 2Q 1 o 2 Q3
e&D
$ea&%D
2Q #$o5!a"o co )a (c,e&!a #!)O $ea%!(t!ca c,e #$!5!%e4!a 4%! 1 $!(#etto a%%e T e %e T $!(#etto a! 2D (! e(t$ae ) . &a
1 a 13 e (e eO t$a 1 e 6 eO co"e (e +o((e )(c!to %O1' t$a 7 e 1L %OT e t$a 11 e 13 !% 2 Q3
+o$ !:P1 to 13 &o
6e4!
$!()%tato:P $a&o"2133S1D
!+ $!()%tato ZP 6 t,e
@$!te%213
e%(e
!+ $!()%tatoZP1L t,e
@$!te%2OTO3
e%(e
@$!te%223
e&D
$ea&%D
e&.
ITE89' di%%icoltC/ $assa +a$ (c$!5e$e ()%%o (c,e$"o 1LL 5o%te %a +$a(e Oco"e #$o4$a""a "! (eto ) #oO (t)#!&o ...O
#$o4$a" "e((a44!D
)(e( e@&e%a8' c$tD
co(t
AUANTE^:OLTEP1LLD 2Q )"e$o &e! "e((a44! c,e (a$ao (ta"#at! co""eto: %O)(o &! )a co(tate #e$"ette
&! ca"6!a$e "o%to +ac!%"ete !% )"e$o &e! "e((a44! (e*a +a$e co+)(!oe co a%t$! e5et)a%! )"e$! 1LL Q3
5a$
!: !te4e$D 2Q cotato$e c!c%o Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
+o$ ! :P 1 to AUANTE^:OLTE &o
@$!te%2Oco"e #$o4$a""a "! (eto ) #oOO (t)#!&o ...O3D
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. *)
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
ITE8< di%%icoltC/ $assa +a$ (c$!5e$e ()%%o (c,e$"o 5 5o%te %a +$a(e Oco"e #$o4$a""a "! (eto ) #oO (t)#!&o ...OD
!&!ca$e a%%O!!*!o &! o4! $!4a !% ()o )"e$o #$o4$e((!5o 21' 2' 3 ...3
#$o4$a" "e((a44!D
)(e(
e@&e%a8' c$tD
co(t

5a$
!: !te4e$D 2Q cotato$e c!c%o Q3
6e4!
c%$(c$D 2Q cace%%o %o (c,e$"o Q3
2Q 1RIMA SOLUZIONE Q3
@$!te%2O1RIMA SOLUZIONEO3D
+o$ ! :P 1 to AUANTE^:OLTE &o
@$!te%2ON. $!4a: O' ! 'O co"e #$o4$a""a "! (eto ) #oOO (t)#!&o ...O3D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
2Q (#e((o e%%e !(t$)*!o! &! ) c!c%o +o$ eO )t!%e )(a$e %a 5a$!a6!%e &! cot$o%%o &e% c!c%o (te((oD ! 7)e(to e(e"#!o' a%
"o"eto &! (c$!5e$e o4! $!4a %a 5a$!a6!%e &! cot$o%%o ! ,a #$o#$!o !% 5a%o$e c,e (e$5e (ta"#a$e co"e )"e$o
#$o4$e((!5o &! $!4aD !+att! 7)a&o (! (ta"#a #e$ %a #$!"a 5o%ta !% "e((a44!o !% ()o 5a%o$e eO )o' 7)a&o (! (ta"#a
!% "e((a44!o #e$ %a (eco&a 5o%ta !% ()o 5a%o$e eO &)e ecc. Q3
2Q SECONDA SOLUZIONE Q3
@$!te%2OSECONDA SOLUZIONEO3D
+o$ ! :P 1 to AUANTE^:OLTE &o
6e4!
@$!te2ON. $!4a: O3D2Q o 5a a ca#o ... Q3
@$!te2!3D 2Q o 5a a ca#o ... Q3
@$!te%2O co"e #$o4$a""a "! (eto ) #oOO (t)#!&o ...O3D
e&D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
2Q co""et!: %a (eco&a (o%)*!oe eO e7)!5a%ete a%%a #$!"aD otate co"e (!a INDIS1ENSABILE a44!)4e$e )
6e4! e& ) e& #e$ $acc,!)&e$e e& !&!ca$e ! "o&o #$ec!(o %O!!*!o e %a +!e &e% 6%occo &! !(t$)*!o! c,e &e5e
e((e$e $!#et)toD (e !+att! a5e((!"o (c$!tto:
+o$ ! :P 1 to AUANTE^:OLTE &o
@$!te2ON. $!4a: O3D
@$!te2!3D
@$!te%2O co"e #$o4$a""a "! (eto ) #oOO (t)#!&o ...O3D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
!% co"#!%ato$e o #ot$e66e ! a%c) "o&o ca#!$e 7)a%! (oo %e !(t$)*!o! &a $!#ete$e 2#e$ 7)a%e "ot!5o +e$"a$(! a%
#$!"o @$!te #!)tto(to c,e a% (eco&oC3D %Oa5e$ a%%!eato ! co"a&! @$!te-@$!te% (e$5e (o%o a $e&e$e #!)O %e44!6!%e !%
co&!ce #e$ o! ... "a #e$ !% co"#!%ato$e (!4!+!ca co"#$e&e$e e% c!c%o +o$ SOLO LA RIHA SUCCESSI:A:
+o$ ! :P 1 to AUANTE^:OLTE &o
@$!te2ON. $!4a: O3D
@$!te2!3D
@$!te%2O co"e #$o4$a""a "! (eto ) #oOO (t)#!&o ...O3D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
#$o5a a to4%!e$e !% 6e4!-e& e (#e$!"eta #e$(oa%"ete c,e !% c!c%o
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. *5
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
(ta"#e$e66e #e$ &!ec! 5o%te %a (c$!tta ON. $!4a:O e (o%o )a 5o%ta !%
$e(to ==
A COSA SER:E ALLORA A:ER COM1LICATO IL CODICE CC
RIS1OSTA: AD A:ER MAHHIOR CONTROLLO' COME MOSTRATO NELLA OTERZA SOLUZIONEO Q3
2Q TERZA SOLUZIONE
7)e(ta 5o%ta (! O#$ete&eO c,e !% "e((a44!o c,e #$ece&e !% )"e$o &! $!4a
(!a (c$!tto ! $o((o' !% )"e$o &! $!4a ! 4!a%%o e %a (c$!tta ! 5e$&e
Q3
@$!te%2OTERZA SOLUZIONEO3D
+o$ ! :P 1 to AUANTE^:OLTE &o
6e4!
teKtco%o$2RED3D @$!te2ON. $!4a: O3D2Q o 5a a ca#o ... Q3
teKtco%o$2UELLO?3D @$!te2!3D 2Q o 5a a ca#o ... Q3
teKtco%o$2HREEN3D @$!te%2O co"e #$o4$a""a "! (eto ) #oOO (t)#!&o ...O3D
e&D
@$!te%2OMMMMMMMMMMMMMMMMMMMMMMMMMMO3D
@$!te%D
2Q co""et!: (o%o co(t$)e&o !% "e((a44!o )a #o$*!oe a%%a 5o%ta )(a&o !% @$!te eO #o((!6!%e !te$5a%%a$e ! co"a&!
#e$ %a (e%e*!oe &e% co%o$e Q3
@$!te%2O1$o4$a""a te$"!ato. 1$e"e$e IN:IO #e$ cot!)a$e...O3D
$ea&%D 2Q #e$ &a$e !% te"#o &! %e44e$e !% "e((a44!o Q3
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. **
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
+TRUTTURA ITERATI.A INDEDINITA R il ciclo repeat ) until
Se$5e a $!#ete$e )a o #!< !(t$)*!o! +!o a% "o"eto ! c)! %a co&!*!oe (#ec!+!cata &o#o %a #a$o%a c,!a5e until
&!5eta 5e$a. A)e(to "o"eto o / #$e5e&!6!%e &a c)! %a &eo"!a*!oe B!&e+!!ta9 #e$ 7)e(to t!#o &! c!c%o.
O55!a"ete !% c!c%o te$"!e$> (o%o (e %e !(t$)*!o! c,e 5e4ao $!#et)te a5$ao co"e e++etto !% $a44!)4!"eto
&e%%a co&!*!oe &! )(c!ta. Se 7)e(to o &o5e((e a55e!$e !% c!c%o (! $!#ete$e66e a%%O!+!!to 2! 4e$4o (! &!$e66e c,e
!% #$o4$a""a / Ba&ato ! %oo# !+!!to9 o' (e"#%!ce"ete'9 a&ato ! %oo#93
Ne%%Oe(e"#!o c,e (e4)e (! c,!e&e a%%O)tete &! !(e$!$e ) 5a%o$e "a44!o$e o )4)a%e 1L. Se %O)tete (6a4%!a 2!(e$e&o
) 5a%o$e "!o$e &! 1L3 $!ce5e ) a55!(o e& !% &ato 5!ee $!c,!e(to. Ecco co"e 5!ee #$o4$a""ata 7)e(ta
o#e$at!5!t>:
#$o4$a" #$o5aD
5a$ 5a%o$e: !te4e$D
6e4!
repeat
@$!te%2BI(e$!$e ) )"e$o "a44!o$e o& )4)a%e 1L: B3D
$ea&% 25a%o$e 3D
!+ 5a%o$eZ1L t,e
@$!te%2BE$$o$e' $!#$o5a G93D
until "aloreE(8;*
G $e(to &e% #$o4$a""a G
e&.
Ca$atte$!(t!c,e &e% c!c%o $e#eat:
!% cot$o%%o c,e &ec!&e (e $!#ete$e o "eo !% 6%occo &e%%e !(t$)*!o! (! t$o5a ! +o&o a% c!c%o e& / #e$ 7)e(to
c,e !% c!c%o repeat 5!ee &etto co cot$o%%o ! co&aD 7)e(to co"#o$ta c,e a%"eo )a 5o%ta %e !(t$)*!o! &e%
c!c%o 5e4oo e(e4)!teD 7)a%c,e 5o%ta 7)e(to / ) 5ata44!o "a a%t$e 5o%te o 27)a&o / ece((a$!o cot$o%%a$e
#$!"a )a co&!*!oe (e*a %a 7)a%e #ot$e66e e((e$e a&&!$!tt)$a &e%ete$!o e(e4)!$e %e !(t$)*!o!3D (e cO/ 7)e(ta
ece((!t> #$o6a6!%"ete / "e4%!o )t!%!**a$e %Oa%t$o t!#o &! (t$)tt)$a !te$at!5a !&e+!!ta: !% c!c%o w1ile 25e&! #!<
a5at!3
!% c!c%o te$"!a 7)a&o %a co&!*!oe &! )(c!ta / 5e$a: #e$ 7)e(to "ot!5o (! #a$%a ac,e &! c!c%o co )(c!ta #e$
5e$o
U(c!ta &a% c!c%o $e#eat co cotato$e.
Fo&a"eta%"ete (! )t!%!**a )a 5a$!a6!%e #e$ cota$e 7)ate 5o%te / (tato e(e4)!to !% c!c%o. I #$at!ca #o((!a"o
e")%a$e !% co"#o$ta"eto &! ) c!c%o for "a co tata +%e((!6!%!t> ! #!<: o (!a"o a& e(e"#!o co(t$ett! a cota$e &!
)o ! )o "a #o((!a"o (ce4%!e$e &! 7)ato a)"eta$e %a 5a$!a6!%e &! cot$o%%o a& o4! e(ec)*!oe &e% c!c%oD o
(!a"o e##)$e co(t$ett! a& !c$e"eta$%a &! 5a%o$! !te$!: #ot$e""o a& e(e"#!o o#ta$e #e$ !c$e"et! &! "!%%e(!"! &!
)!t> #e$ ca%co%! &! t!#o (c!et!+!co. :e&!a"o 7)a%c,e e(e"#!o.
!:PLD
$e#eat
! :P !S1D
@$!te%2 ! 3D
)t!% !P1LD
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. *+
Sa$e66e !"#o((!6!%e #$o4$a""a$e %a (te((a o#e$at!5!t> )t!%!**a&o
!% c!c%o for.
C,!a$a"ete / !"#o((!6!%e (a#e$e 7)ate 5o%te (a$> ece((a$!o
$!#ete$e %e o#e$a*!o! a ca)(a &! $!#et)t! e$$o$! &a #a$te &e%%O)tete=
A)e(to c!c%o (ta"#a ()% 5!&eo ! )"e$! &a )o a 1L. T)tt! &Oacco$&o ()% +atto c,e ! (!t)a*!o! &! 7)e(to t!#o (!a "e4%!o
)t!%!**a$e !% c!c%o for: co 7)e(tO)%t!"o o / !% #$o4$a""ato$e a &o5e$(! $!co$&a$e c,e / ece((a$!o !!*!a%!**a$e %a 5a$!a6!%e &!
cot$o%%o 2!:PL3' !c$e"eta$%a a& o4! c!c%o 2!:P!S13 e 5e$!+!ca$e (e / a$$!5ato !% "o"eto &! !te$$o"#e$e !% c!c%o' "a / t)tto
(5o%to ! a)to"at!co (eco&o %e !&!ca*!o! &ate &a% #$o4$a""ato$e ()%%a #$!"a $!4a &e%%a (t$)tt)$a fordo.
Ma ecco )a #$!"a a##%!ca*!oe !te$e((ate: 5e4oo (ta"#at! t)tt! ! ")%t!#%! &! 3 +!o a% 21. No / ece((a$!o )t!%!**a$e
%Oo#e$ato$e MOD #e$ te(ta$e %a &!5!(!6!%!t> #e$ t$e &! o4! (!4o%o 5a%o$e &e%%a 5a$!a6!%e &! cot$o%%o co"e a5$e""o +atto co
) c!c%o for: !5ece &! !c$e"eta$e %a 5a$!a6!%e &! )a )!t> a%%a 5o%ta' (! a44!)4e t$e !&!5!&)a&o o4! 5o%ta a co%#o (!c)$o
) )o5o ")%t!#%o=
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
!:PLD
$e#eat
! :P !S3D
@$!te%2 ! 3D
)t!% !P21D
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. *,
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
U(c!ta &a% c!c%o $e#eat co &o"a&a a%%Oo#e$ato$e.
Da )(a$e ! 7)e! ca(! ! c)! / ece((a$!o +a$ !(e$!$e &a ta(t!e$a )a (e7)e*a &! &at! e& / %Oo#e$ato$e c,e &e5e
&ec!&e$e 7)a&o (oo +!!t!. I""a4!!a"o ) #$o4$a""a +)*!oate a%%O!4$e((o &! )a "o(t$a c,e &e5e (e$5!$e a
$!c,!e&e$e ! &at! a 4$a+!c! &! o4! 5!(!tato$e e& a (ta"#a$e #e$ c!a(c)o ) ca$te%%!o &! $!coo(c!"eto. No /
o55!a"ete #o((!6!%e )t!%!**a$e ) c!c%o for: !"#o((!6!%e' !+att!' (a#e$e a #$!o$! 7)at! (a$ao ! 5!(!tato$!G 1e$ %o
(te((o "ot!5o o / #o((!6!%e )t!%!**a$e ) c!c%o repeat co )(c!ta cot$o%%ata &a ) cotato$e. \ !5ece ()++!c!ete
o$4a!**a$e ) c!c%o repeat ! c)! %O)(c!ta 5e4a &ec!(a &a%%a $!(#o(ta &ata &a%%Oo#e$ato$e a& )a &o"a&a #o(ta &a%
co"#)te$ co"e )%t!"o #e$ a*!oe &e% c!c%o:
repeat
@$!te%2BI(e$!$e !% o"!at!5o &e% 5!(!tato$e: B3D
$ea&%2o"e^co4o"e3D
@$!te%2BI(e$!$e %a &ata &! a(c!ta &e% 5!(!tato$e: B3D
$ea&%2&ata^a(c!ta3D
Z!(t$)*!o! #e$ %a (ta"#a &e% ca$te%%!o G[
2riteln7F+ono terminati i "isitatoriGH:*
readln7 risp :*
until risp(H+HD

U(c!ta &a% c!c%o $e#eat co !(e$!"eto &! ) 5a%o$e co5e*!oa%e.
\ ) "!4%!o$a"eto &e%%a tec!ca #$ece&ete. A)e(tO)%t!"a' !+att!' co(t$!4e %Oo#e$ato$e a $!(#o&e$e ac,e "o%te
5o%te a%%a (te((a &o"a&a #e$ &!$e 7)a&o (oo te$"!at! ! &at!. I% Bt$)cco9 co(!(te e%%o (ta6!%!$e c,e !% c!c%o &e5e
te$"!a$e 7)a&o a%%a $!c,!e(ta &! )o &e! &at! #$e5!(t! 5!ee !(e$!to ) 5a%o$e (#ec!a%e. R!#$e&e&o %Oe(e"#!o &e%%a
"o(t$a #ot$e""o &ec!&e$e c,e !% c!c%o te$"!a 7)a&o co"e o"!at!5o &e% 5!(!tato$e 5!ee !(e$!ta %a #a$o%a
NESSUNO. Ecco co"e #ot$e66e a##a$!$e !% co&!ce:
repeat
@$!te%2BI(e$!$e !% o"!at!5o &e% 5!(!tato$e 7NE++UNO per terminare3: B3D
$ea&%2o"e^co4o"e3D
i% nomeIco#nomeJEHNE++UNOH t,e
6e4!
@$!te%2BI(e$!$e %a &ata &! a(c!ta &e% 5!(!tato$e: B3D
$ea&%2&ata^a(c!ta3D
Z!(t$)*!o! #e$ %a (ta"#a &e% ca$te%%!o G[
e&D
until nomeIco#nome(HNE++UNOHD
NOTA: %a co&!*!oe &! )(c!ta &a ) c!c%o $e#eat #)0 e((e$e co"#o(ta' t!#o 7)e%%e 4!> 5!(te #e$ %a (t$)tt)$a (e%ett!5a.
LOe(e"#!o (e4)ete $!c,!e&e a%%Oo#e$ato$e ) 5a%o$e co"#$e(o e%%O!te$5a%%o 1M1LL:
$e#eat
@$!te%2BI(e$!$e ) 5a%o$e co"#$e(o t$a 1 e 1LL: B3D
$ea&%25a%o$e3D
)t!% 25a%o$e[P13 a& 25a%o$eZP1LL3D
NOTA: co"e a5ete 5!(to &a4%! e(e"#!' 7)a&o cO/ #!< &! )a !(t$)*!oe e% c!c%o o / ece((a$!o )t!%!**a$e )
6%occo begin end: !% co"#!%ato$e !+att! / #e$+etta"ete ! 4$a&o &! !&!5!&)a$e %O!!*!o e %a +!e &e%%e !(t$)*!o! &e%
c!c%o )(a&o %e &)e #a$o%e c,!a5e repeat e until co"e &e%!"!tato$!.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. *-
S! !""a4!a e %Oo#e$ato$e &e66a $!(#o&e$e &!4!ta&o %a
%ette$a S.
Da ota$e c,e !% $e(to &e! &at! 5!ee c,!e(to (o%o (e o /
(tata !(e$!ta %a #a$o%a co5e*!oa%e #e$ te$"!a$e !% c!c%o.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
+TRUTTURA ITERATI.A INDEDINITA R il ciclo 24ile
S! &!(t!4)e &a% repeat #e$ 7)e(te ca$atte$!(t!c,e:
!% cot$o%%o c,e &ec!&e %a te$"!a*!oe c!c%o / +atto #$!"a &e%%e !(t$)*!o! &e% c!c%o (te((o: #e$ 7)e(to "ot!5o
5!ee ac,e !&!cato co"e c!c%o co cot$o%%o ! te(taD (e %a co&!*!oe o / (o&&!(+atta +! &a%%O!!*!o !% c!c%o
#ot$e66e o co"!c!a$e e##)$e' c!o/ %e ()e !(t$)*!o! o e((e$e e(e4)!te eac,e )a 5o%taD
!% c!c%o te$"!a 7)a&o %a co&!*!oe / +a%(a: (! #a$%a !+att! &! c!c%o co )(c!ta #e$ +a%(oD
Ecco %a (!ta((!:
@,!%e co&!*!oe &o o##)$e @,!%e co&!*!oe &o
!(t$)*!oeS!4o%a 6e4!
!(t$)*!oe1D
!(t$)*!oe1D
G
!(t$)*!oeND
e&
I 4ee$a%e #ot$e""o &!$e c,e %e tec!c,e #e$ &ec!&e$e %a te$"!a*!oe &e% c!c%o 5!(te #e$ !% c!c%o repeat 5ao 6ee
ac,e #e$ 7)e(to c!c%o co ! &o5)t! a&atta"et! $e(! ece((a$! &a%%a &!++e$ete %o4!ca:
!:PLD
@,!%e !Z1L &o
6e4!
! :P !S1D
@$!te%2 ! 3D
e&D
!:PLD
@,!%e !Z21 &o
6e4!
! :P !S3D
@$!te%2 ! 3D
e&D
o"e^co4o"e:P99D 2Q (t$!4a )%%a' 5)ota Q3
24ile nomeIco#nomeJEHNE++UNOH do
$e#in
@$!te%2BI(e$!$e !% o"!at!5o &e% 5!(!tato$e 7NE++UNO per
terminare3: B3D
$ea&%2o"e^co4o"e3D
i% nomeIco#nomeJEHNE++UNOH t,e
6e4!
@$!te%2BI(e$!$e %a &ata &! a(c!ta &e% 5!(!tato$e: B3D
$ea&%2&ata^a(c!ta3D
Z!(t$)*!o! #e$ %a (ta"#a &e% ca$te%%!o G[
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. +0
Sta"#a &e! ")%t!#%! &! t$e +!o a% 21.
Sta"#a &e! )"e$! &a 1 a 1L. A)a&o (ta"#a !% 1L %a co&!*!oe &!5eta +a%(a 21L o / "!o$e &! 1L "a )4)a%e=3
Da ota$e %a 4o++a44!e &! 7)e(ta (o%)*!oe. 1o!c,E /
ece((a$!o c,e %a 5a$!a6!%e &! cot$o%%o a66!a ) 5a%o$e
&!5e$(o &a%%a #a$o%a BNESSUNO9 #e$ #ote$e !!*!a$e !% c!c%o'
(!a"o co(t$ett! a& )(a$e ) a((e4a"eto #e$ &a$e a 7)e(ta
5a$!a6!%e ) 5a%o$e c,e (o&&!(+! 7)e(to $e7)!(!to.
\ )a co+e$"a &e% +atto c,e !% c!c%o w1ile (!a &a #$e+e$!$e
(o%o ! 7)e%%e (!t)a*!o! ! c)! / !"#o$tate cot$o%%a$e c,e
)a ce$ta co&!*!oe (!a (o&&!(+atta aco$ #$!"a &!
co"!c!a$e a& e(e4)!$e %e !(t$)*!o! &e% c!c%oG
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
e&D
end 2Q &e% @,!%e Q3
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. +1
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
E+ERCIZI RIEPILO5ATI.I +UI CICLI REPEAT E K,ILE
ITE8@ di%%icoltC/ media Ca%co%o &e%%e #$!"e N #ote*e &! 2D &e5e e((e$e LZPNZP14
2Q DOMANDA: 1ERCHEO NON SI 1U_ SU1ERARE L9ES1ONENTE 14 CC Q3
#$o4$a" #ote*eD)eD
5a$
: !te4e$D 2Q !% )"e$o !(e$!to &a%%O)tete Q3
#ot: !te4e$D 2Q %e #ote*e &! 5o%ta ! 5o%ta ca%co%ate Q3
!: !te4e$D 2Q #e$ ! c!c%! Q3
6e4!
@$!te%2OCALCOLO 1OTENZE DI 2O3D
@$!te%D
2Q cot!)o a c,!e&e$e ) N +!c,eO (o&&!(+a ... Q3
$e#eat
@$!te%2OI(e$!(c! 2LZPZP143: O3D
$ea&%23D
!+ 2ZL3 o$ 2[143 t,e
@$!te%2O:a%o$e e$$ato= RI1RO:A 2LZPZP143O3D
)t!% 2LZP3 a& 2ZP143D
2Q :EDIAMO 1RIMA LA SOLUZIONE CON IL RE1EAT ...Q3
#ot:P1D !:PLD
@$!te%2OSOLUZIONE CON IL RE1EATO3D
$e#eat
@$!te%2OLa #ote*a O'!' O &e% 2 eOO: O'#ot3D
#ot:P#otQ2D
!:P!S1
)t!% ![D
$ea&%D
2Q :EDIAMO 1OI LA SOLUZIONE CON IL ?HILE ...Q3
#ot:P1D !:PLD
@$!te%2OSOLUZIONE CON IL ?HILEO3D
@,!%e !ZP &o
6e4!
@$!te%2OLa #ote*a O'!' O &e% 2 eOO: O'#ot3D
#ot:P#otQ2D
!:P!S1
e&D
$ea&%D
2Q :EDIAMO INFINE LA SOLUZIONE CON IL FOR ...Q3
@$!te%2OSOLUZIONE CON IL FORO3D
#ot:P1D
+o$ !:PL to &o
6e4!
@$!te%2OLa #ote*a O'!' O &e% 2 eOO: O'#ot3D
#ot:P#otQ2
e&D
$ea&%
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. +2
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
ITE8=' di%%icoltC/ $assa Ca%co%o &e%%a "e&!a &! N )"e$! !(e$!t! &a%%O)tete
#$o4$a" "e&!aN)"e$!D
5a$
: !te4e$D 2Q 7)at! )"e$! !(e$!$e Q3
)"e$o: !te4e$D
(o""a: $ea% D 2Q %a (o""a #)0 ()#e$a$e 32767 ... Q3
"e&!a: $ea%D
!: !te4e$D 2Q #e$ ! c!c%! Q3
6e4!
@$!te%2OCALCOLO MEDIAO3D
@$!te%D
2Q cot!)o a c,!e&e$e ) N +!c,eO (o&&!(+a ... Q3
$e#eat
@$!te%2O7)at! )"e$! 5)o! !(e$!$eC 2N[L3: O3D
$ea&%23D
!+ ZPL t,e
@$!te%2O:a%o$e (e*a (e(o= RI1RO:A 2N[L3O3D
)t!% [LD
2Q :EDIAMO 1RIMA LA SOLUZIONE CON IL RE1EAT ...Q3
(o""a:PLD !:P1D
@$!te%2OSOLUZIONE CON IL RE1EATO3D
$e#eat
@$!te2OI(e$!$e ) )"e$o 2O'!'O3 M[ O 3D
$ea&%2)"e$o3D
(o""a:P(o""aS)"e$oD
!:P!S1D
)t!% ![D
"e&!a:P(o""a-D
@$!te%2O"e&!a: O'"e&!a:6:23D
$ea&%D
2Q :EDIAMO 1OI LA SOLUZIONE CON IL ?HILE ...Q3
(o""a:PLD !:P1D
@$!te%2OSOLUZIONE CON IL ?HILEO3D
@,!%e !ZP &o
6e4!
@$!te2OI(e$!$e ) )"e$o 2O'!'O3 M[ O 3D
$ea&%2)"e$o3D
(o""a:P(o""aS)"e$oD
!:P!S1D
e&D
"e&!a:P(o""a-D
@$!te%2O"e&!a: O'"e&!a:6:23D
$ea&%D
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. +'
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
2Q :EDIAMO INFINE LA SOLUZIONE CON IL FOR ...Q3
@$!te%2OSOLUZIONE CON IL FORO3D
(o""a:PLD
+o$ !:P1 to &o
6e4!
@$!te2OI(e$!$e ) )"e$o 2O'!'O3 M[ O 3D
$ea&%2)"e$o3D
(o""a:P(o""aS)"e$oD
e&D
"e&!a:P(o""a-D
@$!te%2O"e&!a: O'"e&!a:6:23D
$ea&%D
e&.
ITE8A' di%%icoltC/ media Dato ! !#)t ) )"e$o !te$o N' (o""a$e ! #$!"! N )"e$! &!(#a$! e
5e$!+!ca$e c,e ta%e (o""a eO )4)a%e a% 7)a&$ato &! N.
#$o4$a" (o"^&!(#D
)(e( e@&e%a8' c$tD
5a$
!'7)at!: !te4e$D )"e$o'(o""a: $ea%D
6e4!
c%$(c$D
2Q !% cot$o%%o c,e (e4)eQ(e"6$aQ e++!cace: #$o5ate co 35LLLD
e #o! co 7LLLL: %Oe$$o$e o 5!ee $!%e5atoD #e$c,eO CC Q3
$e#eat
@$!te%2OA)at! )"e$! &!(#a$! 5)o! co(!&e$a$eC 2&a L a O'MATINT'O3O3D
$ea&%27)at!3D
!+ 27)at!ZL3 o$ 27)at![MATINT3 t,e
@$!te%2OE$$ato' $!#ete$e %OO!(e$!"etoO3
)t!% 27)at![PL3 a& 27)at!ZPMATINT3D
(o""a:PLD)"e$o:P1D 2Q 1 eO !% #$!"o . &!(#a$! ...Q3
+o$ !:P1 to 7)at! &o
6e4!
(o""a:P(o""aS)"e$oD
)"e$o:P)"e$oS2D 2Q !&!5!&)!a"o !% . &!(#a$! ()cce((!5o Q3
e&D
@$!te%2OCo(!&e$at! ! #$!"! O'7)at!'O )"e$! &!(#a$!O3D
@$!te%2OLa %o$o (o""a eOO: O'(o""a:1L:L3D
2Q "o%t!#%!co #e$ 1.L #e$ t$a(+o$"a$e ! $ea% !% $!()%tato
a%t$!"et! (a$e66e !te4e$ e %!"!tato a 32767 Q3
@$!te%2OI% 7)a&$ato &! O'7)at!' O eOO O'7)at!Q1.LQ7)at!:1L:L3D
!+ (o""aP7)at!Q1.LQ7)at! t,e
@$!te%2ORe4o%a 5e$!+!cata=O3
e%(e
@$!te%2ORe4o%a o 5e$!+!cata=O3D
$ea&%D
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. +)
NOTA: MATINT / )a co(tate #$e&e+!!ta c,e $a##$e(eta !% #!<
4$a&e )"e$o !te$o e (! #)0 )t!%!**a$eD co !% t)$6o 1a(ca% ! #$at!ca
co$$!(#o&e a% 5a%o$e 32.767 "a / "e4%!o )(a$e %a co(tate: #e$c,EC
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
ITE8>' di%%icoltC/ media U 4!$o t)$!(t!co eO +atto &! N ta##e' &e%%e 7)a%! (! !t$o&)coo &a ta(t!e$a
!% o"e &e%%a c!ttaO &! a$$!5o e ! J" #e$co$(!. Ca%co%a$e !% #e$co$(o tota%e e !% #e$co$(o "e&!o &e%%e ta##e
#$o4$a" ta##eD
)(e( e@&e%a8' c$tD 5a$
!'7)ate^ta##e: !te4e$D
J"^ta##a'(o""a^J": $ea%D
c!tta: (t$!4D
6e4!
c%$(c$D
$e#eat
@$!te%2OA)ate (oo %e ta##eC 2&a L a O'MATINT'O3O3D
$ea&%27)ate^ta##e3D
!+ 27)ate^ta##eZL3 o$ 27)ate^ta##e[MATINT3 t,e
@$!te%2OE$$ato' $!#ete$e %OO!(e$!"etoO3
)t!% 27)ate^ta##e[PL3 a& 27)ate^ta##eZPMATINT3D
(o""a^J":PLD
+o$ !:P1 to 7)ate^ta##e &o
6e4!
@$!te%2O1$o((!"a &e(t!a*!oe CO3D
$ea&%2c!tta3D
$e#eat
@$!te%2OA)ato &!(ta O'c!tta'O ! J"CO3D
$ea&%2J"^ta##a3D
!+ 2J"^ta##aZL3 o$ 2J"^ta##a[MATINT3 t,e
@$!te%2OE$$ato' $!#ete$e %OO!(e$!"etoO3
)t!% 2J"^ta##a[PL3 a& 2J"^ta##aZPMATINT3D
(o""a^J":P(o""a^J"SJ"^ta##aD
e&D
@$!te%2O1e$co$(o tota%e: O'(o""a^J":5:1'OJ"O3D
@$!te%2O1e$co$(o "e&!o #e$ ta##a: O'(o""a^J"-7)ate^ta##e:5:1'OJ"O3D
$ea&%
e&.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. +5
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
C&:( :&N& I D.&E CF(A'
I +%o@ c,a$t (oo (c,e"! c,e &e(c$!5oo 5!(!5a"ete co"e #$oce&e %9e(ec)*!oe &! ) #$o4$a""a. E((! o (oo
%e4at! a& )o (#ec!+!co %!4)a44!o: &ato ) +%o@ c,a$t' !% #$o4$a""ato$e #)0 #o! )(a$e ) 7)a%(!a(! %!4)a44!o &!
#$o4$a""a*!oe 2(! t$atta' #e$ co(; &!$e' &! ) %!4)a44!o 5!()a%e co"#$e(!6!%e a t)tt! ! #$o4$a""ato$!3. I% +%o@
c,a$t a!)ta ac,e !% #$o4$a""ato$e a &e(c$!5e$e co$$etta"ete ) a%4o$!t"o 2!% #$oce&!"eto $!(o%)t!5o &! )
#$o6%e"a3.
O4! t!#o &! !(t$)*!oe c,e (! #)0 !(e$!$e ! ) #$o4$a""a ,a ) ()o (!"6o%o e& o4)a &e%%e t$e (t$)tt)$e
+o&a"eta%! &e%%a #$o4$a""a*!oe 2(e7)e*a' (e%e*!oe e& !te$a*!oe3 #)0 e((e$e $a##$e(etata. E(!(too ac,e
(!"6o%! (#ec!a%! 2!!*!o #$o4$a""a' +!e #$o4$a""a ecc.3 c,e o $a##$e(etao !(t$)*!o! 5e$e e #$o#$!e "a c,e
(oo )t!%! #e$ %a co(t$)*!oe &e% +%o@ c,a$t.
I PAINCIP(.I :IGB&.I
Inizio programma (i simboli sono e"uivalenti Fine programma (i simboli
sono e"uivalenti
puoi ricordare solo un simbolo a scelta \ puoi ricordare solo un
simbolo a scelta \
=!% sta per !tart, =i% sta per 0nizio =$% sta per fine, =,% sta per ,nd
Assegnamento o altre istruzioni generiche Scrittura di un valore sul
video (i simboli sono e"uivalenti
(esempio: dai ad + il valore I puoi ricordare solo un
simbolo a scelta \
BS9 (ta #e$ (c$!5!' B?9 (ta #e$ ?$!te
2e(e"#!o &! !(t$)*!oe 4ee$!ca3
(ettura &! ) 5a%o$e (c$!tto co %a ta(t!e$a e "e"o$!**ato e%%a 5a$!a6!%e !&!cata
2! (!"6o%! c,e (e4)oo (oo e7)!5a%et!: $!co$&ae )o a t)a (ce%ta ..3
E(e"#!o: %e44e$e &o5e a6!ta )a #e$(oa e "e"o$!**a$e %9!+o$"a*!oe e%%a 5a$!a6!%e indirizzo
BL9 (ta #e$ Le44!' BR9 (ta #e$ Rea&
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. +*
!!*!o
(ta$t S +!e e& F
K 8 Sc$!5! Bc!ao9 S Bc!ao9
I
E
? Bc!ao9
Le44! !&!$!**o
L !&!$!**o R !&!$!**o
att!5a a%%a$"e
I
3uante .& '*5 4 +
( 5(ettimane in un anno:5
( 3uante

Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)


ALTRI ESEMPI
&a! a& K %o (te((o 5a%o$e &! 8 &a! a& K !% 5a%o$e &! 8 &!"!)!to &! 1
&a! a& K !% 5a%o$e &e%%9e(#$e((!oe 25 R 23 Q 24 S 33
I (!"6o%! 5!(t! +!o a& o$a (e$5oo #e$ !(t$)*!o! (!4o%e. :e&!a"o o$a co"e (! $a##$e(etao %e (t$)tt)$e
+o&a"eta%! &e%%a #$o4$a""a*!oe 2(e7)e*a' (e%e*!oe' !te$a*!oe3.
%e)uen*a
1e$ !&!ca$e c,e &)e !(t$)*!o! 5ao e(e4)!te )a &o#o %9a%t$a (! "ettoo ! %o$o (!"6o%! )o (otto %9a%t$o
co%%e4a&o%! co )a +$ecc!a. Ecco ) e(e"#!o.

I% (e(o &e%%a +$ecc!a !&!ca !% +%)((o &! e(ec)*!oe.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ++
K 8
K 8 M 1
K 25 R 23 Q 24 S 33
)alcoliamo quante settimane ci sono in un anno di(idendo
il numero dei giorni per H.
Me"o$!**!a"o #$!"a !% $!()%tato &e%%a &!5!(!oe e%%a
5a$!a6!%e quante.
1o! (c$!5!a"o ) "e((a44!o ()% 5!&eo c,e Ba)c!a9 !%
$!()%tato
I+!e (c$!5!a"o !% $!()%tato' c!o/ !% 5a%o$e att)a%e &e%%a
5a$!a6!%e quante.
%ria *+esta
istr+#ione
%oi *+esta
e! in4ne *+esta
S K' 8
L co4o"e' o"e
accetta !alla tastiera +n %rio 2alore c/e
eori##erai nella 2aria"ile ,cognoe- e
%oi +n secon!o 2alore c/e eori##erai
nella 2aria"ile ,noe-
scri2i s+l 2i!eo %ria il 2alore
!ella 2aria"ile 9 e %oi *+ello !ella
2aria"ile ;
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
%ele*ione "decisione+ scelta+ alternati,a$

I% (o%o +atto &! #ote$ !&!ca$e )9!(t$)*!oe &o#o %9a%t$a 2(e7)e*a3 o c! co(et!$e66e &! (5!%)##a$e #$o4$a""a
!te$e((at!. C! (oo !)"e$e5o%! (!t)a*!o! ! c)! / ece((a$!o +a$e ) Bcot$o%%o9 e& a4!$e &! co(e4)e*a.
4sempi
Se %9ao / 6!(e(t!%e a%%o$a co(!&e$a +e66$a!o co 2N 4!o$!' a%t$!"et! co(!&e$a%o co 28.
Se %9et> / "!o$e &! 18 a%%o$a a##%!ca (coto' a%t$!"et! a##%!ca #$e**o #!eo.
Se %a te"#e$at)$a ()#e$a 37 C a%%o$a +a! ()oa$e %9a%%a$"e.
Co"e a5$ete o((e$5ato' (! cot$o%%a )a condizione 2ao 6!(e(t!%e C' et> "!o$e &! 18 C' te"#e$at)$a ()#e$a 37 C3
c,e #)0 $!()%ta$e 5e$a o +a%(a. I 7)a%c,e ca(o 2#$!"! &)e e(e"#!3 c! (oo o#e$a*!o! 2&!5e$(e3 (!a e% ca(o %a
co&!*!oe $!()%t! 5e$a (!a e% ca(o $!()%t! +a%(a. E9 #e$0 #o((!6!%e 2te$*o e(e"#!o3 c,e e% ca(o %a co&!*!oe (!a +a%(a
o c! (!a )%%a &a +a$e.
Ecco co"e (! $a##$e(eta ! ) +%o@ c,a$t %a (t$)tt)$a (e%ett!5a:
Se %9ao / 6!(e(t!%e a%%o$a
co(!&e$a +e66$a!o co 2N 4!o$!
a%t$!"et!
co(!&e$a%o co 28
La co&!*!oe &e5e e((e$e (c$!tta a%%9!te$o &e% $o"6o. I% +%)((o
&! e(ec)*!oe (! &!5!&e a (eco&a &e% $!()%tato &e% cot$o%%o 2: (ta
#e$ :e$o e F (ta #e$ Fa%(o3 e (o%o %a (t$a&a Ba &e(t$a9 o Ba
(!!(t$a9 5!ee #e$co$(a.
Le !(t$)*!o! e%%a (e*!oe B5e$a9 2o B+a%(a93 #o((oo e((e$e ac,e "o%te e o )a (o%a co"e e% o(t$o e(e"#!o.
A)a&o %e !(t$)*!o! &a e(e4)!$e a co&!*!oe 5e$a 2o +a%(a3 (oo te$"!ate !% +%)((o (! $!co4!)4e )(a&o !% (!"6o%o
c,!a"ato connettore.
Atte*!oe: e% $o"6o #otete "ette$e (o%o co&!*!o!' o a((e4a"et!=
Sa$e66e 7)!&! ) e$$o$e 4$a5e !% (e4)ete:
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. +,
I
anno bisestile
giorni .& 2- giorni .& 2,

6
7 .& ,
N& HH
EAA&AE HHH
*+esto ti%o !i
sele#ione I !etto a 2
2ie
%ria
2ia
secon!a 2ia
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Se %9et> / "!o$e &! 18 a%%o$a
a##%!ca (coto
a%t$!"et!
a##%!ca #$e**o #!eo.
Nota: e% +%o@ c,a$t !""a4!!a"o c,e
%e 5a$!a6!%! eta e prezzo a66!ao 4!> )
5a%o$e 5a%!&o e c,e ! ca%co%! !&!cat!
(!ao 7)!&! +att!6!%!. Lo (coto 21L`3 5!ee ca%co%ato &!5!&e&o !% #$e**o #!eo #e$ 1LL 2ca%co%a&o co(; %91`3 e
"o%t!#%!ca&o !% $!()%tato #e$ 1L 2ottee&o !% 1L`3.
Se %a te"#e$at)$a ()#e$a 37 C a%%o$a
+a! ()oa$e %9a%%a$"e.
Co"e #otete 5e&e$e (e o c9/ )%%a c,e &e5e e((e$e +atto 7)a&o %a
co&!*!oe / +a%(a' (! co4!)4e %a #a$te B+a%(o9 &!$etta"ete co !%
coetto$e.
NOTA IM1ORTANTE: ! o4! &!a4$a""a c,e $a##$e(eta %a (e%e*!oe c!
&e5e e((e$e (e"#$e ) (o%o #)to &! !4$e((o 2%a +$ecc!a et$ate e% $o"6o3 e& ) (o%o #)to &! )(c!ta 2!%
coetto$e +!a%e3. E5!tate 7)!&! +$ecce c,e &a%%9!te$o e(coo 5e$(o a%t$! #)t! &e% &!a4$a""a o c,e &a%%9e(te$o
4!)4oo ! ) #)to !te$o:
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. +-
eta . 1,
sconto .& "prezzo 4 100$ 8 10 sconto .& 0
6
temp 9 '+
attiva allarme
6

temp 9 '+
attiva allarme
6

temp 9 '+
attiva allarme
( prezzo
6

N& HH
EAA&AE HHH
N& HH
EAA&AE HHH
*+esto ti%o !i
sele#ione I !etto a
+na 2ia
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
%ele*ione a molte ,ie
E(!(te ac,e )9)t!%e 5a$!ate c,e #$e5e&e "o%te 5!e a (eco&a &e% 5a%o$e &! )a 5a$!a6!%e. I""a4!!a"o c,e %a
5a$!a6!%e mese cote4a ) 5a%o$e &a 1 a 12 c,e $a##$e(eta )o &e! "e(! &e%%9ao. D! )o5o' 5o$$e""o (a#e$e
7)at! 4!o$! co(!&e$a$e. :! $!co$&o c,e ! "e(! co 31 4!o$! (oo 1 24ea!o3' 3 2"a$*o3' 5 2ecc.3' 7' 8' 1L' 12D
7)e%%! co 3L 4!o$! (oo 4 2a#$!%e3' 6' N' 11D !""a4!!a"o #e$ (e"#%!c!t> c,e +e66$a!o 223 e a66!a (e"#$e 28.
I% +%)((o #)0 (e4)!$e t$e 5!e a (eco&a &e% 5a%o$e &e%%a 5a$!a6!%e mese. I t$e +%)((! #o((!6!%! (! $!co4!)4oo #o! e%
(o%!to coetto$e. Ac,e (e o )(ato ! 7)e(to e(e"#!o' / #$e5!(to ) +%)((o &a (e4)!$e 7)a&o o (! 5e$!+!ca
e(()o &e! ca(! #$ece&et!.
-serci*i risolti sulla struttura seletti,a
%-(1. +nserita un.etI dire se siamo in presenza di
un minorenne o di un maggiorenne
NOTE/ co ) +%o@ c,a$t (! 5o4%!oo &!
(o%!to co4%!e$e 4%! a(#ett! essenziali &!
) a%4o$!t"oD 7)e(to (!4!+!ca' a&
e(e"#!o' Bt$a(c)$a$e9 a%c)! "e((a44! o55!
c,e e% #$o4$a""a ! 1a(ca% (a$ao
!5ece !&!cat!: / !% ca(o &e% "e((a44!o
BI(e$!$e %9et>9 c,e &o5$e66e #$ece&e$e
%a ()a %ett)$a:
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ,0
: eta
eta901,
( 5maggiorenne5 ( 5minorenne5
: F
: eta
( 5Inserire l5et;5
ese
giorni JK 31
giorni JK 28 giorni JK 30
1737577787
10712
2
47679711
altre istr+#ioni
%er i esi !a 31
altre istr+#ioni
%er $e""raio
altre istr+#ioni
%er i esi !a 30
In t+tti gli altri
casi
(crivi 5errore<5
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
%-(2. +nserita un@etI@/ dire se siamo in
presenza di un maggiorenne o di un
minorenne' controllare anc1e e(entuali
errori di inserimento da parte dell@utente
1$!"a (o%)*!oe: !#ot!**a&o ) et>
"a((!"a &! 12L a!' cot$o%%!a"o c,e
%9et> !(e$!ta o (!a a% &! +)o$!
&e%%9!te$5a%%o L 2eoato3 R 12L.
NOTA: (!ate coe$et! co %9)t!%!**o &e%%e
et!c,ette B:9 e BF9: !o ,o (ce%to &!
#$o(e4)!$e #e$ 5e$o 2:3 (e"#$e a &e(t$a e
#e$ +a%(o 2F3 (e"#$e a (!!(t$a.
NOTA: / !"#o$tate &!++e$e*!a$e co )
#a%%!oMcoetto$e (e#a$ato %e )(c!te &a%%e
&)e (t$)tt)$e (e%ett!5e. I% (e4)ete +%o@
c,a$t / 7)!&! (6a4%!ato. No $!)(c!$e""o
!+att! a t$a&)$%o e% co$$!(#o&ete
#$o4$a""a 1a(ca% 2(! acca5a%%e$e66e$o 4%!
Be&9 &e! 6%occ,! B6e4! G e&9 &e%%e
#a$t! Bt,e9 e& Be%(e9 &e! &)e B!+9 ==
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ,1
: eta
eta901,
( 5maggiorenne5 ( 5minorenne5
eta.0 or eta9120
( 5errore5
6
: eta
eta901,
( 5maggiorenne5 ( 5minorenne5
eta.0 or eta9120
( 5errore5
6
NO LL
6
6

Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)


%-(2 bis. Co %9a%4o$!t"o #$ece&ete' 7)a&o %9)tete (6a4%!a a& !(e$!$e ) 5a%o$e #e$ %9et> o (! (a (e #e$ )
5a%o$e e4at!5o o "a44!o$e &! 12L: (! (a (o%o c,e ,a co""e((o ) e$$o$e "a o 7)a%e. I% (e4)ete +%o@ c,a$t
$a##$e(eta ) a%4o$!t"o c,e t!ee coto ac,e &! 7)e(to #a$t!co%a$e' &!++e$e*!a&o ! cot$o%%! ()! #o((!6!%! e$$o$!:
%-(.bis. I(e$!to ) )"e$o' &!$e (e eO #a$! o &!(#a$!
NOTA: (! (ta !""a4!a&o c,e ! o4! %!4)a44!o &!
#$o4$a""a*!oe e(!(ta ) o#e$ato$e #e$ !% ca%co%o &e%
"o&)%o: MOD.
E9 co")7)e accetta6!%e 2"! (to $!5o%4e&o a! "!e!
a%)!3 )(a$e 4%! o#e$ato$! &e% 1a(ca%.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ,2
: eta
eta901,
( 5maggiorenne5 ( 5minorenne5
eta.0
( 5et; negativa5
eta9120
( 5 non puoi avere pi=< 5
5di 120 anni <<
6
6
6

St$)tt)$a a Bca(cata9
: num
( 5dispari5
num >?@ 200
( 5pari5
6
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
%-(/. I(e$!to ) ca$atte$e' &!$e (e eO )a 5oca%e o& )a co(oate.
So%)*!oe 1 2o (! +a &!(t!*!oe t$a %e 5oca%!3
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ,'
c .& maiuscolo" c $
: c
c05A5
( 5vocale A5 c05I5
c05A5
( 5vocale A5
( 5vocale I5 c05?5
( 5vocale ?5
c05B5
( 5vocale B5 ( 5consonante5
6
6
6

6
c .& maiuscolo" c $
: c
( 5consonante5
c05A5 or c05A5 or c05I5
or c05?5 or c05B5
( 5vocale5
6
So%)*!oe 2: / #o((!6!%e !t$a#$e&e$e
)9a*!oe &!5e$(a #e$ o4! 5oca%e
NOTA: o4! (t$)tt)$a (e%ett!5a / co"#%eta"ete cote)ta !
7)e%%a &e% %!5e%%o ()#e$!o$eD c9/ (e"#$e ) (o%o #)to &!
!4$e((o 2+$ecc!a F &e%%a (t$)tt)$a ()#e$!o$e3 e& ) (o%o #)to
&! )(c!ta 2&a% coetto$e3
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
%-(5. I(e$!t! A' B e C &!$e (e B eO co"#$e(o t$a A e CD ! #$at!ca (! cot$o%%a (e B a##a$t!ee a%%O!te$5a%%o VA'CW
0tera*ione "ripeti*ione+ cicli$
1)$ a5e&o a &!(#o(!*!oe (e7)e*a e
!te$a*!oe $!"a4oo "o%te %e (!t)a*!o!
B!t$atta6!%!9 co 7)e(t! (t$)"et!. Co(!&e$!a"o !+att! 7)e(to #$o6%e"a a%%9a##a$e*a "o%to (e"#%!ce: (ta"#a$e !
)"e$! &a 1 a 1LLLL. Ce$ta"ete %a (o%)*!oe &! )(a$e #e$ 1LLLL 5o%te %9!(t$)*!oe &! (c$!tt)$a #e$ (ta"#a$e o4!
)"e$o o / "o%to #$at!ca6!%e G
A #a$te ! #$o6%e"! &! t$o5a$e )o (#a*!o ()++!c!ete #e$ &!(e4a$e (c,e"! co(; eo$"! e& !% te"#o
#e$ &!(e4a$%!' (a$e""o co(t$ett! a "o&!+!ca$e (o(ta*!a%"ete !% &!a4$a""a a% 5a$!a$e &e%%a
$!c,!e(ta 2(ta"#a$e (o%o ! #$!"! 5LLL )"e$! o +!o a% 15LLL3.
1a$te&o !5ece &a%%a co(!&e$a*!oe c,e (! (tao $!#ete&o !(t$)*!o! "o%to (!"!%! 2ca"6!a (o%o
! 5a%o$e &a (c$!5e$e ()% 5!&eo3 (! #e$5!ee a& )a
(t$)tt)$a c!c%!ca c,e +a $!#ete$e )a o& ) 4$)##o &!
!(t$)*!o! +!o a% $a44!)4!"eto &! )a co&!*!oe 2!
7)e(to ca(o !% $a44!)4!"eto &e% 1LLLL3.
Ecco %o (c,e"a 4ee$!co 2c!o/ o a##%!cato a%%a
(o%)*!oe &! a%c) #$o6%e"a #a$t!co%a$e3 &! ) +%o@
c,a$t #e$ %a (t$)tt)$a !te$at!5a.
Le !(t$)*!o! (oo $!#et)te )a #$!"a 5o%ta. H!)t! a%%a co&!*!oe' (e
7)e(ta / 5e$a a%%o$a (! e(ce e& !% c!c%o te$"!a. Se %a co&!*!oe / +a%(a
(! $!to$a a%%9!!*!o 2coetto$e &! !4$e((o3.
Se a%%9!te$o &e% c!c%o' #$!"a o #o!' )a &e%%e !(t$)*!o! +a$> (; c,e %a
co&!*!oe &!5ete$> 5e$a' !% c!c%o te$"!e$> 5e$a"ete.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ,)
I
( 1
( 2
( 10000

...
...
condizione
6

b90a and b.0c


: aC c
( 5intervallo5
5impossibioe5
( 5appartiene5 ( 5non appartiene5
a .0 c
: b
6
6
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
D!5e$(a"ete #$oce&e$> a%%9!+!!to 2co"e #ot$e66e (e$5!$e #e$ !% cot$o%%o &! ) #$oce((o !&)(t$!a%e3.
A)e(to t!#o &! c!c%o / &etto Bco $!#et!*!oe #e$ +a%(o9' o a B)(c!ta #e$ 5e$o9 e& aco$a Bco cot$o%%o ! co&a9 2c!o/
a%%a +!e &e% c!c%o3.
Not!a"o aco$a: con questo tipo di ciclo le istruzioni (engono eseguite almeno una (olta.
:e&!a"o !% +%o@ c,a$t co"#%eto #e$ %a (ta"#a &e! )"e$! &a 1 a 1LLLL
La 5a$!a6!%e um / )(ata #e$ cot$o%%a$e %9)(c!ta &a% c!c%o. E((a 5!ee
!"#o(tata a% 5a%o$e 1 prima &! !!*!a$e !% c!c%o.
I% c!c%o !!*!a (ta"#a&o ()% 5!&eo !% 5a%o$e &e%%a 5a$!a6!%e um 2%a #$!"a
5o%ta (ta"#e$> 7)!&! 13.
La 5a$!a6!%e um 5!ee !c$e"etata &! 1.
Se %a 5a$!a6!%e um ,a $a44!)to !% 5a%o$e 1LLL1 27)!&! ,a 4!> (ta"#ato !%
1LLLL3 (! e(ce' a%t$!"et! (! $!to$a a%%9!!*!o 25e$$> (ta"#ato ()% 5!&eo )
)o5o )"e$o' (! !c$e"eta aco$a !% 5a%o$e &! um e co(; 5!a G3.
E& ecco ) e(e"#!o &! +%o@ c,a$t #e$
%9a%t$o t!#o +o&a"eta%e &! c!c%o'
7)e%%o &etto co cot$o%%o ! te(ta
2a%%9!!*!o3 e& )(c!ta #e$ +a%(o o'
aco$a' &! $!#et!*!oe #e$ 5e$o.
I+att! +!tato c,e %a co&!*!oe
$!"ae 5e$a !% c!c%o 5!ee $!#et)to.
No a##ea %a co&!*!oe &!5!ee
+a%(a !% c!c%o te$"!a.
I% c!c%o #ot$e66e ac,e o
co"!c!a$e e##)$e' (e %a co&!*!oe
+o((e &a ()6!to +a%(a. I% c!c%o 5!(to !
#$ece&e*a' !5ece' cot$o%%a&o %a
co&!*!oe a%%a +!e' a%"eo )a 5o%ta
co")7)e e(e4)e %e !(t$)*!o! 2e
7)e(to #ot$e66e e((e$e !&e(!&e$a6!%e
7)a&o (! 5o4%!oo e(e4)!$e %e
!(t$)*!o! &e% c!c%o (o%o (e / 5e$a +!
&a ()6!to )a ce$ta co&!*!oe3.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ,5
I
Dum .& 1
Dum .& Dum /1
( Dum

Dum 0 10001
6

...
num .& 1
num .0 10000
(" num $
num .& num /1
v

Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)


-serci*i risolti sulla struttura iterati,a
0T-1: (ta"#a &e! #$!"! N )"e$! at)$a%!'
co N %etto &a ta(t!e$a.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ,*
: n
i .& i / 1
( i
i 9 n
i .& 1

6
0T-2: (ta"#a &e! #$!"! N )"e$! at)$a%!'
co N %etto &a ta(t!e$aD (ta"#a &a% #!< 4$a&e a% #!<
#!cco%o
: n
i .& i & 1
( i
i .0 0
i .& n

6
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
0T-.. Sta"#a &e! #$!"! N )"e$! at)$a%!'
co N %etto &a ta(t!e$aD a +!aco &! c!a(c)
)"e$o !&!ca$e (e eO #a$! o &!(#a$!
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ,+
0T-/: Sta"#a &e! )"e$! &!(#a$! "!o$! o )4)a%! a
N' co N %etto &a ta(t!e$a
: n
i .& i / 1
i 9 n
i .& 1
i >?@ 2 0 1
( i

6
6
: n
i .& i / 1
( i
i 9 n
i .& 1
i >?@ 2 0 0
( 5pari5 ( 5dispari5

6
6
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
0T-5. Fa$ !(e$!$e )a (e7)e*a &! )"e$! &a ta(t!e$a.
La (e7)e*a (! !te&e te$"!ata 7)a&o 5!ee
!(e$!to !% )"e$o L. S! &e5e ca%co%a$e e 5!()a%!**a$e
%a (o""a &! t)tt! ! )"e$! !(e$!t!.
totale .& 0
: n
totale .& totale / n
n 0 0
n .9 0
( totale

6
-serci*i risolti riassunti,i
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ,,
0T-6: Fa$ !(e$!$e )a (e7)e*a &! )"e$! &a ta(t!e$a.
E9 %9)tete &e% #$o4$a""a c,e &!ce 7)a&o (oo +!!t! !
)"e$! 2$!(#o&e&o a& )a o##o$t)a &o"a&a #o(ta
&a% #$o4$a""a3. S! &e5e ca%co%a$e e 5!()a%!**a$e
%a "e&!a &! t)tt! ! )"e$! !(e$!t!.
totale .& 0
cont .& 0
: n
( 5initi 15
risp 0 5(5
: risp
media .& totale 4 c
( c
c .& c /1
totale .& totale / n

6
NOTA: e((e&o !% "e((a44!o 2&o"a&a3 #e$ %a
te$"!a*!oe &e% c!c%o #a$t!co%a$"ete !"#o$tate' /
"e4%!o !&!ca$%o e% +%o@ c,a$t.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
1. C,!e&e$e &a ta(t!e$a %9!(e$!"eto &! )a (e7)e*a &! &ate. A& o4! &ata' e(#$e((a e%%a +o$"a 4!o$o "e(e e&
ao 2B49' B"9 e& Ba9 e% +%o@ c,a$t3' a44!)4e$e ) 4!o$o e (ta"#a$e %a &ata $!()%tate. E9 %9)tete &e% #$o4$a""a
c,e &!ce 7)a&o (oo +!!te %e &ate 2$!(#o&e&o a& )a o##o$t)a &o"a&a #o(ta &a% #$o4$a""a3. I#ote(!
(e"#%!+!cat!5a: co(!&e$a$e Fe66$a!o (e"#$e &a 28 4!o$!. T$acc!a: / ece((a$!o #$e(ta$e atte*!oe a%%e &ate c,e
co$$!(#o&oo a +!e "e(e o ao: e%%a &ata $!()%tate ca"6!e$> (!c)$a"ete !% "e(e e +o$(e ac,e %9ao G
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ,-
L g,m,a
g ^M gZG
mYT
g_TI
g ^M G# m ^M J
mYG or J,P,V,
I,GL,GT
g_JG
g ^M G
m ^M mZG
g_JL
g ^M G
m ^M mZG
m_GT
m ^M G
a ^M aZG
risp Y ;!;
! ;fniti D;
L risp
2
2
$
2
$
2
$
2 $
2
$
2
$
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
2. Sta"#a &e! )"e$! &a B a& A co B[A.
Cot$o%%a$e c,e B (!a "a44!o$e &! A
#$!"a &! !!*!a$e.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. -0
s E
E .& E & 1
E . A
: A
: E
E 9 A

6
6
c .& +
c .& c / +
( c
c 901000
6

3. Sta"#a &e! ")%t!#%! &! 7 "!o$! &! 1LLL


Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
I :&''&PA&CA(GGI K ri+tili##are %er so%ra22i2ere H
!e un programmatore professionista dovesse sempre ricominciare da zero nello scrivere i programmi,
diventerebbe presto un ... accattone professionista A . Ad esempio, se tutte le volte che fosse
necessario lo stesso calcolo complesso dovessimo riscrivere le sue istruzioni, i programmi
diventerebbero pi< lunghi del necessario, pi< diCcili da leggere, sprecheremmo pi< tempo e
rischieremmo ogni volta di commettere errori diversi (e sempre per risolvere lo stesso problema.
Una pericolosa illusione ...
L%utilizzo del =copia4incolla% per ricopiare le righe farebbe risparmiare solo fatica ma ci esporrebbe a
gravi rischi ... )er convincercene, immaginiamo che le istruzioni siano una cin"uantina e di averle
copiate4incollate pi< volte in diversi programmi. (osa accadrebbe se scoprissimo un errore nelle righe
copiate cos? tante volteD Dovremmo modifcare tutte le copie delle cin"uanta istruzioni incriminate \ e
guai a dimenticarcene una A
$a soluzione: i sottoprogrammi
)er fortuna una soluzione c%8 e la sapete gi usare. Lo avete fatto tutte le volte che avete usato
comandi come sqrt"2# o clrscr. 9uesti comandi richiamano un programma secondario (si parla infatti
di sottoprogrammi che svolgono il compito previsto. 7el caso della sqrt il compito 8 il calcolo della
radice "uadrata di un numero ("uello che deve essere specifcato tra parentesi dopo il nome del
comando# nel caso di clrscr non deve essere calcolato nulla ma semplicemente cancellato il video.
Dopo l%esecuzione del comando il programma principale continua la sua elaborazione.
E:EGPI& (calcolo della radice "uadrata di un numero
)rogram prova#
var
+: real# (S il numero di cui si vuole la radice "uadrata S
radice`"uadrata: real# (S il risultato da calcolare S
begin
writeln(=0nserisci un numero ed io calcolero%% la sua radice "uadrata: %#
readln(+#
radice`"uadrata:Ys"rt(+#

writeln(=risultato: =, radice`"uadrata #
readln#
end.

0ipi di sottoprogrammi: procedure e funzioni
9uando un sottoprogramma restituisce al programma principale un valore (come sqrt con la radice
"uadrata si chiama funzione "function#. 9uando non restituisce nulla si chiama procedura "procedure#.
'n esempio di procedure 8 rappresentata dal comando clrscr: non restituisce nulla programma
principale ma si limita a cancellare il video.
& parametri
'n sottoprogramma pu@ aver bisogno di uno o pi< dati per portare a termine il suo compito. Ad
esempio sqrt ha bisogno del numero di cui si vuole calcolare la radice. 3lrscr non ha invece bisogno di
alcun dato. 9uesti dati si chiamano parametri e vengono indicati tra parentesi dopo il nome del
sottoprogramma.
7el comando sqrt" 2 # il parametro 8 costituito dalla costante numerica H. 7el comando sqrt "')4,# il
parametro 8 costituito dal risultato dell%espressione ')4,. 7el comando sqrt"5# il parametro 8 il valore
contenuto nella variabile f al momento dell%uso del comando.
!e i parametri sono pi< d%uno vanno separati con la virgola. Ad esempio il comando gotox1"'6, 7#
sposta il punto di scrittura sul video alla colonna GL, riga P. 0l primo parametro 8 il numero della
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. -1
per soddisfare la richiesta della riga precedente il programma principale si
=ferma% e richiama il programma secondario s"rt# "uando si riceve il
risultato, il programma principale continua con la riga "ui sotto stampando il
valore calcolato S
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
colonna, il secondo il numero della riga. 7>3A: per provare il comando gotox1 dovete indicare uses crt
come spiegato alla pagina successiva.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. -2
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
&nteressante ma quali e quanti sottoprogrammi abbiamo a disposizione 8
Abbiamo due possibilit:
'sare un sottoprogramma scritto da altri. 0 sottoprogrammi riutilizzabili sono spesso raccolti in librerie.
'na libreria 8 un fle (archivio normalmente presente sul disco e contiene blocchi di codice gi
tradotto in linguaggio macchina che possono essere a comando incorporati in un programma. Alcune
librerie sono sempre fornite insieme all%ambiente di sviluppo che si decide di usare (sia che si tratti di
un prodotto commerciale sia che si tratti di un prodotto gratuito come accade per l%open source.
Ad esempio con il 3urbo )ascal sono disponibili un buon numero di librerie insieme al prodotto
ac"uistato. 0l 3urbo )ascal chiama le librerie unit (unit di programmazione. 7>3A: per un elenco
completo di "ueste librerie consultate l;help in linea del turbo )ascal (lo potete attivare con la
combinazione !X0$3M$G, cercando poi sotto la lettera ! il paragrafo !tandard 'nit.
La funzione s"rt ed altri sottoprogrammi di uso assai comune sono memorizzate in una libreria (la
!-stem per la "uale non 8 neppure necessario indicarne l%uso: viene automaticamente inclusa con il
resto del programma.
0l comando clrscr e goto+-( invece sono due dei sottoprogrammi disponibili nella unit crt. )er "uesta
ed altre unit (ed in particolare per tutte "uelle create ed aggiunte dai programmatori 8 invece
necessario indicare il loro nome nella sezione uses del programma. ,sistono unit con sottoprogrammi
per fare grafca (graph e 3A73, altre cose che scopriremo insieme un poco alla volta .
0n commercio sono poi disponibili parecchie librerie per i compiti pi< svariati. !e una libreria 8 fatta
bene vale mille volte i soldi che costa: sviluppare software costa 6>L3>A !u 0nternet 8 facile trovare ed
ac"uistare "ueste librerie.
!u internet, soprattutto sui siti dedicati alla programmazione si trovano anche 6>L3, librerie gratuite.
!criversi i sottoprogrammi da soli raggruppandoli poi in librerie (che possono essere scambiate, rese
disponibili gratuitamente su 0nternet o vendute. 'n sottoprogramma viene scritto di solito prima
all%interno di un programma normale e solo in un secondo tempo viene aggiunto ad una libreria.

Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. -'
#$o4$a" #$o5aD
6e4!
@$!te%2 (7$t2N3 3
e&.
Pro#ramma ese#ui$ile %inale
t$a&)*!oe ! %!4)a44!o "acc,!a
&e%%e !(t$)*!o! (c$!tte &a%
#$o4$a""ato$e
&
co&!ce &e%%a (7$t #$e%e5ato &a%%a
%!6$e$!a
S7$t
G.
G.
G.
$a&o"
G.
G.
Ecc'
&
(
I% co&!ce &e%%a sqrt
5!ee e(t$atto &a%%a
%!6$e$!a e&
!co$#o$ato e%
#$o4$a""a +!a%e
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
3ome si fa in 0urbo ascal ad usare un sottoprogramma di una libreria8
)rima della sezione 2A& del programma si mette una sezione intitolata '!,! e si elencano, separati da
virgole, i nomi delle unit che contengono i sottoprogrammi che si vogliono utilizzare. (ome dicevo
prima, i sottoprogrammi clrscr e goto+-( sono contenuti nella unit crt e "uindi per usarli:
program prova#
uses crt#
begin
clrscr#
goto+-(GL,P#
writeln(=sto scrivendo alla colonna GL, "uinta riga dello schermo \#
readln#
end.
)rima di esaminare in dettaglio come si scrivono i sottoprogrammi con il turbo )ascal dovete essere
convinti della loro utilit.
Aiass+nto !ei "ene4ci !ell-+so !ei sotto%rograi)

&isparmio di tempo e di spazio: le istruzioni che corrispondono al sottoprogramma sono scritte una
volta sola, tradotte ed inserite in una libreria# il programmatore non le deve riscrivere (o
copiare4incollare ma pu@ richiamarle semplicemente scrivendo il nome del sottoprogramma ed
indicando tra parentesi le costanti o le variabili che contengono i valori necessari al funzionamento del
sottoprogramma (i parametri.
7on incorre nei rischi del copia4incolla:
se viene scoperto un errore nel sottoprogramma: si modifcano solo le istruzioni di "uest;ultimo e si
aggiorna poi la libreria con la nuova versione# 8 poi suCciente ricompilare4lin1are i programmi che ne
facevano uso ("uesti ultimi non sono stati modifcatiA#
se scritto in modo corretto il sottoprogramma non interferisce con il resto del programma: un
sottoprogramma pu@ avere le sue variabili per i cicli e per tutto il resto# ha, in defnitiva, un suo spazio
di lavoro che lo rende indipendente# riceverete maggiori dettagli pi< avanti#
&ende il programma pi< comprensibile: 8 palese come il codice sulla destra, a di/erenza di "uello a
sinistra, comunichi al lettore immediatamente lo scopo per cui 8 stato scritto:
const
pi`grecoYJ.GU#
var
+: real#
begin
writeln( U4J S pi`greco S GT S GT S GT
end.
0nfatti pochi sanno riconoscere nella formula a sinistra il calcolo del volume di una sfera di raggio GT ...
7el ri"uadro a destra 8 invece palese che si sta invocando una funzione dal nome molto chiaro ed 8
altrettanto evidente che il valore comunicato tra parentesi 8 il raggio della sfera. 0n ogni caso le
modalit d;uso di ogni sottoprogramma sono documentate nel manuale tecnico che accompagna
sempre una libreria.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. -)
@$!te%2 :o%)"eS+e$a2123 3
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Diminuisce la complessit della scrittura dei programmi: un programma pu@ essere assemblato a
partire da sottoprogrammi pi< semplici da trattare. ,% anche pi< facile trovare gli errori concentrandosi
solo sulle righe di un sottoprogramma per volta. 0noltre rende possibile sviluppare uno stesso
programma insieme ad altri programmatori senza che "uesti interferiscano tra loro: ad ogni
programmatore viene assegnato lo sviluppo di un certo numero di sottoprogrammi che vengono poi
fusi assieme.
7essun team di sviluppo si sognerebbe oggi di sviluppare un progetto software senza adottare "uesto
tipo di programmazione detto o!+lare. 9uesti concetti sono stati poi ampliati nella
%rograa#ione a! oggetti (>>) che sar materia di studio in "uarta4"uinta.
6entre vengono sviluppati e provati i sottoprogrammi vengono di solito scritti direttamente all;interno
di un programma che li usa. B solo in un secondo momento, "uando il sottoprogramma 8 stato
perfettamente testato, di "uest;ultimo viene inserito in una libreria.
9ui a lato ho evidenziato come in un programma i
sottoprogrammi vengono scritti dopo la sezione 2A& e devono
terminare prima del begin di inizio programma. 7on c;8 limite al
numero di sottoprogrammi che si possono scrivere (se non "uelli
imposti dall;ambiente di sviluppo per la scrittura del programma
principale.
(ome dicevo, "uesto facilita la scrittura dei sottoprogrammi ma
ne riduce la facilit di riutilizzo (dovremmo ricorrere ad un
copia4incolla per usarli in altri programmi, pur mantenendo
inalterati tutti gli altri benefci. 'na volta che il sottoprogramma
8 stato ben testato lo si pu@ togliere dal programma principale
ed includerlo in una libreria, recuperando StuttiS i benefci
discussi prima.
Anche noi procederemo cos?, visto che l%obiettivo 8 imparare a
scrivere i sottoprogrammi.
7>3A: nel programma principale possiamo sfruttare un "ualsiasi
sottoprogramma in pi< punti, tutte le volte che ci@ si rende
necessarioA
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. -5
#$o4$a" #$o5aD
co(t ...
5a$ ...
(otto#$o4$a""a 1
(otto#$o4$a""a 2
Be4!

... )(o (otto#$o4$a""a1
... )(o (otto#$o4$a""a1
... )(o (otto#$o4$a""a2
....
E&.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Coe si scri2e +n sotto%rograa ?
0niziano con la parola procedure o function seguita dal nome che il programmatore vuole dare al
sottoprogramma. !e non sono previsti parametri si mette il punto e virgola subito dopo il nome del
sottoprogramma (tutti i nostri esempi iniziali non avranno parametri per semplicit \. )oi tra begin e
end si mettono le istruzioni che si vogliono far eseguire "uando si richiama il sottoprogramma. Ad
esempio, ecco come si scrive una procedure per stampare sullo schermo un rettangolo fatto da
asterischi.
program esempio#
uses crt#
%roce!+re
!isegnaL+a!rato=
"egin
0riteln38MMMM85=
0riteln38MMMM85=
0riteln38MMMM85=
0riteln38MMMM85=
en!=
begin
!isegnaL+a!rato#
writeln#
writeln#
!isegnaL+a!rato#
writeln#
writeln#
readln
end.
7el prossimo esempio scriveremo un sottoprogramma che restituisce un numero scelto a caso per il
gioco del lotto (un numero da G a HL. )oichF restituisce un valore dobbiamo usare una function, che si
di/erenzia leggermente da una procedure, ma non di molto.
program esempio#
$+nction estrai.otto ) integer=
"egin
ran!oi#e=
estrai.otto )> ran!o3905 ? 1
en!=
begin
writeln (=primo numero lotto estratto: =#
writeln ( estraiLotto #
writeln (=secondo numero lotto estratto: =#
writeln ( estraiLotto #
end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. -*
I% (otto#$o4$a""a 5!ee &!c,!a$ato )a 5o%ta (o%a e
$!c,!a"ato &)e 5o%te e% #$o4$a""a #$!c!#a%e.
Fo((e ece((a$!o (ta"#a$e ac,e "!%%e $etta4o%!' %e
!(t$)*!o! &e% (otto#$o4$a""a (oo (tate (c$!tte )a
5o%ta (o%a.
Se (! 5o4%!oo a)"eta$e o &!"!)!$e !% )"e$o &! $!4,e
o co%oe &e4%! a(te$!(c,! / ()++!c!ete +a$%o (o%o e%
(otto#$o4$a""a e& !% )o5o +)*!oa"eto (!
$!#e$c)ote$> a)to"at!ca"ete ! TUTTO !% #$o4$a""a.
Ho e5!&e*!ato %e 2 co(e c,e ca"6!ao $!(#etto a& )a
procedure.
1. Do#o !% o"e &e% (otto#$o4$a""a 2e &o#o %a
#a$ete(! c,!)(a &e%%9e5et)a%e %!(ta &e! #a$a"et$! c,e
e%%9e(e"#!o "aca3 (! "ettoo ! &)e #)t! e& !% t!#o &e%
5a%o$e c,e 5!ee $e(t!t)!to.
2. La function DE:E te$"!a$e co %9a((e4a*!oe a%
()o o"e &e% 5a%o$e &a $e(t!t)!$e a c,! )(a %a function.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
:otto%rograi con +so !i %araetri
La funzione estraiLotto non pu@ essere utilizzata per altre simulazioni# ad esempio per un gioco di dadi
(dove, ovviamente, l;intervallo di valori e "uello che va da uno a sei. )ossiamo per@ riscrivere la
funzione in modo da poter indicare al momento della chiamata il massimo numero da estrarre.
(ambiamo anche il nome della funzione in "uanto sarebbe fuorviante lasciare il riferimento al lotto.
program esempio#
$+nction estrai3Gassio) integer5 ) integer=
"egin
ran!oi#e=
estrai.otto )> ran!o3assio5 ? 1
en!=
begin
writeln (=primo numero lotto estratto: =#
writeln ( estrai(HL #
writeln (=tiro il dado \ 8 uscito: =#
writeln ( estrai(K #

end.
program esempio#
var numero: integer#
%roce!+re asterisc/i3*+anteAig/e) integer5=
2ar i) integer=
"egin
$or i)>1 to *+anteAig/e !o
0riteln3,MMMMMMMMMMMMMMM-5=
en!=
begin
writeln (="uante righe di S devo stampareD =#
readln(numero#
asterischi( numero #
readln#
end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. -+
I #a$a"et$! 5e4ao (#ec!+!cat! t$a #a$ete(! #$!"a &e%
o"e &e% (otto#$o4$a""a. 1e$ c!a(c)o &e5e e((e$e
(#ec!+!cato !% t!#o. Notate co"e (!a aco$a ece((a$!o' (e
(! t$atta &! )a +)*!oe' !&!ca$e !% t!#o &e% 5a%o$e
$e(t!t)!to &a% (otto#$o4$a""a.
I% o"e c,e (ce4%!a"o #e$ !% #a$a"et$o (e$5e a%
(otto#$o4$a""a #e$ (a#e$e co"e $!+e$!$(! a% 5a%o$e c,e
$!ce5e 7)a&o 5!ee c,!a"ato.
Ac,e %e #$oce&)$e #o((oo $!ce5e$e 5a%o$! (otto +o$"a
&! #a$a"et$!. Ne%%Oe(e"#!o 7)! a %ato %a #$oce&)$a $!ce5e
!% )"e$o &! $!4,e &! a(te$!(c,! c,e &e5e (ta"#a$e 2!%
#a$a"et$o c,!a"ato quante5ig1e3.
E((e&o )a #$oce&)$a' &o#o %a #a$ete(! &ete$"!a
%Oe%eco &e! #a$a"et$! o &e5e e((e$e (#ec!+!cato )
t!#o co"e a66!a"o 5!(to #e$ %e +)*!o!.
I 7)e(to e(e"#!o cO/ ) a%t$o #a$t!co%a$e "o%to
!te$e((ate &a ota$e: &o#o %O!te(ta*!oe co !% o"e
&e%%a #$oce&)$a-+)*!oe / #o((!6!%e !!*!a$e )a
(e*!oe :AR ! c)! &!c,!a$a$e %e 5a$!a6!%! a& )(o
e(c%)(!5o &e% (otto#$o4$a""a. Ne% ca(o ! 7)e(t!oe (!
t$atta &e%%a 5a$!a6!%e &! cot$o%%o &e% c!c%o +o$.
To$e$e"o #$e(to () 7)e(to a$4o"eto.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Paraetri %er 2alore 3"; 2al+e5
program esempio#
var numero: integer# simboli: string#
%roce!+re asterisc/i3*+anteAig/e) integer= riga) string5=
2ar i) integer=
"egin
$or i)>1 to *+anteAig/e !o
0riteln3riga5=
en!=
begin
writeln (="uante righe di S devo stampareD =#
readln( numero #
writeln (=che simboli uso per la stampaD =#
readln( simboli#
asterischi( numero, simboli #
readln#
end.
program esempio#
var numG, numT: integer#
$+nction a93a7") integer5 ) integer=
"egin
i$ aN>" t/en
a9)>a
else
a9)>"
en!=
begin
writeln (=inserisci un numero=#
readln ( num G #
writeln (=inserisci un altro numero=#
readln ( num T #
writeln (=il maggiore dei numeri inseriti 8: =#
writeln ( ma+(numG, numT #
readln#
end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. -,
A)! a %ato t$o5ate )a 5e$(!oe #ote*!ata &e%%a
#$oce&)$a e(a"!ata ! #$ece&e*a. C,! %a )(a o / #!<
%!"!tato a& )a $!4a &! a(te$!(c,! "a #)0 (ce4%!e$e'
(#ec!+!ca&o%o co"e (eco&o #a$a"et$o' %a $!4a &!
ca$atte$! &a )(a$e.
A)a&o ce O/ #!< &O)o' ! #a$a"et$! &e5oo e((e$e
(e#a$at! co ) #)to e 5!$4o%a e #e$ c!a(c)o &e5e
e((e$e (#ec!+!cato !% t!#o co$$!(#o&ete.
NOTATE: "et$e 7)a&o (c$!5!a"o !% te(to &e%
(otto#$o4$a""a 4%! e5et)a%! #a$a"et$! &e5oo e((e$e
(e#a$at! co ) #)to e 5!$4o%a' 7)a&o !5ece !%
(otto#$o4$a""a 5!ee )(ato ! 5a%o$! o %e 5a$!a6!%! c,e
co$$!(#o&oo a! #a$a"et$! #$e5!(t! 5e4oo !5ece
(e#a$at! co )a 5!$4o%a.
La +)*!oe 7)! a %ato $e(t!t)!(ce !% #!< 4$a&e &e! &)e
5a%o$! c,e $!ce5e co"e #a$a"et$!. E((e&o 7)e(t! )%t!"!
&e%%o (te((o t!#o' / #o((!6!%e &!c,!a$a$e !% t!#o !(!e"e
2(e#a$a&o #e$0 ! %o$o o"! co )a 5!$4o%a3
IM1ORTANTE: ! o"! &e%%e 5a$!a6!%! c,e
e5et)a%"ete 5e4oo )t!%!**ate a% "o"eto &e%
$!c,!a"o &e% (otto#$o4$a""a o &e5oo c,!a"a$(! #e$
+o$*a co"e ! #a$a"et$!. Detto ! a%t$e #a$o%e: #e$ !% +atto
&! a5e$ c,!a"ato a e b ! #a$a"et$! &e%%a +)*!oe o
(!a"o a((o%)ta"ete o66%!4at! a c,!a"a$e a%%o (te((o
"o&o %e 5a$!a6!%! &e% #$o4$a""a #$!c!#a%e )(ate #e$
c,!a"a$e !% (otto#$o4$a""aD e%%Oe(e"#!o' %e 5a$!a6!%!
&!c,!a$ate e% #$o4$a""a #$!c!#a%e (! c,!a"ao !+att!
num1 e num2: 7)e%%o c,e acca&e / c,e !% 5a%o$e
cote)to ! num1 5!ee co#!ato e% #a$a"et$o a e c,e
!% 5a%o$e cote)to ! num2 5!ee co#!ato e% #a$a"et$o
b. S! #a$%a !+att! &! passa##io dei parametri per
"alore 2$M "alue3.
NOTA. Se 5! (tate &o"a&a&o co"e (! +acc!a a &!(t!4)e$e %a "o&a%!t> &! #a((a44!o &e! #a$a"et$! bJ (alue &a%%Oa%t$a
c,e e(a"!e$e"o t$a #oco' co(!&e$ate 7)e(ta (e"#%!ce B$e4o%a9: 7)a&o e%%a (#ec!+!ca &e% #a$a"et$o a##a$e (o%o !%
()o o"e e& !% ()o t!#o !% #a((a44!o / bJ (alue. Do5$e"o !+att! a44!)4e$e 7)a%c,e co(a e%%a &!c,!a$a*!oe #e$
(ce4%!e$e %Oa%t$a "o&a%!t>.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Caratteristic/e !el %assaggio !ei %araetri %er 2alore
0l passaggio per valore ha una caratteristica decisamente interessante: 8 =sicuro% in "uanto non
consente al sottoprogramma di modifcare, tramite un parametro, una variabile del programma
principale. (erchiamo di capire il perchF con un esempio.
program esempio#
var numero: integer# simboli: string#
%roce!+re asterisc/i3*+anteAig/e) integer= riga) string5=
"egin
re%eat
0riteln3riga5=
*+anteAig/e )> *+anteAig/e 1 1
+ntil *+anteAig/e>0=
en!=
begin
numero:YP#
simboli:Y%SSSSSSSSSSSSSSSSSS%#
asterischi( numero, simboli #
writeln( numero # 3M c/e 2alore 2iene
sta%ato ? M5
readln#
end.
0 parametri indicati nella procedura sono chiamati %araetri $orali# "uelle indicate nel programma
al momento dell;utilizzo del sottoprogramma sono invece chiamati %araetri att+ali.
program esempio#
var numero: integer# simboli: string#
procedure asterischi("uante&ighe: integer# riga: string#
var i: integer#
begin
for i:YG to "uante&ighe do
writeln(riga#
end#
begin
writeln (="uante righe di S devo stampareD =#
readln( numero #
writeln (=che simboli uso per la stampaD =#
readln( simboli#
asterischi( numero, simboli #
readln#
end.
!e la procedura potesse invece modifcare (sen#a c/e il s+o +tili##atore ne $osse consa%e2ole le
variabili che corrispondono ai parametri attuali si correrebbe il rischio di incappare in errori molto
diCcili da scoprire.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. --
A)e(ta 5o%ta e% (otto#$o4$a""a !% c!c%o / $ea%!**ato
co %a (t$)tt)$a repeat until. Ma atte*!oe:
7)e(t9)%t!"o )(a co"e cotato$e !% #a$a"et$o
quante5ig1e (te((o' &!"!)e&o%o &! )o a& o4!
c!c%o.
La &o"a&a &a ) "!%!oe &! e)$o /: (e %a 5a$!a6!%e
numero #$!"a &! c,!a"a$e %a #$oce&)$a 5a%e 5' &o#o
a5e$ c,!a"ato %a #$oce&)$a 2c,e a##o$ta "o&!+!c,e a%
()o #$!"o #a$a"et$o3 7)a%e (a$> !% ()o 5a%o$eC
R!(#o(ta: %o (te((o c,e a5e5a #$!"a &e%%a c,!a"ataD
&etto ! a%t$e #a$o%e' il passa##io dei parametri b1
,alue non consente ad un sottopro#ramma di
modi%icare il "alore di una "aria$ile esterna
utili11ata nel pro#ramma principale per
ric4iamare la procedura stessa.
Parametri %ormali
Parametri attuali
0l passaggio 8 b1 value: il
sottoprogramma non pu@ modifcare
il valore dei parametri attuali numero
e simboli.
0l valore che la variabile del
programma numero ha al momento
dell;uso del sottoprogramma viene
assegnato alla variabile parametro
formale corrispondente
(quante9ighe. La stessa cosa
avviene per il secondo parametro. Di
fatto il sottoprogramma opera su una
copia dei parametri attuali e della
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
0mmaginiamo infatti la situazione in cui la procedura asterischi, una volta sperimentata e considerata
=perfetta%, venga tolta come codice dal programma visto prima ed inserita in una libreria chiamata
stampe. 0l programma apparirebbe allora cos? strutturato:
program esempio#
uses stampa#
var numero: integer# simboli: string#
begin
numero:YP#
simboli:Y%SSSSSSSSSSSSSSSSSS%#
asterischi( numero, simboli #
end.
0l programmatore non ha modo di capire se la procedura asterischi modifcher o meno il valore di uno
dei suoi parametri formaliA ,d anche se il codice dal sottoprogramma fosse ancora inserito
direttamente nel programma saremo sempre costretti ad un alto livello di attenzione perdendo molto
tempo nel controllare le istruzioni di ogni sottoprogramma per capire se esiste "uesta possibilit.
0nsomma, sarebbe un bel guaio se il sottoprogramma potesse modifcare (senza che "uesto fosse
dichiarato in "ualche modo a piacimento il valore di uno dei parametri attuali (numero, simboliA
In2ece7 gra#ie ai 2incoli i%osti !al %assaggio !ei %araetri %er 2alore 3"; 2al+e5 il
%rograatore I sic+ro c/e +n sotto%rograa neanc/e %er errore %otrO o!i4care il
2alore !i +n %araetro att+ale.
,sistono comun"ue dei vincoli tra i parametri indicati ne la scrittura del codice di un sottoprogramma
(chiamati %araetri $orali e "uelli che il programmatore utilizza nel programma principale "uando
intende usare il sottoprogramma (chiamati %araetri att+ali:
per ogni parametro formale deve essere indicato al momento dell;utilizzo del sottoprogramma un
corrispondente parametro attuale# riferendoci all;esempio della procedura asterischi, non 8 ammesso il
suo utilizzo specifcando solo il numero delle righe o solo i singoli da utilizzare# non ha ovviamente
senso anche cercare di usare pi< parametri attuali di "uelli previsti#
il parametro attuale dev;essere dello stesso tipo del parametro formale o almeno compatibile# il
parametro formale "uante&ighe della procedura asterischi 8 di tipo integer, per cui, richiamandola,
come primo parametro attuale potremo solo indicare o una costante integer o una variabile integer o
una "ualsivoglia espressione che restituisca un valore integer#
se un parametro formale fosse di tipo real allora il corrispondente parametro attuale potrebbe essere
al limite anche un integer visto che "uest;ultimo tipo di dato 8 compatibile con il real (ad esempio il P,
integer, verrebbe convertito nel real P.L# il contrario non sarebbe invece possibile, in "uanto il numero
di b-te necessario a rappresentare un real 8 maggiore di "uello necessario a rappresentare un integer#
ad esempio, il numero real GT.KV non viene automaticamente troncato al valore integer GT a causa di
una perdita di precisione che potrebbe risultare inaccettabile# il programmatore pu@ per@ indicare
come parametro attuale l;espressione trunc(GT.KV che dietro esplicito comando =tronca% un valore real
in un integer (in realt in un longint, compatibile a sua volta con un integer a patto che il valore cada
nell;intervallo previsto per gli integer#
i parametri attuali devono essere forniti nello stesso ordine logico previsto per "uelli formali# la
procedura asterischi si aspetta il numero delle righe come primo parametro e la stringa dei singoli da
usare come secondo# tentare di invertire l;ordine non ha gravi conseguenze, in "uesto particolare caso,
perchF i tipi dei due parametri sono diversi ed il compilatore si accorgerebbe subito del problema e
bloccherebbe la compilazione con un messaggio d;errore# ben diverso 8 il caso di parametri dello
stesso tipo: il compilatore non s;accorgerebbe di nulla dal momento che dal suo punto di vista si
tratterebbe comun"ue di due interi o di due stringhe eccetera
2iva l%indipendenzaA
9uella che sto per enunciare non 8 una regola sintattica ma una dettata dall;esperienza. 0dealmente
un sottoprogramma dovrebbe essere strutturato in modo da essere il pi< indipendente possibile dal
programma che lo utilizzer o da altri sottoprogrammi.
9uesto obiettivo viene raggiunto soprattutto con l;utilizzo dei parametri, e2itan!o !i +sare
!irettaente e2ent+ali 2aria"ili !el %rograa %rinci%ale. (onsideriamo infatti "uesto
esempio (ho ripreso la forma pi< semplice della procedura asterischi:
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 100
I&!co %9)(o &e%%a %!6$e$!a
(ome vedete, le istruzioni della
procedura asterischi non sono pi<
visibili.
0l codice corrispondente, gi
compilato in linguaggio macchina,
viene incorporato nell;eseguibile
fnale dal lin/er.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
program esempio#
var i: integer#
%roce!+re asterisc/i3*+anteAig/e) integer5=
"egin
$or i)>1 to *+anteAig/e !o
0riteln3,MMMMMMMMMMMMMMM-5=
en!=
begin
writeln (="uante righe di S devo stampareD =#
readln(numero#
asterischi( numero #
readln#
end.
!e proviamo a mandare in esecuzione il programma tutto sembra funzionare e, in e/etti, funziona
veramente... 6a la procedura 8 in realt meno leggibile, meno riutilizzabile e meno sicura.
6eno leggibile: non 8 suCciente passare in rassegna tutte le istruzioni della procedura per capire
tutto della procedura# infatti per capire cosa sia la i usata dal ciclo for dobbiamo cercare nel
programma principale la sua dichiarazione# e se "ualcuno tra voi sta pensando che realt 8 ovvio che
la i sia una variabile di tipo integer, vi invito a provare il seguente programmaA
program prova#
var i: char#
begin
for i:Y%A% to =W% do
write( i #
readln#
end.
6eno riutilizzabile: se spostiamo la procedura in un altro programma o la includiamo in una libreria
non 8 detto che in "uel programma o in "uella libreria sia presente, come nelle programma originale,
una variabile di tipo integer chiamata i# il ciclo for della procedura non potrebbe "uindi funzionare. ,
per "uanto vi possa sembrare strano "uesto 8 il caso pi< fortunato tra "uelli che possono capitare:
infatti il compilatore ci avverte dell;assenza della variabile ed il programmatore pu@ intervenire e
soprattutto si accorge che c;8 un problema.
6eno sicura: provate a pensare se nel programma in cui viene copiata la procedura esiste gi una
variabile con lo stesso nome e dello stesso tipo: il compilatore non farebbe una grinza perchF la
procedura pretende una certa variabile nel programma principale e "uesta viene trovata. 0l problema 8
che se in "uesto nuovo programma "uella stessa variabile serve per altri scopi, non appena si invoca
la procedura "uest;ultima modifca in modo inaspettato il suo valore interferendo con il resto del
programma.
7e discende un;altra regola: tutte le variabili di lavoro di un sottoprogramma dovrebbero essere
defnite all;interno di "uest;ultimo. ,ventuali valori4variabili esterne verranno comunicati tramite un
parametro.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 101
La "o&!+!ca c,e ,o a##o$tato / #!cco%a "a (o(ta*!a%e:
,o (#o(tato %a &!c,!a$a*!oe &e%%a 5a$!a6!%e i )t!%!**ata
#e$ !% c!c%o for &a%%O!te$o &e%%a #$oce&)$a a%%a (e*!oe
(ar &e% #$o4$a""a #$!c!#a%e.
No / #!< co(; o55!o c,e %a 5a$!a6!%e )(ata #e$ ) c!c%o for (!a #e$
+o$*a &! t!#o !te4e$' 5e$o CCC
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Passaggio !i %araetri %er in!iri##o 3"; re$erence5
(ome abbiamo visto, il passaggio di parametri per valore non consente la modifca di variabili esterne.
9ualche volta per@ "uesto 8 proprio ci@ di cui abbiamo bisogno... 0mmaginiamo di volere scrivere un
sottoprogramma per il calcolo delle due radici reali (se esistono di un%e"uazione di secondo grado:
function e"uazioneTgrado(a, b, c: real : real#
begin
\. (alcoli \
end#
5li unici valori di cui "uesta funzione ha bisogno sono i coeCcienti del termine di secondo grado, del
termine di primo grado e del termine noto (per applicare la notissima formula
a
ac b b
8
2
4
2
12

=

.
,cco "uindi giustifcata la presenza dei tre parametri chiamati a, b e c. )urtroppo, per@, una funzione
pu@ restituire un solo valore: impossibile, "uindi, far restituire con i meccanismi noti i due valori
corrispondenti alle due soluzioni richieste. La situazione parrebbe senza vie d;uscita: o si fa restituire la
funzione la prima delle due radici (fG oppure si fa restituire la seconda (fT.
9ualcuno potrebbe essere tentato dalla seguente strada (ma, come appena visto, assolutamente da
evitare:
program e"uazioni#
var +G,+T: real#
function e"uazioneTgrado(a, b, c: real : real#
begin
\. (alcoli \
+G:Y \# +T:Y \#

end#
9uello che occorre 8 un modo =sicuro% per consentire ad un sottoprogramma la modifca di una
variabile esterna# sicuro signifca che un programmatore che sta per utilizzare un sottoprogramma 8 in
grado, consultando la documentazione, di capire che la variabile che sta indicando come parametro
attuale pu@ essere modifcata dal sottoprogramma ed in che modo.
3utto "uesto accade con l;utilizzo dei %araetri %assati %er in!iri##o 3"; re$erence5. A livello
sintattico la modifca 8 minima: basta aggiungere prima del nome di un parametro formale la parola
var:
program e"uazioni#
var soluzioneG, soluzioneT: real#
procedure e"uazioneTgrado(a, b, c: real# var +G,+T: real#
begin
\. (alcoli \
+G:Y \# +T:Y \#

end#
begin
e"uazioneTgrado(J,U,P, soluzioneG, soluzioneT#
writeln(=Le soluzione sono =, soluzioneG, soluzioneT#
readln#
end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 102
A)e(ta (o%)*!oe )t!%!**a &!$etta"ete &)e 5a$!a6!%!
&e% #$o4$a""a #$!c!#a%e. S! t$atta &! )a #$at!ca
a((o%)ta"ete &a e5!ta$e #e$ t)tt! ! "ot!5! 5!(t! !
#$ece&e*a.
9uando un parametro formale 8
specifcato per indirizzo una modifca
ad esso si ripercuote in modo
permanente sulla variabile utilizzata
come parametro attuale al momento
della chiamata.
Detto in altre parole: nella sezione
delle variabili del programma
principale sono state dichiarate due
variabili (soluzione' e soluzione)
per memorizzare i risultati che
verranno calcolati dalla procedura.
La procedura viene poi richiamata
indicando proprio "ueste due
variabili come ultimi due parametri
attuali.
)oichF soluzione' corrisponde al
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
E:EACIPI :Q&.'I 1 %rio "locco
:&' 1. !iRcoltO) "assa (he percentuale rappresenta un numero A rispetto ad un altro numero QD
,sempio: GLL rispetto a GPL Y VP (GLL 8 il VPR di GPL.
program percentuale#
uses newdela-,crt#
(S che percentuale 8 A di QD S
function perc(A, Q: real: real#
begin
perc :Y (A4Q S GLL
end#
begin
clrscr#
(S esempi d;uso ... S
writeln( perc(G, G:J:T, ;R; # (S GLLR S
writeln( perc(GV, JU:J:T, ;R; # (S PLR S
writeln( perc(I, TU:J:T, ;R; # (S JJ.JJJJJJJJR ...S
writeln( perc(TJU.VI, UJPK.IV:J:T, ;R; # (S e chi lo sa DD S
(S viene calcolato un valore corretto anche "uando A ^ Q S
writeln( perc(GPL, GLL:J:T, ;R; # (S GPLR S
writeln(;0720> per continuare ...;#
readln#
end.
:&' 2. !iRcoltO) "assa (alcolare una certa percentuale di un numero.
program prova)ercentuale#
uses newdela-, crt#
function percentuale(perc: real# numero: real: real#
begin
percentuale :Y (numero4GLL S perc#
end#
begin
clrscr#
writeln( percentuale(TL, GLL:T:T# (S TLR di GLL Y TL S
writeln( percentuale(TL, JP:T:T# (S TLR di JP Y V S
writeln( percentuale(L, UV:T:T# (S LR di "ualun"ue numero Y L S
writeln( percentuale(TL, L:T:T# (S TLR di L Y L S
readln#
end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 10'
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
:&' 3. !iRcoltO) "assa (alcolare un prezzo comprensivo d%02A.
program prova)ercentuale#
uses newdela-, crt#
var prezzo, iva: real#
(S sfruttiamo la funzione scritta prima \ S
function percentuale(perc: real# numero: real: real#
begin
percentuale :Y (numero4GLL S perc#
end#
function prezzo(on02A(prezzo!enza02A: real# percentuale02A: real: real#
begin
prezzo(on02A :Y prezzo!enza02A Z percentuale(prezzo!enza02A, percentuale02A#
end#
begin
clrscr#
writeln(;0nserire prezzo senza 02A;#
readln(prezzo#
writeln(;0nserire pecentuale 02A da applicare;#
readln(iva#
writeln(;,cco il totale 02A compresa: ;, prezzo(on02A(prezzo, iva:K:T#
readln#
end.
:&' 4. !iRcoltO) "assa (onversione da metri a chilometri e viceversa.
program conversioni#
uses newdela-, crt#
var metri, 1m: real#
(S da m a 1m S
function m`1m("uanti6etri: real: real#
begin
m`1m :Y "uanti6etri 4 GLLL#
end#
(S da 1m a m S
function 1m`m("uantiNm: real: real#
begin
1m`m :Y "uantiNm S GLLL#
end#
begin
clrscr#
writeln(;0nserire metri;#
readln(metri#
writeln(metri:P:T,; metri corrispondono a ;,m`1m(metri:P:T,; chilometri;#
writeln(;0nserire ora i chilometri;#
readln(1m#
writeln(1m:P:T,; chilometri corrispondono a ;,1m`m(1m:P:T,; metri;#
readln#
end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 10)
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
:&' 5. !iRcoltO) "assa (onvertire un certo numero di secondi nei minuti corrispondenti. !i vogliono
anche sapere i secondi che avanzano.
program conversioni#
uses newdela-, crt#
var ss, avanzano: integer#
(S da secondi a minuti# viene calcolato anche l;avanzo S
function ss`mm("uanti!econdi: integer# var avanzo: integer: integer#
begin
avanzo :Y "uanti!econdi mod KL#
ss`mm :Y "uanti!econdi div KL#
end#
begin
clrscr#
writeln(;0nserire secondi;#
readln(ss#
writeln(ss,; secondi corrispondono a ;,ss`mm(ss,avanzano,; minuti e ;, avanzano, ; secondi;#
readln#
end.
:&' 6. !iRcoltO) "assa (onvertire un certo numero di minuti nelle ore corrispondenti. !i vogliono
anche sapere i minuti che avanzano.
program conversioni#
uses newdela-, crt#
var mm, avanzano: integer#
(S da secondi a minuti# viene calcolato anche l;avanzo S
function ss`mm("uanti!econdi: integer# var avanzo: integer: integer#
begin
avanzo :Y "uanti!econdi mod KL#
ss`mm :Y "uanti!econdi div KL#
end#
(S da minuti a ore# viene calcolato anche l;avanzo S
function mm`hh("uanti6inuti: integer# var avanzo: integer: integer#
begin
(S sfrutto la precedente: il calcolo da fare e; infatti lo stesso A S
mm`hh :Y ss`mm("uanti6inuti, avanzo#
end#
begin
clrscr#
writeln(;0nserire minuti;#
readln(mm#
writeln(mm,; minuti corrispondono a ;,mm`hh(mm,avanzano,; ore e ;, avanzano, ; minuti;#
readln#
end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 105
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
:&' 7. !iRcoltO) "assa (onvertire un certo numero di secondi nelle ore corrispondenti. !i vogliono
anche sapere i minuti ed i secondi che che avanzano.
program conversioni#
uses newdela-, crt#
var ss, avanzano, avanzano`mm: integer#
(S da secondi a minuti# viene calcolato anche l;avanzo S
function ss`mm("uanti!econdi: integer# var avanzo: integer: integer#
begin
avanzo :Y "uanti!econdi mod KL#
ss`mm :Y "uanti!econdi div KL#
end#
(S da minuti a ore# viene calcolato anche l;avanzo S
function mm`hh("uanti6inuti: integer# var avanzo: integer: integer#
begin
(S sfrutto la precedente: il calcolo da fare e; infatti lo stesso A S
mm`hh :Y ss`mm("uanti6inuti, avanzo#
end#
(S da secondi a ore# viene calcolato anche l;avanzo S
function ss`hh("uanti!econdi: integer# var avanzo`ss, avanzo`mm: integer: integer#
var "uanti6inuti: integer#
begin
"uanti6inuti :Y ss`mm("uanti!econdi, avanzo`ss#
ss`hh :Y mm`hh("uanti6inuti, avanzo`mm
end#
begin
clrscr#
writeln(;0nserire i secondi per convertirli in ore ...;# readln(ss#
write(ss,; secondi corrispondono a ;,ss`hh(ss,avanzano, avanzano`mm,; ore, ;#
writeln(avanzano`mm, ; minuti e ;, avanzano,; secondi;#
readln#
end.
:&' 8. !iRcoltO) "assa ,strarre la parte decimale di un numero reale f ("uella ;dopo la virgola;# in
pratica simula la funzione standard frac... ,sempio: decimale(GJ,VP M _ L,VP.
program parteDecimale#
uses newdela-,crt#
(S 7>3A. (on il )ascal la parte decimale e; separata da "uella intera da un punto, non dalla virgola#
7>3A. 2iene sfruttata la funzione predefnita 3&'7( (che elimina la parte decimale da un reale.
3&'7((GL.V M_ GL S
function decimale(+: real: real#
begin
decimale :Y + M trunc(+#
end#
begin
clrscr#
(S esempi d;uso ... S
writeln( decimale(L.IHGV:U:U # (S L.IHGV S
writeln( decimale(U.IHGV:U:U # (S L.IHGV S
writeln( decimale(JKI.IHGV:U:U # (S L.IHGV S
writeln(;0720> per continuare ...;# readln# end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 10*
Ua (otto#$o4$a""a #)0 (+$)tta$e ) a%t$o =
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
:&' 9. !iRcoltO) "assa Dato un carattere dire se rappresenta una lettera maiuscola.
program controlla6aiuscolo#
uses newdela-,crt#
(S restituisce true solo se il carattere e% una lettera maiuscola cioe; solo se il suo codice ascii e;
compreso tra "uello della A e "uello della W S
function is'p(ase(c: char : boolean#
begin
is'p(ase :Y ( ord(c _Y ord(;A; and ( ord(c ^Y ord(;W; #
end#
begin
clrscr#
(S esempi d;uso ... S
writeln( is'p(ase(;A; #
writeln( is'p(ase(;a; #
writeln( is'p(ase(;W; #
writeln( is'p(ase(;z; #
writeln( is'p(ase(;A; #
writeln(;0720> per continuare ...;#
readln#
end.
:&' 10. !iRcoltO) e!ia Dato un carattere trasformarlo in minuscolo# se 8 gi minuscolo lasciarlo
tale. !fruttare la funzione precedente (vedi !>3H
program converti0n6inuscolo#
uses newdela-,crt#
(S restituisce true solo se il carattere e% una lettera maiuscola cioe; solo se il suo codice ascii e;
compreso tra "uello della A e "uello della W S
function is'p(ase(c: char : boolean#
begin
is'p(ase :Y ( ord(c _Y ord(;A; and ( ord(c ^Y ord(;W; #
end#
(S (onverte un !075>L> carattere in minuscolo# se non ha senso la conversione (non e; una lettera
maiuscola restituisce il carattere inalteratoS
function low(ase(c: char : char#
var distanza: integer#
begin
if is'p(ase(c then
begin
(S che valore separa le lettere minuscole dalle maiuscole nel codice asciiD S
distanza :Y ord(;a; M ord(;A;# (S HV M KP Y JT S
(S 7>3A: e; meglio usare ord(;A; invece del valore KP perche; KP funziona solo con la tabella dei
caratteri dei sistemi operativi 6icrosoft e altri, ma non tutti: ci sono sistemi operativi con tabelle con
valori diversi# ord(;A; ha piu; probabilita; di funzionare: e; indipendente dal valore nella tabella
(potrebbe essere KP o JU o "ualsiasi altro valore, ma se le lettere sono codifcate se"uenzialmente
dalla ;A; alla ;W; e dalla ;a; alla ;z;, non ci saranno problemi: cambiera; solo la distanza che rimarra; pero;
fssa per "uel sistema operativo# per gli stessi motivi e; meglio usare la formula ord(;a; M ord(;A;
invece del suo valore JT (valido solo in ambienti windows \
S
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 10+
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
(S trasformo in minuscolo: al codice ascii del carattere sommo la sfasatura con il set delle minuscole, e
ritrasformo il risultato nel carattere corrispondente S
low(ase :Y chr( ord(c Z distanza
end
else
low(ase:Yc
end#
begin
clrscr#
(S esempi d;uso ... S
writeln( low(ase(;A; #
writeln( low(ase(;a; #
writeln( low(ase(;W; #
writeln( low(ase(;z; #
writeln( low(ase(;A; # (S inalterato ... S
writeln(;0720> per continuare ...;#
readln#
end.
:&' 11. !iRcoltO) alta Data una stringa convertirla in minuscolo o maiuscolo a seconda del valore di
un parametro come (se comeY;m; converte in minuscolo, se comeY;6; converte in maiuscolo# se
come non ha un valore valido la stringa viene restituita immodifcata. !fruttare alcune funzioni
precedenti (!>3H e !>3GL
program 6inuscolo6aiuscolo#
uses newdela-, crt#
(S per un commento vedi !>3H S
function is'p(ase(c: char : boolean#
begin is'p(ase :Y ( ord(c _Y ord(;A; and ( ord(c ^Y ord(;W; # end#
(Sper un commento vedi !>3GL S
function low(ase(c: char : char#
var distanza: integer#
begin
if is'p(ase(c then
begin
distanza :Y ord(;a; M ord(;A;# (S HV M KP Y JT S
low(ase :Y chr( ord(c Z distanza
end
else
low(ase:Yc
end#
(S converte una stringa in minuscolo S
function minuscolo(s: string: string#
var i: integer# ris: string#
begin
ris:Y;;#
for i:YG to length(s do
ris :Y ris Z low(ase(sgie#
minuscolo:Yris#
end#
(S (onverte una stringa in maiuscolo S
function maiuscolo(s: string: string#
var i: integer# ris: string#
begin
ris:Y;;#
for i:YG to length(s do
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 10,
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
ris:Yris Z upcase(sgie# (S sfrutta la funzione predefnita upcase \ S
maiuscolo:Yris#
end#
(S converte un maiuscolo a seconda del parametro ;come;# se comeY;m; converte in minuscolo, se
comeY;6; converte in maiuscolo# se come non ha un valore valido la stringa viene restituita identica
S
function 6ini6aiu(s: string# come: char : string#
begin
case come of
;m;: 6ini6aiu :Y minuscolo(s#
;6;: 6ini6aiu :Y maiuscolo(s#
else
6ini6aiu :Y s#
end#
end#
begin
clrscr#
(S esempi d;uso ... S
writeln( 6ini6aiu(;AaWzGTA;,;m; #
writeln( 6ini6aiu(;AaWzGTA;,;6; #
writeln( 6ini6aiu(;AaWzGTA;,;t; #
writeln(;0720> per continuare ...;#
readln#
end.

Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 10-
S+$)tta&o ! (otto#$o4$a""! 4!> e(!(tet!' %a (o%)*!oe &e%
#$o6%e"a o$!4!a%e &!5eta 6aa%e.
1$o6%e"a o$!4!a%e
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Geto!ologie 'o% Do0n e Botto S%
L%esercizio precedente introduce in modo naturale una tecnica di sviluppo utilizzata per problemi di
media4alta complessit. 0nvece di tentare di risolvere il problema come un tutt%uno, compito di solito
molto diCcile, si procede ad una suddivisione in sottoproblemi. ,% intuitivo che ogni sottoproblema sia
pi< semplice di "uello originale. )er ogni sottoproblema che si ritiene ancora troppo complesso si
procede ad ulteriore suddivisione. 0l procedimento viene ripetuto fno ad ottenere un certo numero di
sottoproblemi suCcientemente semplici da essere risolti e codifcati con una certa facilit. A livello
pratico "uesto coincide ad individuare tutta una serie di sottoprogrammi che a loro volta ne
richiamano altri. 9uesta metodologia viene chiamata '&P D&EN (dall%alto al basso, perchF
grafcamente possiamo rappresentarla come una struttura a piramide in cui in cima (top si mette il
problema originale e via via che si scende di livello sottoproblemi sempre pi< semplici, fno ad arrivare
alla base (bottom della piramide in cui troviamo i sottoproblemi pi< semplici.
2ediamo di riconoscere "uesto procedimento nell%esercizio precedente. !i trattava di realizzare un
comando per trasformare una stringa in minuscolo o in maiuscolo. 9uesto problema iniziale viene
suddiviso in modo molto naturale nei due sottoproblemi G convertire una stringa in minuscolo e T
convertire una stringa in maiuscolo:
0l sottoproblema =convertire una stringa in minuscolo% pu@ essere ulteriormente scomposto in due altri
sotto problemi: G decidere se un carattere 8 minuscolo e T convertire un singolo carattere in
minuscolo (pi< semplice rispetto alla conversione di un;intera stringa. Anche per l;altro sotto problema
viene individuato il sotto problema corrispondente alla conversione in maiuscolo di un singolo
carattere.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 110
Co5e$t!$e )a St$!4a
! M!)(co%o-Ma!)(co%o
Co5e$t!$e )a
St$!4a ! M!)(co%o
Co5e$t!$e )a
St$!4a ! Ma!)(co%o
(otto#$o6%e"!
Con"ertire una +trin#a
in -inuscolo6-aiuscolo
Con"ertire una
+trin#a in -inuscolo
Con"ertire una
+trin#a in -aiuscolo
Il carattere minuscolo G Con"erti un sin#olo carattere in minuscolo Con"erti un sin#olo carattere in maiuscolo
NOTA: 7)e(ta tec!ca 5!ee !&!cata ac,e co"e Bdi(ide et impera9 2&!5!&! e "at!e! (otto cot$o%%o3 &a ) &etto
&e4%! at!c,! $o"a!: #e$ "atee$e (otto cot$o%%o ) 5a(to te$$!to$!o a##ea co7)!(tato 5a(te +ette &e%%a #o#o%a*!oe
5e!5ao &e#o$tate ! a$ee 4eo4$a+!c,e %otae. I 7)e(to "o&o 7)e% #o#o%o #e$&e5a %a ()a )!t> e %a ()a +o$*a e& e$a
#!< +ac!%e &o"!a$%o.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
>ltre alla riduzione della complessit la metodologia topMdown o/re un;altra caratteristica: consente di
allestire la struttura portante dell;intero programma senza aver completato i singoli componenti, cos?
da poterlo provare nei suoi aspetti macroscopici. )er fare un paragone 8 come se avessimo a
disposizione il prototipo di un;automobile con il telaio (ma non i vetri e le rifniture, il volante e le ruote
(ma un fnto servosterzo e niente copertoni, il cruscotto con i controlli ma senza un vero impianto
elettrico, pedali e cambio ma niente sistema di frenatura e solo un abbozzo del motore. (ertamente
tutto "uesto non ci permetterebbe di fare un giro di pista a 6onza ma consentirebbe agli ingegneri ed
ai meccanici di salire veramente in macchina e saggiare dal vivo almeno le caratteristiche e
economiche (visibilit, comodit del posto guida, spazi interni, corretta disposizione dei controlli
eccetera# insomma non 8 come avere singoli pezzi, pur funzionanti ma che non consentono di trovare
il tutto almeno in alcuni dei suoi aspetti.
Di nuovo, cerchiamo di ritrovare "uesti concetti nell;esempio precedente. Dopo aver individuato i
sottoprogrammi da sviluppare il programmatore pu@ rapidamente scrivere solo l;intelaiatura di
ciascuno di essi ma gi collegando il tutto a formare un programma funzionante:
program 6inuscolo6aiuscolo#
uses newdela-, crt#
function is'p(ase(c: char : boolean#
begin
is'p(ase :Y true#
end#
function low(ase(c: char : char#
begin
low(ase :Y =a%#
end#
function minuscolo(s: string: string#
begin
minuscolo:Y%stringa di prova%#
end#
function maiuscolo(s: string: string#
maiuscolo:Y%!3&075A D0 )&>2A%#
end#
function 6ini6aiu(s: string# come: char :
string#
begin
case come of
;m;: 6ini6aiu :Y minuscolo(s#
;6;: 6ini6aiu :Y maiuscolo(s#
else
6ini6aiu :Y s#
end#
end#
begin
clrscr#
(S esempi d;uso ... S
writeln( 6ini6aiu(;AaWzGTA;,;m; #
writeln( 6ini6aiu(;AaWzGTA;,;6; #
writeln( 6ini6aiu(;AaWzGTA;,;t; #
writeln(;0720> per continuare ...;#
readln#
end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 111
Ecco !% Bt$)cco9: #)$ a5e&o (ta6!%!to %O!te$+acc!a &! o4!
(otto#$o4$a""a 2!% o"e e& ! #a$a"et$! c,e $!ce5e$>3 !% co&!ce
&! c!a(c)o &! e((! / $!&otto a%%Oo((o' !% "!!"o !&!(#e(a6!%e
#e$ #ote$%! $!c,!a"a$e ! #ote$ #$o5a$e !% #$o4$a""a #$!c!#a%e.
O4! +)*!oe o ca%co%a 5e$a"ete !% ()o $!()%tato "a
$e(t!t)!(ce ) 5a%o$e +a()%%o 2#e$0 &e% t!#o 4!)(to3: a& e(e"#!o
%a +)*!oe "a!)(co%o $e(t!t)!(ce co"e $!()%tato %a (t$!4a +!((a
B STRINHA DI 1RO:A9.
A)e(to #e$"ette co")7)e a #$o4$a""ato$e &! (c$!5e$e e!
"!!"! &etta4%! %a +)*!oe 6ini6aiu c,e' #e$ co(; &!$e' o (!
acco$4e &! $!c,!a"a$e &e%%e +)*!o! !co"#%ete 2ac,e (e'
at)$a%"ete' ! 5a%o$! c,e (! 5e&e $e(t!t)!$e (oo (e"#$e 7)e%%! e
+a()%%!.
I% #$o4$a""ato$e #)0 ac,e o$4a!**a$e !% co$#o #$!c!#a%e &e%
#$o4$a""a 5e$!+!ca&o c,e t)tt! ! (otto#$o4$a""! (! $!c,!a"!o
co$$etta"ete t$a %o$o. Fatto 7)e(to #)0 #$oce&e$e a co"#%eta$e
5e$a"ete c!a(c) (otto#$o4$a""a o##)$e' e 7)e(to / ) a%t$o
5ata44!o &e%%Oa5e$ co(t$)!to $a#!&a"ete %o B(c,e%et$o9 &e%
#$o4$a""a' #)0 +!&a$e !% co"#%eta"eto a #!< #$o4$a""ato$!
! cote"#o$aea e &a c!a(c)o co(e4a$e )a co#!a &! 7)e(to
(c,e%et$o ! "o&o &a #ote$ te(ta$e !% co&!ce (e*a a5e$e a
&!(#o(!*!oe %a #a$te c,e 5!ee (5!%)##ata &a4%! a%t$!.
I% co"#%eta"eto #)0 a55e!$e ac,e #e$ a++!a"et!
()cce((!5!: (! !!*!ao co %O!t$o&)$$e 5e$(!o! o #e$+ette "a
5!a 5!a (e"#$e #!< +)*!oat! &e! 5a$! (otto#$o4$a""!. A)e(to
a!)ta a cocet$a$(! ()4%! a(#ett! +o&a"eta%! &e% #$o6%e"a: a&
e(e"#!o o / !"#o$tate a%%O!!*!o #$eocc)#a$(! &! t)tt! !
#o((!6!%! e$$o$! &! !(e$!"eto &at! c,e #ot$e66e co""ette$e
%O)teteD %a 4e(t!oe &e4%! e$$o$! / (e*Oa%t$o ) a(#etto c,e #)0
e((e$e !t$o&otto ! ) (eco&o "o"eto.
Nat)$a%"ete &o#o c,e c!a(c) #$o4$a""ato$e a5$>
co"#%etato !% te(t ()%%a ()a #a$te (a$> ece((a$!a )a +a(e &! te(t
coc%)(!5a co t)tto !% co&!ce a% ()o #o(to=
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
La tecnica del topMdown presuppone, per@, che il programmatore abbia un;idea chiara, almeno a grandi
linee, del programma nella sua versione completa. !olo in "uesto modo potr infatti prefgurarsi i
sottoprogrammi che dovranno essere sviluppati e come "uesti dovranno interagire tra loro.
Diversamente non sarebbe infatti in grado di abbozzare lo scheletro dell;intero programma.
QottomM'p
9uando "uesto non 8 possibile (per l;estrema complessit del progetto e4o per l;alto grado di
innovazione dello stesso che non consente di avere le idee chiare su tutto fn dall;inizio pu@ essere
d;aiuto procedere in un altro modo: cominciare a sviluppare piccole porzioni sulle "uali si hanno
comun"ue idee chiare senza sapere ancora come si incastreranno tra loro (almeno nei dettagli. !ar
solo in un secondo momento che ci si preoccuper di assemblare il programma con "uesti componenti.
)er fare un paragone, 8 un po; come se si volesse realizzare un veicolo innovativo per spostarsi sulla
sabbia: il progettista potrebbe non aver ancora le idee chiare sulla forma e le caratteristiche defnitive
del veicolo. )otrebbe per@ decidere di cominciare a realizzare delle ruote speciali, per poi passare al
motore, poi alle singole parti del telaio e cos? via. 0nfne decider come assemblare insieme "ueste
parti: certamente potrebbe essere costretto a rifare dei pezzi o a scartarne alcuni o ad adattarne degli
altri (8 il prezzo per "uesta modalit di sviluppo in cui non 8 possibile progettare nei dettagli fn
dall;inizio# inoltre, di nuovo non avendo progettato fn dall;inizio le interconnessioni tra le varie parti,
sar pi< diCcile aCdarne lo sviluppo a diversi programmatori senza essere costretti a dell;ulteriore
lavoro in fase di assemblaggio (un programmatore potrebbe aver progettato l;interfaccia di un suo
sottoprogramma in modo non ottimale per un altro.
9uesta tecnica 8 chiamata B&''&GKSP (dal basso verso l;alto: si parte dai dettagli e dai componenti
pi< semplici per assemblare via via i componenti di pi< alto livello, "uelli pi< complessi.
7on si pu@ dire che la tecnica sia superiore all;altra, tant;8 che non 8 infre"uente il caso in cui vengano
in realt utilizzate entrambe: il progetto viene fatto magari in modo topMdown ma lo sviluppo parte in
modo dettagliato dei livelli pi< bassi. La tecnica bottomMup si rivela particolarmente eCcace "uando un
progetto viene sviluppato seguendo la flosofa della >>) (>b]ect >riented )rogrammino che vede
programmatore sviluppare componenti autonomi con l;obiettivo di poterli facilmente riutilizzare in
progetti diversi. L%>>) verr a/rontata in "uarta.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 112
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
E:EACIPI :Q&.'I 1 secon!o "locco
:&' 12. !iRcoltO) "assa Dati due numeri determinare il maggiore.
program massimo#
var nG,nT,+: real#
(S restituisce il massimo tra due valori comunicati S
function ma+(a,b: real: real#
var risultato: real#
begin
if a_Yb then
risultato:Ya
else
risultato:Yb#
ma+:Yrisultato
end#
(S prove di utilizzo della funzione massimo S
begin
(S specifcando come parametri delle costanti numeriche ... S
writeln ( ma+(J,UK:T:L #
writeln ( ma+(UK,J:T:L #
writeln ( ma+(J,J:T:L #
writeln ( ma+(MUJ,G :T:L#
(S specifcando come parametri delle variabili esterne S
writeln(;0nserisci due numeri e ti diro;; "ual;;e;; il piu;; grande;#
write(;Dimmi il primo M_ ;# readln(nG#
write(;Dimmi il secondo M_ ;# readln(nT#
writeln ( ma+(nG,nT :T:L#
writeln ( ma+(nG,UK :T:L#
writeln ( ma+(UK,nT :T:L#
(S una funzione puo; essere usata direttamente nel calcolo di un;espressione S
+:YGJ S ( ma+(nG,K M GI#
writeln(;f: ;,+:T:L#
(S ma+ puo; essere usata nella condizione di un if S
if ma+(nG,nT _ GLL then
writeln(;0l massimo tra i due valori supera GLL;#
(S o di un repeat ... S
(S ad una centralina di controllo arrivano i dati sull;in"uinamento letti da due sonde poste in punti
strategici della citta;# leggere "uesti dati fno a "uando una delle due sonde comunica un valore
maggiore di PL (microgrammi4mc S
repeat
write(;0nserire valore sonda n. G M_ ;#
readln(nG#
write(;0nserire valore sonda n. T M_ ;#
readln(nT
until ma+(nG,nT_PL# (S grazie alla funzione ma+ il controllo pu@ essere e/ettuato in contemporanea
S
readln#
end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 11'
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
:&' 13. !iRcoltO) "assa Determinare il numero di vocali presenti in una stringa.
program prova#
uses newdela-,crt#
(S conta "uante vocali ci sono in una stringa, prima tecnica S
function conta2ocali(s: string : integer#
var nv,i: integer#
begin
nv:YL# (S numero vocali S
for i:YG to length(s do
case sgie of
;a;,;A;,;e;,;,;,;i;,;0;,;o;,;>;,;u;,;';: nv:YnvZG#
end#
conta2ocali:Ynv
end#
(S conta "uante vocali ci sono in una stringa, secondo tecnica S
(S usa la funzione )>! invece del case S
function conta2ocaliT(s: string : integer#
var nv,i: integer#
begin
nv:YL# (S numero vocali S
for i:YG to length(s do
if pos(sgie, ;aAe,i0o>u';^_L then
nv:YnvZG#
conta2ocaliT:Ynv
end#
begin
writeln(conta2ocali(;casa dolce casa;#
readln
end.
:&' 14. !iRcoltO) "assa !crivere un comando che invita l;operatore a premere un tasto per
continuare.
(S ha bisogno di commenti D S
procedure attendi#
begin
writeln(;.............. )&,60 0720> ),& (>7307'A&, ...............;#
readln
end#
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 11)
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
:&' 15. !iRcoltO) "assa !crivere un comando per la visualizzazione di un messaggio "ualsiasi tra
due cornicette di asterischi# l;esecuzione del programma deve anche interrompersi invitando l;utente a
per un tasto per continuare (sfruttare il comando precedente.
)rogram prova#
procedure attendi#
begin
writeln(;.............. )&,60 0720> ),& (>7307'A&, ...............;#
readln
end#
(S visualizza la stringa ricevuta ed attende la pressione di 0720> S
procedure messaggio(mes: string#
begin
writeln(;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM;#
writeln(mes#
writeln(;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM;#
attendi#
end#
begin
clrscr#
messaggio(=(iao, come vaD%#
end.
:&' 16. !iRcoltO) "assa !crivere un sottoprogramma per il calcolo di +
-
con f e h interi positivi.
program potenze#
uses newdela-, crt#
var unaQase,un,sponente: integer#
function eleva(base,esponente: integer:real#
var risultato: real# i: integer#
begin
risultato:YG#
for i:YG to esponente do
risultato:YrisultatoSbase#
eleva:Yrisultato
end#
begin
clrscr#
write(;Dimmi la base ;# readln(unaQase#
write(;Dimmi l;;esponente ;# readln(un,sponente#
writeln(;base: ;,unaQase,; M esponente: ;,un,sponente#
writeln(;il risultato e;;: ;, eleva(unaQase,un,sponente:K:L #
readln
end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 115
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
:&' 17. !iRcoltO) e!ia 3ogliere da una stringa eventuali spazi inutili all;inizio o alla fne della
stringa stessa.
program elimina`spazi#
uses crt#
var stringa: string#
function togli`spazi(s: string: string#
var i: integer#
inizio,fne: integer#
spazio: boolean#
risultato: string#
begin
inizio:YG# fne:Ylength(s#
(S cerco il primo carattere diverso da spazio a sinistra S
spazio:Y (sginizioeY; ;#
while ( inizio^Yfne and spazio do
begin
inc(inizio#
spazio:Y(sginizioeY; ;
end#
(S cerco il primo carattere diverso da spazio a destra S
spazio:Y (sgfneeY; ;#
while ( fne_Yinizio and spazio do
begin
dec(fne#
spazio:Y(sgfneeY; ;
end#
risultato:Y;;#
for i:Yinizio to fne do
risultato:YrisultatoZsgie#
togli`spazi:Yrisultato
end#
begin
clrscr#
writeln( ;a;,togli`spazi(;;,;a; #
writeln( ;a;,togli`spazi(;a;,;a; #
writeln( ;a;,togli`spazi(; a;,;a; #
writeln( ;a;,togli`spazi(;a ;,;a; #
writeln( ;a;,togli`spazi(;ab;,;a; #
writeln( ;a;,togli`spazi(; a;,;a; #
writeln( ;a;,togli`spazi(;a ;,;a; #
writeln( ;a;,togli`spazi(; ab;,;a; #
writeln( ;a;,togli`spazi(;ab ;,;a; #
writeln( ;a;,togli`spazi(; ab ;,;a;#
writeln( ;a;,togli`spazi(; "uesta e%% una frase ;,;a; #
readln
end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 11*
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
RE5OLE DI .I+IBILITAH 7+COPIN5 RULE+: E DURATA DELLE .ARIABILI
Sc$!5e&o #$o4$a""! &! )a ce$ta co"#%e((!t> / !"#o$tate ca#!$e #e$ o4! et!t> 25a$!a6!%!' co(tat!'
(otto#$o4$a""!' t!#! ecc.3 &o5e #)0 e((e$e )(ata e %a ()a &)$ata 2c,e o / &etto c,e (! e(te&a &a% "o"eto ! c)! !%
#$o4$a""a 5!ee +atto #a$t!$e a 7)e%%o ! c)! 5!ee te$"!ato3.
A)a&o )Oa##%!ca*!oe / co(t!t)!ta &a ) )!co +!%e (o$4ete e o (! +a )(o &! (otto#$o4$a""! !% #$o6%e"a o
()((!(te: ! ) 7)a%(!a(! #)to &e% co&!ce t$a !% begin &! !!*!o e %9end +!a%e #o((!a"o +a$ $!+e$!"eto a& )a 5a$!a6!%e
7)a%(!a(!' a& )a co(tate 7)a%(!a(! eccD 7)e(te (te((e 5a$!a6!%! e(!(too &a% "o"eto ! c)! !% #$o4$a""a !!*!a %a
()a e(ec)*!oe +!o a% "o"eto ! c)! !% #$o4$a""a 5!ee te$"!ato.
La (!t)a*!oe (! co"#%!ca 7)a&o ! ) #$o4$a""a (! &!c,!a$ao &e! (otto#$o4$a""! 2#$oce&)$e o +)*!o!3: !+att!
#o((!a"o a5e$e #a$a"et$! co %o (te((o o"e &! 5a$!a6!%! o co(tat! &e% #$o4$a""a #$!c!#a%e' o##)$e 5a$!a6!%! o
co(tat! &!c,!a$ate e%%e $!(#ett!5e (e*!o! &e% (otto#$o4$a""a e c,e ,ao %o (te((o o"e &! 5a$!a6!%! e co(tat! &e%
#$o4$a""a #$!c!#a%e. Ce$c,!a"o &! "ette$e a +)oco %a (!t)a*!oe co ) e(e"#!o:
program principale'
(ar %: integer' &: string'
#: real'
procedure !(%: integer)'
(ar &: real'
begin
write(%)'
& :: ".1$0#'
end'
begin
% :: $'
& :: *ciao.'
end.
Co"e #otete 6e ca#!$e / e((e*!a%e (ta6!%!$e &e%%e $e4o%e' #ea !% cao( tota%e=
Le et!t> &!c,!a$ate e%%a (e*!oe (ar &e% #$o4$a""a #$!c!#a%e (oo 5!(!6!%!:
o ! ) #)to 7)a%(!a(! t$a !% begin e %9end. &e% #$o4$a""a #$!c!#a%e
o ! ) (otto#$o4$a""a 7)a%(!a(! a #atto c,e e(() #a$a"et$o o 5a$!a6!%e %oca%e a66!ao %o (te((o
o"e: ! 7)e(to )%t!"o ca(o t$a !% begin e l@end ,ao !% (o#$a55eto ! #a$a"et$! &e%%e 5a$!a6!%!
%oca%! 2#ot$e""o &!$e c,e (! +a (e"#$e $!+e$!"eto a%%a &!c,!a$a*!oe B#!< 5!c!a9 a% #)to ! c)!
(t!a"o (c$!5e&o3D
NOTA: a66!a"o co")7)e #!< 5o%te $!6a&!to c,e ) (otto#$o4$a""a o &o5$e66e "a! teta$e &!
)t!%!**a$e &!$etta"ete )a 5a$!a6!%e e(te$a 2(e"#$e e (o%o att$a5e$(o ) #a$a"et$o=3
Le et!t> &!c,!a$ate e%%a (e*!oe (ar &e% #$o4$a""a #$!c!#a%e e(!(too &a% "o"eto ! c)! !!*!a !%
#$o4$a""a +!o a% "o"eto ! c)! te$"!a.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 11+
I 7)a%! #)t! &e% co&!ce / 5!(!6!%e %a 5a$!a6!%e A &!c,!a$ata e%%a (e*!oe (ar
&e% #$o4$a""a #$!c!#a%eC
A)a&o c! t$o5!a"o a%%O!te$o &e% 6%occo begin G end. &e% #$o4$a""a
#$!c!#a%e e tet!a"o &! a((e4a$e ) 5a%o$e a%%a 5a$!a6!%e A' 5!ee )(ata
7)e%%a &!c,!a$ata e%%a (e*!oe (ar &e% #$o4$a""a #$!c!#a%e o##)$e 7)e%%a
&!c,!a$ata co"e #a$a"et$o #e$ %a #$oce&)$a 1C
E 7)a&o c! t$o5!a"o a%%O!te$o &e% 6%occo begin G end. &e% #$o4$a""a
#$!c!#a%e e tet!a"o &! a((e4a$e ) 5a%o$e a%%a 5a$!a6!%e S' 5!ee )(ata
7)e%%a &!c,!a$ata e%%a (e*!oe (ar &e% #$o4$a""a #$!c!#a%e o##)$e 7)e%%a
&!c,!a$ata co"e 5a$!a6!%e %oca%e e%%a #$oce&)$a 1C
La 5a$!a6!%e A )(ata co %O!(t$)*!oe write e%%a #$oce&)$a / !% ()o #a$a"et$o
o %a 5a$!a6!%e A &!c,!a$ata e%%a (e*!oe (ar &e% #$o4$a""a #$!c!#a%eC
La 5a$!a6!%e S )(ata co %9a((e4a"eto e%%a #$oce&)$a / %a ()a 5a$!a6!%e
%oca%e o' &! )o5o' 7)e%%a &e%%a (e*!oe (ar &e% #$o4$a""a #$!c!#a%eC
La 5a$!a6!%e A )(ata e% co$#o #$!c!#a%e &e% #$o4$a""a / 7)e%%a &!c,!a$ata
e%%a (e*!oe (ar &e% #$o4$a""a #$!c!#a%e o !% #a$a"et$o &e%%a #$oce&)$aC
E !+!e: %a 5a$!a6!%e S )(ata e% co$#o #$!c!#a%e &e% #$o4$a""a / 7)e%%a
&!c,!a$ata e%%a (e*!oe (ar &e% #$o4$a""a #$!c!#a%e o %a 5a$!a6!%e %oca%e
co %o (te((o o"e &!c,!a$ata e%%a #$oce&)$aC
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Le et!t> &!c,!a$ate a %!5e%%o &! (otto#$o4$a""a 2#a$a"et$! e 5a$!a6!%! %oca%!3 (oo 5!(!6!%!:
o t$a !% begin e l@end &! 7)e% (otto#$o4$a""aD #a$a"et$! e 5a$!a6!%! %oca%! o #o((oo 7)!&! e(()
"o&o e((e$e )t!%!**at! a%%Oe(te$o &e% (otto#$o4$a""a ! c)! (oo &!c,!a$at!D
o ! a%t$! (otto#$o4$a""! "a (o%o (e &!c,!a$at! a%%O!te$o &e% #$!"o 2e a #atto c,e 7)e(t! )%t!"! a
%o$o 5o%ta o )t!%!**!o #a$a"et$! o %o$o 5a$!a6!%! %oca%! co %o (te((o o"e3D
Le et!t> &!c,!a$ate a %!5e%%o &! (otto#$o4$a""a 2#a$a"et$! e 5a$!a6!%! %oca%!3 5e4oo c$eate e% "o"et! !
c)! !!*!a %Oe(ec)*!oe &e% (otto#$o4$a""a e 5e4oo &!(t$)tte e% "o"et! ! c)! %Oe(ec)*!oe &e%
(otto#$o4$a""a te$"!aD e &e$!5a c,e 7)a&o ) (otto#$o4$a""a 5!ee c,!a"ato #!< 5o%te ! 5a%o$! a(()t! !
#$ece&e*a &a%%e 5a$!a6!%! %oca%! o (oo #!< &!(#o!6!%!.
A##%!ca&o 7)e(te $e4o%e a%%Oe(e"#!o #$ece&ete: %a 5a$!a6!%e A &e% #$o4$a""a #)0 e((e$e )(ata e% co$#o #$!c!#a%e
"a o e%%a #$oce&)$a 2!% #a$a"et$o A %a o(c)$a3D (te((a (!t)a*!oe #e$ %a (t$!4a S &e% #$o4$a""a 2o #)0 e((e$e
)t!%!**ata e%%a #$oce&)$a #e$c,E o(c)$ata &a%%a 5a$!a6!%e %oca%e SD %a 5a$!a6!%e T #)0 e((e$e )t!%!**ata !5ece
&a##e$t)tto' e% #$o4$a""a e e%%a #$oce&)$a 2#$at!ca' 7)e(tO)%t!"a' &a (co(!4%!a$e3D !% #a$a"et$o A e %a 5a$!a6!%e
%oca%e S &e%%a #$oce&)$a #o((oo e((e$e )t!%!**at! (o%o ! 7)e(tO)%t!"a.
La %ette$at)$a !+o$"at!ca !&!ca ac,e co %a &!c!t)$a ambiente locale %9!(!e"e &e%%e et!t> &!c,!a$ate a%%O!te$o &!
)a (te((a et!t> (!tatt!ca 2#$o4$a""a' (otto#$o4$a""a3D a& e(e"#!o %Oa"6!ete %oca%e #e$ )a #$oce&)$a /
co(t!t)!to &a! ()o! #a$a"et$! e &a%%e ()e 5a$!a6!%! %oca%!. C!0 c,e / !5ece &!c,!a$ato a%%Oe(te$o &! )a ce$ta )!t>
(!tatt!ca 5!ee !5ece !&!cato co"e ambiente non locale. A& e(e"#!o' $!(#etto a& ) (otto#$o4$a""a %e 5a$!a6!%!
4%o6a%! +ao #a$te &e%%Oa"6!ete o %oca%e. Atte*!oe #e$0 a o +a$ co$$!(#o&e$e %Oa"6!ete o %oca%e co %e
5a$!a6!%! 4%o6a%!: (e co(!&e$!a"o !+att! !% ca(o &! ) (otto#$o4$a""a &!c,!a$ato a%%O!te$o &! ) a%t$o #e$
7)e(tO)%t!"o %Oa"6!ete o %oca%e / co(t!t)!to ce$ta"ete &e%%e 5a$!a6!%! 4%o6a%! "a ac,e &a%%e 5a$!a6!%! %oca%! a%%a
(otto#$o4$a""a c,e %o cot!ee:
#$o4$a" #$o5aD
5a$ K: $ea%D
#$oce&)$e 11D
5a$ 8: $ea%D
#$oce&)$e 12D
5a$ *: $ea%D
6e4!
e&D
6e4!
e&D
6e4! e&.
A)a&o %Oa##%!ca*!oe / !% $!()%tato &e%%a co"#!%a*!oe e %!J &! #!< (o$4et! %a (!t)a*!oe (! co"#%!ca: ! 4ee$a%e
6!(o4a &ec!&e$e co(a coce&e$e ! )t!%!**o &! ) ce$to (o$4ete 7)a&o (t!a"o (c$!5e&o !% co&!ce &! ) a%t$o. I
%!4)a44! (! &!++e$e*!ao #e$ #o((!6!%!t> e ota*!o! (!tatt!c,e ac,e "o%to &!5e$(e. D! (o%!to / co")7)e #o((!6!%e
!&!ca$e )9et!t> &!c,!a$ata e%%a (e*!oe (ar #$!c!#a%e co"e globale $!(#etto a4%! a%t$! +!%e (o$4et!D a& e(e"#!o'
&a$e %a #o((!6!%!t> &a% +!%e (o$4ete
B)!t19 &! )(a$e )a 5a$!a6!%e 4%o6a%e
&e%%a BU!t29 o &! $!c,!a"a$e )
(otto#$o4$a""a &! )a 7)a%(!a(! a%t$a
U!t. I a%c)! %!4)a44!' t)$6o
1a(ca% co"#$e(o' #e$ acce&e$e
a%%Oet!t> &! ) a%t$o +!%e (! &e5e
$e&e$e #a%e(e %a 5o%ot> &! )(a$e
7)e(tO)%t!"o co )a &!$ett!5a a%
co"#!%ato$e 2)(e( c$t o 5! &!ce
)%%aC3.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 11,
Dile %rinci%ale
U!t1
U!t2
U!t3 U!tN
.ETE
+!a%e
La #$oce&)$a 12 / &!c,!a$ata a%%O!te$o &! 11. I% (e(o &! c!0 (ta e% +atto c,e 12
(5o%4e ) co"#!to "o%to #a$t!co%a$e c,e a (e(o (o%o e%%Oa"6!to &! 11. D!c,!a$ata
! 7)e(to "o&o' (o%o 11 #)0 !5oca$e 12 e5!ta&o )(! "a%&e(t$!.
LOa"6!ete o %oca%e &! 12 / co(t!t)!to o (o%o &a%%a 5a$!a6!%e K &e% #$o4$a""a
#$!c!#a%e "a ac,e &a%%a 5a$!a6!%e 8 &e%%a #$oce&)$a 11.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
TIPO DI DATO ARRAN
:o4%!o #$e(eta$5! a%c)e (!t)a*!o! B#$o6%e"at!c,e9 #e$ e5!&e*!a$e %9!a&e4)ate**a &e4%! (t$)"et! &a
#$o4$a""ato$e c,e (oo att)a%"ete ! 5o(t$o #o((e((o.
Caso !i st+!io 1) a %ro%osito !i e!ie
A5ete +atto ca$$!e$a e 5! $!t$o5ate #$o+. I+o$"at!ca= A5ete ac,e a##ea te$"!ato &! co$$e44e$e !% #$!"o #acco &!
co"#!t! 2(!4,3 e 5o$$e(te cota$e 7)at! a%)! ,ao #$e(o ) 5oto ()#e$!o$e a%%a "e&!a &e%%a c%a((e: c,e !+o$"at!c!
(a$e(te (e o #e(a(te &! )t!%!**a$e ) #$o4$a""!o #e$ ca%co%a$e )a 5o%ta #e$ t)tte 7)e(to 5a%o$e C
!rogram medie'
(ar
i/ (oto: integer' (0 *i. ser(e per i cicli/ *(oto. per leggere da tastiera il (oto 0)
sommaE(oti/ numEalunni: integer' (0 numEalunni: numero degli alunni 0)
quantiEsopraEmedia: integer'
media: real'

begin
sommaE(oti::0' media::0' quantiEsopraEmedia::0'
writeln(*-uanti alunni ci sonoK *)'
readln(numEalu)'
for i::1 to numEalu do
begin
writeln(*+nserisci (oto prossimo alunno: *)'
readln((oto)'
sommaE(oti::sommaE(oti L (oto
end'
media::sommaE(oti /numEalu'
Do#o a5e$ !"#!e4ato (o%o #oc,! "!%%e(!"! &! (eco&o #e$ (c$!5e$e 7)e(to co&!ce' 5! acco$4ete &! G o (a#e$e
co"e a&a$e a5at!= I+att! o$a c,e a5ete ca%co%ato %a "e&!a &o5$e(te cota$e ! 5ot! c,e %a ()#e$ao' "a o a5ete
#!< ! 5ot! a &!(#o(!*!oe #e$ co+$ota$%! = I+att! %a 5a$!a6!%e (oto cote$$> (o%o %9)%t!"o 5oto %etto. I #$ece&et! (oo
(tat! (o""at! e%%a 5a$!a6!%e sommaE(oti e #o! (o#$a(c$!tt! c!a(c)o &a% ()cce((!5o 27)e(to o55!a"ete #e$c,E %a
readln )t!%!**a e% c!c%o (e"#$e %a (te((a 5a$!a6!%e #e$ %e44e$e ! 5ot!3.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 11-
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Ua #$!"a o$$!#!%ate (o%)*!oe 2(!c)$! &! e((e$5! %a)$eat! ! I+o$"at!caCC3 #ot$e66e e((e$e 7)e%%a &! c,!e&e$e
)a (eco&a 5o%ta a%%9o#e$ato$e 4%! (te((! 5ot! #e$ cota$e 7)e%%! (o#$a %a "e&!a
2(! !""a4!a &! cot!)a$e !% #$o4$a""a &! #$!"a3:
for i::1 to numEalu do
begin
writeln(*+nserisci (oto prossimo alunno: *)'
readln((oto)'
if (oto9media t1en
quantiEsopraEmedia:: quantiEsopraEmedia L 1
end'
Stiamo scherzando? A parte le furiose proteste dellutente che si vede costretto a ripetere
linserimento dei dati, provate a pensare al rischio di inserire dati diversi dai
precedenti con risultati del tutto falsati
ATTENZIONE: %a (eco&a B(o%)*!oe9 c,e 5!ee #$o#o(ta 7)! &! (e4)!to /' co"e !% #$!"o' (o%o ) e(e"#!o. Co"e
ta%e / NECESSARIO #e$ a##$e**a$e e ca#!$e %9)(o &e% )o5o (t$)"eto &! #$o4$a""a*!oe c,e #$e(ete$0' "a o
&e5e e((e$e B(t)&!ato9.
Seconda soluzione (lascio decidere a voi se pi o meno orripilante della precedente)
!"anale, come ho fatto a non pensarci prima "asta usare una varia"ile diversa per
ogni voto#
!rogram medie'
(ar
i/ sommaE(oti/ numEalunni/ quantiEsopraEmedia: integer'
media: real'
(oto1/ (oto2/ (oto"/ (oto$/ / (oto"2 (aiutoC): integer'

begin
somaE(oti::0' media::0' quantiEsopraEmedia::0'
writeln(*-uanti alunni ci sonoK *)'
readln(numEalu)'
I% 6e%%o a$$!5a a&e((o= 1o!c,E o (! (ta )(a&o )a (o%a 5a$!a6!%e 25oto3 #e$ %e44e$e ! 5ot!' o / #o((!6!%e )(a$e )
c!c%o #e$ %e44e$e ! 5ot!= E9 ece((a$!o %e44e$e !% #$!"o. 1o! (e !% )"e$o &! a%)! / "a44!o$e &! 1' (!4!+!ca c,e &e5o
(!c)$a"ete %e44e$e ac,e ) (eco&oD #o! (e !% )"e$o &! a%)! / ac,e "a44!o$e &! &)e (!4!+!ca c,e &e5o
%e44e$e a%"eo ac,e ) te$*o e co(; 5!a G
writeln(*+nserisci (oto primo alunno: *)'
rea!ln32oto15=
sommaE(oti:: sommaE(oti L (oto1
if numEalu91 t1en
begin
writeln(*+nserisci (oto secondo alunno: *)'
rea!ln32oto25=
sommaE(oti:: sommaE(oti L (oto2
end'
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 120
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
if numEalu92 t1en
begin
writeln(*+nserisci (oto prossimo alunno: *)'
rea!ln32oto35=
sommaE(oti:: sommaE(oti L (oto"
end'
e cos? via fno a \
if numEalu9"1 t1en
begin
writeln(*+nserisci (oto "2-mo alunno: *)'
rea!ln32oto325=
sommaE(oti:: sommaE(oti L (oto
end'
media::sommaE(oti / numEalu' (0 alleluia 0)
e ora 2 ripetiamo tutto per contare )uelli sopra la media
if (oto19media t1en
quantiEsopraEmedia:: quantiEsopraEmedia L 1'
if numEalu91 t1en
if (oto29media t1en
quantiEsopraEmedia:: quantiEsopraEmedia L 1'

ecc. ecc. (abbiate pietI C)
$on so voi, ma io ho gi% perso di vista lo"iettivo che ci eravamo posti Immaginate se
invece degli alunni di una sola classe considerassimo &uelli dellintero istituto per una
&ualche statistica#
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 121
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
ED ECCO LA SOLUZIONE G
A)e%%o c,e c! (e$5e / ) cote!to$e 2(! t$atte$> #o! #)$ (e"#$e &! )a 5a$!a6!%e' ac,e (e &! t!#o #a$t!co%a$e3 ca#ace
&! cotee$e o ) (o%o 5oto "a ) !(!e"e &! 5ot!. I% o"e &e% cote!to$e ! 7)e(to "o&o (a$e66e )o (o%o'
$!(o%5e&o %9!co5e!ete &e% #$o%!+e$a$e (e%5a44!o &e% )"e$o &e%%e 5a$!a6!%!D !o%t$e' co"e 5! (#!e4,e$0 t$a #oco'
(a$> aco$a #o((!6!%e )(a$e ! c!c%! #e$ e%a6o$a$e co #oc,e $!4,e &! co&!ce t)tt! ! &at!.
:OTI
7 4 5 6 6 8 8 5
5ot!V1W 5ot!V2W 5ot!V3W 5ot!V4W 5ot!V5W 5ot!V6W ecc.


I% o"e &e% cote!to$e / :OTI. A)e(to / !% o"e c,e !% #$o4$a""ato$e ,a &ec!(o &! &a$e a%%9%55%M.
A)a&o %9a$$a8 / co"e 7)e%%o e% &!(e4o (o#$a(tate 2%!ea$e' "oo&!"e(!oa%e3 / ac,e c,!a"ato
(ettore. E(!(too arraJ 6!&!"e(!oa%! 2#e(ate a& )a 4$!4%!a t!#o 6atta4%!a a5a%e' o a& )o (c,e"a t!#o
#a$o%e c$oc!ate3 c,!a"at! matrici.
I &at! o (oo &e#o(!tat! e% 5etto$e a%%a $!+)(a "a te)t! ! B(co"#a$t!9 (e#a$at!.
O4! B(co"#a$to9 occ)#a )a #$ec!(a #o(!*!oe 21' 2' 3' 4 ecc.3 (#ec!+!cata t$a"!te ) )"e$o &etto indice
c,e 5a !&!cato t$a #a$ete(! 7)a&$ate &o#o !% o"e &e%%9arraJ co"e ! 5ot!V1W' 5ot!V2W ecc.
Ecco co"e (! &!c,!a$a ! 1a(ca% )a 5a$!a6!%e arraJ a&atta a cotee$e 32 !te$!:
(ar (0 34T5. sarebbe meglio mettere una costante in(ece del "2:
(oti: arraJN1 .. "2O of integer' arraJN1 .. 76E%=7O of integer 0)
1e$ #ote$ #a((a$e 4%! arraJ a! (otto#$o4$a""! / #e$0 "e4%!o a6!t)a$(! +! &a ()6!to a &!c,!a$a$e #$!"a ) )o5o t!#o
&! &at! e (o%o &o#o %e 5a$!a6!%! &! 7)e% t!#o:
34T5 la sezione t1pe de(e essere scritta prima della sezione ,ar
t1pe
(etEint : arraJN1 .. "2O of integer' (0 (etEint sta per *(ettore di interi. 0)
,ar
(oti: (etEint'
OSSER:AZIONI
A)a&o (! &!c,!a$a ) t!#o o (! )(ao ! &)e #)t! "a %9)4)a%e 2G ( a$$a8 G 3
Ne%%a (e*!oe (ar / #o! #o((!6!%e &!c,!a$a$e t)tte %e 5a$!a6!%! &! 7)e% t!#o c,e (! 5o4%!oo: t)tte
co$$!(#o&e$ao a cote!to$! #e$ 32 !te$!
2oti / &! t!#o (etEint' c!o/ ) arraJN1 .. "2O of integer' e(atta"ete co"e #$!"a. Ac,e ) #a$a"et$o &! )
(otto#$o4$a""a #ot$> e((e$e &!c,!a$ato &! t!#o (etEint 2%a &!c!t)$a arraJN1 .."2O of integer o (a$e66e !+att!
accettata co"e t!#o &! ) #a$a"et$o3.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 122
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Ua 5o%ta (#ec!+!cata %a #o(!*!oe t$a #a$ete(! 7)a&$e %a (c$!tt)$a !&!ca e(atta"ete )a 5a$!a6!%e &e% t!#o cote)to
e% 5etto$e. Detto co a%t$e #a$o%e: (etNHO /' a t)tt! 4%! e++ett!' )a 5a$!a6!%e integer e #)0 e((e$e )(ata &o5e (!ete
a6!t)at! a& )(a$e )a 7)a%(!a(! a%t$a 5a$!a6!%e integer:
Priteln(*Qimmi un (alore e lo memorizzerR nella posizione $ del (ettore.)'
readln( (otiN$O )'
writeln(*3ra (isualizzo il contenuto del sesto elemento del (ettore: *)'
writeln( (otiNFO )'
if (etN2O98 t1en
repeat

until 89(etNSO'
8::F 0 (etN"O T 20(etNHO
writeln (@Qimmi una posizione e (isualizzerR il contenuto di quell.elemento: *)'
readln (posizione)'
writeln ( (otiNposizioneO )'
L9)%t!"o e(e"#!o / #a$t!co%a$"ete !te$e((ate: !5ece &! (#ec!+!ca$e ) )"e$o #$ec!(o' co"e !&!ce / #o((!6!%e
"ette$e )a 5a$!a6!%e integer. A)e(to &> a% #$o4$a""ato$e %a #o((!6!%!t> &! (ca&!$e' #a((a$e ! $a((e4a' #!<
e%e"et! &e% 5etto$e ca"6!a&o ! ) c!c%o !% 5a%o$e &e%%a 5a$!a6!%e !&!ce:
for i::1 to numE(oti do
writeln( (otiNiO )'
Ce$cate &! ca#!$e 6ee 7)e(to (#e**oe &! co&!ce: / a%%a 6a(e &! t)tte %e e%a6o$a*!o! co 4%! arraJ c,e 5! (a$ao
(#!e4ate ! 7)e(to co$(o=
La 5a$!a6!%e i' 4$a*!e a% c!c%o' a(()"e t)tte %e #o(!*!o! &e% 5etto$e e &! 5o%ta ! 5o%ta !&!5!&)a e% c!c%o e%e"et!
()cce((!5!' )o &o#o %9a%t$o &a% #$!"o a%%9)%t!"o. La #$!"a 5o%ta c,e 5!ee e(e4)!to !% c!c%o %a i 5a%e 1 e 7)!&! %a
writeln co$$!(#o&e a writeln((otiN1O) e 5!ee 7)!&! 5!()a%!**ato !% cote)to &e% #$!"o e%e"eto &e% 5etto$e. 1o! %a
i &!5eta 2' e 5!ee e%a6o$ato !% (eco&o e%e"eto e co(; 5!a +!o a%%9)%t!"o !&!cato e% c!c%o 2)"^5ot!3.
' arrivato il momento di mettere tutto insieme e risolvere elegantemente il pro"lema di
partenza
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 12'
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
!rogram medie'
const
6%#E%=7+:"2'
t1pe
(ettoreE"2Einteri : arraJN1 .. 6%#E%=7+O of integer'
,ar
(oti: (ettoreE"2Einteri'
i/ sommaE(oti/ numEalunni/ quantiEsopraEmedia: integer'
media: real'
be6in
sommaE(oti::0' media::0' quantiEsopraEmedia::0'
writeln(*-uanti alunni ci sonoK *)'
readln(numEalu)'
(0 )%5+)%64?3 Q4+ Q%?+ 4= 24??354 0)
for i::1 to numEalu do
begin
writeln(*+nserisci (oto prossimo alunno: *)'
readln((otiNiO)'
sommaE(oti::sommaE(oti L (otiNiO
end'
media::sommaE(oti / numEalu'
(0 + Q%?+ &33 %)35% 4= 24??354: )3?53==+%63 ?7??+ 0)
for i::1 to numEalu do
if (otiNiO9media t1en
quantiEsopraEmedia:: quantiEsopraEmedia L 1'
writeln(*5isultato: */quantiEsopraEmedia)'
end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 12)
OSSER:AZIONI
a) Se 4%! a%)! &!5eta((e$o ac,e 1LLLL !% co&!ce $!"a$$e66e !&et!co= Sa$e66e ()++!c!ete "o&!+!ca$e !%
5a%o$e &e%%a co(tate 6%#E%=7+
b) No / o66%!4ato$!o )(a$e t)tte %e #o(!*!o! &e% 5etto$e: a% "a((!"o ce e (oo &!(#o!6!%! 6%#E%=7+
"a !% 5a%o$e co")!cato a% co"#)te$ 2numEalu3 #ot$e66e ac,e e((e$e !+e$!o$e. A &!$e %a 5e$!t>' !%
#$o4$a""a &o5$e66e cot$o%%a$e c,e 7)e(to 5a%o$e (!a co"#$e(o t$a 1 e 6%#E%=7+ #e$c,E
tentare di usare un elemento prima dellHini1io del "ettore o dopo la %ine un #ra"issimo errore c4e
spesso porta al $locco del pro#ramma ed e"entualmente del computer stesso
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Ca(o &! (t)&!o 2: MENU
Att$a5e$(o 7)e(to e(e"#!o !"#a$e$ete a #a((a$e ! 5etto$! a! (otto#$o4$a""!.
U "e) #$e(eta ()%%o (c,e$"o ) e%eco &! o#*!o! &e%%e 7)a%! )a (o%a (a$> 7)e%%a (ce%ta &a%%9)tete. U "e)
#)0 #$e(eta$(! a t)tto (c,e$"o' co"e e%%9e(e"#!o 7)! (otto a (!!(t$a' o (otto +o$"a &! 6a$$a &e! "e)' co"e
e%%9e(e"#!o 7)! (otto a &e(t$a.
C,!)7)e a66!a #$o5ato a& )(a$e ) #$o4$a""a #e$ co"#)te$ (a c,e (oo 5e$a"ete tate %e (!t)a*!o! ! c)! /
ece((a$!o &!a%o4a$e co %9)tete #$e(eta&o ) "e) &! (ce%te.
L!"!ta&oc! a%%a t!#o%o4!a $a##$e(etata 7)! (o#$a a (!!(t$a' +o&a"eta%"ete %o (co#o &! ) "e) / (e"#$e %o
(te((o: (c$!5e$e ) t!to%o' (otto &! 7)e(to (c$!5e$e ) ce$to )"e$o &! (ce%te e %e44e$e %a $!(#o(ta &e%%9)tete.
S!t)a*!oe #e$+etta #e$ %a (c$!tt)$a &! ) (otto#$o4$a""a: co")!co t!to%o' o#*!o!' )"e$o &! 7)e(te )%t!"e e co"e
5a%o$e &! $!to$o c! (! a(#ette$> !% )"e$o &e%%a (ce%ta +atta. Nat)$a%"ete !% (otto#$o4$a""a #$o55e&e$> ac,e a
$!+!)ta$e (ce%te !"#o((!6!%! 25a%o$! "!o$! &! 1 o #!< 4$a&! &e% )"e$o &e%%e o#*!o! #$e5!(te3' a 5!()a%!**a$e
"e((a44! &! e$$o$e e a +a$ $!#ete$e %a (ce%ta +!o a c,e %9)tete o !&!c,e$> +o$*ata"ete )a &e%%e o#*!o! #$e5!(te:
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 125
Sce4%! !% 4!oco c,e #$e+e$!(c!
1. Te!(
2. 1oJe$
3. Scacc,!
4. ESCI
SCEHLI P[ ^
F!%e Mo&!+!ca
%pri
&al(a
4cc.
MENU
T!to%o
)"e$o &e%%a (ce%ta
+atta
o#*!oe 1
o#*!oe 2
o#*!oe 3
o#*!oe 4
. o#*!o!
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
La c,!a"ata a%%a +)*!oe menu c,e co$$!(#o&e a%%9e(e"#!o c)! c! (t!a"o $!+e$e&o (a$e66e a%%o$a:
scelta::menu(*&cegli il gioco c1e preferisci./$/.?ennis./.!oUer./.&cacc1i./.4&)+.)
U9a%t$a (!t)a*!oe t!#!ca / 7)e%%a ! c)!' (e4a%a&o ) e$$o$e' (! 5)o%e c,!e&e$e a%%9)tete co"e #$oce&e$e.
I""a4!!a"o c,e (! (!a 5e$!+!cato ) e$$o$e &! $e4!(t$a*!oe &! ) &oc)"eto:
scelta::menu(*4rrore di scrittura su disco./"/.5ipro(a./.+gnora./.annulla.)
Sc)(! #$o+.' "! (a c,e ,a &!"et!cato ) #a$a"et$o e% (eco&o e(e"#!o 2%o (t)&ete "e&!o +!4e c%a"o$o(a"ete &!
e((e$e &!(!te$e((ato a 7)e%%o c,e (c$!5!' "a #$o5a a (6a4%!a$e )a 5!$4o%a G3: &e5oo e((e$e (e! 2!% t!to%o' )"e$o
o#*!o! e %e 7)att$o (ce%te3.
E 4!>' "a (e %e (ce%te (oo (o%o 3 co"e e% (eco&o e(e"#!oC O (e e (e$5!((e$o 12CC L9)!ca (o%)*!oe o$a a%%a
5o(t$a #o$tata (a$e66e 7)e%%a &! #$e5e&e$e !% "a((!"o )"e$o #o((!6!%e &! (ce%te' !4o$a&o 7)e%%e c,e &! 5o%ta !
5o%ta o (e$5ooD %a &!c,!a$a*!oe &e%%9!te(ta*!oe &! 7)e(ta +)*!oe (a$e66e ) 5e$o B"o(t$o9 c,e #ot$e66e
a((o"!4%!a$e a%%a (e4)ete:
Gunction menu(titolo: string' numEopzioni: integer'
scelta1/scelta2/scelta"/scelta$//scelta: string): integer'
&o5e N $a##$e(eta !% "a((!"o )"e$o &! (ce%te )t!%!**a6!%eD (e %e o#*!o! +o((e$o &! #!< %a (!t)a*!oe o (a$e66e
4e(t!6!%e a "eo &! "o&!+!ca$e !% (otto#$o4$a""a.
C,!a"a$e 7)e(ta +)*!oe (a$e66e 5e$a"ete )a B#ea9. I""a4!!a"o !+att! &! 5o%e$ c,!e&e$e )a co+e$"a
a%%9)tete 2! 7)e(to ca(o %e o#*!o! (a$e66e$o (o%o &)e: (; o o3:
scelta::menu(*&ei sicuro./2/.&i./.o./../../../../../../....)
ac,e (e %e o#*!o! (oo (o%o &)e' TUTTI ! #a$a"et$! &e5oo co")7)e e((e$e (e"#$e !&!cat! 27)! (! !""a4!a c,e
7)e%%! !)t!%! (!ao !&!cat! co"e (t$!4a )%%a 2B93
Ac,e !% co&!ce &e%%a +)*!oe (a$e66e #!)tto(to #e(ate e& !t$!cato:
Gunction menu(titolo: string' numEopzioni: integer'
scelta1/scelta2/scelta"/scelta$//scelta: string): integer'
begin
writeln(titolo)' (0 e fino a qui 0)
e )ui imma6inate,i+ un po come nel caso della media+ tutta una serie di if 2 then che a seconda del
numero di op*ioni specificato ,anno o non ,anno a stampare la ,ariabile strin6a che corrisponde a
)uellop*ione& per semplicit' mi limito solo ad ini*iare 2
writeln(*1 T */scelta1)'
if numEopzioni91 t1en
writeln(*2 T */scelta2)'
if numEopzioni92 t1en
writeln(*" T */scelta")'
ecc.
ED ECCO LA SOLUZIONE CON HLI ARRAU G
La (o%)*!oe c,e (+$)tta 4%! arraJ #$e5e&e !5ece &! #a((a$e %e o#*!o! (otto +o$"a &! 5etto$e &! (t$!4,e:
tJpe (ettoreEstring1e : arraJN1 .. 20O of string'
Gunction menu(titolo: string' numEopzioni: integer' scelte ,ettore7strin6he): integer'
(ar i/scelta: integer'
begin
writeln(titolo)'
for +::1 to numEopzioni do
writeln(+/ * T */ scelteNiO)'
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 12*
Sta"#a t)tte %e o#*!o! #$ece&)te &a%%a I e &a ) t$att!o: 1
R o#*!oe1' 2 R o#*!oe 2 ecc.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
writeln(*&cegli -9 *)'
readln(scelta)'
menu::scelta
end'

OPERAZIONI TIPIC,E CON 5LI ARRAN
I t)tt! 4%! e(e"#! c,e (e4)oo (! !""a4!ao 5a%e$e %e (e4)et! &!c,!a$a*!o!:
const
6%#E4=464?+:100'
t1pe
(ettoreEinteri : arraJN1 .. 6%#E4=464?+O of integer'
,ar
(ettore: (ettoreEinteri' : integer' (0 A il numero di elementi da usare 0)

1. Ca$!ca"eto &! ) 5etto$e &! N e%e"et!' co N Z MAT^ELEMENTI
for i::1 to do
begin
writeln(*+nserire elemento n. */ i)
readln( (ettoreNiO )
end'
:e&!a"o %a (te((a o#e$a*!oe +atta co ) (otto#$o4$a""a. 1o!c,E o !te&!a"o a55ata44!a$c! &! ) 5a%o$e
$e(t!t)!to &a )a +)*!oe' )(e$e"o )a procedura.
E((a $!ce5e$> !% 5etto$e &a ca$!ca$e #e$ !&!$!**o: &!5e$(a"ete o #ot$e""o "o&!+!ca$e ! "o&o #e$"aete !
5a%o$! &e4%! e%e"et! &e% 5etto$e #a((ato a%%a #$oce&)$a. I% (eco&o #a$a"et$o co$$!(#o&e a% )"e$o &! e%e"et! &a
ca$!ca$e 2c,! )(a %a #$oce&)$a &e5e a((!c)$a$(! &! o #a((a$e co"e )"e$o &! e%e"et! ) 5a%o$e ()#e$!o$e a%%a
ca#ac!t> "a((!"a &e% 5etto$e3.
procedure caricaE(ettore(2%5 (et: (ettoreEinteri' : integer)'
(ar i: integer'
begin
for i::1 to do
begin
writeln(*+nserire elemento n. */ i)
readln( (etNiO )
end'
end'
NOTA
A)a%c)o #ot$e66e o6!etta$e c,e %a #$oce&)$a $!()%ta co(t!t)!ta &a ) )"e$o &! $!4,e &! co&!ce ()#e$!o$e $!(#etto
a%%a (o%)*!oe c,e o )(a ! (otto#$o4$a""!. R!co$&!a"oc! #e$0 c,e %a #$oce&)$a #ot$> e((e$e c,!a"ata t)tte %e 5o%te
c,e (! 5)o%e #e$ ca$!ca$e 5etto$! &e%%o (te((o t!#o 2ANCHE ! #$o4$a""! &!5e$(!: 6a(ta co#!a$%a-!co%%a$%a o&
!c%)&e$%a ! )a %!6$e$!a3. A)a%c,e 5o%ta (! t$atte$> &! 5ot!' a%t$e 5o%te &! te"#e$at)$e' #e(! o& a%te**e ecc. La
#$oce&)$a o coo(ce !% (!4!+!cato &e4%! !te$! c,e (ta ca$!ca&o: (5o%4e ! "o&o ao!"o !% ()o co"#!to: $!e"#!$e
&! !te$! ) 5etto$e c,e $!ce5e co"e #a$a"et$o' #)to.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 12+
1e$ (e"#%!c!t> o / (tato cot$o%%ato %9!#)t &e%%9)tete
2c,e #ot$e66e e((e$e Z1 o [)"^o#*!o!3
NOTA: ca$!ca$e ) 5etto$e &!
(t$!4,e' #!)tto(to c,e &! $ea%!
co"#o$te$e66e (o%o %a "o&!+!ca
&e%%e &!c,!a$a*!o! e%%a (e*!oe
t8#e.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
S)44e$!"eto: #$o5a a $e&e$e aco$a #!< 4ee$a%e %a #$oce&)$a #$e5e&e&o ) te$*o #a$a"et$o co$$!(#o&ete a&
) "e((a44!o #e$(oa%!**ato c,e (o%%ec!t! %9)tete ! "o&o a##$o#$!ato. I 7)e(to "o&o !5ece &e% 4ee$!co BI(e$!$e
e%e"eto .9' #ot$ao e((e$e )(at! "e((a44! t!#o BI(e$!$e %a te"#e$at)$a .9' o BI(e$!$e !% #e(o &e%%9o44etto .9 ecc.
2. :!()a%!**a*!oe &e4%! e%e"et! &! ) 5etto$e &! N e%e"et!' co N Z MAT^ELEMENTI
for i::1 to do
writeln( (ettoreNiO )'
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 12,
Procedura #e$ 5!()a%!**a$e 4%! e%e"et! &! ) 5etto$e. R!ce5e !% 5etto$e 2#e$
5a%o$e' 5!(to c,e o &o66!a"o "o&!+!ca$e ! a%c) "o&o !% ()o cote)to=3
e& !% )"e$o &! e%e"et! &a co(!&e$a$e.
NOTA: c,! )(a %a #$oce&)$a &e5e a((!c)$a$(! &! o #a((a$e co"e )"e$o &!
e%e"et! ) 5a%o$e ()#e$!o$e a%%a ca#ac!t> "a((!"a &e% 5etto$e.
procedure (isualizzaE(ettore((et: (ettoreEinteri' : integer)'
(ar i: integer'
begin
for i::1 to do
writeln( (etNiO )
end'
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
3. So""a &e! 5a%o$! &e4%! e%e"et! &! ) 5etto$e &! N e%e"et!' co N Z MAT^ELEMENTI
somma::0'
for i::1 to do
somma::somma L (ettoreNiO '
4. Me&!a &e4%! e%e"et! &! ) 5etto$e &! N e%e"et!' co N Z MAT^ELEMENTI
NOTA: 7)e(to e(e"#!o / #a$t!co%a$"ete !te$e((ate (e )t!%!**!a"o ! (otto#$o4$a""!. I+att! %a +)*!oe c,e
ca%co%a %a "e&!a #)0 $!c,!a"a$e 7)e%%a' 4!> (c$!tta' c,e ca%co%a %a (o""a=
somma::0'
for i::1 to do
somma::somma L (ettoreNiO '
media:: somma / '
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 12-
Dun1ione #e$ %a (te((a o#e$a*!oe.
function sommaE(ettore((et: (ettoreEinteri' : integer):integer'
(ar tot: integer'
begin
tot::0'
for i::1 to do
tot::tot L (ettoreNiO '
sommaE(ettore::tot
end'
Dun1ione #e$ %a (te((a o#e$a*!oe.
function mediaE(ettore((et: (ettoreEinteri' : integer):integer'
begin
mediaE(ettore:: sommaE(ettore((et/) di(
end'
NOTA: ) (otto#$o4$a""a #)0 #a((a$e a& ) a%t$o ! ()o! (te((! #a$a"et$!'
co %e (te((e "o&a%!t> 5!(te (!o a& o$a 2#e$ 5a%o$e o #e$ !&!$!**o3.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
5. 1o(!*!oe &e%%9e%e"eto co 5a%o$e "!!"o ! ) 5etto$e &! N e%e"et!' co N Z MAT^ELEMENTI
L9a%4o$!t"o / 6a(ato () 7)e(to $a4!oa"eto: a%%9!!*!o !#ot!**o c,e !% "!!"o (!a %9e%e"eto c,e (! t$o5a !
#o(!*!oe 1. A)!&! cot$o%%o t)tt! 4%! a%t$! e%e"et!' &a% (eco&o ! #o!' e t)tte %e 5o%te c,e t$o5o )a #o(!*!oe co
) 5a%o$e #!< #!cco%o &!5eta 7)e(t9)%t!"a %a )o5a #o(!*!oe &e% "!!"o.
posizioneEmin:: 1'
for i::2 to do
if (ettoreNiO ; (ettoreNposizioneEminO t1en (0 tro(ata posizione i con (alore piV piccolo 0)
posizioneEmin :: i'
Dun1ione #e$ %a (te((a o#e$a*!oe.
function posizioneEmin((et: (ettoreEinteri' : integer):integer'
(ar posEmin:integer'
begin
posEmin:: 1'
for i::2 to do
if (etNiO ; (etNposEminO t1en (0 tro(ata posizione i con (alore piV piccolo 0)
posEmin :: i'
posizioneEmin :: posEmin
end'
NOTA: (e e% 5etto$e c! (oo #!< e%e"et! "!!"! co %o (te((o 5a%o$e' 5!ee !&!5!&)ato !% #$!"o 27)e%%o co !&!ce
"!o$e3. I+att! 7)a&o 5!ee co+$otato !% #$!"o "!!"o co 4%! a%t$! %a co&!*!oe (etNiO ; (etNposEminO o /
5e$!+!cata e %9a44!o$a"eto &e%%a #o(!*!oe o 5!ee e++ett)ata. A44!)4e&o %9)4)a4%!a*a a% co+$oto 2(etNiO
;P (etNposEminO3 5e$$e66e !5ece %oca%!**ato %9)%t!"o "!!"o 27)e%%o co !&!ce ()#e$!o$e3.
6. 1o(!*!oe &e%%9e%e"eto co 5a%o$e "a((!"o ! ) 5etto$e &! N e%e"et!' co N Z MAT^ELEMENTI
E9 ()++!c!ete ca"6!a$e a% #)to #$ece&ete posizioneEmin co posizioneEma8' Z co [ e posEmin co posEma8 #e$
ottee$e %9a%4o$!t"o &e(!&e$ato.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1'0
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
7. R!ce$ca &e%%a #o(!*!oe &! ) 5a%o$e ! ) 5etto$e &! N e%e"et!' co N Z MAT^ELEMENTI
writeln(*-uale elemento cerc1iK *)'
readln(cercato)'
posizione::0'
for i::1 to do
if (ettoreNiO : cercato t1en
posizione::i'
function cercaE(ettore((et: (ettoreEinteri' : integer' cercato: integer):integer'
(ar posizione: integer'
begin
posizione::0'
for i::1 to do
if (etNiO : cercato t1en
posizione::i'
cercaE(ettore::posizione
end'
E& ecco %a (o%)*!oe co !% repeat' e% ca(o (! 5o4%!a !% #$!"o e%e"eto )4)a%e a 7)e%%o c,e (! (ta ce$ca&o. A)e(ta
(o%)*!oe #)0 e((e$e ac,e "o%to #!< e++!c!ete &! 7)e%%a co !% for. A& e(e"#!o (e 4%! e%e"et! &e% 5etto$e +o((e$o
&!ec!"!%a e 7)e%%o c,e (! (ta ce$ca&o +o((e e%%a 7)a$ta #o(!*!oe' !% c!c%o for a&$e66e !)t!%"ete a cot$o%%a$e 4%!
a%t$! NNN6' "et$e !% c!c%o repeat (! +e$"e$e66e a% 7)a$to=
posizione::0' i::0'
repeat
i::iL1'
if (ettoreNiO : cercato t1en
posizione::i
until (i:) or (posizione;90)'
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1'1
OSSER:AZIONI
Se %9e%e"eto o 5!ee t$o5ato %a 5a$!a6!%e #o(!*!oe $!"a$$>
L. E9 !"#o$tate cot$o%%a$%a #$!"a &! )(a$%a= A& e(e"#!o: if
posizione90 t1en (0 elemento tro(ato/ possiamo procedere
0)
Se e% 5etto$e %9e%e"eto ce$cato a##a$e #!< 5o%te' !% c!c%o for
%oca%!**a %9)%t!"o 2co")7)e %a (ca(!oe a$$!5a a& N3D #e$
%oca%!**a$e !% #$!"o / ece((a$!o cot$o%%a$e B"a)a%"ete9 %a
$!ce$ca )(a&o ) c!c%o repeat 2co"e "o(t$ato #!< a5at!3
function cercaE(ettore((et: (ettoreEinteri' : integer' cercato: integer):integer'
(ar posizione/i: integer'
begin
posizione::0' i::0'
repeat
i::iL1'
if (ettoreNiO : cercato t1en
posizione::i
until (i:) or (posizione;90)'
cercaE(ettore::posizione
end'
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
7. O$&!a"eto &e! 5a%o$! ! ) 5etto$e &! N e%e"et!' co N Z MAT^ELEMENTI
METODO 1ER SCAMBIO R BUBBLE SORT
A)e%%o c,e (to #e$ #$e(eta$e / ) "eto&o o "o%to e++!c!ete 7)a&o !% )"e$o &e4%! e%e"et! ()#e$a !% cet!a!o'
"a ,a !% #$e4!o &! e((e$e 6$e5e' $e%at!5a"ete (e"#%!ce e& a66a(ta*a +ac!%e &a $!co$&a$e. A##a$t!ee a%%a +a"!4%!a
&e4%! a%4o$!t"! &! o$&!a"eto 2SORT3 &ett! #e$ (ca"6!o #e$c,E a&otta )a (ca(!oe (!(te"at!ca c,e co+$ota
Bc!eca"ete9 t)tt! 4%! e%e"et! e (ca"6!a 7)e%%! +)o$! #o(to t$a %o$o. Lo (ca"6!o &! e%e"et! / )(ato ! "o&o #e(ate:
a%t$! a%4o$!t"! a&ottao tec!c,e c,e B$a4!oao9 &! #!< ()%%a (!t)a*!oe &e% 5etto$e o& a&ottao tec!c,e #!<
!te%%!4et! 2$!#a4ate (o%o (e !% )"e$o &e4%! e%e"et! / ()++!c!ete"ete e%e5ato3 &!"!)e&o !% )"e$o &! (ca"6!
ece((a$!. O55!a"ete 7)e(t! a%4o$!t"! (oo #!< &!++!c!%! G
1$!"a &! e(a"!a$e !% co&!ce 1a(ca% co5!ee #$e(eta$e %9a%4o$!t"o ! "o&o B!+o$"a%e9 a!)ta&o(! ac,e co )a
(!")%a*!oe 4$a+!ca. Co"e #)to &! #a$te*a co(!&e$!a"o !% (e4)ete 5etto$e &!(o$&!ato:
N 8 2 6 3
L9a%4o$!t"o #$oce&e ! 7)e(to "o&o:
1. co+$ota %a #$!"a #o(!*!oe co %a (eco&a: (e !% )"e$o cote)to e%%a #$!"a #o(!*!oe / "a44!o$e &! 7)e%%o
e%%a (eco&a (ca"6!a ! )"e$!:
NOTA: teete &9occ,!o !% )"e$o ND co"e )a 6o%%a &9a$!a e%%9ac7)a $!(a%!$> 5e$(o %a B()#e$+!c!e9 2 %a #a$te +!a%e
&e% 5etto$e3' &a c)! !% o"e &e%%9a%4o$!t"o 26)66%eP6o%%a (o$tPo$&!a"eto3
2. (#o(tat! &! )a #o(!*!oe 5e$(o &e(t$a e $!#et! !% co+$oto-(ca"6!o
3. $!#et! !% #)to 2 +!o a $a44!)4e$e %a #e)%t!"a #o(!*!oe 2c,e 5e$$> co+$otata co %9)%t!"a3
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1'2
2 3 6 8 N
o$&!a"eto
N 8 2 6 3 N 8 2 6 3
co+$oto
(ca"6!o
8 N 2 6 3
$!()%tato
8 N 2 6 3 8 N 2 6 3 8 2 N 6 3
8 2 N 6 3 8 2 N 6 3 8 2 6 N 3
8 2 6 N 3 8 2 6 N 3 8 2 6 3 N
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Do#o 7)e(to #$!"o B4!$o9 2#a((ata3 %9e%e"eto #!< 4$a&e &e% 5etto$e 2!% N3 ,a $a44!)to %a ()a 4!)(ta #o(!*!oe. O$a
(! $!#ete !% t)tto +e$"a&oc! #e$0 a%%a #e)%t!"a #o(!*!oe 2%9)%t!"a' co"e &etto #$!"a' / 4!> o$&!ata e 5a %a(c!ata
(ta$e=3. 1e$ $!co$&a$ce%o' (+)"!a"o ! 4$!4!o %9)%t!"a ca(e%%a &e% 5etto$e.
O$a $!#et!a"o "a +e$"a&oc! a%%a te$*)%t!"a #o(!*!oe 2%e )%t!"e &)e (oo ! o$&!e3

e(()o (ca"6!o
NOTA: !% 5etto$e (a$e66e 4!> ! o$&!e' "a %9a%4o$!t"o Bo (e e acco$4e9 e' c!eca"ete' cot!)a ! co+$ot!:
Ne(()o (ca"6!o
E& ecco %a co&!+!ca ! #a(ca%:
(0 per n T 1 (olte 0)
for i::1 to n - 1 do

(0 parti dalla prima posizione e confronta
tutte le coppie fino alla n T i 0)
for W :: 1 to n - i do
(0 se tro(i due celle adiacenti non
in ordine/ scambiale 0)
if (ettoreNWO 9 (ettoreNWL1O t1en
begin
tmp::(ettoreNWO'
(ettoreNWO::(ettoreNWL1O'
(ettoreNWL1O::tmp
end'
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1''
2 6 3 8 N
8 2 6 3 N 8 2 6 3 N
2 8 6 3 N
2 8 6 3 N
2 8 6 3 N
2 6 8 3 N
2 6 8 3 N 2 6 8 3 N
2 6 3 8 N
2 6 3 8 N
2 6 3 8 N
2 6 3 8 N
2 3 6 8 N
2 3 6 8 N
2 3 6 8 N
2 3 6 8 N
procedure bubbleEsort(2%5 (et: (ettoreEinteri' n: integer)'
(ar i/W: integer'
begin
for i::1 to n - 1 do
for W :: 1 to n - i do
if (etNWO 9 (etNWL1O t1en
begin
tmp::(etNWO'
(etNWO::(etNWL1O'
(etNWL1O::tmp
end
end'
%9a%4o$!t"o (! +e$"a 7)a&o ,a $!#et)to !% #$oce((o M1 5o%te
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1')
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
7. O$&!a"eto &e! 5a%o$! ! ) 5etto$e &! N e%e"et!' co N Z MAT^ELEMENTI
METODO 1ER SELEZIONE R 1ER RICERCA DEL MINIMO
A)e(to a%4o$!t"o a##a$t!ee a%%a cate4o$!a c,!a"ata B#e$ (e%e*!oe9 #e$c,E !5ece &! (ca"6!a$e ! cot!)a*!oe
ce%%e a&!acet! t$a %o$o' ce$ca !% "!4%!o$ )"e$o &a (#o(ta$e' $!&)ce&o &! "o%to !% )"e$o &e4%! (ca"6!. I &etta4%!o:
1. 1a$te&o &a%%a #$!"a #o(!*!oe' %oca%!**a %a ce%%a co 5a%o$e "!!"oD #$e&! !% "!!"o e "ett!%o ! #$!"a
#o(!*!oeD !% )"e$o ! #$!"a #o(!*!oe "ett!%o e%%a ce%%a ! c)! ,a! t$o5ato !% "!!"o:
ce$ca !% "!!"o (ca"6!o $!()%tato
N 8 2 6 3
2. S#o(tat! ! a5at! &! )a ca(e%%a e& !4o$a %a #$!"a 24!> ! o$&!e3: ce$ca !% "!!"o e%%a #a$te &e% 5etto$e
Ba5a*ata9D "ett!%o ! (eco&a #o(!*!oeD !% )"e$o ! (eco&a #o(!*!oe "ett!%o e%%a ce%%a ! c)! ,a! t$o5ato !%
"!!"o. R!#et! !% #$oce&!"eto +!o a%%a #e)%t!"a #o(!*!oe 2a 7)e% #)to !% )"e$o ! )%t!"a #o(!*!oe / #e$
+o$*a ! o$&!e.
E& o$a !% co&!ce #a(ca%:
for i::1 to n-1 do
begin
posEmin::i'

(0 cerco la posizione del minimo
tra i e ultimo elemento 0)
for W::iL1 to n do
if (etNWO ; (etNposEminO t1en
posEmin::W'

(0 scambio con il minimo 0)
tmp :: (etNiO '
(etNiO :: (etNposEminO'
(etNposEminO::tmp
end'
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1'5
N 8 2 6 3 2 8 N 6 3
2 8 N 6 3
2 8 N 6 3
2 3 N 6 8
2 3 N 6 8 2 3 N 6 8
2 3 6 N 8
2 3 6 N 8
2 3 6 N 8
2 3 6 8 N
procedure selezioneEsort(2%5 (et: (ettoreEinteri' n: integer)'
(ar i/W: integer'
begin
for i::1 to n-1 do
begin
posEmin::i'

for W::iL1 to n do
if (etNWO ; (etNposEminO t1en
posEmin::W'

tmp :: (etNiO '
(etNiO :: (etNposEminO'
(etNposEminO::tmp
end
end'
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
IN'A&DSPI&NE (..-S:& DEI AEC&AD
0 dati di un vettore o di una matrice devono essere tutti uguali: o tutti integer, o tutti real o string ecc.
9uesto limite porta a notevoli complicazioni anche per situazione semplici. 0mmaginiamo infatti di
voler rappresentare la seguente scheda:
(ersona
3ognome
:ome
;ta
Fine)(ersona
'sando gli arra- sono possibili due soluzioni:
G. 3re vettori in parallelo: uno per i cognomi, uno per i
nomi ed uno per le et#
T. 'na matrice (di stringhe a due colonne (la prima
per il cognome e la seconda per il nome ed un
vettore per le et.
5estire vettori o matrici e vettori in parallelo non 8 molto agevole \ )er fortuna molti linguaggi di
programmazione consentono al programmatore di defnire nuovi tipi di dato, strutturati come meglio si
crede, e di dichiarare poi variabili di "uel tipo. 'no di "uesti tipi di dato 8 il recor!.
2ediamo l%esempio della scheda anagrafca visto poc%anzi:
program )rova&ecord#
';%e SnaTPersona
'Persona > recor!
Cognoe) string=
Noe) string=
Eta) integer
En!=
\
Qar
SnaTPersona) 'Persona=
0l nuovo tipo si chiama 0ersona (la 3, per nulla obbligatoria, aiuta comun"ue a ricordare che si tratta
di un =3%ipo. 0 nuovi tipi devono essere defniti in una sezione specifca, dopo le costanti: la sezione
t1pe. )otete naturalmente defnire anche pi< di un tipo. 0l tipo 0ersona contiene tre valori (chiamati
campi del record: cognome, nome ed eta (con i nomi delle variabili 8 sempre meglio evitare gli
accenti\.
7on 8 possibile lavorare direttamente con i tipi (non potete ad esempio scrivere integer:YJ A ma 8
necessario dichiarare variabili di quel tipo. 7ella sezione var trovate "uindi la variabile Una<ersona di
tipo 0ersona.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1'*
Ro((! :e$&! B!ac,!
Ma$!o H!o5a! Sa&$a
21 34 15
%olu*ione con tre ,ettori
Ro((! :e$&! B!ac,!
Ma$!o H!o5a! Sa&$a
21 34 15
%olu*ione con una matrice ed un ,ettore
)ognome
ome
4ta
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
9ui sopra potete vedere, a fanco della defnizione del nuovo tipo, una rappresentazione grafca del
record: l%intero rettangolo esterno 8 il record# all%interno i componenti. 6a come si =riempiono% di dati le
caselle tratteggiateD
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1'+
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
,cco il comando per memorizzare la stringa =9ossi= nel campo cognome:
SnaTPersona . cognoe )> -A&::I-=
LSINDI: si inizia con il nome della variabile record ('na`)ersona,
si mette un punto, e si indica il campo da usare (cognome.
!imilmente si potrebbe procedere con il nome e l%et.
0 campi di un record sono a tutti gli e/etti variabili come "uelle che gi conoscete. ,% "uindi possibile
scrivere:

rea!ln3SnaTPersona.noe5= 3M lett+ra !a tastiera M5

0riteln3,.a %ersona si c/iaa) ,7 SnaTPersona.Cognoe7 - 1 ,7 SnaTPersona.noe5=

i$ SnaTPersona.cognoe>-Aossi- t/en
7>3A: dimenticarsi il nome della variabile record (a meno di utilizzo del with, spiegato pi< avanti 8 un
grave errore:
cognoe)>-rossi- DI LS(.E PEA:&N( ??? ci %otre""ero essere tante
2aria"ili !i ti%o
'Persona
Il costr+tto *ith
0mmaginiamo di avere una variabile record con il nome piuttosto lungo e con molti campi all%interno. ,%
scomodo riscrivere il nome della variabile tutte le volte che si vuole usare un suo campo# se poi "uesti
ultimi sono molti 8 ancora pi< scomodo. 0l )ascal mette a disposizione un costrutto (with, cio8 con \
che consente di scrivere una volta sola il nome della variabile record fnch8 non si ha fnito di usare i
suoi campi:
0it/ SnaTPersona !o
"egin
rea!ln3cognoe5=
rea!ln3noe5=
rea!ln3eta5
en!=
Qettori !i recor!
'na famiglia 8 fatta di pi< persone: SnaTDaiglia) arra;U1..3V o$ 'Persona=
,cco come dare un valore al primo record del vettore:
SnaTDaigliaU1V.cognoe)>-Ciorgio-=
SnaTDaigliaU1V.eta)>-(l"eng/i-=
SnaTDaigliaU1V.eta)>43=
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1',
T$a !% begin e l.end &e% co(t$)tto wit1 !5ece &! (c$!5e$e:
Rea&%2UnaIPersona'co4o"e:*
/ ()++!c!ete (c$!5e$e:
Rea&%2co#nome3D
Atte*!oe= I% (e4)ete / ) e$$o$e #!)tto(to co")e:
UnaIDami#lia'etaO<P/(9<
Sa$e66e !% +!e%& eta a& e((e$e co(!&e$ato ) 5etto$e=
)ognome
ome
4ta
A&::I
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
9uindi una`famiglia 8 prima di tutto un vettore: dopo il suo nome 8 necessario indicare "uale elemento
si intende usare (una`famigliagGe. )oi, essendo ogni elemento del vettore un record si continua con la
sintassi di "uesti ultimi (un punto ed il nome del campo da usare.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1'-
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
,cco un esempio interessante sul come usare il costrutto with con i vettori di record. !i tratta di un
ciclo di caricamento del vettore della famiglia:
Dor i)>1 to n+Tco%onenti !o
Eit/ SnaTDaigliaUiV !o 3M con l-iKo co%onente $ai M5
"egin
Aea!ln3cognoe5=
Aea!ln3noe5=
Aea!ln3eta5
en!
Aecor! !i recor!
'n feld di un record pu@ tran"uillamente essere a sua volta un record: defniamo prima un record per
le date e poi un record per i compleanni (che conterranno il record della data:
3-pe
3DataYrecord (S un record normale S
5g,mm,aa: integer#
,nd#
3(ompleannoYrecord
Data: 3Data# (S il record Data 8 contenuto nel record 3(ompleanno S
7ominativo: string#
,nd#
2ar
6io(ompleanno: 3(ompleanno#
accesso ai co%onenti sen#a 0it/ accesso ai co%onenti con 0it/
6io(ompleanno.Data.gg :Y JL#
6io(ompleanno.Data.mm :Y GL#
6io(ompleanno.Data.aa :Y GHKJ#
6io(ompleanno.7ominativo:Y =$abrizio
(amuso%#

with 6io(ompleanno do
begin
with Data do
begin
gg:YJL# mm:YGL# aa:YGHKJ
end
7ominativo:Y%$abrizio (amuso%
end#
Attenzione. !arebbe un errore:
with 6io(ompleanno do
begin
gg:YJL# mm:YGL# aa:YGHKJ#
end
perch8 gg, mm ed aa non sono direttamente campi
di 6io(ompleanno ma del record Data in esso
contenuto
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1)0
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
,!,6)0> : scrivere un programma per la gestione di una biblioteca che preveda la ricerca dei dati di un
libro per autore, o per titolo o per editore
program libri#
uses crt#
const
6Af`L0Q&0YPL#
t-pe
'.i"ro>recor!
co!ice) integer=
a+tore7titolo7e!itore) string=
en!=
var
"i"lioteca) arra; U1..G(WT.IBAIV o$ '.i"ro=
numero`libri,cont,scelta: integer# da`cercare: string#
begin
numero`libri:YL#cont:YL#scelta:YL#da`cercare:Y;;#
clrscr#

repeat
write(;9uanti sono i libri (ma+. ;,6Af`L0Q&0,; D ;#
readln(numero`libri#
if (numero`libri^G or (numero`libri_6Af`L0Q&0 then
writeln(;2alore non accettabile, riprova ...;
until (numero`libri_L and (numero`libri^Y6Af`L0Q&0#
(S carico i dati nel vettore di record S
for cont:YG to numero`libri do
0it/ "i"liotecaUcontV !o
"egin
0rite38Inserire il titolo !el li"ro n. 87cont78 ) 85=
rea!ln3titolo5=
0rite38Inserire l88a+tore !el li"ro 87titolo78 ) 8 5=
rea!ln3a+tore5=
0rite38Inserire l88e!itore !el li"ro 87titolo78 ) 8 5=
rea!ln3e!itore5=
0rite38Inserire il co!ice !el li"ro 87titolo78 ) 8 5=
rea!ln3co!ice5=
en!=

Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1)1
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
repeat
clrscr#
writeln(;&0(,&(A (>D0(0 L0Q&0 ),& ...;#
writeln(;G M &icerca per autore;#
writeln(;T M &icerca per titolo;#
writeln(;J M &icerca per editore;#
writeln(;U M $ine operazioni;#
writeln#
repeat
write(;!cegli un opzione: ;#
readln(scelta#

if (scelta^G or (scelta_U then
writeln(;!celta non corretta;#
until (scelta_L and (scelta^P#

if scelta^_U then
begin
case scelta of
G: write(;0nserire l;;autore interessato: ;#
T: write(;0nserire il titolo interessato: ;#
J: write(;0nserire l;;editore interessato: ;#
end#
readln(da`cercare#

for cont:YG to numero`libri do
0it/ "i"liotecaUcontV !o
"egin
case scelta o$
1) i$ !aTcercare>a+tore t/en 0riteln3co!ice5=
2) i$ !aTcercare>titolo t/en 0riteln3co!ice5=
3) i$ !aTcercare>e!itore t/en 0riteln3co!ice5=
en!=
if (da`cercareYautore or (da`cercareYtitolo or
(da`cercareYeditore then
begin
writeln(;)remere 0720> per continuare ...;#
readln
end
end
end
until sceltaYU
end.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1)2
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
I DI.E 1 CE:'I&NE 'A(DIPI&N(.E 3non DBG:5
0l 4le (archivio 8 una collezione di dati registrati su un supporto di massa (.opp- dis1, hard dis1, (D,
D2D, nastro ecc.. Da un punto di vista fsico tutti i fle sono memorizzati come una se"uenza di b-te: 8
il modo con cui "uesti ultimi sono interpretati che fa la di/erenza. Ad esempio, i GLLL b-te che
costituiscono un certo fle potrebbero essere intesi come dieci schede (recor! da GLL b-te con le
informazioni di un cliente della ditta. , di ciascun record i primi GL b-te potrebbero rappresentare il
codice del cliente, i successivi JL il nominativo ecc. (i cosiddetti =4el!s%, campi. 6a, in un contesto
completamente diverso GLLL b-te potrebbero rappresentare la codifca binaria di un%immagine o di un
suono.
!ui supporti, i b-te sono di solito trattati a blocchi (cio8 non viene mai letto4scritto un solo b-te alla
volta secondo una tecnica di suddivisione dello spazio a disposizione che dipende dal supporto (su un
.opp- dis1 tracce concentriche suddivise in =spicchi% ad individuare settori, su un (D un%unica traccia a
spirale, sul nastro bande magnetiche perpendicolari o elicoidali ecc.. Le letture4scritture avvengono in
aree di transito in &A6 chiamate "+Xer3s5. 9uando si leggono dati da un dispositivo, uno o pi< blocchi
vengono memorizzati nel bu/er di lettura e da l? prelevati man mano che l;applicazione ne fa richiesta
(in modo da non e/ettuare inutili letture fsiche dei supporti, in "uanto probabilmente a pi< richieste di
lettura di dati da parte dell;applicazione corrisponder una sola lettura di dati dal disco al bu/er.
!imilmente i dati da registrare su fle sono prima accumulati in un bu/er di scrittura fno al
riempimento di "uest;ultimo e solo al raggiungimento di "uesta situazione vengono fsicamente scritti
sul disco (evitando in "uesto modo che ad ogni richiesta di scrittura da parte dell;applicazione avvenga
una dispendiosa scrittura fsica sul disco. >gni dispositivo ha poi particolarit legate alla sua natura:
un hard dis1 pu@ essere formato da pi< piatti ed il relativo drive avere molte testine di lettura4scrittura,
un .opp- ha invece un solo piatto (un flm .essibile e sottile come un capello a forma di cerchio ed
una sola coppia di testine.
&iassumendo, la logica di controllo di "uesti dispositivi 8 assai diversifcata, sia perchF l%accoppiata
supporto e relativo drive 8 formata da dispositivi elettromeccanici diversi, sia perchF diverse sono le
tecniche con cui si pu@ decidere di usarli per disporre dello spazio di memorizzazione ("uante tracce
gestire sul .opp-D come organizzare la spirale di bit su di un (DD.
Agli albori dell%informatica la gestione dei supporti era sotto la completa responsabilit dei
programmatori, costretti a confrontarsi direttamente con l%hardware (aspetto fsico oltre che a
decidere come usare lo spazio messo a disposizione (aspetto logico. Detto in altre parole doveva
occuparsi sia della gestione %sica delle informazioni che di quella logica: cio8 pilotare i dispositivi ed
allo stesso tempo gestire i b-te in modo da poterli interpretare come informazioni utili ("uali archivi
creareD (ome strutturarli in campi informativiD (ome mettere in relazione i record un archivio con
"uelli di un altroD. 9uesta doppia =responsabilit% porta con se parecchi problemi tra cui, mettendo in
evidenza i pi< eclatanti, 8 opportuno citare i seguenti:
7ecessit di conoscere in modo approfondito l%hardware da controllare.
(ome conseguenza del punto precedente aumenta la complessit dell%attivit di
programmazione.
0 programmi sono olto legati all%hardware: "uando "uest%ultimo cambia essi vanno
modifcati.
L%eCcienza nella gestione dei supporti dipende dalla competenza del programmatore.
)oca uniformit: ogni programmatore adotta tecniche diverse di allocazione4gestione dello
spazio
7otevole spreco di tempo4uomo: ogni programmatore codifca routine gi codifcate da altri
(chi meglio, chi peggio.
Qasso livello di astrazione nella programmazione: lo sviluppatore invece di concentrarsi solo su
aspetti logici legati al problema 8 costretto a gestire altri dettagli.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1)'
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
(i sono anche i soliti vantaggi di una programmazione a basso livello:
controllo accurato dell%hardware
possibilit, se si 8 Q&A20 programmatori, di ottimizzare il codice per il massimo delle
prestazioni

!olo con l%avvento di sistemi operativi suCcientemente evoluti (D>!, '70f, windows 73 il
programmatore ha potuto svincolarsi dagli aspetti hardware ed in parte anche da "uelli logici. 0l
modulo del sistema operativo chiamato =4le s;ste%, infatti:
si occupa della gestione hardware (4le s;ste 4sico: pilota dispositivi anche molto diversi tra
loro (.opp-, hard dis1, (D &>6, nastri ecc. per la registrazione e la lettura di blocchi di b-te#

mette a disposizione delle entit logiche chiamate %le (4le s;ste logico gestite tramite un
nome ed una posizione (path, cammino in una struttura, di solito gerarchica (director-, sotto
director- ecc.# mette in oltre a disposizione comandi per creare, eliminare, spostare, rinominare i
fle# "uesti comandi possono non solo essere imparti grazie ad una riga di comando (6! D>!, 'ni+,
Linu+ o ad un ambiente a fnestre (Eindows, 'ni+, Linu+ ma anche in un programma#
L%esame dettagliato del modulo fle s-stem viene svolto nel corso di !istemi. 7el corso di 0nformatica
interessa invece cogliere gli aspetti pi< legati allo sviluppo del software. (he dire allora dei linguaggi di
programmazioneD (ome si sono evoluti in risposta a "ueste problematicheD
A livello di linguaggi =assembl-% il tutto si risolve attraverso chiamate a servizi del sistema operativo
(nel caso di 6! D>! attraverso il noto meccanismo degli interrupt software, come dovrebbe esservi
chiarito nel corso di sistemi.
0 linguaggi di terza generazione (=(%, )ascal, Qasic, (obol ecc. o/rono istruzioni pi< evolute (apri un
fle, chiudilo, leggi dal fle, scrivi su di esso, spostati ad una certa posizione ecc. che sono poi
tradotte dal compilatore negli stessi meccanismi a basso livello dell%assembl-.
Da alcuni anni la gestione delle informazioni 8 diventata talmente importante per il successo dei
sistemi informativi e le funzionalit richieste talmente sofsticate da rendere insuCcienti le funzionalit
o/erte dai sistemi operativi e, di conseguenza, dei programmi che vi fanno aCdamento. 9uesto fatto
giustifca l%esistenza sul mercato di complessi software dedicati esclusivamente alla gestione delle basi
di dati aziendali: i DQ6! (data base management s-stem: saranno oggetto di un%ampia porzione del
corso di 0nformatica di "uinta.
2ista l%esistenza dei DQ6! perchF parlare delle tecniche =tradizionali% in presenza di strumenti
talmente avanzatiD ,cco alcuni buoni motivi:
i re"uisiti hardware4software (microprocessore, &A6, spazio su hard dis1 richiesti dai DQ6! sono
decisamente elevati: in pi< di una situazione non sono semplicemente disponibili e l%unica
alternativa (spesso perfettamente adeguata 8 rappresentata dalle tecniche =tradizionali%#
certe elaborazioni sono molto diCcili da realizzare con i linguaggi specifci per i data base: "uesti
linguaggi =pagano% la loro indubbia semplicit che li rende alla portata anche del non
programmatore con una minore =potenza%# il problema 8 cos? sentito che in molti linguaggi per data
base sono stati reintrodotti costrutti di programmazione tipici dei linguaggi tradizionali
per certe operazioni la velocit delle tecniche tradizionali 8 impareggiabile: nessun DQ6! supera in
velocit linguaggi come il )ascal o il ( per scrivere e leggere fle di testo ( e non dimenticate che le
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1))
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
pagine E,Q in X36L sono fle di testo \
conoscere le tecniche passate aiuta a capire, apprezzare e sfruttare molto meglio ci@ che le nuove
mettono a disposizione.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1)5
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
'IPI DI DI.E
G. Dile !i testo 3te9t 4le: sono se"uenze di b-tes con valori numerici nell%intervallo valido per la
codifca dei caratteri per un certo sistema operativo. 7el caso di 6! D>! 4 Eindows (codifca A!(00
"uesti fle sono terminati dal carattere con codice 26 3C'A. P. La fne di un fle viene indicata con
la sigla E&D (,nd >f $ile, fne del fle. L%inizio con B&D (Qegin >f $ile, inizio del fle
0 fle di testo sono suddivisi in righe. >gni riga 8 terminata dai b-te CA ((arriage &eturn, ritorno
carrello codice A!(00 GJ e L$ (Line $eed, avanzamento di riga, codice A!(00 GL.

Attenzione: le righe sono terminate o solo da (& o solo da L$ o da tutti e due a seconda del
sistema operativo in uso (con 6! D>!4Eindows le righe sono terminate da (& seguito da L$.
Eindows 8 in grado di trattare anche caratteri '70(>D,, uno standard internazionale che
consente, grazie all%uso di due b-te per codifcare ciascun carattere, di rappresentare set di
caratteri molto ricchi. )er lo stesso motivo i linguaggi pi< recenti (Delphi con il suo >b]ect )ascal ne
8 un esempio sono in grado di defnire variabili carattere aderenti a "uesto standard.
,cco come potremmo rappresentare grafcamente un fle di testo:
Le istruzioni per scrivere e leggere dati dai fle di testo sono line>oriented nel senso che
permettono di leggere o scrivere intere righe del fle e non solamente una parte dei caratteri di
una certa riga. Abbiamo cos? comandi per registrare una riga oppure per leggerla da un fle. 'na
grossa limitazione dei fle di testo in )ascal 8 che le righe gi inserite non possono essere
modifcate (riscritte.
0 fle testuali sono il tipo di fle meno sofsticato e meno eCciente per rappresentare situazioni reali
di una certa complessit ma allo stesso tempo assicurano la massima portabilit tra elaboratori
con diversi sistemi operativi e tra periferiche altrimenti incompatibili. 9ualsiasi linguaggio su
"ualsiasi piattaforma hardware4software 8 infatti in grado di gestire fle di testo. 7el peggiore dei
casi si render necessaria una (semplice transcodifca (ad esempio da A!(00 a ,Q(D0(.
7on sono inoltre particolarmente adatti a contenere informazioni non testuali: "ualsiasi codifca
binaria (la rappresentazione interna di un numero in virgola mobile, il codice operativo od un
operando di un%istruzione assembl-, un immagine, un suono un%animazione contenente un b-te
con valore TK verrebbe considerato, inesorabilmente, ,>$. 7aturalmente ci sarebbe sempre il
modo di codifcare gli stessi dati usando solo b-te diversi da ,>$, (& e L$ ma la soluzione
risulterebbe meno eCciente e poco elegante. 6eglio usare i fle non testuali (vedi sotto.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1)*
"uesta 8 la prima riga del fle di testo. )u@ contener anche spazi
come "uesti AA
CA .D
io sono la seconda &05A bla bla bla bla blaA C
A
.
D
io sono la riga pi<
corta AAA
C
A
.
D
C
A
.D
C
A
.D
C
A
.D
C
A
.
D
E&
D
E&D
B&D
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
T. Dile "inari 3,"inar; 4le- o non !i testo5: a livello fsico sono ancora formati da una se"uenza di
b-te il cui valore non viene per@ interpretato come un carattere A!(00. (os?, mentre un b-te con
valore (decimale KP viene interpretato come la =A% in un fle di testo, lo stesso valore potrebbe
specifcare una tonalit di colore di un%immagine in un fle ?peg (uno dei formati grafci pi< di/usi.

La fne di "uesti fle non 8 segnalata dal carattere (3&L W ma attraverso altri meccanismi (ad
esempio tenendo traccia della lunghezza in b-te del fle. Anche i b-te con valore numerico GJ e
GL (i (& e L$ dei fle di testo non hanno un signifcato particolare.
Le istruzioni di lettura4scrittura per "uesti tipi di fle permettono tipicamente di leggere blocchi di
b-te di dimensioni specifcate dal programmatore.
!ono adatti per memorizzare "ualsiasi tipo di fle, testo compreso (ovviamente non potremo
sfruttare le primitive di lettura e le particolarit dei fle di testo. !ono fle binari le traduzioni in
linguaggio macchina dei programmi, immagini, suoni, archivi di basi di dati per i "uali si 8 preferito
"uesto formato a "uello testuale ecc.
J. Dile ti%i##ati: sono fle per i "uali le unit informative (chiamate record in )ascal hanno una
struttura (un tipo ben precisa. (ome i record )ascal gestiti in &A6, i record su fle sono
comodamente suddivisi in campi (felds. Ad esempio:
t1pe
03alciatori@9ecord
matricola: integer(
cognome: string(
nome: string(
ecc.
end(
var Aile3alciatori: %le of 03alciatori(
Le istruzioni di lettura4scrittura sono in grado di leggere4scrivere un intero record per volta, di
spostarsi per leggere4scrivere in una posizione "ualsiasi del fle, e, operazione impossibile con i
fle di testo, di modifcare (riscrivere una scheda.
Nota) ribadisco che a livello fsico i fle sono comun"ue tutti formati da una se"uenza di b-te# la
di/erenziazione che ne facciamo 8 a livello logico. 'na parte della letteratura informatica si limita
a distinguere tra fle di testo e non di testo (i fle tipizzati vengono considerati fle binari.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1)+
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
'IPI DI &AC(NIPP(PI&NE 3(CCE::&5
L%organizzazione fa riferimento alle modalit con cui 8 possibile accedere ai dati sui supporti:
:e*+en#iale: i dati possono essere letti4scritti in modo strettamente lineare# per leggere4scrivere
un dato 8 necessario leggere i precedenti per posizionare il dispositivo di lettura4scrittura nel
punto giusto# il tempo per accedere ad un dato 8 "uindi molto dipendente dalla sua posizione sul
supporto# ad esempio, per un nastro magnetico l%unico tipo di organizzazione possibile 8 "uella
se"uenziale: se il nastro 8 all%inizio, il tempo per leggere il primo blocco di dati 8 assai inferiore al
tempo necessario per leggere un blocco che sta a met o alla fne del nastro.
Aan!o: se 8 possibile raggiungere un blocco "ualsiasi di dati impiegando praticamente lo stesso
tempo indipendentemente dalla posizione del blocco. Ad esempio il tempo necessario a pilotare
una delle testine di lettura4scrittura in un punto "ualsiasi della superfcie di un piatto di un hard
dis1, partendo da una posizione "ualsiasi, non 8 esattamente zero ma 8 comun"ue abbastanza
piccolo da ritenere ("uasi identico il tempo necessario a leggere uno "ualsiasi dei blocchi che
costituiscono un fle.
7>3A: la distinzione tra organizzazione di un fle tra se"uenziale e random 8 indipendente dalle
capacit fsiche del supporto ed 8 stabilita dalla modalit di accesso a "uel fle. Ad esempio, l%hard
dis1 a livello fsico 8 sicuramente random ma nulla vieta di organizzare la registrazione di un fle in
modo che il suo accesso sia comun"ue se"uenziale (pensate ad un fle di testo in )ascal.
7ella letteratura informatica ci si riferisce alle seguenti come ad organizzazioni a se stanti ma in realt
sono tutte costruite su "uella =random%:
Con in!ici: "uando l%accesso ai dati 8 velocizzato dalla gestione di strutture (su fle separati o
nello stesso fle dei dati che, grazie alla loro organizzazione, consentono di risalire rapidamente
alla posizione in cui trovare i dati. 0l modo di realizzare l%indice pu@ variare grandemente.
0ndividuato un campo informativo in relazione al "uale si vuole velocizzare l%accesso (ricerca per
codice o per cognome, ecc. l%indice conterr una copia di tutti i valori contenuti nel fle dati per
"uel campo (tutti i codici o tutti i cognomi ecc. aCancati dalla posizione in cui sul fle dati
completo si trovano gli altri dati per "uel record.
L%indice 8 mantenuto in una forma che rende assai veloce trovare i valori che interessano (un
certo codice o un certo cognome ecc.: ad esempio potrebbe essere ordinato (per sfruttare una
ricerca dicotomica o strutturato come un albero binario di ricerca# "uest%ultima scelta 8 alla base
della fortunatissima tecnica che sfrutta una forma modifcata degli alberi binari, chiamata =B?
tree%# essa 8 utilizzata per molte implementazioni del linguaggio (obol, di molte librerie per la
gestione degli archivi disponibili per gli altri linguaggi, e di alcuni famosi DQ6!.
9ualun"ue sia forma dell%indice, l%idea di base 8 che, grazie alla sua natura ordinata, saranno
necessarie poche letture su di esso per localizzare il valore che interessa ed accedere all%indirizzo
in cui si trova il resto dei dati nel fle principale.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1),
A$!(!4B!!2B$)!3C
a%ce8))
L9!&!ce / o$&!ato
#e$ co4o"e. I &at!
&! A$!(! (! t$o5ao
e% 7)a$to $eco$& &e%
+!%e &e! &at!
Ca%ce(t$)**!Ma$!o:. M!%aoI"#!e4atoB!!H!o$4!o:.
Co$taSt)&eteB$)!Ma((!"o:. L)4aSt)&eteA$!(!Ma((!"o:.
La$4aA55ocato
I% +!%e &at! #$!c!#a%e o / o$&!ato $!(#etto a& a%c) ca"#o. L9acce((o
/ "e&!ato &a%%9)(o &e%%9!&!ce. Se %9acce((o / $a&o"' otte)ta
&a%%9!&!ce %a #o(!*!oe &e! &at! &! A$!(! (a$> ()++!c!ete )a (o%a
%ett)$a.
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
A titolo di esempio consideriamo un fle di dati anagrafci contenenti un milione di record. 'na
ricerca dicotomica sul fle indice nel caso pi< sfortunato richieder TL letture (TL Y(circa
logT(GLLLLLL che 8 il numero di volte che pu@ essere dimezzato un intervallo pari ad un milione
pi< una ventunesima nel fle dati vero e proprio. 6ediamente, in realt, il numero di letture sar
minore di TL. )aragonate "uesto numero di letture con il numero medio di letture nel fle dati
principale disordinato (PLLLLL A per rendervi conto del guadagno\ 9ualcuno, giustamente, star
=storcendo il naso per la puzza di bruciato%: non sarebbe meglio tenere ordinato il fle principale e
sfruttare la ricerca dicotomica o "ualsiasi altro algoritmo pensato per la gestione degli indici
(evitando l%uso di "uesti ultimiD 0n linea di principio "uesto sarebbe possibile ma molto pi< lento
perchF il fle principale 8 di solito molto pi< grande dell%indice. 3enere aggiornato l%indice 8 invece
un compito assai pi< leggero e, grazie a particolari strutturazioni "uali "uella prevista dalla tecnica
=QZ tree%, pu@ essere fatto praticamente in tempo reale senza rallentamenti avvertibili dall%utente.
0noltre 8 possibile avere pi< indici per accedere ai dati secondo diverse c/ia2i !i ricerca (per
codice, per cognome, per indirizzo ecc.: sarebbe veramente troppo oneroso riordinare il fle
principale in base al campo che di volta in volta interessaA >ppure mantenere tante copie del fle
dati "uanti sono i criteri di ordinamento desideratiA 7aturalmente tutto ha un limite: troppi indici
tenderanno comun"ue a rallentare le operazioni a causa del sovraccarico necessario alla loro
gestione (per ovviare in parte a "uesto problema nei moderni DQ6! 8 possibile creare =al volo%
degli indici temporanei che verranno distrutti al termine dell%elaborazione al fne di non protrarre
inutilmente l%aggravio della loro gestione.
Aelati2e) "uando le unit informative (record sono individuate da un numero che corrisponde alla
loro posizione. ,% cos? possibile, ad esempio, chiedere di inserire un record alla posizione TL
(anche se non sono state occupate tutte le precedenti piuttosto che alla P. !imilmente 8 possibile
chiedere di leggere un record ad una posizione "ualsiasi. 3ra i linguaggi che supportano "uesta
organizzazione ricordiamo molti dialetti del QA!0( e del (>Q>L.
Fas/ing. 7on sempre 8 conveniente applicarla. L%idea 8 che il processore impiega a fare un
calcolo molto meno tempo di "uello necessario a leggere dati dai supporti di massa: si tenta allora
trovare una formula (legge di trasformazione che, partendo da una chiave di accesso (ad esempio
il cognome calcoli la posizione del resto dei dati. Ad esempio potremmo stabilire che, dato un
cognome di una persona, il resto dei dati si trova nel record alla posizione corrispondente al
numero dei caratteri del cognome. 0n "uesto modo, volendo trovare i dati di =&ossi% sapremmo in
modo super rapido che si trovano sul "uinto record del fle (&ossi 8 una stringa di P caratteri.
>vviamente salta subito all%occhio il problema di "uesta formula troppo semplice: molti cognomi
sono lunghi P caratteri e tutti i relativi record dovrebbero essere memorizzati nella stessa
posizione \ 0n e/etti il problema dell%hashing sta proprio nella diCcolt di trovare una legge di
trasformazione appropriata. 'n altro esempio di legge: sommare i valori A!(00 delle lettere
corrispondenti ai cognomi. Anche "uesta legge genera posizioni uguali (sapresti dire perchF e
valutare se 8 migliore rispetto alla precedenteD \ )urtroppo 8 impossibile trovare una legge di
trasformazione perfetta. 0 problemi maggiori sono:
con.itti di posizione: "uando i valori dei campi di due record diversi generano lo stesso indirizzo#
nell%esempio di prima tutti gli anagrammi di un cognome generano lo stesso indirizzo (vista la
propriet commutativa della
somma# due tra le due
tecniche pi< usate per aggirare
"uesto problema sono o
applicare in successione altre
leggi di trasformazione per
generare indirizzi diversi o
gestire delle vere e proprie
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1)-
ROSSI
SORSI
RISSO
Co&!ceco4o"e322ROSSI
167SORSI2L1RISSO
So""a &e!
co&!c! ASCII
4LL
12LL
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
aree di =over.ow%, come indicato nello schema seguente#
0potizziamo di dover inserire per primo il record di &>!!0# la legge di trasformazione generebbe
l%indirizzo ULL, usato per "uesto record# l%inserimento di !>&!0 richiederebbe di usare lo stesso
indirizzo: trovandolo gi occupato si memorizza il nuovo record in un%area speciale (di overBow,
cio8 di traboccamento che inizia all%indirizzo GTLL (valore scelto a caso# il GTLL viene
memorizzato nel record di &>!!0 per poter ritrovare in un secondo momento all%area di overBow.
)er memorizzare &0!!> si trova, ovviamente, gi occupata la solita posizione ULL. !i rileva (grazie
al GTLL memorizzato prima che esiste gi un%area di owerBow. 9uest%ultima viene fatta scorrere
fno a supeare l%ultimo record che condivide con tutti gli altri lo stesso valore generato dalla legge
di trasformazione. !e c%8 ancora spazio viene aggiunto in coda il record di &0!!>. Dovendo
reperire le informazioni di &0!!> sar necessario scorrere l%area di over.ow vanifcando in parte il
vantaggio dell%hashing, ma se le aree di over.ow non sono esasperate 8 possibile ancora un
notevole guadagno nei tempi complessivi.
distribuzione ottimale dei valori generati: immaginando di non ammettere omonimie (come
potrebbe accadere per la descrizione dei prodotti in un magazzino non 8 diCcile inventarsi una
legge di trasformazione hash che non causa con.itti# considerate "uesto algoritmo: facciamo
corrispondere ogni lettera del cognome a numeri primi crescenti. )er &>!!0 la & corrisponde al T,
la > al J, la prima ! al P, la seconda ! al V e la 0 all%GG. )oi eleviamo ogni numero primo alla
potenza corrispondente al codice A!(00 delle lettere corrispondenti. (os? eleveremo il T alla IT
(codice A!(00 della &, il P alla IJ (codice A!(00 della !, il V ancora alla IJ e cos? via. )oi
moltiplichiamo tra loro i numeri ottenuti: il risultato 8 l%indirizzo richiesto. La matematica ci
assicura (teorema dell%unicit della scomposizione in potenze di numeri primi di un numero che
due cognomi diversi genereranno due indirizzi diversi. )arrebbe di aver risolto il problema dei
con.itti con un solo calcolo per "ualsiasi campo da indicizzare di natura alfanumericaA 0mmaginate
per@ di dover inserire il prodotto =W'((A (>7 W,7W,&> , WA$$,&A7>%# il valore generato
dall%algoritmo 8 6>L3> grande (6>L3> pi< grande del corrispondente decimale con tutti H AA. 0l
numero eccede anche le capacit di memorizzazione del pi< grande hd esistente, anche
immaginando di associare un singolo b-te su di esso ad un indirizzo diverso \. )otremmo
scoprire, "uindi, che per memorizzare anche solo il primo record dovremmo farlo ad un indirizzo
impossibile da far corrispondere nella pratica: un miliardo di miliardi. Dovremmo creare tutti i
record vuoti corrispondenti alle posizioni precedenti esaurendo (tempo permettendo anche la
batteria di hard dis1 pi< capiente dell%universo \
6orale: la tecnica hash 8 utile solo in casi particolari da analizzare attentamente "uando la
velocit di reperimento dei dati 8 il fattore critico, diversamente l%organizzazione ad indici risulta
pi< conveniente e suCcientemente performante.
O1ERAZIONI DI BASE 1ER LA HESTIONE DEI FILE IN 1ASCAL
9ualun"ue sia l%organizzazione fsica possiamo individuare alcune operazioni di base tipiche. )er
ciascuna di "ueste 8 importante, oltre al risultato, essere in grado di rilevare i motivi di eventuali errori
(fne dello spazio su disco, disco in avaria, disco non trovato, fle non trovato ecc.. 0l controllo degli
errori inevitabilmente rende il codice pi< pesante, pi< diCcile da leggere: per "uesto motivo vedremo
solo alcuni esempi seguendo i "uali lo studente volenteroso ( potr perfezionare tutto il resto del
codice.
7>3A: le considerazioni che seguono sono specifche del linguaggio )ascal ma mantengono gran parte
della loro validit anche per linguaggi diversi. >gni volta di/erenzieremo tra fle di testo e fle tipizzati.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 150
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Collegaento al 4le esterno 1 %roce!+ra (::ICN
'n fle viene individuato dal suo nome e dal suo indirizzo fsico (path. Ad esempio
3:CdatiC)66)ClettereCclientiCmilanoCecc.Clettera.doc. 0n un programma )ascal per comandare le varie
operazioni con un certo fle si invece un nome logico scelto dal programmatore (ad esempio lettera. 0l
nome logico 8 pi< pratico e rende anche possibile cambiare il nome e la posizione di un fle su disco
senza dover necessariamente modifcare il programma (ad esempio memorizzando i nomi e le
posizioni fsiche dei fle su un fle a parte, "uesto s? fsso, che viene letto all%inizio del programma e
con il cui contenuto vengono inizializzati tutti i nomi di fle logici che si intendono usare.
)rima di poter usare un nome logico, che poi altro non 8 che una variabile di tipo speciale, 8
necessario indicare a "uale fle fsico lo si vuole far corrispondere.
$0L, D0 3,!3>
!eguendo l%esempio di prima si vuole fa corrispondere il nome logico lettera al fle fsico
3:CdatiC)66)ClettereCclientiCmilanoCecc.Clettera.doc. !i ricorre alla procedura standard Assign:
Dssign" Evariabile di tipo %leF , Enome %sico del %leF #
Applichiamola al nostro esempio:
var lettera: te+t# (S lettera 8 il nome logico# il tipo te+t indica che si tratta di un fle di testo S
\
Dssign"lettera, G3:C datiC)66)ClettereCclientiCmilanoCecc.Clettera.doc=#
>ra, e non prima, 8 possibile comandare le altre operazioni \
)ossiamo rendere il nostro programma in grado di funzionare con diversi fle fsici senza essere
costretti a modifcare il suo codice: 8 suCciente indicare nell%assign una variabile stringa come nome
fsico del fle:
var lettera: text( nomeAisico: string(

writeln"G3on quale %le vuoi lavorare8 G(
readln"nomeAisico#(
Dssign"lettera, nomeFisico#
La procedura assign deve essere usata una volta sola prima di iniziare a lavorare con il fle.
>vviamente dovremo comandare un assign per ciascun fle che intendiamo usare.
$0L, 30)0WWA30
7on c%8 nessuna di/erenza nell%uso dell=assign. Dobbiamo per@ dichiarare il fle in modo che sia
riconosciuto come tipizzato:
t1pe
0ersona@record
cognome: stringH,6I( "J e' obbligatorio de%nire il numero dei caratteri della stringa K J#
codice: integer(
end(
fpersona@%le of 0ersona( "J senza il tipo non potremmo passare un %le come parametro J#
var
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 151
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
elenco: fersona(

assign"elenco, G3:Cdati.dat=#
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 152
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Crea#ione 1 %roce!+ra AEEAI'E
L%assegnazione da sola non basta per usare un fle. ,% necessario crearlo. 'n fle appena creato
risulter vuoto e non si 8 obbligati ad inserire subito nuovi dati (anche se di solito lo si fa. 'n fle
creato e lasciato vuoto risulter con L b-te nelle cartelle di windows. 7on confondete "uindi la
creazione con l%inserimento dei dati.
La creazione pu@ fallire per vari motivi:
M il percorso4nome del fle fornito dal programmatore non 8 valido
M il supporto di massa non 8 disponibile (nastro non montato, .opp- non inserito, (D non scrivibile
M il supporto 8 in avaria (.opp- o hard dis1 rotti \
M spazio sul supporto esaurito (anche se 8 diCcile che non ci sia spazio almeno per creare il fle
vuoto
6a vediamo la sintassi dell%istruzione di creazione (identica per fle di testo e tipizzati:
rewrite"nome<%le<logico#
9uindi, continuando gli esempi dell%istruzione precedente (assign senza ripetere la dichiarazione dei
tipi e delle variabili:
0;L0M 0&&NND0&
assign"lettera, G=#( assign"elenco#( come gi. detto, la sintassi ! identica
rewrite"lettera# rewrite"elenco#(
(''ENPI&NEHHH
!e comandate una rewrite su un fle gi presente in "uella posizione e con lo stesso nome,
"uest%ultimo verr eliminato, e si ricomincer con un fle vuoto. )i< avanti vi verr spiegata una
tecnica per verifcare la presenza di un vecchio fle senza distruggerlo e chiedere conferma prima di
procedere con la rewrite.
C/i+s+ra 1 %roce!+ra C.&:E
>ra il fle esiste (vuoto ed il programmatore potrebbe continuare con le istruzioni che aggiungono
righe4schede. >ppure terminare subito le operazioni. 0n ogni caso il termine delle operazioni con un
certo fle va segnalato con il comando (L>!,: close"nome<%le<logico#. Di nuovo, non ci sono
di/erenze tra fle di testo e tipizzati.
0;L0M 0&&NND0&
assign"lettera, G=#( assign"elenco#(
rewrite"lettera# rewrite"elenco#(
close"lettera# close"elenco#
9uesta 8 ovviamente la se"uenza dei comandi nel caso il programmatore decidesse di creare i fle
senza registrare alcun dato su di essi (ovviamente potr farlo in seguito, =riaprendo% i fle.
Diversamente immaginate tra la rewrite e la close le istruzioni che aggiungono nuove righe (fle di
testo o schede (fle tipizzati.
7 >3A: close restituisce anche al sistema operativo tutte le risorse usate per la gestione del fle.
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 15'
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 15)
Gestione Arc%ivi Tradizionali & versione '.1 (ettembre 200)
:critt+ra 1 le %roce!+re (PPEND 34le !i testo57 EAI'E.N 34le !i testo5 e EAI'E 34le
ti%i##ati5
Le procedure writeln e write permettono rispettivamente di aggiungere una riga ad un fle di testo o un
record ad un fle tipizzato.
(on il )ascal, per i fle di testo ed i tipizzati gli inserimenti possono essere e/ettuati solo in fondo al
fle# non c%8 modo di inserire nuove informazioni in mezzo al fle senza crearne uno nuovo.
L%operazione di inserimento potrebbe fallire:
M lo spazio sull%unit 8 esaurito
M l%unit non 8 disponibile (ad esempio .opp- non inserito
M l%unit 8 andata in avaria
M il fle 8 gi stato aperto da un utente in modalit che impedisce gli inserimenti agli altri utenti
$0L, D0 3,!3>
Ad un fle di testo possono essere esclusivamente aggiunte righe in fondo al fle. 7on 8 possibile, ad
esempio, posizionarsi in una posizione intermedia ed inserire una riga. 0l fle deve essere stato prima
predisposto o con rewrite (creando un fle vuoto siamo ovviamente in fondo al fle \ o con la
procedura append"nome<%le<logico. 9uest%ultima deve essere usata "uando si vogliono fare aggiunte
ad un fle di testo che contiene gi alcune righe.
!enza l=append dovremmo sempre creare da capo i fle di testo riscrivendo anche le vecchie righe (vi
ricordo che rewrite 8 distruttivaA.
L%istruzione che aggiunge le righe al fle 8 una variante dell%arcinota writeln. !emplicemente dovremo
indicare il nome del fle logico su cui scrivere e la stringa che rappresenta la riga da aggiungere:
writeln"nome<%le<logico, stringa#.
Dopo ogni writeln sul fle, il punto di inserimento 8 automaticamente fatto avanzare.
(ome al solito, gli esempi che seguono fanno riferimento alle dichiarazioni dei paragraf precedenti.
$ile creato e scritto immediatamente
Oar riga: string(
begin
Dssign"lettera,=c:C...=#(
re*rite(lettera)+ (, FI-' A..'/A01#
,)
repeat
writeln"G&nserire la riga da scrivere sul
%le=#(
readln"riga#(
if rigaEF=A&:;= then
*riteln(lettera, riga)+
until riga@=A&:;=(
close"lettera#(
end.
Aggiunga di righe ad un fle esistente
Oar riga: string(begin
begin
Dssign"lettera,=c:C...=#(
append(lettera)+ (, 2'334I' /I54'
31$S'/2A0'#,)
repeat
writeln"G&nserire la riga da scrivere sul %le=#(
readln"riga#(
if rigaEF=A&:;= then
*riteln(lettera, riga)+
until riga@=A&:;=(
close"lettera#(
end
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 155
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
0n entrambi gli esempi chi usa il programma comunica che le righe da aggiungere sul fle di testo sono
terminate digitando la stringa =$07,%.
$0L, 30)0WWA30
,% molto importante notare che una scheda (record viene letta4scritta tutta insieme, non un campo
alla volta. )er le operazioni deve essere dichiarata una variabile record dello stesso tipo delle schede
che si vogliono leggere4scrivere.
)er aggiungere una scheda dovremo prima memorizzare i dati nella variabile record e poi comandare
la registrazione di "uest%ultima nel fle tipizzato.
L%istruzione che materialmente aggiunge la scheda 8 write"nome<%le<logico,
variabile<record<con<dati#.
Dopo ogni write sul fle, il punto di inserimento 8 automaticamente fatto avanzare.
$ile creato e scritto immediatamente
t1pe
0ersona@record
cognome: stringH,6I( "J H,6I: ricordatevi il numero di caratteriK J#
codice: integer(
end(
var
elenco: %le of 0ersona( "J la variabile %le( si sarebbe anche potuto de%nire prima un tipo G%le of
0ersona= J#
unaersona: 0ersona(
begin
assign"elenco,'c:Cprova.dat'#(
"J crea il %le azzerandolo, pronto per la prima scheda J#
rewrite"elenco#(
repeat
writeln"'&nserimento da tastiera di un record da trasferire poi sul %le'#(
write"'&nserire un codice: "zero per %nire#' #(
readln"unaersona.codice#(
write"'&nserire un cognome: '#(
readln"unaersona.cognome#(
if unaersona.codiceEF6 then
*rite(elenco,una(ersona)+ A55I6$5' -A S34'7A I$ F1$71 A- FI-' '7 A2A$.A
until unaersona.codice@6(
close"elenco#(
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 1 &! 2L1
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
end.
(hi usa il programma comunica che le schede da aggiungere sono terminate digitando come codice il
valore zero.
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 2 &! 2L1
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
Aggiunga di righe ad un fle esistente * PA&CEDSA( :EEY E DSNPI&NE DI.E:IPE
L%append non esiste ma pu@ essere simulata spostandosi in fondo al fle con un comando speciale. 'n
grosso vantaggio, infatti, dei fle tipizzati 8 la possibilit di spostarsi su una scheda "ualsiasi senza
dover leggere "uelle che la precedono. 0l comando 8 see/"nome<%le<logico, posizione#. A33,7W0>7,: si
inizia a contare da zeroAA 9uindi la posizione del primo record 8 la zero, "uella del secondo record 8
due e cos? via. )er spostarsi sul primo record allora si user see/"%le , 6#, per spostarsi invece sul
decimo see/"%le, 2#.
)er simulare l%append dovremmo allora spostarci oltre l%ultimo record. !e ci fossero 7 record
l%istruzione sarebbe see/"%le, :#: infatti see/"%le, :>'# individuerebbe proprio l%7Mmo record ed
indicando 7 come posizione ci posizioneremmo sul record 7ZG (cio8 sul nuovo che abbiamo intenzione
di inserire, sempre in virt< del fatto che si conta da L. 5i, ma come si fa a sapere "uanti record ci
sono nel fleD 'n metodo brutale potrebbe essere "uello di leggerli tutti fno a raggiungere la fne del
fle (,>$ ma sarebbe molto dispendioso. )er fortuna esiste un comando specifco (solo per i fle
tipizzati# secondo voi perchF D: %lesize"nome<%le<logico#.
0noltre, prima di poter usare see/ il fle deve essere predisposto all%uso (aperto con la procedura
reset"nome<%le<logico, da usare ovviamente dopo l%assign.
0 comandi che portano oltre la fne del fle sono allora:
reset"nome<%le<logico#( PU;L0M 3MQD:*M 9;*&LM:; &$ A&$; D$$=ULM, $M GD9;=
see/" nome<%le<logico, %lesize"nome<%le<logico# #
,d ecco un esempio completo:
t1pe
0ersona@record
cognome: stringH,6I( "J e' obbligatorio de%nire il numero dei caratteri della stringa K J#
codice: integer(
end(
fpersona@%le of 0ersona( "J senza il tipo non potremmo passare un %le come parametro J#
var
elenco: fersona(

assign"elenco, G3:Cdati.dat=#(
reset(elenco)+
see8(elenco, 9lesize(elenco )+ S(1S0A0I 1-0/' -6-0I:A S34'7A (/'S'$0' $'- FI-'
repeat
writeln"'&nserimento da tastiera di un record da trasferire poi sul %le'#(
write"'&nserire un codice: "zero per %nire#' #(
readln"unaersona.codice#(
write"'&nserire un cognome: '#(
readln"unaersona.cognome#(
if unaersona.codiceEF6 then
*rite(elenco,una(ersona)+ -A S34'7A I$ F1$71 A- FI-' '7 A2A$.A
until unaersona.codice@6(
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 3 &! 2L1
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
close"elenco#(
.ett+ra 1 la %roce!+ra AE:E', AE(D.N 34le !i testo57 AE(D 34le ti%i##ati5
)er usare un fle gi creato in precedenza senza distruggerlo lo si deve prima predisporre all%uso con la
procedura reset"nome<%le<logico.
(on reset in pratica si notifca l%uso del fle al sistema operativo predispone le risorse necessarie (area
di memoria &A6 per i trasferimenti da e verso i dischi, tabelle per tenere traccia delle operazioni ecc..
9ueste strutture occupano memoria centrale preziosa, per cui bisognerebbe tenere =aperti% solo i fle
necessari.
9uasi tutti i linguaggi distinguono tra diversi tipi di apertura ((obol, =(% a seconda delle operazioni di
04> che si intendono fare: sola lettura, solo scrittura, lettura 4 scrittura, aggiunta a fne fle (append. ,%
impossibile in "uesta sede discutere tutte le varianti: consultate attentamente il manuale del
linguaggio in uso.
Anche l%apertura pu@ fallire:
M il percorso4nome del fle non 8 valido
M il supporto di massa non 8 disponibile (nastro non montato, .opp- non inserito, (D non scrivibile
M il supporto 8 in avaria (.opp- o hard dis1 rotti \
M il fle 8 gi stato aperto da un utente in modalit esclusiva (blocca i tentativi di accesso di tutti gli
altri
(on il )ascal, dopo l%apertura con reset di un fle di testo si 8 pronti per leggere la prima riga. Dopo
l%apertura di un fle tipizzato si 8 pronti per leggere il primo record. 'na funzione fondamentale per una
lettura corretta sia dei fle di testo che di "uelli tipizzati 8 la funzione ;MA"nome<%le<logico#: che
restituisce 3&', se siamo alla fne del fle, $AL!, altrimenti.
2ediamo alcuni esempi concreti di lettura.
$0L, D0 3,!3>
\ dichiarazioni \
(S riapriamo il fle per lettura S
reset(lettera#
(S leggiamo tutte le righe fno alla fne S
0/ile not eo$3lettera5 !o
begin
readln(lettera,riga#
writeln(riga
end#
close(lettera#
$0L, 30)0WWA30
\ dichiarazioni \
(S riapriamo il fle per lettura S
reset(elenco#
(S leggiamo tutte le schede fno alla fne S
0/ile not eo$3elenco5 !o
begin
readln(elenco,una)ersona#
writeln(una)ersona.cognome,; M ;,una)ersona.codice
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 4 &! 2L1
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
end#
close(lettera#
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 5 &! 2L1
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
Non %er!iao la "+ssola 1 %+ntatore all-area !i la2oro7 B&D e! E&D
7ell%uso di un fle 8 sempre molto importante rendersi conto in che punto dello stesso si sta lavorando.
)ossiamo immaginare un =puntatore% che indica la posizione:

7>3A Q,7,
'+tte le o%era#ioni !i lett+raZscritt+ra s%ostano se%re il %+ntatore in a2anti !i +na
,%osi#ione- 3+na riga %er i 4le !i testo7 +na sc/e!a %er i 4le ti%i##ati5 2erso la 4ne !el 4le
3E&D7 En! &$ Dile5.
Do%o la crea#ione siao all-ini#io7 a anc/e alla 4ne 34le I 2+otoH5 e *+in!i %ronti %er
aggi+ngere n+o2i "locc/i !i !ati. (! ogni inseriento !i +na rigaZsc/e!a la %osi#ione 2iene
s%ostata a+toaticaente oltre la 4ne !el 4le e si I %ronti %er aggi+ngere +n n+o2o "locco
!i !ati.
Do%o a2er letto +na rigaZsc/e!a 3se il 4le giO ne contiene5 la %osi#ione si s%osta
a+toaticaente in a2anti e si I %ronti %er leggere la s+ccessi2a.
(ggiornaento (LSE:'( &PEA(PI&NE E- P&::IBI.E :&.& PEA I DI.E 'IPIPP('I5
0l fle deve esistere e deve essere prima aperto con reset# si deve localizzare la scheda (record da
aggiornare cio8 posizionarsi in corrispondenza del punto a partire dal "uale 8 necessario sovrascrivere
le vecchie informazioni con "uelle nuove.
)oi si legge la vecchia scheda, per due motivi:
recuperare "uelle informazioni della scheda che non devono cambiare per poterle riscrivere
uguali al momento della riscrittura della scheda# diversamente dovremmo costringere chi usa
il programma a reinserirle (improponibile# ad esempio in una scheda anagrafca potrebbe
cambiare solo l%indirizzo: la lettura della vecchia scheda recupera tutte le altre informazioni
(cognome, nome, codice, ecc. che verranno riscritte uguali insieme al nuovo indirizzo#
poter proporre le vecchie informazioni sul video facilitando chi usa il programma
nell%inserimento dei campi del record che devono essere cambiati#
La lettura della vecchia scheda fa per@ avanzare al record successivo e non siamo perci@ pi<
posizionati nel punto giusto per l%aggiornamento. !e scrivessimo in "uesta situazione andremmo ad
aggiornare in realt la scheda successiva (od aggiungeremmo una nuova scheda se fossimo avanzati
oltre la fne del fle. ,% "uindi necessario ripetere il posizionamento con see/ prima di riscrivere la
scheda.
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 6 &! 2L1
fle appena creato# 8
vuoto# siamo all%inizio del
fle (Q>$, Qegin >f $ile e
contemporaneamente alla
fne (,>$, ,nd >f $ile
,>
$
il fle contiene gi dei dati# siamo posizionati
in un punto intermedio per leggere un blocco
di dati#
solo con i fle tipizzati potremmo anche
riscrivere (aggiornare il blocco dei dati
Q>
$
,>
$
Q>
$
siamo alla fne del fle# in "uesta
posizione possiamo aggiungere
nuovi blocchi di dati
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
L%aggiornamento pu@ fallire:
M i parametri indicati sono errati
M l%unit non 8 disponibile (ad esempio il .opp- 8 stato nel frattempo tolto
M l%unit 8 andata in avaria
Dopo l%aggiornamento ci si trova poi all%inizio dell%unit informativa successiva.
,cco un esempio che propone la se"uenza delle operazioni per modifcare solo il cognome della
persona corrispondente al secondo record (posizione G, ricordatevi che si conta da zero \:
t1pe
0ersona@record
cognome: stringH,6I( "J e' obbligatorio de%nire il numero dei caratteri della stringa K J#
codice: integer(
end(
fpersona@%le of 0ersona( "J senza il tipo non potremmo passare un %le come parametro J#
var
elenco: fersona(

assign"elenco, G3:Cdati.dat=#( reset"elenco#(
"J ora modi%chiamo il secondo record la sequenza standard e':
> see/ alla posizione della scheda da modi%care
> lettura della scheda con vecchi dati
D00;:N&M:;: a questo punto abbiamo superato la scheda da aggiornare
> acquisizione nuovi dati che vengono sostituiti a quelli
vecchi nella scheda
> torniamo indietro alla posizione giusta per scrittura ripetendo
la see/ iniziale "pu anche essere fatta subito dopo la lettura, per non dimenticarsene #
> scrittura su %le "aggiornamento# della scheda con i dati modi%cati J#
see8(elenco,;)+ (, see8 prima della scheda da modi9care
,)
read(elenco, una(ersona)+ (, lettura scheda con vecchi dati ,)
*riteln(!)))))))) 2'334I 7A0I )))))!)+
*riteln(una(ersona<cognome,= ) =,una(ersona<codice)+
*rite(=Inserire il nuovo cognome =)+
readln(una(ersona<cognome)+

(, riposizionamoci nel posto giusto per la scrittura ,)
see8(elenco,;)+
(, ora la varia"ile record contiene il vecchio codice ed il nuovo cognome riscriviamola
sul 9le ,)
*rite(elenco,una(ersona)+
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 7 &! 2L1
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
Eliina#ione
$0L, D0 3,!3>
7on 8 possibile eliminare una riga da un fle di testo. L%unica possibilit 8 "uella di ricopiare tutte le
righe meno "uelle da cancellare in un nuovo fle (operazione assai dispendiosa.
$0L, 30)0WWA30
Di nuovo, non 8 possibile eliminare fsicamente un record. )er@, grazie alla possibilit di riscrittura si
pu@=contrassegnare% una scheda in "ualche modo convenzionale scelto dal programmatore. Ad
esempio potrebbe esserci un campo =codice% e decidere che se contiene zero la scheda 8 da
considerarsi eliminata. Di tanto in tanto potremmo comandare in momenti di basso utilizzo
dell%archivio (di notte, ad esempio una riorganizzazione ricopiando in un nuovo fle le schede non
=eliminate%.
Coe controllare gli esiti !elle o%era#ioni ric/ieste 3CE:'I&NE DEC.I EAA&AI5
0l sistema operativo, sollecitato da comandi visti, pu@ dare conferma in merito al loro soddisfacimento
oppure segnalare un errore. 0 casi che portano al fallimento possono essere vari: spazio sul supporto
esaurito, il supporto indicato non 8 scrivibile ((D &>6, il supporto o un altro dispositivo necessario
per il suo uso (ad es. il controller dell%hd 8 in avaria, le risorse di sistema non consentono al momento
l%operazione (troppi programmi in uso, troppi utenti collegati, troppi fle in uso, collegamento ad
0nternet al momento interrotto ecc., il programma (e di conseguenza l%utente che lo ha eseguito non
ha l%autorizzazione necessaria, il percorso indicato nel nome del fle non esiste o non 8 corretto, il
nome del fle indicato non 8 corretto ecc.
La gestione di "ueste situazioni pu@ avvenire fondamentalmente in due modi:
0l sistema operativo rileva le anomalie ed agisce automaticamente: spesso "uesto signifca un
messaggio sullo schermo e la terminazione forzata del programma che ha generato l%errore. 0n
"ualche caso, ma con uno sforzo notevole, il programmatore pu@ sostituire all%azione standard del
sistema operativo le sue =routines% di gestione degli =interrupt% relativi (avete imparato a vostre
spese come "uesto sia diCcile da realizzare, soprattutto in =assembl-%.
0l programma in esecuzione riceve una notifca di errore, dopo un%operazione tentata, ed ha la
possibilit di gestirlo e di ripristinare il funzionamento del programma in modo =accettabile%. La
notifca pu@ avvenire tramite:
un valore restituito dalla funzione di 04> tentata: ad esempio la =fopen% del =(% dovrebbe restituire
un puntatore ad un fle (una struttura a record usata per le operazione di 04> con il corrispondente
fle fsico ma potrebbe restituire =null% in caso di insuccesso#
un controllo esplicito del programmatore dopo aver tentato un%operazione: ad esempio in )ascal 8
possibile chiamare la funzione &M9esult: se il valore restituito 8 L allora l%operazione 8 andata a
buon fne, diversamente il valore indica il tipo di errore (ad esempio GYfle non trovato, TYdisco
pieno ecc.

l%uso di una struttura di controllo ad alto livello specifca: gli ambienti di programmazione pi<
avanzati prevedono potenti strutture di programmazione per la gestione degli errori# ad esempio
l%>b]ect )ascal o/re il costrutto =tr- \ e+cept \% in cui dopo il termine =tr-% (tenta si mettono le
istruzioni che potenzialmente potrebbero causare errori# nella sezione =e+cept%, "uasi come in un
=case% si elencano, usando dei nomi signifcativi, gli errori che si intendono =intercettare% ed i
relativi sottoprogrammi scritti dal programmatore per gestirli# molti dialetti del Qasic (tra cui 2isual
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 8 &! 2L1
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
Qasic e 2isual Qasic for Application, 2QA, il linguaggio degli applicativi >Cce o/rono un costrutto
analogo: =on error \.%
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a N &! 2L1
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
E+E-PIO CO-PLETO 8
L9e(e"#!o (e4)ete "o(t$a co"e #$oce&e$e a%%a c$ea*!oe &! ) +!%e cot$o%%a&o #$!"a (e e e(!(te 4!> )o
5ecc,!o.
Se e(!(te %9o#e$a*!oe &! reset 5a a 6)o +!e e #o((!a"o acco$4e$cee &a% 5a%o$e L $e(t!t)!to &a%%a +)*!oe
+35esult: ! 7)e(to ca(o (! c,!e&e co+e$"a a c,! (ta )(a&o !% #$o4$a""a #$!"a &! #$oce&e$e co )a rewrite
&!(t$)tt!5a.
Se o e(!(te %9o#e$a*!oe &! reset +a%%!(ce e #o((!a"o acco$4e$cee &a% 5a%o$e &!5e$(o &a L $e(t!t)!to &a%%a +)*!oe
+35esult: ! 7)e(to ca(o (! #)0 #$oce&e$e co )a rewrite &!(t$)tt!5a (e*a c,!e&e$e co+e$"a.
t1pe
0ersona@record
cognome: stringH,6I( "J e' obbligatorio de%nire il numero dei caratteri della stringa K J#
codice: integer(
end(
fpersona@%le of 0ersona( "J senza il tipo non potremmo passare un %le come parametro J#
var
elenco: fersona(
begin
"J la riga che segue abilita alla gestione degli errori e va inserita cosR com=! su una riga isolata(
se la vostra tastiera non ha le graSe vi ricordo che potete tenere premuto D$0 di sinistra e digitare
'), o ')7 sul tastierino numerico con tasto G+loc :um= del tastierino attivato J#
XY+-Z
assign(elenco/@c:[pro(a.dat@)'
reset(elenco)'
risposta::.&+.'
if +35esult:0 t1en
begin
writeln(@+l file esiste gia@@: procedoK (&+/3)@)'
readln(risposta)'
close(elenco)
end'
if risposta@=L&= then
begin
rewrite"elenco#(
ecc. ecc.
close"elenco#
end(
end.
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 1L &! 2L1
NOTA. Ne% ca(o 5o%e((!"o +a$e ) a44!o$a"eto o )a %ett)$a
&a ) +!%e %a %o4!ca (a$e66e (e"#%!ce"ete !5e$t!ta: (e o (!
$!e(ce a& a#$!$e !% +!%e c! (! +e$"aD (e c! (! $!e(ce (! #$oce&e G
IORe()%t +o$!(ce co&!c! )"e$!c! &!5e$(! a (eco&a &e%%e
(!t)a*!o! e 5o%e&o e((e$e #!< #$ec!(! #ot$e""o )(a$e ) case:
ca(e IORe()%t o+
1: G.
2: G.
E&.
Ecco ! co&!c! #!< co")! 2(e7)e*a co"#%eta e%%9,e%# ! %!ea
&e% t)$6o #a(ca% ce$ca&o B$) t!"e e$$o$ co&e(93
T F$ile not found
J F)ath not found
GP F0nvalid drive number
GLL FDis1 read error
GLG FDis1 write error
GLT F$ile not assigned
GLJ F$ile not open
GLU F$ile not open for input
GLP F$ile not open for output
GPL FDis1 is writeMprotected
GPT FDrive not read-
GPK FDis1 see1 error
GPV F'n1nown media t-pe
GPI F!ector 7ot $ound
GKT FXardware failure
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
E+E-PIO CO-PLETO 9
0n "uesto secondo esempio gestiamo una semplice scheda di dati anagrafci# per sfruttare al meglio
l%istruzione see1 immaginiamo che ogni scheda sia individuata da un codice numerico che facciamo
corrispondere alla sua posizione come record. 9uindi se si cerca la scheda con codice V si utilizza
see1(fle, K e cos? via. 0l codice viene mantenuto strettamente progressivo ed 8 assegnato in
automatico dal programma
9uesto esempio fa uso di procedure e funzioni con parametri. 0n alcuni casi fa anche il controllo degli
errori con i fle.
0l programma tiene sempre sotto controllo il numero dei record presenti nell%archivio (per poter
generare in automatico il codice da assegnare alle schede. 0n partenza, infatti, se il fle 8 vuoto mette
la variabile inseriti a zero altrimenti gli assegna il numero di record presenti nel fle. 0l programma tiene
poi aggiornato "uesto contatore ad ogni inserimento o cancellazione. La cancellazione non avviene in
modo fsico ma mettendo a $AL!, un boolean del record (campo attivo.
Le scelte di chi usa il programma sono gestite da una funzione menu che riceve l%elenco delle voci da
presentare (un vettore di stringhe e restituisce il valore della scelta fatta.
program )rova$ile3ipizzati#
(S e; necessario disabilitare l;intercettazione degli errori di 04> da
parte del 3urbo )ascal al fne di gestirli in modo personalizzato S
ic0Mj (S non cancellare A S
const 6Af`2>(0`6,7'YH#
t-pe
voci`menuYarra-gG..6Af`2>(0`6,7'e of string#
3)ersonaYrecord
codice: integer#
cognome: stringgJLe#
attivo: boolean# (S false: record da considerare cancellato S
end#
fDatiYfle of 3)ersona#
var
dati: fDati# i,scelta:integer# ultimo`codice,un(odice: longint#
nome$ile,riga: string# una)ersona: 3)ersona#
procedi: boolean# conferma: char#
menu`database: voci`
menu#
(S restituisce true se il fle il cui nome logico 8 passato come parametro esiste, false altrimenti S
function esiste(var f: fdati: boolean#
var esito: boolean#
begin
reset(f#
if 0>&esultYL then
begin
close(f#
esito:Ytrue
end
else
esito:Yfalse#
esiste:Yesito
end#
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 11 &! 2L1
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
(S riceve un vettore di stringhe ed il numero di "ueste da considerare e presentare come menu sullo
schermo# intitola anche il menu con un altro parametro stringa# restituisce il numero della voce del
menu scelta S
function menu(voci: voci`menu# n`voci: integer#titolo: string: integer#
var i,voce`scelta: integer#
begin
repeat
writeln(titolo#writeln#
for i:YG to n`voci do
writeln(vocigie#
write(;!cegli M_ ;#
readln(voce`scelta#
if (voce`scelta^G or (voce`scelta_n`voci then
begin
writeln(;!celta errataAA ('7 3A!3> ),& &0)&>2A&,;#
readln
end
until (voce`scelta_L and (voce`scelta^Yn`voci#
menu:Yvoce`scelta
end#
procedure visualizza`fle(var f: fDati#
var persona: 3)ersona#
begin
reset(f#
if io&esultYL then (S se riesco ad aprirlo signifca che non 8 vuoto \ S
begin
(S leggiamo tutti i record fno alla fne S
while not eof(f do
begin
read(f,persona#
if persona.attivo then (S salto i cancellati ... S
writeln(persona.codice, ; M ;,persona.cognome
end#
close(f
end
end#
begin (S )&>5&A66A )&07(0)AL, S
(S clrscr# S
nome$ile:Y;c:kanagrafe.dat;#
assign(dati,nome$ile#
ultimo`codice:YL#
if esiste(dati then
begin
reset(dati#
ultimo`codice:Yflesize(dati# (S flesize restituisce il n. di record S
end
else
begin
rewrite(dati#
ultimo`codice:YL
end#
close(dati#
(S preparo le voci del menu prima di usarlo S
menu`databasegGe:Y;G M Azzera archivio;#
menu`databasegTe:Y;T M 0nserimento nuovi nominativi;#
menu`databasegJe:Y;J M &icerca dati per codice;#
menu`databasegUe:Y;U M 6odifca dati;#
menu`databasegPe:Y;P M ,limina nominativo;#
menu`databasegKe:Y;K M 2isualizza Archivio;#
menu`databasegVe:Y;V M $ine >perazioni;#
repeat
scelta:Ymenu(menu`database,V,;5estione 7ominativi;#
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 12 &! 2L1
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
case scelta of
G:begin (S azzeramento S
if ultimo`codice_L then
begin
writeln(;Attualmente sono inseriti ;,ultimo`codice, ; nominativi# confermi distruzioneD (s4n;#
readln(conferma#
if (confermaY;s; or (confermaY;!; then
begin
rewrite(dati#
ultimo`codice:YL
end
end#
writeln(;$attoAA 0720> per continuare;#
readln
end#
T:begin (S inserimento S
inc(ultimo`codice#
with una)ersona do
begin
codice:Yultimo`codice#
write(;0nserire cognome: ;#
readln(cognome#
attivo:Ytrue
end#
reset(dati#
see1(dati, $ile!ize(dati# (S append ... S
write(dati,una)ersona#
close(dati
end#
J:begin (S ricerca S
if ultimo`codice_L then
begin
write(;0nserire il codice che interessa: ;#readln(un(odice#
if un(odice^Yultimo`codice then
begin
reset(dati#
see1(dati,un(odiceMG# (S i record sono numerati a partire da L S
read(dati,una)ersona#
if una)ersona.attivo then (S salto i cancellati ... S
writeln(una)ersona.codice, ; M ;,una)ersona.cognome
else
writeln(;7ominativo cancellato;
end
else
writeln(;(i sono solo ;,ultimo`codice,; nominativiA;
end
else
writeln(;$ile 2uoto;#
writeln(;0720> per continuare;#
readln#
end#
U:begin (S modifca S
if ultimo`codice_L then
begin
write(;0nserire il codice che interessa: ;#readln(un(odice#
if un(odice^Yultimo`codice then
begin
reset(dati#
see1(dati,un(odiceMG# (S i record sono numerati a partire da L S
read(dati, una)ersona#
if una)ersona.attivo then (S salto i cancellati ... S
begin
writeln(;2ecchi dati: ;,una)ersona.codice, ; M ;,una)ersona.cognome#
write(;0nserire nuovo cognome: ;#
readln(una)ersona.cognome#
(S per riscrivere devo rimettermi )&06A del record S
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 13 &! 2L1
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
see1(dati,un(odiceMG#
write(dati,una)ersona#
writeln(;$attoA;
end
else
writeln(;7ominativo cancellato;
end
else
writeln(;(i sono solo ;,ultimo`codice,; nominativiA;
end
else
writeln(;$ile 2uoto;#
writeln(;0720> per continuare;#
readln
end#
P:begin (S cancellazione S
if ultimo`codice_L then
begin
write(;0nserire il codice che interessa: ;#readln(un(odice#
if un(odice^Yultimo`codice then
begin
reset(dati#
see1(dati,un(odiceMG# (S i record sono numerati a partire da L S
read(dati, una)ersona#
(S dovrei chiedere conferma, ma per brevit ... S
if una)ersona.attivo then (S salto i cancellati ... S
begin
see1(dati,un(odiceMG#
una)ersona.attivo:Yfalse#
write(dati,una)ersona#
writeln(;$attoA;
end
else
writeln(;7ominativo gia;; cancellato;
end
else
writeln(;(i sono solo ;,ultimo`codice,; nominativiA;
end
else
writeln(;$ile 2uoto;#
writeln(;0720> per continuare;#
readln
end#
K: begin (S visualizzazione S
if ultimo`codice_L then
visualizza`fle(dati
else
writeln(;$ile 2uoto;#
writeln(;0720> per continuare;#
readln
end
end
until sceltaYV#
e&.
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 14 &! 2L1
Ricorsione Q "ersione 9';9 3 De$$raio 9;;=
AIC&A:I&NE
E(!(too #$o6%e"! t)tto (o""ato (e"#%!c! &a &e(c$!5e$e c,e #o$tao a& a%4o$!t"! !c$e&!6!%"ete co"#%!cat! (e
t$attat! co 4%! (t$)"et! &! #$o4$a""a*!oe 5!(t! (!o a& o$aG A& e(e"#!o: "o%te (!t)a*!o! $ea%! (oo a&atte #e$
e((e$e $a##$e(etate co )a (t$)tt)$a c,!a"ata albero. U a%6e$o / +o$"ato &a e%e"et! c,!a"at! nodi co%%e4at! &a
arc1i:
Ne% &!(e4o ! nodi (oo $a##$e(etat! &a! ce$c,!ett!' 4%! arc1i &a! (e4"et!
c,e %! co4!)4oo. I $ea%t> (! t$atta &! ) ca(o #a$t!co%a$e &! a%6e$o
c,!a"ato albero binario' ! 7)ato o4! o&o #)0 a5e$e a% "a((!"o &)e
+!4%! 2"a ac,e )o o e(()o3. H%! a%6e$! #!< co"#%e((! 2generici' (e*a
%!"!t! ()% )"e$o &! +!4%!3 #o((oo co")7)e e((e$e $a##$e(etat! co )
a%6e$o 6!a$!o co(t$)!to ! "o&o B+)$6o9 2(co#$!$ete #!< a5at! e% co$(o
co"e G3.
I% o&o !!*!a%e' 7)e%%o ! c!"a #e$ !te&e$c!' / c,!a"ato root 2$a&!ce3. I
o&! te$"!a%! 27)e%%! (e*a +!4%!3 (oo c,!a"at! foglie. I +!4%! &!$ett! &! )o
(te((o o&o (oo fratelli t$a %o$o.
A)a%c,e e(e"#!o &9)(o: ! ) 4!oco ) a%6e$o #)0 $a##$e(eta$e #e$ o4! #o((!6!%e B"o((a9 %e $!(#o(te
&e%%9a55e$(a$!o e #e$ c!a(c)a &! 7)e(te %e #o((!6!%! cot$o"o((e e co(; 5!aD ! (!(te"! o#e$at!5! )t!%!**ao (t$)tt)$e a&
a%6e$o #e$ "e"o$!**a$e %a (t$)tt)$a &e%%e ca$te%%e e $e%at!5e (otto ca$te%%eD ) a%6e$o 4eea%o4!coD %9o$4a!4$a""a
&e%%e +!4)$e &! )9a*!e&a 26o((' ca#! $e#a$to' &!#e&et! ecc.3D a%c)e &e%%e tec!c,e #!< (o+!(t!cate &! 4e(t!oe &e4%!
a$c,!5! )(ao (t$)tt)$e a& a%6e$o 2BS t$ee3.
E9 o55!o c,e c!0 c,e cota / !% Bcote)to9 &! o4! o&o. 1e$ ) 4!oco 2(cacc,! a& e(e"#!o3 o4! o&o #ot$e66e
"e"o$!**a$e %a (!t)a*!oe a##ea #$!"a o a##ea &o#o )a ce$ta "o((a 2%a "at$!ce &e%%a (cacc,!e$a3. I% (!(te"a
o#e$at!5o #ot$e66e "e"o$!**a$e %9e%eco &e! +!%e ! 7)e%%a &!$ecto$8 2o / #$o#$!o co(; G3D #e$ %9a%6e$o 4eea%o4!co
! &at! aa4$a+!c! &e%%a #e$(oa a((oc!ata a c!a(c) o&o ecc.
Ma co"e (! $a##$e(etao 4%! a$c,!C La (o%)*!oe c%a((!ca #$e5e&e %a 4e(t!oe t$a"!te "e"o$!a &!a"!ca: o4! o&o
"e"o$!**a ! #)tato$! a! +!4%!. A& e(e"#!o:
t8#e
1)PbNo&oD
No&oP$eco$&
1a$teI+o$"at!5a: (t$!4D
(K: 1)D 2Q "e"o$!**a !% #)tato$e a% +!4%!o &! (!!(t$a Q3
&K: 1) 2Q "e"o$!**a !% #)tato$e a% +!4%!o &! &e(t$a Q3
e&
O]' !""a4!!a"o &! a5e$e %9a%6e$o 4!> #e$+etta"ete co(t$)!to e c,e %a 5a$!a6!%e #)tato$e inizio #)t! a% #$!"o
o&o 2root3. E& ecco %a (+!&a: (c$!5e$e ) #$o4$a""a c,e (ta"#! %9e%eco &! t)tte %e #a$t! !+o$"at!5e "e"o$!**ate
e%%9a%6e$o. E9 )a $!c,!e(ta 6aa%e: (e o $!)(c!((!"o a +a$e a%"eo 7)e(to %9a%6e$o (a$e66e !)t!%!**a6!%e= Da )
#)to &! 5!(ta %o4!co (! t$atta &! (isitare t)tt! ! o&! e #e$ c!a(c)o (ta"#a$e %a #a$te !+o$"at!5a. S+!&o c,!)7)e a
t$o5a$e )a (o%)*!oe c,e +acc!a )(o &! c!c%!: e((a e(!(te "a / &! ele"ata co"#%e((!t>. E9 ac,e 7)a(! !co"#$e(!6!%e
G E& / #)$e %)4a a%c)e &ec!e &! $!4,e. H)a$&ate !5ece %9e%e4a*a' %a (e"#%!c!t> e %9e(t$e"a %e44!6!%!t> &! 7)e(ta
(o%)*!oe 2ricorsi"a3:
A)to$e: Fa6$!*!o Ca")(o 2ca")(oa6!4+oot.co"3 1a4!a 15 &! 2L1
Ra&!ce 2$oot3
o&o
a$co
+o4%!a
+!4%!o
+$ate%%!
Allocazione dinamica della memoria versione 2.5 :uglio 200'
procedure &tampa%lbero(nodo: pun)'
begin
if nodo;9+= t1en
begin
1. writeln(nodo\.!arte+nformati(a)'
2. &tampa%lbero(nodo\.s8)'
". &tampa%lbero(nodo\.d8)
end
end'
1 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
NOTA/ 4o numerato le ri#4e per
%acilitare il successi"o commento
del codice'
Allocazione dinamica della memoria versione 2.5 :uglio 200'
Co(!&e$a&o %9!+9 (oo (o%o (e! $!4,e === Se"6$a 7)a(! !"#o((!6!%eG La (ta"#a co"#%eta / co"a&ata co
&tampa%lbero(inizio) &o5e inizio / !% #)tato$e a% #$!"o o&o &e%%9a%6e$o 2%a $a&!ce3. La %o4!ca &! e(ec)*!oe / a((a!
(e"#%!ce: (ta"#a$e %a #a$te !+o$"at!5a &e% o&o &! c)! (! / $!ce5)to !% #)tato$e e c,!a"a$e 7)!&! #$!"a %a (ta"#a
#e !% +!4%!o &! (!!(t$a 2 &tampa%lbero(nodo\.s8) 3 e #o! #e$ 7)e%%o &! &e(t$a 2 &tampa%lbero(nodo\.d8) 3. I%
"ecca!("o (! $!#ete ()! $!(#ett!5! +!4%! (!!(t$a-&e(t$a +!o a $a44!)4e$e %e +o4%!e.
La #$oce&)$a c,!a"a 7)!&! (E (te((a 2$!co$$e a! (e$5!*! &! (E (te((a' &a c)! !% te$"!e ricorsione3 "a o4! 5o%ta
#a((a&o ) #)tato$e c,e %a +a a55!c!a$e a%%e +o4%!e. Co 7)e(te )%t!"e 5e$$ao c,!a"ate &e%%e BSta"#aA%6e$o9
co #a$a"et$o )4)a%e a NIL 2%e +o4%!e o ,ao o&! (otto &! e((e e 7)!&! ,ao !% 5a%o$e NIL e! %o$o #)tato$! s8
e d83 te$"!a&o %a catea &e%%e c,!a"ate.
E9 "o%to !"#o$tate ca#!$e c,e ! ) ce$to !(tate a5$e"o #!< co#!e &e%%a #$oce&)$a &tampa%lbero att!5ate 2"a )a
(o%a B+)*!oate93. I+att! %a #$!"a c,!a"ata 2 Sta"#aA%6e$o2!!*!o3 3 c,!a"a (E (te((a co !% #)tato$e a% ()o +!4%!o
&! (!!(t$a e &e5e #o! %ette$a%"ete $!"ae$e ! atte(a a%%a $!4a . 2 a(#etta&o %a +!e &e%%9e(ec)*!oe &!
&tampa%lbero(inizio\.s8). E 7)e(t9)%t!"a &o#o a5e$ (ta"#ato %a #a$te !+o$"at!5a &e% ()o o&o a(#ette$> a%%a (te((a
$!4a #e$ %o (te((o "ot!5o e co(; 5!a. R!+e$e&o(! a% &!(e4o #$ece&ete' 5e$$ao c,!a"ate ! (e7)e*a 6e 4
&tampa%lbero c,e e(#%o$ao t)tto %a #a$te a (!!(t$a &e%%9a6e$o' +!o a $a44!)4e$e %a #$!"a +o4%!a 2%9)%t!"o o&o !
6a((o a (!!(t$a3. So%o &o#o c,e !% "ecca!("o a5$> +atto e(#%o$a$e t)tt! ! o&! a (!!(t$a &e%%a $a&!ce' %a #$oce&)$a
c,e ,a $!ce5)to inizio co"e #)tato$e e c,e / (tata +!o a& o$a ! atte(a #ot$> cot!)a$e %a ()a e(ec)*!oe e
c,!a"a$e (E (te((a ()% +!4%!o &! &e(t$a: &! )o5o (! "ette ! atte(a #e$ %a +!e &e%%9e(ec)*!oe &! 7)e(ta c,!a"ata c,e
#$!"a +a$> e(#%o$a$e t)tt! ! o&! a%%a &e(t$a &e%%a $a&!ce. So%o a%%o$a %a #$!"a #$oce&)$a te$"!e$> B$a44!)4e&o !%
()o e&9.
A)a&o %a #$oce&)$a / c,!a"ata co NIL o +a !ete "a (! %!"!ta a te$"!a$e' (e*a $!c,!a"a$e #!< (E (te((a e&
!te$$o"#e&o %a catea &e%%e c,!a"ate. E9 "o%to !"#o$tate c,e (! $a44!)4a )a (!t)a*!oe &! te$"!a*!oe:
&!5e$(a"ete (! a&$e66e a5at! +!o a%%9e(a)$!"eto &e%%a "e"o$!a "e((a a &!(#o(!*!oe #e$ %a $!co$(!oe 2(tacJ3
"a&a&o ! c$a(, !% #$oce((o &! e(ec)*!oe e' +o$(e' ca)(a&o ac,e !% 6%occo &e%%9e%a6o$ato$e.
U a%4o$!t"o $!co$(!5o co$$etto #$!"a o #o! !5ece (! +e$"a #e$c,E $a44!)4e %a co&!*!oe &! te$"!a*!oe c,e /
c,!a"ata %a $ase della ricorsione 2! $ea%t> #ot$e66e aco$a e(a)$!$e %a "e"o$!a (e ,a 6!(o4o &! t$o##! #a((! #e$
e((e$e coc%)(o' "a cocett)a%"ete %9a%4o$!t"o / co$$etto3. 1e(ate a%%a 6a(e &e%%a $!co$(!oe co"e a% ca(o c,e
te$"!a %a Bcatea9 &e%%e c,!a"ate. Ne% o(t$o e(e"#!o %a 6a(e / $a##$e(etata &a nodo:+=: %a co&!*!oe &e%%9if
o / 5e$!+!cata e %a #$oce&)$a o +a )%%a 2(o#$att)tto te$"!a e o +a a%t$e c,!a"ate a (e (te((a3.
E9 ac,e !"#o$tate ota$e c,e o4! c,!a"ata $!co$(!5a !"#e4a %a #$oce&)$a co ) #$o6%e"a #!< (e"#%!ce
&e%%9o$!4!a%e: %a #$!"a #$oce&)$a att!5ata &e5e (ta"#a$e %9!te$o a%6e$oD %a (eco&a !% (ottoa%6e$o &! (!!(t$a' %a te$*a
!% (ottoa%6e$o &! (!!(t$a aco$a e co(; 5!a +!o a c,e' ! #$o+o&!t>' )a #$oce&)$a $!ce5e$> ) #)tato$e a& )a
+o4%!aD a 7)e(to #)to a55!ee %9)%t!"a c,!a"ata a%%a #$oce&)$a c,e $!ce5e$> ) #)tato$e NIL: %a #$oce&)$a o +a
)%%a e %a Bcatea9 (! +e$"a.
NOTA: LA 1ARTE CHE SEHUE 21 1AHINA3 E9 UN A11ROFONDIMENTO 1IUTTOSTO DIFFICILE DA
SEHUIRE. E9 FACOLTATI:A.
ATTENZIONE: DO1O LA 1ARTE FACOLTATI:A LA DIS1ENSA 1ROSEHUE==
2 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
Sta"#aA%6e$o2!!*!o3
Sta"#aA%6e$o2!!*!ob.(K3
Sta"#aA%6e$o2!!*!ob.&K3
Sta"#aA%6e$o2!!*!ob.(Kb.(K3
Sta"#aA%6e$o2!!*!ob.&Kb.&K3
)
)
Sta"#aA%6e$o2!%3
Sta"#aA%6e$o2!%3
Sta"#aA%6e$o2!%3
Allocazione dinamica della memoria versione 2.5 :uglio 200'
E(a"!!a"o ! &etta4%!o co(a acca&e: %a #$oce&)$a 5!ee !5ocata )a #$!"a 5o%ta e $!ce5e !% #)tato$e a% #$!"o
o&o. Se 7)e(to / NIL 2c!o/ (e %9a%6e$o / 5)oto3 (! +e$"a ()6!to' co"e &e5e e((e$e. A%t$!"et! (ta"#a %a #a$te
!+o$"at!5a &e% #$!"o o&o. 1o! !5oca (e (te((a ()% +!4%!o &! (!!(t$a co %9!(t$)*!oe &tampa%lbero(nodo\.s8). A
7)e(to #)to %e #$oce&)$e att!5ate (oo &)e= La #$!"a a& e((e$e c$oo%o4!ca"ete c,!a"ata' &tampa%lbero(inizio)'
c,e rimane in attesa a%%a $!4a 2 a(#etta&o !% te$"!e &! &tampa%lbero(nodo\.s8) c,e $a##$e(eta %a (eco&a
#$oce&)$a att!5ata ! o$&!e &! te"#o. E9 "o%to !"#o$tate ca#!$e c,e %9!(t$)*!oe &e%%a $!4a 3'
&tampa%lbero(nodo\.d8)' &e%%a #$!"a #$oce&)$a att!5ata o 5e$$> e(e4)!ta +!o a c,e o te$"!e$> 7)e%%a &e%%a $!4a
2.
La (eco&a #$oce&)$a att!5ata !!*!a %a ()a e(ec)*!oe e (ta"#a %a #a$te !+o$"at!5a &e% o&o #)tato &a% #a$a"et$o
c,e ,a $!ce5)to 2(e &!5e$(o &a NIL3. 1o! e++ett)a a ()a 5o%ta )a c,!a"ata $!co$(!5a' att!5a&o )a te$*a co#!a &e%%a
#$oce&)$a &tampa%lbero !5!a&o co"e #a$a"et$o !% #)tato$e a% ()o +!4%!o &! (!!(t$a. E co(; 5!a. Ecco
(c,e"at!**ata %a (e7)e*a ()% &!(e4o &e%%9a%6e$o:
5estione dello stacR per la ricorsione
T)tte 7)e(te B!ca$a*!o!9 &e%%a (te((a #$oce&)$a co&!5!&oo %o (te((o co&!ce. No (! #e(! c!o/ c,e (e !%
"ecca!("o $!co$(!5o ,a 6!(o4o &! 2L c,!a"ate' ! "e"o$!a (!a #$e(ete 2L 5o%te !% co&!ce &e%%a #$oce&)$a. A)e%%o
c,e acca&e / c,e 7)a&o )9!ca$a*!oe &! )a #$oce&)$a a& ) 7)a%c,e #a((o &e%%a $!co$(!oe ,a 6!(o4o &!
c,!a"a$e (E (te((a' !% ()o stato 2)a ()a co#!a &e%%e 5a$!a6!%! %oca%! co ! 5a%o$! +!o a 7)e% "o"eto ca%co%at! e )
B(e4a%!6$o9 a%%9!(t$)*!oe c)! e$a a$$!5ata3 / "e"o$!**ato ! ) a$ea &! "e"o$!a (#ec!a%e' c,!a"ata stac8. A)a&o !%
cot$o%%o / $e(t!t)!to' ac,e "o%t! #a((! &o#o' a& )a #$oce&)$a' !% ()o (tato / $!#$e(o &a%%o stacU e& e((a #)0
cot!)a$e &a% #)to ! c)! e$a (tata !te$$otta. Lo stacU / )a (t$)tt)$a &!a"!ca (094 2La(t I F!$(t O)t3 ! c)!
%9)%t!"o &ato !(e$!to / !% #$!"o c,e #)0 e((e$e $!#$e(o. 1e$ +a$e ) #a$a4oe #e(ate a& )a #!%a &! #!att!: %9)%t!"o
#!atto %a5ato (a$> !% #$!"o a& e((e$e $!#$e(o #e$ !% $!(c!ac7)o. A)e(to "o&o &! +)*!oa$e / e((e*!a%e #e$ #ote$
acce&e$e e%%9o$&!e 4!)(to a4%! (tat! &e%%e &!5e$(e #$oce&)$e: !+att! / 7)e%%a c,!a"ata #e$ )%t!"a c,e $!a5$> !%
cot$o%%o #e$ #$!"a e cot!)e$0 &a% #)to ! c)! e$a (tata !te$$otta. O((e$5a&o !% 4$a+!co #$ece&ete: %a 3 c,!a"a %a
4 2e %o (tato &e%%a 3 5!ee (a%5ato3D %a 4 c,!a"a %a 5 2e %o (tato &e%%a 4 5!ee (a%5ato3D %a 5 +!!(ce: &e5e $!#$e&e$e %a
4' / !% ()o (tato c,e (e$5e' o 7)e%%o &e%%a 3= La 4' c,!a"ata #e$ )%t!"a' ,a 6!(o4o #$!"a &e%%a 3 &e% ()o (tato: 4%!
(tat! &e5oo e((e$e $!#$!(t!at! e%%9o$&!e !5e$(o ! c)! (oo (tat! (a%5at!. Uo (tacJ 2$ea%!**ato co"e ) 5etto$e &!
68te ! )a *oa &e%%a RAM3 (! co"#o$ta e(atta"ete ! 7)e(to "o&o. Ne%%a (!")%a*!oe (otto(tate' #$oc (ta #e$
#$oce&)$a.
3 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
8
NIL
9
<
@
=
A
B
89
88
NIL
?
NIL
>
8;
I )"e$! !&!cao o55!a"ete %a (e7)e*a c$oo%o4!ca. So%o 7)e%%! 5!c!o a%%e
+$ecce cot!)e !&!cao #e$0 %9att!5a*!oe &! )a )o5a B!ca$a*!oe9 &e%%a
#$oce&)$a. Le +$ecce t$atte44!ate !&!cao !% $a44!)4!"eto &e%%a base della
ricorsione c,e +a te$"!a$e' $e%at!5a"ete a 7)e%%a #a$te &e%%9a%6e$o' %a catea
&e%%e c,!a"ate. A& e(e"#!o' %a #$oce&)$a att!5a a% #)to 4' &o#o a5e$
(ta"#ato %a ()a #a$te !+o$"at!5a +a %a c,!a"ata $!co$(!5a #a((a&o co"e
#a$a"et$o NIL 2!+att! o ,a +!4%!3. La #$oce&)$a c,!a"ata 2#)to 53 o +a
a%%o$a )%%a e te$"!a. I% cot$o%%o $!to$a a%%o$a a%%a #$oce&)$a &e% #)to 4
2(e4)!te %a +$ecc!a t$atte44!ata )"e$ata 63 c,e / ! atte(a a%%a $!4a 2 &e%
co&!ce e c,e #)0 +!a%"ete +a$e %a (eco&a c,!a"ata $!co$(!5a
2co$$!(#o&ete a%%a $!4a 3 &e% co&!ce3 #a((a&o aco$a NIL 2ac,e !% +!4%!o &!
&e(t$a o e(!(te3. La #$oce&)$a !5ocata 2)"e$ata co 73 te$"!a e
$e(t!t)!(ce !% cot$o%%o aco$a )a 5o%ta a 7)e%%a )"e$ata co 4. A)e(t9)%t!"a
,a !+!e e(a)$!to %e ()e !(t$)*!o! e te$"!a' $e(t!t)e&o !% cot$o%%o a 7)e%%a
)"e$ata co 3' c,e c,!a"a 1L' c,e c,!a"a 11 2co !%3 e co(; 5!a G
Stato #$oc 1
Stato #$oc 1
Stato #$oc 2
Stato #$oc 1
Stato #$oc 2
Stato #$oc 3
Stato #$oc 1
Stato #$oc 2
Stato #$oc 3
Stato #$oc 4
Stato #$oc 1
Stato #$oc 2
Stato #$oc 3
Proc 1 c%iama proc 2
:o stato di proc 1
viene salvato sullo
stacG
Proc 1 H messa in
attesa
Proc 2 c%iama proc '
:o stato di proc 2
viene salvato sullo
stacG
Proc 2 H messa in
attesa
Proc 1 H sempre in
attesa
Proc ' c%iama proc )
:o stato di proc '
viene salvato sullo
stacG
Proc ' H messa in
attesa
Proc 1 e 2 sono
sempre in attesa
Proc ) c%iama proc 5
:o stato di proc )
viene salvato sullo
stacG
Proc ) H messa in
attesa
Proc 1C 2 e ' sono
sempre in attesa
Proc 5 termina
:o stato di proc )
viene tolto dallo stacG
Proc ) riprende dalla
riga alla 3uale si era
interrotta
Proc 1C 2 e ' sono
sempre in attesa
Allocazione dinamica della memoria versione 2.5 :uglio 200'
RI1RENDE LA 1ARTE NON FACOLTATI:A DELLA DIS1ENSA==
I a%c)! #$o6%e"! / #$o#o!6!%e (!a )a (o%)*!oe !te$at!5a 2co ! c!c%!3 c,e $!co$(!5a. A)e(t9)%t!"a $!()%te$> #!<
%eta e%%9e(ec)*!oe e co()"e$> #!< "e"o$!a 2(a%5a$e %o (tato occ)#a te"#o e (#a*!o3 "a #!< at)$a%e (e !%
#$o6%e"a ,a )a at)$a e((a (te((a $!co$(!5a. I 7)e(t! )%t!"! ca(! (#e((o %a (o%)*!oe $!co$(!5a / MOLTO #!<
(e"#%!ce &a #$o4$a""a$e' a% #)to &a $!()%ta$e %9)!ca (t$a&a #e$co$$!6!%eG La $!co$(!oe (! / $!5e%ata )o
(t$)"eto a((a! )t!%e e% ca"#o &e%%9Ite%%!4e*a A$t!+!c!a%e 2IA3 &o5e (t$)tt)$e co"#%e((e co"e 4%! a%6e$! (oo
a%%9o$&!e &e% 4!o$o #e$ $a##$e(eta$e %a coo(ce*a e& !% #e$co$(o &ec!(!oa%e #e$ %a (o%)*!oe &! ) #$o6%e"a.
LS(.CFE E:EGPI& DI :&''&PA&CA(GG( AIC&A:IQ&
1e$ &e+!!$e ) a%4o$!t"o $!co$(!5o &o66!a"o (e"#$e !&!5!&)a$e:
E(e"#!o 1: ca%co%o &e% +atto$!a%e.
I&!c,!a"o co Gatt() !% +atto$!a%e &! ) )"e$o !te$o [PL. E9 !% #$o&otto &! t)tt! 4%! !te$! &a 1 a N. A& e(e"#!o
Fatt263 P 6 Q 5 Q 4 Q 3 Q 2 Q 1. 1e$ &e+!!*!oe (! (ta6!%!(ce c,e Fatt2L3 / 1. E9 )a +)*!oe a((a! )(ata !
"ate"at!ca: a& e(e"#!o e% ca%co%o &e%%e #$o6a6!%!t> 2co"6!a*!o!' &!(#o(!*!o! (e"#%!c! o co $!#et!*!oe'
coe++!c!et! 6!o"!a%! ecc.3.
L9o6!ett!5o / &a$e )a &e+!!*!oe $!co$(!5a 2e(#$!"e$e ) +atto$!a%e )(a&o aco$a ) +atto$!a%e "a ca%co%ato () )
5a%o$e #!< (e"#%!ce3. S! $a4!oa co(;: 7)a% / !% ca(o #!< (e"#%!ce &! ca%co%o &e% +atto$!a%eC A)a&o N / L: !+att!
#o((!a"o ()6!to a++e$"a$e (e*a 6!(o4o &! +a$e ca%co%! c,e !% $!()%tato / 1. E (e &o66!a"o ca%co%a$e Fatt243C I%
$!()%tato !""e&!ato o %o #o((!a"o ca%co%a$e "a #o((!a"o &!$e c,e / 4 Q Fatt233. I+att! Fatt233P3Q2Q1 e 7)!&!
4QFatt233 e7)!5a%e a 4 Q 3Q2Q1' !% ca%co%o &! #a$te*a.
A66!a"o a%%o$a $!co&otto ) ca(o #!< co"#%e((o' Fatt243' a% ca%co%o &! ) ca(o #!< (e"#%!ce' Fatt233. Co"e &!$e:
o (o ca%co%a$e &!$etta"ete Fatt243 "a (e $!e(co a ca%co%a$e Fatt233 $!(a%4o att$a5e$(o )a "o%t!#%!ca*!oe a Fatt243.
Fatt233 / aco$a t$o##o B&!++!c!%e9 &a ca%co%a$e "a %o (! $!co&)ce a Fatt223: Fatt233 P 3 Q Fatt223. Fatt223 P 2 Q
Fatt213. Fatt213 P 1 Q Fatt2L3. Ma Fatt2L3 (o c,e 5a%e )o (e*a 6!(o4o &! $!ca%co%a$e e(() a%t$o +atto$!a%e: ,o
$a44!)to !% ca(o 6a(e' %a 6a(e &e%%a $!co$(!oe c,e te$"!a %a catea &e%%e c,!a"ate $!co$(!5e=
Sc,e"at!ca"ete
Fatt2N3 P
4 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
=a base della ricorsione: / !% ca(o #!< (e"#%!ce' 7)e%%o #e$ !% 7)a%e (a##!a"o ()6!to Bca%co%a$e9 !%
$!()%tato. A)e%%o a c)! !% "ecca!("o $!co$(!5o teta &! $!co&)$(! ) #oco a%%a 5o%ta' #a((o &o#o
#a((o.
+l passo ricorsi(o: 7)a&o o (!a"o &! +$ote a% ca(o #!< (e"#%!ce &o66!a"o teta$e &!
e(#$!"e$%o att$a5e$(o )a B+o$")%a9 c,e $!c,!a"a %o (te((o (otto#$o4$a""a c,e (t!a"o (c$!5e&o
ma con argomenti semplificati c,e c! a55!c!ao a% ca(o c,e $a##$e(eta %a 6a(e &e%%a $!co$(!oe
1 se PL
0 Gatt(-1) se 90
+)ct!o Fatt2N: !te4e$3: $ea%D
6e4!
!+ NPL t,e
Fatt:P1
e%(e
Fatt:P N Q Fatt2NM13
e&D
NOTA: co"e 5a%o$e $e(t!t)!to ,o (ce%to ) real ! 7)ato !%
ca%co%o &e% +atto$!a%e "o%to $a#!&a"ete #o$ta a%
()#e$a"eto &e%%a ca#ac!t> &! )a 5a$!a6!%e integer.
Allocazione dinamica della memoria versione 2.5 :uglio 200'
E(e"#!o 2: ca%co%o &! K
8
co K e& 8 !te$! #o(!t!5!.
I&!c,!a"o co #allaM(8/J) !% (otto#$o4$a""a.

L9o6!ett!5o / &a$e )a &e+!!*!oe $!co$(!5a 2e(#$!"e$e )a #ote*a )(a&o aco$a )a #ote*a "a ca%co%ata () )
5a%o$e #!< (e"#%!ce3. S! $a4!oa co(;: 7)a% / !% ca(o #!< (e"#%!ce C A)a&o (! c,!e&e &! e%e5a$e ) )"e$o a%%a *e$o.
I 7)e(to ca(o !+att! #e$ &e+!!*!oe !% $!()%tato / 1. U )"e$o e%e5ato a%%a #$!"a #)0 e((e$e ca%co%ato co"e !%
)"e$o (te((o "o%t!#%!cato %a ()a #ote*a *e$o. I+att! K
1
P K Q K
L
P K Q 1 P K. A66!a"o a%%o$a $!co&otto ) ca(o
#!< co"#%e((o a% ca%co%o &! )o &! c)! (a##!a"o ()6!to !% $!()%tato 2K
L
3. O$a c,e (a##!a"o ca%co%a$e ) )"e$o
e%e5ato a%%a #$!"a (!a"o ! 4$a&o &! ca%co%a$e ! 7)a&$at!' I+att! ) )"e$o a% 7)a&$ato #)0 e((e$e ca%co%ato co"e !%
)"e$o (te((o "o%t!#%!cato #e$ %a ()a #ote*a #$!"a: K
2
P K Q K
1
. E co(; 5!a: K
3
P K Q K
2
P K Q K Q K
1
P K Q K Q K Q K
L
D
K
4
P K Q K
3
ecc.
A66!a"o a%%o$a $!co&otto ! 4ee$a%e ) ca(o #!< co"#%e((o' K
8
' a% ca%co%o &! ) ca(o #!< (e"#%!ce' K Q K
8M1
.
Sc,e"at!ca"ete
Ta%%aU2K'83 P
E(e"#!o 3: ca%co%o &! KQ8 co K e& 8 !te$!' 8Z[L.
I&!c,!a"o co #perM(8/J) !% (otto#$o4$a""a.

L9o6!ett!5o / &a$e )a &e+!!*!oe $!co$(!5a 2e(#$!"e$e ) #$o&otto )(a&o aco$a ) #$o&otto "a ca%co%ato () )
5a%o$e #!< (e"#%!ce3. S! $a4!oa co(;: 7)a% / !% ca(o #!< (e"#%!ce C A)a&o (! c,!e&e &! "o%t!#%!ca$e ) )"e$o #e$
1: !% $!()%tato / !% )"e$o (te((o. Se !5ece &o66!a"o ca%co%a$e ) )"e$o #e$ 2 #o((!a"o e(#$!"e$e !% ca%co%o co"e
!% )"e$o (o""ato a% #$o&otto &e% )"e$o #e$ 1: K Q 2 P K S 2KQ13. D! )o5o a66!a"o $!co&otto ) #$o&otto
co"#%e((o a% ca%co%o &! ) #$o&otto #!< (e"#%!ce &! c)! (a##!a"o ()6!to !% $!()%tato 2KQ13. E co(; 5!a: K Q 3 P K S KQ2
P K S K S KQ1D K Q 4 P K S K Q 3 ecc.
Sc,e"at!ca"ete
T#e$U2K'83 P
Nota: "ate"at!ca"ete ) #$o&otto / ! e++ett! )a (o""a $!#et)ta G K Q 4 P K S K S K S K c,e / e(atta"ete
7)ato +a %a $!co$(!oe=
5 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
1 se J PL
8 0 #allaM(8/J-1) se J90
+)ct!o Ta%%aU2K'8: !te4e$3: $ea%D
6e4!
!+ 8PL t,e
Ta%%aU:P1
e%(e
Ta%%aU:P K Q Ta%%aU2K'8M13
e&D
NOTA: co"e 5a%o$e $e(t!t)!to ,o (ce%to ) real ! 7)ato !%
ca%co%o &! )a #ote*a "o%to $a#!&a"ete #)0 #o$ta$e a%
()#e$a"eto &e%%a ca#ac!t> &! )a 5a$!a6!%e integer.
8 se J P1
8 L #perM(8/J-1) se J90
+)ct!o T#e$U2K'8: !te4e$3: $ea%D
6e4!
!+ 8P1 t,e
T#e$U:PK
e%(e
T#e$U:P K S T#e$U2K'8M13
e&D
NOTA: co"e 5a%o$e $e(t!t)!to ,o (ce%to ) real ! 7)ato !%
ca%co%o &! #$o&otto #)0 #o$ta$e a66a(ta*a +ac!%"ete a%
()#e$a"eto &e%%a ca#ac!t> &! )a 5a$!a6!%e integer.
Allocazione dinamica della memoria versione 2.5 :uglio 200'
E(e"#!o 4: ca%co%o &! KS8 co K e& 8 !te$!.
I&!c,!a"o co #piuM(8/J) !% (otto#$o4$a""a.

L9o6!ett!5o / &a$e )a &e+!!*!oe $!co$(!5a 2e(#$!"e$e )a (o""a )(a&o aco$a )a (o""a "a ca%co%ata () )
5a%o$e #!< (e"#%!ce3. S! $a4!oa co(;: 7)a% / !% ca(o #!< (e"#%!ce C A)a&o (! c,!e&e &! (o""a$e *e$o a& ) )"e$o:
!% $!()%tato / !% )"e$o (te((o. Se !5ece &o66!a"o (o""a$e 1 #o((!a"o e(#$!"e$e !% ca%co%o co"e 1 #!< !% $!()%tato
&e%%a (o""a t$a !% )"e$o e LD !+att!: K S 1 P 1 S 2KSL3. D! )o5o a66!a"o $!co&otto ) #$o&otto co"#%e((o a%
ca%co%o &! ) #$o&otto #!< (e"#%!ce &! c)! (a##!a"o ()6!to !% $!()%tato 2KSL3. E co(; 5!a: K S 4 P 1 S 2KS33 P 1 S 1 S
2KS23 P 1 S 1 S 1 S 2KS13 P 1 S 1 S 1 S 1 S 2KSL3 P 1 S 1 S 1 S 1 S K.
Sc,e"at!ca"ete
T#!)U2K'83 P
E(e"#!o 5: ca%co%o &e%%a (e$!e &! F!6oacc! 2e(e"#!o &! &o##!a c,!a"ata $!co$(!5a3
La (e$!e &! F!6oacc! / %a (e4)ete: L 1 1 2 3 5 8 13 21 34 55 G &o5e o4! e%e"eto / %a (o""a &e! &)e #$ece&et!
2a& ecce*!oe &e% #$!"o e &e% (eco&o c,e (oo #e$ &e+!!*!oe L e& 13.
I&!c,!a"o co Gib() %9ee(!"o )"e$o &e%%a (e7)e*a 2(! #a$te &a%%a #o(!*!oe L=3. A& e(e"#!o F!62L3PLD
F!6213P1D 2D F!6273P13.

L9o6!ett!5o / &a$e )a &e+!!*!oe $!co$(!5a: ) )"e$o 5e$$> a##)to e(#$e((o co"e (o""a &e! 2 )"e$! &!
F!6oacc! c,e %o #$ece&oo' +!o a! #$!"! &)e c,e (oo +!((at! #e$ &e+!!*!oe. F!6243 P F!6233 S F!6223 P
F!6223SF!6213 S F!6213SF!62L3 P F!6213 S F!62L3 S F!6213 S F!6213 S F!62L3 P 3.
Sc,e"at!ca"ete
F!62N3 P
E(e$c!*! ()44e$!t!:
ca%co%o &! AMB
ca%co%o &! A - B
!5e$(!oe &! )a (t$!4a
6 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
8 se J PL
1 L #piuM(8/J-1) se J90
#$oce&)$e T#e$U2K'8: !te4e$3: !te4e$D
6e4!
!+ 8PL t,e
T#!)U:PK
e%(e
T#!)U:P 1 S T#!)U2K'8M13
e&D
0 se PL' 1 (e NP1
Gib(-2)LGib(-1) se 91
#$oce&)$e F!62N: !te4e$3: !te4e$D
6e4!
!+ NPL t,e
F!6:PL
e%(e
!+ NP1 t,e
F!6:P1
e%(e
F!6:PF!62NM23 S F!62NM13
e&D
Allocazione dinamica della memoria versione 2.5 :uglio 200'
.IGI'I DE..( GEG&AI( (..&C('( :'('IC(GEN'E
L0603, G
(onsideriamo la seguente dichiarazione:
var
voti: arra1H'..'6I of integer(
0l programmatore sta indicando al compilatore che intende usare un vettore di GL interi. 0l compilatore
di conseguenza, nella traduzione in linguaggio macchina, predispone (alloca la "uantit di &A6 (b-te
necessaria.
(on la maggior parte dei linguaggi di programmazione, "uando il programma 8 mandato in
esecuzione non c%8 modo di mutare "uesta situazione (aumentare ad esempio il numero di elementi
nel vettore. L%unico modo per aggiungere elementi al vettore 8 "uello di modifcare il sorgente e
ricompilare il programma.
0mmaginate la scena: un programmatore =tirchio% dimensiona un vettore con troppo pochi elementi# un
cliente, a mille chilometri di distanza, usa il programma in modo da esaurire il vettore: 8 costretto ad
attendere l%intervento del programmatore, con grave disagio (ed arrabbiatura.
,sagerare con il numero di elementi del vettore potrebbe comportare uno spreco di &A6 inaccettabile
(se mediamente il numero di elementi usati del vettore 8 sensibilmente inferiore al massimo.
Decidere invece di memorizzare i dati su disco farebbe crollare le prestazioni.
Nat)$a%"ete o (a$e"o (e"#$e co(; B(+o$t)at!9: ! "e(! &! ) ao (oo (e"#$e &o&!c!' e& ! 4!o$! a% "a((!"o
366D 4%! a%)! &! )a c%a((e &!++!c!%"ete ()#e$e$ao ! 7)a$ata' ecc. D!c!a"o c,e !% #$o6%e"a / #a$t!co%a$"ete
e5!&ete ! 7)e%%e (!t)a*!o! ! c)! !% #$o4$a""ato$e o #)0 +a$e )a (t!"a e(atta o 7)a(! &e%%e ece((!t>.
1e(ate' a& e(e"#!o' a% 4!oco &e4%! (cacc,!: / !"#o((!6!%e #$e5e&e$e 7)ate B"o((e9 &)$e$> %a #a$t!ta. A)at!
e%e"et! &o5$> a%%o$a a5e$e !% 5etto$e c,e "e"o$!**a %e "o((eC Se #o! 5o%e((!"o !"#o(ta$e ) %!5e%%o &! 4!oco
&!++!c!%e !% co"#)te$ &o5$> a%%o$a 5a%)ta$e "o%te #o(!*!o! #e$ o4! "o((a. Ma 7)a%c)o #$e+e$!$> ) %!5e%%o &! 4!oco
#e$ #$!c!#!at!. A%c)! (o+t@a$e #e$"ettoo a&&!$!tt)$a &! 4!oca$e #!< #a$t!te ! cote"#o$aea. A)ata "e"o$!a
RAM (e$5e' 7)!&'! #e$ +a$ +)*!oa$e !% #$o4$a""aC C,e co(a &o5$e66e &!c,!a$a$e !% #$o4$a""ato$e e%%a (e*!oe
:AR C
-o spazio allocato staticamente in /A: non pu> essere
modi9cato (aumentato o diminuito) durante
lesecuzione del programma.
L0603, T
0mmaginate ora di avere un elenco di nomi in un vettore e di averlo ordinato alfabeticamente
(operazione =costosa%. 0mmaginiamo anche che il vettore abbia dei =posti liberi% in fondo. >gni ulteriore
inserimento rappresenta un%operazione piuttosto onerosa se vogliamo mantenere ordinato l%elenco.
0nfatti non basta aggiungere in fondo il nuovo nome: non 8 detto, infatti, che l%elenco rimanga
ordinato. ,% assai pi< probabile che il giusto posto per il nuovo nome sia in una posizione intermedia.
!ar allora necessario spostare verso destra di una posizione una parte degli elementi per fare spazio
al nuovo. (ome si diceva, l%inserimento in "ueste condizioni 8 un%operazione piuttosto onerosa ed
accettabile solo se gli inserimenti a vettore gi ordinato sono rari: purtroppo sono molteplici le
applicazioni in cui 8 vero io il contrario \ 7on va meglio nel caso si debba eliminare un elemento
intermedio (perchFD.
7 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
Allocazione dinamica della memoria versione 2.5 :uglio 200'
6na struttura allocata staticamente ? ine@ciente
per fre&uenti operazioni di inserimento ed
eliminazione<
L0603, J
Date un%occhiata alla struttura dati disegnata "ui a lato (si chiama albero. ,ssa 8
adatta per rappresentare situazioni in cui esiste una gerarchia tra gli elementi da
memorizzare (struttura director-, organigramma aziendale, mosse e contromosse
in un gioco ecc.. Qeh, penso sarete d%accordo nell%a/ermare che non 8 facile
rappresentarla usando gli arra-. , che dire in merito alla rappresentazione di una
rete stradale: in "uesto caso non c%8 addirittura nessun ordine tra i nodi da collegareA
6na struttura allocata
staticamente ?
inadeguata per
rappresentare strutture non lineari<
(..&C(PI&NE DIN(GIC( DE..( GEG&AI(
0l programmatore pu@ invece scegliere, nei casi in cui risulta conveniente, di gestire la memoria
dinamicamente. !ignifca che avr a disposizione delle istruzioni con cui comandare durante
l=esecuzione del programma la allocazione di altro spazio per le variabili ma anche per restituire lo
spazio che non serve pi<.
'7% A))L0(AW0>7, (>7(&,3A
I""a4!!a"o c,e c! (!a (tato co""!((!oato ) #$o4$a""a #e$ "o!to$a$e ! te"#o $ea%e 4%! !4$e((! a%%o SMAU.
I #a$t!co%a$e (! 5o4%!oo !(e$!$e %e %oca%!t> &! #$o5e!e*a &e! 5!(!tato$! ! ) e%eco c,e &e5e e((e$e co()%ta6!%e
co %a "a((!"a 5e%oc!t> #e$ #ote$ e++ett)a$e (tat!(t!c,e ! te"#o $ea%e. Da ()6!to 5!ee (ca$tata %9!&ea &! )t!%!**a$e !
+!%e: t$o##o %et!. S! )t!%!**e$> %a RAM ce$ca&o co")7)e &! o B(#$eca$%a9 #e$ o co"#$o"ette$e %e #$e(ta*!o!
&e% (!(te"a. S! &ec!&e &! o$4a!**a$e %e !+o$"a*!o! ! 7)e(to "o&o: 6%occ,! 25etto$!3 &a 2L (t$!4,e c!a(c)o +!o
a& ) "a((!"o &! 1LLL 6%occ,!. F!((!a"o ac,e %a %)4,e**a &! o4! (t$!4a: 5L ca$atte$!. A%%9!!*!o (! co"!c!a co
) (o%o 6%occo 25etto$e3: e(a)$!to !% #$!"o (! c,!e&e$> "e"o$!a #e$ !% (eco&o e co(; 5!a ...
Ai<etti ...
(apita la di/erenzaD 7on verranno predisposti da subito GLLL vettori da TL stringheA 2err dato spazio
ai vettori in &A6 progressivamente, man mano che se ne avvertir l%esigenza ...
L%uso della memoria dinamica consentir di occupare all%inizio solo la memoria necessaria per le TL
stringhe del primo blocco e di occuparne dell%altra solo "uando veramente necessario. ,% facile
convincersi che in "uesto modo la memoria eventualmente sprecata 8 "uella corrispondente a GH
stringhe, nell%ipotesi di usare solo la prima stringa dell%ultimo blocco allocato.
Ai<etti ...
8 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
Allocazione dinamica della memoria versione 2.5 :uglio 200'
)ur non essendo ottimale (rimane il limite delle TLSGLLL blocchiYTLLLL stringhe in "uesto modo
riusciamo a gestire una 5&>!!A "uantit di stringhe ottimizzando l%uso della memoria. 0n seguito
estenderemo la tecnica per gestire elenchi =infnitamente% lunghi (ad esaurimento &A6 ... o spazio su
disco visto che tutti i moderni sistemi operativi supportano la gestione virtuale della &A6 usando il
disco come estensione =lenta% di "uest%ultima
)rocediamo con gradualit. )rima preoccupiamoci della gestione dinamica di un singolo vettore di TL
stringhe, cio8 di un solo blocco. )oi estenderemo la gestione a GLLL blocchi. (ome si fa a chiedere al
)ascal di allocare spazio per un vettore di TL stringheD ,d il vettore si user come tutti gli altri vettoriD
'n passo alla volta ...
0niziamo con il defnire un tipo che rappresenta un singolo blocco:
t-pe
vettore Y arra-gG..TLe of stringgPLe# (S il punto di partenza 8 un normale vettore di stringhe S
%+n > [2ettore= (S il tipo blocco =punta% ad oggetti di tipo vettore# si parla di tipo puntatore S
(S il carattere l 8 fondamentale per indicare che si tratta di un puntatoreA S
2ar
"locco) %+n (S variabile puntatore che memorizzer l%indirizzo di un blocco "uando sar creato S
La variabile blocco 8 di tipo pun, cio8 (risalendo la catena delle dichiarazioni 8 un puntatore ad oggetti
di tipo vettore (si scrive Tvettore. Al momento non sta puntando a nulla perchF il programmatore non
ha ancora chiesto l%allocazione di memoria per il blocco di stringhe.
7>3A Q,7,: blocco non pu@ essere usata come una variabile "ualsiasi. Ad esempio producono un
errore le seguenti istruzioni:
$1 ### *riteln("locco) o rea!ln3"locco5 o "loccoA;B+ N& HHH
'n puntatore 8 una variabile speciale. !erve a contenere indirizzi di oggetti creati nella &A6. 9uindi
prima deve essere creato un oggetto e poi si memorizza nel puntatore dove inizia in memoria
"uell%oggetto. 'sando poi il puntatore potremo scrivere dati in "uel blocco di memoria, recuperarli,
distruggere il blocco di memoria "uando non servir pi<.
A))&>$>7D06,73>
La dimensione e/ettiva di un puntatore dipende da come il processore gestisce gli indirizzi di memoria
e dalla capacit del compilatore di sfruttare appieno le possibilit o/erte da un processore. 0l 3urbo
)ascal 8 in grado di gestire sia indirizzi di T b-te, cio8 GK bit (memoria di al massimo TlGK * G Y
KUNb-te, sia indirizzi di U b-te (JTbit, memoria segmentata D>! indicandoli con una coppia numero
di segmento (KUN possibili segmenti Z posizione nel segmento (da L a KUN.
)er chiarire in modo ine"uivocabile che un puntatore non sta individuando nessun oggetto in memoria
lo si inizializza con un valore speciale: 70L (nulla.
blocco :@ :&$(
0n "uesto modo il programmatore pu@ verifcare se il puntatore sta puntando ad un oggetto valido (uno
degli errori pi< pericolosi che si possano commettere 8 infatti l%uso di un puntatore che non sta
puntando a nulla:
if bloccoEF:&$ then \ uso =sicuro% del puntatore \
N Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
Allocazione dinamica della memoria versione 2.5 :uglio 200'
1L Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
Allocazione dinamica della memoria versione 2.5 :uglio 200'
L9!(t$)*!oe e@: a%%oca*!oe &e%%a "e"o$!a
3orniamo all%esempio precedente e continuiamo dal punto in cui ci eravamo interrotti
t-pe
vettore Y arra-gG..TLe of stringgPLe#
pun Y lvettore#
var
blocco: pun
,% arrivato il momento di creare un blocco (vettore e di memorizzare il suo indirizzo nella variabile
blocco.
ne03"locco5=
Letteralmente: crea un nuovo oggetto del tipo individuato dalla variabile puntatore. )oichF blocco 8 un
puntatore ad oggetti di tipo vettore e "uesti ultimi sono arra1 diTL stringhe, 8 appunto un vettore di TL
stringhe che viene creato in memoria. )oichF ogni stringa occupa PL carratteri, il blocco complessivo di
b-te occupati 8 TLSPLYGLLL b-te.
,cco "uello che accade pi< in dettaglio: il sistema operativo, se la memoria non 8 esaurita, riserva un
blocco di tanti b-te consecutivi "uanti sono "uelle necessari a memorizzare TL stringhe da PL caratteri
(circa GLLL b-te. 7on 8 dato sapere a priori dove si trover nella &A6 "uesto blocco ma ci@ che conta
8 sapere l%indirizzo del suo primo b-te: 8 il suo indirizzo ad essere memorizzato nella variabile
puntatore blocco. (onsiderando la situazione rappresentata nel disegno soprastante, ho immaginato
che il sistema operativo abbia trovato posto a partire dal b-te all%indirizzo GUJK: 8 "uesto il valore che
viene memorizzato nella variabile blocco. !e non c%8 spazio il sistema operativo restituisce 70L.
,% molto importante capire che al momento della scrittura del programma il vettore non esiste ancora.
, neppure alla partenza del programma: 8 necessario il comando esplicito new. 7>3A: la new deve
essere comandata una sola volta per tutto il vettore. 7el caso il vettore non servisse pi< sar possibile
restituire la memoria al sistema operativo e riutilizzare il puntatore blocco per un altro vettore (subito o
in un secondo momento.
Stili##o !ella eoria allocata
0mmaginando di aver gi creato l%oggetto vettore, proviamo a memorizzare una stringa nel suo primo
elemento:
11 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
6%occo
Ne@2)^1B%occo3
5%6
'''
'''
+l (alore di bocco A l.indirizzo del primo
bJte allocato' i bJte non contengono
ancora niente.
8@<A
1434
1435
8@<A
Allocazione dinamica della memoria versione 2.5 :uglio 200'
bloccolgGe:Y;!ono la prima stringa del blocco;#
12 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
Allocazione dinamica della memoria versione 2.5 :uglio 200'
Attenzione a non usare blocco come se fosse esso stesso il vettore di stringhe:

bloccoH'I:Y%una stringa% N&HH
0l puntatore infatti non 8 l%oggetto ma l%indirizzo dell%oggetto. )er passare dall%indirizzo all%oggetto 8
necessario indicare il simbolo [ dopo il nome del puntatore. 0n progressione: blocco 8 l%indirizzo,
bloccoT 8 l%oggetto puntato, cio8 il vettore e bloccoTH'I 8 il suo primo elemento
,d ora un ciclo for per valorizzare a stringa vuota i restanti elementi
for i:YT to TL do
bloccolgie :Y =%#

,d un altro ciclo for che visualizza tutte le stringhe:
for i:YG to TL do
writeln( bloccolgie #
L9!(t$)*!oe &!(#o(e: $e(t!t)*!oe &e%%a "e"o$!a
9uando il vettore ha esaurito la sua utilit possiamo restituire con il comando dispose la memoria al
sistema operativo, cio8 deallocarla:
dispose(blocco# blocco:Ynil#
end.
7>3A Q,7,: dopo la dispose il puntatore perde di signifcato. ,% un 5&A2, errore tentare di usare un
puntatore deallocato. )urtroppo, il 3urbo )ascal non mette automaticamente a nil un puntatore
deallocato (con altri linguaggi accade ed 8 allora buona pratica farlo personalmente.
,% altrettanto 5&A2, deallocare un puntatore che non punta a niente (70L: di solito va in crash il
programma.
Ai<etti ...
0l fatto che la memoria possa essere restituita "uando non serve pi< rappresenta gi un grosso
vantaggio rispetto all%uso di un normale vettore di stringhe. 0l prezzo da pagare 8 una certa
complicazione delle operazioni e, cosa ben pi< tangibile, un maggiore rischio di commettere errori
gravi.
0n e/etti se la "uantit di memoria non rappresenta un problema conviene sovradimensionare gli arra-
standard ed evitare complicazioni. D%altra parte in molte situazioni la "uantit di memoria ! il
problema principale (provate a pensare se un programma di grafca tipo )hoto!hop dovesse allocare
decine di megab-te di &A6 per niente per ogni immagine ad alta risoluzione che poi non sar
veramente caricata in memoria....
A33,7W0>7,: !, A2,3, (A)03> 5L0 A&5>6,730 $07 9'0 ,!)>!30 A2,3, &A550'73> (>6)L,3A6,73,
5L0 >Q0,33020AA
0L !,5'03> )'>% ,!!,&, (>7!0D,&A3> '7 A))&>$>7D06,73>, 7>7 ALLA )>&3A3A D0 3'330.
13 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
Allocazione dinamica della memoria versione 2.5 :uglio 200'
14 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
Allocazione dinamica della memoria versione 2.5 :uglio 200'
Dopo le prime TL stringhe avremmo esaurito lo spazio, n8 pi< n8 meno che con un vettore classico. La
soluzione consiste nell%usare un vettore di puntatori, di GLLL puntatori per l%esattezza.
0ntanto 8 necessario dichiarare il vettore di puntatori:
t-pe
)GLLLQlocchiYarra-gG..GLLLe of blocco#
var
Localita: )GLLLQlocchi#
>ra abbiamo a disposizione il tipo vettore di GLLL puntatori a blocchi di TL stringhe ciascuno e relativa
variabile.
(S inizializzo il vettore di puntatori S
for i:YG to GLLL do
Localitagie:Ynil#
,% utile rappresentare grafcamente la situazione (solo con i primi elementi del vettore di puntatori:

(S chiediamo spazio per due vettori: il primo ed il "uinto, senza un motivo particolare, giusto per prova
S
new( LocalitagGe #
new( LocalitagPe #

!olo due puntatori hanno a "uesto punto collegati due blocchi. 3utte le caselle dei vettori contengono
valori casuali.
(S inizializzo le stringhe dei vettori, ma solo per i puntatori a blocco diversi da nil, ovviamente S
for i:YG to GLLL do
if Localitagie^_nil then
for ]:YG to TL do
Localitagielg]e:Y;;#
15 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
NIL
NIL
NIL
NIL
NIL
NIL
NIL
%oca%!ta
NIL
NIL
NIL
NIL
Loca%!taV1Wb
Loca%!taV5Wb
%oca%!taV1W
%oca%!taV5W
Allocazione dinamica della memoria versione 2.5 :uglio 200'
>ra tutte le caselle dei vettori contengono la stringa nulla. 7otate il controllo if localitaHiIEF:&$ che
seleziona solo gli elementi del vettore di puntatori che hanno collegato veramente un vettore di
stringhe (il primo ed il "uinto elemento, nel nostro caso.
$ocalita 8 il nome di un vettore. $ocalitaHiI accede all%iMmo elemento di "uel vettore (un puntatore.
$ocalitaHiIT accede all%elemento puntato che 8 a sua volta un vettore di stringhe. $ocalitaHiIT H?I 8 il ]M
mo elemento di "uesto vettore, cio8 la ]Mma delle TL stringhe di "uel vettore. 2i gira la testaD
(S memorizzo una stringa nel "uarto elemento del primo vettore S
LocalitagGelgUe:Y;le cose si complicano ...;#
(S ed una nel terzo elemento del "uinto vettore S
LocalitagPelgJe:Y;ma non piu;; di tantoA;#
writeln(;MMMMMMMMMMMMMMMMMMMMMMMMMMM;# writeln(;!tringhe nel vettore n. G: ;# writeln(;MMMMMMMMMMMMMMMMMMMMMMMMMMM;#
for i:YG to TL do
writeln( (LocalitagGelgie #
readln#
writeln(;MMMMMMMMMMMMMMMMMMMMMMMMMMM;# writeln(;!tringhe nel vettore n. P: ;# writeln(;MMMMMMMMMMMMMMMMMMMMMMMMMMM;#
for i:YG to TL do
writeln( LocalitagPelgie #
readln#
(S deallochiamo i vettori di stringhe S
for i:YG to GLLL do
if localitagie^_nil then
begin
dispose(localitagie#
localitagie:Ynil
end
end.
7otate , di nuovo, il controllo sul puntatore a 70L prima di deallocare. Deallocare con dispose un
puntatore a 70L 8 un 5&A2, errore e di solito porta al crash del programma.
Ai<etti ...
16 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
NIL
NIL
Le cose si complicano ''
NIL
Loca%!taV1Wb
Loca%!taV5Wb
%oca%!taV1W
%oca%!taV5W
Loca%!taV1WbV4W
NIL
ma non piS di tantoL
Loca%!taV5WbV3W
Allocazione dinamica della memoria versione 2.5 :uglio 200'
9uanta memoria pu@ far risparmiare la gestione dinamicaD A volte moltissima A !e ad esempio si
scoprisse che mediamente solo met delle stringhe sono necessarie, la gestione statica staticamente
userebbe sempre e comun"ue G.LLL.LLL di b-te (TL.LLL stringhe + PL caratteri mentre "uella
dinamica circa la met: PTL.LLL (T b-te a puntatore + GLLL puntatori Z GL.LLL stringhe + PL caratteri
AA
&isparmi a parte la gestione dinamica restituisce memoria nei momenti in cui non serve e migliora le
prestazioni del sistema operativo e, "uindi, dell%elaboratore.
LSI 'EAGIN( .-(PPA&D&NDIGEN'&.
Cli errori %i6 co+ni
'sare un puntatore prima di averlo =agganciato% con l%istruzione new ad un blocco di memoria
valido
'sare un puntatore dimenticandosi il simbolo di puntatore (l:
se p 8 un puntatore ad un intero:
new(p#
!0%: p:YJ# 7>: pl:YJ
'sare un puntatore dopo averlo =sganciato% con l%istruzione dispose dal blocco di memoria cui
puntava:
se p 8 un puntatore ad un intero:
new(p#
pl:YJ#
dispose(p# ora p non punta pi< a nulla e non 8 pi< utilizzabile
writeln( pl#
N& HH p non ha pi< signifcato: l%area di memoria cui puntava 8 stata restituita con dispose al
sistema operativo che potrebbe utilizzarla per altri scopi# usare l%indirizzo non pi< valido
contenuto in p potrebbe portare a conseguenze anche molto gravi per la stabilit del sistema.
!bagliare la posizione del simbolo di puntatore (l con vettori o record. ,cco una rassegna di
casi:
3h),
pY lstring#
vett : arra-gG..GLe of p#

recYrecord
codice: integer#
pun: p
end#
vet&ecYarra-gG..GLe of rec#
rec2etYrecord
codice: integer#
v: arra-gG..GLe of p
end#
2A&
17 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
Allocazione dinamica della memoria versione 2.5 :uglio 200'
vpun: vett#
un&ec: rec#
vrec: vet&ec#
un&ec2et: rec2et#
18 Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $
I record con il Turbo Pascal versione 1.' :uglio 200'
!0%: new( vpungJe # !0%: vpungJel:Y%ciao%# 7>: new(vpun
7>: vpunlgJe:Y%ciao%# (giusto se vpun fosse un puntatore a vettore di stringhe e non un vettore di
puntatori
!0%: new(un&ec.pun# !0%: un&ec.punl:Y%ciao%#
7>: un&ecl.pun:Y%ciao%# (giusto se un&ec fosse un puntatore ad un record contenente una stringa
pun
!0%: new( vrecgTe.pun # !0%: vrecgTe.punl:Y%ciao%#
!0%: new (un&ec2et.vgTe# !0%: un&ec2et.vgTel:Y%ciao%#
0n generale 8 suCciente ricordarsi di indicare il simbolo di puntatore (l dopo il nome del
puntatore (con la particolarit che vgie e non =v% 8 il nome del puntatore "uando =v% 8 un vettore.
.I:'E :EGP.ICI
)ur con i vantaggi visti, un limite alle stringhe gestibili nell%esempio precedente esiste comun"ue:
ventimila. 2ediamo di superarlo. &ealizzeremo una concatenazione di elementi (lista# che potr essere
espansa senza limiti (&A6 permettendo.
7el disegno ) rappresenta il puntatore che individua l%ingresso alla lista# ogni elemento (nodo della
lista ha una parte informatica (07$> che pu@ essere "ualsiasi cosa: un semplice intero, una stringa, un
vettore ecc. ogni nodo 8 collegato al successivo con un puntatore. 0l punto di ingresso individua la
testa della lista e all%altro capo troviamo invece la cosiddetta coda della lista.
'na lista ha anche altri vantaggi, oltre a "uello di poter =crescere% indefnitamente: se gli elementi sono
in ordine (alfabetico, per esempio l%aggiunta di un nuovo elemento, mantenendo l%ordinamento, 8
"uestione di pochissime operazioni. Anche l%eliminazione di un elemento ha un costo estremamente
inferiore rispetto ai vettori.
QA!3A A&&AhD 0l fatto che la lista sia =forte% proprio dove gli arra1 sono =deboli% non signifca che
debba essere d%ora in poi preferita ad essi (anziA. Le liste hanno purtroppo delle controindicazioni, che
sono comuni a tutte le strutture realizzate con la memoria dinamica: , ma 8 ancora troppo presto per
parlarne\
5rafcamente rappresenteremo le liste come segue:
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 1
NIL
P
A)a&o %a %!(ta / 5)ota. !' !% #)tato$e c,e $a##$e(eta !% ()o #)to &! !4$e((o' 5a%e +=. S!
a$$!5a ! 7)e(ta (!t)a*!oe o #e$c,E aco$a e(() e%e"eto / (tato !(e$!to a%%a %!(ta o #e$c,E
(oo (tat! t)tt! e%!"!at!.
P
NIL
A)a&o %a %!(ta / +o$"ata &a ) (o%o e%e"eto' #)tato &a !. L9e%e"eto / co(t!t)!to
%o4!ca"ete &a &)e #a$t!: 7)e%%a !+o$"at!5a e& ) #)tato$e a%%9e%e"eto c,e
e5et)a%"ete (e4)e e%%a %!(ta 25a%e += (e (! / a%%a +!e3
P
NIL
Ua %!(ta ! )o (tato !te$"e&!o.
P
NIL
te(ta &e%%a %!(ta
co&a &e%%a %!(ta
I record con il Turbo Pascal versione 1.' :uglio 200'
.a lista coe ese%io !i (D'
La lista 8 un esempio di A70 (Abstract Data 3-pe, 3ipo di Dato Astratto: nuovi tipi defniti dal
programmatore per i "uali 8 de%nito un ben preciso insieme di operazioni.
Ai programmatori non interessa come sia realizzato internamente l%AD3 (potrebbe essere costruito
usando vettori piuttosto che record per memorizzare i dati, usare un metodo di ordinamento piuttosto
che un altro ecc.. Al programmatore interessa solo sapere come ottenere i servizi di un AD3 cio8
"uali comandi pu@ inviare ad un esemplare di un AD3 e "uali risultati ottiene.
)er fare un esempio, 8 come se il )ascal o/risse solo il tipo integer, con le operazioni che tutti
conoscete. 0l programmatore potrebbe aggiungere l%AD3 real o string con tutte le operazioni note. (hi
user gli AD3 non si preoccuper di come i real e le string sono memorizzate e gestite: gli basta sapere
come creare variabili di "uei tipi, come assegnare loro valori, fare operazioni con esse, come
visualizzarle sullo schermo ecc. , non sar possibile chiedere operazioni non previste per "uell%AD3
(moltiplicare due stringhe, per esempio.
)er l%AD3 lista semplice potremmo defnire almeno le seguenti operazioni: aggiunta di un elemento
all%inizio o alla fne della lista (o in punto intermedio, aggiunta di un elemento mantenendo la lista in
ordine, eliminazione di un elemento, estrazione (l%elemento tolto non viene distrutto ma resta a
disposizione del programmatore, ricerca di un elemento, visita di tutti gli elementi di una lista,
controllo per sapere se la lista 8 vuota, distruzione della lista
)rima di scrivere le operazioni vediamo come rappresentare gli elementi della lista: un elemento deve
contenere due cose, la parte informativa ed il puntatore all%elemento che lo segue nella lista. !ono due
informazioni completamente diverse, per cui la struttura dati pi< naturale da usare 8 il record.
2errebbe spontaneo scrivere la dichiarazione del record nel modo seguente (immaginando che la parte
informativa sia un semplice intero, realizzando cos? una lista di integer \:
t-pe
elementoYrecord
inf: integer# (S informazione S
%+n) [eleento (S puntatore S
end#
Da un punto di vista logico 8 corretto: pun 8 il puntatore all%elemento successivo che 8 in e/etti di tipo
elemento, per cui un puntatore a "uesto tipo si scrive proprio Telemento. )urtroppo il compilatore non
conosce ancora esattamente cosa sia elemento "uando dichiariamo pun perchF stiamo proprio
defnendo elemento e non abbiamo ancora fnitoA (apiteD (i stiamo mordendo la coda: per defnire
elemento dovremmo gi sapere cosa sia elementoA
0l )ascal o/re una scappatoia: prima della defnizione di elemento possiamo defnire un tipo puntatore
ad esso. !i chiama dichiarazione forward (in avanti. ,% un%eccezione: il compilatore sa che dovrebbe
trovare la dichiarazione di cosa sia elemento dopo:
t-pe
puntatoreY lelemento# (S >N: il compilatore si aspetta di trovare dopo cosa sia elemento S
elementoYrecord
inf: integer# (S informazione S
pun: puntatore (S il compilatore sa gi cos%8 il tipo puntatore S
end#
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 2
NO ==
I record con il Turbo Pascal versione 1.' :uglio 200'
'na volta defniti i tipi 8 necessario dichiarare una variabile che rappresenta l%inizio della lista:
var
0nizioLista: puntatore#

)roviamo a creare un nodo isolato di "uesta lista:
begin
(Screiamo il primo nodoS
new(0nizioLista#
0nizioListal.inf:YGT#
0nizioListal.pun:Ynil#

(reiamo un secondo elemento (per il momento non collegato al primo:
var
0nizioLista: puntatore#
7uovo7odo: puntatore:
\
new(7uovo7odo#
7uovo7odol.inf:YTU#
7uovo7odol.pun:Ynil#

N&'( BENE 7on 8 possibile usare ancora 0nizioLista per creare il secondo nodo: perderemmo il primo:
new(0nizioLista#
0nizioLista l.inf:YTU#
0nizioLista l.pun:Ynil
Da "ualche parte in memoria i dati del primo elemento ci sono ancora: avendo per@ cambiato
l%indirizzo memorizzato nel puntatore con la seconda new, sono diventati irraggiungibiliAA 0nizioLista
porta ora al secondo nodo, perdendo la possibilit di usare il primo.
>ra concateniamo i due nodi, agganciando il secondo al primo:
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. '
+nizio=ista / ) #)tato$e. +nizio=ista\ / %9o44etto #)tato' ) $eco$&:
#e$ acce&e$e a! ()o! ca"#! !+o$"at!5! (! )(a %a ota*!oe B#)to9.
+nizio=ista\.inf / 7)!&! %a ()a #a$te !+o$"at!5a' +nizio=ista\.pun 7)e%%a
#)tato$e. Do#o 7)e(te !(t$)*!o! #o((!a"o $a##$e(eta$e 4$a+!ca"ete
%a %!(ta co(;:
Ini1ioLista
NIL
Ini1ioLista
NIL
Nuo"oNodo
NIL
NIL
Ini1ioLista
NIL
GGGGG
I record con il Turbo Pascal versione 1.' :uglio 200'
0nizioListal.pun:Y7uovo7odo#
7ella casella puntatore del primo nodo (la casella dopo il GT viene memorizzato l%indirizzo del secondo
(7uovo7odo
0n e/etti il secondo nodo 8 raggiunto in "uesto momento da due puntatori: "uello usato per crearlo e
"uello del nodo che lo precede (realizzando cos? la catena.
Dopo aver visto i meccanismi fondamentali, siete pronti per l%analisi di un programma abbastanza
completo di gestione delle liste semplici. 7aturalmente tutte le operazioni verranno implementate
come sottoprogrammiA 0nfatti sarebbe molto sconveniente scrivere un codice apposito per aggiungere
il terzo elemento e poi il "uarto ecc.
)er brevit non viene mai e/ettuato il controllo sul buon esito delle new.
)rogram liste`semplici#
uses crt#
t-pe
puntatoreY lelemento#
elementoYrecord
inf: integer# (S informazione S
pun: puntatore (S puntatore S
end#
!3A6)A D,LLA L0!3A (07 ,$$,330 ,% '7A 20!03A (>6)L,3A D0 3'330 5L0 ,L,6,730 D0 '7A L0!3A
%roce!+re sta%aTlista3%) %+ntatore5=
begin
writeln(;MMMM;#

while p^_nil do
begin
write(pl.inf,; ;#
p:Ypl.pun
end#
writeln(;MMMM;#
end#
07!,&06,73> 07 3,!3A D0 '7 7'>2> ,L,6,73>: riceve il puntatore ;p; ad una lista ed un valore da
inserire
%roce!+re inserisciTinTtesta32ar %)%+ntatore= 2alore)integer5=
var nuovo`nodo: puntatore#
begin
new(nuovo`nodo# nuovo`nodol.inf:Yvalore#
nuovo`nodol.pun:Yp#
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. )
Ini1ioLista
Nuo"oNodo
NIL
p / !% #)tato$e a%%9!!*!o &e%%a %!(taD
p=p:.pun / %9!(t$)*!oe c%a((!ca co c)! (! #a((a &a ) o&o a%
()cce((!5o. Se !+att! p #)ta a& ) ce$to o&o' %a (c$!tt)$a p\.pun
co$$!(#o&e a% cote)to &e%%a ()a ca(e%%a #)tato$e' c!o/ %9!&!$!**o
&e% o&o ()cce((!5o:
NB: p / #a((ato #e$ 5a%o$eD #o((!a"o 7)!&! "o&!+!ca$%o (e*a t!"o$e
&! #e$&e$e %9!!*!o &e%%a %!(taG
P
PT'pun
PT'punT'pun
nuo"oInodo
P
NIL
nuovo_nodo^.pun:=p
p:=nuovo_nodo

!
I record con il Turbo Pascal versione 1.' :uglio 200'
p:Ynuovo`nodo#
end#
(S07!,&06,73> 07 (>DA D0 '7 7'>2> ,L,6,73>: riceve il puntatore ;p; ad una lista ed un valore da
inserire S
%roce!+re inserisciTinTco!a32ar %)%+ntatore= 2alore)integer5=
var nuovo`nodo,fne`lista: puntatore#
begin
new(nuovo`nodo# nuovo`nodol.inf:Yvalore#
nuovo`nodol.pun:Ynil#

(S devo distinguere il caso lista vuota S
if p^_nil then (S lista non vuota S
begin
fne`lista:Yp# (S parto dall;inizio ... S
while fne`listal.pun^_nil do (S ... ed avanzo fno alla fne ... S
fne`lista:Yfne`listal.pun#

fne`listal.pun:Ynuovo`nodo
end
else
p:Ynuovo`nodo
end#
07!,&06,73> D0 '7 7'>2> ,L,6,73> 07 '7A )>!0W0>7, 073,&6,D0A: riceve il puntatore ;p; al nodo
che preceder "uello da inserire
%roce!+re inserisciTinTe##o32ar %)%+ntatore= 2alore)integer5=
var nuovo`nodo: puntatore#
begin
new(nuovo`nodo# nuovo`nodol.inf:Yvalore#
if pYnil then (S la lista e; vuota S
begin
nuovo`nodol.pun:Ynil# p:Ynuovo`nodo
end
else
begin
nuovo`nodol.pun:Ypl.pun# (S aggancio successivo S
pl.pun:Ynuovo`nodo (S mi faccio puntare da precedente S
end
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. 5
E9 !"#o$tate #$!"a (a%5a$e !% 5a%o$e &! p
e%%a ca(e%%a #)tato$e &e% )o5o o&o:
&!5e$(a"ete 2!5e$te&o c!o/ %9o$&!e &e!
&)e a((e4a"et!3 (! #e$&e$e66e !% 5a%o$e
o$!4!a%e &! p c!o/ &e% #$!"o o&o' $e&e&o
!$$a44!)4!6!%e %9!te$a %!(ta==
Ac,e (e (a$> #o! ece((a$!o &!++e$e*!a$e !% ca(o %!(ta 5)ota'
7)e(te !(t$)*!o! 5ao 6ee ! et$a"6! ! ca(!.
P
NIL
%ineIlista
nuo"oInodo
+!e^%!(ta:P+!e^%!(tab.#) G
I% &!(e4o 7)! a %ato (! $!+e$!(ce a% ca(o %!(ta
o 5)otaG
I record con il Turbo Pascal versione 1.' :uglio 200'
end#

Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. *
NIL
P
nuo"oInodo nuovo_nodo^.pun:=p^.pun
! p^.pun:=nuovo_nodo
I% &!(e4o 7)! a %ato +a e5!&ete"ete
$!+e$!"eto a% ca(o %!(ta o 5)otaG
I record con il Turbo Pascal versione 1.' :uglio 200'
&0(,&(A 07 '7A L0!3A 7>7 >&D07A3A
La procedura non si limita a restituire un puntatore all%elemento eventualmente trovato ma anche il
puntatore a "uello che eventualmente lo precede. Xo scelto "uesto comportamento perchF per alcune
operazioni, una volta trovato un elemento, 8 necessario disporre anche del puntatore all%elemento
precedente (ad esempio nel caso volessimo cancellare l%elemento trovato

%roce!+re cercaTnonTor!inata3%) %+ntatore= 2alore) integer= 2ar corrente7 %rece!ente)
%+ntatore5=
begin
precedente:Ynil# corrente:Ynil#
if p^_nil then
begin
corrente:Yp#
while (correntel.inf^_valore and (correntel.pun^_nil do
begin
precedente:Ycorrente#
corrente:Ycorrentel.pun
end#
if correntel.inf^_valore then
begin
precedente:Ynil#
corrente:Ynil
end
end
end#
&0(,&(A 07 '7A L0!3A >&D07A3A
9uesta versione della ricerca lavora su una lista ordinata (diciamo in modo crescente. 3rovato un
elemento il cui valore supera "uello che si sta cercando non ha pi< senso continuare la ricerca \ "uelli
seguenti saranno per forza tutti maggioriA
%roce!+re cercaTor!inata3%) %+ntatore= 2alore) integer= 2ar corrente7 %rece!ente)
%+ntatore5=
begin precedente:Ynil# corrente:Ynil#
if p^_nil then
begin
corrente:Yp#
while (correntel.inf^valore and (correntel.pun^_nil do
begin
precedente:Ycorrente#
corrente:Ycorrentel.pun end#
if correntel.inf^_valore then
begin precedente:Ynil# corrente:Ynil end end end#
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. +
La $!ce$ca / e++ett)ata () )a %!(ta o o$&!ata. Se (alore 5!ee t$o5ato' !
corrente 5!ee $e(t!t)!to !% #)tato$e a% o&o ce$cato' ! precedente 7)e%%o a%
o&o c,e %o #$ece&ete 2nil (e !% o&o ce$cato / !% #$!"o3. Se !% 5a%o$e o
5!ee t$o5ato (!a corrente c,e precedente (oo "e((! a nil3.
NIL
precedente
corrente
I record con il Turbo Pascal versione 1.' :uglio 200'
,L0607AW0>7, D0 '7 ,L,6,73>
9uesta procedura invoca "uella di ricerca per ottenere il puntatore al nodo da cancellare ed a "uello
che lo precede (se esiste. !ono infatti "ueste le informazioni necessarie per una corretta eliminazione.
%roce!+re eliina32ar %) %+ntatore= 2alore) integer5=
var corrente,precedente: puntatore#
begin
cerca`non`ordinata(p,valore,corrente,precedente#
if corrente^_nil then
begin
if precedente^_nil then
(S eliminazione in mezzo o in coda S
precedentel.pun:Ycorrentel.pun
else (S eliminazione in testa S
p:Ycorrentel.pun#
dispose(corrente
end
end#
07!,&06,73> 07 '7A L0!3A >&D07A3A
0l nuovo elemento deve essere inserito mantenendo la lista ordinata.
%roce!+re inserisciTinTor!ine32ar %)%+ntatore= 2alore)integer5=
var nuovo`nodo,precedente,corrente: puntatore#
begin
new(nuovo`nodo# nuovo`nodol.inf:Yvalore#
if pYnil then
begin
nuovo`nodol.pun:Ynil# p:Ynuovo`nodo
end
else
if valore^pl.inf then (S inserzione in testa S
begin
nuovo`nodol.pun:Yp# p:Ynuovo`nodo
end
else
begin
(S cerca il punto di inserimento S
precedente:Yp# corrente:Yp#
while (correntel.inf^Yvalore and (correntel.pun^_nil do
begin
precedente:Ycorrente# corrente:Ycorrentel.pun
end#
if valore_correntel.inf then (S inserimento in coda S
begin
nuovo`nodol.pun:Ynil# correntel.pun:Ynuovo`nodo
end
else (S inserimento in mezzo S
begin
nuovo`nodol.pun:Ycorrente# precedentel.pun:Ynuovo`nodo
end end end#
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. ,
Cace%%a*!oe ! me11o6coda a%%a %!(ta.
NIL
precedente
corrente
P
NIL
precedente
corrente
NIL
P
Cace%%a*!oe ! testa a%%a %!(ta.
I(e$!(ce )o5! 5a%o$! "atee&o )
o$&!a"eto c$e(cete. La tec!ca )(ata / %a
(te((a &e% (o$t #e$ !(e$*!oe 2$!ce$ca &e% 4!)(to
#)to &! !(e$!"eto3 )(ata #e$ ! 5etto$! "a
4$a*!e a! #)tato$! / e5!tato t)tto !%
(o5$acca$!co &e%%o (#o(ta"eto &e4%! e%e"et!
#e$ +a$ #o(to a 7)e%%o )o5o=
I record con il Turbo Pascal versione 1.' :uglio 200'
,!3&AW0>7, D0 '7 ,L,6,73>
,strai si di/erenzia dalla elimina perchF =sgancia% il nodo che contiene l%informazione cercata ma non
lo distrugge: restituisce il puntatore al nodo ed 8 poi responsabilit del chiamante liberare la memoria.
$+nction estrai32ar %) %+ntatore= 2alore) integer5) %+ntatore=
var corrente,precedente: puntatore#
begin
cerca`non`ordinata(p,valore,corrente,precedente#
if corrente^_nil then
begin
if precedente^_nil then (S eliminazione in mezzo o in coda S
precedentel.pun:Ycorrentel.pun
else (S eliminazione in testa S
p:Ycorrentel.pun
end#
estrai:Ycorrente# (S eventualmente, nil S end#
>ra che padroneggiate ( i meccanismi di gestione delle liste siete in grado di capire gli svantaggi
della gestione dinamica della &A6 (dei vantaggi abbiamo gi discusso\:
5li algoritmi sono pi< diCcili ed 8 pi< facile commettere errori
7on 8 possibile un accesso casuale agli elementi: per usare "uello in posizione =7% 8
necessario scorrere gli =7MG% che precedono con un ciclo. (onfrontate "uesta tecnica con
l%immediatezza degli arra1: vettg7e
A parit di tipo e di numero di elementi usa pi< memoria, "uella usata per memorizzare i
puntatoriAA (ma in alcune situazioni globalmente abbiamo comun"ue un grosso risparmio:
ricordate l%esercizio sullo !6A' e le TL.LLL stringheDD
Autore: abrizio !amuso "email: camuso#camuso.it sito web: www.camuso.it $ Pag. -