Pascal/Librerie e funzioni predefinite: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Annullate le modifiche di 79.9.143.38 (discussione), riportata alla versione precedente di Tn4196
Riga 1:
{{Pascal}}
 
Una '''[[w:libreria|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 ==
 
La libreria di gran lunga più usata è sicuramente ''crt'', con tutte le funzioni relative all'estetica in ambito [[w:dos|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 <code>readln</code> 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 <code>readkey()</code> che, come abbiamo già visto, permette di leggere il primo carattere che viene immesso da tastiera.
 
=== Funzioni di crt ===
 
'''clrscr;'''
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 <code>delay</code> è 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 ===
 
{| {{prettytable}} width="50%"
|+ Le frequenze delle note
!Nota!!Frequenza (Hz)!!Formula (Hz)
|-
|Do||262||<math>440 \cdot (2^\frac{1}{12})^{-9}</math>
|-
|Do#/Reb||277||<math>440 \cdot (2^\frac{1}{12})^{-8}</math>
|-
|Re||294||<math>440 \cdot (2^\frac{1}{12})^{-7}</math>
|-
|Re#/Mib||311||<math>440 \cdot (2^\frac{1}{12})^{-6}</math>
|-
|Mi||330||<math>440 \cdot (2^\frac{1}{12})^{-5}</math>
|-
|Fa||349||<math>440 \cdot (2^\frac{1}{12})^{-4}</math>
|-
|Fa#/Solb||370||<math>440 \cdot (2^\frac{1}{12})^{-3}</math>
|-
|Sol||392||<math>440 \cdot (2^\frac{1}{12})^{-2}</math>
|-
|Sol#/Lab||415||<math>440 \cdot (2^\frac{1}{12})^{-1}</math>
|-
|La||'''440'''||<math>440 \cdot (2^\frac{1}{12})^0</math>
|-
|La#/Sib||466||<math>440 \cdot (2^\frac{1}{12})^1</math>
|-
|Si||494||<math>440 \cdot (2^\frac{1}{12})^2</math>
|}
 
La [[w:Frequenza|frequenza]] di riferimento è quella del La, ovvero 440 Hz. Per ottenere le altre ottave basta raddoppiare o dimezzare le [[w:Nota_musicale#Frequenza_delle_note|frequenze della nota]] corrispondente di questa ottava centrale.
<!-- commento questa sezione perché:
#credo che il libro possa ritenersi completo anche senza
#della libreria è stata creata la sezione ma non è stata ampliata
se qualcuno ha qualcosa di sostanziale da aggiungere (in modo tale da rendere la sezione corposa) può ovviamente decommentare il codice
==math==
math è la libreria che contiene funzioni di largo uso in matematica.
===funzioni di math===
-->
 
== Graph ==
 
''graph'' è una libreria che fornisce la possibilità di integrare la grafica nelle applicazioni Pascal.
 
=== Funzioni di graph ===
 
Prima 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 <code>detect</code> ricerca la scheda grafica in uso e restituisce il valore numerico ad essa associato; <code>initgraph</code> avvia la modalità grafica utilizzando la scheda identificata dal valore numerico di <code>scheda</code> e attribuisce alla variabile <code>modo</code> la modalità grafica selezionata automaticamente da Pascal; <code>percorso</code> è 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 <code>getmaxcolor</code> (è 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 colre 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 ellise 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.
 
{{cassetto
|titolo=Esempio di programma che utilizza le librerie crt e graph
|testo=
<source lang="pascal">
{Questo programma disegna un triangolo applicando
a ogni vertice una circonferenza di raggio 50 px}
program triangolo;
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.
</source>
}}
 
== Graph3 ==
 
Un'altra libreria molto usata è ''graph3'' che permette l'utilizzo della grafica delle versione 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 ===
 
Per 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:
 
{| {{Prettytable}}
!rowspan=2|Tavolozza
!rowspan=2|Sfondo
!colspan=3|Numero colore
|- align="center"
|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''
 
 
 
[[Categoria:Pascal|Librerie e funzioni predefinite]]
{{avanzamento|100%}}