Thread obsoleto Le basi della programmazione: Pascal

Perca

Utente Attivo
Autore del topic
22 Gennaio 2011
322
0
Miglior risposta
0
Pascal

1 IL LAVORO DEL PROGRAMMATORE

Le fasi di lavoro che si devono affrontare durante la programmazione, sono le seguenti.


editing del programma;
compilazione e link;
esecuzione.



La fase di editing è costituita dalla scrittura del programma mediante l’elaboratore; si ha la necessità dunque di uno strumento dalle caratteristiche tipiche di un elaboratore di testo che permetta di modificare facilmente ciò che è stato scritto, di copiare o di spostare gruppi di istruzioni da un punto all’altro, di salvare il lavoro su disco, di recuperare da disco programmi in precedenza scritti ed eventualmente inserirli in una certa posizione all’interno del documento su cui si sta lavorando.

La compilazione traduce il programma sorgente Pascal in programma oggetto scritto in linguaggio macchina e quindi eseguibile direttamente dall’elaboratore.
La fase compilazione permette di evidenziare gli errori di carattere sintattico fatti nello scrivere il programma; se sono presenti degli errori il programma oggetto non può essere prodotto e si deve tornare all’editing per correggerli. Le funzioni e le procedure le cui istruzioni non sono presenti nel programma sorgente devono essere ad esso collegate: questo è il compito della fase di link.
È il caso, per esempio, di clrscr dove sarà la direttiva uses crt che dice al sistema di collegare la libreria crt al programma.

Nella fase di esecuzione il programma oggetto è caricato in memoria centrale ed eseguito, si ha quindi la possibilità di verificare se il programma agirà esattamente come si desiderava, eventualmente, di ampliarlo e migliorarne l’efficienza tornando alla fase di editing.

2 STRUTTURA DI UN PROGRAMMA IN PASCAL

Il Pascal è un linguaggio di programmazione che presuppone uno schema logico con diagrammi
a blocchi. Per esempio: calcolare il perimetro di un triangolo equilatero.

Quali sono i dati;
Quali sono le formule da applicare;
Quale sarà il risultato.


Le parti fondamentali di un programma in Pascal sono tre:

PROGRAM …;
USES crt;
CONST …;
TYPE …;
VAR …;
PROCEDURE …;
FUNCTION …;
Begin
Istruzione 1;
Istruzione 2;
...
...
Istruzione N;
End.

3 INTESTAZIONE DI UN PROGRAMMA IN PASCAL

L’intestazione è formata da una sola istruzione:
PROGRAM nome_programma;

Si comincia utilizzando la parola riservata, (oppure key-word, parola riservata al Pascal, che noi
non possiamo ridefinire) "PROGRAM, seguito da uno spazio e quindi da un identificatore (cioe' una
parola di massimo 127 caratteri comprendente tutti i caratteri dell'alfabeto, maiuscoli e minuscoli,
tutte le cifre da 0 a 9, ed un unico carattere speciale, l'UNDERSCORE ( _ ). NB il primo carattere
deve essere per forza una lettera) che serve da spiegazione sommaria del programma.

4 DICHIARAZIONI DI UN PROGRAMMA IN PASCAL

Esaminiamo adesso quanto compare nella parte dichiarazioni, tenendo presente che uno o più
elementi tra quelli che compaiono sopra potrebbero non essere presenti in tutti i programmi.
Uses
USES …;
La clausola Uses può essere seguita da crt per la gestione del video, da printer per l’uso della
stampante e da graph per la grafica.

Const (Specifica quali saranno le costanti usate dal programma), la sintassi è:
CONST nome_costante=valore;
I nomi delle costanti seguono le stesse regole del nome del programma, quindi inizieranno con una
lettera e potranno contenere altre lettere o numeri e il simbolo di underscore ( _ ).
Nel caso in cui ci fossero più costanti la sintassi è:
CONST nome_costante1=valore1;
nome_costante2=valore2;


nome_costanteN=valoreN;

Type
Un tipo è un insieme di valori e di operazioni che possono essere svolte su quei valori. Nel
linguaggio Pascal ci sono tre categorie di tipi: elementari, strutturati e puntatori.
Saranno trattati solo i primi due.


TIPI


ELEMENTI STANDARD STRUTTURATI



Integer Real Char Array
Byte Single Boolean String
Shortint Double Record
Longint Extended File
Word Comp Set

Per quanto riguarda i tipi elementari standard numerici le seguenti tabelle mostrano gli intervalli e
la memoria occupata da ciascuno di essi:

TIPO INTERVALLO

INTEGER -32768 …. +32767
BYTE 0 …. 255
SHORTINT -128 …. 127
LONGINT -2147483648 …. 214748367
WORD 0 …. 65535

TIPO
INTERVALLO
(POTENZE DI 10)

IN BYTE
REAL -38 …. 38
SINGLE -45 …. 38
DOUBLE -324 …. 308
EXTENDED -4932 …. 4932
COMP 0 …. 18

Il tipo boolean è composto di due soli valori true e false, richiede un solo byte di memoria e
solitamente viene usato per rappresentare risultati di espressioni logiche.
Il tipo char è rappresentato dai singoli caratteri codificabili mediante il codice ASCII ed è formato
da 256 caratteri distinti che per essere indicati vanno racchiusi tra apici, occupa un byte di
memoria.
Passiamo adesso ad esaminare i tipi strutturati.

Il tipo array si utilizza quando si ha la necessità di trattare un insieme omogeneo di dati, la sintassi è
questa:
TYPE nome_tipo=array[1..n] of tipo

Questa dichiarazione permette di riservare in memoria centrale uno spazio strutturato.
Il tipo string è, per così dire una estensione del tipo char. Abbiamo già visto che questo permette di
memorizzare un singolo carattere, molto spesso però è comodo poter trattare come una sola unità
un insieme di caratteri alfanumerici; a questo scopo si possono utilizzare gli array di char, per
esempio
TYPE frase=array[1..99] of char;

oppure in maniera più comoda
TYPE frase=string[99];

In questo caso il massimo numero di elementi utilizzabili sarà 99, la lunghezza effettiva della stringa potrà essere minore e l’elemento in posizione 0 conterrà questo valore. La lunghezza massima di una stringa è 255.

Il tipo record è utile quando è necessario lavorare con una raccolta di informazioni, anche di tipo diverso, che riguarda un oggetto e si vuole poter accedere alle singole informazioni memorizzate;
un esempio è il record persona dichiarato nel prossimo paragrafo, in cui sono evidenziati cinque campi che individuano alcune proprietà delle persone, come cognome, nome, qualifica ecc.

Var

Le variabili sono dei valori che cambiano durante l'esecuzione del programma, e che possono
essere modificati. La sintassi è:
VAR identificatore: Tipovar;

Nel caso in cui vi fossero più variabili dello stesso tipo si può utilizzare la seguente sintassi:
VAR ident1,ident2,…,identN:Tipovar1;
ident3,…:Tipovar2;
ident4,ident5:Tipovar3;
….

Dove VAR e' la parola riservata che dichiara le variabili, ident il nome della variabile e tipovarX il
tipo della variabile (numerica intera, numerica reale, letterale... argomento trattato nelle lezioni
successive);
Il Pascal ha bisogno di aver dichiarato le variabili prima per tre motivi:
• Per determinare lo spazio in memoria centrale, necessario ad allocare (salvare) quella
particolare variabile;
• Determinare quali operatori la possono manipolare (argomento trattato nelle lezioni
successive);
• Evitare assegnazioni scorrette (es assegnare ad una variabile numerica un valore
alfanumerico).

Con le variabili e le costanti di tipo intero (integer, byte, shortint, … ) si possono effettuare le
seguenti operazioni:
Somma si indica con +
Differenza si indica con -
Prodotto si indica con *
Quoziente intero si indica con DIV
Resto intero si indica con MOD
Precedente si indica con PRED(var)
Successivo si indica con SUCC(var)

Con le variabili e le costanti di tipo reale (real, single, double, … ) si possono effettuare le seguenti
operazioni:
Somma si indica con +
Differenza si indica con -
Prodotto si indica con *
Quoziente si indica con /





Con le variabili di tipo boolean si possono effettuare le seguenti operazioni:
Congiunzione si indica con AND
Disgiunzione inclusiva si indica con OR
Negazione si indica con NOT

Con le variabili e le costanti di tipo carattere (char) sono utilizzabili due funzioni predefinite del
Pascal e cioè:
chr (parametro)
ord (parametro)

Nella funzione chr il parametro è un numero intero compreso tra 0 e 255, il risultato è il carattere
che ha come codice ASCII il valore del parametro.
Nella funzione ord il parametro è un carattere e il risultato è il numero del codice ASCII
corrispondente.
Anche per le variabili e le costanti di tipo stringa (string) sono a disposizione un buon numero di
procedure e funzioni predefinite che permettono di manipolarle in maniera abbastanza efficiente.
Esse sono:
delete(st, pos, num)
Questa procedura cancella num caratteri dalla stringa st, a partire dalla posizione pos. Se num +
pos supera la lunghezza della stringa, si cancellano solo i caratteri effettivamente presenti nella
stringa. Pos deve essere compreso tra 1 e 255, altrimenti si genera un errore in fase di esecuzione.
insert(oggetto, st, pos)
La procedura insert inserisce una sottostringa nella stringa corrente, in corrispondenza di una
posizione specificata. La stringa oggetto viene inserita all’interno della stringa st, a partire dalla
posizione pos. Se la stringa risultante supera in lunghezza la massima estensione dichiarata per la
stringa originale st, si ha la cancellazione dei caratteri in eccesso sulla destra.
str(valore, st)
Questa procedura converte un valore numerico valore in una variabile di tipo stringa st.
val(st, valore, codice)
La procedura val converte la stringa numerica st in un numero e memorizza il risultato in valore. Se
non si verifica alcun errore, il parametro codice assume il valore 0, altrimenti assume il valore della
posizione del primo carattere in st causa dell’errore. Codice conterrà quindi la posizione del primo
carattere di st che non è una cifra numerica.


copy(st, pos, num)
Questa funzione restituisce num caratteri della stringa st, a partire dalla posizione pos. Se pos è
maggiore della lunghezza della stringa, si genera un errore in fase di esecuzione.
concat o +
La funzione concat permette di concatenare più stringhe e il suo effetto è quello dell’operatore +.
Per questo motivo solitamente non viene utilizzata in quanto si preferisce +.
length(st)
Questa funzione restituisce un numero intero che rappresenta la lunghezza della stringa st
Per accedere ad un elemento di un array bisogna specificare il suo nome seguito dall’indice posto
tra parentesi quadre.
Per accedere ad un elemento di un record bisogna specificare il suo nome seguito da un punto e
poi scrivere l’identificatore del campo a cui si vuole accedere.

5 ISTRUZIONI DI ASSEGNAZIONE

Abbiamo già visto che, nel momento in cui si dichiarano le variabili, viene loro assegnato il nome e
il tipo. Nel blocco istruzioni viene dato loro anche un valore. Ci sono due modi per fare ciò,
mediante il simbolo :=
oppure usando l’istruzione
READ(variabile); oppure READLN(variabile);
La differenza tra le due forme è che read non manda a capo il cursore dopo l’introduzione del
dato mentre readln sì.
Nel primo caso il valore alla variabile viene assegnato “dall’interno” del programma, senza nessun
intervento da parte dell’utente. Alla sinistra del := ci deve essere il nome di una variabile, alla
destra ci potrà essere un valore ben preciso, un’altra variabile o una espressione che coinvolge più
variabili; in ogni caso l’operazione che si compie con quel simbolo è di trasferire il valore di quello
che sta a destra del := alla variabile che si trova a sinistra.
Per esempio:
lato:=25;
a:=lato;
area:=base*altezza/2;
Con la prima istruzione la variabile lato assume il valore 25, con la seconda il valore di lato diventa
anche quello di a, la terza calcola l’area di un triangolo e assegna il risultato alla variabile area.
Negli esempi fatti le variabili erano di tipo numerico (integer, real, ...), ovviamente possono essere
di tipo qualsiasi con la condizione che la variabile che sta a sinistra e la quantità che si trova a
destra del := siano dello stesso tipo.

L’istruzione read o readln assegnano anch’esse un valore alla variabile scritta tra parentesi ma
questa volta sarà l’utente che da tastiera (nella maggior parte dei casi) dovrà digitare un valore
che diventerà il valore di variabile, (assegnazione “dall’esterno”)
Se durante l’esecuzione di un programma è incontrata una read o readln questo è fermato e sul
video appare il cursore lampeggiante che indica all’utente di scrivere qualcosa che sarà
assegnato alla variabile. È evidente che questa indicazione è abbastanza oscura, perché non da
nessun aiuto su che cosa bisogna digitare. È quindi opportuno che ogni istruzione read o readln sia
preceduta da qualcosa che visualizzi un messaggio esplicativo dal dato che si deve introdurre.
L’istruzione che permette di fare ciò è:
WRITE(‘messaggio’); oppure WRITELN(‘messaggio’);
La differenza tra le due forme è esattamente quella vista per read e readln.
Si potrebbe allora scrivere
WRITE(‘Introdurre il cognome ‘);
READLN(cog);
Il messaggio racchiuso tra apici dell’istruzione writeln sarà visualizzato su video e spiega cosa
bisogna introdurre da tastiera, una stringa che rappresenta il cognome di una persona.
L’istruzione write serve anche a visualizzare (su video o su stampante) il valore delle variabili; in
questo caso tra parentesi va scritta la variabile senza gli apici. Riferendoci all’esempio in cui si
utilizzava il := scrivendo
WRITE(lato);
sul video comparirà 25.
Volendo stampare i valori delle variabili sulla stampante bisognerà premettere alle variabili il
termine lst. Per esempio:
WRITE(lst, variabili);
Una istruzione writeln senza variabili permette di lasciare una riga vuota.
WRITELN(num:6); scrive il numero ‘num’ allineandolo sulla destra di un gruppo sei caratteri a partire
dalla posizione corrente del cursore (se la variabile è reale la notazione usata sarà quella
scientifica).
WRITELN(num:6:2); scrive il numero reale ‘num’ in forma decimale allineandolo come detto sopra
ma con in più la scrittura di due sole cifre dopo la virgola.







6 ISTRUZIONI DI SELEZIONE

Si hanno due possibilità di utilizzare lo schema di selezione in Pascal, la prima è la seguente:
IF condizione THEN
begin
Istruzione 1;
Istruzione 2;


Istruzione N;
end
ELSE
begin
Istruzione 1;
Istruzione 2;


Istruzione N;
end;

La parte else può mancare e in tal caso l’end che nella forma completa non ha il punto e virgola
deve averlo.
Il termine condizione rappresenta una proposizione logica che quindi dovrà essere vera oppure
falsa. Se è vera saranno eseguite le istruzioni che seguono then comprese tra begin e end, se è
falsa saranno eseguite quelle che seguono else comprese sempre tra begin e end. Dopo l’else ci
potranno essere altri if .... then .... else.
Gli operatori che si possono usare nella condizione sono quelli di relazione:
> maggiore
< minore
= uguale
>= maggiore uguale
<= minore uguale
<> diverso
e quelli logici precedentemente introdotti:
NOT negazione
AND congiunzione (e)
OR disgiunzione inclusiva (o)

Le istruzioni di selezione possono essere annidate, cioè un’istruzione IF può contenerne altre.
La seconda possibilità è quella di utilizzare:

CASE espressione OF
Valore1:
begin
Istruzione 1;
Istruzione 2;


Istruzione N;
end;
Valore2:
begin
Istruzione 1;
Istruzione 2;


Istruzione N;
end;
Valore3:
begin
Istruzione 1;
Istruzione 2;


Istruzione N;
end;
ELSE
begin
Istruzione 1;
Istruzione 2;


Istruzione N;
end;
Anche in questo caso la parte else può mancare. L’espressione può essere di tipo intero o
carattere e valore1, valore2, valoreN possono avere la forma e il significato delle tabella
seguente:

FORMA SIGNIFICATO
1 Intero 1
1,2,3 Interi 1,2,3
1 … 6 Interi da 1 a 6
‘A’ … ‘C’ Caratteri da A a C
‘+’ Carattere +



In questa istruzione se, per esempio, espressione assume uno dei valori di valore1 verranno eseguite
le istruzioni comprese nel blocco corrispondente begin.. end e così via. Al posto delle istruzioni tra
begin e end è preferibile scrivere il nome di un sottoprogramma per rendere il tutto più leggibile. Le
istruzioni che seguono else vengono eseguite se espressione assume un valore che non rientra in
nessuno tra quelli elencati. In mancanza della parte else nelle condizioni precedenti si prosegue
con l’istruzione successiva al case....of.

7 ISTRUZIONI ITERATIVE

In Pascal sono a disposizione tre istruzioni che permettono di ripetere un gruppo di istruzioni, la
prima si può utilizzare quando si conosce a priori il numero di ripetizioni da effettuare, le altre due
non hanno questa limitazione e sono generalmente interscambiabili con lievi modifiche.

FOR variabile:=valore1 TO valore2 DO
begin
Istruzione 1;
Istruzione 2;


Istruzione N;
end;

Ad ogni esecuzione del ciclo for, la variabile si incrementa (se si usa to) o si decrementa (se si usa
downto) sempre di un’unità. La valutazione delle espressioni di controllo avviene una sola volta, in
fase di inizializzazione del ciclo. All’interno delle struttura for non deve esserci alcuna istruzione che
modifichi il valore della variabile di controllo.
Anche i cicli for possono essere “annidati” cioè un ciclo for può contenerne altri. Si tenga presente
che in questi casi i cicli verranno completati dal più interno al più esterno, nell’ordine inverso
rispetto a quello con cui sono stati scritti.

WHILE condizione DO
begin
Istruzione 1;
Istruzione 2;


Istruzione N;
end;

Questa struttura di controllo garantisce, per tutto il tempo in cui la condizione rimane vera, la
ripetizione delle istruzioni. Poiché, prima di eseguire le istruzioni, avviene il test sulla condizione, il
risultato di questa valutazione regola il numero di volte (zero o più) in cui le istruzioni verranno
eseguite. È fondamentale, per la corretta continuazione dell’esecuzione del programma, non

realizzare cicli infiniti. A tal fine, il programmatore deve apportare una modifica, all’interno del
corpo della struttura while, sul valore della condizione, in modo che, ad un certo momento, questa
diventi falsa.

REPEAT
begin
Istruzione 1;
Istruzione 2;


Istruzione N;
UNTIL condizione;
end;

Questa struttura garantisce l’esecuzione ripetuta di una o più istruzioni, fino a quando la
condizione rimane falsa. L’esecuzione delle istruzioni avviene almeno una volta,
indipendentemente dal valore iniziale della condizione di controllo, il cui test, infatti, viene
effettuato alla fine dell’esecuzione della struttura stessa. Anche in questo caso, è necessario
che all’interno delle istruzioni del ciclo, ce ne sia una che faccia diventare la condizione vera
affinché si possa uscire dal ciclo.

8 FUNZIONI E PROCEDURE PREDEFINITE.

Tratteremo solo alcune delle procedure e funzioni predefinite di uso più comune, per le altre si
consulti l’HELP del Turbo-Pascal.
clrscr;
Questa istruzione (che richiede uses crt) ha il semplice scopo di cancellare lo schermo portando il
cursore nell’angolo in alto a sinistra. Conviene utilizzarla per avere delle videate chiare in cui
appaiano soltanto i dati necessari.
gotoxy(c,r);
Questa procedura permette di posizionare il cursore in un punto qualsiasi dello schermo, c
rappresenta la colonna del video (di solito compresa tra 1 e 80) e r la riga (compresa tra 1 e 25). È
utilizzata per avere un pieno controllo sulla visualizzazione di tutto ciò che appare sullo schermo,
anche in questo caso si deve utilizzare uses crt
randomize
La procedura randomize inizializza il generatore di numeri casuali ed è comunemente usata con le
funzioni
random o random( num )
La funzione random (senza parametri) restituisce il valore di un numero casuale maggiore uguale a
zero e minore di uno.

La funzione random(num) restituisce un numero casuale maggiore uguale a zero e minore di num.
Sia num che il risultato sono di tipo intero.
abs(num)
La funzione abs restituisce il valore assoluto di num che può essere intero o reale, e dà un risultato
dello stesso tipo di num.
frac(num)
La funzione frac restituisce la parte frazionaria di num di tipo reale e dà un risultato che è di tipo
reale.
int(num)
La funzione int restituisce la parte intera di num, cioè il più grande numero intero minore o uguale a
num, se num≥0, altrimenti il più piccolo numero intero maggiore o uguale a num, se num≤0. Num
può essere intero o reale e il risultato è reale.
sqr(num)
La funzione sqr restituisce il quadrato di num che può essere. intero o reale mentre il risultato è
reale.
sqrt(num)
La funzione sqrt restituisce la radice quadrata di num che può essere intero o reale mentre il
risultato è reale.
round(num)
La funzione round restituisce il valore di num arrotondato all’intero più vicino, num deve essere di
tipo reale mentre il risultato è intero.
trunc(num)
La funzione trunc restituisce il valore intero di num, in accordo con le seguenti regole:
• se num≥0 allora trunc(num) è uguale al più grande intero minore o uguale a num;
• se num<0 allora trunc(num) è uguale al più piccolo intero maggiore o uguale a num.
keypressed
Questa funzione restituisce il valore booleano vero, se è stato premuto un tasto sulla tastiera,
altrimenti il valore booleano falso. Si utilizza di solito nella forma repeat until keypressed che ha lo
scopo di fermare l’esecuzione di un programma fino a che non si preme un tasto sulla tastiera.
readkey
La funzione readkey legge un carattere dalla tastiera.

9 CONSIDERAZIONI IN MERITO ALLA BUONA STESURA DI UN PROGRAMMA IN PASCAL.

Commenti: sono utili alla comprensione dei programmi (necessari soprattutto se essi sono complessi
e/o devono essere letti da persone diverse da chi ha scritto il programma); il compilatore non
prende in considerazione i commenti introdotti dal programmatore, essi potranno pertanto essere
inseriti ovunque purchè racchiusi tra parentesi graffe o tra ‘(*’ e ‘*)’.
Indentazione: per una più agevole lettura del programma è conveniente scriverlo con una serie di
opportune rientranze in modo simile al sommario di un libro che risulta suddiviso in capitoli,
paragrafi e sottoparagrafi. Ad esempio se un’istruzione IF contiene un ciclo FOR, il blocco delle
istruzioni del FOR verrà spostato verso destra rispetto alle istruzioni dell’IF, le quali andranno a loro
volta rientrate rispetto al corpo principale del programma.
Identificatori: dovranno dare un’idea di ciò che rappresentano in modo adeguatamente sintetico.
Fonte: varietytribe
 
Ultima modifica: