A. Considerații teoretice
O declarație de tip procedural trebui să specifice numărul și tipul parametrilor, iar în cazul funcțiilor mai trebuie precizat și tipul rezultatului.
Exemplu:
type Proc = procedure(var x: Tablou); Func = function(x: real): boolean;
Numele parametrilor prezenți în declarațiile de tip procedural sunt pur decorative; ele nu vor fi utilizate în continuare în cadrul programului.
Odată definit un tip procedural, se pot declara variabile de acel tip.
Exemplu:
var P1: Proc; F1, F2: Func;
Exemplu:
Dacă avem definită o funcție, ca mai jos:
function cauta(x: real): boolean; begin ......... end;
F2 := cauta; F1 := F2;
Trebuie observat, că în exemplul anterior instrucțiunea:
F2 := cauta;
Pentru ca o procedura sau funcție să poată fi atribuită unei variabile procedurale ea trebuie să îndeplinească următoarele condiții:
Trebuie reținut că tipurile procedurale pot intra în componența unor tipuri structurate, de exemplu pot apărea ca tip de bază într-un tablou sau ca tip al unui câmp într-un record.
Dacă o procedură sau funcție apare ca parametru actual într-un apel de procedură sau funcție, ea trebuie să se supună restricțiilor menționate anterior în cazul atribuirii.
Parametrii de tip procedural sunt utilizați îndeosebi în cadrul unor subprograme (proceduri sau funcții) care codifică o anumită acțiune care trebuie extinsă la mai multe proceduri sau funcții.
B. Exemple
Vom utiliza două metode de sortare: sortarea prin inserție și sortarea prin interschimbare, care vor fi implementate în cadrul procedurilor Insertie, respectiv BubbleSort.
Algoritmul utilizat în cazul tehnicii de sortare prin inserție este următorul: se împarte tabloul ai, i=1,N care trebuie sortat, într-o secvență sursă și o secvență destinație. Inițial secvența destinație este formata doar din elementul a1, iar secvența sursă din elementele ai, i=2,N. Elementele din secvența sursă se introduc pe rând în secvența detinație, având graijă ca în orice moment secvența destinație să fie ordonată (la introducerea unui element se caută locul lui în secvența destinație, corespunzător valorii sale).
În cazul sortării prin interschimbare, algoritmul este următorul: se traversează în mod repetat tabloul, comparând elementele vecine: ai si ai+1, dacă elementele nu sunt în relația de ordine dorită, ele se interschimbă. Traversarea tabloului încetează în momentul în care nu se mai efectuează nici o interschimbare, deci tabloul e gata sortat.
program MetodeSortare; const N = 10; type Index = 1..N; Tablou = array [Index] of integer; Proc = procedure(var x: Tablou); var A: Tablou; procedure Citeste(var x: Tablou); var i: Index; begin {Citeste} writeln('Introduceti elementele tabloului initial:'); for i := 1 to N do begin write('a[', i:2, ']= '); readln(x[i]); end; end; {Citeste} {$F+} procedure Insertie(var x: Tablou); var i, j: Index; w: integer; begin {Insertie} writeln; writeln('INSERTIE'); writeln; for i := 2 to N do begin j := i - 1; w := x[i]; while (x[j] > w) and (j > 0) do begin x[j+1] := x[j]; j := j - 1; end; x[j+1] := w; end; end; {Insertie} procedure BubbleSort(var x: Tablou); var i: Index; aux: integer; sortat: boolean; begin { BubbleSort} writeln; writeln(' BUBBLESORT '); writeln; repeat sortat := true; for i := 1 to N-1 do if x[i] > x[i+1] then begin aux := x[i]; x[i] := x[i+1]; x[i+1] := aux; sortat := false; end; until sortat; end; {BubbleSort} {$F-} procedure Afiseaza(x: Tablou); var i: Index; begin {Afiseaza} for i := 1 to N do write(x[i]:6); writeln; end; {Afiseaza} procedure Sortare(x: Tablou; P: Proc); var i: Index; y: Tablou; begin {Sortare} y := x; P(y); writeln('Tabloul inainte de sortare: '); Afiseaza(x); writeln ('Tabloul dupa sortare: '); Afiseaza(y); end; {Sortare} begin {programul principal} Citeste(A); Sortare(A, Insertie); Sortare(A, BubbleSort); end.
C. Teme
(xi+1) = (1/2)*((xi)+(a/(xi)))
(xi+1) = (xi)+(1/(2*a))*(a-(xi)2)
(xi+1) = ((xi)3+3*a*(xi))/(3*(xi)2+a)
func = function(a, termen_vechi: real): real; |