|
L'origine del linguaggio Pascal Il Pascal è un linguaggio di programmazione ad alto livello, cioè si avvicina di più all'inglese scritto e si allontana dal linguaggio macchina, inoltre ad ogni istruzione del codice sorgente corrispondono diverse istruzioni in codice binario (nei linguaggi a basso livello ad ogni istruzione del codice sorgente corrisponde una sola istruzione in codice binario).Fu progettato per elaboratori elettronici nel 1969 da Niklaus Wirth, docente presso il Politecnico di Zurigo. Esso prende il nome da Blaise Pascal, un matematico francese, che fu il primo ad inventare una macchina calcolatrice: la Pascalina. Il Pascal si è rivelato utile a livello didattico per l'insegnamento dei metodi di programmazione. Esso si diffuse dapprima negli ambienti scientifici ma successivamente, grazie alla sua semplicità si diffuse dappertutto. Oggi il linguaggio Pascal è poco usato per applicazioni professionali, a vantaggio di altri linguaggi più adatti a sfruttare le potenzialità del sistema operativo (C, C++, Visual Basic ecc.), ma è un ottimo strumento per iniziare a programmare data la sua semplicità.
La struttura di base di un programma scritto in Pascal è costituita da 5 elementi:
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.
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; 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 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. Pur tuttavia la riga dell'intestazione può essere omessa, cioè si può cominciare a scrivere il programma direttamente dalla riga delle variabili.
Se si vogliono inserire degli spazi all'interno del nome del programma si possono usare le lineette (_):
Program hfdjdh_kjeijie_ijeiie; ...
Il nome del programma non viene letto dal compilatore, quindi può essere formato anche da un insieme di lettere alla rinfusa. In questo caso ho usato le lineette per simulare gli spazi e l'intestazione è corretta.
Le parole riservate sono parole che non possono esser usate né come nome di un programma, né come nome di una variabile, siccome sono istruzioni che dichiarano qualcosa. Alcune parole riservate sono:
Esempio:
Program end; <-------1° ERRORE var If:...; <-------2° ERRORE ...
In questo esempio vi sono 2 errori: ho usato END che è una parola riservata come nome del programma (END dichiara la fine del codice sorgente), ed ho usato IF che pure è una parola riservata come nome di una variabile (IF specifica una condizione).
Torna su é 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:
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 seguante: ... var identificatore, ..., ..., identificatore: tipo1; var identificatore, ..., ..., identificatore: tipo2; ...
I principali tipi di variabili sono:
Quando si deve assegnare un valore ad una variabile (che è stata già dichiarata, altrimenti viene visualizzato un messaggio di errore), si segue la seguente sintassi: ... identificatore:=valore variabile; ...
Per esempio se la variabile è di tipo numerico e il suo identificatore è x si scriverà: ... x:=1234; ...
Invece se la variabile è di tipo testuale e il suo identificatore è y si scriverà: ... y:='parola'; ...
Gli apici (' ') identificano le variabili di tipo testuale STRING o CHAR.
Se in un programma non c'è bisogno di variabili la riga che le dichiara può anche essere omessa.
Torna su é Le costanti, al contrario delle variabili, sono contenitori di dati fissi. Esse non variano durante l'esecuzione del programma. In Pascal vengono elencate prima della riga delle variabili tramite la seguente sintassi: ... CONST nomecostante=valore; ...
Esempio - Struttura base di un programma che pone pigreco come costante:
Program areacerchio; intestazione
const pigreco=3.14;
riga delle
costanti ... corpo del programma ...
readln;
Se in un programma non c'è bisogno di costanti la riga che le dichiara può anche essere omessa.
Torna su é Le librerie sono un insieme di procedure e funzioni, racchiuse in un unico file, che potrebbero servire al programmatore per non ripetere un serie di istruzioni o per svolgere un'operazione che normalmente richiederebbe molto codice. La dichiarazione di una libreria non è obbligatoria, ma diventa indispensabile quando si vuole usare una procedure o una funzione presente nella libreria stessa. In Pascal le librerie sono chiamate UNIT e vengono eseguite creando un file con estensione .tpu. Le principali librerie sono:
-CRT -DOS -GRAPH -OVERLAY -PRINTER -SYSTEM
Per dichiarare un libreria, si scrive immediatamente sotto l'intestazione ... USES nomelibreria; ...
Se le librerie sono più di una vengono separate da una virgola. Esempio:
Program esempio; uses crt,graph; dichiarazione delle librerie CRT e GRAPH var a,x,y:integer; ...
La procedura CLRSCR Nella libreria CRT vi è una particolare procedura che nel codice sorgente di un programma può essere richiamata con CLRSCR (dall'ingl.: CLeaR SCReen = pulisci schermo). Questa procedura permette di eseguire un programma su schermo "pulito" da qualsiasi scritta relativa ad esecuzioni precedenti; è usata per avere una migliore visualizzazione di ciò che deve apparire a video. Il comando va inserito nel punto esatto del programma in cui si vuole che lo schermo sia "pulito" da ogni scritta (generalmente dopo il BEGIN) seguito da un punto e virgola obbligatorio. Quindi siccome si vuole utilizzare una procedura della libreria CRT, per il suo corretto funzionamento, è obbligatoria la riga USES CRT; per dichiarare la libreria stessa. Esempio:
Program esempio; uses CRT; dichiarazione della libreria CRT - è una riga OBBLIGATORIA begin CLRSCR; punto e virgola OBBLIGATORIO writeln('Un saluto a tutti i programmatori!'); readln; end.
Questo programma visualizza sullo schermo pulito da ulteriori scritte o testi relative ad esecuzioni precedenti, il messaggio "Un saluto a tutti i programmatori!". Il programma scritto senza il comando CLRSCR, avrebbe stampato a video lo stesso messaggio, ma con altri testi che lo precedevano (generalmente gli altri testi possono essere anche informazioni relative al compilatore; essi non influiscono sul programma corrente quindi anche se non si usa il comando CLRSCR il programma viene eseguito lo stesso, però non si ha una buona visualizzazione dei dati a video). Se CLRSCR fosse stato posto dopo la riga writeln in questo modo:
Program esempio; uses CRT; begin writeln('Un saluto a tutti i programmatori!'); CLRSCR; readln; end.
il compilatore prima avrebbe stampato a video il messaggio "Un saluto a tutti i programmatori!" e poi avrebbe pulito lo schermo; di conseguenza non avrebbe visualizzato niente. Quindi è importante determinare il punto esatto in cui inserire il comando CLRSCR.
Torna su é Il corpo del programma è la parte del programma stesso che contiene le tutte le istruzioni necessarie al funzionamento dell'algoritmo. Esso è compreso tra le righe BEGIN (dall'ingl.: inizio) e END (dall'ingl.: fine). In ogni programma possono anche esserci più BEGIN "chiusi" da un relativi END (questi casi saranno esaminati nei paragrafi successivi), infatti il numero dei BEGIN deve sempre corrispondere al numero degli END altrimenti al momento della compilazione si visualizzerà un messaggio di errore. Esempi:
Program n1; begin write('CIAO'); readln; end.
Program n2; begin write('CIAO'); readln; <-- ERRORE
Il programma n1 non fa altro che stampare a video, cioè scrivere sullo schermo, la scritta CIAO. La riga delle variabili (var ...) è stata omessa, in quanto non è serve alcuna variabile. Il corpo del programma è contenuto tra BEGIN ed END ed è costituito dalla sola riga: WRITE('CAIO');. Se il programma fosse stato scritto senza la riga end. (come l'esempio n2) all'esecuzione si sarebbe visualizzato un messaggio di errore, in quanto il numero dei BEGIN (1) non corrisponde col numero degli END (0).
I commenti spiegano il funzionamento di un programma. Per inserire un commento all'interno di un programma si può usare una delle 2 seguenti sintassi:
(*tra parentesi tonde e asterischi*) {tra parentesi graffe}
Esempio (con il programma precedente):
Program esempio; begin (*inizio del programma*) write('CIAO'); {riga che stampa CIAO} readln; end. {fine del programma}
Il compilatore eseguirà questo programma non leggendo le righe di commento, quindi i commenti non servono ai fini del linguaggio macchina, ma sono solo un aiuto al programmatore per comprendere meglio il codice sorgente, specialmente quando questo è costituito da numerose righe.
Torna su é L'istruzione WRITE Le istruzioni permettono al compilatore di eseguire determinate operazioni. Il linguaggio Pascal mette a disposizione del programmatore molteplici istruzioni per creare un programma. Una di queste è l'istruzione WRITE (dall'ingl.: scrivi), che è la più usata per comunicare con l'utente. Quest'istruzione permette di stampare a video, cioè di scrivere sullo schermo, qualsiasi scritta indicata fra gli apici (apostrofi). La sua sintassi è: ... WRITE('qui può essere inserito qualsiasi testo da stampare a video'); ...
Per esempio, se si vuole creare un programma che stampi a video la scritta "CIAO io sono un terrestre", si dovrà scrivere il seguente codice:
Program esempio; begin write('CIAO io sono un terreste'); readln; end.
Gli apici indicano l'inizio e la fine del testo da stampare a video. Se il testo tra gli apici contiene degli apostrofi (cioè altri apici), al momento dell'esecuzione verrà visualizzato un messaggio di errore, perché il compilatore non "capisce" dove è l'inizio e la fine del testo. Per rimediare a questo inconveniente, laddove c'è l'apostrofo, si usa il doppio apice (''). Ad esempio se si vuole stampare a video la scritta "Sull'isola che non c'è non c'è nessuno" il programma sarà (in rosso ho segnato i doppi apici):
Program esempio; begin write('Sull''isola che non c''è non c''è nessuno'); readln; end.
Per stampare a video una variabile gli apici non si mettono, seguendo questa sintassi: ... WRITE(nomedellavariabile); ...
Se di vuole visualizzare una variabile che è un numero reale l'istruzione WRITE stamperà a video la variabile in forma esponenziale; quindi si deve in qualche modo formattare l'output, cioè dare una forma più leggibile all'output stesso, specificando nell'istruzione WRITE il numero delle cifre decimali da visualizzare. Sintassi: ... WRITE(nomevariabile:0:numerocifredecimali); ...
Esempio: ... a:=13.567; b:=5465.6868; WRITE(a:0:2); WRITE(b:0:1); ...
La prima istruzione WRITE stamperà a video il numero a (13.567) arrotondato a 2 cifre decimali: 13.57. La seconda istruzione WRITE, invece, stamperà a video il numero b (5465.6868) arrotondato a 1 cifra decimale: 5465.7.
Per stampare a video una variabile e un testo nella stessa istruzione WRITE, la sintassi è la seguente: ... WRITE('Testo ',nomedellavariabile); ...
oppure:
... WRITE(nomedellavariabile,'Testo '); ...
Esempio riassuntivo:
Torna su é L'istruzione READ Un altra istruzione fondamentale per scrivere un programma in Pascal è READ (dall'ingl.: leggi). Mentre WRITE si occupa di comunicare con l'utente (il quale deve inserire o deve avere in output dei dati), READ serve per leggere i dati inseriti dall'utente assegnandoli alle variabili indicate. Sintassi: ... READ(nomevariabile); ...
Esempio:
Program esempio; var a:integer; begin write('Inserire un numero intero '); read(a); readln; end.
Nell'esempio l'istruzione WRITE si occupa di comunicare all'utente che deve inserire un numero intero, tramite il messaggio: Inserire un numero intero. L'istruzione READ, invece, attende l'inserimento del numero (da tastiera) e assegna il suo valore alla variabile a (precedentemente dichiarata nella riga delle variabili var a:integer).
L'istruzione READ usata senza parametri serve per aspettare che si prema un tasto per poi passare all'istruzione successiva. Sintassi: ... READ; ...
Il compilatore, infatti, giunto alla riga "READ;" aspetta che sia inserito un valore da tastiera, ma poi non avendo la variabile di destinazione in cui salvare il valore, passa all'operazione successiva.
Quando si devono inserire più dati si può ripetere l'istruzione READ per ogni dato: ... write('Inserire il primo numero '); read(a); write('Inserire il secondo numero '); read(b); write('Inserire il terzo numero'); read(c); ...
Per velocizzare quest'operazione e diminuire anche la lunghezza del codice sorgente, si può usare READ una sola volta: ... write('Inserire il primo, il secondo e il terzo numero '); read(a,b,c); ...
Si usa un solo READ separando con una virgola le tre variabili da leggere. Naturalmente, al momento dell'esecuzione, ogni numero deve essere seguito da un INVIO per essere letto. Al terzo numero inserito, e quindi al terzo INVIO, l'istruzione READ termina il suo compito e il compilatore passa ad eseguire le righe successive.
Torna su é Le istruzioni WRITELN e READLN Le istruzioni WRITELN e READLN (LN deriva dall'inglese line: linea) permettono di svolgere un'operazione su una nuova riga, cioè spostano il cursore all'inizio della riga successiva ed eseguono l'operazione. Le sintassi sono: ... WRITELN('testo da stampare'); ... READLN(nomevariabile); ...
L'istruzione WRITELN permette di scrivere da capo il testo inserito negli apici. Quest'ultima usata senza testo tra apici, in questo modo: ... WRITELN; ... permette di inserire un'interlinea vuota.
L'istruzione READLN permette la lettura di una variabile in una nuova riga.
Esempio riassuntivo:
Program somma;
var a,b,c:integer; a:=3; {assegna 3 alla variabile a} write(a); {stampa a video il valore di a (3)} b:=4; {assegna 4 alla variabile b} write(' ',b); {stampa a video uno spazio e il valore di b (4)}
c:=a+b;
{assegna la somma di
a e b alla variabile
c}
readln; {
e il valore di c
(7)}
Questo programma stampa a video:
3
4 Somma=7 Come si vede il risultato è poco leggibile. Utilizzando WRITELN e modificando leggermente le stringhe fra gli apici si avrà:
Program somma;
var a,b,c:integer; a:=3; {assegna 3 alla variabile a} writeln('a = ',a); {stampa a video il valore di a (3)} b:=4; {assegna 4 alla variabile b} writeln('b = ',b); {stampa a video uno spazio e il valore di b (4)} c:=a+b; {assegna la somma di a e b alla variabile c}
writeln;
{riga vuota}
readln;
{
e il valore di c (7)}
Questo nuovo programma stamperà a video, in modo più leggibile:
a
= 3
Torna su é 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.
La struttura di iterazione, o di ripetizione, consiste in un ciclo con una condizione alla fine (iterazione postcondizionale) o all'inizio (iterazione precondizionale).
Se il ciclo è postcondizionale 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 cicla (cioè si ripete) per falso.
Se il ciclo è precondizionale 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 cicla (cioè 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 (ES. 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.
Torna su é La struttura di selezione con IF...THEN...ELSE La struttura di selezione, o alternativa, in Pascal viene codificata con le istruzioni IF...THEN...ELSE (dall'ingl.: se...allora...altrimenti): ... IF condizione THEN istruzione1 <-- senza punto e virgola ELSE istruzione2; ...
Cioè: se la condizione espressa dopo IF sarà vera, il programma eseguirà l'istruzione1, altrimenti (cioè se la condizione sarà falsa) eseguirà l'istruzione2 introdotta da ELSE. Se il programma eseguirà l'istruzione1, automaticamente l'istruzione2 non verrà eseguita, e viceversa. E' molto importante non mettere il punto e virgola prima della riga dell'ELSE, altrimenti al momento dell'esecuzione si visualizzerà un messaggio di errore. Quando non si deve eseguire alcuna operazione nel caso in cui la condizione risulti falsa, la riga dell'ELSE può essere esclusa: ... IF condizione THEN istruzione; <-- con punto e virgola ... Cioè: se la condizione espressa dopo IF sarà vera, il programma eseguirà l'istruzione1, altrimenti (cioè se la condizione sarà falsa) passerà alle istruzioni successive.
Esempio di programma con l'istruzione IF...THEN...ELSE:
Program esempio;
readln; Questo programma, richiede l'inserimento di 2 numeri; poi verifica la condizione (a>b); se essa è vera (cioè se a è maggiore di b) stampa a video "Il primo numero è maggiore del secondo", altrimenti, se è falsa (cioè se a non è maggiore di b) stampa a video "Il secondo numero è maggiore del primo". Se i numeri inseriti sono uguali verrà stampato a video "Secondo numero maggiore del primo". Questo inaspettato comportamento del compilatore è normale; infatti, se la condizione è falsa il compilatore esegue l'istruzione introdotta da ELSE senza verificare un'ulteriore condizione (che in questo caso sarebbe a=b). Ad esempio, se i 2 numeri fossero 33 e 33, il compilatore verificherebbe la condizione a>b, che in questo è falsa perché 33 non è maggiore di 33, allora eseguirebbe l'istruzione introdotta da ELSE stampando a video "Il secondo numero è maggiore del primo". Il programma completo sarebbe:
Program esempio; if a=b then writeln('I numeri sono uguali') {ulteriore condizione} else writeln('Il secondo numero è maggiore del primo');
readln;
Esempio con variabile di tipo STRING:
Program esempio; Una variabile di tipo STRING è testuale. In questo caso lo è la variabile a. Questo programma, dopo aver letto la variabile a (inserita da tastiera rispondendo alla domanda "Sei maschio?" con si o qualche altra scritta), verifica la condizione (a='si'); se essa è vera (cioè se a è uguale a si con le lettere minuscole), stampa a video "INDIVIDUO MASCHILE", altrimenti, se è falsa (cioè se a è uguale a qualsiasi altra scritta), stampa a video "INDIVIDUO FEMMINILE".
Quando nell'istruzione IF...THEN...ELSE le parole THEN e ELSE introducono più operazioni, queste vengono racchiuse tra un altro BEGIN e un altro END; in modo da organizzare meglio l'esecuzione del programma; a volte, infatti, il malfunzionamento del programma dipende proprio da questo fattore. Esempio:
Program esempio; Questo programma dopo aver letto le due variabili inserite da tastiera (a e b), verifica la condizione (a=b); se essa è vera esegue la moltiplicazione dei numeri (c:=a*b) e stampa a video il messaggio "Numeri UGUALI - Prodotto=prodottodeinumeri"; se essa è falsa esegue la somma dei numeri e stampa a video il messaggio "Numeri DIVERSI - Somma=sommadeinumeri". Il primo END (10ª riga) non deve finire né con un punto (perché non è lì che termina il programma), né con un punto e virgola, perché dopo di esso vi è l'istruzione ELSE che non deve essere mai preceduta da un punto e virgola.
L'istruzione IF...THEN...ELSE permette solo una doppia selezione, cioè solo 2 scelte: vero o falso. Per la scelta multipla si usa la struttura CASE...OF spiegata di seguito.
Torna su é
Esempio1: creare un programma che verifichi se un numero inserito da tastiera è compreso tra 100 e 1000, tramite l'uso dell'operatore logico AND.
Program esempio1; uses CRT; var a:integer; begin clrscr; write('Inserisci un numero: '); readln(a); if (a>=100) AND (a<=1000) then writeln('Il numero è compreso tra 100 e 1000') else writeln('Il numero non è compreso tra 100 e 1000'); readln; end.
Questo programma dopo aver ricevuto da tastiera un numero (a) verifica se è maggiore o uguale a 100 (a>=100) E se è minore o uguale a 1000 ( | ||||||||||||||||||||||||||||