PASCAL
La struttura di base:
La struttura di base di un programma scritto in pascal è composta da 5 punti principali:
1. Intestazione;
2. Riga che dichiara le variabili;
3. Istruzione che dichiara l'inizio del programma;
4. Corpo del programma;
5. Istruzione che dichiara la fine del programma.
Ogni riga di un programma scritto in Pascal deve necessariamente terminare con un punto e virgola (;), questa regola non è valida per righe contenenti istruzioni particolari illustrate successivamente in questa guida. Tutto il testo del programma, chiamato anche codice sorgente, può essere scritto indifferentemente sia in maiuscolo che in minuscolo.
ESEMPIO DI STRUTTURA BASE:
Program NOMEDELPROGRAMMA; intestazione
var VARIABILI:TIPOVARIABILI; riga che dichiara le variabili
begin istruzione che dichiara l'inizio del programma
...
... corpo del programma
...
readln; permette al programma di rimanere in esecuzione alla fine del programma finchè non si preme un tasto
end. istruzione che dichiara la fine del programma
L'istruzione READLN prima di END (obbligatoria nei compilatori più recenti), serve a bloccare lo schermo alla fine dell'esecuzione del programma:
praticamente il compilatore aspetta che sia premuto un tasto per passare all'istruzione successiva, cioè END, e quindi terminare l'esecuzione del programma.
Senza READLN il programma viene eseguito lo stesso, ma il compilatore non fermandosi alla fine non permette la corretta visualizzazione dell'esecuzione.
1. Intestazione;
2. Riga che dichiara le variabili;
3. Istruzione che dichiara l'inizio del programma;
4. Corpo del programma;
5. Istruzione che dichiara la fine del programma.
Ogni riga di un programma scritto in Pascal deve necessariamente terminare con un punto e virgola (;), questa regola non è valida per righe contenenti istruzioni particolari illustrate successivamente in questa guida. Tutto il testo del programma, chiamato anche codice sorgente, può essere scritto indifferentemente sia in maiuscolo che in minuscolo.
ESEMPIO DI STRUTTURA BASE:
Program NOMEDELPROGRAMMA; intestazione
var VARIABILI:TIPOVARIABILI; riga che dichiara le variabili
begin istruzione che dichiara l'inizio del programma
...
... corpo del programma
...
readln; permette al programma di rimanere in esecuzione alla fine del programma finchè non si preme un tasto
end. istruzione che dichiara la fine del programma
L'istruzione READLN prima di END (obbligatoria nei compilatori più recenti), serve a bloccare lo schermo alla fine dell'esecuzione del programma:
praticamente il compilatore aspetta che sia premuto un tasto per passare all'istruzione successiva, cioè END, e quindi terminare l'esecuzione del programma.
Senza READLN il programma viene eseguito lo stesso, ma il compilatore non fermandosi alla fine non permette la corretta visualizzazione dell'esecuzione.
L'Intestazione:
L'intestazione di un programma scritto in Pascal è
costituita dalla parola PROGRAM seguita da uno spazio e dal nome del programma. Il nome del programma non viene letto dal compilatore, quindi può essere un nome qualunque.
Il nome del programma:
DEVE: essere scritto senza spazi;
NON DEVE: essere una "parola riservata", contenere lettere accentate contenere segni di punteggiatura e simboli.
Se si vogliono inserire degli spazi all'interno del nome del programma si possono usare le lineette ( _ ).
LE PAROLE "RISERVATE" DA NON USARE:
Absolute
And
Array
Asm
Begin
Case
Const
Destructor
Div
Do
Downto
Else
End
File
For
Forward
Funtion
Goto
If
Implementation
In
Interface
Label
Mod
Nil
Not
Object
Of
Or
Packed
Private
Procedure
Program
Record
Repeat
Set
Shr
String
Then
To
Type
Until
Uses
Var
While
Whit
Xor
Il nome del programma:
DEVE: essere scritto senza spazi;
NON DEVE: essere una "parola riservata", contenere lettere accentate contenere segni di punteggiatura e simboli.
Se si vogliono inserire degli spazi all'interno del nome del programma si possono usare le lineette ( _ ).
LE PAROLE "RISERVATE" DA NON USARE:
Absolute
And
Array
Asm
Begin
Case
Const
Destructor
Div
Do
Downto
Else
End
File
For
Forward
Funtion
Goto
If
Implementation
In
Interface
Label
Mod
Nil
Not
Object
Of
Or
Packed
Private
Procedure
Program
Record
Repeat
Set
Shr
String
Then
To
Type
Until
Uses
Var
While
Whit
Xor
Le Variabili:
Una variabile è un contenitore all'interno del quale vi sono dei dati che possono variare durante l'esecuzione del programma. Le variabili in un programma scritto in Pascal sono dichiarate in una riga specifica dopo la parola VAR tramite dei nomi. Questi ultimi, detti anche identificatori, sono assegnati liberamente, ma NON devono:
1. Contenere spazi;
2. Essere uguali al nome del programma;
3. Contenere segni di punteggiatura o simboli;
4. Essere dei simboli o dei numeri;
5. Essere una parola riservata;
6. Contenere lettere accentate.
Se vi sono più variabili, i vari identificatori vengono separati da virgole (,).
I dati contenuti nelle variabili possono essere di diverso tipo: testo, numeri interi, numeri reali ecc. Il tipo di una variabile deve essere indicato dopo
l'identificatore, facendo seguire a quest'ultimo i due punti (:) e scrivendo il tipo della variabile.
Se vi sono più variabili dello stesso tipo (ad esempio 3 numeri, 2 stringhe ecc.), si indicheranno i vari identificatori separati da virgole, si faranno seguire
all'ultimo identificatore i due punti (:) e si scriverà il tipo delle variabili.
Esempio (dichiarazione di una variabile):
var identificatore: tipo;
Esempio (dichiarazione di più variabili):
var identificatore, ..., ..., identificatore: tipo;
Quando le variabili sono molteplici e di diverso tipo la sintassi è la seguente:
var identificatore, ..., ..., identificatore: tipo1;
var identificatore, ..., ..., identificatore: tipo2;
I principali tipi di variabili sono:
- Integer: La variabile è un numero intero compreso tra -32768 e +32767
- Byte: La variabile è un numero intero compreso tra 0 e 255
- Word: La variabile è un numero intero compreso tra 0 e 65535
- Shortint: La variabile è un numero intero compreso tra -128 e +127
- Longint: La variabile è un numero intero compreso tra -2147483648 e +2147483648
- Real: La variabile è un numero reale compreso tra 2.9E-39 e 1.7E38
- String: La variabile è di tipo testuale
- Char: La variabile è un singolo carattere della tabella ASCII
- Boolean: La variabile può assumere i valori TRUE o FALSE
1. Contenere spazi;
2. Essere uguali al nome del programma;
3. Contenere segni di punteggiatura o simboli;
4. Essere dei simboli o dei numeri;
5. Essere una parola riservata;
6. Contenere lettere accentate.
Se vi sono più variabili, i vari identificatori vengono separati da virgole (,).
I dati contenuti nelle variabili possono essere di diverso tipo: testo, numeri interi, numeri reali ecc. Il tipo di una variabile deve essere indicato dopo
l'identificatore, facendo seguire a quest'ultimo i due punti (:) e scrivendo il tipo della variabile.
Se vi sono più variabili dello stesso tipo (ad esempio 3 numeri, 2 stringhe ecc.), si indicheranno i vari identificatori separati da virgole, si faranno seguire
all'ultimo identificatore i due punti (:) e si scriverà il tipo delle variabili.
Esempio (dichiarazione di una variabile):
var identificatore: tipo;
Esempio (dichiarazione di più variabili):
var identificatore, ..., ..., identificatore: tipo;
Quando le variabili sono molteplici e di diverso tipo la sintassi è la seguente:
var identificatore, ..., ..., identificatore: tipo1;
var identificatore, ..., ..., identificatore: tipo2;
I principali tipi di variabili sono:
- Integer: La variabile è un numero intero compreso tra -32768 e +32767
- Byte: La variabile è un numero intero compreso tra 0 e 255
- Word: La variabile è un numero intero compreso tra 0 e 65535
- Shortint: La variabile è un numero intero compreso tra -128 e +127
- Longint: La variabile è un numero intero compreso tra -2147483648 e +2147483648
- Real: La variabile è un numero reale compreso tra 2.9E-39 e 1.7E38
- String: La variabile è di tipo testuale
- Char: La variabile è un singolo carattere della tabella ASCII
- Boolean: La variabile può assumere i valori TRUE o FALSE
Le strutture di controllo:
Un algoritmo è un insieme finito di istruzioni che servono a specificare una serie di operazioni con le quali è possibile risolvere un problema. Un programma
in Pascal quindi, come in qualsiasi altro linguaggio di programmazione, rappresenta un algoritmo. Secondo il teorema di Böhm-Jacopini (del 1966): "Un qualsiasi algoritmo può essere espresso usando esclusivamente le strutture di sequenza, di selezione e di iterazione". Questi 3 modelli si chiamano strutture di controllo.
La struttura dei programmi finora esaminati è la sequenza, cioè le istruzioni vengono eseguite una dopo l'altra:
Program esempio;
Begin
...
ISTRUZIONE1;
ISTRUZIONE2;
ISTRUZIONE3;
...
readln;
End.
La struttura di selezione, o alternativa, in Pascal viene rappresentata secondo lo schema:
IF (condizione) THEN
istruzione1
ELSE istruzione2;
Se la condizione è vera viene eseguita l'istruzione1, altrimenti (cioè se la condizione è falsa) viene eseguita l'istruzione2.
Se le istruzioni sono più di una si usano il begin all'inizio normalmente e l'end con il punto e virgola alla fine.
Questo tipo di istruzione viene eseguito una sola volta, non funziona come un ciclo (iterazione)!
La struttura di iterazione, o di ripetizione, consiste in un ciclo con una condizione alla fine o all'inizio.
Se il ciclo ha la condizione alla fine la codifica in Pascal è:
REPEAT
...
istruzioni;
...
UNTIL (condizione);
Le istruzioni, o l'istruzione, tra Repeat e Until verranno ripetute fino a quando la condizione diventa vera; quindi la struttura si ripete per falso!
Se il ciclo ha la condizione all'inizio la codifica in Pascal è:
WHILE (condizione) DO
BEGIN
...
istruzioni;
...
END;
Le istruzioni tra Begin ed End verranno ripetute fino a quando la condizione diventa falsa; quindi la struttura si ripete per vero!
Se c'è una sola istruzione da ripetere, il BEGIN e l'END possono essere omessi.
Esiste una struttura di ripetizione senza una vera e propria condizione, chiamata ripetizione con contatore o enumerativa.
La sua codifica in Pascal è:
FOR contatore:=valoreiniziale TO valorefinale DO
BEGIN
...
istruzioni;
...
END;
Le istruzioni tra Begin ed End verranno ripetute tante volte quante ne occorrono per portare il valore del contatore dal valore iniziale al valore finale.
(ESEMPIO: FOR C:=1 TO 15 DO, per portare il contatore C da 1 a 15 c'è bisogno di 15 passaggi, quindi le operazioni verranno eseguite 15 volte).
Se c'è una sola istruzione da ripetere, il BEGIN e l'END possono essere omessi come per il ciclo WHILE visto prima!
in Pascal quindi, come in qualsiasi altro linguaggio di programmazione, rappresenta un algoritmo. Secondo il teorema di Böhm-Jacopini (del 1966): "Un qualsiasi algoritmo può essere espresso usando esclusivamente le strutture di sequenza, di selezione e di iterazione". Questi 3 modelli si chiamano strutture di controllo.
La struttura dei programmi finora esaminati è la sequenza, cioè le istruzioni vengono eseguite una dopo l'altra:
Program esempio;
Begin
...
ISTRUZIONE1;
ISTRUZIONE2;
ISTRUZIONE3;
...
readln;
End.
La struttura di selezione, o alternativa, in Pascal viene rappresentata secondo lo schema:
IF (condizione) THEN
istruzione1
ELSE istruzione2;
Se la condizione è vera viene eseguita l'istruzione1, altrimenti (cioè se la condizione è falsa) viene eseguita l'istruzione2.
Se le istruzioni sono più di una si usano il begin all'inizio normalmente e l'end con il punto e virgola alla fine.
Questo tipo di istruzione viene eseguito una sola volta, non funziona come un ciclo (iterazione)!
La struttura di iterazione, o di ripetizione, consiste in un ciclo con una condizione alla fine o all'inizio.
Se il ciclo ha la condizione alla fine la codifica in Pascal è:
REPEAT
...
istruzioni;
...
UNTIL (condizione);
Le istruzioni, o l'istruzione, tra Repeat e Until verranno ripetute fino a quando la condizione diventa vera; quindi la struttura si ripete per falso!
Se il ciclo ha la condizione all'inizio la codifica in Pascal è:
WHILE (condizione) DO
BEGIN
...
istruzioni;
...
END;
Le istruzioni tra Begin ed End verranno ripetute fino a quando la condizione diventa falsa; quindi la struttura si ripete per vero!
Se c'è una sola istruzione da ripetere, il BEGIN e l'END possono essere omessi.
Esiste una struttura di ripetizione senza una vera e propria condizione, chiamata ripetizione con contatore o enumerativa.
La sua codifica in Pascal è:
FOR contatore:=valoreiniziale TO valorefinale DO
BEGIN
...
istruzioni;
...
END;
Le istruzioni tra Begin ed End verranno ripetute tante volte quante ne occorrono per portare il valore del contatore dal valore iniziale al valore finale.
(ESEMPIO: FOR C:=1 TO 15 DO, per portare il contatore C da 1 a 15 c'è bisogno di 15 passaggi, quindi le operazioni verranno eseguite 15 volte).
Se c'è una sola istruzione da ripetere, il BEGIN e l'END possono essere omessi come per il ciclo WHILE visto prima!
I vettori (array):
L'array (dall'inglese vettore), non è altro che uno spazio di memoria dove vengono memorizzate più variabili. La differenza rispetto alle normali variabili
è che si possono usare centinaia di allocazioni di memoria, senza, però, dichiarare un altrettanto consistente numero di variabili. Infatti, con lo stesso nome si indica una lista di elementi, ognuno dei quali è accessibile singolarmente. In questo caso, si vogliono memorizzare 40 (o meno) nomi, ma non sarebbe comodo scrivere:
var nome1,nome2,nome3,nome4,nome5,...,nome40:string;
L'array ci consente questo! Quindi, per dichiarare un array, si usa la costruzione:
<nome della variabile>:array[valore min..valore max] of <tipo della variabile>
Per usare, leggere o scrivere un elemento di un array si deve solo scrivere il suo nome seguito dallindicazione dellindice che lo contraddistingue, racchiuso fra parentesi quadre, così:
var numero:array[1..50] of integer;
...
read(numero[9]);
...
write(numero[98]);
...
numero[7]:=numero[2]*3;
è che si possono usare centinaia di allocazioni di memoria, senza, però, dichiarare un altrettanto consistente numero di variabili. Infatti, con lo stesso nome si indica una lista di elementi, ognuno dei quali è accessibile singolarmente. In questo caso, si vogliono memorizzare 40 (o meno) nomi, ma non sarebbe comodo scrivere:
var nome1,nome2,nome3,nome4,nome5,...,nome40:string;
L'array ci consente questo! Quindi, per dichiarare un array, si usa la costruzione:
<nome della variabile>:array[valore min..valore max] of <tipo della variabile>
Per usare, leggere o scrivere un elemento di un array si deve solo scrivere il suo nome seguito dallindicazione dellindice che lo contraddistingue, racchiuso fra parentesi quadre, così:
var numero:array[1..50] of integer;
...
read(numero[9]);
...
write(numero[98]);
...
numero[7]:=numero[2]*3;
L'ordinamento di un vettore:
Ordinare gli elementi di un array significa metterli in ordine alfabetico se sono stringhe o in ordine di grandezza se sono numeri.
Esistono molti algoritmi di ordinamento.
Noi ne analizzeremo solo uno, il più semplice: il metodo sequenziale.
METODO SEQUENZIALE:
Questo algoritmo è molto efficace con un numero di elementi non eccessivo.
Il metodo di ordinamento presentato consiste nel confronto di ciascun elemento con il tutti gli altri elementi che sono disposti nelle posizioni successive a quella esaminata, partendo da primo elemento fino ad arrivare all'ultimo.
Tutte le volte che tra gli elementi successivi si incontra un elemento più piccolo, si procede allo scambio tra i due in modo che, alla fine del confronto di ciascun elemento con i successivi si ottenga nella posizione in esame il valore minimo rispetto ai successivi.
Alla fine gli elementi verranno disposti dal più piccolo al più grande, in modo crescente.
Nell'esempio che vedremo l'ordinamento è crescente, se si volesse ottenere un ordinamento decrescente basta cambiare il verso del confronto.
Program Ordinamento_Elementi_Array;
var temp,z,i,j:integer;
a:array[1..5] of integer;
begin
writeln('Ordinamento degli elementi di un array');
for z := 1 to 5 do
begin
writeln('Inserisci il componente ', z, ' dell''array');
write('componente numero ',z,' = '); readln(a[z]);
end;
writeln;
for i := 1 to 5 do
begin
for j := i+1 to 5 do
begin
if a[i] > a[j] then
begin
temp:=a[i];
a[i]:=a[j];
a[j]:=temp;
end;
end;
end;
for z := 1 to 5 do
writeln('componente numero ' ,z,' = ',a[z]);
readln;
end.
Esistono molti algoritmi di ordinamento.
Noi ne analizzeremo solo uno, il più semplice: il metodo sequenziale.
METODO SEQUENZIALE:
Questo algoritmo è molto efficace con un numero di elementi non eccessivo.
Il metodo di ordinamento presentato consiste nel confronto di ciascun elemento con il tutti gli altri elementi che sono disposti nelle posizioni successive a quella esaminata, partendo da primo elemento fino ad arrivare all'ultimo.
Tutte le volte che tra gli elementi successivi si incontra un elemento più piccolo, si procede allo scambio tra i due in modo che, alla fine del confronto di ciascun elemento con i successivi si ottenga nella posizione in esame il valore minimo rispetto ai successivi.
Alla fine gli elementi verranno disposti dal più piccolo al più grande, in modo crescente.
Nell'esempio che vedremo l'ordinamento è crescente, se si volesse ottenere un ordinamento decrescente basta cambiare il verso del confronto.
Program Ordinamento_Elementi_Array;
var temp,z,i,j:integer;
a:array[1..5] of integer;
begin
writeln('Ordinamento degli elementi di un array');
for z := 1 to 5 do
begin
writeln('Inserisci il componente ', z, ' dell''array');
write('componente numero ',z,' = '); readln(a[z]);
end;
writeln;
for i := 1 to 5 do
begin
for j := i+1 to 5 do
begin
if a[i] > a[j] then
begin
temp:=a[i];
a[i]:=a[j];
a[j]:=temp;
end;
end;
end;
for z := 1 to 5 do
writeln('componente numero ' ,z,' = ',a[z]);
readln;
end.
Array multidimensionali o "Matrici":
Se un array monodimensionale è contrassegnato da un solo indice, un array multidimensionale ne supporta di più:
<nome>:array[min..max,da..a,a..b,...] of <tipo>
E da tenere in considerazione, però, che lo spazio massimo in memoria, destinato alle variabili, che un programma può occupare è 64KB, perciò è consigliabile ridurre sempre al minimo l'utilizzo di tipi particolari di variabili (come l'extended, il più grande).
Un piccolo esempio per capire meglio il funzionamento di questo particolare tipo di array, questo programma legge i dati di una matrice e li scrive in output in forma di "tabellina", come siamo abituati a vedere in aritmetica:
program Matrici;
var n,m,ir,ic:integer;
var mat:array[1..100,1..100] of integer;
begin
write('Inserisci quante righe vuoi considerare? ');
readln(n);
while (n<=0) do
begin
write('Inserisci un numero POSITIVO! ');
readln(n);
end;
write('Quante colonne vuoi considerare? ');
readln(m);
while (m<=0) do
begin
write('Inserisci un numero POSITIVO! ');
readln(m);
end;
ir:=1;
ic:=1;
while (ir<=n) do
begin
writeln('Inserimento dati riga ',ir);
ic:=1;
while (ic<=m) do
begin
write('Digita il dato della ',ic,' colonna: ');
readln(mat[ir,ic]);
ic:=ic+1;
end;
ir:=ir+1;
end;
ic:=1;
ir:=1;
while (ir<=n) do
begin
ic:=1;
while (ic<=m) do
begin
write(mat[ir,ic],' ');
ic:=ic+1;
end;
writeln;
ir:=ir+1;
end;
readln;
end.
<nome>:array[min..max,da..a,a..b,...] of <tipo>
E da tenere in considerazione, però, che lo spazio massimo in memoria, destinato alle variabili, che un programma può occupare è 64KB, perciò è consigliabile ridurre sempre al minimo l'utilizzo di tipi particolari di variabili (come l'extended, il più grande).
Un piccolo esempio per capire meglio il funzionamento di questo particolare tipo di array, questo programma legge i dati di una matrice e li scrive in output in forma di "tabellina", come siamo abituati a vedere in aritmetica:
program Matrici;
var n,m,ir,ic:integer;
var mat:array[1..100,1..100] of integer;
begin
write('Inserisci quante righe vuoi considerare? ');
readln(n);
while (n<=0) do
begin
write('Inserisci un numero POSITIVO! ');
readln(n);
end;
write('Quante colonne vuoi considerare? ');
readln(m);
while (m<=0) do
begin
write('Inserisci un numero POSITIVO! ');
readln(m);
end;
ir:=1;
ic:=1;
while (ir<=n) do
begin
writeln('Inserimento dati riga ',ir);
ic:=1;
while (ic<=m) do
begin
write('Digita il dato della ',ic,' colonna: ');
readln(mat[ir,ic]);
ic:=ic+1;
end;
ir:=ir+1;
end;
ic:=1;
ir:=1;
while (ir<=n) do
begin
ic:=1;
while (ic<=m) do
begin
write(mat[ir,ic],' ');
ic:=ic+1;
end;
writeln;
ir:=ir+1;
end;
readln;
end.
Procedure e Funzioni
Può capitare, molte volte, che le semplici funzioni fornite dal compilatore non bastino a raggiungere il nostro scopo. Per questo esistono procedure e funzioni personalizzate. La sintassi è la seguente:
Procedure <nome>(<parametri>:<tipo>;<parametri>:<tipo>;...);
var ...
begin
(*Corpo della procedura*)
end;
Come avete visto, la sintassi non è semplicissima, ma ci farete l'abitudine.
Facciamo un esempio pratico: la seguente procedura cambia il valore di alcune variabili globali, dichiarate all'esterno di essa:
(*...*)
var a,b,c,d:integer;
procedure Cambia_Valori;
begin
a:=b;
b:=c;
c:=d;
d:=a;
end;
Come avrete visto, la procedura non accetta nessun parametro (vedi parte iniziale), né, tantomeno, sono dichiarate variabili interne (tra poco sapremo cosa sono).
Semplicemente scambia i valori delle variabili globali a,b,c e d.
Il corpo della procedura è sempre racchiuso tra un begin e un end;.
Nella parte tra la dichiarazione della funzione e il corpo della stessa, c'è uno spazio dedicato alle variabili interne: esse servono solo ed esclusivamente allinterno della procedura per semplificare il calcolo e non sono accessibili al di fuori di essa, in quanto la memoria loro assegnata viene liberata al termine della funzione.
Il passaggio delle variabili può avvenire per indirizzo.
Si, ma cos'è il passaggio per indirizzo? Se si vuole modificare una variabile globale tramite una procedura, qualunque sia la variabile indicata come parametro, si usa un passaggio per indirizzo, che viene realizzato mediante, l'uso della parola "var" prima del parametro.
I passaggi di parametri altrimenti avvengono per valore, ossia il parametro assume il valore della variabile, che non viene modificata, poiché tutte le trasformazioni avvengono sul parametro.
Ecco un esempio di passaggi per valore e per indirizzo:
(*...*)
var f:integer;
procedure Esempio(x:integer); (*E' un passaggio per valore*)
begin
x:=2; (*Il parametro x viene settato a 2, ma questa istruzione è inutile, poichè alla fine della procedura il parametro viene distrutto*)
end;
procedure Example(var x:integer); (*E' un passaggio per indirizzo*)
begin
x:=2; (*La variabile passata a Example nella parentesi viene modificata, ossia viene copiato nell'indirizzo di memoria di x il valore 2*)
end;
begin (*INIZIO MAIN LINE, IL CORPO DEL PROGRAMMA)
f:=7;
writeln(f); (*Visualizza 7*)
Esempio(f);
writeln(f); (*Visualizza 7, non 2 come assegnato dalla procedura, perchè il parametro modificato viene distrutto e la variabile non viene modificata*)
Example(f);
writeln(f); (*Visualizza 2, perchè essendo un passaggio per riferimento la variabile viene modificata*)
readln
end.
Procedure <nome>(<parametri>:<tipo>;<parametri>:<tipo>;...);
var ...
begin
(*Corpo della procedura*)
end;
Come avete visto, la sintassi non è semplicissima, ma ci farete l'abitudine.
Facciamo un esempio pratico: la seguente procedura cambia il valore di alcune variabili globali, dichiarate all'esterno di essa:
(*...*)
var a,b,c,d:integer;
procedure Cambia_Valori;
begin
a:=b;
b:=c;
c:=d;
d:=a;
end;
Come avrete visto, la procedura non accetta nessun parametro (vedi parte iniziale), né, tantomeno, sono dichiarate variabili interne (tra poco sapremo cosa sono).
Semplicemente scambia i valori delle variabili globali a,b,c e d.
Il corpo della procedura è sempre racchiuso tra un begin e un end;.
Nella parte tra la dichiarazione della funzione e il corpo della stessa, c'è uno spazio dedicato alle variabili interne: esse servono solo ed esclusivamente allinterno della procedura per semplificare il calcolo e non sono accessibili al di fuori di essa, in quanto la memoria loro assegnata viene liberata al termine della funzione.
Il passaggio delle variabili può avvenire per indirizzo.
Si, ma cos'è il passaggio per indirizzo? Se si vuole modificare una variabile globale tramite una procedura, qualunque sia la variabile indicata come parametro, si usa un passaggio per indirizzo, che viene realizzato mediante, l'uso della parola "var" prima del parametro.
I passaggi di parametri altrimenti avvengono per valore, ossia il parametro assume il valore della variabile, che non viene modificata, poiché tutte le trasformazioni avvengono sul parametro.
Ecco un esempio di passaggi per valore e per indirizzo:
(*...*)
var f:integer;
procedure Esempio(x:integer); (*E' un passaggio per valore*)
begin
x:=2; (*Il parametro x viene settato a 2, ma questa istruzione è inutile, poichè alla fine della procedura il parametro viene distrutto*)
end;
procedure Example(var x:integer); (*E' un passaggio per indirizzo*)
begin
x:=2; (*La variabile passata a Example nella parentesi viene modificata, ossia viene copiato nell'indirizzo di memoria di x il valore 2*)
end;
begin (*INIZIO MAIN LINE, IL CORPO DEL PROGRAMMA)
f:=7;
writeln(f); (*Visualizza 7*)
Esempio(f);
writeln(f); (*Visualizza 7, non 2 come assegnato dalla procedura, perchè il parametro modificato viene distrutto e la variabile non viene modificata*)
Example(f);
writeln(f); (*Visualizza 2, perchè essendo un passaggio per riferimento la variabile viene modificata*)
readln
end.