Sei sulla pagina 1di 87

Giulio Cesare Giacobbe

PASCAL

STANDARD

LINGUAGGIO DI PROGRAMMAZIONE PER ELABORATORI DIGITALI

MANUALE DIDATTICO

2

Proprietà letteraria riservata Giulio Cesare Giacobbe Copyright Giulio Cesare Giacobbe ® 1975

3

INDICE

Prefazione

5

PARTE PRIMA Pratica

7

Capitolo primo Introduzione alla programmazione

8

1 Il computer

8

2 I linguaggi di programmazione

8

3 Il Pascal

9

Capitolo secondo Il programma

10

1 Cos'è un programma

10

2 Perché scrivere un programma? E quale?

10

3 La teoria dei bioritmi

11

4 L'utente

11

Capitolo terzo

La progettazione

12

1 La bozza

12

2 Il diagramma di flusso

12

Capitolo quarto Le prime procedure

15

1 La procedura FRONTESPIZIO

15

2 Il programma con la prima procedura

18

3 La procedura INFORMAZIONI

19

4 Il programma con le prime due procedure

20

Capitolo quinto L'introduzione dei dati

22

1 La procedura ANAGRAFICA

22

2 Richiesta del nome

22

3 Richiesta della data di nascita

23

4 La procedura ANAGRAFICA completa

24

5 La procedura DATIBIORITMO

25

6

Il programma con quattro procedure

25

Capitolo sesto I calcoli

28

1 La funzione GIORNIMESE

28

2 La definizione nella procedura

29

3 La procedura CALCOLI: prima parte

30

4 La procedura CALCOLI: gli anni bisestili

33

5

Il programma fino alla procedura CALCOLI

34

Capitolo settimo L'output

37

1 La durata delle fasi

37

2 La procedura DIDASCALIA

38

3 La procedura INTERROGATORIO

39

4

Il blocco istruzioni della procedura principale

40

Capitolo ottavo Il programma completo

42

PARTE SECONDA Teoria

46

Capitolo primo Identificatori e tipi

47

1

Le istruzioni e i dati

47

4

 

3 I tipi

48

4 I tipi standard

48

5 I tipi non standard

49

Capitolo secondo La procedura

51

1 La procedura: definizione

51

2 La procedura: sintassi

52

3 La funzione: definizione

58

4 La funzione: sintassi

59

5 La memorizzazione dinamica dei dati: il tipo puntatore

59

6

Il tipo puntatore: sintassi

60

Capitolo terzo Il programma

63

1 La struttura

63

2 La nidificazione

63

3 I parametri: definizioni

65

4 I parametri: sintassi

66

5 Il programma: sintassi

68

Capitolo quarto Le istruzioni

76

1 Definizioni

76

2 Istruzioni di assegnazione

77

3 Istruzioni di input

78

4 Istruzioni di output

78

5 Istruzioni condizionali

79

6 Istruzioni iterative

79

7 Istruzioni di controllo

80

8 Istruzioni computazionali

81

Operandi Boolean

81

Operandi Integer e Real

82

Operandi Char

83

Operandi Scalare

84

Operandi Set

85

Operandi Array

85

Operandi Record

86

Operandi Puntatore

86

9

Istruzioni di trattamento file

87

5

PREFAZIONE

I manuali di Pascal si sprecano. E ultimamente, in molti di essi, si pone la solita domanda

retorica: Perché un nuovo manuale di Pascal? La risposta che gli autori si danno è puntualmente la stessa: perché i manuali precedenti sono fatti male. Maldicenza, oppure grosse difficoltà obiettive, nell'esposizione didattica del Pascal? Di fatto, siamo ancora lontani dall'avere a disposizione un manuale che presenti i requisiti della immediata intelligibilità, del rigore e della completezza, e che permetta quindi un agevole apprendimento di questo linguaggio di programmazione da parte un qualsiasi studente digiuno della materia. L'unico manuale rigoroso e completo rimane a tutt'oggi (incredibile, se si pensa che esso è stato il primo e che dopo di esso ne sono stati fatti a quintali!) il Manuale e standard del linguaggio dell'inventore stesso del Pascal, Niklaus Wirth. Ma esso non si può certamente definire un manuale di immediata intelligibilità, idoneo ad essere usato da studenti privi di esperienza di programmazione, come lo stesso Wirth ammette candidamente.

In un modo o nell'altro, studiare il Pascal è faticoso. Questa è la causa del fatto che questo linguaggio, assunto come paradigma dei linguaggi strutturati e quindi dotato di una notevole portata didattica, nonché costituente un buon strumento per la programmazione pratica, più scientifico quindi più chiaro e comunicabile dell'anarchico Basic, è meno diffuso di quest'ultimo come linguaggio standard nei microcomputers nell'ambito della programmazione amatoriale. Rimane tuttavia inalterata, nonostante la continua proliferazione di nuovi linguaggi, la sua importanza come introduzione alla pro- grammazione scientifica e professionale. Di qui la necessità di un manuale chiaro, rigoroso

e completo.

Non è naturalmente per malvagità, e tanto meno, credo, per stupidità, che gli autori di manuali di Pascal non hanno sempre profuso nella loro opera la chiarezza, il rigore e la completezza. Il Pascal si presenta come una complessa architettura sospesa nel vuoto: non

è che non abbia fondamenta, naturalmente, ma esse fanno parte della stessa architettura e

sono a fatica distinguibili dal resto, per cui si comincia ad afferrare il senso della costruzione soltanto quando la si è percorsa tutta e la si guarda da lontano. Il che lascia lo

studente per parecchio, troppo tempo in una situazione di non chiarezza che è francamente anomala, nell'ambito della scienza didattica. Il problema per il docente è decidere da che parte cominciare la descrizione e capire quali parti sono logicamente e didatticamente antecedenti e quali conseguenti, e dunque pianificare l'esposizione. Ma questo richiede una certa competenza ed esperienza come docente e come logico, oltre che come programmatore. Non è tuttavia per un intento morale, che mi sono applicato, anch'io, a scrivere un manuale sul Pascal, ma per un intento pratico: quello di fornire ai miei studenti uno strumento di lavoro realmente capace di porre in grado di programmare. Questo manuale è il risultato della mia attività didattica. Se esso è riuscito, anche solo in parte, nell'intento di essere chiaro preciso ed esauriente, il merito è anche dei miei studenti, i quali hanno imper- sonificato quell'interlocutore che sempre dovrebbe presenziare alla stesura di un'opera didattica. Esso, anche se è finalizzato alla didattica universitaria, può essere usato come manuale di autoapprendimento da parte di chiunque, anche assolutamente digiuno di infor- matica.

6

Questo manuale è diviso in una Parte Prima, concernente la pratica, e in una Parte Seconda, concernente la teoria. Forse qualche lettore si chiederà perché mai si esponga prima la pratica e poi la teoria, sovvertendo completamente il metodo didattico tradizionale. La risposta a questo inter- rogativo sta nella convinzione dell'autore che la funzione naturale di una teoria sia quella di costituire una razionalizzazione ed una sistematizzazione dell'esperienza, e quindi che essa venga cronologicamente e logicamente dopo l'esperienza, nei confronti della quale la teoria costituisce un formidabile mezzo di potenziamento oltre che di coscienzializzazione, ma che se non preceduta e resa impellente dall'esperienza, essa, la teoria, si riduca ad un puro gioco intellettuale, stimolante soltanto per rarissime persone ed appreso agevolmente in modo permanente da un numero ancora più limitato di esse. Ciò premesso, si invita lo studente a procedere iniziando a leggere questa prima parte relativa alla pratica, ricorrendo alla lettura di quei paragrafi della teoria che di volta sono chiamati in causa, spaziando anche secondo il suo estro personale, per poi passare, una volta chiaritesi le idee circa la consistenza pratica e le esigenze effettive della programmazione (meglio se eseguita concretamente su di un computer) all'approfondimento della teoria. Se qualche lettore, poi, non convinto dalle mie argomentazioni o protervio per il gusto della contraddizione o della conservazione, oppure semplicemente per malignità, volesse continuare come al solito a studiare la teoria prima di passare alla pratica, è chiaro che dal posto in cui mi trovo non glielo posso materialmente impedire e quindi può impudentemente e impunemente farlo. Ma se piomberà nella più deprimente confusione e gli verrà un forte mal di testa, si rammenti che lo avevo avvertito Nella parte concernente la teoria, questo manuale è necessariamente schematico, per mantenere la chiarezza dell'essenzialità e per permettere la rapidità della consultazione. In essa viene data la definizione tecnica dei termini fondamentali del Pascal, che sono nel testo stampati in grassetto. Di essi è riportato un elenco a fine volume, con riferimento alla pagina della loro definizione. Nella parte concernente la pratica, i termini usati nel programma, e quindi appartenenti al linguaggio Pascal, se citati nel testo descrittivo, sono riportati in grassetto corsivo. Era mia intenzione apporre a questo manuale l'onesto sottotitolo di Manuale eterodosso per autodidatti, ma il rischio che la generale avversione del pubblico per l'eterodossia possa farne diminuire la diffusione mi è sembrata una buona ragione per non farlo. Non esporrò qui il perché dell'eterodossia di questo manuale, per due buoni motivi: il primo è che, probabilmente, quasi nessuno leggerà questa prefazione; il secondo è che, se per avventura qualcuno la leggesse, ci sarebbe il rischio che, disgustato dalla mia spudora- tezza, si rifiutasse di proseguire nella lettura. Vero è che questo meschino espediente altro non fa che differire il giudizio del lettore di qualche pagina: nella convinzione che il pubblico dei giovani studenti universitarii, al quale è principalmente rivolto questo ma- nuale, costituisca la punta più avanzata della società in fatto di elasticità mentale, confido tuttavia che esso riesca ad essere adoperato da qualcuno e che risulti, tutto sommato, di una qualche utilità.

Genova, maggio 1975

Giulio Cesare Giacobbe

7

PARTE PRIMA

PRATICA

8

CAPITOLO PRIMO

INTRODUZIONE ALLA PROGRAMMAZIONE

1. IL COMPUTER

Qualsiasi evento fisico intelligibile può considerarsi un'informazione. Un segno sulla carta, un lampo di luce, un suono, possono costituire per noi delle informazioni, se noi attribuiamo loro un significato. Un elaboratore o computer è un dispositivo che riceve, elabora e trasmette informazioni sotto forma di impulsi elettrici a due stati assumenti significato mediante un codice convenzionale (come un telegrafo). In pratica, si tratta di due diversi stati di tensione elettrica assunti dai suoi circuiti. Un computer è composto di tre parti principali: un centro per la elaborazione e lo smistamento delle informazioni (CPU: Central Processing Unit), costituito praticamente da un microprocessore (un circuito elettrico molto complesso contenuto in uno spazio ri- dottissimo, normalmente di pochi centimetri quadrati); un magazzino per la conservazione delle informazioni (memoria centrale); una porta di comunicazione con l'esterno, attraverso la quale passano le informazioni in entrata e in uscita (interfaccia I/O,

INPUT/OUTPUT).

Collegati con il computer e costituenti insieme con esso un sistema, sono i dispositivi di INPUT (tastiera, etc.), che trasmettono le informazioni in entrata nel computer; i dispositivi di OUTPUT (video, stampante, etc.), che ricevono le informazioni in uscita dal computer; i dispositivi costituenti la memoria di massa (registratore di nastri, registratore di dischi, etc.), che raccolgono e conservano le informazioni in uscita, potendo poi ritrasmetterle in entrata al computer (costituiscono quindi dispositivi I/O). Per far sì che il computer esegua tutte le operazioni inerenti alla trasmissione delle informazioni in entrata e in uscita, e quindi gestisca tutti i dispositivi di input e di output, viene elaborato uno speciale insieme di istruzioni detto sistema operativo. Ogni computer possiede il suo sistema operativo: senza di esso un computer non è neppure in grado di operare. Purtroppo ogni fabbricante di computers ha provveduto alla elaborazione di un suo proprio sistema operativo, per cui non tutti i computers hanno lo stesso sistema operativo. Questo fa sì che i computers appartenenti ad un sistema non possono comunicare con i computers appartenenti ad un altro sistema.

2. I LINGUAGGI DI PROGRAMMAZIONE

Ciò che il computer fa in concreto è assumere una serie di assetti elettrici (distribuzione dei due stati di tensione elettrica nei suoi diversi circuiti) e reagire ad impulsi elettrici provenienti dall’esterno con l'assunzione di altri assetti elettrici, secondo un procedimento registrato nel microprocessore. E' la fantasia umana a dotare di significato tali assetti elettrici mediante l’uso di un codice convenzionale. Il codice convenzionale usato per trasmettere e ricevere informazioni dai computers è il

cosiddetto codice binario, costituito da sequenze delle due cifre 0 e 1. Esso è un vero e proprio linguaggio, detto linguaggiomacchina perché è quello che ci permette di comuni- care direttamente con il computer.

9

Essendo il linguaggiomacchina estremamente laborioso, sono stati elaborati linguaggi che utilizzano termini del nostro linguaggio naturale (inglese) i quali vengono tradotti in linguaggiomacchina. Sono i cosiddetti linguaggi di alto livello, fra cui il Pascal.

3. IL PASCAL

Il Pascal è un linguaggio compilato. Ciò significa che quando noi abbiamo scritto un qualsiasi programma in questo linguaggio, uno speciale programma detto Compilatore provvede alla sua traduzione in linguaggiomacchina; tale traduzione viene registrata ed utilizzata direttamente tutte le volte che noi chiediamo al computer di eseguire il nostro programma. In questo modo l'esecuzione, che utilizza sempre direttamente la traduzione in linguaggiomacchina, risulta molto veloce, a diversità di quanto avveniva per altri linguaggi, come il BASIC, che dovevano essere tradotti ad ogni esecuzione (oggi anche il Basic viene compilato). Il compilatore contiene in sé le regole del linguaggio, sicché d'ora in avanti ci riferiremo ad esso come se fosse il Pascal stesso. Il Pascal è stato il primo linguaggio di programmazione nel quale sono stati applicati in modo sistematico i princìpi di programmazione strutturata definiti da E. DIJKSTRA e C. HOARE. Ciò ne fa un importante punto di riferimento per tutti i linguaggi strutturati di pro- grammazione progettati dopo di esso. Il Pascal è stato sviluppato presso l'Istituto di Informatica dell' ETH di Zurigo, Svizzera, da NIKLAUS WIRTH e dai suoi collaboratori. Una versione preliminare fu ultimata nel 1968; nel 1970 si ebbe la prima versione operativa; nel 1973 fu redatta la sua definitiva de- scrizione formale, che fu pubblicata nel 1975: l'edizione italiana (K. JENSEN e N. WIRTH, Manuale e standard del linguaggio, JACKSON, Milano) è del 1981. Esso costituisce il cosiddetto Pascal Standard, che è l'oggetto del presente manuale. Il Pascal Standard, costituendo un linguaggio ben definito, è utilizzabile in qualsiasi computer, indipendentemente dal sistema operativo di quest’ultimo. Questo costituisce un altro vantaggio del Pascal: un programma può essere scritto in Pascal Standard e poi utilizzato in un qualsiasi computer.

10

CAPITOLO SECONDO

IL PROGRAMMA

1. COS'E’ UN PROGRAMMA

I computers hanno, come abbiamo visto, la funzione di emettere delle informazioni, in

seguito all'introduzione in essi, da parte nostra, di altre informazioni, che vengono opportunamente elaborate. Se esaminiamo un insieme di informazioni in entrata nel computer, ad esempio Calcola la

somma di 4 e 8 e scrivi il risultato, e il corrispondente insieme di informazioni in uscita, Scrittura di 12, in essi possiamo distinguere rispettivamente: due istruzioni (calcola la somma di e scrivi il risultato) e due dati (4 e 8 ); un'azione (scrittura di ) ed un dato (12 ). Dunque, teoricamente, le informazioni in entrata nel computer si distinguono in istruzioni e dati; le informazioni in uscita si distinguono in azioni e dati. Un'istruzione consiste in una causa di azione; un'azione in un cambiamento di stato; un dato in un insieme di segni significativi.

I dati sono sempre associati, in entrata alle istruzioni, in uscita alle azioni.

Infine, ad ogni istruzione corrisponde un'azione. L'insieme di istruzioni e dati che noi introduciamo nel computer, al fine di ottenere da esso azioni e dati, si dice programma. Un computer non può fare assolutamente nulla senza un programma. Un programma può essere registrato nella memoria centrale del computer, oppure inciso su disco o su nastro. Nel primo caso, la durata della conservazione delle informazioni

costituenti il programma coincide con la durata dell'alimentazione elettrica del computer, poiché la sua memoria centrale conserva le informazioni fintantoché esso viene alimentato; nel secondo caso, la durata della conservazione delle informazioni coincide con la durata della traccia magnetica incisa sul supporto fisico costituente il disco o il nastro.

2. PERCHE` SCRIVERE UN PROGRAMMA? E QUALE? Mediante un programma noi possiamo fare eseguire ad un computer una serie di operazioni. La stesura di un programma per computers è la risposta ad un'esigenza. Uno ha bisogno di calcolare l'ammontare del suo guadagno annuo oppure delle imposte da pagare e fa eseguire il calcolo, noioso e ripetitivo, al computer. Un altro va matto per i videogiochi, se ne è inventato uno e vuole realizzarlo: con il computer può farlo. Se uno non ha esigenze che possano essere soddisfatte da un computer, del computer ovviamente non sa che farsene. A meno che, caso particolare ma oggi sempre più frequente, la sua esigenza sia semplicemente quella di imparare ad usare il computer. A questo punto è bene che costui si inventi un'altra esigenza che possa essere soddisfatta mediante la stesura di un programma, altrimenti rischia di annoiarsi a morte e rinunciare a conoscere l'uso del computer, diventandone un irriducibile nemico, perché non c'è niente di più noioso che studiare l'uso di uno strumento quando di quello strumento non si ha alcun bisogno.

11

I più facilitati nell'apprendimento dell'uso del computer sono senz'altro coloro che hanno

interessi artistici o comunque creativi: per loro il computer è uno strumento formidabile. Infatti, il computer non esegue soltanto calcoli matematici: elabora anche le parole e le immagini e gli unici limiti a ciò che esso può fare sono quelli stessi della fantasia umana. Anche noi, in questa prima parte del manuale, ci daremo uno scopo concreto, elaborando un programma che ci permetta di soddisfare un qualche interesse. Gli studenti del corso da me tenuto sul linguaggio Pascal nell'anno accademico 1984/85 presso la Facoltà di Lettere dell'Università di Genova hanno scelto di elaborare un programma sui bioritmi, fra i diversi da me proposti. Sulla base della mia esperienza didattica, posso dire che un programma per il calcolo dei bioritmi va molto bene per co- minciare: è tale da coinvolgere una buona parte delle istruzioni e dei meccanismi esistenti nella teoria, e quindi assolve bene alla sua funzione esemplificativa, ed è tale da risvegliare un minimo di interesse nella maggior parte delle persone, sia maschi che femmine, perché è attinente alla loro personalità e si sa che l'argomento più interessante in assoluto per ognuno di noi è noi stessi. Seguirò con voi passo passo lo stesso itinerario che ho percorso con i miei studenti, in modo da avere una buona probabilità di risolvervi tutti i problemi che dovessero eventualmente presentarvisi. Elaboreremo dunque un programma per il calcolo dei bioritmi individuali.

3. LA TEORIA DEI BIORITMI

Secondo la teoria dei bioritmi, ciascun essere umano è sottoposto a tre cicli periodici, per quanto riguarda il proprio rendimento sul piano rispettivamente fisico, emotivo e intellettuale. Ogni ciclo presenta una fase positiva, una fase critica ed una fase negativa.

Questi tre cicli avrebbero un periodo rispettivamente di 27, 30 e 33 giorni, per cui è

sufficiente calcolare a quale giorno di ciascun ciclo corrisponde un qualsiasi giorno della nostra vita per sapere quale è, in quel giorno, il nostro rendimento sul piano fisico, emotivo

e intellettuale.

Purtroppo non è chiaro in quale giorno della nostra vita hanno inizio i tre cicli. Per logica dovrebbe essere il giorno del nostro concepimento. Per necessità assumiamo il giorno della nostra nascita, perché è l'unico che conosciamo con esattezza. Questo è il limite scientifico,

o

meglio non scientifico, della peraltro stuzzicante teoria dei bioritmi.

4.

L'UTENTE

Vogliamo dunque scrivere un programma che calcoli i bioritmi ad una qualsiasi persona interessata a conoscerli. Questa persona, per noi programmatori, sarà l'utente, e dovremo trattarlo con particolare riguardo. Poiché noi non lo conosciamo, ed egli può essere una qualsiasi persona, dalla più imbecille alla più geniale, dalla più ingenua e buona alla più astuta e malvagia, dobbiamo fare in modo da non farci prendere, come si suol dire, in castagna: cioè dobbiamo far sì che il nostro programma preveda qualsiasi sua reazione e non si inchiodi mai.

12

CAPITOLO TERZO

LA PROGETTAZIONE

1. LA BOZZA

Il nostro programma per il calcolo dei bioritmi dovrà eseguire le seguenti operazioni:

1) presentarsi all'utente; 2) fornire all'utente delle informazioni generali circa la teoria dei bioritmi; 3) determinare il giorno di nascita dell'utente; 4) determinare il giorno per il quale l'utente desidera che siano calcolati i bioritmi; 5) calcolare i bioritmi; 6) comunicare all'utente i risultati dei suoi calcoli; 7) chiedere all'utente se desidera il calcolo dei bioritmi per altri giorni ed eventualmente eseguirlo.

2. IL DIAGRAMMA DI FLUSSO

Possiamo denominare convenzionalmente le suesposte operazioni come segue.

1) FRONTESPIZIO; 2) INFORMAZIONI; 3) ANAGRAFICA; 4) DATIBIORITMO; 5) CALCOLI; 6) DIDASCALIA; 7) INTERROGATORIO.

Diciamo che ognuna di tali operazioni costituisce una procedura. Il nostro programma, dunque, consisterà in un insieme di procedure. Per chiarirci ulteriormente le idee, determiniamo l'ordine di esecuzione delle suddette procedure. Questo si fa disegnando un diagramma di flusso, come il seguente.

13

DIAGRAMMA DI FLUSSO DEL PROGRAMMA BIORITMI

START

a FRONTESPIZIO INFORMAZIONI ANAGRAFICA DATIBIORITMO CALCOLI DIDASCALIA INTERROGATORIO b c
a
FRONTESPIZIO
INFORMAZIONI
ANAGRAFICA
DATIBIORITMO
CALCOLI
DIDASCALIA
INTERROGATORIO
b
c

END

Avere disegnato il diagramma di flusso del nostro programma non è stata un'operazione inutile o banale, come può sembrare al nostro innocente lettore, che probabilmente si dice:

"Che problema c'è? Basta far eseguire le procedure nell'ordine in cui sono state scritte qui sopra!". Niente di più ingenuo. Infatti, eseguito il programma una prima volta (e per questo sì, che basta la sequenza nell'ordine di cui sopra), dobbiamo prevedere, come abbiamo visto, la possibilità della richiesta di altri calcoli per altri giorni da parte dell’utente. Per ottenere ciò, le sole procedure necessarie sono evidentemente DATIBIORITMO, CALCOLI, DIDASCALIA, INTERROGATORIO; le altre procedure sono inutili ed anzi inopportune, in quanto l'utente le ha già percorse e non ne ha più bisogno, quindi non vanno ripetute.

Per

chiarirci che il programma dopo la prima esecuzione completa deve eseguire soltanto

tali

quattro procedure, occorre dunque disegnare il suesposto diagramma di flusso. Esso va

letto come segue. Il flusso a, comprendente tutte le procedure, viene percorso subito dopo il lancio iniziale

del programma (START).

Il flusso b, comprendente le quattro procedure suddette, viene percorso nel caso in cui l’utente, nel corso della procedura INTERROGATORIO, chieda di calcolare i bioritmi per altri giorni. Il flusso c viene percorso nel caso in cui l'utente voglia porre termine all’esecuzione del

programma.

Il suesposto diagramma di flusso è quanto di più semplice esista, nel mondo dei diagrammi

di flusso. Si possono disegnare, per programmi particolari, diagrammi di flusso

14

complicatissimi. E' utile, quindi, disegnare un diagramma di flusso prima di scrivere un programma, specie se questo è complicato. Il diagramma di flusso costituisce già un progetto del programma. Nel prossimo capitolo cominceremo a scrivere il programma vero e proprio.

15

CAPITOLO QUARTO

LE PRIME PROCEDURE

1. LA PROCEDURA FRONTESPIZIO Dobbiamo scrivere, come abbiamo stabilito nel nostro progetto, una procedura di presentazione, che abbiamo deciso di chiamare FRONTESPIZIO. Nel linguaggio Pascal, ogni procedura viene formalmente suddivisa in tre parti:

1) intestazione, 2) blocco definizioni e dichiarazioni, 3) blocco istruzioni.

Possiamo per ora lasciare da parte il blocco definizioni e dichiarazioni: la nostra procedura FRONTESPIZIO ne può fare a meno. Vedremo più avanti, con altre procedure, in cosa consista il blocco definizioni e dichiarazioni. La nostra procedura FRONTESPIZIO sarà quindi composta da un’intestazione e da un blocco istruzioni. L’intestazione di una procedura è costituita dalla parola riservata PROCEDURE seguita dal nome della procedura. Una parola si dice riservata quando è specifica del linguaggio Pascal e quindi non può essere usata dal programmatore come nome, altrimenti si avrebbe una duplicazione e quindi il Compilatore non sarebbe in grado di riconoscere quale parola è specifica del linguaggio e quale no. L’intestazione della nostra procedura sarà quindi la seguente.

PROCEDURE FRONTESPIZIO

Dobbiamo ora scrivere il blocco istruzioni, che sarà composto dalle istruzioni costituenti la parte sostanziale della procedura, ossia le operazioni che si desidera vengano effettuate dal computer all’atto dell’esecuzione della procedura. Ora, quali saranno le istruzioni della procedura FRONTESPIZIO? Ogni programma che si rispetti si presenta in qualche modo all’ utente. Il frontespizio serve per comunicare all'utente l'identità e la funzione del programma, in modo che egli sappia cos'ha in mano e cosa può farne. Oltre a identità e funzione è buona norma che il frontespizio di un programma, come quello di un libro, riporti anche notizie sull’origine del programma e sul suo autore, in modo che anche in futuro esso possa essere identificato. Dobbiamo quindi far scrivere dal computer, il seguente frontespizio:

PROGRAMMA PER IL CALCOLO DEI BIORITMI

Programma di esercitazione da ‘Pascal Standard’ di G.C. Giacobbe

16

Si tratta in sostanza di far sì che il computer emetta dei dati in uscita, ossia in output. Tale output può essere emesso attraverso qualsiasi dispositivo di comunicazione fra il computer e l'operatore umano (stampante, schermo, ecc.). In questo caso useremo lo schermo video. L'istruzione usata per l'output dei dati sullo schermo video è WRITE. Essa, come dice la parola inglese che la costituisce, scrive sullo schermo video. Anzi, poiché dopo avere scritto ogni frase noi vogliamo andare a capo, dobbiamo più precisamente usare l’istruzione WRITELN. Essa, dopo avere scritto la frase sullo schermo, salta una linea (LN), cioè va a capo. Il blocco istruzioni della procedura FRONTESPIZIO sarà quindi composto da alcune istruzione WRITELN seguite rispettivamente dalla frase che si intende stampare su di una riga dello schermo video, oppure da niente, se si vuole stampare una riga vuota. La frase che si intende stampare (anche costituita da spazii vuoti) deve necessariamente essere racchiusa fra virgolette semplici e fra parentesi. Inoltre conviene iniziare la procedura FRONTESPIZIO con un'istruzione che cancelli lo schermo video, in quanto, al momento del lancio del disco contenente il programma registrato, il sistema operativo lascia sempre qualche messaggio sullo schermo. L'istruzione di cancellazione video è PAGE(OUTPUT).

Il blocco istruzioni di una procedura deve essere delimitato dalle parole riservate BEGIN,

END.

La nostra procedura FRONTESPIZIO si scriverà dunque come segue.

PROCEDURE FRONTESPIZIO; BEGIN PAGE(OUTPUT);

WRITELN ('

WRITELN ('PER IL CALCOLO DEI BIORITMI');

PROGRAMMA');

WRITELN;

WRITELN ('

Programma di esercitazione');

WRITELN ('da ‘Pascal standard‘ di G.C.Giacobbe')

END;

Gli spazii inseriti prima delle frasi PROGRAMMA e Programma di esercitazione hanno lo scopo di centrarle sullo schermo rispetto alle altre due frasi più lunghe PER IL CALCOLO DEI BIORITMI e

da ‘Pascal standard‘ di G.C.Giacobbe.

L’istruzione WRITELN non seguita da alcun messaggio ha lo scopo di lasciare una linea

vuota fra i due messaggi PER IL CALCOLO DEI BIORITMI e Programma di esercitazione.

Il segno di punto e virgola, che troveremo spesso nel seguito del nostro programma, serve

a delimitare fra loro le diverse proposizioni che lo costituiscono: le singole istruzioni;

l'intestazione della procedura dal blocco istruzioni; l'intera procedura dalle procedure

seguenti. Prima di END non bisogna mai mettere il punto e virgola.

La marginatura e l'incolonnamento, cioè l’impaginazione, della scrittura sopra riportata è

convenzionale ed ha lo scopo di distinguere fra loro le varie proposizioni della procedura,

in modo che possano essere immediatamente e facilmente individuate. Tale impaginazione

convenzionale è usata abitualmente dai programmatori nella scrittura di progammi in Pascal: questo fa sì che un programma in Pascal possa essere facilmente letto e compreso

da chiunque. Il Pascal richiede soltanto, come abbiamo visto, che fra una singola proposizione ed un'altra (intestazione, istruzione, etc.) sia presente, ove occorra, il punto e virgola. Oltre ad esso, si può interporre fra le singole proposizioni la quantità di spazio che

si vuole, da niente al singolo spazio, a più righe.

17

Dopo avere scritto l’intestazione, bisogna dare al nostro utente la possibilità di proseguire. La procedura scritta si limita esclusivamente a stampare sullo schermo video il frontespizio ma poi? Poi scriveremo altre procedure, naturalmente, che faranno altro. Ma adesso si presenta un problema: quando, faremo proseguire il nostro utente nell’esecuzione del programma? Dopo un minuto? Dopo cinque? Dopo dieci minuti? Se è veloce nel leggere il frontespizio, o se il frontespizio non gli interessa, o se lo conosce già, qualsiasi tempo noi scegliessimo, sarebbe sempre troppo lungo e noioso, per l'utente. Se l'utente è un semianalfabeta (ricordate, abbiamo detto che il nostro utente può essere chiunque), il tempo che sceglieremmo sarebbe sempre troppo breve. E allora? Allora, la cosa migliore è lasciare che sia l'utente stesso a scegliere quanto tempo tenersi davanti agli occhi il frontespizio, facendolo semplicemente sparire e facendo quindi proseguire l’esecuzione del programma a suo comando. Questa è la soluzione adottata da tutti i programmatori professionisti e tanto vale che impariamo ad adottarla subito anche noi. Ma come comunicare al programma il comando di proseguimento dell'utente? Evidentemente utilizzando un dispositivo di comunicazione fra l'utente e l'elaboratore, e precisamente un dispositivo di input, nella fattispecie la tastiera. E` proprio facendo premere all'utente un tasto, che gli si permette di proseguire nell'esecuzione del programma. Ma quale tasto? Normalmente, il tasto utilizzato a questo scopo è il cosiddetto CR (Carriage Return:

nomenclatura ereditata dalla macchine per scrivere), detto comunemente RETURN. Per far sì che il programma prosegua dopo l’azionamento del tasto RETURN si può utilizzare l’istruzione READ, la quale attende appunto che venga introdotto da tastiera un insieme di dati concluso con il tasto RETURN. L’insieme di dati può anche essere nullo: può cioè essere azionato il solo tasto RETURN. Scriveremo dunque un messaggio al nostro utente che lo inviterà a premere RETURN per proseguire ed ordineremo al computer di attendere l’azionamento di tale tasto per la prosecuzione dell’esecuzione del programma. Tale messaggio sarà esteticamente distanziato di una linea dai precedenti. L'intera procedura FRONTESPIZIO si presenta dunque come segue:

PROCEDURE FRONTESPIZIO; BEGIN PAGE(OUTPUT);

WRITELN ('

WRITELN ('PER IL CALCOLO DEI BIORITMI'); WRITELN;

WRITELN ('

WRITELN ('da ‘Pascal standard‘ di G.C.Giacobbe');

WRITELN; WRITE ('Premi RETURN per proseguire '); READ

PROGRAMMA');

Programma di esercitazione');

END;

Nota che con l'istruzione WRITE il cursore viene mantenuto sulla stessa riga del messaggio:

soluzione in questo caso esteticamente più elegante che il portare il cursore a capo con l'istruzione WRITELN). L’esecuzione dell’istruzione READ fa sì che il cursore divenga visibile e pulsi in attesa dell’introduzione di dati da tastiera. Ad ogni tasto battuto, la lettera corrispondente viene stampata sullo schermo, finché viene battuto il tasto RETURN, con il che l’esecuzione del programma prosegue all’istruzione seguente: nel nostro caso END, che pone fine alla procedura.

18

2. IL PROGRAMMA CON LA PRIMA PROCEDURA Un programma in Pascal si presenta formalmente come una sola procedura, detta procedura principale (composta, come ogni procedura, da un’intestazione, da un blocco

definizioni e dichiarazioni e da un blocco istruzioni), la quale contiene al suo interno, e precisamente nel blocco definizioni e dichiarazioni, tutte le singole procedure costituenti concretamente il programma.

A sua volta, ogni singola procedura può contenere al suo interno, sempre nel blocco

definizioni e dichiarazioni, altre procedure.

Il programma scritto in Pascal viene così a presentarsi come una nidificazione di

procedure, una dentro l’altra, presentanti tutte la stessa struttura: ecco perché il Pascal

viene detto linguaggio strutturato. L’intestazione della procedura principale è costituita dalla parola riservata PROGRAM seguita dal nome del programma, che nel nostro caso sarà ovviamente BIORITMI. Essa costituisce anche l’intestazione del programma. Nel nostro programma, quindi, l’intestazione della procedura principale sarà la seguente.

PROGRAM BIORITMI;

Nel Pascal Standard, se si usano procedure di input e di output, cioè di entrata e uscita di dati (e noi indubbiamente le useremo, perché introdurremo e riceveremo dei dati), occorre indicare fra parentesi, dopo il nome del programma, ossia della procedura principale, i nomi dei due files predefiniti INPUT, OUTPUT, che permettono appunto di introdure e ricevere dati. Quindi, la forma completa dell'intestazione della procedura principale sarà la seguente:

PROGRAM BIORITMI (INPUT,OUTPUT);

Come abbiamo detto, il blocco definizioni e dichiarazioni della procedura principale è costituito dalle singole procedure del programma. La procedura FRONTESPIZIO da noi scritta costituisce quindi il blocco definizioni e dichiarazioni della procedura principale finora costruita. Il blocco istruzioni della procedura principale è costituito dalle chiamate delle singole procedure del programma ed è come al solito delimitato dalle parole riservate BEGIN, END. Una chiamata di procedura costituisce un’istruzione che ordina l’esecuzione di quella procedura e consiste praticamente nel nome della procedura. Nel nostro caso, quindi, il blocco istruzioni della procedura principale sarà il seguente.

BEGIN

FRONTESPIZIO

END

Il nostro programma, allo stato attuale, si presenta dunque come segue:

{INTESTAZIONE della procedura principale} PROGRAM BIORITMI (INPUT,OUTPUT);

{blocco DEFINIZIONI E DICHIARAZIONI della procedura principale}

{DICHIARAZIONE della procedura FRONTESPIZIO} PROCEDURE FRONTESPIZIO; BEGIN

19

PAGE(OUTPUT); WRITELN ('

PROGRAMMA');

WRITELN ('PER IL CALCOLO DEI BIORITMI'); WRITELN;

WRITELN ('

WRITELN ('da ‘Pascal standard‘ di G.C.Giacobbe');

WRITELN; WRITE ('Premi RETURN per proseguire '); READ

Programma di esercitazione');

END;

{blocco ISTRUZIONI della procedura principale} BEGIN FRONTESPIZIO {CHIAMATA della procedura FRONTESPIZIO} END.

Le frasi fra parentesi grafe { } costituiscono dei commenti ad uso esclusivo del programmatore: esse non costituiscono istruzioni e quindi sono indifferenti in relazione all'esecuzione del programma.

L'END del BLOCCO ISTRUZIONI della procedura principale, segnando la fine del programma, va

necessariamente seguito dal punto. Un programma, e cioè la procedura principale che lo costituisce, presenterà sempre la struttura generale sopra riportata, cioè si presenterà sempre suddiviso nei tre blocchi componenti ogni procedura: 1) intestazione, 2) blocco definizioni e dichiarazioni, 3) blocco istruzioni.

3. LA PROCEDURA INFORMAZIONI Abbiamo deciso nel nostro progetto che la seconda procedura del nostro programma debba fornire all’utente delle informazioni generali circa la teoria dei bioritmi ed abbiamo deciso di chiamare INFORMAZIONI tale procedura. Dobbiamo quindi scrivere una procedura che stampi sullo schermo le informazioni che intendiamo fornire all'utente. Essa sarà la seguente:

PROCEDURE INFORMAZIONI; BEGIN

PAGE(OUTPUT); WRITELN ('INFORMAZIONI':46); WRITELN; WRITELN ('Secondo la teoria dei bioritmi,); WRITELN ('l`essere umano è sottoposto'); WRITELN ('a tre cicli biologici'); WRITELN ('che influiscono sul suo rendimento'); WRITELN( 'fisico, emotivo e intellettuale.'); WRITELN ('Essi si intersecano, facendo sì'); WRITELN ('che per ogni giorno della sua vita'); WRITELN ('egli si trovi ad attraversare'); WRITELN ('una determinata fase'); WRITELN ('per ciascuno dei tre cicli.'); WRITELN ('Questo programma ti dà'); WRITELN ('la possibilità di determinare,'); WRITELN ('per ciascun giorno della tua vita,'); WRITELN ('il tuo rendimento fisico,'); WRITELN ('emotivo e intellettuale.');

20

WRITELN; WRITE ('Premi RETURN per proseguire '); READ

END;

La prima istruzione, PAGE(OUTPUT), serve a cancellare la schermata precedente, quella del frontespizio, e ad introdurre la nuova schermata delle informazioni. La seconda istruzione, WRITELN ('INFORMAZIONI':46), stampa sullo schermo video il titolo della schermata (INFORMAZIONI). Al fine estetico di porre tale titolo al centro della linea, si introduce nell'istruzione la lunghezza in caratteri (46) del campo all'interno del quale, alli- neata sulla destra, la scritta deve essere stampata: essa risulta così, in uno schermo di 80 caratteri per riga, che è quello normalmente usato per il Pascal (e al quale si farà d'ora in avanti riferimento), esattamente al centro della riga, infatti 40 (metà della riga) + 6 (metà della scritta) = 46. L’istruzione WRITELN vuota (non seguita da alcuna frase) permette di distanziare di una linea il titolo dal testo. Le altre istruzioni WRITELN stampano sullo schermo la didascalia voluta. Notare che la scrittura del programma permette automaticamente di controllare l’incolonnamento delle frasi sullo schermo, semplicemente incolonnandole nel programma, lasciando quindi eventualmente degli spazii fra il margine di sinistra e la frase. Ciò vale naturalmente soltanto per un testo incolonnato a sinistra; per la centratura della frase al centro dellla linea occorre ricorrere all’artificio usato nell’istruzione WRITELN

('INFORMAZIONI': 46).

4. IL PROGRAMMA CON LE PRIME DUE PROCEDURE

Ecco dunque come si presenterà il nostro programma con le due prime procedure:

{INTESTAZIONE della procedura principale} PROGRAM BIORITMI (INPUT,OUTPUT); {blocco DEFINIZIONI E DICHIARAZIONI della procedura principale}

{DICHIARAZIONE della procedura FRONTESPIZIO} PROCEDURE FRONTESPIZIO; BEGIN

PAGE(OUTPUT);

WRITELN ('

PROGRAMMA');

WRITELN ('PER IL CALCOLO DEI BIORITMI');

WRITELN;

WRITELN ('

Programma di esercitazione');

WRITELN ('da ‘Pascal standard‘ di G.C.Giacobbe'); WRITELN;

WRITE ('Premi RETURN per proseguire '); READ

END;

{DICHIARAZIONE della procedura INFORMAZIONI} PROCEDURE INFORMAZIONI; BEGIN

PAGE(OUTPUT); WRITELN ('INFORMAZIONI':46); WRITELN; WRITELN ('Secondo la teoria dei bioritmi,); WRITELN ('l`essere umano è sottoposto');

21

WRITELN ('a tre cicli biologici'); WRITELN ('che influiscono sul suo rendimento'); WRITELN( 'fisico, emotivo e intellettuale.'); WRITELN ('Essi si intersecano, facendo sì'); WRITELN ('che per ogni giorno della sua vita'); WRITELN ('egli si trovi ad attraversare'); WRITELN ('una determinata fase'); WRITELN ('per ciascuno dei tre cicli.'); WRITELN ('Questo programma ti dà'); WRITELN ('la possibilità di determinare,'); WRITELN ('per ciascun giorno della tua vita,'); WRITELN ('il tuo rendimento fisico,'); WRITELN ('emotivo e intellettuale.'); WRITELN; WRITE ('Premi RETURN per proseguire '); READ

END;

{blocco ISTRUZIONI della procedura principale} BEGIN FRONTESPIZIO; INFORMAZIONI END.

22

CAPITOLO QUINTO

L'INTRODUZIONE DEI DATI

1. LA PROCEDURA ANAGRAFICA

Si tratta ora di raccogliere i dati anagrafici relativi all'utente. Cercheremo quindi di affidare ad una procedura, che abbiamo deciso in fase di progetto di chiamare ANAGRAFICA, la gestione di un colloquio avente come fine la raccolta di tali dati. Il colloquio dovrà essere tuttavia il più possibile simpatico ed accattivante per l'utente.

Uno dei principii fondamentali della programmazione è infati quello di mettere l'utente a suo completo agio, creandogli meno problemi possibile e permettendogli quindi la massima libertà di reazione. E` quello che gli americani intendono esprimere con l'espressione friendly use. Non bisogna nascondersi che la stesura di un programma orientato verso l'utente comporta certamente un maggior lavoro per il programmatore, esattamente come certe macchine completamente automatiche hanno comportato una lunga progettazione. Infatti, occorre prevedere tutte le reazioni possibili da parte dell'utente. Ma questa è la direzione nella quale la programmazione sta camminando e non saremo certo noi che ne arresteremo la marcia. Nella procedura ANAGRAFICA cominceremo con il chiedere all' utente, con le dovute buone maniere, il suo nome, in modo da potere rivolgerci a lui personalmente nel seguito, il che è sempre una cosa che all’utente fa piacere e permette di instaurare un rapporto amichevole fra utente e computer, il quale altro non è, non dimentichiamolo, che una emanazione del programmatore. Passeremo quindi a chiedere all’utente la sua data di nascita, che è il dato fondamentale per il calcolo dei bioritmi.

2. RICHIESTA DEL NOME

Per poter rivolgerci all'utente usando il suo nome nel seguito del programma, occorre ovviamente non soltanto conoscere tale nome (per il che come abbiamo visto è sufficiente domandarlo con l’istruzione READ), ma anche registrarlo da qualche parte.

Ma come possiamo farlo? Nei linguaggi di programmazione vi sono delle cose chiamate variabili, le quali hanno appunto il compito di registrare i dati che vengono loro assegnati. Sarà quindi sufficiente assegnare ad una variabile il nome dell’utente ed usare quella variabile tutte le volte che si vuole riprodurre tale nome. Come chiameremo la variabile nella quale memorizzeremo il nome dell'utente? Ossia:

quale sarà l'identificatore di tale variabile? Ovviamente il più banale: NOME. Scriveremo quindi:

PROCEDURE ANAGRAFICA; BEGIN

PAGE(OUTPUT); WRITE ('Ciao, come ti chiami? ');

23

READLN (NOME)

END;

L’istruzione WRITE ('Ciao, come ti chiami? ') stampa sullo schermo la frase Ciao, come ti chiami? seguita da due spazii, che permettono di distanziare la risposta. L’istruzione READLN (NOME) arresta l'esecuzione del programma e attende un INPUT da tastiera, ossia attende che l'utente scriva il suo nome e lo faccia seguire da RETURN; con ciò, il nome scritto dall'utente viene stampato automaticamente sullo schermo di seguito alla domanda e viene memorizzato ed associato alla variabile NOME; quindi il cursore va a capo (LN): questa soluzione è esteticamente necessaria, in quanto avremo altri dati da chiedere ed è bene distinguerli nettamente uno dall’altro ponendoli su linee diverse accanto alla rispettiva domanda. D'ora in avanti, nel nostro programma, tutte le volte che vorremo scrivere il nome dell'utente, sarà dunque sufficiente usare la variabile NOME. Nel Pascal è tuttavia necessario che le variabili usate siano precedute da una loro dichiarazione, nella quale sia determinato il tipo al quale appartengono i dati che verranno loro assegnati (numeri interi, numeri reali, insiemi di caratteri, ecc.). Nel nostro caso si tratta di un insieme di caratteri. Questo tipo di dati viene denominato in Pascal Packed Array of Char. Ora, il problema è questo: la dichiarazione della variabile NOME va scritta nella procedura ANAGRAFICA oppure nella procedura principale? Per risolvere questo quesito, occorre prima rispondere alla seguente domanda: la variabile in oggetto viene usata esclusivamente all'interno della procedura ANAGRAFICA, oppure viene usata anche in altre parti del programma? A questa domanda abbiamo in realtà già risposto prima: vogliamo rivolgerci all'utente usando il suo nome in qualsiasi momento dello svolgimento del programma, quindi tale variabile deve poter essere usata in qualsiasi parte del programma. In altri termini, essa è una variabile globale e la sua dichiarazione va scritta nel blocco definizioni e dichiarazioni della procedura principale, in questo modo:

PROGRAM BIORITMI (INPUT,OUTPUT);

VAR NOME : PACKED ARRAY[1

15] OF CHAR;

La scrittura degli indici [1 (notare le parentesi quadre e i due puntini) fa sì che

ammettiamo come dato da assegnare alla variabile NOME una qualsiasi stringa (abominevole traduzione dell’inglese string: insieme di caratteri) lunga fino a 15 caratteri, i

quali sono più che sufficienti per registrare anche il nome più strampalato.

15]

3. RICHIESTA DELLA DATA DI NASCITA Si tratta ora di introdurre fra i dati memorizzati dal computer la data di nascita dell'utente. Poiché la data di nascita è in realtà composta da tre numeri (giorno, mese, anno), occorre creare tre variabili numeriche, che trattandosi di numeri interi saranno di tipo Integer. Per quanto riguarda gli identificatori da usare per tali variabili, occorre fare in modo che essi si distinguano dagli identificatori che useremo per memorizzare la data del giorno per il quale si chiede il bioritmo: occorre cioè che essi riportino in qualche modo un riferi- mento alla nascita, anziché al bioritmo. Banalmente, essi potranno essere GIORNON, MESEN, ANNON, intendendo con N un riferimento alla nascita.

24

Le istruzioni di INPUT saranno quindi le seguenti:

READLN (GIORNON); READLN (MESEN); READLN (ANNON);

Dove andranno scritte le dichiarazioni relative a tali variabili? Esse saranno usate anche al

di fuori della procedura ANAGRAFICA? Evidentemente sì: infatti, come abbiamo detto, la

data di nascita verrà utilizzata quale dato fondamentale nella procedura di calcolo dei

bioritmi. Quindi, anche questa volta, si tratterà di variabili globali ed esse dovranno essere dichiarate nel blocco definizioni e dichiarazioni della procedura principale, che diverrà il

seguente:

PROGRAM BIORITMI (INPUT,OUTPUT);

VAR NOME : PACKED ARRAY[1

GIORNON,MESEN,ANNON : INTEGER;

15] OF CHAR;

Per il solito ovvio bisogno di aiutare il più possibile l'utente, aggiungeremo ora delle indicazioni atte ad agevolare l'INPUT dei dati:

WRITE ('Scrivi il numero del tuo giorno di nascita '); READLN (GIORNON); WRITE ('Scrivi il numero del tuo mese di nascita '); READLN (MESEN); WRITE ('Scrivi il numero del tuo anno di nascita '); READLN (ANNON);

A questo punto occorre prevenire ed evitare una trappola: noi non sappiamo se l'utente

introdurrà il numero dell'anno per intero oppure in modo parziale (ad esempio, 68, oppure 968, al posto di 1968 ) e dobbiamo comunque dargli l'opportunità di fare una qualsiasi di queste cose: è appunto questa la filosofia del friendly use. Per ottenere ciò, dobbiamo introdurre, dopo la lettura del dato relativo alla variabile ANNON, le seguenti istruzioni:

IF ANNON<100 THEN ANNON:=ANNON+1900; IF ANNON<1000 THEN ANNON:=ANNON+1000;

Si tratta di due istruzioni di controllo (IF

THEN abbiamo in entrambi i casi un' istruzione di assegnazione, caratterizzata dall'operatore :=. L’operatore := viene detto operatore di assegnazione in quanto assegna il valore che lo segue alla variabile che lo precede. Con essa viene assegnato alla variabile ANNON il valore già ritenuto dalla stessa variabile, aumentato rispettivamente del valore 1900 e 1000.

in cui come istruzione seguente al

THEN

),

4. LA PROCEDURA ANAGRAFICA COMPLETA La procedura ANAGRAFICA completa si presenterà dunque come segue:

PROCEDURE ANAGRAFICA; BEGIN

PAGE(OUTPUT);

25

WRITE ('Ciao, come ti chiami? '); READLN (NOME); WRITELN; WRITE ('Scrivi il numero del tuo giorno di nascita: '); READLN (GIORNON); WRITE ('Scrivi il numero del tuo mese di nascita: '); READLN (MESEN); WRITE ('Scrivi il numero del tuo anno di nascita: '); READLN (ANNON); IF ANNON<100 THEN ANNON:=ANNON+1900; IF ANNON<1000 THEN ANNON:=ANNON+1000

END;

5. LA PROCEDURA DATIBIORITMO Dobbiamo ora introdurre i dati relativi alla data del giorno per il quale l'utente desidera conoscere i bioritmi. La procedura, che abbiamo già deciso di chiamare DATIBIORITMO, sarà analoga alla procedura ANAGRAFICA. In essa vi saranno tre variabili, GIORNOB, MESEB, ANNOB, analoghe

a GIORNON, MESEN, ANNON, le quali, per gli stessi motivi, andranno dichiarate nella procedura principale. La procedura DATIBIORITMO sarà quindi la seguente:

PROCEDURE DATIBIORITMO; BEGIN

WRITELN;WRITELN; WRITELN ('Dati relativi alla data del bioritmo:'); WRITE ('Scrivi il numero del giorno: '); READLN (GIORNOB); WRITE ('Scrivi il numero del mese: '); READLN (MESEB); WRITE ('Scrivi il numero dell’anno: '); READLN (ANNOB); IF ANNOB<100 THEN ANNOB:=ANNOB+1900; IF ANNOB<1000 THEN ANNOB:=ANNOB+1000

END;

La procedura è analoga alla precedente. Essa è introdotta dalle due istruzioni WRITELN, in quanto non è il caso di cambiare schermata, essendo più che sufficiente lo spazio rimanente sul video dopo il precedente INPUT, ottenuto con la procedura ANAGRAFICA, per introdurre i dati richiesta da questa procedura.

6. IL PROGRAMMA CON QUATTRO PROCEDURE

Il nostro programma si presenta a questo punto come segue:

{INTESTAZIONE della procedura principale} PROGRAM BIORITMI (INPUT,OUTPUT); {blocco DEFINIZIONI E DICHIARAZIONI della procedura principale}

{DICHIARAZIONI delle VARIABILI} VAR

26

GIORNOB,MESEB,ANNOB : INTEGER;

{DICHIARAZIONI delle procedure}

{DICHIARAZIONE della procedura FRONTESPIZIO} PROCEDURE FRONTESPIZIO; BEGIN

PAGE(OUTPUT);

WRITELN ('

PROGRAMMA');

END;

WRITELN ('PER IL CALCOLO DEI BIORITMI'); WRITELN;

WRITELN ('

WRITELN ('da ‘Pascal standard‘ di G.C.Giacobbe'); WRITELN; WRITE ('Premi RETURN per proseguire '); READ

Programma di esercitazione');

{DICHIARAZIONE della procedura INFORMAZIONI} PROCEDURE INFORMAZIONI; BEGIN

PAGE(OUTPUT); WRITELN ('INFORMAZIONI':46); WRITELN; WRITELN ('Secondo la teoria dei bioritmi,); WRITELN ('l`essere umano è sottoposto'); WRITELN ('a tre cicli biologici'); WRITELN ('che influiscono sul suo rendimento'); WRITELN ('fisico, emotivo e intellettuale.'); WRITELN ('Essi si intersecano, facendo sì'); WRITELN ('che per ogni giorno della sua vita'); WRITELN ('egli si trovi ad attraversare'); WRITELN ('una determinata fase'); WRITELN ('per ciascuno dei tre cicli.'); WRITELN ('Questo programma ti dà'); WRITELN ('la possibilità di determinare,'); WRITELN ('per ciascun giorno della tua vita,'); WRITELN ('il tuo rendimento fisico,'); WRITELN ('emotivo e intellettuale.'); WRITELN; WRITE ('Premi RETURN per proseguire '); READ

END;

{DICHIARAZIONE della procedura ANAGRAFICA} PROCEDURE ANAGRAFICA; BEGIN

PAGE(OUTPUT); WRITE ('Ciao, come ti chiami? '); READLN (NOME); WRITELN; WRITE ('Scrivi il numero del tuo giorno di nascita: '); READLN (GIORNON); WRITE ('Scrivi il numero del tuo mese di nascita: '); READLN (MESEN); WRITE ('Scrivi il numero del tuo anno di nascita: '); READLN (ANNON); IF ANNON<100 THEN ANNON:=ANNON+1900; IF ANNON<1000 THEN ANNON:=ANNON+1000

27

END;

{DICHIARAZIONE della procedura DATIBIORITMO} PROCEDURE DATIBIORITMO; BEGIN

WRITELN;WRITELN; WRITELN ('Dati relativi alla data del bioritmo:'); WRITE ('Scrivi il numero del giorno: '); READLN (GIORNOB); WRITE ('Scrivi il numero del mese: '); READLN (MESEB); WRITE ('Scrivi il numero dell’anno: '); READLN (ANNOB); IF ANNOB<100 THEN ANNOB:=ANNOB+1900; IF ANNOB<1000 THEN ANNOB:=ANNOB+1000

END;

{BLOCCO ISTRUZIONI della procedura principale} BEGIN FRONTESPIZIO; INFORMAZIONI; ANAGRAFICA; END.

DATIBIORITMO

28

CAPITOLO SESTO

I CALCOLI

1. LA FUNZIONE GIORNIMESE Occorre ora procedere ai calcoli. Si tratta di calcolare esattamente quanti giorni sono trascorsi dal giorno della nascita al giorno per il quale si vuole calcolare i bioritmi, tenendo conto anche degli anni bisestili. Abbiamo deciso in fase di progetto di chiamare CALCOLI tale procedura. La cosa migliore, come sempre, è dividere il problema in sottoproblemi più semplici. Cominceremo con il calcolare quanti giorni sono contenuti nel mese di nascita, dal giorno

di nascita alla fine del mese; poi calcoleremo quanti giorni sono compresi nei mesi che

intercorrono dal mese di nascita alla fine dell'anno di nascita; indi aggiungeremo ai giorni

fin qui calcolati i giorni contenuti negli anni compresi fra l'anno di nascita e l'anno del

bioritmo; infine aggiungeremo, a quelli già calcolati, i giorni compresi fra l'inizio dell'anno del bioritmo e il giorno del bioritmo; la somma totale sarà il numero da noi richiesto. I lettori più sagaci avranno subito notato che è indispensabile, per effettuare il suddetto calcolo, che il computer conosca l'esatto numero di giorni di ciascun mese dell'anno. Poiché il computer non nasce con la scienza infusa, almeno non relativamente ai mesi dell' anno, occorre che glielo diciamo noi. Ma come? Bisogna ovviamente che creiamo a questo scopo una procedura apposta. Anzi, poiché tale procedura avrà lo scopo di fornire di volta

in

volta alla procedura che effettuerà i calcoli il numero dei giorni di un determinato mese,

in

realtà essa sarà una funzione.

Si

chiama infatti funzione una speciale procedura che ha lo scopo di fornire dei dati ad

altre procedure. Chiameremo banalmente tale funzione GIORNIMESE. La cosa funzionerà così: la procedura CALCOLI passerà alla funzione GIORNIMESE un parametro consistente nel

numero d'ordine del mese per il quale vogliamo conoscere il numero dei giorni; la funzione GIORNIMESE risponderà trasmettendo alla procedura CALCOLI il numero dei giorni corrispondente al mese in oggetto.

La funzione GIORNIMESE sarà quindi la seguente:

FUNCTION GIORNIMESE (MESE:INTEGER) : INTEGER; BEGIN

CASE MESE OF

1 : GIORNIMESE:=31;

2 : GIORNIMESE:=28;

3 : GIORNIMESE:=31;

4 : GIORNIMESE:=30;

5 : GIORNIMESE:=31;

6 : GIORNIMESE:=30;

7 : GIORNIMESE:=31;

8 : GIORNIMESE:=31;

9 : GIORNIMESE:=30;

10 : GIORNIMESE:=31;

11 : GIORNIMESE:=30;

12 : GIORNIMESE:=31

END

29

END;

La parola FUNCTION è una parola riservata, che introduce obbligatoriamente una funzione. L'espressione contenuta entro parentesi (MESE:INTEGER) indica il parametro passato alla funzione, consistente nel valore della variabile MESE (numero ordinale del mese) e il tipo di tale variabile (INTEGER, cioè numero intero). La parola INTEGER preceduta dal segno di due punti indica il tipo cui appartiene la funzione stessa, o meglio il tipo cui appartiene la variabile funzionale GIORNIMESE avente lo stesso nome della funzione e assumente il valore nel numero dei giorni del mese richiesto. Il valore importato dalla funzione consiste nel valore del parametro MESE. Il valore esportato dalla funzione consiste nel valore assunto dalla variabile funzionale GIORNIMESE in seguito all'esecuzione dell'istruzione CASE OF. L'istruzione CASE OF funziona nel modo seguente: nel caso in cui la variabile MESE assuma il valore 1, viene eseguita l'istruzione di assegnazione GIORNIMESE:=31; nel caso che la variabile MESE assuma il valore 2, viene eseguita l'istruzione di assegnazione

GIORNIMESE:=28; e così via.

Il primo END pone termine all'istruzione CASE OF. Il secondo END pone termine al blocco istruzioni della funzione.

2. LE DEFINIZIONI NELLA PROCEDURA

Abbiamo parlato precedentemente di un blocco definizioni e dichiarazioni di una procedura ed abbiamo visto in cosa consistono le dichiarazioni. Ma in cosa consistono le definizioni? Se noi volessimo non ripetere nella scrittura della funzione GIORNIMESE i dati 31, 30, 28, che essendo ben determinati costituiscono delle costanti, ma usare al loro posto degli identificatori, ad esempio rispettivamente A, B, C, dovremmo determinare a priori che tali identificatori rappresentano delle costanti ed enunciarne il valore. Dovremmo cioè scrivere quanto segue.

CONST A = 31 ; B = 30 ; C = 28;

Questa costituisce una definizione delle costanti A, B, C e va riportata nel blocco definizioni e dichiarazioni della procedura nella quale le costanti A, B, C sono usate. Nel nostro caso, la stessa funzione GIORNIMESE.

La parola riservata CONST introduce la definizione delle costanti. Il segno = è un operatore di assegnazione: assegna un valore alle costanti definite.

Per il nostro programma, il ricorso alla definizione di tali costanti è praticamente inutile, essendo in esso poche le ricorrenze dei valori 31, 30 e 28. Ma per un programma in cui stessi valori ricorressero molto frequentemente, indubbiamente l’uso di identificatori può risultare molto utile. In quest’ultimo caso occorre ricorrere alla loro definizione. Al solo fine didattico di usare le definizioni nel blocco definizioni e dichiarazioni di una procedura, riporteremo dunque nel blocco definizioni e dichiarazioni della funzione GIORNIMESE la definizione delle costanti A, B, C.

Un altro uso delle definizioni in una procedura riguarda i tipi.

30

Se l’uso di un tipo è molto ricorrente nel programma, può essere utile invece della ripetizione del suo nome proprio (ad esempio INTEGER), l’uso di un identificatore di abbreviazione, ad esempio I. In questo caso, come per la definizione degli identificatori delle costanti, occorre enunciare la definizione di tale identificatore di tipo, nel modo seguente.

TYPE I = INTEGER;

Anche questa costituisce una definizione e va riportata nel blocco definizioni e dichiarazioni della procedura nella quale tale tipo è usato. Nel nostro programma, trattandosi di un tipo usato in diverse procedure, la sua definizione sarà riportata nel blocco definizioni e dichiarazioni della procedura principale.

La parola riservata TYPE introduce la definizione dei tipi. Il segno = è un operatore di assegnazione: assegna il tipo all’identificatore definito.

Per il nostro programma, il ricorso alla definizione del tipo INTEGER è praticamente inutile, essendo in esso relativamente poche le ricorrenze di tale tipo. Ma nel caso in cui uno stesso tipo ricorresse molto frequentemente in un programma e nel caso in cui un tipo fosse il ri- sultato di un’operazione fra tipi diversi, indubbiamente l’uso degli identificatori può risultare molto utile. In quest’ultimo caso occorre ricorrere alla sua definizione.

Al solo fine didattico di usare le definizioni nel blocco definizioni e dichiarazioni di una procedura, riporteremo dunque nel blocco definizioni e dichiarazioni della procedura principale la definizione del tipo I (INTEGER).

La funzione GIORNIMESE diviene quindi la seguente.

FUNCTION GIORNIMESE (MESE:I) : I; CONST A = 31; B = 30; C = 28; BEGIN

CASE MESE OF

1 : GIORNIMESE:=A;

2 : GIORNIMESE:=C;

3 : GIORNIMESE:=A;

4 : GIORNIMESE:=B;

5 : GIORNIMESE:=A;

6 : GIORNIMESE:=B;

7 : GIORNIMESE:=A;

8 : GIORNIMESE:=A;

9 : GIORNIMESE:=B;

10 : GIORNIMESE:=A;

11 : GIORNIMESE:=B;

12 : GIORNIMESE:=A

END

END;

3. LA PROCEDURA CALCOLI: PRIMA PARTE Scritta la funzione GIORNIMESE, veniamo ora a scrivere la procedura CALCOLI.

31

Occorre innanzi tutto calcolare quanti giorni sono compresi fra il giorno di nascita e la fine dello stesso anno. Ciò si può fare sommando tutti i giorni dei mesi, da quello di nascita a dicembre, e sottraendovi poi i giorni compresi fra l'inizio del mese e il giorno di nascita. Il che si può esprimere come segue:

GAN:=0;

FOR MESE := MESEN TO 12 DO GAN:=GAN+GIORNIMESE(MESE);

GAN:=GANGIORNON+1;

La prima istruzione, GAN:=0, che abbiamo visto essere un’istruzione di assegnazione, assegna valore 0 alla variabile GAN (acronimo della locuzione ‘Giorni dell’Anno di Na- scita’), il cui compito è quello di memorizzare appunto il numero dei giorni dell'anno di nascita. L’assegnazione del valore 0 alla variabile GAN è indispensabile, in quanto il Pascal attribuisce valore indefinito a ciascuna variabile, prima che a questa venga attribuito un valore preciso mediante un'istruzione di assegnazione, e poiché il Compilatore dà errore se una variabile interviene con valore indefinito in un'istruzione computazionale, occorre fare precedere l'istruzione di incremento del valore di GAN da un'istruzione di assegnazione iniziale di valore alla stessa variabile GAN. E' logico, naturalmente, che il valore iniziale assegnato sia 0, poiché ad esso si devono aggiungere i valori che, incrementandosi, portano al valore finale. La seconda istruzione, FOR MESE:=MESEN TO 12 DO, è un’istruzione di iterazione: essa esegue un loop (ciclo di ripetizione), ossia ripete l’esecuzione dell’istruzione che segue la parola DO, nel nostro caso GAN:=GAN+GIORNIMESE(MESE) (tale istruzione è delimitata dal punto e virgola), tante volte quanti sono i valori in numeri interi assunti dall’espressione che precede il TO (nel nostro caso, MESEN), fino a raggiungere il valore dell’espressione che lo segue (nel nostro caso, 12). In pratica, l’istruzione GAN:=GAN+ GIORNIMESE(MESE) viene eseguita tante volte quanti sono i mesi da quello di nascita a dicembre, cioè a 12. Supponiamo che l'utente abbia indicato giugno come mese di nascita, cioè abbia assegnato, in INPUT, alla variabile MESEN, il valore 6. Il loop consisterà in 7 cicli, dove la variabile di controllo, MESE, assumerà dei valori che varieranno, in aumento, da 6 a 12. Ad ogni ciclo, mediante la chiamata di procedura GIORNIMESE (MESE), verrà attivata la funzione GIORNIMESE, a cui verrà passato il parametro MESE, il quale varierà, come abbiamo visto, da 6 a 12. Pertanto la variabile funzionale GIORNIMESE assumerà ad ogni ciclo il numero dei giorni relativo al mese il cui numero d'ordine è indicato dal parametro MESE. Verranno così calcolati i giorni di ciascun mese da quello di nascita a dicembre. Questi giorni dovranno ovviamente sommarsi l'uno all'altro, il che viene effettuato dall'istruzione

GAN:=GAN+ GIORNIMESE(MESE).

L'istruzione DO non va seguita dal punto e virgola. La terza istruzione, GAN:=GANGIORNON+1, sottrae dalla somma sopra ottenuta il numero dei giorni intercorrenti dall'inizio del mese di nascita al giorno di nascita (occorre aggiungere 1 perché nella sottrazione viene sottratto anche il giorno di nascita, che invece va computato). Si otterrrà quindi il numero dei giorni dell'anno di nascita come valore attribuito alla variabile GAN. La variabile GAN, fornendo una somma parziale della somma generale dei giorni intercorrenti fra il giorno di nascita e il giorno per il quale sono calcolati i bioritmi, non servirà al di fuori della procedura CALCOLI, per cui essa è certamente una variabile locale; quindi dovrà essere dichiarata nel blocco definizioni e dichiarazioni della stessa procedura CALCOLI, insieme con la variabile MESE, anch’essa variabile locale.

32

Effettuiamo ora, in modo analogo, il calcolo dei giorni dell'anno del bioritmo. Creeremo a tale scopo un’altra variabile locale, che chiameremo GAB (acronimo della locuzione ‘Giorni dell’Anno del Bioritmo’). L’algoritmo di calcolo sarà il seguente.

GAB:=0;

FOR MESE:=1 TO MESEB DO GAB:=GAB+GIORNIMESE(MESE); GAB:=GAB(GIORNIMESE(MESEB)GIORNOB);

Le istruzioni sono esattamente le stesse del gruppo precedente, con diverse variabili e valori.

L’istruzione GAB:=GAB+GIORNIMESE(MESE), eseguita tante volte quanti sono i mesi compresi

fra gennaio e il mese del bioritmo, aggiunge alla variabile GAB ogni volta il valore assunto

dalla variabile funzionale GIORNIMESE in seguito alla chiamata (attivazione) della omonima funzione (eseguita con l’istruzione GIORNIMESE (MESE)), a cui viene passato il parametro MESE. Verranno così calcolati i giorni di ciascun mese da gennaio al mese del bioritmo e sommati fra loro. Con l’istruzione GAB:=GAB(GIORNIMESE(MESEB)GIORNOB) verrà sottratto dal valore calcolato sopra la differenza fra il numero dei giorni del mese del bioritmo (GIORNIMESE(MESEB):

valore assunto dalla variabile funzionale GIORNIMESE in seguito alla chiamata della omonima funzione a cui viene passato il parametro MESEB) e il numero del giorno del bioritmo (GIORNOB), in modo da avere nella somma non l’intero ammontare dei giorni del mese del bioritmo, ma soltanto i giorni trascorsi fra l’inizio di quel mese e il giorno del bioritmo. Anche la variabile locale GAB è una variabile locale; quindi dovrà essere dichiarata nel blocco definizioni e dichiarazioni della procedura CALCOLI.

Ci rimane adesso da sommare a GAN e a GAB il numero dei giorni contenuti negli anni

compresi fra l'anno di nascita e l'anno del bioritmo, il che si ottiene con l'istruzione

seguente:

INTERVALLO:=(ANNOBANNON1)*365+GAN+GAB;

dove la variabile INTERVALLO, variabile globale che dovrà essere dichiarata nel blocco definizioni e dichiarazioni della procedura principale, in quanto verrà utilizzata anche nell’ambito di altre procedure, deterrà finalmente il valore dei giorni compresi fra il giorno di nascita e il giorno del bioritmo.

La procedura CALCOLI si presenta quindi, fino a questo punto, come segue:

PROCEDURE CALCOLI; VAR MESE,GAN,GAB : I; BEGIN

GAN:=0;

FOR MESE:=MESEN TO 12 DO GAN:=GAN+GIORNIMESE(MESE);

GAN:=GANGIORNON+1;

GAB:=0;

FOR MESE:=1 TO MESEB DO GAB:=GAB+GIORNIMESE(MESE); GAB:=GAB(GIORNIMESE(MESEB)GIORNOB);

33

INTERVALLO:=(ANNOBANNON1)*365+GAN+GAB

END;

4.

LA PROCEDURA CALCOLI: GLI ANNI BISESTILI

Si

tratta ora di calcolare i giorni che eventualmente vanno aggiunti al valore già calcolato

di

INTERVALLO, in seguito alla presenza di anni bisestili nel periodo compreso fra l'anno di

nascita e l'anno del bioritmo compresi.

Prendiamo prima in considerazione l'anno di nascita. Perché si debba aggiungere un giorno, sono richieste due condizioni: la prima è ovviamente che l'anno di nascita sia

bisestile; la seconda è che il mese di nascita sia anteriore a marzo. Tutto ciò si esprime con

la seguente istruzione:

IF (MESEN<3) AND (ANNON MOD 4 = 0) THEN INTERVALLO:=INTERVALLO+1;

In questa istruzione sono espresse le due condizioni, MESEN<3 e ANNON MOD 4 = 0 (che debbono sussistere contemporaneamente, come indica AND), e la conseguenza, INTERVALLO:= INTERVALLO+1. La condizione MESEN<3 significa che il valore numerico della variabile MESEN deve essere inferiore a 3, cioè che il mese di nascita deve essere o gennaio o febbraio. La condizione ANNON MOD 4 = 0 significa che il resto della divisione fra i due numeri interi ANNON e 4 deve essere uguale a 0, il che appunto permette di appurare se l'anno di nascita è un anno bisestile. Se le due condizioni si avverano, viene eseguita l’istruzione contenuta nella conseguenza, INTERVALLO:=INTERVALLO+1: la variabile INTERVALLO viene quindi aumentata di 1, cioè viene aggiunto il giorno corrispondente al 29 febbraio dell’anno di nascita, bisestile.

Prendiamo ora in considerazione l'anno del bioritmo. Qui, perché si debba aggiungere un giorno, sono richieste tre condizioni: la prima è ovviamente che l'anno del bioritmo sia bisestile; la seconda è che il mese del bioritmo sia posteriore a febbraio; la terza è che l'anno del bioritmo non coincida con l'anno di nascita, perché in tal caso il giorno in più è già stato aggiunto. Tutto ciò si esprime, analogamente all'istruzione precedente, con la seguente istruzione:

IF (MESEB>2) AND (ANNOB MOD 4 = 0) AND (ANNOB<>ANNON) THEN INTERVALLO:=INTERVALLO+1;

La condizione ANNOB<>ANNON significa che il valore della variabile ANNOB deve essere diverso dal valore della variabile ANNON, ossia che appunto l'anno del bioritmo deve essere diverso dall'anno di nascita.

Vediamo infine di aggiungere alla variabile INTERVALLO il numero di giorni corrispondente al numero di anni bisestili eventualmente presenti fra l'anno di nascita e l'anno del bioritmo. Per fare ciò, occorre esaminare uno per uno gli anni compresi fra l'anno di nascita e l'anno del bioritmo e determinare se essi sono o no bisestili, cioè se sono perfettamente divisibili per 4. Ciò si può fare con la seguente istruzione.

FOR I := ANNON+1 TO ANNOB1 DO IF I MOD 4 = 0 THEN INTERVALLO:=INTERVALLO+1

34

Il loop viene eseguito per ogni valore intero assunto dalla variabile di controllo I, da ANNON+1 (anno successivo all’anno di nascita) ad ANNOB1 (anno precedente l’anno del bioritmo). Ove la variabile I assuma valore numerico multiplo di 4, quindi con resto 0 nella divisione di I per 4, trattandosi di anno bisestile viene aggiunta un’unità al valore della variabile INTERVALLO.

La procedura CALCOLI si presenta dunque completa come segue:

PROCEDURE CALCOLI; VAR MESE,GAN,GAB : I; BEGIN

GAN:=0;

FOR MESE:=MESEN TO 12 DO GAN:=GAN+GIORNIMESE(MESE);

GAN:=GANGIORNON+1;

GAB:=0;

FOR MESE:=1 TO MESEB DO GAB:=GAB+GIORNIMESE(MESE); GAB:=GAB(GIORNIMESE(MESEB)GIORNOB);

INTERVALLO:=(ANNOBANNON1)*365+GAN+GAB;

IF (MESEN<3) AND (ANNON MOD 4 = 0) THEN INTERVALLO:=INTERVALLO+1; IF (MESEB>2) AND (ANNOB MOD 4 = 0) AND (ANNOB<>ANNON) THEN INTERVALLO:=INTERVALLO+1; FOR I := ANNON+1 TO ANNOB1 DO IF I MOD 4 = 0 THEN INTERVALLO:=INTERVALLO+1

END;

5. IL PROGRAMMA FINO ALLA PROCEDURA CALCOLI Il programma, fino alla procedura CALCOLI compresa, sarà dunque il seguente:

{INTESTAZIONE della procedura principale} PROGRAM BIORITMI (INPUT,OUTPUT);

{blocco DEFINIZIONI E DICHIARAZIONI della procedura principale}

{DEFINIZIONI dei TIPI} TYPE

I = INTEGER;

{DICHIARAZIONI delle VARIABILI} VAR

NOME : PACKED ARRAY[1 GIORNON,MESEN,ANNON, GIORNOB,MESEB,ANNOB, INTERVALLO

: I;

15] OF CHAR;

{DICHIARAZIONE della procedura FRONTESPIZIO} PROCEDURE FRONTESPIZIO; BEGIN PAGE(OUTPUT);

WRITELN ('

PROGRAMMA');

35

END;

WRITELN ('PER IL CALCOLO DEI BIORITMI'); WRITELN;

WRITELN ('

WRITELN ('da ‘Pascal standard‘ di G.C.Giacobbe'); WRITELN; WRITE ('Premi RETURN per proseguire ');

READ

Programma di esercitazione');

{DICHIARAZIONE della procedura INFORMAZIONI} PROCEDURE INFORMAZIONI; BEGIN

PAGE(OUTPUT); WRITELN ('INFORMAZIONI':46); WRITELN; WRITELN ('Secondo la teoria dei bioritmi,); WRITELN ('l`essere umano è sottoposto'); WRITELN ('a tre cicli biologici'); WRITELN ('che influiscono sul suo rendimento'); WRITELN ('fisico, emotivo e intellettuale.'); WRITELN ('Essi si intersecano, facendo sì'); WRITELN ('che per ogni giorno della sua vita'); WRITELN ('egli si trovi ad attraversare'); WRITELN ('una determinata fase'); WRITELN ('per ciascuno dei tre cicli.'); WRITELN ('Questo programma ti dà'); WRITELN ('la possibilità di determinare,'); WRITELN ('per ciascun giorno della tua vita,'); WRITELN ('il tuo rendimento fisico,'); WRITELN ('emotivo e intellettuale.'); WRITELN; WRITE ('Premi RETURN per proseguire '); READ

END;

{DICHIARAZIONE della procedura ANAGRAFICA} PROCEDURE ANAGRAFICA; BEGIN

PAGE(OUTPUT); WRITE ('Ciao, come ti chiami? '); READLN (NOME); WRITELN; WRITE ('Scrivi il numero del tuo giorno di nascita: '); READLN (GIORNON); WRITE ('Scrivi il numero del tuo mese di nascita: '); READLN (MESEN); WRITE ('Scrivi il numero del tuo anno di nascita: '); READLN (ANNON); IF ANNON<100 THEN ANNON:=ANNON+1900; IF ANNON<1000 THEN ANNON:=ANNON+1000

END;

{DICHIARAZIONE della procedura DATIBIORITMO} PROCEDURE DATIBIORITMO; BEGIN

WRITELN;WRITELN; WRITELN ('Dati relativi alla data del bioritmo:'); WRITE ('Scrivi il numero del giorno: '); READLN (GIORNOB); WRITE ('Scrivi il numero del mese: ');

36

READLN (MESEB); WRITE ('Scrivi il numero dell’anno: '); READLN (ANNOB); IF ANNOB<100 THEN ANNOB:=ANNOB+1900; IF ANNOB<1000 THEN ANNOB:=ANNOB+1000

END;

{DICHIARAZIONE della funzione GIORNIMESE} FUNCTION GIORNIMESE (MESE:I) : I; CONST A = 31; B = 30; C = 28; BEGIN

CASE MESE OF

1 : GIORNIMESE:=A;

2 : GIORNIMESE:=C;

3 : GIORNIMESE:=A;

4 : GIORNIMESE:=B;

5 : GIORNIMESE:=A;

6 : GIORNIMESE:=B;

7 : GIORNIMESE:=A;

8 : GIORNIMESE:=A;

9 : GIORNIMESE:=B;

10 : GIORNIMESE:=A;

11 : GIORNIMESE:=B;

12 : GIORNIMESE:=A

END

END;

{DICHIARAZIONE della procedura CALCOLI} PROCEDURE CALCOLI; VAR MESE,GAN,GAB : I; BEGIN

GAN:=0;

FOR MESE:=MESEN TO 12 DO GAN:=GAN+GIORNIMESE(MESE);

GAN:=GANGIORNON+1;

GAB:=0;

FOR MESE:=1 TO MESEB DO GAB:=GAB+GIORNIMESE(MESE); GAB:=GAB(GIORNIMESE(MESEB)GIORNOB);

INTERVALLO:=(ANNOBANNON1)*365+GAN+GAB;

IF (MESEN<3) AND (ANNON MOD 4 = 0) THEN INTERVALLO:=INTERVALLO+1; IF (MESEB>2) AND (ANNOB MOD 4 = 0) AND (ANNOB<>ANNON) THEN INTERVALLO:=INTERVALLO+1; FOR I := ANNON+1 TO ANNOB1 DO IF I MOD 4 = 0 THEN INTERVALLO:=INTERVALLO+1

END;

{blocco ISTRUZIONI della procedura principale} BEGIN FRONTESPIZIO; INFORMAZIONI; ANAGRAFICA; DATIBIORITMO; CALCOLI END.

37

CAPITOLO SETTIMO

L'OUTPUT

1. LA DURATA DELLE FASI Per determinare quali giorni del ciclo considerare in fase positiva, quali in fase negativa, quali in fase critica, dobbiamo avere chiara la struttura di un ciclo. Esso può essere rappresentato graficamente come una sinusoide:

c1 p c n c2
c1
p
c
n
c2

Come si vede, la sinusoide può essere divisa in cinque fasi: una fase critica c1 (che è la seconda metà della fase critica iniziata nella sinusoide precedente), una fase positiva p, una fase critica c, una fase negativa n ed un'altra fase critica c2 (prima metà della fase critica che terminerà nel ciclo successivo). In riferimento alla suddivisione dei giorni di un ciclo, abbiamo in realtà in ogni ciclo quattro fasi: una fase positiva, una fase negativa e due fasi critiche di pari durata (di cui una divisa in due parti). Dovremo quindi dividere ogni ciclo in quattro parti, per determinare la durata di ciascuna fase. Vediamo subito che nessuno dei tre cicli permette l'attribuzione di un numero intero di giorni a ciascuna fase, in quanto nessuno dei numeri relativi ai giorni di ciascun ciclo (33, 30, 27) è interamente divisibile per 4. Siamo costretti quindi a scegliere un compromesso:

ad esempio attribuire arbitrariamente in più alla fase positiva i giorni che avanzano dalla divisione, il che ha il vantaggio di risultare più gratificante per l'utente.

38

Per quanto riguarda il ciclo intellettuale, abbiamo che le sue fasi hanno la seguente configurazione: 9 giorni per la fase positiva ed 8 giorni per ciascuna delle altre tre fasi, una negativa e due critiche. La distribuzione delle fasi all'interno del ciclo sarà quindi la seguente: i giorni dal 1° al 4° appartengono alla fase critica (seconda metà); i giorni dal 5° al 13° appartengono alla fase positiva; i giorni dal 14° al 21° appartengono alla fase critica; i giorni dal 22° al 29° appartengono alla fase negativa; i giorni dal 30° al 33° appartengono alla fase critica (prima metà). Per quanto riguarda il ciclo emotivo (durata 30 giorni), abbiamo un problema: la divisione 30/4 dà come risultato 7 con resto 2, ma poiché una fase critica và ulteriormente divisa per 2, tale risultato non può essere accettato per questa fase. Dobbiamo quindi spostare il resto della divisione, anziché sulla fase positiva, sulle due fasi critiche, che risulteranno di 8 giorni ciascuna. Le fasi del ciclo emotivo presenteranno dunque la seguente configurazione: 8 giorni per ciascuna delle due fasi critiche e 7 giorni per ciascuna delle rimanenti due fasi, positiva e negativa. La distribuzione delle fasi all'interno del ciclo sarà la seguente: i giorni dal 1° al 4° appartengono alla fase critica (seconda metà); i giorni dal 5° all'11° appartengono alla fase positiva; i giorni dal 12° al 19° appartengono alla fase critica; i giorni dal 20° al 26° appartengono alla fase negativa; i giorni dal 27° al 30° appartengono alla fase critica (prima metà). Per quanto riguarda il ciclo fisico, abbiamo un altro problema: la divisione 27/4 dà come risultato 6 con resto 3, ma quest'ultimo è un numero troppo alto per poterlo attribuire completamente alla fase positiva senza creare un eccessivo squilibrio; daltronde è dispari, quindi non si può distribuire equamente fra fase positiva e fase negativa, né dividere fra le due fasi critiche. L'unica soluzione ragionevole è dividere tale resto fra la fase positiva e la fase negativa dando una preponderanza alla prima. In definitiva, le fasi del ciclo fisico presenteranno la seguente configurazione: 6 giorni per ciascuna delle due fasi critiche; 8 giorni per la fase positiva; 7 giorni per la fase negativa. La distribuzione delle fasi all'interno del ciclo sarà la seguente: i giorni dal 1° al 3° appartengono alla fase critica (seconda metà); i giorni dal 4° all'11° appartengono alla fase positiva; i giorni dal 12° al 17° appartengono alla fase critica; i giorni dal 18° al 24° appar- tengono alla fase negativa; i giorni dal 25° al 27° appartengono alla fase critica (prima metà).

2. LA PROCEDURA DIDASCALIA Veniamo quindi a scrivere la procedura che fornirà in OUTPUT i dati relativi alle fasi dei tre cicli. Come enunciato in fase di progetto, chiameremo DIDASCALIA tale procedura. Per prima cosa, occorre calcolare, per ciascun ciclo, quanti giorni sono trascorsi dall'inizio dell'ultimo ciclo, ossia in quale giorno del ciclo cade il giorno per il quale l'utente ha chiesto il bioritmo, in modo da emettere il responso richiesto, che consiste nel valutare la fase nella quale si trova il giorno richiesto. Chiamiamo GI, GE, GF, le variabili nelle quali verranno memorizzati rispettivamente i giorni del ciclo intellettuale, i giorni del ciclo emotivo, i giorni del ciclo fisico. E' evidente che esse saranno variabili locali, poiché saranno utilizzate unicamente nella procedura DIDASCALIA. Dovremo quindi dichiararle nel blocco definizioni e dichiarazioni di tale procedura. Si avranno quindi le seguenti tre istruzioni:

GI:=INTERVALLO MOD 33; GE:=INTERVALLO MOD 30; GF:=INTERVALLO MOD 27;

39

dove si ottiene rispettivamente il resto della divisione di INTERVALLO per 33 (che è il numero dei giorni del ciclo intellettuale), di INTERVALLO per 30 (che è il numero dei giorni del ciclo emotivo), di INTERVALLO per 27 (che è il numero dei giorni del ciclo fisico). Tali resti costituiscono appunto i giorni trascorsi dall'ultimo inizio di ciascun ciclo al giorno del bioritmo, come è evidente.

La procedura DIDASCALIA. sarà dunque la seguente:

PROCEDURE DIDASCALIA; VAR GI, GE, GF : I; BEGIN

END;

PAGE(OUTPUT); GI:=INTERVALLO MOD 33; GE:=INTERVALLO MOD 30; GF:=INTERVALLO MOD 27; WRITE ('Ciclo intellettuale:

IF (GI<5) OR ((GI>13) AND (GI<22)) OR (GI>29) THEN WRITELN ('FASE CRITICA');

IF ((GI>4) AND (GI<14)) THEN WRITELN ('FASE POSITIVA'); IF ((GI>21) AND (GI<30)) THEN WRITELN ('FASE NEGATIVA'); WRITELN;

WRITE ('Ciclo emotivo:

IF (GE<5) OR ((GE>11) AND (GE<20)) OR (GE>26)

THEN WRITELN ('FASE CRITICA'); IF ((GE>4) AND (GE<12))

THEN WRITELN ('FASE POSITIVA'); IF ((GE>19) AND (GE<27)) THEN WRITELN ('FASE NEGATIVA'); WRITELN;

WRITE ('Ciclo fisico:

IF (GF<4) OR ((GF>11) AND (GF<18)) OR (GF>24)

THEN WRITELN ('FASE CRITICA'); IF ((GF>3) AND (GF<12)) THEN WRITELN ('FASE POSITIVA'); IF ((GF>17) AND (GF<25)) THEN WRITELN ('FASE NEGATIVA')

');

');

');

Il significato delle istruzioni di tale procedura è evidente: in relazione al numero di giorni

trascorsi per ciascun ciclo, viene calcolata la fase relativa ed inviata in OUTPUT sullo schermo. Vi è soltanto da notare che nelle istruzioni in cui vi sono gli operatori logici OR e AND, il calcolo viene eseguito prima per l’operatore AND e poi per l’operatore OR. Quindi l’istruzione IF (GI<5) OR ((GI>13) AND (GI<22)) OR (GI>29) viene eseguita con il seguente ordine:

1) (GI>13) AND (GI<22), 2) GI<5, 3) GI>29. Se una delle disuguaglianze 1), 2), 3), è vera, viene

eseguita l’istruzione WRITELN ('FASE CRITICA').

3. LA PROCEDURA INTERROGATORIO

A questo punto, le chiamate di procedura contenute nel blocco istruzioni della procedura

principale si presentano come segue:

40

BEGIN FRONTESPIZIO; INFORMAZIONI; ANAGRAFICA; DATIBIORITMO; CALCOLI; DIDASCALIA END.

Un tale blocco istruzioni fà sì che le istruzioni scritte (cioè le chiamate di procedura) vengano eseguite nell'ordine, dopo di che il programma si arresta. Si ha cioè che i dati relativi ai bioritmi vengono forniti una sola volta, ossia per un solo giorno. Abbiamo stabilito tuttavia, sulla base del diagramma di flusso (vedi Capitolo Terzo), che il programma debba calcolare i bioritmi per tutti i giorni richiesti dall'utente. Occorre cioè che una parte del blocco istruzioni, e precisamente le procedure DATIBIORITMO, CALCOLI, DIDASCALIA, vengano ripetute diverse volte. Ma quante volte? Evidentemente, è l'utente, che deve determinare quante volte occorre ripetere l'esecuzione di tali procedure. Ma come fa il programma a sapere quante sono queste volte? Non vi è altro modo che interrogarlo in proposito. Occorre quindi scrivere una procedura che conduca tale interrogatorio. Essa, che abbiamo già stabilito in fase di progetto di chiamare INTERROGATORIO, sarà la seguente:

PROCEDURE INTERROGATORIO; BEGIN

END;

PAGE(OUTPUT); WRITE('Vuoi continuare? (S/N) READ(RISPOSTA)

');

La variabile RISPOSTA, dovendo memorizzare dei caratteri (S o N), sarà di tipo CHAR. Essa sarà inoltre una variabile globale, in quanto verrà usata anche al di fuori della procedura INTERROGATORIO, e quindi dovrà essere dichiarata nel blocco definizioni e dichiarazioni della procedura principale.

In

base al valore di tale variabile noi potremo dunque stabilire se ripetere o no l'esecuzione

di

parte del blocco istruzioni della procedura principale.

4. IL BLOCCO ISTRUZIONI DELLA PROCEDURA PRINCIPALE Abbiamo detto che desideriamo che il programma permetta il calcolo dei bioritmi per giorni diversi ed abbiamo visto, quando abbiamo tracciato il diagramma di flusso, che per ottenere ciò le procedure da chiamare, e quindi da eseguire, sono le seguenti:

DATIBIORITMO, CALCOLI, DIDASCALIA, oltre, naturalmente, a INTERROGATORIO.

Poiché tali procedure debbono poter essere eseguite un numero indefinito di volte (tante

volte per quanti giorni l'utente vuole calcolare i bioritmi), occorrerà inserire le istruzioni di chiamata di tali procedure in un loop, ossia in un ciclo che deve essere ripetuto tante volte quante l'utente dichiara di volere il calcolo dei bioritmi, cioè per tutto il tempo in cui la variabile RISPOSTA assume il valore S.

Il blocco istruzioni della procedure principale si presenterà dunque come segue.

{blocco ISTRUZIONI della procedura principale} BEGIN INTESTAZIONE; INFORMAZIONI; ANAGRAFICA; REPEAT DATIBIORITMO; CALCOLI;

41

DIDASCALIA; INTERROGATORIO UNTIL RISPOSTA='N' END.

Le istruzioni delimitate dalle parole REPEAT, UNTIL, vengono ripetute fino al momento in cui

si avvera la condizione specificata subito dopo la parola UNTIL. Ossia, nel momento in cui

la condizione specificata si avvera, cioè nel momento in cui l’utente risponde N (no) alla domanda Vuoi continuare? (S/N), il loop ha fine. Vediamo come avviene il meccanismo di ripetizione. All'inizio del programma, dopo l'esecuzione delle procedure INTESTAZIONE, INFORMAZIONI, ANAGRAFICA, viene incontrata l'istruzione REPEAT: l'esecuzione del loop ha inizio. Vengono eseguite le quattro procedure DATIBIORITMO, CALCOLI, DIDASCALIA, INTERROGATORIO. Quest'ultima fornisce un valore per la variabile RISPOSTA. Supponiamo che tale valore sia S. Cioè l'utente vuole proseguire il calcolo dei bioritmi. La condizione che pone fine al loop (RISPOSTA='N') non si avvera, quindi il loop

viene ripetuto. Così si ripetono le procedure che danno luogo all'input e all'output dei dati relativi ai bioritmi (DATIBIORITMO, CALCOLI, DIDASCALIA,), fino a che l'utente risponde

N alla domanda della procedura INTERROGATORIO.

Nel caso in cui l'utente risponda N alla domanda Vuoi continuare? (S/N), il loop ha termine, in quanto si avvera la sua condizione di arresto. Quindi, proseguendo l'esecuzione all'istruzione END, anche il programma ha termine.

42

CAPITOLO OTTAVO

IL PROGRAMMA COMPLETO

Il nostro programma è dunque terminato. Esso si presenta in definitiva come segue:

{INTESTAZIONE della procedura principale} PROGRAM BIORITMI (INPUT,OUTPUT);

{blocco DEFINIZIONI E DICHIARAZIONI della procedura principale}

{DEFINIZIONI dei TIPI} TYPE

I = INTEGER;

{DICHIARAZIONI delle VARIABILI} VAR

NOME : PACKED ARRAY[1 GIORNON,MESEN,ANNON, GIORNOB,MESEB,ANNOB, INTERVALLO

: I;

RISPOSTA : CHAR;

15] OF CHAR;

{DICHIARAZIONE della procedura FRONTESPIZIO} PROCEDURE FRONTESPIZIO; BEGIN PAGE(OUTPUT);

WRITELN ('

WRITELN ('PER IL CALCOLO DEI BIORITMI');

PROGRAMMA');

WRITELN;

WRITELN ('

Programma di esercitazione');

WRITELN ('da ‘Pascal standard‘ di G.C.Giacobbe');

WRITELN; WRITE ('Premi RETURN per proseguire '); READ

END;

{DICHIARAZIONE della procedura INFORMAZIONI} PROCEDURE INFORMAZIONI; BEGIN

PAGE(OUTPUT); WRITELN ('INFORMAZIONI':46); WRITELN; WRITELN ('Secondo la teoria dei bioritmi,); WRITELN ('l`essere umano è sottoposto'); WRITELN ('a tre cicli biologici'); WRITELN ('che influiscono sul suo rendimento'); WRITELN ('fisico, emotivo e intellettuale.'); WRITELN ('Essi si intersecano, facendo sì'); WRITELN ('che per ogni giorno della sua vita'); WRITELN ('egli si trovi ad attraversare'); WRITELN ('una determinata fase');

43

WRITELN ('per ciascuno dei tre cicli.'); WRITELN ('Questo programma ti dà'); WRITELN ('la possibilità di determinare,'); WRITELN ('per ciascun giorno della tua vita,'); WRITELN ('il tuo rendimento fisico,'); WRITELN ('emotivo e intellettuale.'); WRITELN; WRITE ('Premi RETURN per proseguire '); READ

END;

{DICHIARAZIONE della procedura ANAGRAFICA} PROCEDURE ANAGRAFICA; BEGIN

PAGE(OUTPUT); WRITE ('Ciao, come ti chiami? '); READLN (NOME); WRITELN; WRITE ('Scrivi il numero del tuo giorno di nascita: '); READLN (GIORNON); WRITE ('Scrivi il numero del tuo mese di nascita: '); READLN (MESEN); WRITE ('Scrivi il numero del tuo anno di nascita: '); READLN (ANNON); IF ANNON<100 THEN ANNON:=ANNON+1900; IF ANNON<1000 THEN ANNON:=ANNON+1000

END;

{DICHIARAZIONE della procedura DATIBIORITMO} PROCEDURE DATIBIORITMO; BEGIN

WRITELN;WRITELN; WRITELN ('Dati relativi alla data del bioritmo:'); WRITE ('Scrivi il numero del giorno: '); READLN (GIORNOB); WRITE ('Scrivi il numero del mese: '); READLN (MESEB); WRITE ('Scrivi il numero dell’anno: '); READLN (ANNOB); IF ANNOB<100 THEN ANNOB:=ANNOB+1900; IF ANNOB<1000 THEN ANNOB:=ANNOB+1000

END;

{DICHIARAZIONE della funzione GIORNIMESE} FUNCTION GIORNIMESE (MESE:I) : I; CONST A = 31; B = 30; C = 28; BEGIN

CASE MESE OF

1 : GIORNIMESE:=A;

2 : GIORNIMESE:=C;

3 : GIORNIMESE:=A;

4 : GIORNIMESE:=B;

5 : GIORNIMESE:=A;

6 : GIORNIMESE:=B;

7 : GIORNIMESE:=A;

8 : GIORNIMESE:=A;

9 : GIORNIMESE:=B;

10 : GIORNIMESE:=A;

11 : GIORNIMESE:=B;

44

12 : GIORNIMESE:=A END

END;

{DICHIARAZIONE della procedura CALCOLI} PROCEDURE CALCOLI; VAR MESE,GAN,GAB : I; BEGIN

GAN:=0;

FOR MESE:=MESEN TO 12 DO GAN:=GAN+GIORNIMESE(MESE);

GAN:=GANGIORNON+1;

GAB:=0;

FOR MESE:=1 TO MESEB DO GAB:=GAB+GIORNIMESE(MESE); GAB:=GAB(GIORNIMESE(MESEB)GIORNOB);

INTERVALLO:=(ANNOBANNON1)*365+GAN+GAB;

IF (MESEN<3) AND (ANNON MOD 4 = 0) THEN INTERVALLO:=INTERVALLO+1; IF (MESEB>2) AND (ANNOB MOD 4 = 0) AND (ANNOB<>ANNON) THEN INTERVALLO:=INTERVALLO+1; FOR I := ANNON+1 TO ANNOB1 DO IF I MOD 4 = 0 THEN INTERVALLO:=INTERVALLO+1

END;

{DICHIARAZIONE della procedura DIDASCALIA} PROCEDURE DIDASCALIA; VAR GI, GE, GF : I; BEGIN

END;

PAGE(OUTPUT); GI:=INTERVALLO MOD 33; GE:=INTERVALLO MOD 30; GF:=INTERVALLO MOD 27; WRITE ('Ciclo intellettuale:

IF (GI<5) OR ((GI>13) AND (GI<22)) OR (GI>29) THEN WRITELN ('FASE CRITICA'); IF ((GI>4) AND (GI<14)) THEN WRITELN ('FASE POSITIVA'); IF ((GI>21) AND (GI<30)) THEN WRITELN ('FASE NEGATIVA'); WRITELN;

WRITE ('Ciclo emotivo:

IF (GE<5) OR ((GE>11) AND (GE<20)) OR (GE>26)

THEN WRITELN ('FASE CRITICA');

IF ((GE>4) AND (GE<12)) THEN WRITELN ('FASE POSITIVA'); IF ((GE>19) AND (GE<27)) THEN WRITELN ('FASE NEGATIVA'); WRITELN;

WRITE ('Ciclo fisico:

IF (GF<4) OR ((GF>11) AND (GF<18)) OR (GF>24)

THEN WRITELN ('FASE CRITICA'); IF ((GF>3) AND (GF<12)) THEN WRITELN ('FASE POSITIVA'); IF ((GF>17) AND (GF<25)) THEN WRITELN ('FASE NEGATIVA')

');

');

');

45

{DICHIARAZIONE della procedura INTERROGATORIO} PROCEDURE INTERROGATORIO; BEGIN

END;

PAGE(OUTPUT); WRITE('Vuoi continuare? (S/N) READ(RISPOSTA)

');

{blocco ISTRUZIONI della procedura principale} BEGIN INTESTAZIONE; INFORMAZIONI; ANAGRAFICA; REPEAT DATIBIORITMO; CALCOLI; DIDASCALIA; INTERROGATORIO UNTIL RISPOSTA='N' END.

46

PARTE SECONDA

TEORIA

47

CAPITOLO PRIMO

IDENTIFICATORI E TIPI

1. LE ISTRUZIONI E I DATI

Le istruzioni costituenti il programma in Pascal consistono in parole convenzionali: si dicono parole riservate, in quanto possono essere utilizzate soltanto come istruzioni. Esse vengono scrit-te utilizzando alcuni dei caratteri presenti su di una normale tastiera di computer, i quali costituiscono quindi gli elementi fonda-mentali del linguaggio. Essi

sono i seguenti:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

+ - * / = . , ; : ' < > ( ) [ ] { } ^

I segni costituenti i dati consistono in tutti i caratteri ottenibili con la tastiera. Un dato consiste quindi in pratica in una sequenza di caratteri: ad esempio, ABCdfg %48 (compreso lo spazio).

Una sequenza di caratteri si dice stringa (abominevole traduzione dell'inglese string). Una stringa di cifre decimali (ad esempio 32767 ) può essere considerata, oltre che come semplice stringa, anche come numero.

In definitiva, noi trasmettiamo e riceviamo dall'elaboratore delle sequenze di caratteri, che per noi hanno un particolare significato, o come parole o come numeri.

I DATI consistono in parole e numeri. Le ISTRUZIONI consistono in parole.

2. GLI IDENTIFICATORI

Per potere utilizzare in ulteriori elaborazioni i risultati della elaborazione dei dati, la cui consistenza momentanea può sfuggire allo stesso programmatore, e per rammentare il loro significato computazionale, vengono spesso usati dei nomi, detti identificatori, al posto dei dati: nella memoria dell'elaboratore viene istituita un'as-sociazione fra identificatore e dato corrispondente, sicché l'uso de-gli identificatori equivale all'uso diretto dei dati. Gli identificatori possono essere costituiti da una sequenza qualsiasi di caratteri, con le seguenti due limitazioni: solo i primi otto caratteri sono significativi; il primo carattere deve essere una lettera.

Esempi di identificatori: ABCDEFGH , A234567.

48

Un identificatore usato al posto di uno stesso dato per tutto il programma, si dice

COSTANTE.

Esempio: A1 , usato sempre ed esclusivamente al posto del numero 32767 .

Un identificatore usato al posto di dati diversi, cioè che cambiano nel corso del programma, si dice VARIABILE. Esempio: B1 usato al posto prima del numero 32767 , poi del numero 48.

Le variabili e le costanti possono essere create a piacere dal programmatore, nel modo che vedremo più avanti.

Quando viene creata una variabile o una costante, viene registrato in memoria il suo identificatore.

3. I TIPI

La memoria centrale dell'elaboratore può essere rappresentata come una sequenza di celle contigue, distinte fra loro da un numero, detto indirizzo, in ognuna delle quali può essere scritto, letto e cancellato un carattere. E' evidente che il dato AJDKFDIFHOPRQELSDJ occupa nella memoria centrale più spazio del dato G . Per un uso economico della memoria, richiesto dal suo alto costo, è quindi necessario che il compilatore conosca, prima di eseguire le istruzioni, quanto spazio riservare per ogni singolo dato, ossia per ogni singola variabile, altrimenti è costretto a riservare sempre la quantità corrispondente al più esteso dato possibile, con evidente

spreco. Per ottenere ciò, distinguiamo i dati, e quindi le variabili ad essi corrispondenti, in tipi, ossia in classi. Ogni tipo fissa un massimo di estensione a cui possono giungere i dati di una certa classe, ottenendo così una sensibile economia di memoria. Un TIPO è un insieme di dati aventi alcune caratteristiche in comune ed occupanti uno stesso spazio in memoria.

I tipi vengono definiti entro figure precostituite e sono individuati tramite identificatori. Quando viene definito un tipo, vengono registrati in memoria il suo identificatore e la quantità di spazio che verrà riservata ai dati attribuiti alle variabili di quel tipo.

4. I TIPI STANDARD

Poiché alcune classi di dati sono frequentemente usate in ogni programma, si sono fissati alcuni tipi standard i cui singoli dati sono già noti: l'estensione di memoria da riservare ad essi è pertanto già determinata.

I tipi standard sono i seguenti.

INTEGER

E' costituito dall'insieme dei numeri interi negativi e positivi, da un minimo ad un massimo fissati nell'implementazione (versione adottata per un particolare elaboratore). ESEMPIO: -32767 , 0, 65535, sono dati di tipo Integer.

REAL

E' costituito dall'insieme dei numeri reali negativi e positivi, da un minimo ad un massimo fissati nell'implementazione.

49

ESEMPIO: -65535.4; 32767.86; sono dati di tipo Real. Notare che la virgola viene rappresentata mediante un punto: in informatica, ciò avviene di regola.

CHAR

E' costituito da un insieme di caratteri (lettere dell'alfabeto, cifre numeriche, segni varii) definiti dall'implementazione (l`insieme più usato è quello ASCII: American Standard Code for Information Interchange) e ordinati progressiva-mente. ESEMPIO: A, #, 8 , sono dati di tipo Char. Essi hanno, nel codice ASCII, rispettivamente numero d`ordine 65, 35, 56.

BOOLEAN

E' costituito dall'insieme dei due dati: TRUE (vero), FALSE (falso).

5. I TIPI NON STANDARD

Il programmatore ha, per alcuni altri tipi, diversi da quelli sopra descritti, la possibiltà di

determinare i singoli dati che li compongono, e quindi anche l'estensione di memoria ad essi riservata. Tali tipi sono naturalmente già noti al compilatore, e quindi l'orga-nizzazione dei dati all'interno di essi è già stabilita.

Tali tipi si dicono tipi non standard.

I tipi non standard sono i seguenti.

SCALARE

), in cui l'accesso

ad ogni singolo dato avviene mediante lo spostamento di un puntatore dall'inizio della sequenza al numero d'ordine del dato (accesso sequenziale). A questo tipo appartengono anche i tipi standard, ad eccezione del tipo Real. ESEMPIO: supponiamo di avere i seguenti dati (parole): Rosso, Arancione, Giallo, Verde, Azzurro, Indaco, Violetto. Vogliamo organizzarli in un tipo Scalare. Essi saranno ordinati progressivamente nell'ordine in cui sono stati presentati: Rosso avrà numero d`ordine 0, Arancione avrà numero d`ordine 1, e così via fino a Violetto, che avrà numero d`ordine 6. Per accedere al dato Verde, occorrerà percorrere i dati che lo precedono, e cioè Rosso, Arancione, Giallo. Tutto qui.

I dati che lo compongono costituiscono una sequenza finita ordinata progressivamente (0,1

SOTTOCAMPO o SUBRANGE

I dati che lo compongono costituiscono, tutti insieme, un sottoinsieme di un insieme di dati di tipo Scalare, del quale il sottocampo ha le stesse proprietà. Non sono ammessi tipi sottocampo del tipo Real. ESEMPIO: supponiamo di avere i seguenti dati: Rosso, Giallo, Azzurro. Essi costituiscono un sottoinsieme del tipo Scalare definito nell'esempio precedente. Vogliamo organizzarli in un tipo Sottocampo. Essi saranno ordinati progressivamente nell'ordine in cui sono stati presentati: Rosso avrà numero d`ordine 0, Giallo avrà numero d`ordine 1, Azzurro avrà numero d`ordine 2. Per accedere al dato Azzurro, occorrerà percorrere i dati che lo precedono, e cioè Rosso, Giallo. Tutto qui.

SET

I dati che lo compongono costituiscono, ciascuno, un sottoinsieme di un insieme di dati di tipo Scalare o di

tipo Sottocampo. E' ammesso il sottoinsieme vuoto. ESEMPIO: supponiamo di avere i seguenti due insiemi di dati: Rosso, Arancione, da una parte; Giallo, Azzurro, Violetto, dall'altra. Essi costituiscono due sottoinsiemi del tipo Scalare definito nell'esempio precedente. Vogliamo organizzarli in un tipo Set. Il primo dato di tale tipo Set sarà costituito dal sottoinsieme composto dai due dati Rosso, Arancione; il secondo dato di tale tipo Set sarà costituito dal sottoinsieme composto dai tre dati Giallo, Azzurro, Violetto. I dati del tipo Set non vengono ordinati pro- gressivamente. Tutto qui.

50

ARRAY

I dati che lo compongono appartengono ad uno dei tipi precedenti.

Il numero dei dati che lo compongono viene fissato dal programmatore. Si può accedere ad ogni singolo dato in modo immediato, senza la percorrenza di altri dati (accesso casuale), mediante l'associazione ad ogni singolo dato di uno o più numeri detti indici, i quali fungono da identificatori. Con un solo indice si ha un Array monodimensionale; con più indici si ha un Array multidimensionale. ESEMPIO di Array monodimensionale: supponiamo di avere i seguenti dati: Rosso, Arancione, Giallo, Verde, Azzurro, Indaco, Violetto. Vogliamo organizzarli in un Array monodimensionale. Il primo dato (Rosso) potrà essere identificato dall'indice 0; il secondo dato (Arancione) potrà essere identificato dall'indice 1; e così via fino all'ultimo dato (Violetto), che potrà essere identificato dall'indice 6. L'associazione dell'indice ad ogni singolo dato viene stabilita dal programmatore. ESEMPIO di Array bidimensionale: supponiamo di avere i seguenti dati: Rosso, Arancione, Giallo, Verde, Azzurro, Indaco, Violetto. Vogliamo organizzarli in un Array bidimensionale. Il primo dato (Rosso) potrà essere identificato dagli indici 1,1; il secondo dato (Arancione) potrà essere identificato dagli indici 2,1; il terzo dato (Giallo) potrà essere identificato dagli indici 3,1; il quarto dato (Verde) potrà essere identificato dagli indici 4,1; il quinto dato (Azzurro) potrà essere identificato dagli indici 1,2; il sesto dato (Indaco) potrà essere identificato dagli indici 1,3; il settimo dato (Violetto) potrà essere identificato dagli indici 1,4. L'associazione degli indici ad ogni singolo dato viene stabilita dal programmatore.

PACKED ARRAY

L'insieme di bit elaborati contemporaneamente dall'elaboratore (il cui numero dipende dal microprocessore usato) è detto parola (word). Normalmente, ciascun dato viene registrato in memoria mediante una parola. Tuttavia, poiché alcuni dati richiedono un numero di bit inferiore a quello costituente una parola, si ha spesso un considerevole spreco di memoria, il che può divenire inaccettabile nel caso dell'elaborazione di una grande quantità di dati, come è frequente con il tipo Array. Per ovviare a questo inconveniente, si ricorre al tipo Packed Array: in esso i dati che non occupano esattamente una parola vengono impaccati , ossia scritti l'uno di seguito all'altro all'interno di una stessa parola, ottenendo così un sensibile risparmio di memoria. Ciò avviene tuttavia a scapito della velocità di esecuzione del programma, in quanto alle normali operazioni di gestione dell'Array si aggiungono le operazioni di impaccamento e disimpaccamento dei dati. Il confronto fra Arrays (relazione di uguaglianza, maggioranza, etc.) è possibile tuttavia soltanto per il tipo Pac-ked Array. Per il resto si comporta come il tipo Array normale.

FILE

I dati che lo compongono appartengono ad uno dei tipi precedenti.

Il numero dei dati che lo compongono non può essere stabilito a priori dovendo poter variare in qualsiasi momento. Si dice quindi che il numero dei dati che lo compongono è indefinito. L'accesso ai suoi singoli dati è sequenziale. Il tipo File viene usato per trasferire masse di dati attraverso i dispositivi I/O. Al tipo File viene associata una variabile buffer, alla quale può essere assegnato un qualsiasi dato componente il file, permettendone così la lettura e la scrittura, e quindi il trasferimento. ESEMPIO: tipico esempio di un tipo File è l'insieme dei caratteri che costituiscono un testo, il quale viene normalmente scritto attraverso la tastiera, registrato nella memoria centrale dell'elaboratore e quindi trasferito mediante un dispositivo I/O su di un disco o su di un nastro magnetici.

RECORD

I dati che lo compongono appartengono a tipi diversi, ognuno dei quali costituisce un campo.

ESEMPIO: supponiamo di avere alcuni dati di tipo Scalare (Rosso, Aran-cione, Giallo), alcuni altri di tipo Real (234.654, 5.4509), alcuni altri di tipo Array monodimensionale (00687 (indice 0), 9801 (indice 1), Violetto (indice 2)): i dati di tipo Scalare costituiranno il primo Campo, i dati di tipo Real costituiranno il

secondo Campo, i dati di tipo Array costituiranno il terzo Campo; tutti insieme costituiranno il tipo Record.

I tipi scalare e sottocampo costituiscono dei tipi base, poiché tutti gli altri, che si dicono perciò tipi strutturati, sono composti da essi.

51

CAPITOLO SECONDO

LA PROCEDURA

1. LA PROCEDURA: DEFINIZIONE Una procedura è un insieme costituito da tre parti, di cui una obbligatoria e due facoltative. Tali parti sono le seguenti:

1) intestazione (obbligaroria); 2) blocco definizioni e dichiarazioni (definizioni Costanti, definizioni Tipi, dichiarazioni Variabili) (facoltativo); 3) blocco istruzioni (facoltativo).

Quindi perché si abbia una procedura deve esserci almeno la sua intestazione, che è considerata il suo identificatore.

Nella scrittura di un programma si possono quindi inserire anche procedure vuote, presenti cioè con la sola intestazione: ciò può essere utile nel caso, frequente, in cui si vuole preannotare una procedura che verrà poi scritta in seguito, o addirittura scrivere tutto il programma con procedure vuote, che verranno poi colmate, per avere sin dall’inizio un chiaro schema dell’intero programma. Tuttavia, lo scopo precipuo di una procedura è realizzare una certa azione tramite un insieme di istruzioni. Il blocco istruzioni appartiene quindi organicamente alla procedura. Ciò che in Pascal chiamiamo procedura infatti altro non è ciò che più in generale in linguaggio informatico si dice subroutine. Nelle istruzioni vengono usati gli identificatori. Il Compilatore, quando incontra un identificatore nelle istruzioni, deve sapere al posto di cosa sta quell'identificatore, altrimenti non è in grado di eseguire le istruzioni. Occorre quindi descrivere gli identificatori, cioè determinare al posto di cosa essi stanno, prima di inserirli nelle Istruzioni. Questo dà luogo alla

PRIMA REGOLA FONDAMENTALE

Gli

descrizione.

identificatori

usati

nelle

istruzioni

devono

essere

preceduti

da

una

loro

Se l'identificatore è una Costante, occorre determinare il dato che vi corrisponde. Se l'identificatore indica un Tipo, occorre determinare il tipo da esso rappresentato. Se l'identificatore è una Variabile, poiché non si può determinare a priori quanti e quali dati verranno associati ad essa, occorre determinare il tipo al quale tali dati dovranno appartenere.

Chiamiamo definizioni le descrizioni relative alle Costanti e ai Tipi, perché in esse sono presenti i dati e i tipi associati agli identificatori.

52

Chiamiamo dichiarazioni le descrizioni relative alle Variabili, perché in esse ci si limita ad indicare il tipo di appartenenza dei dati.

La presenza delle definizioni e dichiarazioni degli identificatori nella procedura è quindi semplicemente un'appendice formale, necessaria tuttavia ove vi sia un blocco istruzioni.

2. LA PROCEDURA: SINTASSI

Una Procedura deve in dettaglio presentare la seguente forma o sintassi.

{INTESTAZIONE} PROCEDURE ABCD;

{blocco DEFINIZIONI E DICHIARAZIONI} {DEFINIZIONI delle COSTANTI} CONST A1 = 32767; A2 = -3.40282E38; A3 = 'A'; A4 = TRUE; {DEFINIZIONI dei TIPI} TYPE

AA

= (AB,CD,EF,GH,IL);

 

BB

= CD

GH;

CC

= SET OF AA;

 

DD

= ARRAY [1

10]

OF AA;

EE

= ARRAY [0

9,1

10]

OF BB;

FF = PACKED ARRAY [-10

GG = RECORD

GG1:BB;

GG2:CC;

GG3:DD

END;

HH = FILE OF GG;

20] OF CC;

{DICHIARAZIONI delle VARIABILI} VAR B1:AA; B2:BB; B3,B4,B5:CC; B6:DD; B7:EE; B8:FF; B9:GG; B10:HH;

C1:(MN,OP,QR,ST);

C2:ARRAY [0

C3:PACKED ARRAY [0

C4:RECORD

7]

D1,D2:INTEGER; D3,D4:REAL;

D5,D6:BOOLEAN; D7:CHAR;

9,1

10]

OF SET OF MN

9] OF CHAR;

OF 1

6

END;

C41: ARRAY [2

QR;

{BLOCCO ISTRUZIONI} BEGIN B1:=AB; B2:=EF; B3:=[CD,GH]; B4:=[AB

EF,IL]; B5:=[];

B6[1]:=GH; B7[0,1]:=CD; B8[-10]:=[AB,EF]; B9.GG1:=GH; B9.GG2:=[IL,CD]; B9.GG3[1]:=AB; C1:=MN; C2[0,1]:=[OP,QR]; C3[0]:='ABCD'; C4.C41[2]:=4;

D1:=-32768; D2:=32767; D3:=-3.40282E38; D4:=3.40282E38; D5:=FALSE; D6:=TRUE; D7:='A'; WRITELN (B1,B2,B3,B4,B5,B6[1],B7[0,1],B8[-10]); WRITELN (B9.GG1,B9.GG2,B9.GG3[1]);

53

WRITELN (C1,C2[0,1],C3[0],C4.C41[2]); WRITELN (D1,D2,D3,D4,D5,D6,D7,D8[0])

END;

DESCRIZIONE

INTESTAZIONE

{INTESTAZIONE}

COMMENTO: quanto contenuto fra { } non viene preso in considerazione dall'elaboratore, ma semplicemente scritto ad uso del programmatore, per suo promemoria.

PROCEDURE

PAROLA RISERVATA: introduce la Procedura.

ABCD

IDENTIFICATORE della Procedura.

;

SEPARATORE: separa fra loro le proposizioni del linguaggio (Definizioni, Dichiarazioni, Istruzioni, etc.).

BLOCCO DEFINIZIONI E DICHIARAZIONI

Definizioni delle COSTANTI

CONST

PAROLA RISERVATA introducente la definizione delle Costanti.

A1 = 32767 DEFINIZIONE della Costante A1.

A1,A2,A3,A4

COSTANTI.

=

OPERATORE di assegnazione Tipico della definizione: stabilisce un'equivalenza fra gli identificatori (alla sinistra del segno) e i dati (alla destra del segno).

32767

DATO assegnato alla Costante A1: numero intero positivo.

-3.40282E38

DATO assegnato alla Costante A2: numero Reale negativo (notazione scientifica, sta per -3,40282 x 10 elevato 38 = -340282 seguito da 33 zeri).

A

DATO (lettera dell'alfabeto) assegnato alla Costante A3.

'

'

DELIMITATORI di caratteri.

TRUE

DATO (vero : valore di verità) assegnato alla Costante A4.

54

Definizioni dei TIPI

TYPE

PAROLA RISERVATA introducente la definizione dei Tipi.

AA = (AB,CD,EF,GH,IL)

DEFINIZIONE di un Tipo Scalare. L'ordine nel quale i dati sono scritti nella definizione determina il loro

ordine nella sequenza. Si ricorda che i dati consistono in sequenze qualsiasi di caratteri.

AA

IDENTIFICATORE del Tipo Scalare definito.

AB,CD,EF,GH,IL

DATI componenti il Tipo Scalare AA.

,

SEPARATORE dei dati.

( )

DELIMITATORI dei dati.

BB

DEFINIZIONE di un Tipo Sottocampo. I dati descritti nella definizione permettono di identificare lo Scalare rispetto al quale il Sottocampo costituisce un sottoinsieme. In questo caso, si tratta dello Scalare AA, quindi il Sottocampo qui definito è composto dai dati CD,EF,GH.

BB

IDENTIFICATORE del Sottocampo definito.

CD

primo DATO del Sottocampo BB.

GH

ultimo DATO del Sottocampo BB.

= CD

GH

CC = SET OF AA

DEFINIZIONE di un Tipo Set. I dati che lo compongono sono determinati in Istruzioni di assegnazione (vedi

più avanti).

CC

IDENTIFICATORE del Set definito.

SET OF

parole riservate.

AA

TIPO di appartenenza dei dati componenti gli insiemi costituenti gli elementi del Set CC.

DD

DEFINIZIONE di un Tipo Array monodimensionale. I dati che lo compongono sono determinati in Istruzioni

di assegnazione (vedi più avanti).

DD

IDENTIFICATORE dell'Array definito.

ARRAY OF

parole riservate.

1

INDICE associato al primo dato dell'Array DD.

10

INDICE associato all'ultimo dato dell'Array DD.

= ARRAY [1

10]

OF AA

55

SEPARATORI degli indici.

[ ] DELIMITATORI degli indici.

AA TIPO di appartenenza dei dati componenti l'Array DD.

EE = ARRAY [0

DEFINIZIONE di un Tipo Array bidimensionale. I dati che lo compongono sono determinati in Istruzioni di

assegnazione (vedi più avanti).

0

primo INDICE associato al primo dato dell'Array EE.

1

secondo INDICE associato al primo dato dell'Array EE.

9

primo INDICE associato all'ultimo dato dell'Array EE.

9,1

10]

OF BB

10

secondo INDICE associato all'ultimo dato dell'Array EE.

I dati dell'Array EE saranno dunque denotati dai seguenti indici: [0,1], [0,2], [0,3], etc., fino a [0,10]; [1,1], [1,2],

[1,3], etc., fino a [1,10]; [2,1], [2,2], [2,3], etc, fino a [2,10]; così via fino a [9,1], [9,2], [9,3], etc., fino a [9,10]

(ultimo dato).

FF = PACKED ARRAY [-10

DEFINIZIONE di un Tipo Packed Array. I dati che lo compongono sono determinati in Istruzioni di

assegnazione (vedi più avanti).

20] OF CC

PACKED ARRAY OF parole riservate.

GG = RECORD DEFINIZIONE di un Tipo Record. I dati che lo compongono sono determinati in Istruzioni di assegnazione (vedi più avanti).

GG IDENTIFICATORE del Record definito.

RECORD

parola riservata.

GG1,GG2,GG3

IDENTIFICATORI dei Tipi costituenti i campi del Record GG.

GG1

IDENTIFICATORE del Tipo costituente il primo Campo del Record GG; i dati che lo compongono appartengono al Tipo BB.

BB,CC,DD TIPI di appartenenza dei dati componenti i Campi.

END DELIMITATORE finale dei Campi.

HH = FILE OF GG DEFINIZIONE di un Tipo File; i dati che lo compongono appartengono al Tipo GG (Record) e sono determinati in Istruzioni di assegnazione (vedi più avanti).

Dichiarazioni delle VARIABILI

56

VAR PAROLA RISERVATA introducente la dichiarazione delle Variabili.

B1:AA

DICHIARAZIONE della Variabile B1: dichiara il Tipo a cui appartengono i dati che verranno assegnati a B1 tramite Istruzioni di assegnazione (vedi più avanti).

B1

VARIABILE.

:

OPERATORE tipico della dichiarazione.

AA TIPO di appartenenza dei dati assegnati a B1.

B1,B2,B3,B4,B5,B6,B7,B8,B9,B10

VARIABILI.

AA,BB,CC,DD,EE,FF,GG,HH TIPI di appartenenza dei dati che verranno assegnati alle Variabili B1, B2, B3, B4, B5, B6, B7, B8, B9, B10.

C1:(MN,OP,QR,ST)

DICHIARAZIONE comprendente la DEFINIZIONE di un Tipo Scalare a cui appartengono i dati che verranno assegnati a C1 tramite Istruzioni di assegnazione (vedi più avanti).

C1

VARIABILE.

(MN,OP,QR,ST) TIPO SCALARE definito contestualmente alla dichiarazione relativa alla Variabile C1. I dati che verranno assegnati a C1 saranno dunque i seguenti: MN, OP, QR, ST.

C2:ARRAY [0

DICHIARAZIONE comprendente la DEFINIZIONE del Tipo a cui appartengono i dati che verranno assegnati a C2

tramite istruzioni di assegnazione (vedi più avanti); tali dati consisteranno in insiemi (Set) di dati

appartenenti al Sottocampo MN dello Scalare (MN,OP,QR,ST) e costituiranno gli elementi di un Array

bidimensionale con indici [0 Esempio: [MN,OP]; [MN,OP,QR]; etc.

C3:PACKED ARRAY [0

DICHIARAZIONE comprendente la DEFINIZIONE del Tipo a cui appartengono i dati che verranno assegnati a C3 tramite istruzioni di assegnazione (vedi più avanti). Tali dati consistono in insiemi composti da un numero

predeterminato (fissato dagli indici dell'Array) di caratteri del Tipo Char: in pratica, Stringhe (parole o numeri presi come parole).

PACKED ARRAY OF CHAR parole riservate.

C4:RECORD

9,1

10]

OF SET OF MN

9,1

QR

10].

9] OF CHAR

QR

C41:ARRAY [2

7]

OF 1

6

END

DICHIARAZIONE comprendente la DEFINIZIONE del Tipo a cui appartengono i dati che verranno assegnati a C4 tramite istruzioni di assegnazione (vedi più avanti). Tali dati sono di Tipo Record con un solo Campo, il

cui Tipo è un Array monodimensionale con elementi appartenenti ad un Sottocampo dello Scalare Integer. In

definitiva, i dati appartengono all'ultimo Tipo dichiarato, il Sottocampo composto dai numeri 1,2,3,4,5,6, e

costituiscono gli elementi dell'Array [2 il quale costituisce il Campo (unico) C41 del Record C4.

D1,D2:INTEGER

DICHIARAZIONE delle VARIABILI D1,D2: dichiara il Tipo a cui appartengono i dati che verranno assegnati a D1,D2 tramite Istruzioni di assegnazione (vedi più avanti).

INTEGER parola riservata: TIPO di appartenenza dei dati che verranno assegnati alle Variabili D1, D2.

D3,D4:REAL

7],

57

DICHIARAZIONE delle VARIABILI D3,D4: dichiara il Tipo a cui appartengono i dati che verranno assegnati a D3,D4 tramite Istruzioni di assegnazione (vedi più avanti).

REAL parola riservata: TIPO di appartenenza dei dati che verranno assegnati alle Variabili D3, D4.

D5,D6:BOOLEAN

DICHIARAZIONE delle VARIABILI D5,D6: dichiara il Tipo a cui appartengono i dati che verranno assegnati a D5,D6 tramite Istruzioni di assegnazione (vedi più avanti).

BOOLEAN parola riservata: TIPO di appartenenza dei dati che verranno assegnati alle Variabili D5, D6.

D7:CHAR

DICHIARAZIONE della VARIABILE D7: dichiara il Tipo a cui appartengono i dati che verranno assegnati a D7 tramite Istruzioni di assegnazione (vedi più avanti).

CHAR parola riservata: TIPO di appartenenza dei dati che verranno assegnati alla Variabile D7.

BLOCCO ISTRUZIONI

BEGIN DELIMITATORE iniziale del blocco Istruzioni.

END DELIMITATORE finale del blocco Istruzioni.

B1:=AB

ISTRUZIONE DI ASSEGNAZIONE: assegna alla Variabile B1 il dato AB, appartenente al Tipo AA (Scalare).

:=

OPERATORE di assegnazione.

B2:=EF

assegna alla Variabile B2 il dato EF, appartenente al Tipo BB (Sottocampo di AA).

B3:=[CD,GH]

assegna alla Variabile B3 l'insieme dei dati CD,GH, appartenente al Tipo CC (Set of AA).

B4:=[AB

assegna alla Variabile B4 l'insieme dei dati AB,CD,EF,IL, (Sottocampo AB allo Scalare AA), appartenente al Tipo CC (Set of AA).

B5:=[]

assegna un insieme vuoto di dati alla Variabile B5.

B6[1]:=GH

assegna alla Variabile B6, con indice 1, il dato GH, appartenente al Tipo DD (Array [1

B7[0,1]:=CD

assegna alla Variabile B7, con indici 0,1, il dato CD, appartenente al Tipo EE

(Array [0

B8[-10]:=[AB,EF]

assegna alla Variabile B8, con indice -10, l'insieme dei dati AB,EF, appartenente al Tipo FF (Packed Array [-

10

B9.GG1:=GH

assegna alla Variabile B9.GG1, designante il Campo GG1 del Record B9, il dato GH, appartenente al Tipo BB (Sottocampo di AA).