среда, 15 октября 2014 г.

subprograme

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.
Diagrama de sintaxă pentru declaraţia unui subprogram este :

Pentru funcţie:


Pentru procedură: 


Apelul unui subprogram se face fie în programul principal, fie în alt subprogram.

Diagrama de sintaxă pentru apelul unui subprogram este :
Pentru funcţie: 
Pentru procedură: 


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.


Prin domeniul de vizibilitate se înţelege zona din program în care este variabila recunoscută şi se pot efectua cu ea diverse operaţii.
Regulile de vizibilitate sunt :

- o variabilă globală este vizibilă în tot programul din momentul declarării ei ;
- o variabilă locală este recunoscută din momentul declarării ei şi este vizibilă numai în interiorul subprogramului în care a fost definită, precum şi în subprogramele definite în acel ubprogram. În momentul încheierii subprogramului, acea variabilă devine necunoscută.

Pentru cele două modalităţi de strucutare avem, deci, următoarele situaţii :
- pentru dezvoltarea ascendentă, variabilele globale sunt vizibile din momentul declarării lor, în toate subprogramele în care nu există variabile locale cu acelaşi nume ; variabilele locale sunt vizibile, din momentul declarării lor, numai în interiorul subprogramului în care au fost declarate ;
- pentru dezvoltarea descendentă, variabilele globale sunt vizibile din momentul declarării lor, în toate subprogramele în care nu există variabile locale cu acelaşi nume ; variabilele locale sunt vizibile, din momentul declarării lor, atât în interiorul subprogramului în care au fost declarate, cât şi în toate subprogramele definite în subprogramul respectiv.

EXEMPLE DE UTILIZARE A 


FUNCŢIILOR


  1. var i, n, f: integer;
  2.  
  3.   function Fact(var X: Integer): Longint; {X este un parametru transmis prin adresa}
  4.   var lFact: Longint; {variabila locala}
  5.   begin
  6.     lFact := 1;
  7.  
  8.     for i := 1 to X do
  9.       lFact := lFact * i;
  10.  
  11.     X := -1;
  12.     Fact := lFact; {am asignat rezultatul in numele functiei !}
  13.   end;
  14.  
  15. begin
  16.   Write('Dati N: '); ReadLn(n);
  17.  
  18.   F := Fact(N);
  19.   WriteLn('Factorial de N este egal cu : ', f);
  20.   WriteLn('Noua valoare a lui N este   : ', n);
  21.  
  22.   ReadLn; {asteptam sa fie apasat Enter}
  23. end.



    Recursivitate

    Un lucru important de stiut, legat de subprograme, este ca ele sunt necesare daca vrem sa folosimrecursivitate.

    Un subprogram este recursiv daca in implementarea lui se apeleaza pe el insusi.

    Recursivitatea poate fi un concept destul de greu de inteles, asa ca vom incepe cu un exemplu. Sa vedem cum rescriem functia care calculeaza factorialul, folosind recursivitatea.
    1. function Fact(X: Integer): Longint;
    2. begin
    3.   if X > 1
    4.     then Fact := Fact(X - 1) * X
    5.     else Fact := 1
    6. end;

    Dupa se poate vedea, recursivitatea permite si formularea mai eleganta a solutiei.

    Sa incercam sa intelegem ce se intampla. Factorial de N (notat si N!) este definit ca o inmultire succesiva a numerelor de la 1 la N (1 x 2 x ... x N). Din asta putem vedea ca N! este egal cu (N-1)! x N. La randul lui, (N-1)! = (N-2)! x (N-1) si asta poate continua, pana cand N este egal cu 1. Daca incercam sa calculam 1! folosind aceeasi relatie (adica 1! = 0! x 1) o sa cam dam gres, fiindca 0, inmultit cu orice numar, da 0.

    Pe scurt, daca avem un caz initial caruia ii stim rezultatul, iar restul cazurilor se pot rezolva in functie de cazul initial, problema poate fi rezolvata recursiv. Cazul initial, pe functia de mai sus, este cazul in care X nu este mai mare decat 1 (adica este mai mic sau egal !), acest caz avand rezultatul 1. Pentru orice alta valoare pozitiva a lui X, rezolvarea se face in functie de X-1, pana cand X ajunge in cazul initial.

    Ca urmare, aceste doua relatii de mai sus:
    • N! = (N-1)! x N
    • 1! = 1
    sunt tot ce ne trebuie pentru a ne defini functia recursiva de calculare a factorialului.

    Sa vedem ce se intampla, pas cu pas, pentru N egal cu 3.
    1. Fact(3)
    2. X = 3 -> apelam Fact(2) si inmultim cu 3
    3. X = 2 -> apelam Fact(1) si inmultim cu 2
    4. X = 1 -> 1, se termina functia, revenim in apelul precedent
    5. Fact = 1, care inmultit cu 2 este egal cu 2, revenim in apelul precedent
    6. Fact = 2, care inmultit cu 3 este egal cu 6, se termina functia si revenim in locul unde a fost initial apelata functia.
     Deci, daca avem o problema care poate fi exprimata prin subprobleme ale ei si putem gasi o conditie de terminare a apelurilor recursive (in acest caz, X = 1), problema poate fi rezolvata printr-un subprogram recursiv.

    Atentie: Apelurile recursive consuma relativ multa memorie. Daca o problema poate fi rezolvata iterativ (fara apeluri recursive), e de preferat (in general) ca problema sa fie rezolvata iterativ. O lista prea lunga de apeluri recursive poate genera "stack overflow" si bloca programul / calculatorul.

    Pentru edificare, atasez acelasi program care calculeaza factorialul, modificat pentru a afisa ce se intampla. Sper sa va fie de ajutor, impreuna cu explicatiile de mai sus.

    Codul sursa al programului:
    1. uses crt;
    2.  
    3. const lin = 9;
    4.       line = '-----------------------------------------------------------------';
    5.       Wait = 1000;
    6.  
    7. var i, n, f, lFact, test: longint;
    8.  
    9.   function Fact(X: Integer): Longint; {X este un parametru, transmis prin valoare}
    10.   begin
    11.     if X > 1
    12.       then
    13.         begin
    14.           WriteLn('Fact(', X, ') = Fact(', X - 1 ,') * ', X);
    15.           WriteLn(line);
    16.           Delay(Wait);
    17.  
    18.           Fact := Fact(X - 1) * X;
    19.           Delay(Wait);
    20.  
    21.           TextColor(LightGreen);
    22.           if Test > 0 then
    23.             Test := Test * X;
    24.           GotoXY(40, (N - X) * 2 + lin);
    25.           Write('Fact(', X,') = ', Test);
    26.         end
    27.       else
    28.         begin
    29.           TextColor(LightRed);
    30.           WriteLn('X = 1                                  ' +
    31.                   'Fact(1) = 1, caz initial !');
    32.           TextColor(LightGray);
    33.           WriteLn(line);
    34.           Delay(Wait);
    35.           WriteLn('Functia s-a terminat, revenim din apel ^^^');
    36.           Delay(Wait);
    37.           Fact := 1;
    38.           Test := 1;
    39.         end;
    40.   end;
    41.  
    42. begin
    43.   test := 0;
    44.   repeat {verificam daca 1 <= N <= 6}
    45.     ClrScr;
    46.     Write('Dati N (maxim 6): '); ReadLn(n);
    47.   until (N > 0) and (N < 7);
    48.   ClrScr;
    49.  
    50.   TextColor(LightRed);
    51.   GotoXY(Length(line) div 2 - 16 ,2);
    52.   WriteLn('Calculul factorialului - recursiv');
    53.   WriteLn(line);
    54.   WriteLn;
    55.   TextColor(LightGray);
    56.   WriteLn('Se apeleaza Fact(', N,') ...');
    57.   Delay(Wait);
    58.  
    59.   TextColor(lightGray);
    60.   GotoXY(1, lin);
    61.   F := Fact(N);
    62.  
    63.   Delay(Wait);
    64.   GotoXY(1, N * 2 + lin + 3);
    65.   TextColor(LightGray);
    66.  
    67.   Write('Fact(', N, ') este egal cu : ');
    68.   TextColor(LightGreen);
    69.   WriteLn(f);
    70.   TextColor(LightGray);
    71.   Write('... apasa orice tasta pentru a termina programul ...');
    72.  
    73.   While Keypressed Do
    74.     Readkey; {daca s-a apasat o tasta in timp ce programul rula,
    75.               va astepta totusi apasarea urmatoarei taste}
    76.   ReadKey;
    77. end.



      Vizibilitatea variabilelor

      Dupa cum am explicat mai sus, se pot declara variabile in interiorul subprogramelor, chiar si cu nume de variabile care exista deja definite in programul principal. Problema care se ridica este urmatoarea : de unde stie compilatorul (si implicit, programatorul) care variabila va fi folosita in anumite zone ale programului ?

      Nu trebuie sa va speriati, este foarte simplu si usor de inteles.

      Variabilele globale ale programului sunt vizibile oriunde in program. Daca un subprogram isi defineste o variabila cu acelasi nume, atunci variabila locala e prioritara in acel subprogram (si in posibilele subprograme ale subprogramului !).

      1. var i, n, f, lFact: integer;
      2.  
      3.   function Fact(X: Integer): Longint; {X este un parametru, transmis prin valoare}
      4.   var lFact: Longint; {variabila locala}
      5.   begin
      6.     lFact := 1;
      7.     WriteLn('lFact local  = ', lFact);
      8.  
      9.     for i := 1 to X do
      10.       lFact := lFact * i;
      11.  
      12.     X := -1;
      13.     Fact := lFact; {am asignat rezultatul in numele functiei !}
      14.   end;
      15.  
      16. begin
      17.   Write('Dati N: '); ReadLn(n);
      18.  
      19.   lFact := 157;
      20.   WriteLn('lFact global = ', lFact);
      21.  
      22.   F := Fact(N);
      23.   WriteLn('Factorial de N este egal cu : ', f);
      24.  
      25.   ReadLn; {asteptam sa fie apasat Enter}
      26. end.
      Acest program va afisa urmatoarele linii (pentru N egal cu 5):
      1. Dati N: 5
      2. lFact global = 157
      3. lFact local  = 1
      4. Factorial de N este egal cu : 120

Familia Brâncoveanu

Familia Brâncoveanu a fost o familie boierească din Țara Românească, care și-a atins apogeul la sfârșitul secolului al XVII-lea, când boierul Constantin Brâncoveanu, deținătorul unei averi considerabile, a ajuns domnul țării. Acesta a fost mazilit și decapitat cu fii săi la Istanbul la 15 august 1714. Descendența directă din bărbat în bărbat a continuat prin nepotul domnului, botezat tot Constantin, și s-a stins în 1832 cu Grigore Brâncoveanu, care însă adoptase o rudă, numele fiind astfel transmis mai departe.

Istoria familiei

Familia Brâncoveanu, purtând același numele ca și moșia de baștină, a început să se impună pe plan politic, militar și diplomatic de pe vremea lui Mihai Viteazul, când membri ai ei erau prezenți în Divanul țării, pe câmpuri de luptă și în misiuni diplomatice.[1] Astfel, odată cu declinul Craioveștilor, începea să câștige teren, braț la braț cu Goleștii, Bălenii, Bălăcenii și Cantacuzinii.[1]
După cum arăta istoricul Constantin Șerban făcând recurs la Virigiliu Drăghicescu, curtea de la Brâncoveni a familiei s-a dezvoltat cu timpul într-o reședință impunătoare, fiind înzestrată cu bastion, foișor, contraforturi și o palisadă în vale, fiind mai târziu înconjurată de un șanț de apă care era alimentat din râul Olt de un canal lung de câțiva kilometri.[1]
Preda Brâncoveanu era unul dintre cei mai influenți boieri din divanul țării pe vremea lui Matei Basarab și a ocupat cea mai înaltă dregătorie (mare logofăt) pe vremea luiConstantin Șerban. Boierul Preda era de asemenea cel mai bogat om din Oltenia, renumele mergându-i până la Constantinopol, unde făcea negoț cu animale și bunuri.[2] Pe fiul său Papa l-a căsătorit cu Stanca Cantacuzino, fiica influentului postelnic Constantin Cantacuznio.[2]
În primăvara anului 1655 a avut loc răscoala seimenilor și dorobanților împotriva lui Constantin Șerban, care hotărâse la sfatul boierilor lui să-i concedieze și să îi trimită din țară pe mercenarii în mare parte sârbi.[2] Întreaga familie Brâncoveanu, împreună cu marele logofăt se afla la casele din București.[2] În răscoală a murit Papa Brâncoveanu. Marele logofăt s-a putut salva plătindu-le răsculaților o mare sumă de bani, iar Constantin a fost salvat de slugi, care l-au substituit cu un copil de țigan.[3]
Un alt eveniment care a zguduit familia a avut loc în timpul domniei lui Mihnea al III-lea, care s-a dovedit foarte crud față de boieri, din frică de a-și pierde tronul și din dorința de a le confisca averile, sub pretextul hainiei.[4] În timp ce familia Cantacuzino a fugit din țară, Preda Brâncoveanu a rămas și a suferit soarta multor boieri, fiind ridicat de la Târgovișteși dus în casele domnești, unde a fost sugrumat.[5] După acest episod, Stanca Brâncoveanu și-a luat cei trei copii și s-a mutat la moșia de la Mărgineni a tatălui ei.[6]

Constantin Brâncoveanu

Constantin Brâncoveanu (n. 15/26 august 1654 - d. 15/26 august 1714) a fost domnul Țării Românești între anii 1688 și 1714, având una din cele mai lungi domnii din istoria principatelor române. Mare boier, nepot al domnului Șerban Cantacuzino, el a moștenit și a sporit o avere considerabilă, care consta din proprietăți imobile și din sume de bani depuse în bănci din străinătate. În timpul în care a domnit, Țara Românească a cunoscut o lungă perioadă de pace, de înflorire culturală și de dezvoltare a vieții spirituale, în urma sa rămânând un mare număr de ctitorii religioase și un stil arhitectural eclectic ce-i poartă numele.

În politica externă Brâncoveanu a acționat cumpătat, evitând să se poziționeze decisiv în tabăra imperială, care într-un avânt semnificativ recuperase Ungaria și Transilvania de la otomani. Și-a cumpărat bunăvoința turcilor, plătind regulat dările și vărsând sume uriașe sultanului și funcționarilor de la Constantinopol, ceea ce i-a adus supranumele de „altın bey” (română prințul aurului).[1]Ținând agenți și spioni în toată Europa, domnul muntean era informat asupra știrilor de pe întregul continent și informa simultan taberele rivale asupra mișcărilor celuilalt. În ce privește Moldova, domnul muntean a intervenit în mod repetat în chestiunea domniei, în timp ce în Transilvania a exercitat o importantă influență culturală, prin răspândirea de tipărituri și ctitorirea de așezăminte religioase.
Deși reușise să fie confirmat pe viață în domnie (1699) și reconfirmat de noul sultan în 1703, domnul a lucrat în permanență să-și asigure în străinătate un refugiu de turci, fiind conștient de precaritatea situației sale. În cele din urmă, a fost luat prin surprindere, fiind mazilit în aprilie 1714 și dus cu întreaga familie la Constantinopol, unde a fost torturat pentru a ceda turcilor toată averea sa. Constantin Brâncoveanu a fost executat pe 15 august 1714, împreună cu cei patru fii ai săi (Constantin, Ștefan, Radu și Matei) și cu sfetnicul Ianache Văcărescu; la acest deznodământ au contribuit și intrigile familiei Cantacuzino. Pentru felul cum au murit, cu toții sunt venerați de către Biserica Ortodoxă Română, care i-a canonizat sub numele de Sfinții Mucenici Brâncoveni în 1992.
Descendența domnului a fost asigurată de copiii fiicelor sale și ai lui Constantin (fiul său), la mijlocul secolului al XIX-lea putând fi numărați peste două sute de urmași direcți în viață.[2] În 2014, cu prilejul împlinirii a trei sute de ani de la martiriu, rămășițele pământești ale domnului au fost dezgropate și plasate într-o raclă, care este expusă la Biserica Sfântul Gheorghe Nou din București.

Tudor Vladimirescu

Tudor Vladimirescu (n. 1780, Vladimiri - d. S.V. 7 iunie 1821 Târgoviște) a fost o figură emblematică pentru istoria Țării Românești la începutul secolului al XIX-lea, fiind conducătorul Revoluției de la 1821 și al pandurilor.S-a născut în satul Vladimiri (Gorj), într-o familie de moșneni. A învățat carte și limba greacă în casa boieruluiaromân[necesită citare] Ioniță Glogoveanu, din Craiova, care a făcut din inteligentul și destoinicul băiat administrator de moșie și care l-a întrebuințat în afacerile de negoț, mai ales la exportul de vite.

Tudor Vladimirescu și-a constituit o avere prin cumpărare de pământ, făcând comerț pe cont propriu. S-a emancipat din slujba lui Glogoveanu intrând în rândurile pandurilor - armată cu obligații semipermanente - și participă la războiul ruso-turc din 1806 -1812, recompensat de oficialitățile ruse cu ordinul de cavalerie Ordinul Vladimir, clasa a III-a.
În 1806 a fost numit vătaf de plai la Cloșani, adică administrator al unui district de munte, funcție pe care o va deține până în1820. În perioada 14 iunie-26 decembrie 1814 a efectuat o călătorie la Viena, în perioada Congresului de Pace de la Viena (1814-1815), pentru a lichida moștenirea soției lui Nicolae Glogoveanu (fiul lui Ioniță Glogoveanu [1]), decedată la Viena, și pentru a-i aduce în țară fetița.
Cunoscător al limbii germane, Tudor Vladimirescu a putut să urmărească problemele politice care se dezbăteau în presă în capitala Imperiului Austriac. Întors în țară la începutul anului 1815, Tudor a aflat că garnizoana otomană din Ada-Kaleh, care cutreierase județele Mehedinți și Gorj, distrusese și gospodăria lui de la Cerneți și îi luase toate bucatele.
Prezent apoi în capitala țării pentru susținerea unui proces de moșie în fața Divanului, Tudor află de hotărârea Eteriei de a porni mișcarea de eliberare a Greciei. Considerând momentul prielnic pentru a ridica poporul la luptă, are unele discuții cu reprezentanții Eteriei pentru cooperare militară, pentru ca „pandurii să înlesnească trecerea lui Ipsilanti peste Dunăre“.
A semnat o înțelegere cu Comitetul de oblăduire prin care Tudor urma să ridice „norodul la arme“, având drept obiectiv înlăturarea regimului fanariot. Conținutul prea revoluționar al „Proclamației de la Padeș“ i-a speriat pe boieri, care trimit corpuri de oaste pentru a-l opri. Adresându-i-se lui Nicolae Văcărescu, unul dintre cei însărcinați cu înfrângerea oștirii pandurilor, Tudor arată că „pesemne dumneata pă norod cu al căror sânge s-au hrănit și s-au poleit tot neamul boieresc, îl socotești nimic, și numai pe jefuitori îi numeri patrie... Dar cum nu socotiți dumneavoastră că patria se cheamă poporul, iar nu tagma jefuitorilor“. Diplomat, Tudor asigură în permanență pașalele de la Dunăre și Poarta Otomană că poporul s-a revoltat din cauza „cumplitelor patimi ce suferă din partea unirii pământenilor boieri, cu cei după vremi trimiși domni și ocârmuitori acestui norod“.
Intrând în București în fruntea „adunării poporului“, este primit cu entuziasm de către masele populare din capitală. Preia de fapt, în primăvara anului 1821, conducerea țării, fiind numit de popor „Domnul Tudor“. Prezența lui Alexandru Ipsilanti la București în fruntea unei armate nedisciplinate, după ce acțiunea lui fusese dezavuată, ca și a românilor de altfel, de către Rusia, l-au pus într-o situație dificilă. Tudor îi cere conducătorului Eteriei să treacă Dunărea, așa cum promisese inițial, pentru ca Țara Românească să nu fie transformată înteatru de război.

Moartea

Conducătorii eteriștilor au pus la cale un complot pentru a-l îndepărta. Ridicat prin trădare de la Golești, la 21 mai Tudor a fost ucis de șefii eteriștilor la Târgoviște, în noaptea de 27 spre 28 mai, învinuit probabil de colaborare cu otomanii împotriva eteriștilor, fapt pe care istoria nu l-a confirmat niciodată. L-a avut ca dușman pe redutabilul locotenent-colonel Dimitrie Papazoglu, decorat la Paris de Alexandru I   pentru merite deosebite în executarea de hărți militare.

Rude

Tudor Vladimirescu a avut un frate (Papa) și o soră (Constandina) ai căror descendenți trăiesc și în ziua de azi în Oltenia.

Legende

estinul lui tragic, romanțat desigur, a devenit (în 1962) sursă de inspirație pentru scenaristul Mihnea Gheorghiu și regizorul Lucian Bratu, care au realizat un lung metraj artistic cu Emanoil Petruț în rolul titular.