Sei sulla pagina 1di 87

Giulio Cesare Giacobbe

PASCAL STANDARD
LINGUAGGIO DI PROGRAMMAZIONE PER ELABORATORI DIGITALI

MANUALE DIDATTICO

Propriet letteraria riservata Giulio Cesare Giacobbe Copyright Giulio Cesare Giacobbe 1975

INDICE

Prefazione PARTE PRIMA Pratica Capitolo primo Introduzione alla programmazione 1 Il computer 2 I linguaggi di programmazione 3 Il Pascal Capitolo secondo Il programma 1 Cos' un programma 2 Perch scrivere un programma? E quale? 3 La teoria dei bioritmi 4 L'utente Capitolo terzo La progettazione 1 La bozza 2 Il diagramma di flusso Capitolo quarto Le prime procedure 1 La procedura FRONTESPIZIO 2 Il programma con la prima procedura 3 La procedura INFORMAZIONI 4 Il programma con le prime due procedure Capitolo quinto L'introduzione dei dati 1 La procedura ANAGRAFICA 2 Richiesta del nome 3 Richiesta della data di nascita 4 La procedura ANAGRAFICA completa 5 La procedura DATIBIORITMO 6 Il programma con quattro procedure Capitolo sesto I calcoli 1 La funzione GIORNIMESE 2 La definizione nella procedura 3 La procedura CALCOLI: prima parte 4 La procedura CALCOLI: gli anni bisestili 5 Il programma fino alla procedura CALCOLI Capitolo settimo L'output 1 La durata delle fasi 2 La procedura DIDASCALIA 3 La procedura INTERROGATORIO 4 Il blocco istruzioni della procedura principale Capitolo ottavo Il programma completo PARTE SECONDA Teoria Capitolo primo Identificatori e tipi 1 Le istruzioni e i dati 2 Gli identificatori

5 7 8 8 8 9 10 10 10 11 11 12 12 12 15 15 18 19 20 22 22 22 23 24 25 25 28 28 29 30 33 34 37 37 38 39 40 42 46 47 47 47

3 I tipi 4 I tipi standard 5 I tipi non standard Capitolo secondo La procedura 1 La procedura: definizione 2 La procedura: sintassi 3 La funzione: definizione 4 La funzione: sintassi 5 La memorizzazione dinamica dei dati: il tipo puntatore 6 Il tipo puntatore: sintassi Capitolo terzo Il programma 1 La struttura 2 La nidificazione 3 I parametri: definizioni 4 I parametri: sintassi 5 Il programma: sintassi Capitolo quarto Le istruzioni 1 Definizioni 2 Istruzioni di assegnazione 3 Istruzioni di input 4 Istruzioni di output 5 Istruzioni condizionali 6 Istruzioni iterative 7 Istruzioni di controllo 8 Istruzioni computazionali Operandi Boolean Operandi Integer e Real Operandi Char Operandi Scalare Operandi Set Operandi Array Operandi Record Operandi Puntatore 9 Istruzioni di trattamento file

48 48 49 51 51 52 58 59 59 60 63 63 63 65 66 68 76 76 77 78 78 79 79 80 81 81 82 83 84 85 85 86 86 87

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 programmazione 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 impersonificato 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 informatica.

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 interrogativo 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 spudoratezza, 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 manuale, 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

PARTE PRIMA

PRATICA

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 ridottissimo, 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 dallesterno 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 luso 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 comunicare direttamente con il computer.

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 princpi di programmazione strutturata definiti da E. DIJKSTRA e C. HOARE. Ci ne fa un importante punto di riferimento per tutti i linguaggi strutturati di programmazione 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 descrizione 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 questultimo. 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 cominciare: 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
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 dellutente. 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 lutente, 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 allesecuzione 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 unintestazione e da un blocco istruzioni. Lintestazione 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. Lintestazione 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 allatto dellesecuzione 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 sullorigine 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 listruzione 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 (' PROGRAMMA'); WRITELN ('PER IL CALCOLO DEI BIORITMI'); 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. Listruzione 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 limpaginazione, 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 lintestazione, 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 nellesecuzione 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 lesecuzione 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 lazionamento del tasto RETURN si pu utilizzare listruzione READ, la quale attende appunto che venga introdotto da tastiera un insieme di dati concluso con il tasto RETURN. Linsieme 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 lazionamento di tale tasto per la prosecuzione dellesecuzione 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 (' 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;

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). Lesecuzione dellistruzione READ fa s che il cursore divenga visibile e pulsi in attesa dellintroduzione di dati da tastiera. Ad ogni tasto battuto, la lettera corrispondente viene stampata sullo schermo, finch viene battuto il tasto RETURN, con il che lesecuzione del programma prosegue allistruzione 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 unintestazione, 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 laltra, presentanti tutte la stessa struttura: ecco perch il Pascal viene detto linguaggio strutturato. Lintestazione della procedura principale costituita dalla parola riservata PROGRAM seguita dal nome del programma, che nel nostro caso sar ovviamente BIORITMI. Essa costituisce anche lintestazione del programma. Nel nostro programma, quindi, lintestazione 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 unistruzione che ordina lesecuzione 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 (' Programma di esercitazione'); WRITELN ('da Pascal standard di G.C.Giacobbe'); WRITELN; WRITE ('Premi RETURN per proseguire '); READ 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 allutente 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, allineata 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. Listruzione 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 lincolonnamento 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 allartificio usato nellistruzione 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 allutente 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 allutente 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 listruzione 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 dellutente 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;

Listruzione WRITE ('Ciao, come ti chiami? ') stampa sullo schermo la frase Ciao, come ti chiami? seguita da due spazii, che permettono di distanziare la risposta. Listruzione 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 dallaltro 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..15] (notare le parentesi quadre e i due puntini) fa s che ammettiamo come dato da assegnare alla variabile NOME una qualsiasi stringa (abominevole traduzione dellinglese string: insieme di caratteri) lunga fino a 15 caratteri, i quali sono pi che sufficienti per registrare anche il nome pi strampalato.

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 riferimento 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..15] OF CHAR; GIORNON,MESEN,ANNON : INTEGER;

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 ..), in cui come istruzione seguente al THEN abbiamo in entrambi i casi un' istruzione di assegnazione, caratterizzata dall'operatore :=. Loperatore := 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.

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 dellanno: '); 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 NOME : PACKED ARRAY[1..15] OF CHAR; GIORNON,MESEN,ANNON

26

GIORNOB,MESEB,ANNOB : INTEGER; {DICHIARAZIONI delle procedure} {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'); 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 dellanno: '); 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 luso di identificatori pu risultare molto utile. In questultimo 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 luso di un tipo molto ricorrente nel programma, pu essere utile invece della ripetizione del suo nome proprio (ad esempio INTEGER), luso 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 allidentificatore 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 risultato di unoperazione fra tipi diversi, indubbiamente luso degli identificatori pu risultare molto utile. In questultimo 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 unistruzione di assegnazione, assegna valore 0 alla variabile GAN (acronimo della locuzione Giorni dellAnno di Nascita), il cui compito quello di memorizzare appunto il numero dei giorni dell'anno di nascita. Lassegnazione 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, unistruzione di iterazione: essa esegue un loop (ciclo di ripetizione), ossia ripete lesecuzione dellistruzione 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 dallespressione che precede il TO (nel nostro caso, MESEN), fino a raggiungere il valore dellespressione che lo segue (nel nostro caso, 12). In pratica, listruzione 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, anchessa variabile locale.

32

Effettuiamo ora, in modo analogo, il calcolo dei giorni dell'anno del bioritmo. Creeremo a tale scopo unaltra variabile locale, che chiameremo GAB (acronimo della locuzione Giorni dellAnno del Bioritmo). Lalgoritmo 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. Listruzione 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 listruzione 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 listruzione 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 lintero ammontare dei giorni del mese del bioritmo, ma soltanto i giorni trascorsi fra linizio 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 nellambito 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 listruzione contenuta nella conseguenza, INTERVALLO:=INTERVALLO+1: la variabile INTERVALLO viene quindi aumentata di 1, cio viene aggiunto il giorno corrispondente al 29 febbraio dellanno 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 allanno di nascita) ad ANNOB1 (anno precedente lanno 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 ununit 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..15] OF CHAR; GIORNON,MESEN,ANNON, GIORNOB,MESEB,ANNOB, INTERVALLO : I; {DICHIARAZIONE della procedura FRONTESPIZIO} PROCEDURE FRONTESPIZIO; BEGIN PAGE(OUTPUT); WRITELN (' PROGRAMMA');

35

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'); 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 dellanno: '); 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:
p

c1

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 appartengono 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 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') END;

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 loperatore AND e poi per loperatore OR. Quindi listruzione 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 listruzione 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 PAGE(OUTPUT); WRITE('Vuoi continuare? (S/N) '); READ(RISPOSTA) END;

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 lutente 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..15] OF CHAR; GIORNON,MESEN,ANNON, GIORNOB,MESEB,ANNOB, INTERVALLO : I; RISPOSTA : CHAR; {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'); 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 dellanno: '); 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 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') END;

45

{DICHIARAZIONE della procedura INTERROGATORIO} PROCEDURE INTERROGATORIO; BEGIN PAGE(OUTPUT); WRITE('Vuoi continuare? (S/N) '); READ(RISPOSTA) END;

{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: ABCDEFGHIJKLMNOPQRSTUVWXYZ +-*/=.,;:'<>()[]{}^ 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
I dati che lo compongono costituiscono una sequenza finita ordinata progressivamente (0,1..), 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.

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 progressivamente. 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 dallinizio un chiaro schema dellintero 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 identificatori usati nelle istruzioni devono essere preceduti da una loro descrizione. 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..20] OF CC; GG = RECORD GG1:BB; GG2:CC; GG3:DD END; HH = FILE OF GG; {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..9,1..10] OF SET OF MN..QR; C3:PACKED ARRAY [0..9] OF CHAR; C4:RECORD C41: ARRAY [2..7] OF 1..6 END; D1,D2:INTEGER; D3,D4:REAL; D5,D6:BOOLEAN; D7:CHAR; {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.

=
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.
OPERATORE

-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. di caratteri.

''
DELIMITATORI

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. dei dati.

()
DELIMITATORI

BB = CD..GH 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 del Sottocampo definito. CD primo DATO del Sottocampo BB.
IDENTIFICATORE

GH ultimo DATO del Sottocampo BB. 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 = ARRAY [1..10] OF AA 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. associato all'ultimo dato dell'Array DD.

10
INDICE

..

55

SEPARATORI

degli indici. degli indici.

[]
DELIMITATORI

AA
TIPO

di appartenenza dei dati componenti l'Array DD.

EE = ARRAY [0..9,1..10] OF BB 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. 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..20] OF CC DEFINIZIONE di un Tipo Packed Array. I dati che lo compongono sono determinati in Istruzioni di assegnazione (vedi pi avanti). 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 del Tipo costituente il primo Campo del Record GG; i dati che lo compongono appartengono al Tipo BB.
IDENTIFICATORE

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 della Variabile B1: dichiara il Tipo a cui appartengono i dati che verranno assegnati a B1 tramite Istruzioni di assegnazione (vedi pi avanti).
DICHIARAZIONE

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..9,1..10] OF SET OF MN..QR 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..QR dello Scalare (MN,OP,QR,ST) e costituiranno gli elementi di un Array bidimensionale con indici [0..9,1..10]. Esempio: [MN,OP]; [MN,OP,QR]; etc. C3:PACKED ARRAY [0..9] OF CHAR 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 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..7], 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

57

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).
DICHIARAZIONE

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 della VARIABILE D7: dichiara il Tipo a cui appartengono i dati che verranno assegnati a D7 tramite Istruzioni di assegnazione (vedi pi avanti).
DICHIARAZIONE

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

BLOCCO ISTRUZIONI
BEGIN
DELIMITATORE

iniziale del blocco Istruzioni. finale del blocco Istruzioni. assegna alla Variabile B1 il dato AB, appartenente al Tipo AA (Scalare).

END
DELIMITATORE

B1:=AB
ISTRUZIONE DI ASSEGNAZIONE:

:=
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..EF,IL] assegna alla Variabile B4 l'insieme dei dati AB,CD,EF,IL, (Sottocampo AB..EF pi IL, entrambi appartenenti 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..10] of AA). B7[0,1]:=CD assegna alla Variabile B7, con indici 0,1, il dato CD, appartenente al Tipo EE (Array [0..9,1..10] of BB). B8[-10]:=[AB,EF] assegna alla Variabile B8, con indice -10, l'insieme dei dati AB,EF, appartenente al Tipo FF (Packed Array [10..20] of CC). 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). B9.GG2:=[IL,CD]

58

assegna alla Variabile B9.GG2, designante il Campo GG2 del Record B9, l'insieme dei dati IL,CD, appartenente al Tipo CC (Set of AA). B9.GG3[1]:=AB assegna alla Variabile B9.GG3, con indice 1, designante il Campo GG3 del Record B9, il dato AB, appartenente al Tipo DD (Array [1..10] of AA). C1:=MN assegna alla Variabile C1 il dato MN, appartenente allo Scalare (MN,OP, QR,ST). C2[0,1]:=[OP,QR] assegna alla Variabile C2, con indici 0,1, l'insieme dei dati OP,QR, appartenente al Tipo Array [0..9,1..10] of Set of MN..QR. C3[0]:='ABCD' assegna alla Variabile C3, con indice 0, il dato ABCD, appartenente al Tipo Packed Array [0..9] of Char. C4.C41[2]:=4 assegna alla Variabile C4.C41, con indice 2, designante il Campo C41 del Record C4, il dato 4, appartenente al Tipo Array [2..7] of 1..6. D1:=-32768 assegna alla Variabile D1 il dato -32768, appartenente al Tipo standard Integer. D2:=32767 assegna alla Variabile D2 il dato 32767, appartenente al Tipo standard Integer. D3:=-3.40282E38 assegna alla Variabile D3 il dato -3,40282E38, appartenente al Tipo standard Real. D4:=3.40282E38 assegna alla Variabile D4 il dato 3.40282E38, appartenente al Tipo standard Real. D5:=FALSE assegna alla Variabile D5 il dato FALSE, appartenente al Tipo standard Boolean. D6:=TRUE assegna alla Variabile D6 il dato TRUE, appartenente al Tipo standard Boolean. D7:='A' assegna alla Variabile D7 il dato A, appartenente al Tipo standard Char. WRITELN (B1,B2,B3,B4,B5,B6[1],B7[0,1],B8[-10]); WRITELN (B9.GG1,B9.GG2,B9.GG3[1]); WRITELN (C1,C2[0,1],C3[0],C4.C41[2]); WRITELN (D1,D2,D3,D4,D5,D6,D7,D8[0]) scrivono sul dispositivo di output attivato i dati corrispondenti agli identificatori scritti fra le due parentesi tonde.

3. LA FUNZIONE: DEFINIZIONE Una procedura che ha come risultato la produzione di un dato di tipo Scalare, Sottocampo o Puntatore si dice FUNZIONE. Nell'intestazione di una funzione occorre scrivere la parola riservata FUNCTION. La funzione si distingue da una normale procedura per le seguenti caratteristiche: 1) il suo identificatore costituisce una variabile (detta variabile funzionale); 2) nella sua intestazione deve essere dichiarato il tipo a cui appartiene la variabile funzionale; 3) deve esserci nel suo blocco istruzioni un'istruzione di assegnazione di valore alla variabile funzionale.

59

Per il resto la funzione equivale ad una normale procedura.

4. LA FUNZIONE: SINTASSI Una funzione deve presentare la seguente sintassi.


FUNCTION ABCD: REAL; CONST A1 = 0.76; VAR B1,B2 : INTEGER; BEGIN B1 := 438; B2 := 27; ABCD := A1 + B1 + B2 END;

DESCRIZIONE
FUNCTION parola riservata. ABCD della Funzione: esso costituisce una vera e propria VARIABILE (Variabile funzionale), che coincide con la cosiddetta Variabile Dipendente della Funzione, quella cio che assume il valore risultante dalle operazioni descritte nella Funzione.
IDENTIFICATORE

REAL TIPO di appartenenza della variabile funzionale ABCD. ABCD:=A1+B1+B2 ISTRUZIONE di assegnazione di valore alla variabile funzionale ABCD: obbligatoria.

6. LA MEMORIZZAZIONE DINAMICA DEI DATI: IL TIPO PUNTATORE La memorizzazione dei dati mediante i tipi descritti precedentemente si dice memorizzazione statica dei dati, in quanto lo spazio riservato in memoria per l'insieme dei dati di un certo tipo fissato a priori e non pu subire variazioni, anche nel caso della presenza di un numero di dati inferiore al previsto. Poniamo ora che si intenda memorizzare in un tipo ARRAY dei dati in ingresso (input), il cui numero pu variare da 100 a 1000: si costretti a dimensionare l'Array a 1000 elementi, con evidente spreco di memoria. Si quindi creata la possibilit di memorizzare i dati non in uno spazio preventivamente riservato secondo la massima quantit prevista, come avviene nel caso della memorizzazione statica, bens negli spazi rinvenuti di volta in volta liberi, secondo l'effettiva quantit dei dati. Questa si dice memorizzazione dinamica dei dati. Per ottenere una memorizzazione dinamica dei dati occorre rinvenire degli indirizzi di memoria liberi ove memorizzare i dati e tenere nota di tali indirizzi per poter riattingere gli stessi dati. Ci viene ottenuto con le Variabili di tipo Puntatore. Ad esse, con una particolare Istruzione, vengono assegnati degli indirizzi della memoria centrale, a partire dai quali, i dati, che in questo caso non vengono assegnati ad alcuna variabile, vengono memorizzati. Tali indirizzi possono essere a loro volta memorizzati, in modo da essere recuperati al momento della riattinzione dei dati.

60

Il tipo Puntatore pu puntare, cio pu venire associato, ad un qualsiasi altro tipo, il che determina l'estensione attribuibile ad ogni singolo dato. Per ottenere la massima variet di dati introducibili, normalmente il tipo Puntatore viene associato al tipo Record.

7. IL TIPO PUNTATORE: SINTASSI Diamo qui di seguito la sintassi della Procedura che permette la memorizzazione dinamica dei dati.
PROCEDURE MEMODYNAMIC; {procedura di memorizzazione dinamica dei dati} TYPE PUNT = ^RR; RR = RECORD RR1:INTEGER; RR2:REAL; RR3:PUNT END; VAR P1,P2:PUNT; X:INTEGER; Y:REAL; BEGIN P1:=NIL; P2:=P1; READ (X,Y); {INPUT} WHILE X<>0 DO BEGIN NEW (P1) P1^.RR1:=X; P1^.RR2:=Y; P1^.RR3:=P2; P2:=P1; READ (X,Y) END; WHILE P1<>NIL DO {OUTPUT} BEGIN WRITE (P1^.RR2,P1^.RR1); P1:=P1^.RR3 END END;

DESCRIZIONE
PUNT=^RR DEFINIZIONE del Tipo Puntatore. PUNT
IDENTIFICATORE del

Tipo Puntatore.

61

^
segno di Puntatore. RR associato al Tipo Puntatore: i dati memorizzati dinamicamente saranno memorizzati in spazii con estensione prevista dal Tipo RR (Record).
TIPO

RR=RECORD DEFINIZIONE del Tipo RR (Record) associato al Tipo Puntatore. RR1:INTEGER primo Campo di RR: stabilisce che i dati che verranno introdotti mediante la Variabile Puntatore, con riferimento a questo Campo, occuperanno ciascuno l'estensione di un Integer. RR2:REAL secondo Campo di RR: stabilisce che i dati che verranno introdotti mediante la Variabile Puntatore, con riferimento a questo Campo, occuperanno ciascuno l'estensione di un Real. RR3:PUNT terzo Campo di RR: stabilisce che i dati che verranno introdotti mediante la Variabile Puntatore, con riferimento a questo Campo, occuperanno cia-scuno l'estensione di un Puntatore (un indirizzo di memoria). END Delimitatore ponente fine allesposizione dei campi di RR. P1,P2 Variabili Puntatore. P1:=NIL assegna a P1 un indirizzo di memoria nullo. P2:=P1 assegna P2 l'indirizzo (nullo) attualmente ritenuto da P1. {INPUT} inizio operazioni di input dati. READ (X,Y) riceve in input i dati che assegna alle Variabili X,Y. WHILE X<>0 DO ripete l'esecuzione delle Istruzioni comprese fra i successivi BEGIN,END, fintantoch vera la proposizione X<>0 (dato assegnato ad X diverso da 0). NEW (P1) riserva in memoria uno spazio dimensionato al Tipo associato al Tipo PUNT cui appartiene P1 (Record RR) ed assegna a P1 l'indirizzo di inizio di tale spazio. P1^.RR1:=X memorizza, nello spazio di memoria riservato al Record RR, per un'estensione pari al Tipo dichiarato (Integer) per il Campo RR1, il dato X. In altri termini, la Variabile P1 punta al Campo RR1 del Record RR e vi memorizza il dato X. P1^.RR2:=Y memorizza, nello spazio di memoria riservato al Record RR, per un'estensione pari al Tipo dichiarato (Real) per il Campo RR2, il dato Y. In altri termini, la Variabile P1 punta al Campo RR2 del Record RR e vi memorizza il dato Y. P1^.RR3:=P2 memorizza, nello spazio di memoria riservato al Record RR, per un'estensione pari al Tipo dichiarato (Puntatore) per il Campo RR3, il dato P2 (indirizzo iniziale (nullo) di P1, che era stato assegnato a P2 ). In

62

altri termini, la Variabile P1 punta al Campo RR3 del Record RR e vi memorizza il dato P2. L'ordine di assegnazione dei dati ai campi del Record indifferente. P2:=P1 l'indirizzo assegnato a P1 in seguito all'Istruzione NEW(P1), cio l'indirizzo di questo primo Record RR, viene memorizzato in P2. READ (X,Y) viene letta un'altra coppia di dati e il ciclo ricomincia, fino a che non viene assegnato il dato 0 alla Variabile X. In tal modo, senza alcuno spreco di spazio, si memorizzano tutti i dati introdotti. Tale memorizzazione viene effettuata in una serie di Records conformati sul Tipo RR, nell'ultimo Campo dei quali memorizzato l'indirizzo del Record precedente, sicch sufficiente leggere tale Campo per assegnare alla Variabile Puntatore l'indirizzo del prossimo Record dal quale prelevare i dati. {OUTPUT} inizio operazioni di output dati. WHILE P1<>NIL DO ripete l'esecuzione delle Istruzioni comprese fra i successivi BEGIN,END, fintantoche vera la proposizione P1<>NIL (valore assegnato alla Variabile P1 diverso da NIL). P1^.RR2 il dato scritto in output, quello memorizzato nel secondo Campo del Record nel quale si trova attualmente il Puntatore P1 (all'inizio del ciclo, si tratta dell'ultimo Record memorizzato). P1^.RR1 il dato scritto in output, quello memorizzato nel primo Campo del Record nel quale si trova attualmente il Puntatore P1 (all'inizio del ciclo, si tratta dell'ultimo Record memorizzato). P1:=P1^.RR3 assegna a P1 l'indirizzo memorizzato nel terzo Campo del record nel quale si trova attualmente il Puntatore P1 (all'inizio del ciclo, si tratta dell'ultimo Record memorizzato): in tal modo il Puntatore si sposta al successivo Record. Notare che l'output dei Record avviene in ordine inverso alla loro memorizzazione.

63

CAPITOLO TERZO

IL PROGRAMMA
1. LA STRUTTURA La soluzione scientifica dei problemi avviene per divisione di essi in sottoproblemi di pi facile soluzione. Ci conduce alla costruzione di strutture logiche anche complesse sulla base di elementi relativamente semplici. Il Pascal stato ideato sul modello logico dell'indagine scientifica: da ci deriva non soltanto la sua efficienza sul piano della risoluzione dei problemi, ma anche la sua efficacia sul piano dell'edu-cazione alla logica scientifica. Se assumiamo la Procedura come elemento (e in effetti essa non si pu scomporre senza rinunciare alla sua esecuzione), si pu affermare che il Programma costituisce una struttura composta da Procedure E' questo il motivo per cui il Pascal si dice linguaggio strutturato. All'interno di una Procedura, e precisamente nella parte terminale del Blocco Definizioni e Dichiarazioni, possono essere infatti inserite altre procedure sotto forma di dichiarazioni. Una descrizione completa della composizione delle Procedura quindi la seguente.
PROCEDURA: COMPOSIZIONE COMPLETA

1) intestazione; 2) blocco Definizioni e Dichiarazioni (Definizioni Costanti, Definizioni Tipi, Dichiarazioni Variabili, Dichiarazioni Procedure); 3) blocco Istruzioni. 2. LA NIDIFICAZIONE Il processo di inserimento di Procedure all'interno di altre Procedure si dice nidificazione. Il processo di nidificazione delle Procedure, analogo alle famose scatole cinesi, pu andare avanti indefinitamente, in quanto ogni Procedura pu contenere altre Procedure al suo interno, sulla base della composizione suesposta. La Procedura pi esterna, quella che contiene tutte le altre, detta procedura principale, costituisce il Programma. Un Programma pu essere rappresentato con il seguente diagramma:

Program A
function B procedure E procedure H procedure I procedure C function D function F procedure L procedure G procedure L

64

Il Programma A contiene nel proprio blocco Dichiarazioni le Procedure B (Funzione), E, H, I, L, M. La Funzione B contiene nel proprio blocco Dichiarazioni le Procedure C e D (Funzione). La Procedura E contiene nel proprio blocco Dichiarazioni le Procedure F (Funzione) e G. Le Procedure fanno parte del blocco Dichiarazioni in quanto esse sono soltanto dichiarate, o meglio viene dichiarato il loro identificatore. L'esecuzione di una Procedura si ottiene mediante un'Istruzione detta chiamata di Procedura (consistente semplicemente nel nome della Procedura chiamata). La chiamata di Procedura d luogo al seguente meccanismo di attivazione di Procedura
quando una Procedura viene attivata mediante una chiamata e si d luogo alla sua esecuzione, vengono registrati in memoria i nomi degli Identificatori descritti nel suo blocco Dichiarazioni; ad essi vengono associati degli spazi della memoria nei quali vengono memorizzati i dati, quindi vengono eseguite le sue istruzioni; al termine di esse, si ha l'uscita dalla Procedura: i nomi degli Identificatori in essa descritti vengono cancellati e gli spazi vengono svuotati, rendendo cos disponibile la memoria per altre Procedure.

Si ha quindi la seguente
SECONDA REGOLA FONDAMENTALE

Un Identificatore pu essere usato nel blocco Istruzioni di una Procedura e nel blocco Istruzioni delle Procedu-re interne ad essa, soltanto se esso stato descritto precedentemente nel blocco Dichiarazioni di quella stessa Procedura. Ci significa che un Identificatore B, descritto (cio definito, se si tratta di una Costante o di un Tipo, e dichiarato, se si tratta di una Variabile o di una Procedura) nel blocco Dichiarazioni di una Procedura A, pu essere usato, sia nel blocco Istruzioni della Procedura A, sia nel blocco Istruzioni di una qualsiasi Procedura C, dichiarata susseguentemente a B nel blocco Dichiarazioni di A, come visibile nell'esempio seguente:
NIDIFICAZIONE IDENTIFICATORI {INTESTAZIONE} PROCEDURE A; {blocco DEFINIZIONI E DICHIARAZIONI} VAR A1,A2:REAL; PROCEDURE B BEGIN A1:=A1+A2 END; PROCEDURE C BEGIN B; A2:=A1+A1 END

{blocco ISTRUZIONI} BEGIN A1:=4.32; A2:=0.85; B; C; WRITE(A1,A2) END

DESCRIZIONE
Gli Identificatori A1,A2 (Variabili) e B,C (Procedure), dichiarati nel blocco Dichiarazioni della Procedura A, sono legittimamente usati, come segue. A1,A2 (Variabili):

65

1) nel blocco Istruzioni della Procedura A; 2) nel blocco Istruzioni delle Procedure B e C (susseguenti, nella Procedura A, alle Dichiarazioni di A1,A2). B (Procedura): 1) nel blocco Istruzioni della Procedura A; 2) nel blocco Istruzioni della Procedura C (susseguente, nella Procedura A, alla Dichiarazione di B). C (Procedura): nel blocco Istruzioni della Procedura A.

3. I PARAMETRI: DEFINIZIONI Una Procedura pu importare dati dall'esterno, e quindi essere eseguita ripetutamente cambiando ogni volta argomenti, ed esportare dati all'esterno, e quindi trasmettere ad altre Procedure alcuni suoi risultati. Ci avviene attraverso una lista di Parametri, presente nell'intestazione della Procedura e nell'Istruzione di chiamata della stessa. I PARAMETRI costituiscono dei dati comunicati ad una Procedura dall'esterno di essa. I Parametri presenti nell'intestazione della Procedura si dicono Parametri Formali; i Parametri loro corrispondenti, presenti nell'Istruzione di chiamata della Procedura, si dicono Parametri Effettivi. Alla chiamata della Procedura, i Parametri Formali assumono i valori dei corrispondenti Parametri Effettivi. I Parametri Formali devono essere costituiti da Identificatori; i Parametri Effettivi possono essere costituiti da Identificatori oppure da dati. I Parametri Formali possono essere usati all'interno della Procedura come se fossero stati dichiarati nel blocco Dichiarazioni.  La lista dei Parametri Formali costituisce una dichiarazione degli Identificatori che la compongono. Si possono avere quattro tipi di Parametri Formali: 1) Parametri Valore: il valore dei Parametri Effettivi loro corrispondenti rimane invariato anche in presenza di variazioni di valore dei Parametri Formali nel corso della Procedura (viene semplicemente passato ai Parametri Formali il valore dei corrispondenti Parametri Effettivi); 2) Parametri Variabili: i Parametri Effettivi loro corrispondenti assumono tutte le variazioni di valore assunte dai Parametri Formali nel corso della Procedura (gli Identificatori dei Parametri Formali vengono associati agli Identificatori dei corrispondenti Parametri Effettivi); 3) Parametri Procedura: la chiamata della Procedura costituente Parametro Formale (procedura formale) d luogo all' esecuzione della Procedura costituente il Parametro Effettivo corrispondente (procedura effettiva) (vengono associati gli Identifica-tori); la forma dell'intestazione della Procedura Formale deve essere identica alla forma dell'intestazione della Procedura Effet-tiva: se la Procedura Effettiva ha a sua volta dei parametri, questi devono essere ripetuti, anche con Identificatori diversi, nella corri-

66

spondente Procedura Formale: i Parametri passati a quest'ultima vengono passati alla Procedura Effettiva; 4) Parametri Funzione: come i Parametri Procedura. I Parametri presentano le seguenti limitazioni:
1) i parametri della procedura o della funzione effettive devono essere parametri valore. 2) gli elementi dei Packed Array non possono essere usati come parametri effettivi variabili. 3) i tipi File devono essere usati come parametri variabili.

4. I PARAMETRI: SINTASSI La lista dei parametri, e l'intestazione della procedura o della funzione, deve presentare la seguente sintassi.
LISTA PARAMETRI E INTESTAZIONE PROCEDURA (SINTASSI COMPLETA)

{INTESTAZIONE Procedura (Funzione)} FUNCTION A (A1,A2 : INTEGER; VAR A3,A4 : REAL; PROCEDURE A5 (A51:CHAR); FUNCTION A6 (A61:INTEGER) : REAL) : BOOLEAN {CHIAMATA Procedura} A(B1,B2,B3,B4,B51,B5,B61,B6)

DESCRIZIONE
INTESTAZIONE Procedura (Funzione) A
IDENTIFICATORE

di Procedura (Funzione).

()
DELIMITATORI

della lista PARAMETRI FORMALI.

A1,A2 costituenti PARAMETRI FORMALI VALORE: le eventuali variazioni di valore assunte da tali Variabili nel corso della procedura non vengono esportate (come per una normale Variabile Locale, viene registrato in memoria il loro identificatore e viene riservato uno spazio adeguato al loro Tipo, quindi viene loro assegnato il valore iniziale, che quello della corrispondente Variabile Parametrica Effettiva: chiamata per valore).
VARIABILI

INTEGER TIPO di appartenenza dei Parametri Valore. VAR


PAROLA RISERVATA

introducente l'elenco dei Parametri Formali Variabili.

A3,A4 costituenti PARAMETRI FORMALI VARIABILI: le eventuali variazioni di valore assunte da tali Variabili nel corso della procedura vengono esportate (vengono associate alle corrispondenti Variabili Parametriche Effettive, delle quali sono a tutti gli effetti le rappresentanti e alle quali vengono quindi attribuite le variazioni di valore da esse assunte nel corso della Procedura: chiamata per indirizzo);
VARIABILI

67

preferibile usare per i Parametri Formali Variabili gli stessi Identificatori dei corrispondenti Parametri Effettivi, in modo da essere consapevoli in ogni momento delle variazioni di valore assunte da questi ultimi. REAL TIPO di appartenenza dei Parametri Variabili. PROCEDURE
PAROLA RISERVATA

introducente un Parametro Formale Procedura.

A5
IDENTIFICATORE

di PARAMETRO FORMALE PROCEDURA.

A51 costituente PARAMETRO FORMALE VALORE della Procedura A5: i Parametri Formali delle Procedure assunte a loro volta come Parametri possono essere soltanto Parametri valore.
VARIABILE

CHAR TIPO di appartenenza della Variabile A51. FUNCTION


PAROLA RISERVATA

introducente un Parametro Formale Funzione.

A6
IDENTIFICATORE

di PARAMETRO FORMALE FUNZIONE.

A61 costituente PARAMETRO FORMALE VALORE della Funzione A6: i Parametri Formali delle Funzioni assunte a loro volta come Parametri possono essere soltanto Parametri valore.
VARIABILE

INTEGER TIPO di appartenenza della Variabile A61. REAL TIPO di appartenenza del Parametro Formale Funzione A6. BOOLEAN TIPO di appartenenza della Funzione A.

CHIAMATA Procedura A
IDENTIFICATORE

della Procedura (Funzione) chiamata.

()
DELIMITATORI

della lista PARAMETRI EFFETTIVI.

B1,B2 costituenti PARAMETRI EFFETTIVI VALORE corrispondenti rispettivamente ai Parametri Formali Valore A1,A2: il valore attuale di B1,B2 viene trasmesso alle Variabili A1,A2.
VARIABILI

B3,B4 costituenti PARAMETRI EFFETTIVI VARIABILI corrispondenti rispettivamente ai Parametri Formali Variabili A3,A4: esse sono rappresentate a tutti gli effetti da tali Parametri Formali.
VARIABILI

B51 costituente PARAMETRO EFFETTIVO corrispondente al Parametro Formale A51 della Procedura A5 (a sua volta Parametro Formale della Funzione A): si tratta, come obbligatorio, di Parametro Valore.
VARIABILE

B5 di Procedura costituente PARAMETRO EFFETTIVO corrispondente al Parametro Formale A5: l'Identificatore della Procedura Effettiva B5 viene associato all'Identificatore della Procedura Formale A5, sicch la chiamata di A5 provoca l'effettiva chiamata di B5, con i Parametri Effettivi ad essa assegnati.
IDENTIFICATORE

B61

68

di Funzione costituente PARAMETRO EFFETTIVO corrispondente al Parametro Formale A6: l'Identificatore della Funzione Effettiva B6 viene associato all'Identificatore della Funzione Formale A6, sicch la chiamata di A6 provoca l'effettiva chiamata di B6, con i Parametri Effettivi ad essa assegnati.
IDENTIFICATORE

5. IL PROGRAMMA: SINTASSI In dettaglio, un Programma o Procedura Principale presenta dunque la seguente forma o sintassi: 
{INTESTAZIONE} PROGRAM A (INPUT,OUTPUT); {DEFINIZIONI E DICHIARAZIONI} CONST ACOST1=32; ACOST2=-68; ACOST3:=-0.82; VAR AVAR1:INTEGER; AVAR2,AVAR3:REAL; FUNCTION B (BPARVAL1:INTEGER; BPARVAL2:REAL; VAR BPARVAR:REAL) : REAL; CONST BCOST=20; VAR BVAR1,BVAR2:REAL; PROCEDURE C; BEGIN BVAR1:=BPARVAL1+BPARVAL2 END; FUNCTION D (VAR DPARVAR:REAL) : REAL; BEGIN DPARVAR:=DPARVAR-BCOST; D:=DPARVAR+AVAR1 END; BEGIN C; BVAR2:=D(BVAR1); BPARVAR:=BPARVAR+BVAR2; B:=BPARVAR-BVAR1+ACOST1 END; PROCEDURE E (VAR AVAR2:REAL; PROCEDURE EPARPROC (X:INTEGER); FUNCTION I (X:INTEGER) : INTEGER); CONST ECOST=400; VAR ACOST1:INTEGER; EVAR1,EVAR2:REAL; FUNCTION F (FPARVAL:INTEGER) : INTEGER; BEGIN F:=FPARVAL+ECOST END; PROCEDURE G; VAR GVAR:INTEGER;

69

BEGIN GVAR:=F(ECOST)+ACOST1; EVAR2:=GVAR+I(ACOST1) END; BEGIN ACOST1:=I(ECOST); EVAR1:=F(ACOST1)+ACOST3; G; AVAR2:=EVAR1+EVAR2; EPARPROC(ACOST1) END; PROCEDURE H (VAR AVAR1:INTEGER); BEGIN AVAR1:=AVAR1+ACOST1; AVAR2:=AVAR2+B(AVAR1,ACOST3,AVAR2) END; FUNCTION I (IPARVAL:INTEGER) : INTEGER; BEGIN I:=IPARVAL+ACOST2 END; PROCEDURE M (MPARVAL:INTEGER); FORWARD; PROCEDURE L (LPARVAL:INTEGER); BEGIN M(LPARVAL+ACOST1); AVAR1:=AVAR1+ACOST2 END; PROCEDURE M; BEGIN L(MPARVAL-ACOST1); AVAR1:=AVAR1-ACOST2 END; {ISTRUZIONI} BEGIN READLN (AVAR1); AVAR1:=I(AVAR1); AVAR2:=AVAR1+ACOST3; H(AVAR1); E(AVAR2,AVAR1,L,ACOST2,I); E(AVAR2,AVAR1,M,ACOST1,I); L(ACOST1); M(ACOST2); AVAR3:=B(AVAR1,AVAR2,AVAR2)+AVAR2; WRITELN (AVAR1,AVAR2,AVAR3) END.

DESCRIZIONE
INTESTAZIONE
PROGRAM
PAROLA RISERVATA:

designa la Procedura Principale, ossia il Programma.

A
IDENTIFICATORE

del Programma: verr usato per le operazioni di scrittura e lettura di esso sui dispositivi I/O.

INPUT

70

PAROLA RISERVATA:

designa un File predefinito, aperto in connessione con un dispositivo di INPUT (di solito la tastiera); formalmente costituisce un Parametro Procedura della Procedura Principale, al quale corrisponde come Parametro Effettivo una Procedura predefinita (incorporata); in caso di immissione di Dati tramite i dispositivi di INPUT, nel PASCAL STANDARD tale parametro obbligatorio. OUTPUT
PAROLA RISERVATA:

designa un File predefinito, aperto in connessione con un dispositivo di OUTPUT (di solito lo schermo video); formalmente costituisce un Parametro procedura della Procedura Principale, al quale corrisponde come Parametro Effettivo una Procedura predefinita (incorporata); in caso di emissione di Dati tramite i dispositivi di OUTPUT, nel PASCAL STANDARD tale Parametro obbligatorio.

DEFINIZIONI E DICHIARAZIONI
ACOST1,ACOST2,ACOST2 COSTANTI GLOBALI, valide in tutte le Procedure. AVAR1,AVAR2,AVAR3 VARIABILI GLOBALI, valide in tutte le Procedure.

FUNCTION B
DICHIARAZIONE

della Funzione B.

B di Funzione dichiarato: soltanto esso, utilizzabile nelle Istruzioni della Procedura Principale: in essa gli Identificatori dichiarati all'interno della Funzione B non sono noti.
IDENTIFICATORE

BPARVAL1,BPARVAL2
PARAMETRI FORMALI VALORE

della Funzione B.

BPARVAR Parametro Formale Variabile della Funzione B. REAL TIPO di appartenenza dei Dati attribuiti alla Variabile Funzionale B. BCOST
COSTANTE LOCALE

della Funzione B.

BVAR1,BVAR2
VARIABILI LOCALI

della Funzione B.

PROCEDURE C DICHIARAZIONE di Procedura. La Procedura C dichiarata allinterno della Funzione B. C dichiarato, utilizzabile nel blocco Istruzioni della Funzione B e delle Procedure dichiarate in B dopo C: in tali blocchi gli Identificatori dichiarati all'interno della Procedura C non sono noti.
IDENTIFICATORE

BVAR1
VARIABILE LOCALE

della Funzione B, utilizzabile nella Procedura C. della Funzione B, utilizzabili nella procedura C.

BPARVAL1,BPARVAL2
PARAMETRI FORMALI VALORE

FUNCTION D
DICHIARAZIONE

di Funzione. La Funzione D dichiarata allinterno della Funzione B.

71

dichiarato, utilizzabile nel blocco Istruzioni della Funzione B e delle Procedure dichiarate in B dopo D: in tali blocchi gli Identificatori dichiarati all'interno della Funzione D non sono noti.
IDENTIFICATORE

DPARVAR
PARAMETRO FORMALE VARIABILE

della Funzione D.

REAL TIPO di appartenenza dei Dati attribuiti alla Variabile funzionale D. BCOST
COSTANTE LOCALE

della Funzione B, utilizzabile nella Funzione D.

AVAR1
VARIABILE GLOBALE.

C della Procedura C: legittima in quanto l'Identificatore C appartiene al blocco Dichiarazioni di B. D(BVAR1) CHIAMATA della Funzione D, con Parametro Effettivo Variabile BVAR1 (Variabile locale di B): legittima in quanto l'Identificatore D appartiene al blocco Dichiarazioni di B.
CHIAMATA

ACOST1
COSTANTE GLOBALE.

PROCEDURE E DICHIARAZIONE di Procedura. E dichiarato: soltanto esso, utilizzabile nelle istruzioni della Procedura Principale; in essa gli Identificatori dichiarati all'interno della Proce-dura E non sono noti.
IDENTIFICATORE

AVAR2 della Procedura E: l'uso dello stesso Identificatore della omonima Variabile Globale dovuto al fatto che questa verr usata come suo Parametro Effettivo ed quindi utile essere consapevoli delle sue variazioni di valore.
PARAMETRO FORMALE VARIABILE

EPARPROC della Procedura E: esso deve presentare la stessa forma della intestazione delle Procedure assunte come suoi Parametri Effettivi.
PARAMETRO FORMALE PROCEDURA

X della Procedura EPARPROC: ad esso corrisponde il Parametro Effettivo Valore delle Procedura assunte come Parametri Effettivi della Procedura EPARPROC; l'Identificatore X arbitrario.
PARAMETRO FORMALE VALORE

I della Procedura E: esso deve presentare la stessa forma della intestazione delle Funzioni assunte come suoi Parametri Effettivi.
PARAMETRO FORMALE FUNZIONE

X della Funzione I: ad esso corrisponde il Parametro Effettivo Valore delle Funzioni assunte come Parametri Effettivi della Funzione I; l'Identificatore X arbitrario.
PARAMETRO FORMALE VALORE

ECOST
COSTANTE LOCALE

della Procedura E.

ACOST1 nonostante il nome identico alla Costante Globale, una VARIABILE LOCALE della Procedura E: con ci la omonima Costante Globale non accessibile all'interno di tale Procedura. EVAR1,EVAR2
VARIABILI LOCALI

della Procedura E.

72

FUNCTION F
DICHIARAZIONE

di Funzione. La Funzione F dichiarata allinterno della Procedura E.

F dichiarato, utilizzabile nel Blocco Istruzioni della Procedura E e delle Procedure dichiarate in E dopo F: in tali Blocchi gli Identificatori dichiarati all'interno della Funzione F non sono noti.
IDENTIFICATORE

FPARVAL
PARAMETRO FORMALE VALORE

della Funzione F.

PROCEDURE G DICHIARAZIONE di Procedura. La Procedura G dichiarata allinterno della Procedura E. G dichiarato, utilizzabile nel blocco Istruzioni della Procedura E e delle Procedure dichiarate in E dopo G: in tali Blocchi gli Identificatori dichiarati all'interno della Procedura G non sono noti.
IDENTIFICATORE

GVAR
VARIABILE LOCALE

della Procedura G.

F(ECOST) della Funzione F, con Parametro Effettivo valore ECOST (Costante Locale di E): legittima in quanto l'Identificatore F precede G nel Blocco Dichiarazioni di E. I(ACOST1) CHIAMATA della Funzione I, con Parametro Effettivo Valore ACOST1 (Variabile locale di E): legittima in quanto la dichiarazione dell'Identificatore I (Parametro Formale di E) precede G all'interno di E.
CHIAMATA

I(ECOST) della Funzione I, con Parametro Effettivo Valore ECOST (COSTANTE LOCALE di E): legittima in quanto l'Identificatore I stato dichiarato nella lista Parametri Formali di E.
CHIAMATA

F(ACOST1) CHIAMATA della Funzione F, con Parametro Effettivo Valore ACOST1 (Variabile Locale di E): legittima in quanto l'Identificatore F appartiene al Blocco Dichiarazioni di E. ACOST3
COSTANTE GLOBALE.

G
CHIAMATA

della Procedura G: legittima in quanto l'Identificatore G appartiene al Blocco Dichiarazioni di E.

AVAR2 della Procedura E: il valore della omonima Variabile Globale, usata come Parametro Effettivo ad esso corrispondente, cambia con la presente Istruzione di assegnazione.
PARAMETRO FORMALE VARIABILE

EPARPROC(ACOST1) CHIAMATA della Procedura EPARPROC, con Parametro Effettivo Valore ACOST1 (Variabile Locale di E): legittima in quanto l'Identificatore EPARPROC stato dichiarato nella lista Parametri Formali di E.

PROCEDURE H DICHIARAZIONE di Procedura. H dichiarato: soltanto esso, utilizzabile nelle Istruzioni della Procedura Principale; in essa gli Identificatori dichiarati all'interno della Procedura H non sono noti.
IDENTIFICATORE

AVAR1 della Procedura H: l'uso dello stesso Identificatore della omonima Variabile Globale dovuto al fatto che questa verr usata come suo Parametro Effettivo ed quindi utile essere consapevoli delle sue variazioni di valore.
PARAMETRO FORMALE VARIABILE

ACOST1

73

COSTANTE GLOBALE.

AVAR2
VARIABILE GLOBALE.

B(AVAR1,ACOST3,AVAR2) CHIAMATA della Funzione B, con Parametri Effettivi AVAR1 (Parametro Valore), ACOST3 (Parametro Valore), AVAR2 (Parametro Variabile): legit-tima in quanto la Funzione B precede H nel Blocco Dichiarazioni della Procedura Programma.

FUNCTION I
DICHIARAZIONE

di Funzione.

I dichiarato: soltanto esso, utilizzabile nelle Istruzioni della Procedura Programma; in essa gli Identificatori dichiarati all'interno della Funzione I non sono noti.
IDENTIFICATORE

IPARVAL
PARAMETRO FORMALE VALORE

della Funzione I.

ACOST2
COSTANTE GLOBALE.

PROCEDURA M (MPARVAL:INTEGER); FORWARD; INTESTAZIONE completa di Procedura. La sua presenza permette la chiamata della Procedura M da parte della Procedura L, che in realt la precede nel Blocco Dichiarazioni della Procedura Programma. Questo espediente, che si dice riferimento in avanti (FORWARD), usato soprattutto nel caso di chiamata reciproca da parte di due Procedure. M dichiarato: soltanto esso, utilizzabile nelle Istruzioni della Procedura Programma; in quest'ultima, gli Identificatori dichiarati all'interno della Procedura M non sono noti.
IDENTIFICATORE

MPARVAL
PARAMETRO FORMALE VALORE

della Procedura M.

FORWARD parola in codice permettente il riferimento in avanti: non parola riservata, in quanto pu essere usata come Identificatore in altra parte del Programma.

PROCEDURA L DICHIARAZIONE di Procedura. L dichiarato: soltanto esso, utilizzabile nelle Istruzioni della Procedura Programma; in quest'ultima, gli Identificatori dichiarati all'interno della Procedura L non sono noti.
IDENTIFICATORE

LPARVAL
PARAMETRO FORMALE VALORE

della Procedura L.

M(LPARVAL+ACOST1) CHIAMATA della Procedura M, con Parametro Effettivo Valore risultato dell'espressione LPARVAL+ACOST1 (Costante Globale): legittima in quanto la Dichiarazione di M come riferimento in avanti precede L nel blocco Dichiarazioni della Procedura Programma. AVAR2
VARIABILE GLOBALE.

ACOST3
COSTANTE GLOBALE.

74

PROCEDURE M INTESTAZIONE incompleta della Procedura M: quando vi precedentemente un riferimento in avanti (FORWARD), l'intestazione pu limitarsi al solo Identifica-tore di Procedura. L(MPARVAL-ACOST2) CHIAMATA della Procedura L, con Parametro Effettivo Valore risultato dell' espressione MPARVALACOST2. MPARVAL
PARAMETRO FORMALE VALORE

della Procedura M.

ACOST2
COSTANTE GLOBALE.

AVAR2
VARIABILE GLOBALE.

ACOST3
COSTANTE GLOBALE.

ISTRUZIONI
BEGIN iniziale del Blocco Istruzioni della Procedura Programma: tutti gli Identificatori usati in questo Blocco Istruzioni devono essere stati dichiarati nel Blocco Dichiarazioni della Procedura Programma (le Variabili e le Costanti, quindi, saranno globali).
DELIMITATORE

READLN (AVAR1) ISTRUZIONE di INPUT: legge un Dato immesso da tastiera e lo assegna alla Variabile AVAR1. AVAR1
VARIABILE GLOBALE,

dichiarata nel Blocco Dichiarazioni della Procedura Principale.

I(ACOST1) CHIAMATA della Funzione I, con Parametro Effettivo Valore ACOST1: assegna valore alla Variabile AVAR1. H(AVAR1) CHIAMATA della Procedura H, con Parametro Effettivo Variabile AVAR1: assegna nuovi valori alle Variabili AVAR1, AVAR2. E(AVAR2,AVAR1,L,ACOST2,I) CHIAMATA della Procedura E, con Parametri Effettivi: AVAR2 (Variabile), L (Procedura), AVAR1 (Valore, della Procedura L), I (Funzione), ACOST2 (Valore, della Funzione I): assegna nuovi valori alle Variabili AVAR1, AVAR2. E(AVAR2,AVAR1,M,ACOST1,I) CHIAMATA della Procedura E, con Parametri Effettivi: AVAR2 (Variabile), M (Procedura), AVAR1 (Valore, della Procedura M), I (Funzione), ACOST1 (Valore, della Funzione I): assegna nuovi valori alle Variabili AVAR1, AVAR2. L(ACOST1) CHIAMATA della Procedura L, con Parametro Effettivo Valore ACOST1: assegna nuovo valore alla Variabile AVAR1. M(ACOST2) CHIAMATA della Procedura M, con Parametro Effettivo Valore ACOST2: assegna nuovo valore alla Variabile AVAR1. B(AVAR1,AVAR2,AVAR2) CHIAMATA della Funzione B, con Parametri Effettivi: AVAR1 (Valore), AVAR2 (Valore), AVAR2 (Variabile): assegna nuovi valori alle Variabili AVAR2, AVAR3.

75

WRITELN (AVAR1,AVAR2,AVAR3) ISTRUZIONE di OUTPUT: scrive sullo schermo video i valori delle Variabili AVAR1, AVAR2, AVAR3. END.
DELIMITATORE

finale del blocco Istruzioni della Procedura Programma.

76

CAPITOLO QUARTO

LE ISTRUZIONI

1. DEFINIZIONI Una volta preso atto della struttura con la quale deve essere costruito un programma, tutto ci che occorre conoscere per scrivere un programma in Pascal sono le istruzioni. Le istruzioni costituiscono la parte essenziale di un programma: questo ha come unico scopo quello di fare eseguire le istruzioni e senza di esse il programma non sussiste. Tutto ci che vi in un programma oltre alle istruzioni ha il solo scopo di permettere l'esecuzione delle istruzioni. Non necessario apprendere a memoria tutte le istruzioni del Pascal prima di accingersi a programmare: con l'uso esse verranno apprese naturalmente senza sforzo. L'importante avere a disposi-zione un prontuario nel quale le istruzioni siano descritte nella loro essenzialit ed elencate secondo un ordine che ci permetta di rintracciarle facilmente al momento del bisogno. E` ci che si cercato con l'elenco che segue. Sar utile, naturalmente, effettuarne una prima lettura, allo scopo di formarsi un'idea sufficientemente chiara e completa delle istruzioni che si hanno a disposizione in questo linguaggio. Iniziamo col fornire alcune nozioni strumentali. Una sola istruzione si dice ISTRUZIONE SEMPLICE. Pi istruzioni si dicono costituire un'ISTRUZIONE COMPOSTA.
ESEMPIO: A := 4.39

istruzione semplice.
BEGIN A := 4; B := 9 END istruzione composta. Un'Istruzione Composta va racchiusa entro i delimitatori BEGIN, END e le istruzioni che la compongono vengono eseguite nell'ordine in cui sono scritte.

Nell'elenco delle istruzioni che seguir si useranno i seguenti termini, con il significato indicato. ISTRUZIONE
istruzione semplice o composta.

A,B,C
variabili generiche di qualsiasi tipo.

VB
variabile di tipo Boolean.

EB
espressione che ha per risultato un dato di tipo Boolean (pu essere, al limite, una VB).

VI
variabile di tipo Integer.

77

EI
espressione che ha per risultato un dato di tipo Integer (pu essere, al limite, una VI).

VR
variabile di tipo Real.

ER
espressione che ha per risultato un dato di tipo Real (pu essere, al limite, una VR).

VC
variabile di tipo Char.

EC
espressione che ha per risultato un dato di tipo Char (pu essere, al limite, una VC).

VS
variabile di tipo Scalare.

ES
espressione che ha per risultato un dato di tipo Scalare (pu essere, al limite, una VS).

VT
variabile di tipo Set.

ET
espressione che ha per risultato un dato di tipo Set (pu essere, al limite, una VT).

VA
variabile di tipo Array.

VPA
variabile di tipo Packed Array.

VR
variabile di tipo Record.

VP
variabile di tipo Puntatore.

EP
espressione che ha per risultato un dato di tipo Puntatore (pu essere, al limite, una VP).

VF
variabile di tipo File.

2. ISTRUZIONI DI ASSEGNAZIONE Le istruzioni di assegnazione presentano la seguente sintassi:


A := 4.78 A := B A := 4.78 + B A := LOG(B)

78

Tali istruzioni assegnano alla variabile A rispettivamente il valore di una Costante, di una Variabile, di un'Espressione, di una Funzione. La variabile A non pu essere di tipo File. Il segno := si dice operatore di assegnazione.

3. ISTRUZIONI DI INPUT Sono le seguenti. READ (A,B,C)


Interrompe l'esecuzione del programma e attende che vengano introdotti i dati da assegnare rispettivamente alle variabili A,B,C (massimo sei). I dati devono corrispondere ai tipi dichiarati per ogni variabile; possono essere separati fra loro da spazi o da CR (ritorno carrello: tasto RETURN); non devono essere introdotte virgole. L'ultimo dato introdotto deve essere seguito da CR. Eventuali dati introdotti oltre quelli richiesti vengono ignorati. Il cursore rimane, dopo lintroduzione dellultimo dato, sulla stessa linea.

READ
Interrompe l'esecuzione del programma, che viene ripristinata da CR. Eventuali dati introdotti prima di CR vengono ignorati. Il cursore rimane sulla stessa linea.

READLN (A,B,C)
Come READ (A,B,C), con la differenza che il cursore si porta, dopo lintroduzione dellultimo dato, sulla linea successiva.

READLN
Come READ, con la differenza che il cursore si porta, dopo CR, sulla linea successiva.

4. ISTRUZIONI DI OUTPUT Sono le seguenti. WRITE ('CIAO',A,B)


Stampa, attraverso il dispositivo di output attivato, la stringa CIAO e i dati corrispondenti alle variabili A,B in altrettanti campi (por-zioni di linea, la cui lunghezza fissata dall'implementazione: default). I dati sono allineati a destra all'interno di ciascun campo. Il cursore viene mantenuto sulla stessa linea in cui stato stampato l'ultimo dato.

WRITE ('CIAO':5,A:10,B:20:4)
Stampa la stringa CIAO in un campo di 5 spazi; il dato corrispondente alla variabile A in un campo di 10 spazi; il dato corrispondente alla variabile B, che deve essere un numero reale, in un campo di 20 spazi, riportando le sue prime 4 cifre decimali. I dati sono allineati a destra all'interno di ciascun campo. Il cursore viene mantenuto sulla stessa linea in cui stato stampato l'ultimo dato.

WRITE
Stampa un campo vuoto (sposta il cursore di un campo).

WRITELN ('CIAO',A,B)
Come WRITE (CIAO, A,B), con la differenza che il cursore si porta, dopo che stato stampato lultimo dato, sulla linea successiva.

79

WRITELN ('CIAO':5,A:10,B:20:4)
Come WRITE ('CIAO':5,A:10,B:20:4), con la differenza che il cursore si porta, dopo che stato stampato lultimo dato, sulla linea successiva.

WRITELN
Stampa una linea vuota e sposta il cursore sulla linea successiva.

5. ISTRUZIONI CONDIZIONALI Sono le seguenti. IF EB THEN ISTRUZIONE


Se EB=TRUE, ISTRUZIONE viene eseguita; se EB=FALSE, ISTRUZIONE non viene eseguita. ISTRUZIONE pu essere a sua volta un'istruzione IF THEN, quindi si pu avere nidificazione.

IF EB THEN ISTRUZIONE1 ELSE ISTRUZIONE2


Se EB=TRUE, viene eseguita ISTRUZIONE1; se EB=FALSE, viene eseguita ISTRUZIONE2. ISTRUZIONE1 o ISTRUZIONE2 possono essere a loro volta istruzioni IF THEN ELSE, quindi si pu avere nidificazione.

CASE ES OF ES1:ISTRUZIONE1; ES2,ES3:ISTRUZIONE2; ES4:ISTRUZIONE3 END


Se ES=ES1, viene eseguita ISTRUZIONE1; se ES=ES2 o ES=ES3, viene eseguita ISTRUZIONE2; se ES=ES4, viene eseguita ISTRUZIONE3. L'eguaglianza del selettore ES con uno dei dati deve comunque verificarsi, altrimenti si ha errore.

6. ISTRUZIONI ITERATIVE Sono le seguenti. REPEAT ISTRUZIONE UNTIL EB


Esegue ISTRUZIONE; ad ogni termine di ISTRUZIONE, se EB=FALSE, ripete l'esecuzione di ISTRUZIONE; se EB=TRUE, l'esecuzione cessa. Il controllo dell'eguaglianza avviene ad ogni fine ciclo. Anche se istruzione composta, ISTRUZIONE non deve essere delimitata da BEGIN, END.

WHILE EB DO ISTRUZIONE
Se EB=TRUE, esegue ISTRUZIONE; se EB=TRUE, ogni volta ripete l'esecuzione di ISTRUZIONE; se EB=FALSE, l'esecuzione cessa. Il controllo dell'eguaglianza avviene ad ogni inizio ciclo.

FOR VS := ES1 TO ES2 DO ISTRUZIONE


Ripete l'esecuzione di ISTRUZIONE un numero di volte pari a ES2-ES1+1. La variabile di controllo VS, il valore iniziale ES1 e il valore finale ES2 devono essere dello stesso tipo Scalare (escluso Real). I valori di ES1,ES2 non possono essere modificati da istruzioni interne al ciclo; pu invece essere modificato, con un'istruzione interna al ciclo, il valore della variabile VS. ES1 deve essere minore o eguale a ES2 (se maggiore, l'istruzione non viene eseguita). All'inizio del ciclo, viene posto VS=ES1; ad ogni fine ciclo, il valore di VS viene incrementato di 1: allorch supera ES2, il ciclo ha termine. A ciclo terminato, il valore di VS rimane indefinito.

80

FOR VS := ES1 DOWNTO ES2 DO ISTRUZIONE


Ripete l'esecuzione di ISTRUZIONE un numero di volte pari a ES1-ES2+1. La variabile di controllo VS, il valore iniziale ES1 e il valore finale ES2 devono essere dello stesso tipo Scalare (escluso Real). I valori di ES1,ES2 non possono essere modificati da istruzioni interne al ciclo; pu invece essere modificato, con un'istruzione interna al ciclo, il valore della variabile VS. ES1 deve essere maggiore o eguale a ES2 (se minore, l'istruzione non viene eseguita). All'inizio del ciclo, viene posto VS=ES1; ad ogni fine ciclo, il valore di VS viene decrementato di 1: allorch supera ES2, il ciclo ha termine. A ciclo terminato, il valore di VS rimane indefinito.

7. ISTRUZIONI DI CONTROLLO Vi ununica istruzione di controllo, che la seguente. GOTO N


Trasferisce l'esecuzione all'ISTRUZIONE contrassegnata con N (numero inte-ro di massimo 4 cifre). ESEMPIO: 1000: ISTRUZIONE; ........... GOTO 1000; L'ambiente della LABEL (etichetta numerale), quello cio nel quale possono essere presenti l'ISTRUZIONE contrassegnata da N e il GOTO N, l'intera procedura nella quale la LABEL viene dichiarata. La dichiarazione della LABEL deve precedere ogni altra dichiarazione nel blocco dichiarazioni della procedura all'interno della quale essa valida. ESEMPIO: PROCEDURE A; LABEL 1000; ......... BEGIN 1000: WRITELN ........... ........... GOTO 1000 ........... END; Non permessa la presenza di un GOTO N nel blocco istruzioni di una procedura esterna a quella nella quale la LABEL N dichiarata. ESEMPIO: PROCEDURE A; LABEL 100; ........ PROCEDURE B; LABEL 1000; ......... BEGIN {inizio blocco istruzioni PROCEDURA B} ................. 1000 : WRITELN('mille'); ................. GOTO 1000;

81

................. GOTO 100; ................. END; {fine blocco istruzioni PROCEDURA B} BEGIN {inizio blocco istruzioni PROCEDURA A} ................ 100 : WRITELN('cento'); ................ {qui non permesso un GOTO 1000} END; L'istruzione di GOTO andrebbe riservata solo per quei casi abbastanza fuori dal comune in cui la struttura naturale di un algoritmo deve essere spezzata. E` buona regola evitare l'uso di salti per esprimere iterazioni regolari e l'esecuzione condizionata di istruzioni; i salti incrinano infatti l'immagine della struttura dell'elaborazione, rappresentata nella struttura testuale (statica) del programma. Inoltre la mancanza di corrispondenza tra struttura testuale e computazionale (statico e dinamico) estremamente nociva per la chiarezza del programma e rende molto pi difficoltosa la verifica. La presenza di GOTO in un programma Pascal spesso il sintomo che il programmatore non ha imparato a 'pensare in Pascal' e che ancora legato ad altri linguaggi dove questo costrutto necessario. (N.WIRTH e K.JENSEN, Pascal. Manuale e standard del linguaggio, op. cit., pag. 34).

8. ISTRUZIONI COMPUTAZIONALI Le istruzioni computazionali sono le seguenti. Operandi BOOLEAN VB := EB1 = EB2
UGUAGLIANZA: assegna a VB il valore booleano della relazione di uguaglianza fra EB1,EB2.

VB := EB1 <> EB2


DISUGUAGLIANZA: assegna a VB il valore booleano della relazione di disuguaglianza fra EB1,EB2.

VB := EB1 > EB2


MAGGIORANZA: assegna a VB il valore booleano della relazione di maggioranza fra EB1,EB2. NOTA: TRUE > FALSE.

VB := EB1 >= EB2


MAGGIORANZA O UGUAGLIANZA: assegna a VB il valore booleano della relazione di maggioranza o uguaglianza fra EB1,EB2. NOTA: TRUE > FALSE.

VB := EB1 < EB2


MINORANZA: assegna a VB il valore booleano della relazione di minoranza fra EB1,EB2. NOTA: FALSE<TRUE.

VB := EB1 <= EB2


MINORANZA O UGUAGLIANZA: assegna a VB il valore booleano della relazione di minoranza o uguaglianza fra EB1,EB2. NOTA: FALSE<TRUE.

VB := NOT EB
NEGAZIONE: assegna a VB il valore opposto di EB. NOTA: TRUE opposto a FALSE.

82

VB := EB1 AND EB2


CONGIUNZIONE: assegna a VB il valore booleano della congiunzione di EB1 ed EB2.

VB := EB1 OR EB2
DISGIUNZIONE: assegna a VB il valore booleano della disgiunzione di EB1 ed EB2.

Operandi INTEGER e REAL VB := EI1 = EI2; VB := ER1 = ER2


UGUAGLIANZA: assegna a VB il valore booleano della relazione di uguaglianza fra EI1,EI2 o ER1,ER2.

VB := EI1 <> EI2; VB := ER1 <> ER2


DISUGUAGLIANZA: assegna a VB il valore booleano della relazione di disuguaglianza fra EI1,EI2 o ER1,ER2.

VB := EI1 > EI2; VB := ER1 > ER2


MAGGIORANZA: assegna a VB il valore booleano della relazione di maggioranza fra EI1,EI2 o ER1,ER2.

VB := EI1 >= EI2; VB := ER1 >= ER2


MAGGIORANZA O UGUAGLIANZA: assegna a VB il valore booleano della relazione di maggioranza o uguaglianza fra EI1,EI2 o ER1,ER2.

VB := EI1 < EI2; VB := ER1 < ER2


MINORANZA: assegna a VB il valore booleano della relazione di minoranza fra EI1,EI2 o ER1,ER2.

VB := EI1 <= EI2; VB := ER1 <= ER2


MINORANZA O UGUAGLIANZA: assegna a VB il valore booleano della relazione di minoranza o uguaglianza fra EI1,EI2 o ER1,ER2.

VI := - EI; VR := - ER
INVERSIONE DI SEGNO: assegna a VI o a VR il valore di EI o ER con segno invertito.

VI := ABS(EI); VR := ABS(ER)
VALORE ASSOLUTO: assegna a VI o a VR il valore assoluto del numero corrispondente a EI o a ER.

VI := TRUNC (ER)
TRONCAMENTO: assegna a VI la parte intera del numero corrispondente a ER.

VI := ROUND (ER)
ARROTONDAMENTO: assegna a VI il valore arrotondato del numero corrispondente a ER (per ER=4.5, si ha VI=5; per ER=-4.5, si ha VI=- 5).

VB := ODD (EI)
DISPARITA': assegna a VB il valore booleano TRUE se il numero corrispondente a EI dispari; il valore FALSE se pari.

VI := EI1 + EI2; VR := EI + ER; VR := ER1 + ER2


ADDIZIONE: assegna a VI o a VR il risultato dell'addizione.

VI := EI1 - EI2; VR := EI - ER; VR := ER - EI; VR := ER - ER


SOTTRAZIONE: assegna a VI o a VR il risultato della sottrazione.

VI := EI1 * EI2; VR := EI * ER; VR := ER1 * ER2


MOLTIPLICAZIONE: assegna ad VI o a VR il risultato della moltiplicazione.

VI := EI1 DIV EI2

83

DIVISIONE INTERA: assegna a VI il risultato in forma di numero intero (il resto viene eliminato) della divisione di EI1 per EI2.

VI := EI1 MOD EI2


RESTO DI DIVISIONE INTERA: assegna a VI il resto della divisione di EI1 per EI2.

VR := EI1 / EI2; VR := EI / ER; VR := ER / EI; VR := ER1 /ER2


DIVISIONE REALE: assegna a VR il risultato della divisione.

VI := SQR (EI); VR := SQR (ER)


QUADRATO: assegna a VI o a VR il quadrato di EI o ER.

+VR := SQRT (+ER)


RADICE QUADRATA: assegna a VR (positivo) la radice quadrata di ER (positivo).

VR := SIN (EI); VR := SIN (ER)


SENO: assegna a VR (radianti) il seno di EI o ER (radianti).

VR := COS (EI); VR := COS (ER)


COSENO: assegna a VR (radianti) il coseno di EI o ER (radianti).

VR := SIN(EI)/COS(EI); VR := SIN(ER)/COS(ER)
TANGENTE: assegna a VR (radianti) la tangente di EI o ER (radianti).

VR := ARCTAN (EI); VR := ARCTAN (ER)


COTANGENTE: assegna a VR (radianti) la cotangente di EI o ER (radianti).

VR := LN (+EI); VR := LN (+ER)
LOGARITMO NATURALE: assegna a VR il logaritmo a base E di EI o ER (positivo).

VR := EXP (EI); VR := EXP (ER)


ANTILOGARITMO NATURALE: assegna a VR la potenza di E (base dei logaritmi naturali) con esponente EI o ER.

VR := LOG (EI); VR := LOG (ER)


LOGARITMO A BASE 10: assegna a VR il logaritmo a base 10 di EI o ER.

VR:=EXP(EI1*LN(EI2)); VR:=EXP(ER1*LN(ER2)); VR:=EXP(ER*LN(EI)); VR:=EXP(EI*LN(ER))


POTENZA: assegna a VR la potenza di EI2,ER2,EI,ER, con potenza rispettivamente EI1,ER1,ER,EI.

Operandi CHAR VB := EC1 = EC2


UGUAGLIANZA: assegna a VB il valore booleano della relazione di uguaglianza fra EC1,EC2.

VB := EC1 <> EC2


DISUGUAGLIANZA: assegna a VB il valore booleano della relazione di disuguaglianza fra EC1,EC2.

VB := EC1 > EC2


MAGGIORANZA: assegna a VB il valore booleano della relazione di maggioranza fra i numeri d'ordine che i dati corrispondenti a EC1,EC2 presentano nell'ambito dell'insieme standard Char.

VB := EC1 >= EC2

84

MAGGIORANZA O UGUAGLIANZA: assegna a VB il valore booleano della relazione di maggioranza o uguaglianza fra i numeri d'ordine che i dati corrispondenti a EC1,EC2 presentano nell'ambito dell'insieme standard Char.

VB := EC1 < EC2


MINORANZA: assegna a VB il valore booleano della relazione di minoranza fra i numeri d'ordine che i dati corrispondenti a EC1,EC2 presentano nell'ambito dell'insieme standard Char.

VB := EC1 <= EC2


MINORANZA O UGUAGLIANZA: assegna a VB il valore booleano della relazione di minoranza o uguaglianza fra i numeri d'ordine che i dati corrispondenti a EC1,EC2 presentano nell'ambito dell'insieme standard Char.

VC := CHR (EI)
CARATTERE: assegna a VC il carattere con numero d'ordine EI nell'ambito dell'insieme standard Char.

Operandi SCALARE VB := ES1 = ES2


UGUAGLIANZA: assegna a VB il valore booleano della relazione di uguaglianza fra i numeri d'ordine che i dati corrispondenti a ES1 e ES2 presentano nell'ambito dell'insieme tipo cui appartengono. ES1 e ES2 devono essere dello stesso tipo Scalare.

VB := ES1 <> ES2


DISUGUAGLIANZA: assegna a VB il valore booleano della relazione di disuguaglianza fra i numeri d'ordine che i dati corrispondenti a ES1 e ES2 pre-sentano nell'ambito dell'insieme tipo cui appartengono. ES1 e ES2 devono essere dello stesso tipo Scalare.

VB := ES1 > ES2


MAGGIORANZA: assegna a VB il valore booleano della relazione di maggioranza fra i numeri d'ordine che i dati corrispondenti a ES1 e ES2 presentano nell'ambito dell'insieme tipo cui appartengono. ES1 e ES2 devono essere dello stesso tipo Scalare.

VB := ES1 >= ES2


MAGGIORANZA O UGUAGLIANZA: assegna a VB il valore booleano della relazione di maggioranza o uguaglianza fra i numeri d'ordine che i dati corrispondenti a ES1 e ES2 presentano nell'ambito dell'insieme tipo cui appar-tengono. ES1 e ES2 devono essere dello stesso tipo Scalare.

VB := ES1 < ES2


MINORANZA: assegna a VB il valore booleano della relazione di minoranza fra i numeri d'ordine che i dati corrispondenti a ES1 e ES2 presentano nell'am-bito dell'insieme tipo cui appartengono. ES1 e ES2 devono essere dello stesso tipo Scalare.

VB := ES1 <= ES2


MINORANZA O UGUAGLIANZA: assegna a VB il valore booleano della relazione di minoranza o uguaglianza fra i numeri d'ordine che i dati corrispondenti a ES1 ed ES2 presentano nell'ambito dell'insieme tipo cui appartengono. ES1 ed ES2 devono essere dello stesso tipo Scalare.

VI := ORD (ES)
NUMERO D'ORDINE: assegna a VI il numero d'ordine che il dato corrispondente a ES presenta nell'ambito dell'insieme tipo cui appartiene. ES non pu essere di tipo Real.

VS := PRED (ES)

85

PREDECESSORE: assegna a VS il dato precedente il dato corrispondente a ES nell'ambito dell'insieme tipo cui appartiene. ES non puo' essere di tipo REAL.

VS := SUCC (ES)
SUCCESSORE: assegna ad VS il dato successivo al dato corrispondente a ES nell'ambito dell'insieme tipo cui appartiene. ES non puo' essere di tipo Real.

VB := ES IN ET
APPARTENENZA: assegna a VB il valore booleano della relazione di apparte-nenza del dato corrispondente ad ES al tipo Set corrispondente ad ET.

Operandi SET VB := ET1 = ET2


UGUAGLIANZA: assegna a VB il valore booleano della relazione di uguaglianza fra ET1,ET2 (uguali se composti dagli stessi dati nello stesso ordine). I dati che compongono ET1,ET2 devono essere dello stesso tipo.

VB := ET1 <> ET2


DISUGUAGLIANZA: assegna a VB il valore booleano della relazione di disuguaglianza fra ET1,ET2. I dati che compongono ET1,ET2 devono essere dello stesso tipo.

VB := ET1 <= ET2; VB := ET2 >= ET1


INCLUSIONE: assegna a VB il valore booleano dell'inclusione di ET1 in ET2 (appartenenza a ET2 di tutti gli elementi di ET1).

VT := ET1 + ET2
UNIONE: assegna a VT gli elementi appartenenti o a ET1, o a ET2, o ad entrambi.

VT := ET1 * ET2
INTERSEZIONE: assegna a VT gli elementi comuni a ET1 e a ET2.

VT := ET1 - ET2
DIFFERENZA: assegna a VT gli elementi di ET1 che non appartengono a ET2.

VB := ES IN ET
APPARTENENZA: assegna a VB il valore booleano della relazione di appartenenza al Set costituito da ET del dato rappresentato da ES.

Operandi ARRAY VB := EPA1 = EPA2


UGUAGLIANZA: assegna a VB il valore booleano della relazione di uguaglianza fra i numeri d'ordine di ciascun elemento di EPA1 con il corrispondente elemento di EPA2. Fra EPA1 ed EPA2 vi deve essere una corrispondenza biunivoca (stesso numero di elementi dello stesso tipo). L'esame della relazione viene effettuato fino al primo riscontro negativo.

VB := EPA1 <> EPA2


DISUGUAGLIANZA: assegna a VB il valore booleano della relazione di disuguaglianza fra i numeri d'ordine di ciascun elemento di EPA1 con il corrispondente elemento di EPA2. Fra EPA1 e EPA2 vi deve essere una corrispondenza biunivoca (stesso numero di elementi dello stesso tipo). L'esame della relazione viene effettuato fino al primo riscontro positivo.

VB := EPA1 > EPA2

86

MAGGIORANZA: assegna a VB il valore booleano della relazione di maggioranza fra i numeri d'ordine di ciascun elemento di EPA1 con il corrispondente elemento di EPA2. Fra EPA1 e EPA2 vi deve essere una corrispondenza biunivoca (stesso numero di elementi dello stesso tipo). L'esame della relazione viene effettuato fino al primo riscontro positivo o negativo (l'uguaglianza fa proseguire l'esame).

VB := EPA1 >= EPA2


MAGGIORANZA O UGUAGLIANZA: assegna a VB il valore booleano della relazione di maggioranza o uguaglianza fra i numeri d'ordine di ciascun elemento di EPA1 con il corrispondente elemento di EPA2. Fra EPA1 ed EPA2 vi deve essere una corrispondenza biunivoca (stesso numero di elementi dello stesso tipo). L'esame della relazione viene effettuato fino al primo riscontro positivo o negativo (l'uguaglianza fa proseguire l'esame).

VB := EPA1 < EPA2


MINORANZA: assegna a VB il valore booleano della relazione di minoranza fra i numeri d'ordine di ciascun elemento di EPA1 con il corrispondente elemento di EPA2. Fra EPA1 ed EPA2 vi deve essere una corrispondenza biunivoca (stesso numero di elementi dello stesso tipo). L'esame della relazione viene effettuato fino al primo riscontro positivo o negativo (l'uguaglianza fa proseguire l'esame).

VB := EPA1 <= EPA2


MINORANZA O UGUAGLIANZA: assegna a VB il valore booleano della relazione di minoranza o uguaglianza fra i numeri d'ordine di ciascun elemento di EPA1 con il corrispondente elemento di EPA2. Fra EPA1 ed EPA2 vi deve essere una corrispondenza biunivoca (stesso numero di elementi dello stesso tipo). L'esame della relazione viene effettuato fino al primo riscontro positivo o negativo (l'uguaglianza fa proseguire l'esame).

PACK(VA,EI,VPA)
IMPACCAMENTO di un ARRAY: dati VA:ARRAY [m..n] e VPA:PAC-KED ARRAY [u..v], in cui n-m>=v-u, tale istruzione equivale alla seguen-te: FOR J := u TO v DO VPA[J]:=VA[J-u+EI].

UNPACK(VPA,VA,EI)
DISIMPACCAMENTO di un ARRAY: dati VA:ARRAY [m..n] e VPA: PACKED ARRAY [u..v], in cui n-m>=vu, tale istruzione equivale alla se-guente: FOR J := u TO v DO VA[J-u+EI] := VPA[J].

Operandi RECORD WITH VR DO ISTRUZIONE


ABBREVIAZIONE: permette di eliminare, negli identificatori di campo contenuti nell'ISTRUZIONE, il riferimento al record VR. ESEMPIO:
WITH VR DO BEGIN R1:=3847; R2:=4.278; R3:='H' END

invece di:
VR.R1:=3847; VR.R2:=4.278; VR.R3:='H'.

Operandi PUNTATORE VB := EP1 = EP2


UGUAGLIANZA: assegna a VB il valore booleano dell'uguaglianza di EP1 con EP2.

VB := EP1 <> EP2


DISUGUAGLIANZA: assegna a VB il valore booleano della disuguaglianza di EP1 con EP2.

87

NEW(VP)
Riserva in memoria uno spazio relativo al tipo associato a VP ed assegna a VP l'indirizzo iniziale di tale spazio.

DISPOSE(VP) VP:=NIL
Le due istruzioni sono equivalenti: rendono disponibile per altre memorizza-zioni lo spazio creato con NEW(VP), non assegnando a VP alcun indirizzo.

Esiste la seguente priorit di computo fra le seguenti istruzioni computazionali.


- NOT * / DIV MOD AND + - OR = <> < <= > >= IN

Deroga alla priorit: ( ).

9. ISTRUZIONI DI TRATTAMENTO FILE Sono le seguenti. VB := EOLN(VF)


Assegna a VB il valore TRUE quando, leggendo il file VF, raggiunta la fine della linea corrente; altrimenti, VB=FALSE.

VB := EOF(VF)
Assegna a VB il valore TRUE VB=FALSE. quando, leggendo il file VF, raggiunta la fine del file; altrimenti,

PUT(VF)
Scrittura: scrive in coda al file VF il dato assegnato alla variabile buffer VF^ . E` eseguibile soltanto se prima dell'esecuzione EOF(VF)=TRUE. Dopo l'esecuzione rimane EOF(VF)=TRUE e il valore della variabile buffer VF^ diviene indefinito.

GET(VF)
Lettura: assegna alla variabile buffer VF^ il dato successivo all'ultimo dato scritto o letto. Se non esiste un ultimo dato, divengono EOF(VF)=TRUE e il valore della variabile buffer VF^ indefinito. E` eseguibile soltanto se prima dell'esecuzione EOF(VF)=FALSE.

RESET(VF)
Lettura: assegna alla variabile buffer VF^ il primo dato del file VF. Se VF non vuoto, diviene EOF(VF)=FALSE. Se VF vuoto, rimangono EOF(VF)=TRUE e il valore della variabile buffer VF^ indefinito.

REWRITE(VF)
Riscrittura: cancella i dati assegnati a VF, trasformandolo in file vuoto e permettendo cos la riscrittura di VF ex novo. Divengono EOF(VF)=TRUE e il valore della variabile buffer VF^ indefinito.

PAGE(VF)
Cambio pagina: scrive nel file VF, alla posizione attuale del puntatore del file, il carattere di cambio-pagina (ASCII 12). ESEMPIO:
PAGE(OUTPUT)

Cancella lo schermo video.