Pascal/Librerie e funzioni predefinite
Una libreria non è altro che un file contenente varie procedure, funzioni e/o costanti che possono essere utilizzate una volta che il file è stato incluso all'interno del programma. Questo da un punto di vista teorico è molto utile perché permette di avere programmi molto brevi, ma da un punto di vista di sviluppo è piuttosto negativo, poiché una volta compilati anche programmi molto semplici possono essere estremamente "grandi" in dimensioni fisiche (ovvero in kByte).
Il Turbo Pascal utilizza come libreria standard Turbo.tpl. Questa contiene tutte le funzioni di base. Non viene mai invocata, perché lo fa in automatico il compilatore durante la compilazione. Tuttavia, come abbiamo già visto, esistono molte altre librerie.
Dall'ultimo programma osservato si nota come deve essere fatta la dichiarazione delle librerie:
uses nomelibreria1, nomelibreria2, ...;
uses è una parola riservata, quindi non può essere usata come nome di variabile o funzione. La dichiarazione delle librerie deve precedere quella delle variabili.
Le librerie e le rispettive funzioni analizzate in questa pagina sono chiamate "librerie predefinite" in quanto sono di norma distribuite di default dal compliatore in uso. È infatti possibile anche creare librerie personalizzate per poter agevolare il proprio lavoro in più programmi differenti.
Crt
modificaLa libreria di gran lunga più usata è sicuramente crt, con tutte le funzioni relative all'estetica in ambito DOS. Ma non abbiamo ancora affrontato il problema dell'utilizzo di librerie all'interno dei nostri programmi.
Probabilmente avrete notato che eseguendo i programmi implementati finora l'esecuzione terminava istantaneamente senza l'aggiunga del readln
finale, non appena il risultato veniva mostrato sullo schermo. Questo può essere abbastanza scomodo. Ma anche per questi problemi aiuta la libreria CRT, con la funzione readkey()
che, come abbiamo già visto, permette di leggere il primo carattere che viene immesso da tastiera.
Funzioni di crt
modificaclrscr;
Questa funzione permette di pulire lo schermo e di posizionare il cursore in alto a sinistra in posizione (1,1)
cursoroff; cursoron;
Queste due funzioni permettono di spegnere o accendere il cursore.
gotoXY(posX, posY);
Questa procedura permette di posizionare il cursore in una posizione precisa sullo schermo.
sound(hz); nosound;
La funzione sound fa emettere alla macchina un suono alla frequenza hz. Per fermare questo suono bisogna assolutamente utilizzare la procedura nosound
delay(time);
Questa funzione fa sì che il sistema si fermi in pausa per un certo numero di millisecondi definito da time. L'uso della procedura delay
è tipicamente usata quando si fa uso di suoni. La struttura d'uso generalmente è la seguente:
sound(440); delay(1000); nosound;
Il risultato è un LA di durata un secondo. La funzione delay() è però basata sul clock del processore per calcolare il tempo, quando è stato creato il Pascal ovviamente i processori non avevano la potenza di oggi. La funzione delay() è quindi difficile da controllare ma se si vogliono ottenere ritardi definiti con bassa precisione cronometrica si possono inserire più delay() di seguito o sfruttare i cicli.
keypressed
Questa funzione è di tipo boolean, inizialmente è false e restituisce true appena l'utente preme un tasto. Viene spesso usata con il ciclo di tipo repeat... until:
repeat ... ... until keypressed;
in questo modo le istruzioni vengono ripetute fino a quando l'utente non preme un tasto.
readkey
Funzione che permette di leggere un carattere inserito da tastiera senza visualizzarlo. Restituisce un valore di tipo char. Per recuperare il valore letto si utilizza la notazione:
x:=readkey;
Se si utilizza dopo "keypressed", si legge direttamente il carattere premuto per fare diventare "keypressed" false. Esempio:
repeat ... ... until keypressed; x:=readkey;
a questo punto l'utente ha premuto un tasto, con il quale è uscito dal ciclo e ha assegnato il carattere char alla variabile X.
textcolor(numero); textbackground(numero);
Permettono di cambiare colore al testo e allo sfondo rispettivamente. Il codice di colore può anche essere il nome in inglese del colore. Questo perché nella libreria crt sono definite anche alcune costanti fra cui proprio quelle relative ai colori. Fra l'altro si può utilizzare anche la costante blink, per creare testo intermittente. Questo uso deve essere fatto così:
textcolor(white+blink);
Tuttavia, se per compilare il programma si usa Turbo Pascal, usando la unit crt quando viene compilato il programma, potrebbe comparire l'errore Runtime Error 200: divide by 0 pur senza che vi sia alcuna divisione per 0 all'interno del programma. Questo è dovuto a un problema d'incompatibilità, che non si verifica però se si usa un altro compilatore.
Tabella: le frequenze delle note
modificaNota | Frequenza (Hz) | Formula (Hz) |
---|---|---|
Do | 262 | |
Do#/Reb | 277 | |
Re | 294 | |
Re#/Mib | 311 | |
Mi | 330 | |
Fa | 349 | |
Fa#/Solb | 370 | |
Sol | 392 | |
Sol#/Lab | 415 | |
La | 440 | |
La#/Sib | 466 | |
Si | 494 |
La frequenza di riferimento è quella del La, ovvero 440 Hz. Per ottenere le altre ottave basta raddoppiare o dimezzare le frequenze della nota corrispondente di questa ottava centrale.
Graph
modificagraph è una libreria che fornisce la possibilità di integrare la grafica nelle applicazioni Pascal.
Funzioni di graph
modificaPrima di iniziare a disegnare, è necessario entrare in modalità grafica tramite le funzioni:
scheda := detect; initgraph(scheda, modo, percorso); es: initgraph(scheda,triangolo,'c:\FPC');
dove scheda e modo sono due variabili da dichiarare come integer nell'intestazione del programma. La funzione detect
ricerca la scheda grafica in uso e restituisce il valore numerico ad essa associato; initgraph
avvia la modalità grafica utilizzando la scheda identificata dal valore numerico di scheda
e attribuisce alla variabile modo
la modalità grafica selezionata automaticamente da Pascal; percorso
è una stringa che identifica il percorso nel quale sono presenti i driver della scheda grafica: normalmente è sufficiente indicare il percorso di installazione del compilatore, ad esempio C:\TP per Turbo Pascal e C:\FPC per Free Pascal.
Quando la modalità grafica viene attivata, viene aperta una finestra aggiuntiva che sarà la schermata di output delle funzioni grafiche. Per chiuderla, usiamo la funzione
closegraph;
Per usare i colori abbiamo a disposizione le funzioni:
setcolor(colore) {imposta il colore di primo piano}
Per identificare un colore possiamo usare un numero da 0 a getmaxcolor
(è una funzione che restituisce il numero massimo di colore disponibile ) oppure le costanti red, white, black, ecc...
Un altro concetto importante è quello di puntatore attivo, cioè la posizione nel quale si trova il puntatore grafico. Quando vengono effettuati dei disegni di punti e linee, viene spostato il puntatore attivo in una posizione particolare.
Vediamo ora una serie di funzioni di disegno:
putpixel(x, y, colore)
Traccia un punto di coordinate x, y e del colore scelto e sposta in x, y il puntatore attivo.
getpixel(x,y)
Restituisce il colore del pixel in posizione x, y.
moveto(x,y)
Sposta il puntatore attivo nella posizione x,y.
GetX GetY
Restituiscono le coordinate del puntatore attivo.
GetMaxX GetMaxY
restituiscono i valori massimi della x e della y (ovvero le dimensioni in pixel della finestra di output).
line(x1, y1, x2, y2)
Traccia una linea dal punto x1, y1 al punto x2, y2. Sposta il puntatore attivo su x2, y2.
linerel(dx, dy)
Traccia una linea partendo dal puntatore attivo fino alla posizione x+dx e y+dy (dove x e y sono le coordinate del puntatore).
lineto(x, y)
Traccia una linea dal puntatore attivo al punto di coordinate x,y.
circle(x, y, r)
Disegna una circonferenza di centro x, y e di raggio r. Sposta il puntatore attivo su x, y.
arc(x,y, ang1, ang2, r)
Disegna un arco di circonferenza di centro x, y e di raggio r a partire dall'angolo di gradi ang1 fino ad ang2. I gradi sono contati in senso antiorario a partire dalle ore 3. Sposta il puntatore attivo su x, y.
ellipse(x,y,ang1, ang2, rx, ry)
Disegna un arco di ellisse di centro x, y tra gli angoli ang1 e ang2 (per una ellisse completa usare i valori 0 e 359) con il raggio orizzontale rx e raggio verticale ry. Sposta il puntatore attivo su x, y.
{Questo programma disegna un triangolo applicando
a ogni vertice una circonferenza di raggio 50 px}
program triangolo; {consiglio di cambiare il nome in program in quanto è uguale al nome della variabile e può causare problemi}
uses crt,graph;
var triangolo,modo:smallint;
x,y,x1,y1,x2,y2:longint;
e:boolean;
begin
repeat
clrscr;
textcolor(10);
gotoxy(2,5); writeln('Per uscire dal programma premere "e"');
delay(2000);
clrscr;
textcolor(11);
gotoxy(2,2);writeln('PROGRAMMA DI DISEGNO MATEMATICO');
gotoxy(2,3);writeln('per una migliore visualizzazione mantenre le "y" sotto 800');
textcolor(yellow);
gotoxy(3,4);writeln('inserire i dati richiesti:');
textcolor(11);
write('x:_'); readln(x);
write('y:_'); readln(y);
write('x1:_'); readln(x1);
write('y1:_'); readln(y1);
write('x2:_'); readln(x2);
write('y2:_'); readln(y2);
{questa sezione serve in caso che il limite del range delle y venga superato
e quindo lo diminuisce un poco}
if y>=1000 then
begin
y:=y-400;
readln(y);
end;
if y2>=1000 then
begin
y2:=y2-400;
readln(y2);
end;
if y1>=1000 then
begin
y1:=y1-400;
readln(y1);
end;
triangolo:=detect; {sezione di inizializzazione della grafica }
initgraph(triangolo,modo,'');
{da qui in poi si entra nella sezione grafica: setcolor imposta il colore di
ciò che si vuole disegnare}
setcolor(yellow);
putpixel(x,y,12); {putpixel sposta il puntatore attivo in una determinata
posizione x,y in questo caso putpixel(x,y,colore del punto}
line(x,y,x1,y1); {disegna una linea dal puntatore attivo a un punto di
coordinate x1,y1}
setcolor(red);
putpixel(x1,y1,11);
line(x1,y1,x2,y2);
setcolor(green);
putpixel(x2,x2,10);
line(x2,y2,x,y);
setcolor(15);
circle(x,y,50); {diegna una circonferenza di centro x,y e di raggio 50}
circle(x1,y1,50);
circle(x2,y2,50);
readln;
closegraph; {sezione obbligatoria indica quando termina l'eseguzione grafica}
readln;
until e;
end.
Graph3
modificaUn'altra libreria molto usata è graph3 che permette l'utilizzo della grafica delle versioni di Turbo Pascal 3.xx, e tramite semplici comandi si riesce a disegnare facilmente punti, linee e altre forme geometriche. Questa libreria fornisce ovviamente meno funzionalità della sua pronipote graph, ma non richiede l'uso di una scheda grafica. L'utilizzo di questa libreria sostituisce alcune funzioni della libreria crt come clrscr, che viene sotituito da clearscreen. Dal momento in cui si entra nella modalità grafica con il comando graphcolormode la grandezza dei caratteri aumenta e la risoluzione diminuisce.
Funzioni di graph3
modificaPer attivare la modalità grafica è possibile usare due funzioni:
graphmode
permette di passare in modalità grafica in bianco e nero;
graphcolormode
è invece a colori. Dopo aver selezionato la modalità grafica a colori, è possibile scegliere una delle tavolozze di colori disponibili tramite la procedura
palette(n)
dove n è un intero compreso tra 0 e 3. A seconda del valore di n, il colore rappresentato dai diversi numeri cambia:
Tavolozza | Sfondo | Numero colore | ||
---|---|---|---|---|
1 | 2 | 3 | ||
0 | nero | verde | rosso | marrone |
1 | nero | turchese | magenta | grigio chiaro |
2 | nero | verde chiaro | rosso chiaro | giallo |
3 | nero | turchese chiaro | magenta chiaro | bianco |
plot(x,y,c)
Questa funzione permette di disegnare un punto di coordinate x, y di colore c che può che rappresenta un colore diverso a seconda della palette usata (vedi la tabella).
draw(x1,y1,x2,y2,c)
Questa funzione permette di disegnare una linea dal punto x1, y1 al punto x2, y2 di colore c