Date post: | 05-Jul-2018 |
Category: |
Documents |
Upload: | elenamaria1588 |
View: | 252 times |
Download: | 6 times |
of 93
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