+ All Categories
Home > Documents > Programare Fundamentale Pentru Incepatori

Programare Fundamentale Pentru Incepatori

Date post: 05-Jul-2018
Category:
Upload: elenamaria1588
View: 252 times
Download: 6 times
Share this document with a friend

of 93

Transcript
  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    1/93

    1. Concepte fundamentale de programare cu exemple VisualBasic .NET

    În dezvoltarea oricărei aplicaţii informatice, de obicei, se parcurge o succesiune bine denită

    de paşi care porneşte de la identicarea şi analiza cerinţelor problemei şi se termină cu lansarea

     în exploatare şi întreţinerea sistemului (gura1-1! "ste un fel de a spune #se termină$, pentru că

    munca ec%ipei de dezvoltare nu se termină dec&t odată cu ieşirea din exploatare a aplicaţiei! 'e

    obicei, primele trei activităţi şi ultimele trei sunt realizate de analişti şi proiectanţi de sistem,

    programatorilor indu-le rezervată sarcina de a implementa(transpune într-un limba de

    programare, într-o manieră c&t mai optimizată cu putinţă, specicaţiile te%nice obţinute de la

    ec%ipa de proiectare a modulelor!

    Definirea

     problemei

    Analiza

    cerinţelor

    Arhitectura

    globală

    Proiectare

    detaliată (module)

    Scrierea codului

    modulelor

    Testarea

    modulelor

    Testarea

    sistemului

    Elaboraredocumentaţie

    Implementare i

    !ntreţinere

    Algoritmi + structuri

    de date

    Figura 1-1 Secvenţa de activităţi ce o presupune dezvoltarea unei aplicaţii informatice

    ) programa înseamnă a scrie secvenţe de cod ce implementează un anumit algoritm, într-un

    limba de programare! "xistă accepţiunea generală că *

    Algoritm +limbaj+ structuri de date = program

    1.1. Definitii ( algoritm, date, program, structuri de date).

    "

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    2/93

    'icţionarul de +nformatică deneşte algoritmul ca #un concept folosit în mod intuitiv pentru a

    desemna o multime nită de operaţii (instrucţiuni, comenzi cunoscute, care exexcutate într-o

    ordine bine stabilită pornind de la un set de valori (intrări, produc în timp nit un alt set de

    valori (ieşiri$! oţiunea de elgoritm este foarte bine descrisă c%iar de caracteristicile esenţiale

    ale acestuia*

    1! Finitudine! n algoritm trebuie întotdeauna să se înc%eie după un număr nit de paşi!.! Claritate! /iecare pas al unui algoritm trebuie să e bine denit0 acţiunile ce trebuie

    executate vor riguros specicate într-o manieră care să elimine orice ambiguitate!

    entru ca un algoritm să poată înţeles de oricine, reprezentarea operaţiilor trebuie

    cumva formalizată! În acest sens se poate apela la *

    a! un limba astfel formalizat înc&t să e universal valabil * sc%eme logice şi

    pseudocod0

    b! un limba de programare (2ava, 34, 566, etc7 în care ecare instrucţiune are

    un înţeles bine delimitat0

    8! Intrări! n algoritm poate avea zero sau mai multe date de intrare, valori ce îi suntfurnizate e la momentul iniţial (înainte ca algoritmul să înceapă să se execute, e în

    mod dinamic, pe măsură ce algoritmul se execută!

    9! Ieşiri! n algoritm poate avea una  sau mai multe valori de ieşire, ca rezultat al

    operaţiilor execute pe parcursul execuţiei asupra datelor de intrare (dacă acestea

    există

    :! Efcacitate. algoritmul prelucreaza datele initiale si furnizeaza rezultatul scontat0

    ;! Determinism! ! 'atele de intrare

    vor coecientii ecuatiei* a si b! 'atele de iesire (rezultatul prelucrarii*

    - radacina x a ecuatiei sau

    - un mesa (?x real? sau ?nu exista solutie?

    rocesul prelucrarii datelor de intrare (algoritmul poate descris astfel*

    )@ 1! @e introduc (=se citesc valorile coecientilor a, b0

    )@ .! 'aca a=> si b=> atunci se aseaza ?ecuatia are o innitate de solutii A?0)@ 8! 'aca a=> si bBC> atunci se aseaza ?ecuatia nu are solutii A?0

    )@ 9! 'aca aBC> atunci solutia este x= -bDa0

    )@ :! )seaza valoarea lui x0

    'atele sunt elemente esenţiale ale unui algoritm! )supra lor se aplică operaţiile! 'atele sunt

     în sine valori cu o anumită semnicaţie pentru procesor (cel care m&nuieşte algoritmul! În

    memoria calculatorului orice dată apare ca o succesiune de biţi! Eodul în care pentru o astfel de

    succesiune se asociază o valoare depinde de interpretarea ce i se dă! 'atele pot *

    • elementare * data apare ca o entitate indivizibilă din punct de vedere al valorii - aici

    includem* simboluri (litere sau caractere speciale şi numere

    • structurate* colecţie de date elementare sau date structurate organizate într-o

    anumită manieră pentru a reprezenta într-o formă abstractizată anumite noţiuni din

    #

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    3/93

    lumea reală0 iată c&teva tipuri de date structurate (sau structuri de date* tablouri

    unidimensionale sau multidimensionale, liste, arbori, şiere etc!

    'atele structurate vor abordate pe larg într-o secţiune separată

    1.1.1. Reprezentarea datelor elementare în memoria RAM

    'eşi prin utilizarea unui limba de nivel înalt (34, /oxro, 2ava, 5, 'elp%i, etc7 dateleelementare sunt manipulate într-o manieră mult simplicată din perspectiva utilizatorului

    limbaului respectiv, orice programator ştie că la nivelul sistemului de calcul toate instrucţiunile

    şi datele ce alcătuiesc un program sunt convertite în şiruri de biţi (şiruri de valori > şi 1! În cele

    ce urmează vom prezenta te%nicile de bază prin care datele elementare (simboluri şi numere

    sunt reprezentate în memoria internă a calculatorului!

    Reprezentarea simbolurilor (litere şi caractere speciale)

    < metodă de a reprezenta datele la nivelul sistemului de clacul constă în proiectarea unui

    sistem de coduri în care ecărui simbol i se asociază o combinaţie unică de biţi! În vremurile de

     început ale te%nologiei informaţiei au existat mai multe astfel de sisteme de codicare,multitudinea lor promov&nd ambiguitate şi dicultăţi în încercările de comunicare între mai

    multe sisteme de calcul! entru a elimina această situaţie se impunea adoptarea unui sistem

    standard care să e implementat de toţi producătorii de sisteme %ardFare şi softFare!

    În anii GH> )merican ational @tandards +nstitute (ANI a dezvoltat sistemul de codicare

    ACII I )merican @tandard 5ode for +nformation +nterc%ange I care a devenit în scurt timp

    extrem de popular şi care este utilizat pe scară largă şi astăzi! +niţial acest sistem de codicare

    utiliza un model de H biţi (o înşiruire de > şi 1 pentru a reprezenta literele mari şi mici ale

    alfabetului englez, caracterele de punctuaţie, cifre de la > la J şi anumite informaţii de control!

    )stăzi )@5++ reprezintă simbolurile printr-o combinaţie unică de K biţi care nu numai că se poatestoca foarte uşor în memorie (celulă de memorie= 1 bLte (octet =K biţi dar oferă posibilitatea

    reprezentării unui număr de .:; (.Kde simboluri diferite, suciente pentru a reprezenta spre

    exemplu toate caracterele ce pot introduse prin intermediul tastaturii! @pre exemplu, dacă

    utilizăm %arta de coduri )@5++ (FFF!ansi!org , şirul de caractere #Mello$ va reprezentat astfel*

      $"$$"$$$ $""$$"$" $""$""$$ $""$""$$ $""$"""" $$"$"""$

    % e l l o .

    e l&ngă )@5++, care este cel mai utilizat sistem de codicare la momentul actual, există şialte sisteme care oferă posibilitatea reprezentării caracterelor într-o manieră mult mai extensivă!

    @pre exemplu, sistemul de codicare +5

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    4/93

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    5/93

    coplemente (pentru numere pozitiveDnegative şi notaţia în virgulă mobilă (pentru numere

    zecimale! )naliza detaliată a acestor sisteme depăşeşte însă scopul acestui curs!

    1.1.. Varia!ile"pointeri" literali" constante. #pera$ii fundamentale în algoritmi

    'atele unei probleme apar în algoritmi sub formă de variabile! În informatică !aribila

    reprezintă un nume atribuit unei adrese (celule de memorie care stoc%ează o valoare! @punemastfel, că varibila identifcă  valoarea respectivă! oţiunea de variabilă este folosită şi în

    matematică! 'e pildă, spunem că f(x, L=.x68L6: este funcţie de două variabile independente

    x şi L! În programare, noţiunea de variabilă are un înţeles puţin diferit! Eai exact, o variabilă

     poate lua valori dintr-o mulţime bine precizată, care, ca şi în matematică, se numeşte domeniul

    de defniţie al variabilei, dar la un moment dat variabila are o valoare bine precizată!

    " !aribilă este caracterizată de#

    • Nume

    • Tipul datei (domeniul de valori – acele valori care pot constitui la un moment dat

    valoare curentă)

    • Valoare curentă

    • Domeniu de vizibilitate

    /iecărei variabile i se asociază un nume! Variabila se identifcă n al!oritm cu acest nume! 'e

    aceea, numele, se mai numeşte şi identicatorul variabilei! umele de variabile din algoritmi

    apar şi în programe! 'upă ce un program se lansează în execuţie, ecărei variabile i se rezervă în memoria internă a calculatorului o zonă în care se înregistrează valoarea sa iniţială! )ceastă

    valoare se modică pe parcursul execuţiei programului! 3aloarea care se aNă la un moment dat

     în zona rezervată unei variabile se numeşte valoare curentă!

    'atele prelucrate de un algoritm trebuie să e de un anumit tip! Oipul de dată este puternic

    inNuenţat de limbaul de programare în care va scris programul! 5a urmare şi varibilele (prin

    care se manipulează acele date vor avea un anumit tip! Eaoritatea limbaelor de programare

    dispun de c&teva tipuri standard de date! 'intre acestea menţionăm tipurile numerice $ntre%i,

    tipurile numerice reale, tipul lo%ic şi tipul  caracter! Oipurile numerice sunt compatibile între

    ele! 5u alte cuvinte, se pot determina valorile unor expresii în care apar tipuri numerice diferite!

    u se pot evalua, însă, expresii în care apar date numerice şi date logice, date numerice şi

    caracter sau date logice şi caracter! entru a efectua operaţii cu tipuri diferite de date,

    respectivele valori trebuie mai înt&i con!ertite la un tip comun (vom vedea ceva mai t&rziu cum

    se realizează acest lucru!

    oţiunea de tip de dată este una din noţiunile de bază utilizate în limbaele de programare!

    'eclararea unui tip de date înseamnă în esenţă a preciza o mulţime de valori şi o mulţime de

    operaţii care se pot efectua cu valorile respective!

    "xistă însă şi varibile care nu con&in o !aloare ci o adresă a unei !alori. )ceste tipuri de

    varibile se numesc pointeri!  /igura 1-. prezintă într-o manieră simplicată diferenţa între o

    variabilă şi un pointer la nivelul memoriei interne! )stfel, variabila V1 va avea valoarea 1.:9 iar

    varibila V2 va avea ca valoare adresa de memorie a valorii 1.:9, adică "Adr2#!

    ,

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    6/93

     

     -ume.ariabila / (TIP)

    / .aloare

    ."/ (I-TE0E1) /

    "#,*

    Variabila

    (Adr")

    (Adr#)

    .#/ (P2I-TE1) /

    Pointer

    (Adr3)

    (Adr#)(Adr4)

    Figura 1-2 Varibile si pointeri

    )şa cum se poate intui, în acest exemplu ambele variabile, 31 şi 3., #lucrează$ cu aceeaşi

    valoare, cu alte cuvinte într-un algoritm, manipularea valorii 1.:9 se poate efectua prin

    intermediul oricăreia din cele două variabile! Într-un mod formalizat*V1 1254

    V2 A!"V1#

    S$!%& V1 "se va afisa 1254#

    S$!%& V2 "se va afisa "Adr2##

    S$!%& &!&F"V2# "se va afisa 1254#

    &!&F"V2# 25'

    S$!%& V1 "se va afisa 25'#

    În algoritmul de mai sus prin '"P"/ specicăm faptul că se manipulează valoarea la care se

    referă (spre care punctează variabila V2 şi nu valoarea în sine a acesteia care reprezintă o

    adresă de memorie "Adr2#!

    e parcursul dezvoltării programelor, pot apare anumite date a căror valoare nu se sc%imbă

    pe parcursul execuţiei! 'acă respectivele date sunt utilizate în mod direct, folosim noţiunea de

    literal* x6.  . este un literal! 'acă însă unui literal i se atribuie c%iar de la începutul execuţiei

    programului un identicator (un nume, iar pe parcursul programului utilizăm acel nume (în modsimilar variabilelor în locul valorii explicite, spunem că am denit o constantă! 5onstantele

    deţin toate caracteristicile variabilelor (nume, domeniu, adresa dar sunt mărimi care nu îşi

    modică valorile în timpul efectuării calculelor! 'e pildă, într-un program pentru controlul

    tracului aerian la un aeroport, o mărime intens utilizată în calcule este altitudiunea aeroportului

    faţă de nivelul mării* să zicem 8>m! 'acă utilizăm direct valoarea 8> în calcule, tranferul

    programului la un alt aeroport (plasat să zicem la 9>m altit! va implica modicarea tuturor

    liniilor de program ce utilizează valoarea respectivă! 'acă însă declarăm o constantă I

    AltitAeroport 30 I şi utilizăm această constantă în toate operaţiile de calcul, la tranferul

    programului nu va trebui dec&t să modicăm valoarea constantei AltitAeroport şi să rulămaplicaţia!

    )şadar, în orice algoritm manipulăm datele prin intermediul variabilelor şi a constantelor!

    "pera&iile 'undamentale ce se pot realiza într-un algoritm sunt*

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    7/93

    $peraţii de atribuire  I determină asocierea unui nume (a unei variabile cu o valoare! 'e

    multe ori valoarea poate să nu e o cantitate în sine ci rezultatul evaluării unei e%presii! <

    expresie presupune mai multe date cărora li se aplică operatori, spre exemplu operatori

    matematici (6, -, D , Q, R (ridicare la putere!

    4 .>

    5 )64

    $peraţii de decizie  - prin care se determină valoare logică a unei propoziţii! resupun

    utilizarea operatorilor relaţionali (=, B,C, BC, S, B=, C= şi, eventual, a operatorilor logici ()',

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    8/93

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    9/93

    entru declararea e+plicită a !ariabilelor  se utilizează instrucţiunea Dim ! )ceasta este

    plasată la începutul programului, indic&nd că undeva pe parcurs vor necesare variabilele

    declarate! /ormatul instrucţiunii de declarare este*

    Dim ,-ume.ariabil/ As ,TipDat/

    ,-ume.ariabil/  este denit de către utilizator, iar ,TipDat/  este specicat explicit,

    tipurile ind cele prezentate în tabelul 1-1 sau un tip compozit (după cum vom vedea mai t&rziu!

    $bservaţ ie .$bservaţ ie .   umele de variabile pot conţine litere, cifre şi caracterul de subliniere

    (underscore! u pot să înceapă cu cifre, nu pot conţine spaţii ori alte caractere speciale! "ste

    interzisă folosirea unor nume care sunt cuvinte-c%eie în 3isual 4asic (nu putem avea o variabilă

    numită Form, dar putem folosi numele Form)1! )celeaşi precizări sunt valabile şi pentru

    constante!

    )tunci c&nd se execută instrucţiunea Dim, se rezervă în memorie un spaţiu cu dimensiunea

    compatibilă cu ,tipDat/ i acestui spaţiu i se atribuie numele ,-ume.ariabil/9

    +nstrucţiunea Dim se poate plasa oriunde într-o procedură, dar se recomandă scrierea sa la

     începutul acesteia!

    (u se pot defni două variabile cu acelaşi nume n aceeaşi procedură.

    "peratori $n isualasic

    @puneam mai devreme că unei variabile i se poate atribui o valoare sub forma unei expresii!

    În general o expresie înseamnă o înşiruire de valori (operanzi şi simboluri specializate

    (operatori care poate evaluată la momentul execuţiei şi obţinută o valoare drept rezultat!

    /iecare limba implementează operatori aritmetici, pentru şiruri de caractere şi logici! În marea

    maoritate a cazurilor operatorii aritmetici sunt implementaţi în mod similar de la un limba la

    altul (prin simbolurile universal valabile iar celelalte două tipuri pot avea implementări diferite!(abelul )r* 1-2* ,peratori n Visual +asic

    Operator Exemplu Descriere$peartori aritmetici

    6 @al 6 +mp )dună valorile celor două variablile!- ret I 1>>>> @cade o valoare din alta!Q Ootal Q rocO3) Înmulţeşte două valori!D Ootal D 1. Împarte o valoare la alta!V 1>.V9 5alculează c&tul unei împărţiri cu rest!

    Eod ; Eod 9 5alculează restul unei împărţiri!

    ; E

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    10/93

    W

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    11/93

    1.2. Reprezentarea formalizată a algoritmilor

    "xistă două modalităţi general adoptate pentru reprezentarea unui algoritm*

    • +cemele lo!ice I ansamblu de simboluri grace ce permit reprezentarea sub formă

    gracă a unui algoritm! @imbolurile sunt standardizate din 1JH> printr-un standard )@+

    W8:• Pseudocod  - se materializează prin extragerea unui grup de cuvinte din limbaul

    natural prin care se traduc structurile de control fundamentale, fără a implementa o

    semantică strictă! u există un standard precum în cazul sc%emelor logice!

     Oabelul 1-1 prezintă în paralel elementele grace ale sc%emelor logice şi cuvintele pseudocod

    esenţiale în reprezentarea algoritmilor! Eenţionăm că nu sunt evidenţiate simbolurile pentru

    operaţii speciale denite de standrdul W8:! 'e asemenea precizăm că pentru pseudocod au fost

    alese cuvinte în engleză (deşi puteau şi în rom&nă datorită modului familiar de implementare

     în diverse limbae de programare!

    imbol sc,emă lo%ică -seudocod emnifca&ie  STA1T ST2P

    4"Z+"'

    Început Dsf&rşit algoritm

     @ond

    T1?E8ASE

    +/ ond OM" 7"U@" 7"' +/

    4loc de decizie (seevaluează condiţia ond!În pseudocod trebuieevidenţiat sf&rşitul blocului

      A:/@)=465 (sau)465

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    12/93

    o condiţionată anterior  ([M+U" I '

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    13/93

    c,ema o%ica -seudocod isualasic Fo+-ro /a!a "racle -01tructura sec!en&ială

    A"

    :#

    @A/:

    STA1T

    ST2P

    F1ITE @

    +&.%)

      A1

      +2

      $ A/+

      0!%(& $

    &)

    rivate Sub Secventa"#

      % a3b3c as %nteger 

      a 1

      b 2

      c a / b

    Console$riteinec#

    &nd Sub

      a 1

      b 2

      c a / b

      c

    public static void

     main"String67 args#

     8

      int a19

      int b29

      int ca/b9

    S:stem*out*print"c#9  ;

    &$,?(?(*?(>

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    14/93

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    15/93

    :#

    STA1T

    ST2P

    :$

    F1ITE

    GPoziti7H

    T1?E

    +&.%)

      +2

      %F +@ (B&)

      0!%(& CozitivD

      &) %F

    &)

    rivate Sub Secventa"#

    % b as %nteger

    b 2

      0f '! 2) T+enConsole$riteine "EozitivE#

      End 0f 

     

    &nd Sub

    +2

    0f !2

      CpozitivD

    Endif 

    public static void

     main"String67 args#

     8

      int b29

     if '!2)

    S:stem*out*print

      "EpozitivE#9

     

    ;

    declare

     b %nteger9

    begin

     b=29

     if !2 t+en

    +S>,?(?(*?(>

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    16/93

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    17/93

     -"

    STA1T

    ST2P

    F1ITE -

    T1?E

    i"

     - -Ki

    ii/"

    8ASE

    iJ3

    +&.%)

      i1

      )1

    /#

      ))H%

      ii/1

    4+ile i567

     0!%(& )

    &)

    rivate Sub Secventa"#

    im n3 i as %nteger

    ) 1

      i 1

      /o

      ) ) H i

      i i / 1

      -oop 4+ile i 56 7

      Console$riteine ")#

     &nd Sub

    )u implementeaza public static voidmain"String67 args# 8

     

    int n19

      int i19

      do

    8 nnHi9

      i//9;

      :+ile 'i567)3

      S:stem*out*print"n#9  ;

    declare

    ) %nteger9

     i %nteger9

    begin

    )=19

      i=19

     -oop

      )=)Hi9

    i=i/19

      E=0T 4>EN i 73 End -oop3

    +S>,?(?(*?(>

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    18/93

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    19/93

    Sub testIesireFortataFor4  Dim nr i As Integer  Dim este As Boolean

      este = True  nr = InputBo8;intro un nr intreg;4  For i = & To nr E )  GConsole$riteinei4 G uncomment pentru testarea iesirii ortate  I nr 7od i4 = 0 Then  este = False

      Exit For  'nd I

      -e8t  I este4 Then  Console$riteine;numarul ; : nr : ; este nr prim;4  'lse

      Console$riteine;numarul ; : nr : ;nu este nr prim;4  'nd I

      'nd Sub

     Oestarea unui algoritm poate efectuată doar cu un creion şi o %&rtie, dacă

    utilizăm un tabel în care liniile sunt reprezentate de paşi iar coloanele de valorile

    curente ale variabilelor şi instrucţiunile ce se execută! @pre exemplu, pentru

    calculul factorial prezentat în sc%emele de mai sus (varianta [M+U"-'< cu

    =9*

    as +nstrucţiune "val5ond i 1 i1 1. 1 1 18 iB=9\ OP" 1 19 Qi 1 1: ii61 . 1; iB=9\ OP" . 1H Qi 1 .K ii61 8 .J iB=9\ OP" 8 .

    1> Qi 8 ;

    11 ii61 9 ;1. iB=9\ OP" 9 ;18 Qi 9 .919 ii61 : .91: iB=9\ /)U@" : .91; [P+O" : .9

    +ată în continuare şi algoritmul de rezolvare a ecuaţiei de gradul doi

    ax.6bx6c=> , algoritm reprezentat prin intermediul unei sc%eme logice!

    "4

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    20/93

      STA1T

    ST2P

    F1ITE L T1?E

    ∆ b# ; *KaKc

    M"(=b = SN1T(∆)) ' (#Ka)

    L=c'b

    8ASE

    ∆$

    1EAD a6b6c

    aJ$

    ∆$

    M#(=b / SN1T(∆)) ' (#Ka)

    F1ITE M"6 M#

    F1ITE ;b'(#Ka)F1ITE G8ara radacinaH

    8ASE

    8ASE T1?E

    T1?E

    1.3. Modularizarea programelor..

    Încă de la începuturile erei calculatoarelor programatorii s-au confruntat cu

    problema complexităţii aplicaţiilor! Eaoritatea problemelor din lumea reală sunt

    complexe şi nu pot formalizate prin intermediul unui singur algoritm! Eai mult,

    există numeroase părţi ale unei probleme ce pot regăsite în formularea altora,

    şi, ca urmare, algoritmii ce descriu părţile pot reutilizaţi! Peutilizarea codului

    este una din paradigmele fundamentale în programare iar dezvoltatorii de

    aplicaţii văd în acest procedeu un scop în sine al procesului de programare! Înesenţă, reutilizarea codului se referă la gruparea unora din paşii unui algoritm

    pentru a forma porţiuni de cod scurte (numite generic module, subprograme sau

    subrutine, c&t mai simple şi specializate, astfel înc&t*

    = prin asamblarea acestor părţi să se obţină rezultatul dorit0

    = unele module să poată reutilizate pentru asamblarea algoritmică a

    rezolvării unei alte probleme0 acest aspect presupune simplitate şi

    specializare (modulul trebuie să rezolve o sarcină denită c&t mai abstract

    posibil, sarcină care se poate apoi regăsi în denirea altei probleme

    @ubrutinele nu sunt altceva dec&t programe (algoritmi în miniatură, cupropriile lor variabile şi opearţii fundamentale asupra datelor!

    #$

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    21/93

    )samblarea ulterioară a modulelor presupune construirea unui program

    (algoritm mai general care include instrucţiuni de apel (sau in!ocare a

    subprogramelor! ) invoca o subrutină înseamnă a trans'era controlul

    e+ecu&iei din modulul general către subrutină! În maoritatea cazurilor modulul

    principal  îşi suspendă e+ecu&ia c&t timp se execută subrutina (mai puţin încazurile de programare pe mai multe re de execuţie ! < dată ce controul

    execuţiei este primit, subpro%ramul se execută la r&ndul său apoi, după

    nalizare,  $napoiază controlul modulului apelant  (principal care îşi reia

    execuţia de la pasul următor apelului subrutinei!

    1.%.1. ,roceduri" func$ii" parametri.

    În programare, subrutinele pot de două tipuri*

    • Proceduri  I module ce execută o anumită sarcină, iar după nalizareaexecuţie redau controlul programului apelant0

    • Funcţii   - module ce execută o anumită sarcină dar pasul fnal al

    e+ecu&iei presupune transmiterea unor !alori către pro%ramul

    apelant, ca rezultat al prelucrărilor! @e spune că o funcţie este un modul

    care întotdeauna returnează  un rezultat! Eulte limbae de programare

    implementează un cuv&nt rezervat, P"OP, pentru a trimite rezultatul

    prelucrărilor programului apelant

      @ontrolul eLecuţiei

    Transfer date=rezultat

    P12@ED?1A

    8?-@OIE

    Figura 1-I ouă tipuri fundamentale de subrutine

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    22/93

    module care necesită date de intrare pentru a realiza prelucrări asupra lor, iar

    aceste date sunt preluate odată cu controlul execuţiei de la programul apelant!

    aHteLtH

     b#

    c&@A P(a6b)

    M8(c)

     p"HteLtH

     p##

     p"&

    1ET?1- p"'#

    @ontrolul eLecuţiei

    Transfer date=rezultat

    P12@ED?1A P

    (params: p1,p2) 

    8?-@OIA F

    (params: p1) 

    GteLtH6#

    &

    "6,

    Transfer date

     parametri

    Figura 1-4 (ransferul de parametri

    rmătoarele aspecte sunt esenţiale şi general valabile*

    • arametrii sunt de două tipuri*

    o Parametri 0ormali  I varibilele declarate la nivelul subrutinei

    pentru a prelua valori de la programul apelant (în g! 1-K

    parametrii formali ai procedurii 9 sunt  p1 şi  p2 iar pentru funcţiaF I  p1 0

    o Parametri actuali I valorile ce vor transmise subrutinelor la

    momentul execuţiei (în g 1-K este vorba de valorile variabilelor

    a şi b , adică #te%t $ şi 2, în cazul procedurii 9 şi valoarea 8 în

    cazul funcţiei F 0 parametrii actuali pot varibile, literali,

    constante (cu alte cuvinte obţineam acelaşî rezultat dacă

    apelam procedura cu doi literali în loc de două variabile *

    (#text$, .

    • (umărul şi ordinea parametrilor este e%trem de importantă /

    parametrii actuali sunt preluaţi de cei formali în ordine, strict de la

    st&nga la dreapta (în g 1-K, instrucţiunea CA 9ab4 determină ca

    primul parametru formal al procedurii (adică p1 să ia valoarea #text$

    iar cel de-al doilea (p. să ia valoarea .! (umărul parametrilor actuali

    trebuie ntotdeauna să fe identic cu numărul parametrilor 0ormali!

    • entru că o funcţie întotdeuna returnează un rezultat, respectivul

    rezultat trebuie preluat ntr-o variabilă  la nivelul rutinei principale

    (apelantă I tocmai de aceea, întotdeauna invocarea unei funcţii serealizează după următroarea sc%emă*

    ##

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    23/93

    V)umeFuncţie"lista>parametri>actuali#

      în timp ce pentru a invoca o procedură este nevoie de o instrucţiune

    specială implementată la nivelul limbaului (spre exemplu 5)UU în 34*

    $A I bursă]merit !

    'atele de intrare se prezintă sub forma unei matrici (prima coloană =numele

    studenţilor iar următoarele două I notele astfel (vezi mai intai secţiunea .!1dedicată tablourilor*

    @tudent

    1

    1> 1>

    @tudent

    .

    H K

    @tudent

    8

    J ;

    @tudent

    9

    : 9

    #&

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    24/93

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    25/93

      epartCamin

    QedS5

    1EAD -umeStud6 QedS

    QedS3

    QedS4

    F1ITE -umeStud6 G8ara @aminH

    F1ITE -umeStud6 G@amin"H

    F1ITE -umeStud6 G@amin#H F1ITE -umeStud6 G@amin&H

    8ASE T1?E

    T1?E

    T1?E8ASE

    8ASE

    ST2P

    epart$urse

    QedS4

    1EAD -umeStud6 QedS

    QedS49,

    F1ITE -umeStud6 G8ara :ursaH

    F1ITE -umeStud6 G:ursa QeritH

    T1?E

    T1?E8ASE

    8ASE

    ST2P

    F1ITE -umeStud6 G:ursa StudiuH

    #,

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    26/93

    +ată şi implementarea algoritmului în 34 (faţă de sc%ema de mai sus,

    procedura principal4 a fost #îmbogăţită$ cu declararea şi popularea explicită

    a tabloului 7atrice şi un apel la procedura de aşare ( Debug$9rint4 pentrumedia ecărui student *

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    27/93

      Sub >epartCaminBy.al -umeStud By.al 7edS4

      I 7edS = " Then

      I 7edS = # Then

      I 7edS = % Then

      Console$riteine-umeStud + ;Camin3;4

      'lse

      Console$riteine-umeStud + ; Camin&;4

      'nd I

      'lse

      Console$riteine-umeStud + ; Camin);4

      'nd I

      'lse

      Console$riteine-umeStud + ; Fara Camin;4

      'nd I

      'nd Sub

      Sub >epartBurseBy.al -umeStud By.al 7edS4

      I 7edS = % Then

      I 7edS = %$1 Then

      Console$riteine-umeStud + ; Bursa 7erit;4

      'lse  Console$riteine-umeStud + ; Bursa Studiu;4

      'nd I

      'lse

      Console$riteine-umeStud + ; Fara Bursa;4

      'nd I

      'nd Sub

    'nd 7odule

    #5

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    28/93

      8ereastra Immediate utilizată i pentru apelul

     procedurii (@T1/0)

    8ereastra 2utput utilizată pentru 7izualizarearezultatelor afisate la eLecutia programelor

    În maoritatea limbaelor, o funcţie se înc%eie prin instrucţiunea >eturn

    ,@aloare! +nstrucţiunea Return  poate utilizată şi pentru ieşirea dintr-o

    /5^+" sau P

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    29/93

      'lseI nr = ) Then

      Console$riteine;unu;4

    Return

      'lseI nr = & Then

      Console$riteine;doi;4

    Return

      'lseI

     

      'lse

      Console$riteine;numar in aara domeniului precieturnTe8t nr as Integer4 as String

    Dim nr As Integer

      nr = InputBo8;introdu un nr intre 0E)0;4

     

    I nr = 04 Then

      Return ;eturn ;;

      'nd I

    'nd Function

    'upă instrucţiunea P"OP, orice secvenţă de cod, scrisă în cadrul aceleiaşi

    subrutine, nu !a f e+ecutată !reodată! Eulte compilatoare atenţionează

    dezvoltatorul despre acest lucru! 'in păcate, 34!"O nu face acest lucru şi, ca

    urmare, programatorul trebuie să aloce atenţie sporită la utilizarea instrucţiunii>eturn

    Function CalculM(N1, N2, C1, C2)Dim 7edia = 2I -) = 1 And -& = 1 Then  7edia = -) * C) + -& * C&'nd IDebug.print(”Ater !roce""”)>eturn 7edia

    'nd Function

    expresia #)fter rocess$ va aşată !

    'ar dacă modicarea se realizează în felul următor*Function CalculM(N1, N2, C1, C2)

    #4

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    30/93

    Dim 7edia = 2I -) = 1 And -& = 1 Then  7edia = -) * C) + -& * C&'nd I>eturn mediaDebug.print(”Ater !roce""”)

    'nd Function

    expresia #)fter rocess$ nu va aşată (cu alte cuvinte nu se va executa

    procedura de scriere* Debug$print44

    În 34, procedurile şi funcţiile sunt organizate în module cunoscute în general

    sub numele de biblioteci de 0uncţii! 'acă scriem toate subrutinele din listingul 1-1

     într-un modul cu numele 7odul) , atunci apelul procedurii 9rincipal4 dintr-un

    alt modul va de forma *Call 7odul)$9rincipal

    (punctul ce desparte numele modulului de numele procedurii este esenţial

    (vom aborda această te%nică ceva mai t&rziu

    1.%.. /ou& modalita$i de transmitere a parametrilor.

    "xistă două variante de transmitere a argumentelor (mai bine zis a valorilor

    acestora de la programul apelant către subrutină*

    • prin adresă  (sau prin referinţă - modul implicit n Visual asic-

    parametrii formali din procedura apelată vor prelua ca valoare adresa

    valorilor parametrilor actuali (vezi noţiunea de pointer! 5a urmare, at&tvariabilele din rutina apelantă  c&t şi cele ce constituie parametrii

    formali în subrutină  vor manipula aceeaşi !aloare* modicarea

    valorilor varibilelor ce constituie parametrii formali în cadrul subrutinei

    va însemna, de fapt, modicarea valorilor parametrilor actuali din rutina

    principală(vezi gurile 1-J şi 1-1>!

    • prin !aloare - parametrii formali din procedura invocată vor prelua o

    copie a valorilor parametrilor actuali! 5a urmare, modicarea valorilor

    parametrilor formali în subrutină nu va afecta valorile parametrilor

    actuali din programul apelant (gurile 1-J şi 1-11 Oransmiterea prin valoare proteează variabilele din rutina principală

    (parametrii actuali, valoarea acestora răm&n&nd întotdeauna nesc%imbată după

    execuţia subprogramului apelat, c%iar dacă la nivelul acestuia din urmă valorile

    parametrilor formali se modică!

    )v&nd în vedere frecvenţa foarte ridicată a invocării diverselor funcţii şi

    proceduri într-o aplicaţie reală, la implementarea uneia sau alteia dintre cele

    două metode trebuie să se aibă în vedere următoarele aspecte*

    • transferul prin referinţă asigură o bună gestionare a memoriei interne

    (copierea valorilor la nivelul parametrilor formali necesită operaţii şi

    &$

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    31/93

    spaţiu de memorie suplimentare dar oferă o breşă de securitate ce

    poate exploatată, în mod deliberat sau nu, de modulul apelat0

    • transferul prin valoare garantează imposibilitatea modicării parametrilor

    actuali (variabile locale ale modului apelant dar implică operaţii pentru

    alocarea memoriei suplimentare şi copierea valorilor

     

    "a

     b

    "a

     b "

    #,a

     b

    "a

     b #,

    Pas " a"

    Pas# @all Proc(a)

    Pas* F1ITE a

    Proc(b)

    Pas& b#,

    Program %ubrutina

    M"M&!" (AM)

    'ranser prin reerin*

    (b preia adresa 7alorii lui a)

    'ranser prin aloare

    (b preia o copie a 7alorii lui a)

    Figura 1-5 ouă modalităţi de transmiterea valorilor parametrilor "prin referinţă Ji prin valoare#

    1ezultat eLecuţie

    test(ransfer1arametri"# 

    Figura 1-' (ransmiterea valorilor parametrilor prin referinţă n V+ "procedura principală=

    (est(ransferarametri"##

    &"

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    32/93

      1ezultat eLecuţie

    test(ransfer1arametri"# 

    Figura 1-K (ransmiterea valorilor parametrilor prin valoare n V+ "procedura principală=(est(ransferarametri"##

    1.%.%. /eclararea tipului parametrilor

    "xistă şi posibilitatea restricţionării parametrilor la un anumit tip de

    dată! În exemplele de mai sus, parametrii formali nu sunt declaraţi ca ind

    de un anumit tip, astfel că ei vor consideraţi în mod implicit de tip

    .ariant! Oipul de date .ariant permite 34 să identice tipul la momentul

    execuţiei în funcţie de valoarea variabilei respective! 'e cele mai multe ori

    este însă indicat să specicăm explicit tipul ecărui parametru formal,

    astfel înc&t funcţia (sau procedura să nu accepte alte tipuri de date care

    ar putea bloca prelucrările!

    Function F p) As Integer p& As Double p3 As String4

    < asemenea declaraţie obligă aplicaţia-client (modulul apelant să

    furnizeze parametri actuali de tipul specicat, în caz contrar obţin&nd un

    mesa de eroare! )sta înseamnă că variabilele ce vor constitui parametriiactuali trebuie neapărat declarate de tipul respectiv ! 5u alte cuvinte, o

    procedură de apel pentru funcţia / ar putea construită astfel*Sub 94

    Dim pa) as IntegerDim pa& as DoubleDim pa3 as String9a)=)9a&=3$19a3=te8t

    >e

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    33/93

    1.%.?. /in nou despre /omeniul de Vizi!ilitate a (aria!ilelor 

    Într-un program, orice variabilă are o anumită durată de existenţă, cu alte

    cuvinte o anumită durată în care valoarea asociată poate manipulată! nele

    variabile pot utilizate pe parcursul întregii aplicaţii pe c&nd altele se

    iniţializează şi se volatilizează în cadrul unei structuri de control (+/, /

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    34/93

    Public  este utilizată pentru declararea variabilelor în secţiunea Leneral  a

    modulelor standard! u se poate folosi declaraţia 9ublic  într-o procedură

    delimitată prin Sub'nd Sub9

    'eclaraţia !ri#ate permite declararea de variabile la nivel de modul (pot

    apelate numai din procedurile din modulul respectiv, nu şi din alte module oriform-uri! @e foloseşte de asemenea în secţiunea Leneral  a modulului! ici

    declaraţia 9ri@ate nu se poate utiliza în cadrul procedurilor delimitate prin Sub

    'nd Sub9

    Rn figura următoare6 7ariabilele PI i unghi pot fi accesate din toate procedurile modulului

    respecti7

    Figura 1-L Variabile locale Ji globale

    +ată un alt exemplu pentru utilizarea constantelor şi a variabilelor

    globale* resupunem că o aplicaţie necesită autenticarea utilizatorilor

    (userame şi parolă! nii utilizatori au dreptul să execute o anumite

    funcţii, alţii nu! @ă zicem că avem două grupuri de utilizatori* @tudenţi şi

    rofesori! serii din grupul @tudenţi nu au dreptul să execute

    # proceduraestricţionată"#$ I vezi listingul 1-8! 5a urmare, aplicaţia va

    trebui să furnizeze o funcţie de #login$ şi să atribuie unei variabile globale

    (vezi variabila userProfle in listingul 1-2 o valoare care să indice grupul

    din care face parte utilizatorul! # proceduraestricţionată"#$ va testa

    &*

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    35/93

    această variabilă pentru a aNa dacă utilizatorul face parte din grupul celor

    care au drepturi de execuţie! entru valorile de test ale variabilei

    userProfle este indicat să denim c&te o constantă pentru ecare grup

    distinct de utilizatori!

    HL>!K9H9>!FI = &

    9ublic user9roile As Double

    Function loginuser-ame As String pass As String4 As Boolean  Dim oM As Boolean  I user-ame = ;9opescu; And pass = ;popescu; Then  u"er!roile $ %&ER'R%!'&*%D&  oM = True  'nd I 

    I user-ame = ;pro); And pass = ;pro); Then

      u"er!roile $ %&ER'R%!'!RF+  oM = True  'nd I login = oM'nd Function

    estrictionata4  I ogin$user9roile , ogin$KS'>HL>!K9H9>!FI Then  7sgBo8 ;nu a@eti suiciente drepturi pt aceasta unctie;4  'lse  Debug$9rint ;prelucrari$$$$;4

      'nd I 'nd Sub

    Uisting 1-9 Eodul de test*Sub testogin4  Dim user-ame As String pass As String  Dim 8 As Boolean  user-ame = InputBo8;Kser-ame;4  pass = InputBo8;parola;4  8 = ogin$oginuser-ame pass4 

    I 8 = False Then  7sgBo8 ;user5pass incorect;4

      'lse  Call Aplicatie$procedura>estrictionata  'nd I'nd Sub

    Figura 1-M* omeniul variabilelor 

    1.4. Funcii de con!ersie

    'e regulă, conversiile între tipuri de date sunt necesare doar atunci

    c&nd conversia automată implementată de mediul 34!"O nu este

    &,

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    36/93

    sucientă sau nu se poate efectua! +ată un exemplu de conversie

    automată*Dim 8 As Double

      8 = ;&$33; Nse @a reali

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    37/93

    CStr String

    Notă6  În multe situaţii, funcţiile de conversie nu sunt necesare,

    deoarece sistemul va încerca să efectueze singur conversiilecorespunzătoare!

    1.". Funcii matematice

    Eaoritatea funcţiile necesare în diverse operaţii cu numere se regăsesc

     în modulul-sistem Eat%! 'enumirea lor este sufucient de sugestivă pentru

    a nu mai necesare explicaţii detaliate! Ootuşi mai sunt şi c&teva funcţii în

    afara pac%etului Eat%, precum +nt, Pnd! +ata cateva exemple pe care le

    puteţi testa rapid în fereastra +mmediate (5OPU6Z

    Sub testFunctii7atematice4

    Console$riteine;abs E @aloare absolutaJ; : 7ath$AbsE&4 : ; 5 ; : 7ath$Abs&44

    Console$riteine;round E rotunjire J;  : 7ath$>ound&$124 : ; 5 ;  :

    7ath$>ound&$&44

    Console$riteine;Ceiling E primul intreg mai mareJ ; : 7ath$Ceiling&$124 : ; 5 ;

    : 7ath$Ceiling&$&44

    Console$riteine;Floor E primul intreg mai micJ ; : 7ath$Floor&$124 : ; 5 ; :

    7ath$Floor&$&44

    Console$riteine;SOrt E radacina patrataJ ;  : 7ath$SOrt24 : ; 5 ;  :

    7ath$SOrt%4 : ; 5 ; : 7ath$SOrtE%44

    Gunctii in aara modului math

    Console$riteine;Int E partea intreagaJ ; : Int&$124 : ; 5 ; : Int&$&44

    Console$riteine;>nd E numar aleator intre 0E)J ; : >nd44

    Console$riteine;>nd * )00 E numar aleator intre 0E)00J ; : >nd4 * )004

    'nd Sub

    . #rganizarea datelor în *tructuri de date.

    Ua nivelul sistemului de calcul, memoria internă este organizată în celule (în

    maoritatea cazurilor cu dimensiune de 1 octet=Kbiţi cu adrese consecutive! În

    mod normal însă, este mai convenabil să organizăm datele sub forma unor

    structuri abstracte, familiare! @pre exemplu v&nzările săptăm&nale ale unei rme

    &5

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    38/93

    vor organizate într-o formă tabelară, cu produsele v&ndute sub formă de

    coloane şi zilele săptăm&nii sub formă de linii!

    1 I

    vezi gura .-1, adresa notei la a treia disciplină se obţine prin * 1>16(8-1=1>8!

    +ată de ce -ote34 va returna întotdeauna valoarea de la adresa de memorie 1>8

    (în exemplul nostru ind vorba de nota ;

    &3

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    39/93

     

    4 395

     -ote(") -ote(#)

     -ote(&)

     -ote(*)

    @elule de memorie

    "$" "$# "$& "$*

    Adrese de memorie

    Figura 2-1

    *ablouri 8ultidimensionale  I reprezintă în fapt structuri de tablouri

    unidimensionale ale căror elemente (noduri sau celule sunt alte tablouri

    unidimensionale! 5el mai utilizat tablou multidimensional este matricea (tablou

    cu linii şi coloane I . dimensiuni! @pre exemplu dacă ar trebui să reprezentămnotele tuturor studenţilor unei secţii pe primul semestru, presupun&nd că sunt 9

    examene, am putea construi un tabel în care pe ecare line să reprezentăm

    notele unui alt student!

    "$ 5 ,9,

    * 4 4 "$

    "$ "$ "$ 4

    Student "

    Student #

    Student &

    Disciplina "

    Disciplina #

    Disciplina &

    Disciplina *

    @tructura de date astfel obţinută este uşor de abordat de programator, ind

    un mod familiar de reprezentare a datelor! Eanipularea datelor se realizează prin

    intermediul unei sintaxe similare celei prezentate la tablourile unidimensionale,

    doar că identicarea poziţiei unui element se realizează prin numărul liniei şi al

    coloanei! )stfel, dacă numele tabloului ar -ote, nota studentului . la disciplina

    1 se obţine prin* -ote&)4  adică -otelinie coloan/4! entru a modicanota studentului 1 la disciplina 8 vom scrie*

    -ote)34=1$1

    +ar pentru a obţine media notelor studentului . la cele patru discipline*7edieS&=-ote&)4+-ote&&4+-ote&34+-ote&24452 

    adică 96J6J61>D9

    'upă cum ştim, memoria internă a maşinii de calcul este organizată în celule

    cu adrese consecutive! 5a urmare, translatorul limbaului de programare va

    trebui să simuleze modalitatea tabelară de organizare a datelor! În esenţă, liniile

    (în exempl0ul nostru 9 celule de date vor stocate în ordinea naturală, într-ostructură liniară de celule de memorie cu adrese consecutive (primele patru

    &4

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    40/93

    celule de memorie vor constitui prima linie, următoarele patru vor constitui cea

    de-a doua linie, ş!a!m!d I vezi gura .-.! umele tabloului (-ote este de fapt o

    variabilă-pointer spre prima valoare din şirul astfel obţinut! )v&nd în vedere că

    ştim prima adresă a şirului de celule de memorie ce stoc%ează valorile noastre, şi

    că adresele respectivelor celule sunt întotdeauna consecutive, adresa zică aunui element al tabloului (valoare manipulată la nivelul limbaului prin

    -oteij4 poate calculată! Oranslatorul va efectua acest calcul pentru a

    returna valoarea de la linia i, coloana 4! 'acă   reprezintă numărul de coloane,

    adresa zică a elementului ote(i, se obţine prin adăugarea la adresa primului

    element a numărului obţinut prin*

    (5x(i-1 6 (-1

    @pre exemplu (vezi şi gura .-. pentru a calcula adresa  la care se aNă

    valoarea -ote3&4 (adică nota la discipl! ., studentul 8, care este 1>, ştiind că

    adresa primei celule (spre care #ţine$ o referinţa variabila(pointerul -ote este1>> *

    adresa element 3&4=)00+ 283E)4+&E)4=)00+#+)=)0%

     Linia 1

     Linia 2

     Linia 3

     Linia 1  Linia 2  Linia 3

    "$$ "$" "$# "$& "$* "$, "$ "$5 "$3 "$4 ""$ """

    .aloarea -ote3+&4 

    Tabloul -ote la ni7el conceptual

    1eprezentarea tabloului !n

    memorie

    Adrese consecuti7e ale celulelor de

    memorie

    Figura 2-11 !eprezentarea matricilor n memorie

    Observaţie.Observaţie. 'atorită modalităţii specice de adresare a memoriei (celule cu

    adrese consecutive tablourile se mai numesc şi structuri statice de date,

    adică structuri a căror dimensiune (număr de elemente este cunoscută la

    momentul compilării şi nu poate modicată pe parcursul execuţiei programului!

    În toate limbaele de programare tablourile se declară în mod explicit la

    momentul scrierii codului, la momentul declarării programatorul ind obligat să

    specice numărul ma%im de elemente! Ua execuţie, se alocă memorie (celule cu

    adrese consecutive pentru numărul maxim de elemente (nr! linii x nr! coloane!

    *$

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    41/93

    'e asemenea, trebuie precizat că indexul primului element poate > (zero

    sau 1 în funcţie de limbaul de programare (cu alte cuvinte elementele se numără

     încep&nd cu > sau cu 1 ! În cazul 34, în mod implicit indexul primului element

    este > (zero! @pre exemplu, în 3isual4asic dimensionăm un arraL (tablou cu

    instrucţiunea DI7 astfel*DI7 -ote24  - tablou unidimesional cu : elemente (de la > la 9

    DI7 -ote324  - tablou bidimensional cu 9 linii şi : coloane (primul element

    ind -ote004

    )stfel, pentru a dimensiona tablourile exemplicate în gurile .-1 şi .-., în 34,

    ar trebui să scriem*DI7 -ote34

    DI7 -ote&34

    Uistingul următor (vezi şi opeartorul de concatenare a două şiruri în secţiunileanterioare prezintă un exemplu 34 de declarare şi populare automată cu date, a

    unui vector şi a unei matrici! 'atele reprezintă notele studenţilor la patru

    discipline (vezi exemplele anterioare şi gura .-1 şi .-.! otele vor obţinute

    sub formă de numere aleatoare de la > la 1>, generate de funcţia >nd! /uncţia

    >nd  returnează un număr între > şi 1 care, înmulţit cu un alt număr (n, va

    determina obţinerea de valori aleatoare între > şi n! /uncţia >oundnnrPec4

    returnează numărul zecimal n rotunit la nrPec  zecimale !

    ound>nd4 * )0 &4  Debug$9rint;.ector-ote; : i : ;4=; : .ector-otei44  -e8t

      Debug$9rint;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE; 4

      For i = 0 To &  For j = 0 To 3  7atrice-otei j4 = 7ath$>ound>nd4 * )0 &4  Debug$9rint;7atrice-ote; : i : ;; : j : ;4=; :7atrice-otei j44

      -e8t  -e8t

      Debug$9rint;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE; 4

      7ediaStud) = 7atrice-ote0 04 + 7atrice-ote0 )4 H

      + 7atrice-ote0 &4 + 7atrice-ote0 344 5 2  Debug$9rint;7edia studentului )=; : 7ediaStud)4

    *"

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    42/93

      'nd Sub

    'nd 7odule

    Nota6 În procedura de mai sus, semnul #]$ (underscore permite scrierea unei

    comenzi sau a unei operaţii pe mai multe r&nduri!Call Tablouri4 

    Pezultatul execuţiei procedurii Tablouri4 va cel din gura .-8

    Figura 2-12 Fereastra %mmediate afiJează mesaNele trimise din procedura (ablouri"#

    'upă cum s-a văzut anterior (listing .-1, pentru a parcurge un vector element

    cu element utilizăm o buclă /

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    43/93

    arametrul dimensiune este opţional şi specică în mod implicit dimensiunea

    1! entru matrice dimensiunea 1 înseamnă liniile iar dimensiunea . înseamnă

    coloane! 5u alte cuvinte*  Bound7atrice-ote4=Bound7atrice-ote)4=0

     KBound7atrice-ote4=KBound7atrice-ote)4=&Bound7atrice-ote &4=0

     KBound7atrice-ote &4=3

     5a urmare, procedura Tablouri4 din listingul .-1 poate scrisă şi astfel*

    ound>nd4 * )0 &4  Debug$9rint;.ector-ote; : i : ;4=; : .ector-otei44  -e8t

      Debug$9rint;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE; 4

      For i = Bound7atrice-ote )4 To KBound7atrice-ote )4  For j = Bound7atrice-ote &4 To KBound7atrice-ote &4  7atrice-otei j4 = 7ath$>ound>nd4 * )0 &4

      Debug$9rint;7atrice-ote; : i : ;; : j : ;4=; :7atrice-otei j44

      -e8t  -e8t  Debug$9rint;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE; 4  7ediaStud) = 7atrice-ote0 04 + 7atrice-ote0 )4 H  + 7atrice-ote0 &4 + 7atrice-ote0 344 5 2  Debug$9rint;7edia studentului )=; : 7ediaStud)4

      'nd Sub

    otaA În tablourile declarate mai sus, elementele sunt, în mod implicit,

    de tip nedeterminat! Într-un astfel de tablou, tipul este determinat la

    run-time şi va tipul valorilor introduse ca elemente

    %istă nsă şi posibilitatea specifcării tipului elementelor ast0el*

    Dim Tablou14 As Integer   va accepta doar numere întregi

    Dim Tablou324 As String  toate elementele vor de tip @tring

    (şiruri de c%ar

    'acă, însă, o matrice trebuie să păstreze date de diverse tipuri, va

    trebui declarată conform modelului implicit!

    *&

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    44/93

    !!!! De reţinut(pentru cazul Visualasic)

    • u putem utiliza un tablou dacă nu este în prealabil declarat (pentru a se

    aloca memorie cu instrucţiunea DI7

    • rin decrarea tabloului, '+E tablou(N), indexul elementelor în tablou porneşte

     întotdeauna de la > şi se opreşte la ! 5u alte cuvinte, se alocă memoriepentru 61 elemente! 5a urmare, pentru a declara un tablou de 1> elemente

    * DI7 Tablou%4, sau o martice de 1>x1>* DI7 7atrice%%4

    • Ua utilizarea tabloului (citireDscriere elemente dinDîn tablou indexul (numărul

    coloanei şiDsau numărul liniei trebuie să se încadreze, obligatoriu, între limita

    minimă (> zero şi limita maximă declarată! 5u alte cuvinte, încercarea de a

    atribui o valoare sau de a citi un element care nu are alocat spaţiu de

    memorie se va solda cu o eroare! @pre exemplu (pornind de la listing .-.*7atrice-ote(24=($1

    va genera o eroare de execuţie cu mesaul +ubscript $ut $0 an!e• În 34 există şi posibilitatea declarării unor !ectori (tablouri unidimensionale

    dinamici atunci c&nd nu se ştie de la început care va numărul elementelor,

    astfel*

    Dim .ector4   nu se specică indexul maxim

    În acest caz, la momentul declarării nu se alocă spaţiu de memorie urm&nd

    ca programatorul să includă instrucţiunea

    >edim 9reser@e .ectorKbound@ector4+)4  - atunci c&nd are

    nevoie de spaţiu pentru încă un element! 5lauza 9reser@e  este

    obligatorie dacă se doreşte păstrarea valorilor elementelor anterioare

    deoarece, în esenţă, instrucţiunea >edim determină crearea unui alt

    vector cu numarul de elemente specicat  clauza 9reser@e determină şi

    copierea vec%ilor valori în noile locaţii!

    +ată un exemplu*

    Sub tablouriH34

      Dim .4 As String  >eDim .04 Gprimul element trebuie intotdeauna alocat e8plicit

    .04 = ;te8t0;  >eDim 9reser@e .KBound.4 + )4  .)4 = ;te8t);  Debug$9rint.04 : .)44'nd Sub

    .a aiUa Vte8t0te8t)

    2.2. %tructuri de date compozite (definite de utilizator).

    )m văzut în secţiunile anterioare că orice algoritm necesită date deprelucrare, date care sunt în general de două tipuri* elementare sau

    **

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    45/93

    primitive (simboluri şi numere şi date structurate (spre ex! tablouri! 'e

    multe ori însă un algoritm poate mult mai comod exprimat prin utilizarea

    unor structuri de date compuse care să reprezinte cu mai multă acurateţe

    datele din lumea reală! @pre exemplu, o aplicaţie de gestiune a traiectoriei

    şcolare a studenţilor unei facultăţi ar putea mai uşor modelată dacă amptutea deni date de tipuri precum* Student, Disciplina! )ceste noi

    tipuri de date ar trebui să descrie o entitate din lumea reală (spre exemplu

    entitatea Student  ar putea descrisă prin* matricol nume grupa

    note, cu alte cuvinte ar trebui să constituie un şablon pe baza căruia

    algoritmul să manipuleze datele despre un anumit student sau o anumită

    disciplină într-o manieră unitară!

    DEFINIREA *I-7RI"REaoritatea limbaelor de programare oferă posibilitatea denirii unor

    structuri de date proprii, compuse, e pe baza celor primitive (scalare,

    predenite, e pe baza altor tipuri compuse! În 3isual4asic o structură

    proprie poate denită astfel*Q,9ublic59ri@ateR ST>KCTK>' denumireTip

    DI7 ,atributH) AS ,tipAtributH)

    DI7 ,atributH& AS ,tipAtributH&

    DI7 ,atributH- AS ,tipAtributH)

      '-D ST>KCTK>'

      )şadar, elementele esenţiale ale unui tip nou de date sunt*

    = denumirea noului tip

    = numele atributelor ce descriu acel tip

    = tipul de dată al ecărui atribut I poate un tip primitiv

    (+nteger, 'ouble, @tring, etc!, un tip structurat (tablou, sau

    un alt tip compozit   denit anterior

    9nota:

    1 I noile tipuri pot vizibile (pot utilizate la declararea variabilelor

    doar în modulul în care sunt declarate (prin utilizarea specicatorului de

    vizibilitate rivate, sau în toate modulele proiectului, prin cuv&ntul

    rezervat ublic (3"+ i gura .-9!

    .- în locul instrucţiunii '+E pot utilizaţi specicatori de vizibilitate,

    astfel* 9KBIC  (atributul va accesibil din aplicaţiile-client, 9>I.AT'

    (atributul nu va accesibil prin intermediul varibilelor din aplicaţii

    *,

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    46/93

    8- dacă unul din atribute este de tip tablou (note în gura de mai os,

    lungimea acestuia nu poate specicată, urm&nd ca, la momentul

    declarării unei variabile de acel tip, să utilizăm instrucţiunea P"'+E (vezi

    anterior paragrafele dedicate tablourilor pentru a specica numărul de

    elemente pentru tabloul respectiv!90nota:

    În 34, denirea tipurilor proprii trebuie obligatoriu realizată în secţiunea

    'eclarations a unui modul (adică imediat la începutul modulului!

    @pre exemplu, putem construi un nou tip de dată, cu numele Student,

    descris prin atributele* matricol, nume, datanasterii şi un vector de note

    pentru disciplinele unui anumit semestru (vezi gura .-9! 'esigur,

    numărul de atribute descriptive ale noului tip depinde doar de necesităţile

    problemei sau de imaginaţia şi experienţa programatorului!

    Figura 2-1I eclararea unui nou tip de date

    8ANI-7AREA N"I"R *R7C*7RI DE DA*E -RIN IN*ER8EDI7

    ARIAIE"R2 *A"7RI"R ;I -ARA8E*RI"R< dată declarat noul tip, se pune problema utilizării lui! ) utiliza un tip

     înseamnă de fapt a declara o variabilă (sau mai multe ca ind de acel tip

    şi a atribui valori efective ecărui atribut în parte! @punem atunci că

    identicăm o instan&ă a tipului respectiv! 5u alte cuvinte, identicăm o

    entitate din lumea reală şi o descriem prin intermediul şablonului, lu&nd în

    considerare doar atributele denite pentru structura respectivă! Uucrurile

    pot văzute şi din perspectiva similitudinii cu bazele de date! )stfel,

    deniţia (structura unei tabele a bazei de date nu este altceva dec&t o

    formă descriptivă a unei anumite entităţi din domeniul problemei!

    *

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    47/93

    Înregistrările tabelei sunt instanţe ale acelei entităţi, adică valori reale

    setate pentru ecare din atributele tabelei!

    În listingul .-8 este prezentat un exemplu de manipulare a datelor de

    tip Student! @e observă că se declară două variabile de tip @tudent,

    variabile prin intermediul cărora vom manipula datele a doi studenţi!

    eDim studH)$note24  >eDim studH&$note24

      Ginitiali

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    48/93

    data naşterii 81-1>-1JK. etc! entru studentul . desemnăm o altă

    variabilă, studH&, care preia alte valori pentru aceleaşi atribute

    (nume=5ostel, dataasterii=..-.-1JK. aceste valori ind strict asociate

    variabilei studH&!

    În cazul în care atributul este de tip tablou, accesul la elementeleacestuia se realizează în mod similar variabilelor simple de tip tablou, doar

    că se mai adaugă la st&nga variabila-entite şi punctul corespunzător

    pentru a specica entitatea de care vor aparţine valorile elementelor

    tabloul respectiv! În exemplul de mai sus, pentru a atribui a doua notă

    studentului Zigel, procedam astfel*studH)$-ote&4 = #

    Figura 2-14 rezultatul eGecuţiei procedurii din listingul 2-I

    Notă6  3ezi prezentarea curs];!ppt (portal!feaa!uiac!ro pentru

    mecanismul privind transferul datelor la operaţia de atribuire3ariabilele prin care se gestionează datele pentru tipurile compozite pot

    utilizate în mod similar variabilelor clasice I pot f contruite tablouri de

    elemente de tipul respectiv "n e%emplul nostru / Student4 şi pot constitui

     parametri ai unor 0uncţii sau procedurii! În exemplul ce urmează ne

    propunem să construim o funcţie care să primească drept argument o

    instanţă Stundent şi să returneze media notelor studentului respectiv!

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    49/93

      suma-ote = 0  restanta = False  For i = Boundstud$-ote4 To KBoundstud$-ote4  I stud$-otei4 , 1 Then  restanta = True  '8it For

      'lse  suma-ote = suma-ote + stud$-otei4  'nd I  -e8t  I restanta Then  calcul7edia = 2  'lse  calcul7edia = suma-ote 5 KBoundstud$-ote4 E Boundstud$-ote4 + )  'nd I

    'nd Function

    3om utiliza această funcţie într-o aplicaţie precum cea din listingul .-:!

    rocedura aplicaXie4  constă în construirea unui vector de #studenţi$(elementele vectorului vor de tip Student, atriburea unor note aleatoare

    ecărui student şi invocarea funcţiei calcul7edia4 cu ecare element al

    vectorului drept parametru actual!

    @e observă că, în mod similar variabilelor, atributele unui element al

    vectorului vect@tudenti se accesează prin utilizarea notaţiei cu punct *

    @ectStudenti)4$-ume = ;Ligel;

    5u alte cuvinte, studentul 1 va avea numele #Zigel$, studentul . va

    avea numele #5ostel$ ş!a!m!d!

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    50/93

      G apoi aisam media  Dim te8tSir-ote As String i As Integer M As Integer random-otamedia As Double

      For i = 0 To 3  te8tSir-ote = ;;

      >eDim @ectStudentii4$note24

      For M = 0 To 2  random-ota = >nd4 * )0 + 2  random-ota = IIrandom-ota )0 )0 random-ota4  @ectStudentii4$noteM4 = 7ath$>oundrandom-ota &4  te8tSir-ote = te8tSir-ote : @ectStudentii4$noteM4 : H

      IIM , 2 ; ; ;;4  -e8t  Console$riteine@ectStudentii4$nume : ;EEnoteJ; : te8tSir-ote4

      media = calcul7edia@ectStudentii44

      Console$riteine@ectStudentii4$nume : ;EEare mediaJ; : media4

      -e8t

      'nd Sub

    (otă. /uncţia ++/ (+/ imediat o putem utiliza în locul unei structuri +/-

     OM"-"U@" şi are următoarea deniţie*IIFcondiXie @alHreturnHiHTrue @alHreturnHiHalse4

    +ată şi rezultatul execuţiei procedurii din listingul .-:

    ,$

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    51/93

    Figura 2-15 eGecuţia procedurii din listingul 2-5

    "mportant!  u trebuie să uităm că modalitatea de transmitere a

    parametrilor (4L3al sau 4LPef I vezi, anterior, paragraful corespunzator

    trebuie selectată în funcţie de necesităţile aplicaţiei! )stfel, dacă funcţia

    calculEedia( ar trebui să modice unul din atributele studentului (să

    presupunem că ar exista atributul media, atunci declaraţia funcţiei ar *

    Function calcul7edia By>e stud as Student4

    C"8-7NEREA *I-7RI"R

    )m văzut, mai devreme, că atributele ce descriu un tip compozit pot

    at&t tipuri primitive (String, Double, Date etc! c&t şi tipuri structurate

    (tabloul -ote pentru exemplul tipului Student! "xistă însă şi posibilitatea

    de a declara un atribut al unui tip compozit ca ind de un alt tip compozit!

    Eai mult, un atribut poate stoca o structură (tablou de entităţi din alte

    tipuri! )stfel, dacă ne propunem să gestionăm, într-o aplicaţie, gupe de

    studenţi, putem spune că o grupă este caracterizată de un număr

    ,"

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    52/93

    (indicativ şi un ansamblu de elemente de tip Student ce vor reprezenta

    studenţii grupei respective! rin abstactizare, putem deni un nou tip,

    Lrupa, astfel*

    9ublic Structure Lrupa

      9ublic idLrupa As ong

      9ublic studenti4 As Student

    'nd Structure

    'eclararea unui atribut ca ind de un tip compozit sau tablou de

    elemente compozite este cunoscută sub numele de compunerea

    tipurilor! )stfel, spunem că am compus un tip nou, Lrupa, prin utilizarea

    tipului Student denit anterior!

    În deniţia noului tip, atributul studenti  este declarat ca vector deelemente Student  fără a i se preciza dimensiunea, urm&nd ca, la

    momentul instanţierii tipului Lrupa  (constituirea unei grupe reale să

    furnizăm acestui atribut un tablou cu instanţe Student  în funcţie de

    numărul de studenţi din grupa respectivă!

    "xemplul următor construieşte o grupă de studenţi, apoi atribuie note în

    mod aleator ecăruia, iar în nal aşează notele şi media (prin invocarea

    funcţiei calcul7edia4 denită în listingul .-9!

    eDim grupaH)$studenti04$note34

      grupaH)$studenti)4$nume = ;Costel;  grupaH)$studenti)4$matricol = ;')0&;

      grupaH)$studenti)4$data-asterii = W&5&&5)%#&W  >eDim grupaH)$studenti)4$note34

      grupaH)$studenti&4$nume = ;Fanel;  grupaH)$studenti&4$matricol = ;')03;  grupaH)$studenti&4$data-asterii = W35)5)%#)W  >eDim grupaH)$studenti&4$note34

      grupaH)$studenti34$nume = ;Lerogel;  grupaH)$studenti34$matricol = ;')02;  grupaH)$studenti34$data-asterii = W"5)%#2W  >eDim grupaH)$studenti34$note34

      G atribuim 1 note aleatoare pentru iecare student al grupei si le aisam

      G apoi aisam media

      Dim te8tSir-ote As String i As Integer M As Integer random-ota As Double

    ,#

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    53/93

      For i = BoundgrupaH)$studenti4 To KBoundgrupaH)$studenti4  te8tSir-ote = ;;  For M = BoundgrupaH)$studentii4$-ote4 To 

    KBoundgrupaH)$studentii4$-ote4  random-ota = >nd * )0 + 2  random-ota = IIrandom-ota )0 )0 random-ota4

      grupaH)$studentii4$-oteM4 = 7ath$>oundrandom-ota &4  te8tSir-ote = te8tSir-ote : grupaH)$studentii4$-oteM4 : ; ;  -e8t  Console$riteinegrupaH)$studentii4$nume : ;EEnoteJ; : te8tSir-ote4  Console$riteinegrupaH)$studentii4$nume : ;EEmediaJ; H  : calcul7ediagrupaH)$studentii444

      -e8t

      'nd Sub

    Figura 2-1' rezultatul eGecuţiei procedurii din listingul 2-'

    i în acest caz, esenţial de remarcat este utilizarea notaţiei cu

     punct pentru a accesa valorile atributelor de tipuri compozite!

    @c%ema generală este*

    @ariabilaTipComp$atributTipComp$atribut9rimiti@ = @aloare

    )stfel, pornind de la exemplul din listingul .-;, pentru a modica

    numele primului student al grupei 811 (#Zigel$, scriem următoarea

    operaţie de atribuire

    LrupaH)$studenti)4$nume=Apetrei 7arius

    În mod similar, pentru a modica a doua notă a studentului 8 din grupa

    1, scriem următoarea operaţie*

    LrupaH)$studenti34$-ote&4=#

    ,&

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    54/93

    @punem, astfel, că am modicat elementul . al tabloului note  (de tip

    primitiv Double asociat elementului-entitate 8 al tabloului studenti  (de

    tip Student asociat variabilei-entitate grupa ]1 (de tip Lrupa

    4ineînţeles că nu ne opreşte nimeni să construim încă un tip, cu numeleFacultate, descris prin structura*

    9ublic Struncture Facultate

    9ublic denumire As String

      9ublic adresa As String

      9ublic grupe4 As Lrupa

    '-D ST>KCTK>'

    În acest caz, atribuirea unei note va realizată pe baza unui şablon denotaţie cu punct, după cum urmează*

    Dim as Facultate

    initiali

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    55/93

    unităţi active, ce defnesc un anume comportament  ca răspuns la stimuli

    e%terni! )ceste noi tipuri au fost numite clase , operaţiile au fost numite

    metode, iar instanţele lor (elemente din lumea reală aparţin&nd acelui tip

    au fost numite obiecte! Eetodele nu sunt altceva dec&t proceduri şiDsau

    funcţii care se asociază în mod indivizibil claselor şi prin careprogramatorul specică ansamblul de operaţii ce pot realizate de

    obiectele ce provin din acea clasă! )sta înseamnă că acele obiecte pot să

    manipuleze singure datele pe care le conţin (valorile atributelor, sau pot

    să efectueze operaţii cu acele date şi să returneze un rezultat, ca urmare a

    unui apel provenit de la un alt obiect! )ceste apeluri sunt numite generic

    mesa5e! )stfel, problemele pot modelate într-un mod foarte natural, ca

    un ansamblu de obiecte ce comunică ntre ele!

    Obiectele pot fi caracterizate prin stare şi comportament.  'enimstarea obiectului ca ind setul de valori al atributelor unui obiect la un

    moment dat! Comportamentul este dat de ansamblul operaţiilor pe care

    le poate efectua un obiect! Înterminologia

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    56/93

    pentru ecare student erau preluate în mod aleator, tot într-un algoritm

    distinct, cu numele aplicatie (listing .-:

    În cele ce urmează, vom sc%imba maniera de abordare a problemei*

    vom construi o clasă care va descrie entitatea Student prin intermediul

    aceloraşi atribute (matricol,nume, datanasterii  şi vectorul -ote iarpentru calculul mediei şi preluarea notelor vom deni două metode

    (operaţii la nivelul acestei clase! 5a urmare, la nivelul aplicaţiei, după

    instanţierea claselor şi obţinerea obiectelor de tip Student, vom trimite

    c&te un mesa ecărui obiect pentru a genera notele şi a obţine mediile!

    )stfel, logica prelucărilor se transferă de la nivelul aplicaţiei la nivelul

    denirii operaţiilor pentru ecare tip din spaţiul problemei! 

    obiecteStud" Stud# Stud&

    Stud"

    Stud#

    Stud&

    0rupa

    0rupa

    Date

    Algoritmi (module aplicaţie)

    Programare Procedural*

    AplicaţieAlgoritmi/date

    Programare orientat*obiect

    Aplicaţie Ansamblu de obiecte ce comunică prinmesae

    Aplicatie

    Figura 2-1K iferenţe ntre abordarea procedurală Ji cea obiectuală

     

    Qatricol

     -ume

    Datanasterii  -ote U

    Atribute

    Metode

    @alculQedia()

    Incarca-oteELamene()

    Set-ota(:

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    57/93

    În 34!"O, pentru a construi o clasă apelăm la opţiunea )dd   5lass

    Eodule din meniul context al @olution"xplorer-ului sau din meniul roect!

    umele clasei va introdus prin proprietatea name a modulului!

    Figura 2-1M $rearea unei noi clase*

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    58/93

    Uistingul .-H prezintă codul sursă 34 pentru denirea clasei Student! @e

    observă că atributele clasei se declară ca variabile globale la nivelul

    modulului (în secţiunea Leneral a modulului Student4, iar metodele sunt

    denite conform modalităţii standard 34 de construire a funcţiilor sau

    procedurilor! 4ineînţeles că într-o aplicaţie reală, metodaincarca-ote'8amene4  ar prelua notele dintr-o resursă externă (şier,

    bază de date sau ar invoca o metoda specica a unui alt obiect (care ar

    putea de tip '8amen spre exemplu ! entru simplicarea exemplului, în

    acest caz notele se genereaza aleator!

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    59/93

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    60/93

    tabloului -ote are loc doar dacă valoarea nouă (parametrul nota

    se încadrează în intervalul 1-1>

     

    Instan&ierea claselor. 8anipularea obiectelor prin !ariabile

    În mod similar tipurilor compozite, obiectele se manipulează prinintermediul unor variabile de tip pointer (deţin o referinţă către zona de

    memorie în care sunt stocate datele obiectului!

    entru a obţine un obiect dintr-o anumită clasă utilizăm sintaxa * -'

    Clasa$  În mod similar datelor scalare, obiectele se manipulează prin

    intermediul variabilelor, doar că acestea vor întotdeauna de tip pointer

    (vor primi o referinţă spre zona de memorie în care este stocat obiectul!@ariabilaHpointer = NE-  numeClasa

    5uv&ntul c%eie NE

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    61/93

      8$load-ote'8amene4

      Console$riteine;media ; : 8$-ume : ; esteJ ; : 8$calcul7edia44

      y = 8

      Console$riteine;media ; : y$-ume : ; esteJ ; : y$calcul7edia44  'nd Sub

    'nd 7odule

    În listingul de mai sus este prezentat un exemplu de manipulare a

    datelor asociate prin intermediul unor obiecte de tip @tudent! +ată şi o

    descriere pe scurt a ecărei operaţii*

    1 I se instanţiază clasa Student, de două ori, adresele de memorie ale

    noilor obiecte ind preluate de variabilele x şi L!

    . I numele studenţilor (@tudent]W şi @tudent]Y sunt setate prin

    intermediul atributului -ume  al noului obiect0 utilizăm notaţia cu punctpentru a accesa atributul obiectului prin intermediul variabilei x sau L

    8 I se invocă metoda set-ota4 pentru a atribui nota H pe poziţia 8 în

    tabloul intern de note pentru studentul StudentHY (variabila x

    9 I se aşează a treia notă a studentului W! entru că atributul ote

    este specicat rivate, nu pot accesate elementele printr-un apel de

    genul* stud)$-ote&4! 5a urmare, se invocă metoda get-otainde84

    denită tocmai în scopul de a oferi acces la elementele tabloului!

    : I se modică notele studentului W prin invocarea metodeiloadote"xamene(0 conform implementării (listing .-H această metodă

    va genera note aleatoare şi le va încărca în tabloul -ote !

    ; I se aşează media studentului W

    H- variabila L preia adresa lui x  L şi x vor pointeri către acelaşi

    obiect @tudent (în speţă, @tudent W

    K I se aşează aceleaşi informaţii ca la punctul ; doar că prin

    intermediul variabilei L

    Notă. 3ezi şi prezentarea curs];!ppt (portal!feaa!uiac!ro pentru

    mecanismul de transfer al referinţei la operaţia de atribuire

    Compunerea claselor. Colec&ii de obiecte.

    În mod similar tipurilor compozite, atributele claselor pot tipuri de

    date scalare (predenite sau pot deni referinţe către alte obiecte!

    Procesul prin care construim o clasă cu unul sau mai multe atribute ce vor 

     prelua re0erinţe către obiecte din alte clase se numeşte compunerea

    claselor !

    "

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    62/93

    Pevenind la situaţia exemplicată în secţiunea dedicată compunerii

    tipurilor compozite (subcap! .!., presupunem că dorim să construim clasa

    Zrupa, obiectele din această clasă urm&nd a reprezenta o anumită grupă

    de studenti! )tributele acestei clase ar * idLrupa (indicativul grupei şi

    studenti  (o colecţie de obiecte din clasa Student  denită anterior!entru acest din urmă atribut există două variante de implementare*

    1! sub 0orma unui tablou fără număr precizat de elemente, în mod

    similar exemplului din secţiunea .!.! În acest caz, la momentul

    utilizării unui obiect Lrupa, am asocia membrului studenti  un

    tablou denit explicit cu elemente Student, sau am utiliza

    intrucţiunea >edim 9reser@e (vezi nalul sectiunii .!1 pentru a

    adaugaDsterge un obiect din tabloul respectiv!

    .! sub 0orma unei colecţii dinamice, colecţie reprezentată în 34 totprin intermediul unei clase (predenite * Collection!

    5lasa Collection este mult mai potrivită pentru a implementa colecţii

    dinamice(în care pot adaugateDsterse elemente de obiecte deoarece

    furnizează un comportament natural pentru manipularea elementelor

    colecţiei! Oocmai de aceea o vom utiliza în exemplul nostru! )ceastă clasă

    deneşte următoarele metode*

    = Add (item  , 6e  , be0ore , a0ter   ) #  adauga elementul item

    (poate un obiect sau o valoare de tip scalar (@tring, 'ouble, 3ariant,etc! în colecţie! ltimiii trei parametri sunt opţionali, astfel că, prin

    ignorarea lor, elementul nou, furnizat prin intermediul primului parametru

    (item, va adăugat la s0arşitul colecţiei! rin intermediul parametrilor

    (opţionali be0ore  Da0ter  funrnizăm o poziţie explicită pentru noul element

    (item în colecţie iar prin intermediul parametrului 6e   (trebuie să e o

    valoare de tip String  unică în respectiva colecţie specicăm un alt

    identicator al elementului în locul poziţiei (indexului acestuia!

    = Item (inde% ) > extrage şi returnează elementul de la poziţiaspecicată prin parametrul index ! 'acă s-a utilizat o c%eie de identicare

    a elementeloir colecţiei, parametrul index  poate furniza valoarea c%eii (de

    tip String  aşa cum am precizat mai sus ce va căutată pentru a

    identica elementul asociat!

    = Remo!e(inde%# / elimină din colecţie elementul de la poziţiaDc%eia

    precizată prin index ! +mportant de reţinut este faptul că indicii

    elementelor rămase se vor actualiza în consecinţă (dacă avem : elemente

    şi este extras primul, elementele rămase vor numerotate 1!!9- $ount() I returnează numărul de elemente al colecţiei

    #

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    63/93

    )şadar, o colecţie dinamică va reprezentată de un obiect din clasa

    Collection, obiect pe care îl vom manipula prin intermediul unei

    variabile! În exemplele furnizate în listingul următor se crează un nou

    obiect de tip Collection, şi se testează at&t adăugarea, extragerea,

    ştergerea unor elemente de tip @calar (@tring în cazul de faţă c&t şi a unorobiecte de tip @tudent ! 'easemenea, se testează identicarea

    elementelor prin poziţie, c&t şi prin c%eie (în cazul celei de-a doua

    proceduri, elemenetele de tip @tudent sunt manipulate at&t prin poziţie c&t

    şi printr-o c%eie de tip string cu semnicaţia de matricol

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    64/93

    F!> 'ACZ @ariabila I- colectie

    instructiuni

     

    -'YT

    'upă cum spuneam mai devreme, elementele unei colecţii dinamice de

    tip Collection  pot at&t valori scalare c&t şi alte obiecte! 5a urmare,

    putem deni clasa Lrupa  (ale cărei instanţe vor reprezenta grupe de

    studenti astfel*

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    65/93

    'eşi exemplul deneşte o singură grupă, pot create oric&te obiecte de

    tip Lrupa sau Student!

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    66/93

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    67/93

    )stfel, utilizăm un bloc OrL-5atc% pentru a #prinde$ eventualele erori şi

    a genera un mesa corespunzător! În varianta ., procedura test"rori( va

    funcţiona întotdeauna (mesaul #alte prelucrări$ va apare indiferent dacă

    se declanşează o eroare sau nu, doar că , în cazul în care utilizatorul nu

    introduce un index valid, va obţine mesaul #index invalid$)şadar*

    Try  sec@enXe de cod care pot genera erori la runEtimeCatch e8 as '8ception  sec@enta de cod pentru tratarea erorilor'nd Try

    $ Alte prelucr/ri $

     

    2.". *iste

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    68/93

    relativ complicată a unui nod şi faptul ca, in general, nu se foloseste

    intreaga memorie alocata listei!

    • &mplementarea inlănţuită! +n acest caz, ecare nod conţine doua

    părţi*o  informaţia propriu-zisă si

    o  adresa (pointer către nodului succesor!

    )locarea memoriei ecarui nod se poate face in mod dinamic, in

    timpul rulării programului! )ccesul la un nod necesita parcurgerea

    tuturor predecesorilor săi, ceea ce poate lua ceva mai mult timp!

    +nserareaDştergerea unui nod este in sc%imb foarte rapida! @e pot

    folosi doua adrese in loc de una, astfel incat un nod să conţină, pe

    langa adresa nodului succesor si adresa nodului predecesor!

    !

    5onvenim de asemenea ca 7&(8 ultimul nod din lista = >! )tunci,

    VA7ead va contine informaţia primului nod al listei, 7&(8 ead adresa

    celui de-al doilea nod, VA77&(8 ead informaţia din al doilea nod,

    7&(8 7&(8 ead adresa celui de-al treilea nod etc!

    )cest mod de reprezentare este simplu dar, la o analiza mai atentă,apare o problemă esenţială* cea a gestionarii locaţiilor libere! < soluţie

    elegantă ar să reprezentăm locaţiile libere tot sub forma unei liste

    inlănţuite! )tunci, stergerea unui nod din lista iniţială implică inserarea sa

    in lista cu locaţii libere, iar inserarea unui nod in lista iniţiala implica

    stergerea sa din lista cu locaţii libere! )spectul cel mai interesant este că,

    pentru implementarea listei de locaţii libere, putem folosi aceleaşi tablouri!

    )vem nevoie de o alta variabila, 0reeead, care va conţine indicele primei

    locatii libere din VA7 si 7&(8 ! /olosim aceleasi conventii* daca 0reeead = >inseamnă că nu mai avem locaţii libere, iar 7&(8 ultima locatie libera = >!

    3

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    69/93

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    70/93

    putem folosi o stiva pentru a memora rezultatele intermediare! +ntr-o

    scriere simplicata, iata cum se poate calcula expresia de mai sus*

     pus(:0 pus(J0 pus(K0 pus( pop 6 pop0 pus(90 pus(;0

     pus( pop∗

      pop0 pus( pop∗

      pop0 pus(H0 pus( pop 6 pop0 pus( pop ∗  pop0 ?rite ( pop0

    eturn -othing  'lse  element = @Sti@atop4  top = top E )

      >eturn element  'nd I

    5$

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    71/93

      'nd Function

    'nd Class

    +ata si o secventa de test*  Sub testeSti@a4  Dim s As Sti@a  s = -e Sti@a4  s$initiali

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    72/93

    'unction insert- !! n-1  adauga nodul %  in capul cozii  ead ← (ead61 mod n  i'  ead = tail t,en return #coada plina$  ead ←  % 

      return #succes$

    'unction delete- !! n-1  sterge nodul din coada listei si il returneaza  i'  ead = tail t,en return #coada vida$  tail ← (tail61 mod n   %  ← tail  return  % 

    "ste surprinzator faptul ca testul de coada vida este acelasi cu testul de

    coada plina! 'aca am folosi toate cele n  locatii, atunci nu am puteadistinge intre situatia de #coada plina$ si cea de #coada vida$, deoarece in

    ambele situatii am avea ead = tail! +n consecinta, se folosesc efectiv

    numai n-1 locatii din cele n ale tabloului , deci se pot implementa astfel

    cozi cu cel mult n-1 noduri!

    entru implementarea cozilor, în 34!"O, vom recurge, deasemenea, la

    paradigma orientată pe obiecte! )stfel, denitia clasei oada o regăsim în

    listingul următor*

    efiniţia clasei Coada:9ublic Class Coada  Dim @Coada4  Dim head As ong  Dim tail As ong  9ublic coada9lina As Boolean  9ublic coada.ida As Boolean

      Sub initiali

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    73/93

      'nd Sub

      Function e8trage4 As !bject  I head = tail Then  7sgBo8;Coada @ida;4  >eturn -othing

      'lse

      tail = tail + )4 7od KBound@Coada4 + )4

      I head = tail Then  coada.ida = True  'lse  coada.ida = False  'nd I  >eturn @Coadatail4  'nd I  'nd Function

    'nd Class

    +ată şi o secvenţă de test*Sub testeCoada4  Dim s As Coada  s = -e Coada4  s$initiali

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    74/93

    Rn munca unui programator6 cVutarea !n diferite structuri de date reprezintV o operaţie foarte

    des efectuatV9 ELemplele cele mai frec7ente se referV la cVutarea unei anumite !nregistrVri dintr=un

    fiier de un anumit tip6 regVsirea unei anumite 7alori !ntr=un tablou care conţine mai multe elemente6

     parcurgerea unei liste !n cVutarea unui anumit reper6 etc9 Rn funcţie de specificul problemei concrete

    care trebuie rezol7atV6 fiecare dintre structurile sau 7alorile cVutate pot a7ea sau nu di7erse proprietVţi

    • toate valorile sunt distincte între ele0

    • valorile sunt ordonate în conformitate cu o anumit relaţie de ordine (ex!*

    valorile dintr-un vector sunt ordonate cresctor0

    •  între dou operaţiuni de cutare structura de date nu sufer modicri sau

    pot avea loc operaţiuni de inserareDştergereDmodicare!

    'e asemenea, sortarea elementelor unor liste după anumite criterii constituie

    o parte esenţială a oricărei aplicaţii!'eşi maoritatea limbaelor de programare actuale oferă una sau mai multe

    te%nici implicite (#built in$ de căutare a unor elemente în diverse structuri de

    date, precum şi de stocare a elementelor într-o anumită ordine, totuşi orice

    programator trebuie să e conştient de complexitatea operaţiilor ce se execută în

    asemnea proceduri! +ată de ce prezentăm în continuare cei mai cunoscuţi, şi mai

    simpli, algoritmi de căutare şi sortare  pe structuri statice de date! )lgoritmii

    pentru structuri dinamice de date comportă o complexitate ceva mai ridicată şi

    vor trataţi în secţiuni distincte! Orebuie să precizăm că nu există un #cel maibun$ algoritm, ecare deţin&nd propriile puncte tari şi slabe din punct de vedere

    al vitezei de execuţie sau a cantităţii de memorie!

    %.1.1. Cutarea în mul$imi complet ordonate

    entru a simplica problema, vom considera că datele sunt stocate în vectori

    şi că există un singur criteriu de căutare! 'e asemenea vom lua în considerare

    doar cazul în care elementele vectorului sunt strict ordonate, pentru liste

    neordonate ind necesară parcurgerea secvenţială element cu element, caz ce

    poate uşor pus în practică!

    nul din cei mai cunoscuţi algoritmi de căutare pe mulţimi ordonate este

    #devide-et-impera$! @copul acestui algoritm este de a returna poziţia  la care se

    !ăseşte valoarea căutată n listă!

    )stfel, presupunem c se caut valoarea A în secvenţa Op!!h! reamintim c

    are loc Op B Op61 B 7 B Oh! 'escrierea algoritmului poate denit astfel*

    • se determin m cu pmh ca ind poziţia de miloc a listei (m=(p6hD.0

    • dac )= Om atunci cutarea se termin cu succes0

    • dac )B Om atunci cutarea continu cu subsecvenţa Op !! m-10• dac )C Om atunci cutarea continu cu subsecvenţa Om61 !! h!

    5*

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    75/93

    )şadar, veric dacă elementul căutat nu este cumva egal cu cel aNat la

     umătatea listei! 'acă este mai mic dec&t valoarea de la milocul listei, vom relua

    căutarea doar în segmentul de valori din st&nga iar dacă este mai mare dec&t

    valoarea de la milocul listei vom relua căutarea doar în segmentul din dreapta !

    Figura I-2 ScPema logică pentru reprezentarea algoritmului de căutare ivide &t %mpera

    +ată şi implementarea în 3isual4asic a algoritmului*

  • 8/16/2019 Programare Fundamentale Pentru Incepatori

    76/9


Recommended