NOŢIUNEA DE SUBPROGRAM

Prin subprogram vom înţelege un ansamblu alcătuit din tipuri de date, variabile şi instrucţiuni scrise învederea unei anumite prelucrări (calcule, citiri, scrieri) şi care poate fi utilizat (rulat) doar dacă este apelat de un program sau de alt subprogram.

Pentru proiectarea unei aplicaţii complexe, este necesară descompunerea problemei care trebuie rezolvată în subprobleme. Pentru fiecare dintre aceste subprobleme se vor scrie module de program mai simple (subprograme), ce vor fi apelate ori de câte ori este nevoie, fie în programul principal, fie în alte subprograme.
 
În limbajul Pascal subprogramele se împart în două categorii :
1. funcţii ;
2. proceduri.
 
Deosebirea dintre ele rezultă din numărul de valori calculate şi returnate programului apelant :
1. funcţiile calculează şi returnează o singură valoare, asociată numelui funcţiei ;
2. procedurile calculează mai multe valori, eventual nici una.
 
Subprogramele pot fi :
- standard (predefinite în unit-ul SYSTEM);
- nestandard (declarate în program de către utilizator).
 
Subprogramele nestandard trebuie declarate obligatoriu înainte de a fi apelate.

Proceduri:

Procedurile sînt subprograme care efectuează prelucrarea datelor comunicate în momentul apelului. Limbajul conține procedurile predefinite read, readln,write, writeln ș.a. În completare, programatorul poate defini proceduri proprii, care se apelează în același mod ca procedurile-standart. Prin urmare, conceptul de procedură extinde noțiunea de instrucțiune PASCAL.                                                                                                        

Forma generală a textului unei declarații de procedură este:

 

p- numele procedurii;

(x1, x2, ..., xn ) –lista opțională de parametri formali;

În corpul procedurii sînt incluse:

D- declarațiile locale( opționale) grupate după aceleași reguli ca în cazul funcțiilor;

Begin...end- instrucțiune compusă; ea nu conține vreo atribuire asupra numelui procedurii.

Procedura poate să întoarcă mai multe rezultate, dar nu prin numele ei, ci prin variabile desemnate special( cu prefixul var) în lista de parametri formali:

  • Parametri-valoare   v1, v2, ..., vk:tp ( servesc pentru transmiterea de valori din programul principal în procedură);
  • Parametri-variabilă  var v1, v2, ..., vk:tp  (serves pentru întoarcerea rezultatelor din procedură în programul principal);

Diagrama de sintaxa:

 

Functii:

Funcțiile sunt subprograme care calculează și returnează o valoare. Limbajul PASCAL conține un set de funcții predefinite, cunoscute oricărui program : sin, cos, eof etc. În completare, programul poate defini funcții proprii, care se apelează în același mod ca funcțiile-standart. Prin urmare, conceptul de funcție extinde noțiunea de expresie PASCAL.

Textul PASCAL al unei declarații de funcție are forma:

 

f- numele funcției;

(x1, x2, ..., xn )- lista opțională de paremetri formali reprezintînd argumentele funcției;

tr- tipul rezultatului; acesta trebuie să fie numele unui tip simplu sau tip referință.

Antetul este urmat de corpul funcției, format din declarațiile locale opționale D și instrucțiunea compusă begin ... end.

Numele f al funcției apare  cel puțin o datî în partea stîngă a unei instrucțiuni de atribuire care se execută: f:=e. Ultima valoare atribuită lui f  va fi introdusă în programul principal.

Diagrama de sintaxa:

 

Domenii de vizibilitate

Corpul unui program sau subprogram se numește bloc. Deoarece subprogramele sînt incluse în programul principal și pot conține la rîndul lor alte subprograme, rezultă că blocurile pot fi imbricate(incluse unul în altul). Această  imbricare de blocuri este denumită structură de bloc a programului PASCAL.

Prin Domeniul de vizibilitate al unei declarații se înțelege textul de program, în care numele introdus desemnează obiectul specificat de declarația în studiu. Domeniul de vizibilitate începe imediat dupî terminarea declarației și se sfîrșește o dată cu textul blocului respectiv.Domeniul de vizibilitate al unei declarației inclus acoperă  domeniul de vizibilitate al declarației ce implică același nume din blocul exterior.

Cunoașterea  domeniilor de vizibilitate ale declarațiilor  este necesară  pentru determinarea obiectului curent desemnat de un nume.

De exemplu, identificatorul c din instrucțiunea  c:=chr(d) desemnează o variabilă de tip char.

Comunicarea prin variabile globale

Orice variabilă este locală în subprogramul în care a fost declarată. O variabilă este globală relativ la un subprogram atunci cînd ea se declară  în programul sau subprogramul ce îl cuprinde fără să fie redeclarată în subprogramul, cît și  în afara lui, ele pot fi folosite pentru transmiterea datelor de prelucrat și returnarea rezultatelor.

Transferul parametrilor

Parametrii actuali trebuie să corespundă cu parametrii formali ca număr, ordine şi tip.
Transferul parametrilor se face în funcţie de modul de declarare a acestora, şi anume:
- parametrii transmişi prin valoare;
- parametrii transmişi prin adresă(referinţă).

Parametrii transmişi prin valoare sunt parametrii de intrare. În acest caz subprogramul apelant transmite spre subprogram valoarea parametrului actual, iar orice modificare a acestei valori pe parcursul subprogramului, se va pierde la sfârşitul subprogramului, astfel încât la revenire vom avea aceeaşi valoare ca şi la apel.

Parametrii transmişi prin adresă se evidenţiază prin existenţa cuvântului rezervat VAR înaintea declarării parametrului. În acest caz subprogramul apelant transmite spre subprogram valoarea parametrului actual, iar orice modificare a acestei valori pe parcursul subprogramului, se va reţine la sfârşitul subprogramului, astfel încât la revenire vom avea o altă valoare, nu cea de la apel.
Domeniul de vizibilitate a variabilelor

Deoarece un subprogram poate fi definit şi în interiorul unui alt subprogram, putem descrie două modalităţi de structurare a unui program Pascal, folosind :
- dezvoltarea ascendentă
- dezvoltarea descendentă a programului.