Caricare documenti e articoli online 
INFtub.com è un sito progettato per cercare i documenti in vari tipi di file e il caricamento di articoli online.


 
Non ricordi la password?  ››  Iscriviti gratis
 

Un linguaggio ad alto livello strutturato e modulare

tecnica



CAPITOLO 1
Un linguaggio ad alto livello strutturato e modulare

Il PASCAL è un linguaggio di programmazione d'alto livello, modulare e strutturato.

Deve essere utilizzato rispettando delle regole molto precise; per fare in modo che un programma sia facilmente comprensibile e semplice da modificare dopo la sua creazione, dovrà essere chiaro, leggibile e breve. Questi requisiti sono facilmente ottenibili programmando in PASCAL, grazie alle tipiche caratteristiche di questo particolare linguaggio. In PASCAL i programmi sono scritti in modo sequenziale e ordinato. L'uso di salti incondizionati (istruzioni che alterano la sequenza di d'esecuzione del programma) è sconsigliabile, poiché rende più complessa l'analisi e al a leggibilità del programma stesso.

Inoltre un programma in PASCAL può essere diviso in piccole parti o moduli che conferiscono gran fl 454b16e essibilità al programma, in previsione di future modifiche.



Altra caratteristica fondamentale del PASCAL è di essere un linguaggio strutturato, partendo dalle tre strutture di base: sequenziale, biforcata e ripetitiva, si può scrivere qualunque programma. Il programma in PASCAL deve essere compilato prima di poter procedere alla sua esecuzione. Il formato di scrittura di un programma è libero, al punto che le istruzioni possono essere scritte in qualunque parte del listato. L'unica restrizione a questa libertà è che ogni istruzione deve essere chiusa da un punto e virgola perché possa essere distinta dalla seguente.

Le istruzioni si scrivono in una notazione simile ad un inglese ristretto e all'algebra.


Identificatori


I dati e gli elementi di un programma in PASCAL possono ricevere un nome o identificatore, che servirà a riconoscerli durante tutto il corso del programma.

L'identificatore fornisce anche un'idea del tipo di dato trattato e della sua applicazione.

Questi identificatori debbono rispettare alcune regole, per esempio, devono sempre iniziare con una lettera, anche se i rimanenti caratteri possono essere sia lettere sia cifre decimali.

Esistono anche parole che per il compilatore hanno un particolare significato e quindi non possono essere utilizzate come identificatori. Sono parole riservate che prendono il nome di delimitatori e hanno un compito specifico; per esempio: PROGRAM, BEGIN, IF, END, ..


1.2 Aspetto di un programma Pascal

Un algoritmo (metodo di risoluzione di un determinato problema) scritto in PASCAL, è formato da due zone fondamentali:

La descrizione delle azioni da realizzare, che coincide con le istruzioni del programma;

La descrizione dei dati da utilizzare che consiste di dichiarazioni e definizioni di parametri.

A sua volta un programma in PASCAL è diviso in tre blocchi indipendenti:


Intestazione;

Dichiarazioni e definizioni;

Corpo delle istruzioni.


L'intestazione serve ad identificare il programma; è costituita dalla parola riservata PROGRAM seguita da un'identificatore che sia valido per il PASCAL.

Quest'ultimo coinciderà con il nome generico che si vuole assegnare al programma.

Proseguendo troviamo, chiusi tra parentesi, i nomi dei flussi o dei dispositivi logici attraverso i quali il programma comunicherà con l'esterno. Questi flussi sono tipici d'ogni specifico sistema: generalmente è chiamato INPUT il flusso d'ingresso (tastiera) e OUTPUT (stampante o schermo).

La zona di dichiarazione e definizione è opzionale e comprende le parti che seguono; nel caso che tutte le parti siano presenti deve essere seguito scrupolosamente l'ordine seguente:


dichiarazioni di etichette;

definizione di costanti;

definizione di tipi;

dichiarazione di variabili;

dichiarazione di procedure e funzioni.


Ognuna di queste cinque parti sarà definita dettagliatamente in uno dei prossimi capitoli.

Il corpo delle istruzioni include le istruzioni eseguibili del programma; istruzioni che saranno racchiuse tra le parole BEGIN e END. Dopo l'ultimo END deve apparire un punto che segnala la fine di tutto il programma.





TABELLA

DEI COMANDI

PASCAL


Istruzione


Commento


Osservazioni

PROGRAM <id> (<par>)

Assegnazione dei parametri in testa a un programma

Intestazione del

programma

BEGIN <ist> [, <ist>, .] END

Delimita i blocchi di istruzioni eseguibili

Corpo del

programma

CONST <id> = <valore>;

[<id> = <valore>; ] [.]

Definizione di costanti

Parte delle dichiarazioni e

delle definizioni

VAR <id> [, <id>, .]: <tipo>;


Dichiarazione delle variabili

e del tipo

Parte delle dichiarazioni e

delle definizioni



I dati del Pascal

I dati possono  apparire sotto forma di valori costanti oppure essere rappresentati per mezzo di variabili, queste ultime possono essere modificate, nei loro contenuti, durante l'esecuzione del programma. I dati devono essere dichiarati all'interno del programma nella parte delle dichiarazioni e definizioni, affinché se ne possa poi fare uso.

Per dichiarare una costante si usa la notazione:


CONST < identificatore > = < costante >;


Analogamente le variabili si dichiarano nel modo seguente:


VAR <  identificatore1 >[, < identifictore2 >, .]: < tipo >;


L'argomento tipo si riferisce alla categoria della variabile in questione e serve ad indicare l'insieme di valori che la variabile può assumere. Pertanto alla dichiarazione di una variabile si associa immediatamente la definizione del tipo ed è utile notare che ogni variabile PASCAL può essere di un unico tipo.


ASPETTO GENERALE DI UN PROGRAMMA


PROGRAMMA RADICE2 (INPUT, OUTPUT); (*INTESTAZIONE*)


CONST DUE=2; (*DICHIARAZIONI E DEFINIZIONI*)

VAR A, B, C, RAD1, RAD2, IMMA, PREAL, DISCRI: REAL;


BEGIN (*CORPO PRINCIPALE*)

READ (A, B, C)

IF A=0 THEN WRITE ('ERROR')

ELSE

BEGIN

DISCRI: = SQRT (B) -4*A*C;

IF DISCRI< 0 THEN

BEGIN

DISCRI: = -DISCRI;

IMMA: = SQRT (DISCRI) / (DUE*A);

PREAL: = -B/ (DUE*A);

WRITELN ('RADICE 1 =' ,PREAL,' +J',IMMA);

WRITELN ('RADICE 2 =',PREAL,'-J',IMMA)

END

ELSE

BEGIN

RAD1: = (-B+SQRT (DISCRI))/ (DUE*A);

RAD2: =(-B-SQRT(DISCRI))/(DUE*A);

WRITELN('RADICE 1 =',RAD1);

WRITELN('RADICE 2 =',RAD2)

END

END

END




CAPITOLO 2

Espressioni generali e dati di tipo scalare

In PASCAL esistono quattro tipi di dati normalizzati: interi, reali, caratteri e booleani.

La notazione "scalare" si riferisce al fatto che un dato ha un asola dimensione o, se si preferisce, che definisce una singola caratteristica dell'elemento cui si riferisce.

Ogni tipo di dati prevede un modo particolare di rappresentare le costanti, così come le operazioni ad esso relative e gli operatori definiti che permettono d'ottenere valori di un determinato tipo con operandi dello stesso tipo.


Dati di tipo intero

Sono i dati che rappresentano numeri interi, in altre parole una sequenza di cifre decimali precedute o no da un segno di somma o di differenza. In una costante intera non sono ammessi spazi vuoti, virgole o punti. Il delimitatore o parola chiave che permette di dichiarare dati di tipo intero è INTEGER. Esempio:


VAR GIORNI,    MESI:INTERGER;


Quando si voglia calcolare un'espressione nella quale gli operandi sono interi, i seguenti operatori produrranno un risultato di tipo intero:

Somma (+):  a+b; somma a e b.

Differenza (-):  a-b; toglie da a il valore b.

Moltiplicazione (*):  a*b; moltiplica a per b

Divisione (DIV):  a DIV b; divide a per b e tronca i decimali.

Resto intero (MOD):  a MOD b; calcola il resto intero della divisione di a per b.


Dati di tipo reale

Il tipo reale definisce un elemento come appartenente all'insieme dei numeri reali.

Questi dati sono rappresentati con una parte intera ed una frazionaria, separate da un punto decimale e preceduti o no dal segno corrispondente.

La dichiarazione delle variabili di tipo reale avviene con la parola REAL.

Esempio:


VAR TEMPERATURA: REAL


Se in un'espressione almeno uno degli operandi è di tipo reale (gli altri possono essere di tipo intero), i seguenti operatori restituiscono un valore di tipo reale come risultato:

Somma (+):  a+b; somma a con b

Differenza (-):  a-b; toglie da a il valore b

Moltiplicazione (*):  a*b; moltiplica a per b

Divisione (/):  a/b; divide a per b.

Nel caso della divisione il risultato ottenuto è di tipo reale anche se gli operandi fossero ambedue di tipo intero.


Dati di tipo carattere

Questo tipo di dati è costituito da un carattere chiuso tra apostrofi (").

Ogni variabile di tipo carattere assume il valore di un solo carattere e la sua dichiarazione all'interno del programma avviene per mezzo della parola CHAR.

Esempio:


VAR LETTERA: CHAR;


Per questo tipo di dati non esistono operatori specifici che consentono di effettuare su di essi delle operazioni; si possono però utilizzare le variabili e le costanti di tipo carattere in lettura, scrittura e assegnazione. Per contropartita, il PASCAL comprende due funzioni standardizzate che possono essere applicate esclusivamente ai dati di tipo carattere. Sono:

ORD ( < car > ) che fornisce il numero ordinale corrispondente al carattere < car >;

CHR ( < num > ) che dà come risultato il carattere il cui numero ordinale è < num >.

Queste due funzioni sono dette di trasferimento, poiché permettono l'identificazione tra i caratteri ed i corrispondenti numeri ordinali.


Dati di tipo booleani

Un dato si definisce BOOLEANO o appartenente all'algebra di Boole, quando può assumere soltanto due valori: aperto o chiuso, vero o falso, uno o zero o così via.

In PASCAL esistono due parole per definire ognuno di questi valori: TRUE e FALSE (vero e falso). Per dichiarare un dato di tipo booleano si utilizza la parola BOOLEAN.

Per esempio:


VAR STORIA: BOOLEAN;


Agli operandi di tipo booleano possono essere applicati i seguenti operatori, che forniscono un dato di tipo booleano:

NOT fornisce un valore opposto a quello del dato booleano a cui è applicato. Effettua l'operazione logica di "negazione".

AND effettua il prodotto logico; il risultato sarà FALSE se almeno uno degli operandi ha valore FALSE.

OR rappresenta l'operazione di somma logica; il risultato sarà TRUE se almeno uno degli operandi ha valore TRUE.



Esistono anche una serie di operatori che sono detti relazionali, questi ottengono un valore booleano anche se gli operatori non sono di tipo booleano:


indica l'uguaglianza tra le due espressioni,

< >   indica la disuguaglianza,

<  relazione "minore di",

>  relazione "maggiore di",

< =   relazione "minore o uguale di",

> =   relazione "maggiore o uguale di".


L'istruzione di assegnazione

Ogni variabile può essere immaginata come un foglio bianco di un blocco note sul quale segniamo con la matita un valore costante; questo coinciderà con il valore della variabile che stiamo considerando. Successivamente è possibile cancellare il contenuto di questo foglio del blocco e scrivervi un altro valore, con il quale risulterà aggiornato il contenuto della variabile in questione.

Queste due azioni di assegnare un valore ad una variabile ed aggiornare questo valore quando sia necessario, nel PASCAL sono affidate alla cosiddetta istruzione d'assegnazione, la cui forma generica è la seguente:


< variabile >: = < espressione >


L'operatore d'assegnazione è il simbolo ": =", costituito da due caratteri; questo assegna il valore situato alla sua destra, alla variabile che lo precede.

La zona < espressione > può essere una costante, una variabile precedentemente dichiarata e con un valore già assegnato, oppure anche un'espressione matematica o logica; in quest'ultimo caso si tratterà di un insieme di variabili  e costanti unite da operatori.

La variabile sarà il nome di un identificatore PASCAL valido, naturalmente dichiarato come variabile nella parte delle definizioni e dichiarazioni del programma.

L'istruzione di assegnazione comprende implicitamente due funzioni la prima è la valutazione dell'espressione posta a destra dell'operatore ": =" e la seconda è l'assegnazione del valore alla variabile che precede l'operatore di assegnazione.

Un altro compito importante della istruzione di assegnazione è di verificare il tipo di variabile ( ogni variabile può assumere un solo tipo).

Vi sono delle eccezioni a questa regola, poiché alcuni tipi di dati ne inglobano altri. Per esempio è possibile assegnare un valore intero ad una variabile dichiarata come reale.






TAVOLA DI COMANDI PASCAL


Comando

Scopo

Osservazioni

INTEGER

Dichiarazione di tipo intero

Zona di dichiar. e definiz.

REAL

Dichiarazione di tipo reale

Zona di dichiar. e definiz.

CHAR

Dichiarazione di tipo carattere

Zona di dichiar. e definiz.

BOOLEAN

Dichiarazione di tipo booleano

Zona di dichiar. e definiz.


Espressioni aritmetiche

L'obiettivo fondamentale di un'espressione aritmetica è il calcolo di un valore che sarà utilizzato come dato, in altre parole sarà elaborato dal programma al momento opportuno; tale calcolo deve essere effettuato rispettando alcune regole.

Le espressioni aritmetiche possono essere utilizzate in varie parti del programma.

Un'espressione aritmetica consiste in un insieme di operandi che possono essere costanti, variabili e/o funzioni standard (seno, logaritmi, radice quadrata e così via), unite da una serie di operatori aritmetici o logici, come: "+", "*", "OR", ecc. Per esempio, quelle che seguono sono espressioni aritmetiche valide:


PREZZO-((PREZZO*5)/100)

ROUND (PI*R*R)+AREA


Nel secondo caso, ROUND è una funzione standard che restituisce la parte intera arrotondata di un numero reale.


Gerarchia degli operatori

Il valore ottenuto dalla valutazione di un'espressione matematica, può variare secondo l'ordine con il quale sono eseguite le operazioni in essa contenute.

Per ovviare a questo problema, i linguaggi dei computer stabiliscono un ordine gerarchico degli operatori, cosicché, a meno di indicazioni contrarie, le operazioni si effettuano rispettando sempre un determinato ordine. Nel PASCAL l'ordine gerarchico degli operatori è il seguente:


Funzioni standard

NOT

*, /, DIV, MOD, AND

+, -, OR

=, < >, <, >, < =, > =


Quando in un'espressione appaiono vari operatori con uno stesso grado di priorità, si esegue il primo che si incontra da sinistra verso destra.

Questa gerarchia può essere modificata mediante l'uso delle parentesi; le espressioni chiuse tra parentesi saranno valutate prima di tutte le altre e nel caso in cui varie parentesi siano "annidate" una nell'altra, si valuta prima la più interna.


CAPITOLO 3
Ingresso e usciti dei dati

L'intestazione di un programma PASCAL serve ad assegnare un nome al programma per mezzo di un identificatore. Questo nome, che deve seguire la parola chiave PROGRAM, non ha alcun particolare significato all'interno del programma stesso; però, il nome può essere utilizzato al di fuori del programma, relativamente alle operazioni di memorizzazione sulle memorie di massa del sistema. In ogni caso l'intestazione ha un'altra funzione da svolgere: dichiarare la lista dei parametri del programma. La lista dei parametri si riferisce a variabili che normalmente nomi di flussi, i quali devono essere in corrispondenza con elementi già esistenti del sistema, indipendentemente dal programma.

Ogni computer è in grado di riconoscere un determinato insieme di caratteri (lettere, numeri e segni speciali), caratteri che sono utilizzati anche per comunicare con i dispositivi di ingresso e uscita. Su questo insieme di caratteri il PASCAL definisce due variabili di tipo di flusso:

INPUT e OUTPUT.

Questo tipo di variabile è dichiarato con la parola chiave FILE.

Nel PASCAL esiste un tipo di variabile dichiarato con la parola chiave TEXT e che non è altro che un flusso di caratteri (FILE OR CHAR). I file standard INPUT e OUTPUT sono di questo tipo.

Perciò nello scrivere un programma è sufficiente menzionare queste variabili nella lista dei parametri dell'intestazione.

INPUT e OUTPUT, come parametri formali del programma rappresentano i dispositivi di ingresso/uscita di un sistema informatico: la tastiera, la stampante o l'unita a disco.

Grazie a queste è facilitata la comunicazione tra il programma PASCAL e il sistema sotto il cui controllo opera il programma stesso.

I flussi INPUT e OUTPUT, essendo utilizzati spesso dalla maggioranza dei programmi, sono considerati dei parametri impliciti in alcune funzioni o procedure standardizzate, se non sono date specifiche contrarie. Quindi verranno inizializzati automaticamente prima dell'esecuzione del programma, essendo dichiarati nell'intestazione stessa.

Se in un programma si fa riferimento ad altri flussi esterni, i nomi di questi flussi debbono apparire nella lista dei parametri; inoltre devono essere dichiarati nella parte delle definizioni e dichiarazioni come variabili di tipo flusso.



Per esempio:


PROGRAM ESEMPIO (INPUT, OUTPUT, X, ARCHIVIO);

VAR X, ARCHIVIO: FILE OF <tipo>;


dove <tipo> indica il tipo di variabili che costituiscono il flusso in questione.


Lettura di dati

Un programma privo di un interscambio d'informazioni con l'esterno non è di grande utilità, dovendo svolgere sempre al stessa funzione. Di contro il fatto di poter ricevere informazioni dall'esterno incrementa notevolmente la flessibilità di un programma:  si ottengono risultati in uscita ogni volta diversi, in funzione dei dati forniti in ingresso. Per risolvere questa situazione è necessario utilizzare una o più istruzioni d'ingresso dei dati, che in PASCAL possono essere codificate per mezzo del comando READ. Questa istruzione legge un dato dal flusso d'ingresso specificato nell'argomento dell'istruzione stessa e lo assegna alla variabile di programma inclusa anch'essa nell'argomento della READ.

Se non è specificata la fonte dei dati, è assunto per difetto il flusso INPUT. Quindi quando si vuole utilizzare questo flusso, non è necessario dichiararlo nelle istruzioni READ.

Il formato generico dell'istruzione è:


READ (<flusso>, <var>, <var>, ..);


Il campo <flusso> è opzionale e coincide con il nome della fonte di dati in ingresso, da cui saranno letti i valori. I campi <var> corrispondono alle variabili che riceveranno l'assegnazione dei dati letti. E possibile, perciò, leggere un solo dato dal flusso standard INPUT, come leggerne diversi ed assegnarli ad un gruppo di variabili, che compaiono nell'istruzione READ separate da virgole; inoltre è possibile estrarre uno o più dati, per assegnarli alle variabili, da un qualunque altro flusso esterno che sia stato precedentemente specificato nella lista dei parametri nell'intestazione, come fonte di dati in ingresso.



Utilizzando l'istruzione READ, i dati da leggere sono disposti in linee, in modo che quando tutti i dati di una linea sono stati letti si passa automaticamente alla linea successiva.

La lettura avviene sempre da sinistra a destra. Se è necessario forzare il passaggio ad una nuova linea d'ingresso, si può utilizzare l'istruzione:


READLN (<flusso>, <var>, .);


Il formato è simile a quello dell'istruzione READ convenzionale, con la differenza che in questo caso, dopo aver letto la variabile specificata, si salta alla linea successiva d'ingresso, anche se i dati della linea corrente non sono stati completamente letti.

I dati che seguono l'ultimo letto saranno ignorati e la prossima istruzione leggerà il primo dato della linea seguente.


Uscita di dati

Lo scopo di un'istruzione d'uscita è di passare un'espressione o il valore di una variabile sullo schermo o su un altro dispositivo d'uscita, per esempio la stampante.

In PASCAL, l'istruzione indicata per questa operazione è WRITE, che ha il formato seguente:


WRITE ([<flusso>, ]<esp> [,<esp>, .])


Il campo <flusso> definisce il flusso d'uscita dei dati ed è un campo opzionale; nel caso sia incluso, è necessario che il flusso sia stato dichiarato nella lista dei parametri dell'intestazione, come avveniva per l'istruzione READ.

La parte <esp> contiene le espressioni matematiche o semplicemente le variabili che si desiderano rappresentare. Se non è specificato il flusso dei dati in uscita, si assume come tale il flusso OUTPUT standard.

Come nel caso di READ, in un'istruzione WRITE si possono includere più elementi; perché siano presentati, questi devono apparire separati da virgole. Se tali elementi o parametri sono espressioni matematiche sono prima valutati e il valore ottenuto è presentato attraverso il dispositivo d'uscita corrispondente. Ogni espressione di un'istruzione WRITE può, opzionalmente, adottare la forma:


<esp>: <C1>: <C2>


Il campo <C1> è un numero naturale che indica il numero di caratteri con i quali deve essere scritto il risultato dell'espressione <esp>. Nel caso <esp> richieda meno caratteri, la stampa sarà completata da spazi vuoti alla destra del risultato.

<C2> è un altro numero naturale che indica il numero di cifre di cui deve essere composta la parte decimale di <esp>, nel caso si tratti di un numero reale.

L'istruzione WRITE presenta i dati su un'unica linea, se si vuole una presentazione su più linee è necessario utilizzare un'istruzione WRITELN.

Questa utilizza lo stesso formato di WRITE, ma dopo aver scritto le espressioni indicate, provoca un salto alla successiva linea d'uscita.






TABELLA

DEI

COMANDI


Comando


Scopo


Osservazioni


INPUT

Dichiara il file standard d'ingresso


Intestazione del programma

OUTPUT

Dichiara il file standard d'uscita

Intestazione del programma

TEXT

Dichiara un file di tipo caratteri

Dichiarazioni e definizioni

READ (<var>);

Lettura di dati da un file

Blocco istruzioni

READLN (<var>);

Lettura di dati e cambio linea

Blocco istruzioni

WRITE ()<esp>);

Scrittura d'espressioni

Blocco istruzioni

WRITELN (<esp>);

Scrittura d'espressioni e cambio linea

Blocco istruzioni

CAPITOLO 4
Strutture e istruzioni di controllo

La programmazione strutturata fornisce una serie di tecniche che permettono una facile messa a punto dei programmi. Come avviene in tutti i linguaggi, un programma in PASCAL si può codificare mediante una serie d'istruzioni che sono eseguite secondo un preciso ordine, una dopo l'altra, seguendo le indicazioni di quello che è detto flusso di programma.










Struttura sequenziale

Ricordando i concetti della programmazione strutturata, la prima struttura che incontriamo è quella sequenziale. In PASCAL la struttura sequenziale è formata da istruzioni d'azione che non deviano il flusso del programma; è il caso delle istruzioni d'assegnazione, d'ingresso e uscita de dati, e così via.

Il blocco BEGIN/END costituisce un istruzione formata in modo che tutte le istruzioni incluse siano considerate come una sola. Alcune strutture di controllo richiedono d'essere associate ad un'unica istruzione e, indubbiamente, la logica del programma esige la presenza di diverse di queste; in tal caso se si includono tute le istruzioni di controllo necessarie in un unico blocco BEGIN/END, la struttura di controllo "crederà" che soltanto un'istruzione vi sia associata.

L'uso di istruzioni composte deve limitarsi esclusivamente ai casi in cui sia pienamente necessario. È necessario evidenziare ancora l'importanza del punto e virgola ";" posto alla fine di ogni fine istruzione, perché possa svolgere la sua funzione di separatore.

Ma può essere omesso se subito dopo è inserita la parola END.

Il punto finale ".", posto dopo l'ultimo END, è ciò che segnala la fine del programma; se in suo luogo appare ";", il computer si aspetta una nuova istruzione poiché il punto e virgola indica solamente il punto di separazione tra due istruzioni.


Strutture ripetitive

In molte occasioni è necessario che alcune istruzioni siano eseguite ripetutamente un determinato numero di volte, costituendo quello che è detto un "ciclo".

Questo tipo d'istruzioni, dette iterative o ripetitive, sono eseguite sotto il controllo di una condizione imposta la cui verifica determina oppure no la ripetizione del ciclo.

Il PASCAL utilizza tre istruzioni iterative: WHILE/DO, REPEAT/UNTIL e FOR/TO/DO.

La prima delle tre ha il seguente formato:


WHILE <espressione> DO <istruzione>;


La <espressione>, di tipo booleano, è ciò che determina il numero di volte che l'<istruzione> è ripetuta; infatti tale istruzione si ripete finché l'<espressione> è verificata (valore logico TRUE). La variabile di controllo dell'<espressione> deve cambiare in modo appropriato all'interno del ciclo, altrimenti si può cadere in un ciclo infinito, senza termine, e questo è un errore di programmazione difficilmente riconoscibile.

Una volta eseguita questa istruzione si passa a verificare la condizione; se è vera si passa ad eseguire tale istruzione. Si prosegue in questo modo fino a quando l'istruzione dà il valore FALSE, caso in cui non è eseguita l'istruzione associata al DO, ma quella successiva: in tal caso WRITE, che scrive il risultato.

Un'altra situazione si presenta con la struttura REPEAT/UNTIL, nella quale in ogni caso l'istruzione è eseguita almeno una volta, per poi passare a valutare la condizione.

Il formato dell'istruzione è il seguente:


REPEAT <istruzione> UNTIL <espressione>;


La parte <istruzione> è ripetuta (REPEAT) un numero indeterminato di volte, finché (UNTIL) l'<espressione> è vera (TRUE). A questo punto si prosegue con l'istruzione successiva, esterna al ciclo.

In questo caso la condizione è diversa rispetto a quella utilizzata nella struttura WHILE/DO e ciò è dovuto alla differenza tra le due strutture per quanto riguarda l'esecuzione di almeno un ciclo prima della valutazione. Un'altra differenza tra le due strutture è che in questo caso non è necessario inserire in un blocco BEGIN/END tutte le istruzioni comprese nel ciclo, poiché è lo stesso REPEAT/UNTIL che provvede a delimitarle.

Rimane da vedere una terza struttura ciclica, formata dall'istruzione FOR/TO/DO.

La principale differenza rispetto alle precedenti è data dal funzionamento della condizione.

Nelle strutture WHILE/DO e REPEAT/UNTIL, il ciclo o insieme d'istruzioni è eseguito ripetutamente fino a che la condizione imposta è verificata, istante nel quale il ciclo è abbandonato. Nel caso FOR/TO/DO il ciclo è ripetuto tante volte quanti sono i valori intermedi compresi tra il valore iniziale e finale della variabile di controllo del ciclo.

Il formato è:


FOR <var. di controllo>: = <var. o valore iniziale> TO <var. o valore finale> Do <istruzione>;


In questa istruzione la variabile di controllo e il valore iniziale e finale devono essere dello stesso tipo e, precisamente di tipo ordinale: INTEGER, CHAR, o qualunque altro tipo ordinale dichiarato dall'utente, come i numerali o i sottocampi; in ogni caso la variabile di controllo non può essere di tipo reale. I valori iniziale e finale possono essere anche espressioni dello stesso tipo della variabile di controllo; espressioni che saranno valutate prima d'entrare nel ciclo.

Il funzionamento della struttura FOR/TO/DO è il seguente:

è assegnato alla variabile di controllo il valore iniziale e si controlla se il valore finale è già stato raggiunto, caso in cui il ciclo non è eseguito neppure una volta. Se il valore finale non è stato raggiunto si esegue il ciclo e, subito dopo, si incrementa il valore della variabile di controllo prima di verificarla un'altra volta.

Questo processo si ripete fino a che la variabile di controllo abbia raggiunto il valore finale, caso che permette di passare alla prossima istruzione del programma.

La variabile di controllo associata a questa istruzione può evolversi con valori crescenti oppure decrescenti. Per ottenere che "conti alla rovescia" basta sostituire la parola TO con DOWNTO.


TABELLA

DEI

COMANDI


Istruzione


Commento


Osservazioni

WHILE <esp> DO <istr>

Esegue un ciclo finché l'espressione è vera

Corpo del programma

REPEAT <istr>; <istr>

UNTIL <esp>

Esegue un ciclo finché si verifica l'espressione

Corpo del programma

FOR <cont>: = <ini> TO <fine>

DO <istr>

Esecuzione di un ciclo

Secondo i valori ascendenti

di una variabile


Corpo del programma

FOR <cont>: = <ini> DOWNTO

<fine> DO <istr>

Esecuzione di un ciclo

Secondo i valori

discendenti di una variabile

Corpo del programma

BEGIN <istr>; <istr>; .. END;

Riunione di diverse

Istruzioni in un'istruzione

composta

Corpo del programma




CAPITOLO 5

Strutture selettive

L'ultimo tipo delle strutture fondamentali della programmazione è quello delle strutture selettive o condizionali. Il loro compito è quello di spezzare il flusso del programma in un determinato punto, in base al verificarsi o no di una determinata condizione.

Il valore analogico della condizione si verifica durante l'esecuzione del programma; se è vero (valore logico TRUE) è eseguita una specifica istruzione, mentre se il valore logico ottenuto è falso (FALSE), sarà eseguita un'istruzione differente.






L'istruzione IF/THEN/ELSE

La struttura condizionale è fedelmente riflessa nell'istruzione IF/THEN/ELSE.

Il formato generale è:


IF <esp> THEN <istr> [ELSE <istr>];


<esp> equivale ad un'espressione di tipo booleano, il cui risultato può essere i valori TRUE oppure FALSE. A sua volta <istr> corrisponde ad istruzioni semplici o anche composte, caso in cui devono essere raggruppate in un blocco BEGIN/END.

La parte ELSE può essere omessa e in tal caso si passa ad eseguire direttamente l'istruzione successiva a quella associata alla parte THEN, ogni volta che la condizione non risulta vera.

Incontrando un'istruzione di questo tipo il computer opera così:

se la condizione è vera passa ad eseguire l'istruzione corrispondente alla parte THEN, ignorando quella associata alla parte ELSE, viceversa se la condizione è FALSE, avviene l'azione inversa.

È utile precisare un particolare riguardo a questa istruzione:

prima delle parole ELSE non deve essere inserito il punto e virgola (;), anche nel caso che ogni zona dell'istruzione IF sia scritta in linee separate.

Le istruzioni IF possono essere "annidate" o inglobate una nell'altra.

Naturalmente sfruttando questa possibilità è necessario fare molta attenzione ad associare ogni zona IF con le rispettive zone THEN e ELSE.

Per eliminare questo problema si può procedere in due modi.

Una possibilità è quella di sfruttare l'indentatura, ammessa dal formato libero; si tratta d'allineare su una stessa colonna le zone THEN e ELSE corrispondenti ad un'unica istruzione IF. La seconda possibilità consiste nell'inglobare in un blocco BEGIN/END.



Campionario di scelta

L'istruzione IF permette soltanto di scegliere tra una coppia d'opzioni: eseguire la parte THEN o eseguire la parte ELSE. Ma in molti casi ciò che necessita effettuare è una scelta tra un numero maggiore d'opzioni (più di due).

Perché ciò sia possibile è necessario costruire strutture artificiali.

Si tratta di una possibilità d'indubbia efficacia, ma esiste un'istruzione di controllo; di tipo selettivo o di salto condizionato. Si tratta dell'istruzione CASE/OF, il cui formato è:


CASE <esp> OF <etic> : <istr>;

<etic>: <istr>;


END;


Nell'istruzione è inclusa un'espressione,<esp>, di tipo ordinale ordinale (INTEGER, CHAR, o altro) che selezionerà una sola istruzione, di tipo semplice o composto, tra tutte quelle elencate al seguito della parola OF e prima della parola END che conclude l'istruzione CASE. Ognuna delle istruzioni che formano il campionario delle opzioni selezionabili, dev'essere preceduta da una costante dello stesso tipo di quella utilizzata come chiave di selezione. Tali costanti sono dette "etichette CASE".

La struttura CASE seleziona quell'istruzione la cui etichetta coincide con il valore attuale dell'espressione di selezione, ignorando le restanti.

Come nei casi precedenti, un'etichetta può precedere un insieme d'istruzioni inglobate in un blocco BEGIN/END. Se non esiste un'etichetta coincidente con il valore ottenuto dall'espressione, l'effetto dell'espressione non è prevedibile e normalmente produce un messaggio d'errore. Per evitare questi errori conviene limitare in qualche modo i valori assunti dall'espressione di selezione. Si può agire in due modi, il primo dei quali consiste nell'introdurre l'istruzione CASE in una delle parti di un'istruzione IF.

Così facendo, se <esp> assume un valore che non è compreso nel campionario, è visualizzato un messaggio d'errore.

La seconda possibilità consiste nel dichiarare la variabile selettrice di tipo sottocampo; situazione in cui si potrà assumere soltanto determinati valori prestabiliti.


Salto incondizionato

Per concludere con le istruzioni di controllo del PASCAL, dobbiamo soltanto vedere il salto incondizionato GOTO. Per mezzo di questa istruzione si può dirigere il flusso a qualunque altro punto del programma stesso, prima o dopo la posizione del GOTO.

Il suo formato è molto semplice, essendo costituito soltanto dalla parola chiave Goto seguita da un'etichetta. Quest'etichetta, che dev'essere un numero intero senza segno e di non più di quattro cifre, corrisponde allo stesso valore dell'etichetta posta di fronte all'istruzione verso la quale si vuole indirizzare l'esecuzione del programma.

Ogni volta che un'etichetta dev'essere utilizzata da un GOTO, è necessario che sia prima dichiarata nella parte di dichiarazioni e definizioni per mezzo della parola chiave LABEL; tale dichiarazione deve precedere qualunque dichiarazione CONST o VAR.






PROGRAM esempiogoto (OUTPUT)

LABEL 100,200;

VAR  n:INTEGER;

BEGIN

n:=1;

100: IF n>10 THEN GOTO 200;

WRITELN (n);

n:=n+1;

GOTO 100;

200:END.


Nel programma esempio si produrranno salti alle istruzioni "etichettate" con i numeri 100 e 200 in momenti diversi dell'esecuzione.

L'uso d'istruzioni GOTO rompe la strutturazione del programma e  rende quindi più difficile la sua leggibilità. Per questo l'uso di tale istruzione è spesso sconsigliato, anche se in alcuni casi è inevitabile ricorrere ad essa per evitare eccessive complicazioni del programma.



TABELLA

DEI COMANDI

PASCAL


Comando


Commento


Osservazioni

IF<esp> THEN<istr>

[ELSE<istr>];

Esecuzione condizionale di

due opzioni

Corpo del programma

CASE<sel> OF<et>:<istr>;

.. END;

Esecuzione condizionale

di due o più opzioni

Corpo del programma

GOTO <etichetta>

Salto incondizionato

Corpo del programma

LABEL < etichetta>

Dichiarazione di etichetta

Zona di definizione e

dichiarazione













CAPITOLO 6

Le procedure del Pascal

Un blocco d'istruzioni, cioè istruzioni che svolgono un compito ben preciso che si ripete in casi diversi, solitamente riceve il nome di sottoprogramma.

In PASCAL, qualsiasi sottoprogramma può essere scritto una sola volta ed essere poi attivato mediante una semplice chiamata, quando sia necessaria la sua esecuzione.

In PASCAL un sottoprogramma è chiamato PROCEDURE (procedura). L'insieme d'istruzioni che lo costituiscono si crea per mezzo della "dichiarazione della procedura".

In essa è associato alla procedura un identificatore, per mezzo del quale il sottoprogramma sarà attivato nell'istante appropriato.

La dichiarazione di una procedura adotta la stessa struttura di un programma PASCAL;

ragion per cui si può considerare un programma come un'autentica "superprocedura" PASCAL. Di conseguenza la procedura consterà di una serie di parametri di ingresso/uscita

opzionali, di una zona di dichiarazione delle variabili, pure opzionale, e infine di un indispensabile insieme di istruzioni, inglobato in un blocco BEGIN/END.

La dichiarazione di una procedura dev'essere posteriore alla dichiarazione delle variabili, per mezzo di VAR, nel programma principale.


Procedure senza parametri

I parametri d'ingresso/uscita di una procedura sono opzionali.

Le procedure senza parametri hanno come finalità la realizzazione d'una determinata azione in cui non si produce nessun risultato utilizzabile da un'altra parte del programma;

allo stesso modo anche la procedura senza parametri non avrà bisogno di alcun dato elaborato dal resto del programma. Es.:


PROCEDURE sottolineare

VAR  n:INTEGER;

BEGIN

FOR n:= 1 TO finale DO

WRITE ("-");

WRITELN

END;


La struttura della dichiarazione è totalmente simile a quella di un programma.

Varia solo l'intestazione: invece di usare la parola chiave PROGRAM, si usa ora la parola PROCEDURE.

La parola che identifica questa procedura è "sottolineare", che dev'essere un identificatore valido in PASCAL. Il suo compito è quello di attivare la procedura nel punto adeguato del programma e dare un'idea dell'obiettivo della procedura stessa.

Il procedimento dell'esempio ha come compito di visualizzare nel dispositivo di uscita (schermo) una linea di trattini, che sottolinea la linea che è stata stampata prima.

La zona delle dichiarazioni di una procedura è in tutto analoga a quella di un programma.

Il suo scopo è di dichiarare le variabili che saranno utilizzate unicamente  nella procedura.

È necessario tener presente che uno stesso identificatore, dichiarato come variabile globale a livello di programma e allo stesso tempo come variabile locale in un procedimento, non

rappresenterà la stessa variabile, ricevendo valori diversi in ogni zona del programma.

Il corpo di istruzioni chiuse tra le parole BEGIN e END, include l'insieme di istruzioni eseguibili che hanno il compito di svolgere la funzione affidata alla procedura.

Per attivare una procedura senza parametri basta semplicemente scrivere la parola, o identificatore, che era stata collocata dietro la parola PROCEDURE.


Procedimenti con parametri

Quando si desidera che un determinato sottoprogramma possa maneggiare dati creati in un'altra parte del programma o persino i suoi stessi dati per utilizzarli nel resto del programma, si dovrà ricorrere alle procedure con parametri.

Il termine "parametri" si riferisce a quei dati che la procedura manipola e che hanno un'origine o una destinazione esterni alla procedura.

Questi parametri sono chiusi tra parentesi, dopo l'identificatore della procedura, in modo simile a ciò che si fa nell'intestazione del programma.

La forma più generale di una procedura con parametri è la seguente:


PROCEDURE <identificatore> (<param.> [;<param.>;.]);

< zona delle dichiarazioni>;

<blocco di istruzioni>.


I parametri riflessi nell'intestazione della procedura si chiamano parametri formali, poiché non hanno nessun valore concreto assegnato.

I parametri formali in ingresso della procedura adotteranno la forma seguente:


<identificatore>:<tipo>


In questo caso, essendovi solo un parametro in ingresso, il suo valore non è disponibile fuori dalla procedura.

Invece i parametri formali in ingresso e uscita adottano un nuovo aspetto:


VAR <identificatore>:<tipo>


In questo parametro si ottiene un risultato della procedura che può essere utilizzato in qualunque altra parte del programma.

La chiamata alle procedure con parametri si realizza nella forma abituale per mezzo dell'identificatore, sebbene sia necessario aggiungere una lista di parametri chiusa tra parentesi. Questi parametri, inclusi nell'istruzione di chiamata, sono detti parametri reali, essendo i soggetti che vanno ad assegnare i valori ai parametri formali della procedura.

Se un parametro formale è solo d'ingresso, il corrispondente parametro reale può essere una costante, un'espressione, una variabile o persino l'identificatore di chiamata a un'altra procedura. Tuttavia se il parametro formale è anche d'uscita, il suo parametro reale dev'essere obbligatoriamente una variabile.



TABELLA

DEI COMANDI

PASCAL


Comando


Scopo


Osservazioni

PROCEDURE <id>;

<dichiarazioni>;

<blocco d'istruzioni>;

Dichiarazione di un sottoprogramma

o procedura senza parametri.

Zona di dichiarazioni e



definizioni.

PROCEDURE <id>; (<lista>);

<dichiarazioni>;

<blocco d'istruzioni>;

Dichiarazione di un sottoprogramma

o procedura con parametri.

Zona di dichiarazioni e

definizione.

<id><tipo>;

Parametri formali in ingresso.

Intestazione della

dichiarazione di

procedure con parametri.

VAR <id><tipo>;

Parametri formali in ingresso/uscita.

Intestazione della

dichiarazione di

procedure con parametri.




CAPITOLO 7

Un linguaggio funzionale

Ci sono modi che permettono di rendere indipendente una determinata zona del programma e di inglobarla in quello che è chiamato un "sottoprogramma". Tale sottoprogramma, incaricato di realizzare una funzione specifica, può essere utilizzato con tutta comodità in qualunque altro punto del programma, senza che perciò si debba scrivere di nuovo lo stesso insieme di istruzioni ogni volta che si desidera il suo intervento.

Anche se l'esecuzione deve realizzarsi una sola volta, è raccomandabile segmentare accuratamente il programma in sottoprogrammi che ne rafforzano la struttura modulare.

Esiste un'altra possibilità per comporre il segmento di programma: cioè definire l'insieme di istruzioni come una "funzione", capace di dare un risultato.


Le funzioni del Pascal

Una funzione consiste di una serie di comandi di calcolo, applicati su certi operandi in ingresso, che forniranno un unico risultato in uscita.

Le funzioni devono essere dichiarate nella corrispondente zona delle dichiarazioni e definizioni del programma, prima del loro uso. La dichiarazione delle funzioni si fa in modo simile a quella delle procedure; sebbene ora sia necessario utilizzare la parola riservata FUNCTION (funzione) nell'intestazione della dichiarazione.

Questa deve essere seguita da un identificatore valido PASCAL, che si utilizza poi per richiamare la funzione e da una lista opzionale di parametri formali in ingresso.

I parametri devono apparire con i loro nomi e tipi, chiusi tra parentesi. Infine oltre alla lista di parametri è specificato il tipo di dato del risultato fornito dalla funzione.

A questa intestazione segue la parte di dichiarazione delle variabili e il corpo della funzione. Proprio in questa parte si calcola il risultato a partire dai parametri in ingresso.

In definitiva l'aspetto generale di una funzione è il seguente:


FUNCTION <identificatore> [(<parametro formale> [,.])]: <tipo di risultato>:

<zona delle dichiarazioni>;

<corpo della funzione>;


Di solito si stabilisce una divisione tra le funzioni, separandole in funzioni senza parametri e funzioni con parametri. Una funzione può calcolare soltanto un unico valore come risultato, a differenza delle procedure con parametri che possono dare più di un risultato in uscita. Questo deve essere assegnato all'identificatore della funzione, nel corpo delle istruzioni che lo compongono. È questa assegnazione che permette di "restituire" il risultato della funzione. A questo proposito risulta ovvio che il tipo di valore calcolato con il tipo di dato dichiarato nell'intestazione come risultato della funzione.

Inoltre il risultato può essere solo di tipo scalare (REAL, INTEGER, CHAR o BOOLEAN); non è ammissibile che il risultato di una funzione sia di tipo strutturato.

Il linguaggio PASCAL utilizza una serie di funzioni standardizzate, esempi di funzioni standard sono: SQR(X), SIN(X), ORD(X), SUCC(X), ecc.

La chiamata o attivazione di una funzione PASCAL si può realizzare in due modi.

Il primo si concretizza in una chiamata diretta all'identificatore della funzione seguita da una lista di parametri reali ad esso necessari.

Nel secondo caso, la chiamata si realizza con un'istruzione d'assegnazione o di comparazione.







"FUNCTION" contro "PROCEDURE"

Qualunque segmento di programma codificabile in forma di procedura può esserlo anche mediante una funzione. Da qui nasce il dubbio su quando utilizzare una procedura (PROCEDU RE) e quando una funzione (FUNCTION).

In ingresso una funzione può generare un unico risultato, mentre una procedura può dare qualsiasi numero di valori in uscita. D'altro lato, i parametri formali di una funzione sono solo in ingresso, mentre i parametri di una procedura possono essere dati in ingresso e in uscita. Per precisare l'uso dell'uno o dell'altro metodo, in ogni caso specifico, conviene ricordare la seguente regola: quando è necessario un unico risultato, avendo o no parametri in ingresso, si deve utilizzare una FUNCTION. In altri casi, cioè quando non c'è risultato o ce n'è più di uno, si utilizzerà il PROCEDURE.











AMBITO DELLE VARIABILI


Affinché una variabile PASCAL possa essere utilizzata nel contesto di un programma, deve essere stata precedentemente dichiarata. Tale dichiarazione può avvenire in diverse zone del programma: nella parte delle dichiarazioni del programma principale oppure nelle dichiarazioni di una funzione o una procedura.

Se una variabile è dichiarata a livello di un programma generale, cioè nella parte che segue il blocco PROGRAM, vi si potrà fare riferimento dall'interno di qualunque sottoprogramma in esso incluso, oltre che dal programma stesso.

Questo tipo di variabili sono definite globali.

Se invece una variabile è dichiarata dall'interno di una determinata funzione o procedura, questa si definisce variabile locale: i valori in essa contenuti sono disponibili solo dall'interno di tale funzione o procedura.

La dichiarazione di una variabile locale avente identificatore uguale a quello di una variabile globale, non produrrà alcun errore, anche se i valori ad essa assegnati nelle diverse parti del programma saranno differenti.

Per conoscere l'ambito di una variabile è necessario esaminare la parte delle definizioni relativa al blocco in cui la si è incontrata; se non si trova a quel punto la dichiarazione andrà esaminato il blocco di un passo più esterno e così via fino a trovare la prima dichiarazione della variabile in questione. Se il blocco in cui si trova, la definizione è quello indicato con PROGRAM la variabile è di tipo globale, se invece non la si trova, il programma dichiarerà un errore per l'uso di una variabile che non è stata definita.




La ricorsività del Pascal

La ricorsività consiste nella facoltà che ha un sottoprogramma di chiamare se stesso.





TABELLA

DEI COMANDI

PASCAL


Comando


Scopo


Osservazioni

FUNCTION <id.1> :

<tipo>;

Dichiarazione come

funzione di un insieme d'istruzioni.

Zona di dichiarazioni e definizioni.

<id.1>,.;<tipo>

Dichiarazione dei parametri formali di una funzione.

Intestazione di una

FUNCTION.



CAPITOLO 8

Nuovi tipi di dati non strutturati

Qualunque elemento del PASCAL è indispensabile che sia dichiarato in precedenza nel programma. Questa dichiarazione permette di assegnare ad ogni elemento del PASCAL il cosiddetto "tipo", in modo che ogni elemento sia di uno, e solo di uno, tipo determinato.

Il fatto di distinguere tra i tipi di dati facilita l'attività di programmazione e rende più facile il reperimento degli errori.

Il PASCAL permette di dare un nome o identificatore a un tipo di dato determinato mediante la chiamata "definizione di tipo". Questo contribuisce a facilitare ulteriormente l'elaborazione dei tipi di dati. Il formato di questa definizione di tipo è il seguente:


TYPE <identificatore> = <tipo>;


Ogni definizione di tipo deve precedere, la dichiarazione di variabili con VAR.

È importante notare che questa definizione di tipo NON dichiara una variabile, ma unicamente un tipo di dato con un nuovo nome; nome che si potrà utilizzare in seguito come tale nella dichiarazione di variabili o di altri elementi.






Tipi di dati non strutturati

Tipi di dati non strutturati, o scalari standard, sono quelli i cui possibili valori non si possono scomporre in un altro tipo di dati.

Sono molte le occasioni in cui l'utente vorrebbe porvi altri tipi di dati, che gli permetterebbero di elaborare più facilmente una certa informazione; il PASCAL permette la definizione di nuovi tipi di dati scalari da parte dell'utente.

Questa definizione si può svolgere in due modi: per numerazione o per definizione di un sottoinsieme di qualsiasi altro tipo di dato scalare (tipi sottoclasse).

IL TIPO ENUMERATO

La definizione di tipo per enumerazione si realizza specificando ordinatamente tutti e ognuno dei valori del nuovo tipo che si vuole definire.

I valori sono rappresentati per mezzo di identificatori; questi costituiscono le costanti del tipo di dati di dati definito e sono dichiarati mediante la seguente definizione:


TYPE <identificatore del tipo> = (<id.1>,<id.2>,.,= <id.n>);


l'identificatore del tipo sarà il nuovo nome di questo tipo di dati, mentre la lista chiusa tra parentesi viene a coincidere con i possibili valori che possono adottare gli elementi dichiarati.





FUNZIONI STANDARD DEI TIPI ORDINALI


Il PASCAL comprende due funzioni standard che permettono d'ottenere il valore precedente e quello successivo di un valore dato:

PRED(X) e SUCC(X), dove X è un valore ordinale di qualunque tipo.

Altra funzione definita per i tipi ordinali è ORD(X) che fornisce il numero indicativo della posizione occupata dal valore X nell'insieme di possibili valori del tipo ordinale a cui appartiene.

Un'altra funzione standard, applicabile solo ai dati di tipo CHAR, è CHR(I) che fornisce il carattere il cui numero ordinale corrisponde al valore indicato dal parametro di ingresso I.









Tipi sottoclasse

Per definire i propri tipi di dati, il programmatore può contare su di un secondo metodo: la definizione dei cosiddetti tipi sottoclasse. Questo nuovo tipo di dati, che può essere creato a partire da qualunque altro tipo di dato scalare definito in precedenza (eccetto del tipo REAL), consiste in un sottoinsieme di valori di questo altro tipo, limitato da un valore massimo e un valore minimo. La sua definizione è la seguente:


TYPE <identificatore tipo> = <cost1>..<cost2>;


Le due costanti che delimitano la classe di valori ammissibile, devono essere dello stesso tipo e devono anche essere ordinate:

limite inferire a destra del limite superiore



TABELLA

DEI COMANDI

PASCAL


Comando


Funzioni


Osservazioni

TYPE <id.> = <tipo>; à.è

Dichiarazione di tipi di dati non standard.

Parte delle dichiarazioni e definizioni, prima di VAR.

TYPE <id.> = >id.1>,., <id.n>;

Dichiarazione di tipi di dati per enumerazione.

Parte delle dichiarazioni e definizioni, prima di VAR

TYPE <id.> = <cos>,., <cos>;

Dichiarazione di tipi di dati sottogruppi.

Parte delle dichiarazioni e definizioni, prima di VAR.

PRED (X);

Funzione che calcolava il predecessore di un dato ordinale.

Corpo del programma.

SUCC (X);

Funzione che calcola il successore di un dato ordinale.

Corpo del programma.

ORD (X);

Funzione che calcola il numero d'ordine di un dato ordinale.

Corpo del programma.

CHR (I);

Funzione che calcola il carattere corrispondente al numero ordinale I.

Corpo del programma.






CAPITOLO 9

Vantaggi  della programmazione strutturata nell'elaborazione dei dati

I dati formano la componente statica del problema, mentre la componente dinamica è costituita dagli algoritmi che li elaborano.

Nella maggior parte dei casi risulta d'obbligo stabilire qualche tipo di relazione tra i dati, che faciliti la loro elaborazione e che semplifichi il lavoro di programmazione.

Risulta perciò evidente la necessità di strutturare i dati. Si definisce una "struttura di dati" come una collezione organizzata di dati, in cui questi sono relazionati tra loro in una forma determinata. La strutturazione dei dati presenta vari vantaggi che giustificano lo studio approfondito dei dati che devono essere elaborati in un programma.

Tra i suoi pregi, come linguaggio di programmazione strutturato, il PASCAL permette la definizione di quattro tipi di dati strutturati:

Matrici (ARRAY),

Insiemi (SET),

Registri (RECORD),

Archivi (FILE).


Matrici o "ARRAY"

Una matrice si definisce come un insieme finito di componenti, tutti dello stesso tipo, che sono ordinati in relazione univoca con un insieme di numeri interi.

Gli elementi di questo insieme di numeri interi ordinati sono chiamati sottoindici.

Ognuno di questi permette l'accesso alla corrispondente componente della matrice.

In PASCAL, il dato di tipo matrice si definisce con la seguente notazione:


TYPE <identificatore> = ARRAY

[<tipo indice>] OF <tipo base>;


Nella definizione si possono distinguere varie parti: l'<identificatore>, che coincide con il nome del nuovo tipo di dato definito; il <tipo indice>, che può essere qualunque tipo ordinale (eccetto l'INTEGER) precedentemente definito (CHAR, BOOLEAN, enumerato o sottoclasse); quest'ultimo fisserà il numero di elementi che formeranno la matrice.

Infine vi è la parte <tipo base>: questa indica il tipo di tutti e di ognuno dei componenti, e può essere uno qualsiasi, persino un altro tipo strutturato.

È importante ricordare che questa definizione di tipo con TYPE non dichiara alcuna variabile; di conseguenza per poter utilizzare questo tipo di dato strutturato in un programma è necessario dichiarare con VAR una variabile a matrice di un tipo ARRAY precedentemente definito.

Non esiste limite alla dimensione delle matrici, ma dipende unicamente dalla capacità di memoria del computer utilizzato.



Il tipo SET

Il linguaggio PASCAL permette di sfruttare il concetto matematico di "insiemi".

Si può comunque segnalare che il suo uso è ridotto a casi particolari. Un insieme si può definire come "una collezione di elementi di versi tra loro, ma dello stesso tipo".

Gli insiemi sono rappresentati in PASCAL scrivendo gli elementi tra parentesi quadre.

Le variabili di insiemi, cioè quelle che si dichiarano di qualche tipo SET, possono contenere nessuno, uno, alcuni o tutti gli elementi che fanno parte di questo insieme.

Pertanto ci saranno tanti possibili valori quanti ne risultano elevando la base 2 alla potenza coincidente con il numero di oggetti che compongono l'insieme.

L'aspetto generale di una definizione del tipo insieme è data da:


TYPE <identificatore> = SET OF <tipo base>;


il <tipo base> può essere di qualunque tipo scalare o sottoclasse, eccetto il tipo REAL.

Come sempre la definizione di tipo non dichiara la variabile, che deve essere dichiarata a parte, oppure direttamente.

Ogni elemento di tipo SET si indirizza per mezzo di una sottoclasse di valori, oppure con un sottoinsieme di questi valori separati da virgole.

Per questo tipo di dati esiste una serie di operatori specifici, che realizzano le operazioni basilari tra insiemi, definite dalla teoria matematica moderna.

Così per l'unione di insiemi si usa il simbolo "+", per l'intersezione il simbolo "*" e per la differenza il simbolo "-".

Oltre agli operatori definiti, si possono applicare a elementi di tipo SET gli operatori di relazione già conosciuti: =, < >, < =, > =. Questi ultimi danno come risultato un valore logico TRUE o FALSE. Gli operatori: "< =" e "> =" non verificano se un insieme è maggiore o minore di un altro, dato che questo è assurdo, ma hanno la funzione di verificare se un insieme è o non incluso in un altro.

Per verificare l'appartenenza o inclusione di insiemi esiste un operatore specifico. Questo è l'operatore binario "IN" che fornisce un risultato di tipo logico (TRUE o FALSE).














TABELLA

DI COMANDI

PASCAL


Comando


Scopo


Osservazioni

ARRAY [<tipo indice>]

OF <tipo base>;

Definizione del tipo matrice

Zona di definizioni dei tipi con TYPE

SET OF <tipo>;

Definizione del tipo insieme

Zona di definizioni dei tipi con TYPE

<ins.> * <ins.>

Operazione d'intersezione tra insiemi

Corpo del programma

<ins.> + <ins.>

Operazione di unione tra insiemi

Corpo del programma

<ins.> - <ins.>

Operazione di differenza tra insiemi

Corpo del programma

<elem.> IN <ins.>

Relazione d'appartenenza o inclusione in un insieme

Corpo del programma

<ins.> < = <ins.>

Relazione d'inclusione tra insiemi

Corpo del programma



CAPITOLO 10

Registri e archivi

Il tipo registro (RECORD) è il più flessibile di tutti, dato che permette di riunire dati di qualsiasi altro tipo, inclusi nuovi registri, in una stessa struttura.

In PASCAL, il concetto di registro si riferisce a un insieme d'informazioni relative ad un unico oggetto, che possono essere utilizzate come un "tutt'uno", o nelle sue parti individuali. Queste parti, chiamate campi, mantengono una certa indipendenza l'una rispetto all'altra, il che permette la loro distinzione in tipo e contenuto.

Questo è una delle principali differenze del tipo registro (RECORD) rispetto al tipo ARRAY. L'altra differenza importante risiede nel fatto che in una matrice o array ciascuno degli elementi è indirizzato da un sottoindice, mentre nei registri si fa riferimento agli elementi per mezzo del nome dei campi che li formano.

Più formalmente, un registro in PASCAL può essere definito come una collezione di un numero fisso di componenti chiamate "campi", essendo ogni campo definito da un identificatore e dal tipo di dato corrispondente.

La definizione di un dato di tipo registro si realizza nel modo seguente:




TYPE <identificatore> = RECORD

<lista di campi>

END;


Quindi la lista di campi sarà composta da un numero finito d'identificatori di campo, seguiti dal tipo d'ogni campo e separati dal punto e virgola. Questa è la struttura generica:


<identificatore campo 1> : <tipo>;
<identificatore campo 2> : <tipo>;


<identificatore campo n> : <tipo>;


Selezionando i campi

Un registro può essere utilizzato tanto in definizioni di tipo come in dichiarazioni di variabili. In questo modo, qualsiasi campo di un registro può essere utilizzato come se si trattasse di una variabile normale. Inoltre, si può anche far riferimento al registro in blocco, purché sia all'interno d'istruzioni d'assegnazione, come argomento di funzioni, ecc.

Un'istruzione che aiuta ad elaborare i registri è WITH, il cui formato è il seguente:


WITH <variabile registro>

DO <istruzione>;


Con questa si può omettere l'identificatore del registro, indicando unicamente l'identificatore del campo che si desidera selezionare.

L'istruzione WITH è di grande aiuto nel caso si abbiano registri di struttura complessa, in cui alcuni dei campi siano a loro volta nuovi registri (registri gerarchizzati).


Gli archivi di dati

Quest'insieme di dati è solitamente memorizzato nei cosiddetti "archivi" o "file":



strutture  formate da una sequenza di componenti, tutti dello stesso tipo, costruite in modo che si possa accedere in un dato momento, ad un unico componente dello stesso.

Le variabili di tipo file si possono utilizzare solo come parametri di procedure, non in istruzioni d'assegnazione né d'altro tipo. Per facilitare l'elaborazione dei file esiste quindi una serie di procedure standard definite in precedenza dal compilatore PASCAL.

Una di queste procedure è quella che ha come parola di chiamata: RESET (<identificatore di file>). Il suo compito è quello d'inizializzare il file al suo primo componente affinché possa essere letto. Per accedere alla componente successiva si utilizzerà una nuova istruzione READ e così via fino a che si giungerà all'ultima componente del file, nel cui caso una nuova lettura con READ darà un errore dovuto al fatto che non esistono più componenti. La fine del file si può rilevare prima, per evitare questi errori, per mezzo di un'altra procedura standard, la cui istruzione di chiamata è EOF (<identificatore di file>).

Questa procedura restituisce il valore booleano TRUE, se si è giunti alla fine del file; in caso contrario il valore restituito sarà FALSE.

Per inizializzare la scrittura dei dati in un file si dispone della procedura REWRITE (<identificatore di file>); il cui compito è di sostituire il valore del file indicato per mezzo di un nuovo file vuoto e posizionarsi nella prima componente. La scrittura si realizzerà quindi mediante l'istruzione WRITE. Per i file del testo esiste una procedura che indica quando si è raggiunta la fine di una linea che si attiva mediante la chiamata EOLN (<identificatore di file>) e restituisce un valore di tipo booleano in modo simile al procedimento EOF. La dichiarazione d'ogni variabile di tipo file crea automaticamente una variabile ausiliaria chiamata "buffer", con capienza per unico valore dello stesso tipo delle componenti del file; questa variabile si utilizza come "intermediaria" nella lettura e scrittura di valori. La variabile ausiliaria "buffer" sta a disposizione del programmatore in qualunque momento, chiamando l'identificatore: <nome del file>

Questa variabile quindi è utilizzata per mezzo d'altre due procedure standard:

GET (<identificatore di file>) e PUT (<identificatore di file>) che costituiscono un altro modo per aggiornare le componenti del file. Così, GET prende il valore della componente seguente e lo memorizza nella variabile buffer del file, mentre PUT trasferisce il valore del buffer alla componente attuale del file.


TABELLA

DI COMANDI

PASCAL


Comando


Scopo


Osservazioni

TYPE <id> = RECORD <lista>

END

Definizione del tipo registro

Zona di dichiarazioni e definizioni

<id.1> : <tipo>;.;<id .n> : <tipo>;

Definizione dei campi di un registro (lista di campi)

Zona di dichiarazione e definizione

<id. registro>.<id. campo>;

Selettore dei campi del registro

Corpo del programma

WITH <var> DO <istr.>;

Uso dei campi senza coinvolgere l'identificatore di registro

Corpo del programma

TYPE <id> = FILE OF <tipo>;

Definizione del tipo file

Zona di dichiarazioni e definizioni

RESET (<file>);

Inizializzazione di file per la lettura

Corpo del programma

EOF (<file>);

Indicatore di fine file

Corpo del programma





TABELLA

DI COMANDI

PASCAL


Comando


Scopo


Osservazioni

REWRITE (<file>);

Inizializzare il file per la scrittura

Corpo del programma

EOLN (<file>);

Indicatore di fine linea

Corpo del programma

<file>

Variabile "buffer" di un file

Corpo del programma

PUT (<file>);

Trasferimento al file della variabile "buffer"

Corpo del programma

GET (<file>);

Trasferimento alla variabile "buffer" della componente corrente del file

Corpo del programma



CAPITOLO 11

L'ultimo passo attraverso il PASCAL

L'elemento basilare dell'informazione al momento della sua elaborazione da parte del computer e della sua memorizzazione, è la parola binaria.

Di solito si lavora con parole binarie a 8 bit, ognuna di queste caselle è integrata da 8 caselline o elementi di memoria. Questa forma di memorizzazione è chiamata UNPACKED, e costituisce il metodo più naturale di mantenere l'informazione.

Ogni dato occupa di conseguenza una posizione di memoria. Naturalmente se in una posizione è possibile memorizzare , per esempio, dati numerici fino a cinque cifre, non c'è dubbio che memorizzando un dato con sole due cifre si spreca spazio di memoria.

Il PASCAL permette che l'informazione sia impacchettata mediante l'attributo PACKED, applicabile alle strutture RECORD e  ARRAY.


Stringhe di caratteri (STRINGS)

Un tipo di dato utilizzato con molta frequenza nei programmi è la "stringa".

Questa è definita come una matrice di caratteri impacchettati.

Una delle operazioni più frequenti con questo tipo di dati è quella di classificarli in ordine alfabetico; per questo si possono utilizzare gli operatori logici di relazione: <, >, =, < >, < =, > =   

Un vantaggio delle stringhe è che permettono d'assegnare un valore a tutti i propri elementi simultaneamente, evitando la necessità di svolgere questa assegnazione carattere per carattere.

Una limitazione a riguardo è che il numero di caratteri deve coincidere con la dimensione dichiarata per la stringa in questione; se non coincide, non è possibile realizzare l'assegnazione dall'esterno mediante un istruzione di tipo READ. In tal caso è necessario realizzarla carattere per carattere, per esempio, mediante cicli FOR.


Registri varianti

La struttura delle variabili ordinarie di tipo registro è abbastanza rigida. In molti casi può essere conveniente fare in modo che questa struttura risulti un po' più modellabile, allo scopo di adattarla alle possibili variazioni dei dati, per quanto riguarda il numero e il tipo dei campi. Questo si consegue mediante i cosiddetti registri varianti, il cui metodo di definizione è il seguente:


TYPE <identificatore> = RECORD

<campo1> : <tipo>;

<campo2> : <tipo>;


CASE <campo diverso> : <tipo> OF

<valore1> : (<id.1> : <tipo>; <id.2> : <tipo>; .)

<valore2> : (<id.1> : <tipo>; <id.2> : <tipo>; .)

.

END;


Puntatori

Il linguaggio PASCAL offre un tipo di variabili chiamate "puntatori" (POINTERS),

il cui compito è memorizzare l'indirizzo di memoria di un determinato dato.

Con la loro collaborazione è possibile collegare i dati in modo che la quantità di memoria occupata da un determinato insieme di dati sia unicamente quella necessaria.

Le variabili di tipo puntatore sono definite nel modo seguente:


TYPE <identificatore> : <tipo>;


dove il segno " " contraddistingue questo tipo di dato e <tipo> è il parametro che segnala il tipo di dati a cui punteranno queste variabili.

Per inizzializzare la variabile puntatore e riservare così spazio di memoria per la prima variabile, si dispone della procedura:


NEW (<variabile puntatore>);


L'operazione contraria è a carico della procedura:


DISPOSE (<variabile puntatore>);

per accedere a questa posizione riservata si ricorre alla seguente notazione: <variabile puntatore> creata eseguendo un NEW. Se si desidera che la variabile puntatore non segnali nessun elemento, bisogna assegnarle il valore NIL.


TABELLA

DI COMANDI

PASCAL


Comando


Scopo


Osservazioni

TYPE <id> = PACKED <tipo>;

Impacchettamento dei dati per ottimizzare l'uso della memoria

Definizione dei tipi RECORD o ARRAY

TYPE <id> = RECORD.CASE

<dist> OF <lista>;

Definizione di registro variabile

Zona di dichiarazioni e definizioni

TYPE <id> = <tipo>;

Definizione di tipo puntatore

Zona di dichiarazioni e definizioni

NEW (<punt.>);

Inizializzazione di un puntatore

Procedure standard

DISPOSE (<punt>);

Eliminazione di un puntatore

Procedure standard






























INDICE

CAPITOLO 1

Un linguaggio ad alto livello strutturato e modulare

Identificatori

1.2 Aspetto di un programma Pascal

1.3 I dati del Pascal

CAPITOLO 2

Espressioni generali e dati di tipo scalare

Dati di tipo intero

Dati di tipo reale

Dati di tipo carattere

Dati di tipo booleani

L'istruzione di assegnazione

Espressioni aritmetiche

Gerarchia degli operatori

CAPITOLO 3

Ingresso e usciti dei dati

Lettura di dati

Uscita di dati

CAPITOLO 4

Strutture e istruzioni di controllo

Struttura sequenziale

Strutture ripetitive

CAPITOLO 5

Strutture selettive

L'istruzione IF/THEN/ELSE

Campionario di scelta

Salto incondizionato

CAPITOLO 6

Le procedure del Pascal

Procedure senza parametri

Procedimenti con parametri

CAPITOLO 7

Un linguaggio funzionale

Le funzioni del Pascal

"FUNCTION" contro "PROCEDURE"

La ricorsività del Pascal

CAPITOLO 8

Nuovi tipi di dati non strutturati

Tipi di dati non strutturati

Tipi sottoclasse



CAPITOLO 9

Vantaggi  della programmazione strutturata nell'elaborazione dei dati

Matrici o "ARRAY"

Il tipo SET

CAPITOLO 10

Registri e archivi

Selezionando i campi

Gli archivi di dati

CAPITOLO 11

L'ultimo passo attraverso il PASCAL

Stringhe di caratteri (STRINGS)

Registri varianti

Puntatori

INDICE







Privacy




Articolo informazione


Hits: 2312
Apprezzato: scheda appunto

Commentare questo articolo:

Non sei registrato
Devi essere registrato per commentare

ISCRIVITI



Copiare il codice

nella pagina web del tuo sito.


Copyright InfTub.com 2024