Pascal
Il Pascal è un linguaggio di programmazione molto semplice. È consigliato a chi si avvicina per la prima volta al mondo della programmazione.
Pascal | |
---|---|
Autore | Niklaus Wirth |
Data di origine | 1970 |
Utilizzo | generico, didattico |
Paradigmi | programmazione strutturata |
Tipizzazione | forte, statica |
Specifiche di linguaggio | Pascal user manual and Report |
Estensioni comuni | pp, p e pas |
Influenzato da | ALGOL |
Storia
modificaIl Pascal si basa sul linguaggio Algol e fu chiamato così in onore del filosofo e matematico Blaise Pascal.
Il linguaggio di programmazione fu elaborato da zero da Niklaus Wirth, il quale notò che il nuovo programma casa Microsoft, il Basic, era un linguaggio molto semplice ma non era in grado di risolvere i problemi più complessi.
Per questo nel 1970 la prima implementazione del linguaggio divenne operativa e nel 1973 raggiunse una discreta diffusione nel campo industriale dopo la pubblicazione del libro "Pascal user manual and Report".
Oggi questo linguaggio di programmazione è spesso utilizzato a scopo didattico in quanto, essendo un linguaggio estremamente espressivo, risulta molto adatto per coloro che si avvicinano per la prima volta al mondo della programmazione.
Sintassi
modificaIl Pascal è un linguaggio tanto semplice quanto complesso: possiede una rigida struttura di base che permette di dividere il codice del programma in tre parti: intestazione, dichiarazione, e corpo del programma.
L'intestazione
modificaL'intestazione è la prima parte del codice del programma e contiene la tipologia univoca del programma ( ovvero se quello che stiamo costruendo è un programma, una libreria a collegamento dinamico o un file header).
Questa è la sintassi:
<tipo> nome_programma;
dove <tipo> sta per program, library o unit. Una cosa che dobbiamo sottolineare che ogni riga di codice del Pascal deve terminare con un punto e virgola. Possiamo anche scrivere più istruzioni su un'unica riga, purché ogni istruzione singola termini con un punto e virgola. Ecco un esempio:
a:=12; b:=13; c:=34;
ciao:='hello world';
Queste sono istruzioni lecite.
La sezione delle dichiarazioni
modificaAbbiamo appurato che la prima parte del codice di un programma scritto in Pascal è l'intestazione mediante la sintassi program nome; (molto raramente useremo la sintassi library o unit).
Le righe di codice immediatamente successive sono quelle della dichiarazione delle variabili e delle costanti.
Per dichiarare una variabile usiamo la sintassi:
var nome, nome2, nome3, ......, nomeN:<tipo>;
Possiamo avere anche più dichiarazioni di variabili nella stessa sezione dichiarativa:
var nome, cognome: string;
var anno, mese, giorno:integer;
Come avrete avuto modo di osservare, le variabili devono essere dichiarate in base al loro tipo: questa suddivisione delle variabili in base alla loro tipologia permette non solo di risparmiare spazio sulla memoria centrale RAM ma anche di trovare le operazioni che si possono eseguire con la variabile (con una variabile intera sarà possibile eseguire somma, divisione, differenza, ecc.. ma queste operazioni non si potranno eseguire con una variabile di tipo stringa.
Ecco la tipologia delle variabili:
-integer: numeri interi relativi (-32768... +32767)
-longint: numeri interi relativi (-2147483648... +2147483647)
-real: numeri reali (11-12 cifre)
-double: numeri reali (15-16 cifre)
-extended: numeri reali (19-20 cifre)
-char: carattere
-string: stringa (più caratteri)
-boolean: variabile che può assumere solo valori TRUE o FALSE (vero o falso)
Vorrei sottolineare la differenza tra carattere e stringa: un carattere è una solo lettera o numero; più caratteri formano un stringa. Esempio: 'a' è un carattere, 'ciao' è una stringa.
La dichiarazione delle costanti, invece, è estremamente semplice: const nome =<valore>, nome2 =<valore>; Esempio: const nome = 'francesco', voto = 9;
Il corpo del programma
modificaSiamo finalmente arrivati alla parte del programma in cui bisogna inserire le istruzioni vere e proprie del programma.
Tutte queste istruzioni sono inserite fra BEGIN e END. Vediamo allora come si presenta il programma completo:
program mio_programma;
var a,b,c: integer;
begin
.....
end.
Il punto dopo END non va mai dimenticato.
Le istruzioni del corpo del programma
modificaOra passeremo le prossime lezioni ad analizzare le varie istruzioni che si possono inserire nella sezione del corpo del programma.
-I COMMENTI
I commenti sono delle linee di codice inserite dal programmatore e ignorate dal compilatore che sono utili per ricordare i meccanismi usati per la progettazione del software.
I commenti sono di due tipi:
-commenti su una riga
{ COMMENTO }
-commenti su più righe
(* commento *)
L'unica differenza sta nel fatto che i primi sono inseriti su un'unica riga mentre gli altri su più righe.
-ISTRUZIONI DI INPUT-OUTPUT
Sono il cuore di ogni linguaggio di programmazione. Permettono di leggere valori dalla tastiera o di stamparne altri (magari come risultato di una operazione di elaborazione matematica).
read (var); - permette di acquisire un valore che sarà inserito dalla tastiera e assegnato alla variabile var. Il cursore lampeggerà finché non sarà inserito un valore e se il valore acquisito non sarà consono al tipo della variabile, sarà mostrato un messaggio di errore.
readln (var); - è simile a read ma dopo l'aquisizione va a capo.
write (var); - stampa sullo schermo il valore della variabile var.
writeln (var); - è simile a write ma dopo aver stampato il messaggio va a capo.
I comandi write possono anche essere utilizzati per stampare dei messaggi preimpostati:
write('Inserisci il numero');
- stampa Inserisci il numero.
Nel caso delle istruzioni write e writeln possiamo usare un accorgimento in più: usando la sintassi write (var:n:y); dove n indica il numero di cifre da visualizzare e y il numero di cifre decimali da visualizzare.
-ISTRUZIONI DI ASSEGNAZIONE
var:=<valore>;
Le istruzioni di assegnazione servono per assegnare un valore ad una variabile. Se il valore non è consono con il tipo della variabile allora verrà segnalato un messaggio di errore. Il valore può essere anche un'espressione:
nome='arcibaldo';
america=1492;
area=b*h;
Nelle istruzioni di assegnazione che permettono un'espressione si usano dei particolari segni che indicano le operazioni fondamentali:
+ somma
- differenza
* moltiplicazione
/ divisione
Esempio: area =(b* h)/2; in questo caso si eseguirà in primis il calcolo tra parentesi poi il resto dell'espressione.
Le istruzioni condizionali
modificaLe istruzioni condizionali permettono di eseguire brandelli di codice in base a una scelta che si effettua in vari modi.
Una istruzione condizionale può essere di due tipi:
-ISTRUZIONE IF.... THEN.. ELSE...
Questa istruzione usa la seguente sintassi:
if (condizione) then
begin
//istruzioni se la condizione è vera
end
elseif (condizione) then
begin
//istruzioni da eseguire se la condizione è vera
end
else
begin
//istruzioni se la condizione è falsa
end;
In particolare gli end inclusi nelle istruzioni condizionali (tranne l'ultimo) non vogliono il punto e virgola.
Ecco la sintassi semplice:
if (condizione) then //istruzione su una sola riga;
oppure:
if (condizione) then
begin
//istruzioni se la condizione è vera
end
else //istruzione su una sola riga;
-L'ISTRUZIONE CASE... OF
L'istruzione CASE..OF si usa quando dobbiamo effettuare una scelta condizionata su un'unica variabile.
Ecco la sintassi:
case <var> of
<val1>: begin
//istruzioni se il valore corrisponde
end;
<val2>: begin
//istruzioni se il valore corrisponde
end;
.....
<valn>: begin
//istruzioni
end;
I cicli
modificaI cicli sono delle istruzioni che permettono di ripetere una serie di istruzioni finché non si verifica una istruzione o mentre se ne verifica un'altra. Abbiamo vari tipi di cicli:
-CICLO FOR
Il ciclo for permette di ripetere una serie di istruzioni un numero determinato di volte. Per determinare il numero di volte da ripetere si usa una variabile intera.
Ecco la sintassi:
for var:=valore to valore2 do
begin
//istruzioni
end;
-CICLO REPEAT.. UNTIL...
Il ciclo repeat.. until... permette di ripetere una serie di istruzioni finche si verifica una condizione.
Ecco la sintassi:
repeat
//istruzioni
until (condizione);
-CICLO WHILE..DO..
Il ciclo while... do.. è il ciclo più potente del Pascal e permette di ripetere una serie di istruzioni mentre una condizione è verificata.
while (condizione) do
begin
//istruzioni
end;
Vorrei sottolineare che quando si parla di cicli occorre essere prudenti in quanto in certe situazioni è possibile che si vengano a creare i cosiddetti cicli infiniti che derivano da un errore nel codice.
I vettori
modificaI vettori sono un insieme di variabili utili se dobbiamo, per esempio inserire i nomi di una classe. Sarebbe troppo lungo inserire una variabile per ogni alunno, per questo è possibile dichiarare insieme più variabili per mezzo di un'unica istruzione.
Ecco la sintassi:
var nome_vettore:array[1..100] of <tipo>;
Il nome dell'array è univoco, come quello delle variabili normali. La scritta 1..100 indica il numero di elementi che il vettore dovrà contenere. Le variabili del vettore saranno tutte dello stesso tipo (indicato dalla scritta <tipo>). Ogni variabile del vettore potrà essere richiamata mediante l'istruzione:
write(nome_vettore[12]);
In questo caso abbiamo banalmente preso in considerazione l'input video della variabile numero 12 del vettore in considerazione.
Per acquisire gli elementi del vettore noi utilizziamo un ciclo for e una variabile intera (in questo caso chiamata k). Ecco la sintassi completa:
k:=1;
for k:=1 to 100 do readln(nome_vettore[k]);
Grazie al ciclo for la variabile k avrà un valore crescente da 1 a 100 e permetterà di acquisire tutte le variabili. Per stamparle a video la sintassi è simile:
k:=1;
for k:=1 to 100 do writeln(nome_vettore[k]);
Procedure e funzioni
modificaCome in ogni altro linguaggio di programmazione, anche il Pascal dispone di alcune di rettive che permettono di richiamare delle righe di codice ogniqualvolta queste siano necessarie.
Il Pascal fa la distinzione tra funzioni e procedure: le funzioni permettono di darci come risultato finale un unico valore mentre le procedure più di uno. Una funzione potrebbe essere quella della radice quadrata di un numero.
PROCEDURE
Come è stato detto, le procedure permettono di stampare più di un risultato. Ecco la sintassi:
procedure nome(var a,b:tipo);
var c,d:tipo;
begin
//istruzioni
end;
I parametri (le variabili incluse nella parentesi tonda) sono molti importanti in quanto rappresentano i dati di input che la procedura deve accettare dal programma. Le variabili e le costanti dichiarate dopo i parametri permettono di svolgere calcoli (come la variabile k nei vettori).
Le procedure possono essere dichiarate o nella seziona del corpo del programma o anche prima della dichiarazione delle variabili. Per richiamare una procedura si usa la sintassi:
<surce lang = "pascal">nome_procedura (a, b);</pascal>
Al posto di a, b si possono mettere anche due variabili a caso (come c, d....) l'importante che siano nel numero e nel tipo indicato dai parametri della procedura.
LE FUNZIONI
A differenza delle procedure, le funzioni permettono di segnalarci un unico risultato. La sintassi è simile a quella delle procedure:
function nome(var1,var2:tipo):tipo;
var a,b:tipo;
begin
//istruzioni
end;
Come le procedure, le funzioni possono essere dichiarate sia prima che dopo la sezione del corpo del programma. Valgono le stesse cose dette per le procedure. La sintassi per richiamare una funzione è la seguente:
var1:=nome_funzione(a,b);
I File
modificaSappiamo benissimo che un file è un archivio digitale che contiene informazioni codificate a seconda del tipo di file.
Ebbene il Pascal permette di creare, aprire o modificare file attraverso delle semplici funzioni che adesso vi spiegheremo.
Innanzi tutto occorre dichiarare una variabile con cui si assegna il percorso del file. Ecco la sintassi:
var nome_var: file of <tipo>;
Il tipo della variabile indica il tipo di dati che si vogliono leggere o scrivere sul file.
Per prima cosa occorre aprire il file per mezzo del comando assign:
assign(nome_var,'file.ext');
Questa istruzione deve essere la prima subito dopo il begin iniziale. Il parametro 'file.ext' indica il file che vogliamo realmente aprire. .ext indica l'estensione del file (possiamo darle tutte le estensioni che vogliamo). È importante sottolineare che il file analizzato si troverà nella directory in cui il programma viene compilato. Per selezionare una cartella diversa dobbiamo semplicemente inserirla. Per esempio per indicare la cartella Programmi ecco la sintassi:
assign(nome_var,'C:\programmi\1.txt');
In questo modo si associa alla variabile nome_var il file indicato dopo.
Ora analizziamo le varie modalità di apertura di un file.
Il primo modo per aprire un file è l'apertura in input che si effettua mediante il comando:
reset(nome_var);
Il file associato con la variabile viene per mezzo della funzione assign viene aperto in sola lettura.
Il secondo modo per aprire un file è in output mediante la sintassi:
rewrite(nome_var);
Se il file non esiste verrà creato. Se invece il file è presente verrà sovrascritto.
L'ultimo modo per aprire un file è il seguente:
append(nome_var);
In questo caso il file verrà sempre aperto in output ma i dati non verranno sovrascritti ma semplicemente aggiunti dopo quelli già esistenti. Se il file non esiste verrà segnalato un messaggio d'errore.
Una volta aperto il file in input o in output possiamo usare le due istruzioni che ci permettono di leggere dati o scriverne di nuovi. Per leggere da un file aperto in input usiamo la funzione:
read(nome_var,var2);
In particolare questa funzione legge dal file associato a nome_var un valore che verrà associato alla variabile var2.
Per scrivere il contenuto di una variabile su un file usiamo la funzione:
write(nome_var,var2);
Alla fine delle operazioni sui file è bene chiudere il file aperto mediante l'istruzione:
close(nome_file);
Le librerie a collegamento dinamico
modificaAll'inizio del corso abbiamo parlato della sezione dell'intestazione in cui si inserisce la tipologia del software che vogliamo costruire. Fino ad ora abbiamo parlato solo di programmi, ma abbiamo anche detto che esistono anche librerie a collegemento dinamico e librerie statiche.
Le librerie a collegamento dinamico sono dei "contenitori" che archiviano una o più funzioni. Queste librerie possono essere collegate con più programmi contemporaneamente risparmiando spazio sulla memoria centrale.
Grazie alle librerie a collegamento dinamico possiamo evitare di inserire delle funzioni uguali in più programmi, in modo da risparmiare spazio sulla RAM.
Nel caso di programmi molto complessi, le dll (questa è l'estensione delle librerire a collegamento dinamico), sono molto utili.
Ecco la sintassi:
library nome;
procedure nome_funz; export;
var ........;
begin
//istruzioni;
end;
//si possono inserire quante procedure o funzioni vogliamo
exports nome_funz,.......;
begin
end.
Da notare che dopo il nome della procedura si inserisce l'opzione EXPORT. Alla fine tutti i nomi delle procedure vanno messi nella direttiva EXPORTS per essere esportate.
Per richiamare una dll in un programma usiamo la seguente sintassi:
program test_dll;
procedure nome_funz; external 'nome.dll';
begin
nome_funz;
end.