Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Definirea
problemei
Analiza
cerinelor
Arhitectura
global
Proiectare
detaliat (module)
Algoritmi + structuri
de date
Scrierea codului
modulelor
Testarea
modulelor
Testarea
sistemului
Elaborare
documentaie
Implementare i
ntreinere
Figura 1-1 Secvena de activiti ce o presupune dezvoltarea unei aplicaii informatice
elementare : data apare ca o entitate indivizibil din punct de vedere al valorii - aici
includem: simboluri (litere sau caractere speciale ) i numere
lumea real; iat cteva tipuri de date structurate (sau structuri de date): tablouri
unidimensionale sau multidimensionale, liste, arbori, fiiere etc.
Datele structurate vor fi abordate pe larg ntr-o seciune separat
1.1.1.
Dei prin utilizarea unui limbaj de nivel nalt (VB, FoxPro, Java, C, Delphi, etc) datele
elementare sunt manipulate ntr-o manier mult simplificat din perspectiva utilizatorului
limbajului respectiv, orice programator tie c la nivelul sistemului de calcul toate instruciunile
i datele ce alctuiesc un program sunt convertite n iruri de bii (iruri de valori 0 i 1). n cele
ce urmeaz vom prezenta tehnicile de baz prin care datele elementare (simboluri i numere)
sunt reprezentate n memoria intern a calculatorului.
Reprezentarea simbolurilor (litere i caractere speciale)
O metod de a reprezenta datele la nivelul sistemului de clacul const n proiectarea unui
sistem de coduri n care fiecrui simbol i se asociaz o combinaie unic de bii. n vremurile de
nceput ale tehnologiei informaiei au existat mai multe astfel de sisteme de codificare,
multitudinea lor promovnd ambiguitate i dificulti n ncercrile de comunicare ntre mai
multe sisteme de calcul. Pentru a elimina aceast situaie se impunea adoptarea unui sistem
standard care s fie implementat de toi productorii de sisteme hardware i software.
n anii 70 American National Standards Institute (ANSI) a dezvoltat sistemul de codificare
ASCII American Standard Code for Information Interchange care a devenit n scurt timp
extrem de popular i care este utilizat pe scar larg i astzi. Iniial acest sistem de codificare
utiliza un model de 7 bii (o niruire de 0 i 1) pentru a reprezenta literele mari i mici ale
alfabetului englez, caracterele de punctuaie, cifre de la 0 la 9 i anumite informaii de control.
Astzi ASCII reprezint simbolurile printr-o combinaie unic de 8 bii care nu numai c se poate
stoca foarte uor n memorie (celul de memorie= 1 byte (octet) =8 bii) dar ofer posibilitatea
reprezentrii unui numr de 256 (28)de simboluri diferite, suficiente pentru a reprezenta spre
exemplu toate caracterele ce pot fi introduse prin intermediul tastaturii. Spre exemplu, dac
utilizm harta de coduri ASCII (www.ansi.org ), irul de caractere Hello va fi reprezentat astfel:
01001000 01100101 01101100 01101100 01101111 00101110
Pe lng ASCII, care este cel mai utilizat sistem de codificare la momentul actual, exist i
alte sisteme care ofer posibilitatea reprezentrii caracterelor ntr-o manier mult mai extensiv.
Spre exemplu, sistemul de codificare UNICODE (dezvoltat ca urmare a cooperrii ntre liderii de
pia n industria hardware i software) utilizeaz 16 bii pentru a reprezenta n mod unic un
caracter oferind astfel 65536 (216) de combinaii unice, suficiente pentru a acoperi necesitile
alfabetelor chinezesc i japonez.
Reprezentarea valorilor numerice
Metoda de stocare intern a informaiei sub form de combinaii unice ntr-un sistem de
coduri este totui ineficient atunci cnd datele reprezint valori numerice. Astfel, dac ar fi s
apelm la ASCII pentru a reprezenta numrul 37, ar fi necesari 16 bii (2 octei) , cte un octet
pentru fiecare cifr. Prin aceast tehnic un numr mai mare de 99 nu va putea fi stocat ntr-un
interval de 16 bii. O abordare mult mai eficient ar fi reprezentarea numrului nu n baza zece
( cifre de la 0 la 9 ) ci n baza doi (0 i 1).
1.1.2.
Datele unei probleme apar n algoritmi sub form de variabile. n informatic varibila
reprezint un nume atribuit unei adrese (celule) de memorie care stocheaz o valoare. Spunem
astfel, c varibila identific valoarea respectiv. Noiunea de variabil este folosit i n
matematic. De pild, spunem c f(x, y)=2x+3y+5 este funcie de dou variabile independente
x i y. n programare, noiunea de variabil are un neles puin diferit. Mai exact, o variabil
poate lua valori dintr-o mulime bine precizat, care, ca i n matematic, se numete domeniul
de definiie al variabilei, dar la un moment dat variabila are o valoare bine precizat.
Nume
Tipul datei (domeniul de valori acele valori care pot constitui la un moment dat
valoare curent)
Valoare curent
Domeniu de vizibilitate
Variabila
NumeVariabila + (TIP)
+ Valoare
V1+ (INTEGER) +
(Adr2)
1254
(Adr1)
Pointer
V2+ (POINTER) +
(Adr9)
(Adr2)
(Adr8)
Aa cum se poate intui, n acest exemplu ambele variabile, V1 i V2, lucreaz cu aceeai
valoare, cu alte cuvinte ntr-un algoritm, manipularea valorii 1254 se poate efectua prin
intermediul oricreia din cele dou variabile. ntr-un mod formalizat:
V1 1254
V2 ADDR(V1)
SCRIE V1 (se va afisa 1254)
SCRIE V2 (se va afisa (Adr2))
SCRIE DEREF(V2) (se va afisa 1254)
DEREF(V2) 256
SCRIE V1 (se va afisa 256)
n algoritmul de mai sus prin DEREF specificm 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).
Pe parcursul dezvoltrii programelor, pot apare anumite date a cror valoare nu se schimb
pe parcursul execuiei. Dac respectivele date sunt utilizate n mod direct, folosim noiunea de
literal: x+2 2 este un literal. Dac ns unui literal i se atribuie chiar de la nceputul execuiei
programului un identificator (un nume), iar pe parcursul programului utilizm acel nume (n mod
similar variabilelor) n locul valorii explicite, spunem c am definit o constant. Constantele
dein toate caracteristicile variabilelor (nume, domeniu, adresa) dar sunt mrimi care nu i
modific valorile n timpul efecturii calculelor. De pild, ntr-un program pentru controlul
traficului aerian la un aeroport, o mrime intens utilizat n calcule este altitudiunea aeroportului
fa de nivelul mrii: s zicem 30m. Dac utilizm direct valoarea 30 n calcule, tranferul
programului la un alt aeroport (plasat s zicem la 40m altit.) va implica modificarea tuturor
liniilor de program ce utilizeaz valoarea respectiv. Dac ns declarm o constant
AltitAeroport 30 i utilizm aceast constant n toate operaiile de calcul, la tranferul
programului nu va trebui dect s modificm valoarea constantei AltitAeroport i s rulm
aplicaia.
Aadar, n orice algoritm manipulm datele prin intermediul variabilelor i a constantelor.
Operaiile fundamentale ce se pot realiza ntr-un algoritm sunt:
utilizarea operatorilor relaionali (=, <,>, <>, #, <=, >=) i, eventual, a operatorilor logici (AND,
OR, NOT). Valoarea logic obinut se utilizeaz de obicei n cadrul unor structuri de control
alternative.
A 10
Operaia
B 20
IF A<>0 THEN
de
decizie
R -B/A
END IF
Operaii de Intrare/Ieire se refer la furnizarea unor valori iniiale ale variabilelor (citire)
prin intermediul unei componente externe algoritmului sau extragerea valorilor unor variabile i
furnizarea lor pentru afiare/stocare pe un suport extern (scriere).
1.1.3.
Elemente de sintax VB .NET (tipuri de date, variabile, operaii, structuri
de control)
Anatomia unui program VB .NET
1. Un program VB .NET poate fi alctuit din unul sau mai multe module
2. fiecare modul poate fi de un anumit tip
3. modulele uzuale sunt :
a. module ce conin secvene de cod executabile (proceduri i funcii)
b. module ce conin elemente de interfa grafic-utilizator (formulare i
rapoarte)
4. un modul poate conine mai multe secvene de cod executabile separat, denumite
subrutine:
a. proceduri se declar i delimiteaz prin expresiile rezervate SUB / END SUB
b. funcii se declar prin FUNCTION / END FUNCTION
5. pentru fiecare rutin trebuie s se precizeze numele i, eventual parametri (vom
reveni mai trziu asupra acestoir aspecte)
6. fiecare rutin va conine, de regul, trei zone de cod, logic separate i n ordinea
urmtoare:
a. declaraii de variabile utilizate
b. iniializarea variabilelor utilizate
Tipul
Descriere
Boolean Denumit i logic, poate lua doar valorile True sau False. True i False sunt
cuvinte rezervate n Visual Basic.
Byte
Date
Memorie
Alocat
Depinde
de
platforma
1 Byte
8 bytes
trebuie declarat,
Operator
+
*
/
\
Mod
^
&
AND
OR
NOT
Exemplu
Descriere
Opeartori aritmetici
Sal + Imp
Adun valorile celor dou variablile.
Pret 10000
Scade o valoare din alta.
Total * ProcTVA
nmulete dou valori.
Total / 12
mparte o valoare la alta.
102\4
Calculeaz ctul unei mpriri cu rest.
Calculeaz restul unei mpriri.
6 Mod 4
6 MOD 4=2
X^3
Ridic valoarea X la puterea 3.
Operatori pentru iruri de carcatere
Concateneaz dou iruri (se poate
Nume1 & Nume2
folosi i semnul + care, n cazul irurilor
nseamn concatenare i nu adunare).
Operatori logici
X=True
Y=False
X AND Y = False
X=True
Y=False
X OR Y = True
X=True
NOT X = False
10
XOR
X
True
False
True
False
Y
True
True
False
False
X Xor Y
False
True
True
False
3 + 2 * 4 + 1 = 12
(3 + 2) * (4 + 1) = 25
102/4=25.5
102\4=25
102 Mod 4=2
La folosirea operatorilor aritmetici pentru efectuarea de calcule, tipul de dat al rezultatului,
dac nu este declarat n prealabil, este dat de tipul de dat cel mai precis.
Exemplu:
De asemenea, operatorul & este recomandat atunci cnd se dorete obinerea unui
text prin concatenarea unoir valori de tipuri diferite. n acest caz, operatorul & va ncerca
o conversie automat a tipurilor non-String, spre deosebire de operatorul + care are
genera o eroare. Spre exemplu
Dim a as Integer
Dim b as String
Dim rezultat as String
A=2
B=test
Rezultat=b & a valoarea variabilei Rezultat va fi
test2
11
Pseudocod
START
FALSE
Cond
TRUE
AB+C
WRITE a,b,c
READ a,b,c
Pseudocod
BEGIN
END
IF Cond THEN
ELSE
END IF
A=B+C (sau)
AB+C
READ a,b,c
WRITE a,b,c
CALL Proc1
Proc1
Semnificaie
nceput /sfrit algoritm
Bloc
de
decizie
(se
evalueaz condiia Cond).
n
pseudocod
trebuie
evideniat sfritul blocului
Operaie de atribuire i
evaluare expresii de calcul
Citete / Scrie valorile
variabilelor a,b,c
Apel
de
(subprogram)
procedur
Reprezentarea unui algoritm fie prin intermediul schemelor logice (Aranjarea simbolurilor
grafice ntr-o anumit ordine) fie prin pseudocod (enumerarea cuvintelor rezervate ntr-o
anumit ordine) are la baz cteva structuri fundamentale de control ce sunt utilizate n
diverse combinaii pentru a rezolva orice problem algoritmic:
structura iterativ(repetitiv) -
12
Corpul (subsetul de operaii) unei structuri alternative sau iterative poate fi la rndul su
reprezentat prin oricare din cele trei structuri : secvena, decizia, iteraia.
1.2.1.
Reprezentarea structurilor de control. Scheme logice, Pseudocod, Limbaje
Diverse
13
Schema Logica
START
A1
Pseudocod
BEGIN
A1
B2
CA+B
B2
WRITE C
END
VisualBasic
FoxPro
Structura secvenial
Private Sub Secventa()
DIM a,b,c as Integer
a=1
b=2
c=a+b
a=1
b=2
c=a+b
?c
Console.WriteLine(c)
End Sub
CA+B
Java
public static void
main(String[] args)
{
int a=1;
int b=2;
int c=a+b;
System.out.print(c);
}
Oracle PL/SQL
DECLARE
a Integer;
b Integer;
c Integer;
BEGIN
a:=1;
b:=2;
c:=a+b;
DBMS_OUTPUT.PUT_LINE(c);
WRITE C
END;
STOP
Structura Alternativa
14
BEGIN
B2
START
B2
FALSE
B>0
WRITE
Negativ
TRUE
WRITE
Pozitiv
IF B>0 THEN
WRITE Pozitiv
ELSE
WRITE Negativ
END IF
END
Else
B=2
If b>0
? pozitiv
Else
? negativ
Endif
Console.WriteLine ("Negtiv")
End If
End Sub
}
STOP
declare
b Integer;
begin
b:=2;
if b>0 then
DBMS_OUTPUT.PUT_LINE(
'Pozitiv');
else
DBMS_OUTPUT.PUT_LINE(
'Negativ');
end if;
end;
15
BEGIN
B2
START
B2
B>0
TRUE
WRITE
Pozitiv
IF B>0 THEN
WRITE Pozitiv
END IF
END
End If
End Sub
B=2
If b>0
? pozitiv
Endif
STOP
declare
b Integer;
begin
b:=2;
if b>0 then
DBMS_OUTPUT.PUT_LINE(
'Pozitiv');
end if;
end;
16
BEGIN
i1
START
N1
i1
While i<=8 Do
NN*I
N1
ii+1
i<=8
TRUE
NN*i
END While
WRITE N
END
N=1
For i=1 to 8
N=N*i
EndFor
?N
End Sub
Varianta While-DO:
ii+1
FALSE
WRITE N
Pozitiv
STOP
Varianta While-DO:
Private Sub Secventa()
DIM i, n as Integer
N=1
i=1
Do While i <= 8
N=N*i
i=i+1
Loop
Console.WriteLine (N)
N=1
i=1
Do While i<=8
N=N*i
i=i+1
EndDo
?N
End Sub
public
static
void
main(String[] args) {
int n=1;
for (int i=1;i<=8;i++)
n=n*i ;
System.out.print(n)
;
}
Varianta While-DO:
public
static
void
main(String[] args) {
int n=1;
int i=1;
while (i<=8)
{ n=n*i;
i++;
}
System.out.print(n);
}
declare
N Integer;
begin
N:=1;
For i in 1..8 Loop
N:=N*i;
End Loop;
DBMS_OUTPUT.PUT_LINE(N);
end;
Varianta While-DO:
declare
N Integer;
i Integer;
begin
N:=1;
i:=1;
While i<=8 Loop
N:=N*i;
i:=i+1;
End Loop;
DBMS_OUTPUT.PUT_LINE(N);
end;
17
BEGIN
i1
START
i1
N1
N1
DO
NN*I
ii+1
While i<=8
WRITE N
END
NN*i
ii+1
i<=8
FALSE
WRITE N
Pozitiv
STOP
TRUE
Nu implementeaza
public
static
void
main(String[] args) {
int n=1;
int i=1;
do
{ n=n*i;
i++;}
while (i<=8);
System.out.print(n);
}
declare
N Integer;
i Integer;
begin
N:=1;
i:=1;
Loop
N:=N*i;
i:=i+1;
EXIT WHEN i >8;
End Loop;
DBMS_OUTPUT.PUT_LINE(N);
end;
18
Un
caz
special
de
structur
alternativ
este
aa
numita
structur
Else
Console.WriteLine("numar in afara domeniului precizat ")
End If
Un alt caz special se refer la necesitatea ieirii forate dintr-o bucl repetitiv
FOR, la prima validare a unei condiii. Spre exemplificare vom recurge la un
algoritm pentru testarea apartenenei unui numr la mulimea numerelor prime.
Astfel, dac analizm secvena de cod de mai jos, observm c, pe msur ce se
testeaz rezultatul mpririi numrului la toate numerele mai mici dect el, n
cazul n care se descoper un rest=0, nu mai are sens testarea celorlate. Ca
urmare, instruciunea EXIT FOR este utilizat pentru a ntrerupe forat execuia
buclei FOR.
19
Sub testIesireFortataFor()
Dim nr, i As Integer
Dim este As Boolean
este = True
nr = InputBox("intro un nr intreg")
For i = 2 To nr - 1
'Console.WriteLine(i) ' uncomment pentru testarea iesirii fortate
If (nr Mod i) = 0 Then
este = False
Exit For
End If
Next
If (este) Then
Console.WriteLine("numarul " & nr & " este nr prim")
Else
Console.WriteLine("numarul " & nr & "nu este nr prim")
End If
End Sub
Instruciune
i1
N1
i<=4?
NN*i
ii+1
i<=4?
NN*i
ii+1
i<=4?
NN*i
ii+1
i<=4?
NN*i
ii+1
i<=4?
WRITE N
EvalCond
TRUE
TRUE
TRUE
TRUE
FALSE
i
1
1
1
1
2
2
1
3
3
3
4
4
4
5
5
5
N
1
1
1
1
1
2
2
2
6
6
6
24
24
24
24
20
START
READ a,b,c
Pozitiv
FALSE
TRUE
a<>0
b^2 4*a*c
x-c/b
WRITE x
Pozitiv
FALSE
>0
TRUE
X1=(-b - SQRT()) / (2*a)
FALSE
TRUE
=0
WRITE b/(2*a)
Pozitiv
WRITE X1, X2
Pozitiv
STOP
1.3.
Modularizarea programelor..
21
a transfera
controlul
1.3.1.
Funcii
Controlul execuiei
Transfer date-rezultat
FUNCIE
22
module care necesit date de intrare pentru a realiza prelucrri asupra lor, iar
aceste date sunt preluate odat cu controlul execuiei de la programul apelant.
atext
b2
c3
CALL P(a,b)
X=F(c)
text,2
PROCEDURA P
(params: p1,p2)
Controlul execuiei
p1text
p22
Transfer date-rezultat
Transfer date
parametri
FUNCIA F
(params: p1)
p13
1,5
RETURN p1/2
Figura 1-4 Transferul de parametri
P(text, 2)
23
V=NumeFuncie(lista_parametri_actuali)
n timp ce pentru a invoca o procedur este nevoie de o instruciune
special implementat la nivelul limbajului (spre exemplu CALL n VB):
CALL NumeProcedura (lista_parametri_actuali)
Iat un exemplu de problem n care definim cteva module specializate
(proceduri i funcii): s se calculeze media semestrial a studenilor unei
specializri tiind c au fost doar dou examene, fiecare cu o pondere diferit
(0.4 x nota1+0.6 x nota2) n media final. n acelai timp, pentru fiecare student
s se afieze dac beneficiaz de cazare i/sau de burs. Repartizarea n cmine
a studenilor se face pe baza mediei acestora : 7<=medie<8 camin1,
8<=medie<9 camin2, 9<=medie<10 camin3. Exist dou tipuri de burse
repartizte astfel: 9<=med<9.5 burs_studiu, 9.5<=med<10 burs_merit .
Datele de intrare se prezint sub forma unei matrici (prima coloan =numele
studenilor iar urmtoarele dou notele) astfel (vezi mai intai seciunea 2.1
dedicat tablourilor):
Student
10
10
1
Student
2
Student
3
Student
24
PRINCIPAL
CalculM
READ Matrice(4,3)
I1
Media4
TRUE
I<=4
N1>=5
And
N2>=5
MEDCalculM(Matrice(I,2),Matrice(I,3) 0.4, 0.6)
FALSE
FALSE
WRITE
Restante
MED>=5
FALSE
TRUE
RepartCamin(Matrice(I,1), MED)
Return Media
RepartBurse (Matrice(I,1), MED)
II+1
STOP
TRUE
MediaN1*C1+ N2*C2
25
RepartCamin
FALSE
TRUE
MedS>=7
MedS>=8
TRUE
MedS>=9
TRUE
STOP
RepartBurse
FALSE
MedS>=9
TRUE
MedS>=9.5
STOP
TRUE
26
27
28
29
ElseIf nr = 1 Then
Console.WriteLine("unu")
Return
ElseIf nr = 2 Then
Console.WriteLine("doi")
Return
ElseIf
Else
Console.WriteLine("numar in afara domeniului precizat ")
End If
End SUB
Else
Return ""
End If
End Function
30
Dim Media = 4
If N1 >= 5 And N2 >= 5 Then
Media = N1 * C1 + N2 * C2
End If
Return media
Debug.print(After Process)
End Function
1.3.2.
prin adres (sau prin referin) - modul implicit n Visual Basicparametrii formali din procedura apelat vor prelua ca valoare adresa
valorilor parametrilor actuali (vezi noiunea de pointer). Ca urmare, att
variabilele din rutina apelant ct i cele ce constituie parametrii
formali n subrutin vor manipula aceeai valoare: modificarea
valorilor varibilelor ce constituie parametrii formali n cadrul subrutinei
va nsemna, de fapt, modificarea valorilor parametrilor actuali din rutina
principal(vezi figurile 1-9 i 1-10).
Transmiterea
prin
valoare
protejeaz
variabilele
din
rutina
principal
31
Subrutina
Pas 1: a=1
Proc(b)
a
Pas3 b=25
25
25
Pas4: WRITE a
Figura 1-5 Dou modaliti de transmiterea valorilor parametrilor (prin referin i prin valoare)
Rezultat execuie
testTransferParametri()
32
Rezultat execuie
testTransferParametri()
1.3.3.
33
1.3.4.
care a fost declarat (dac aceasta este o decizie IF - sau o iteraie FOR, WHILE, variabila declarat n cadrul structurii nu va fi vizibil n
afara ei , chiar dac este vorba de aceeai subrutin ) : Java,
VisualBasic .NET, C#.NET
Am vzut mai devreme c o variabil poate fi declarat explicit prin utilizarea
instruciunii DIM. Locul n care este plasat instruciunea DIM este important
pentru c determin domeniul de vizibilitate al respectivei variabile. Spre
exemplu, secvena:
Sub testWhile(ByVal a)
Do While a < 5
Dim x = 0
Debug.Print("A")
Loop
Debug.Print("a " & x)
End Sub
34
Userii
din
grupul
Studeni
nu
au
dreptul
execute
35
aceast variabil pentru a afla dac utilizatorul face parte din grupul celor
care au drepturi de execuie. Pentru valorile de test ale variabilei
userProfile este indicat s definim cte o constant pentru fiecare grup
distinct de utilizatori.
Listing 1-2 Modulul VisualBasic Login
Public Const USER_GROUP_STUDS = 1
Public Const USER_GROUP_PROFI = 2
Public userProfile As Double
Function login(userName As String, pass As String) As Boolean
Dim ok As Boolean
If userName = "Popescu" And pass = "popescu" Then
userProfile = USER_GROUP_STUDS
ok = True
End If
If userName = "prof1" And pass = "prof1" Then
userProfile = USER_GROUP_PROFI
ok = True
End If
login = ok
End Function
1.4.
Funcii de conversie
36
Unde: <expression> reprezint argumentul obligatoriu sub forma oricrei expresii ce poate fi evaluat
la un tip numeric, String sau Date (depinde de scopul funciei)
Tip Returnat
Cbool
Input:
numar
Boolean
Exemplu
Dim A, B, C As Integer
Dim Check As Boolean
orice
A = 5
sau
B = 5
expresie evaluata
Check = C B o o l ( A = B)
la true/false
' ...
C = 0
Check = C B o o l ( C)
CChar
Char
CDate
Date
CDbl
Double
CDec
Decimal
CInt
Integer
CLng
Long
CShort
Short
37
CStr
String
sistemul
va
ncerca
efectueze
singur
conversiile
corespunztoare.
Sub testFunctiiMatematice()
Console.WriteLine("abs - valoare absoluta:" & Math.Abs(-2) & " / " & Math.Abs(2))
Console.WriteLine("round - rotunjire :" & Math.Round(2.54) & " / "
Math.Round(2.2))
Console.WriteLine("Ceiling - primul intreg mai mare: " & Math.Ceiling(2.54) & " /
& Math.Ceiling(2.2))
Console.WriteLine("Floor - primul intreg mai mic: " & Math.Floor(2.54) & " / "
Math.Floor(2.2))
Console.WriteLine("Sqrt - radacina patrata: " & Math.Sqrt(4) & " / "
Math.Sqrt(9) & " / " & Math.Sqrt(-9))
'functii in afara modului math
Console.WriteLine("Int - partea intreaga: " & Int(2.54) & " / " & Int(2.2))
Console.WriteLine("Rnd - numar aleator intre 0-1: " & Rnd())
Console.WriteLine("Rnd * 100 - numar aleator intre 0-100: " & Rnd() * 100)
End Sub
&
"
&
&
38
2.1.
Tablouri
Una din cele mai utilizate structuri de date este tabloul (array), structur care
prezint datele ntr-o form rectangular, fiecare valoare fiind stocat ntr-o
celul astfel nct programatorul poate la un moment dat manipula valoarea
respectiv prin intermediul poziiei sale. Identificarea valorii prin intermediul
poziiei sale n cadrul tabloului (cu alte cuvinte identificarea celulei de memorie
intern ce conine respectiva valoare) cade n sarcina translatorului limbajului de
programare cu care se lucreaz. Exist dou tipuri de tablouri: unidimensionale i
multidimensionale.
Tablouri Unidimensionale (figura 2-1) tablouri cu o singur linie i n
coloane numite i vectori reprezint datele sub forma unei liste ordonate de
celule de memorie (cu adrese consecutive) creia i se atribuie un nume pentru
identificare. Fiecare celul va stoca o valoare. Accesul la o anumit valoare se
realizeaz prin numele listei i poziia (numit i index) elementului n list. Spre
exemplu, notele unui student la patru discipline dintr-un semestru pot fi
reprezentate prin intermediul unui vector cu numele Note, ce va conine, patru
valori localizate fizic n patru celule de memorie cu adrese consecutive. Pentru a
manipula nota la cea de-a doua discplin, vom utiliza o sintax de genul Note(2)
(sau Note[2] n funcie de limbajul utilizat) astfel: pentru preluarea notei putem
spune:
Note(2)=8.7
Iar pentru a calcula ulterior media:
Medie=(Note(1)+Note(2)+)/4
Numele tabloului (Note) este n esen un pointer (o variabil ce conine o
adres) spre valoarea din prima celul a tabloului. Astfel,
pentru a extrage o
39
Adrese de memorie
101
9
Celule de memorie
102 103
8.7
6
104
6
Note(1)
Note(2)
Note(3)
Note(4)
Figura 2-10
10
4
10
7
9
10
5.5
9
10
Disciplina 1
6
10
9
Student 1
Student 2
Student 3
Disciplina 4
Disciplina 2
Disciplina 3
40
celule de memorie vor constitui prima linie, urmtoarele patru vor constitui cea
de-a doua linie, .a.m.d vezi figura 2-2). Numele tabloului (Note) este de fapt o
variabil-pointer spre prima valoare din irul astfel obinut. Avnd n vedere c
tim prima adres a irului de celule de memorie ce stocheaz valorile noastre, i
c adresele respectivelor celule sunt ntotdeauna consecutive, adresa fizic a
unui element al tabloului (valoare
Linia 1
Linia 2
Linia 3
Reprezentarea tabloului n
memorie
Linia 1
100 101
102
Linia 2
103 104 105
106
Linia 3
107 108
109
110
111
Valoarea Note(3,2)
41
42
End Sub
End Module
Figura 2-12 Fereastra Immediate afieaz mesajele trimise din procedura Tablouri()
Dup cum s-a vzut anterior (listing 2-1), pentru a parcurge un vector element
cu element utilizm o bucl FOR a crei variabil-contor va fi utilizat pe post de
index pentru a manipula valorile de la respectiva poziie n vector. Pentru a
parcurge o matrice, element cu element,
repetitive FOR imbricate (una pentru linii iar urmtoarea pentru fiecare coloan).
n acest fel parcurgerea va nsemna mai nti prelucrarea elementelor primei linii
(n ordine de la stnga la dreapta) apoi a elementelor celei de-a doua linii
.a.m.d.
Se observ c n procedura Tablouri() pentru a parcurge tablourile, limita
inferioar i superioar a contorului buclelor FOR (i i j) se specific prin literali
(0,2,3). Exist i posibilitatea de obine valoarea acestor literali (adic a limitei
superioare i inferioare a indexului unui tablou), prin utilizarea urmtoarelor
funcii predefinite n VisualBasic:
LBound(<tablou> [,dimensiune]) pentru limita inferioar;
UBound(<tablou> [,dimensiune]) pentru limita superioar.
43
44
Redim
Preserve
Vector(Ubound(vector)+1)
End Sub
Va afia text0text1
45
DIM <atribut_N>
AS
<tipAtribut_1>
END STRUCTURE
<nota>
1 noile tipuri pot fi vizibile (pot fi utilizate la declararea variabilelor)
doar n modulul n care sunt declarate (prin utilizarea specificatorului de
vizibilitate Private, sau n toate modulele proiectului, prin cuvntul
rezervat Public (VEZI i figura 2-4).
2- n locul instruciunii DIM pot fi utilizai specificatori de vizibilitate,
astfel: PUBLIC (atributul va fi accesibil din aplicaiile-client), PRIVATE
(atributul nu va fi accesibil prin intermediul varibilelor din aplicaii)
46
3- dac unul din atribute este de tip tablou (note n figura de mai jos),
lungimea acestuia nu poate fi specificat, urmnd ca, la momentul
declarrii unei variabile de acel tip, s utilizm instruciunea REDIM (vezi
anterior paragrafele dedicate tablourilor) pentru a specifica numrul de
elemente pentru tabloul respectiv.
</nota>
n VB, definirea tipurilor proprii trebuie obligatoriu realizat n seciunea
Declarations a unui modul (adic imediat la nceputul modulului).
Spre 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 figura 2-4). Desigur,
numrul de atribute descriptive ale noului tip depinde doar de necesitile
problemei sau de imaginaia i experiena programatorului.
47
nregistrrile tabelei sunt instane ale acelei entiti, adic valori reale
setate pentru fiecare din atributele tabelei.
n listingul 2-3 este prezentat un exemplu de manipulare a datelor de
tip Student. Se observ c se declar dou variabile de tip Student,
variabile prin intermediul crora vom manipula datele a doi studeni.
Listing 2-3. Utilizarea tipurilor compozite pentru manipularea datelor entitilor reale.
Sub aplicatieSimpla_test_Types()
Dim stud_1 As Student
Dim stud_2 As Student
Dim i As Integer
'redimensionam tablourile :
ReDim stud_1.note(4)
ReDim stud_2.note(4)
'initializam atributele :
stud_1.nume = "Gigel"
stud_1.matricol = "EL101"
stud_1.dataNasterii = #10/31/1982#
stud_1.note(0) = 10
stud_1.note(1) = 8
stud_1.note(2) = 5
stud_1.note(3) = 7
stud_1.note(4) = 10
stud_2.nume = "Costel"
stud_2.matricol = "EL102"
stud_2.dataNasterii = #2/22/1982#
stud_2.note(0) = 10
stud_2.note(1) = 9
stud_2.note(2) = 10
stud_2.note(3) = 9
stud_2.note(4) = 10
Console.WriteLine("notele studentului " & stud_1.nume)
For i = 0 To 4
Debug.Print(stud_1.note(i))
Next
End Sub
48
stud_2,
care
preia
alte
valori
pentru
aceleai
atribute
Not!
Vezi
prezentarea
curs_6.ppt
(portal.feaa.uiac.ro)
pentru
49
sumaNote = 0
restanta = False
For i = LBound(stud.Note) To UBound(stud.Note)
If stud.Note(i) < 5 Then
restanta = True
Exit For
Else
sumaNote = sumaNote + stud.Note(i)
End If
Next
If restanta Then
calculMedia = 4
Else
calculMedia = sumaNote / UBound(stud.Note) - LBound(stud.Note) + 1
End If
End Function
Vom utiliza aceast funcie ntr-o aplicaie precum cea din listingul 2-5.
Procedura aplicaie() const n construirea unui vector de studeni
(elementele vectorului vor fi de tip Student), atriburea unor note aleatoare
fiecrui student i invocarea funciei calculMedia() cu fiecare element al
vectorului drept parametru actual.
Se observ c, n mod similar variabilelor, atributele unui element al
vectorului vectStudenti se acceseaz prin utilizarea notaiei cu punct:
vectStudenti(1).Nume = "Gigel"
50
Not. Funcia IIF (IF imediat) o putem utiliza n locul unei structuri IFTHEN-ELSE i are urmtoarea definiie:
IIF(condiie, val_return_if_True, val_return_if_false)
Iat i rezultatul execuiei procedurii din listingul 2-5
51
COMPUNEREA TIPURILOR
Am vzut, mai devreme, c atributele ce descriu un tip compozit pot fi
att tipuri primitive (String, Double, Date etc.) ct i tipuri structurate
(tabloul Note pentru exemplul tipului Student). Exist ns i posibilitatea
de a declara un atribut al unui tip compozit ca fiind de un alt tip compozit.
Mai mult, un atribut poate stoca o structur (tablou) de entiti din alte
tipuri. Astfel, dac ne propunem s gestionm, ntr-o aplicaie, gupe de
studeni, putem spune c o grup este caracterizat de un numr
52
53
operaie de atribuire
Grupa_1.studenti(1).nume=Apetrei Marius
54
manipulate
ntr-o
manier
abstractizat,
mult
mai
55
care
se
asociaz
mod
indivizibil
claselor
prin
care
56
pentru fiecare student erau preluate n mod aleator, tot ntr-un algoritm
distinct, cu numele aplicatie (listing 2-5)
n cele ce urmeaz, vom schimba maniera de abordare a problemei:
vom construi o clas care va descrie entitatea Student prin intermediul
acelorai atribute (matricol,nume, datanasterii i vectorul Note) iar
pentru calculul mediei i preluarea notelor vom defini dou metode
(operaii) la nivelul acestei clase. Ca urmare, la nivelul aplicaiei, dup
instanierea claselor i obinerea obiectelor de tip Student, vom trimite
cte un mesaj fiecrui obiect pentru a genera notele i a obine mediile.
Astfel, logica prelucrilor se transfer de la nivelul aplicaiei la nivelul
definirii operaiilor pentru fiecare tip din spaiul problemei.
Algoritmi (module aplicaie)
Stud1
Stud3
Aplicatie
Stud2
Stud1
Stud2
Stud3
Grupa
obiecte
Grupa
Date
Programare Procedural
Aplicaie=Algoritmi+date
Programare orientat-obiect
Aplicaie= Ansamblu de obiecte ce comunic prin
mesaje
Matricol
Nume
Datanasterii
Note[ ]
Atribute
CalculMedia()
IncarcaNoteExamene()
SetNota(ByVal nota, index)
GetNota(index)
Metode
57
58
Bineneles
ntr-o
aplicaie
real,
metoda
59
prin
intermediul
unor
metode,
putem
defini
asemenea
bineneles dac
indexu-ul primit ca
60
tabloului Note are loc doar dac valoarea nou (parametrul nota)
se ncadreaz n intervalul 1-10
Instanierea claselor. Manipularea obiectelor prin variabile
n mod similar tipurilor compozite, obiectele se manipuleaz prin
intermediul unor variabile de tip pointer (dein o referin ctre zona de
memorie n care sunt stocate datele obiectului).
Pentru a obine un obiect dintr-o anumit clas utilizm sintaxa : NEW
Clasa. n mod similar datelor scalare, obiectele se manipuleaz prin
intermediul variabilelor, doar c acestea vor fi ntotdeauna de tip pointer
(vor primi o referin spre zona de memorie n care este stocat obiectul).
variabila_pointer = NEW numeClasa
Cuvntul cheie NEW are rolul de a aloca o nou zon de memorie
pentru a stoca valorile atributelor noului obiect.
Ulterior, pentru a adresa atributele obiectului i a citi/scrie valori,
utilizm varibila i notaia cu punct n mod similar tehnicii prezentate
pentru cazul tipurilor compozite (vezi subcapitolul anterior):
Variabila_pointer.atribut=valoare
Aceeai notaie cu punct se utilizeaz i pentru a invoca o metod a
obiectului ( a transmite un mesaj):
Call Variabila_pointer.metoda()
61
x.loadNoteExamene()
Console.WriteLine("media " & x.Nume & " este: " & x.calculMedia())
y = x
Console.WriteLine("media " & y.Nume & " este: " & y.calculMedia())
End Sub
End Module
se
modific
notele
studentului
prin
invocarea
metodei
62
2.
prin
index.
Important
de
reinut
este
faptul
indicii
63
de
tip
Student
Deasemenea,
se
testeaz
identificarea
Sub testColectii()
Dim c As Collection
c = New Collection
c.Add("abc")
c.Add("def")
Console.WriteLine("elementul
Console.WriteLine("elementul
c.Add("xyz", Before:=2)
Console.WriteLine("elementul
Console.WriteLine("elementul
c.Remove(2)
Console.WriteLine("elementul 1 dupa remove: " & c.Item(1))
Console.WriteLine("elementul 2 dupa remove: " & c.Item(2))
End Sub
Sub testIdentificarePrinCheie_Colectii()
Dim c As Collection
c = New Collection
c.Add(New Student, "EL01")
c.Add(New Student, "EL02")
c.Item(1).nume = "Student 1"
c.Item(2).nume = "Student 2"
c.Item("EL01").dataNasterii = #1/15/1985#
c.Item("EL01").dataNasterii = #10/24/1986#
Console.WriteLine("elementul 1: " & c.Item(1).nume & " nascut la : " &
c.Item(1))
Console.WriteLine("elementul 2: " & c.Item("EL02").nume & " nascut la : " &
c.Item("EL02"))
End Sub
64
65
66
End Sub
erorilor
ntr-o
aplicaie
este
activitate
foarte
67
2.5. Liste
O lista este o structur abstract de date ce reprezint o colecie de
elemente de informaie ( denumite generic noduri) aranjate intr-o anumit
ordine. Lungimea unei liste este numarul de noduri din lista. Structura
corespunzatoare de date trebuie sa ne permita sa determinam eficient
care este primul/ultimul nod in structura si care este
predecesorul/succesorul (daca exist) unui nod dat. Iat cum arat cea
mai simpla lista, lista liniar:
O lista circulara este o lista in care, dupa ultimul nod, urmeaza primul,
deci fiecare nod are succesor si predecesor.
Capul
/coada listei
Operaii curente care se fac in liste sunt: inserarea unui nod, stergerea
(extragerea) unui nod, concatenarea unor liste, numrarea elementelor
unei liste etc. Implementarea (reprezentarea algoritmic) unei liste se
poate face in principal in doua moduri:
Implementarea
secventiala,
in
locaii
succesive
de
memorie,
nod.
Dezavantajele
sunt
inserarea/stergerea
68
informaia propriu-zis si
In
acest
caz,
adresele
(nodului
succesor
i,
eventual,
69
2.5.1.
Stive
70
71
End Function
End Class
End Sub
2.5.2.
Cozi
72
73
End Sub
Function extrage() As Object
If head = tail Then
MsgBox("Coada vida")
Return Nothing
Else
tail = (tail + 1) Mod (UBound(vCoada) + 1)
If head = tail Then
coadaVida = True
Else
coadaVida = False
End If
Return vCoada(tail)
End If
End Function
End Class
3. Algoritmi
3.1.
74
n munca unui programator, cutarea n diferite structuri de date reprezint o operaie foarte
des efectuat. Exemplele cele mai frecvente se refer la cutarea unei anumite nregistrri dintr-un
fiier de un anumit tip, regsirea unei anumite valori ntr-un tablou care conine mai multe elemente,
parcurgerea unei liste n cutarea unui anumit reper, etc. n funcie de specificul problemei concrete
care trebuie rezolvat, fiecare dintre structurile sau valorile cutate pot avea sau nu diverse proprieti:
totui orice
3.1.1.
75
Aadar, verific dac elementul cutat nu este cumva egal cu cel aflat la
jumtatea listei. Dac este mai mic dect valoarea de la mijlocul listei, vom relua
cutarea doar n segmentul de valori din stnga iar dac este mai mare dect
valoarea de la mijlocul listei vom relua cutarea doar n segmentul din dreapta .
Figura 3-20 Schema logic pentru reprezentarea algoritmului de cutare Divide Et Impera
76
Else
sfarsit = mijloc - 1
End If
mijloc = Int((sfarsit + inceput) / 2)
Loop
If vector(mijloc) = valCheie Then
Debug.Print ("valoarea " & valCheie & "se afla la pozitia:" & mijloc)
Else
Debug.Print ("valoarea " & valCheie & "nu se gaseste in multime")
End If
End Sub
77
3.1.2.
Problema sortrii
78
ntre ele cele dou elemente. Deci o prim aproximaie a algoritmului ar putea s
fie urmtoarea:
pentru fiecare pereche de valori execut
{
dac nu sunt n ordinea corect atunci
schimb valorile ntre ele
}
Se pune ns ntrebarea dac o astfel de parcurgere a vectorului este
suficient; s considerm de exemplu irul de valori:
9
Se observ c cel mai mare element a ajuns n ultima poziie, dar celelalte
valori nu sunt nc pe poziiile corecte. Pentru exemplul considerat (care este cel
mai dezavantajos posibil din punct de vedere al ordonrii iniiale), se observ c
sunt necesare N-1 parcurgeri ale vectorului. Dac ns irul valorilor este de la
nceput ordonat, acest fapt se constat dup o singur parcurgere. Aadar,
numrul de parcurgeri necesar depinde de ordinea iniial a elementelor ce
formeaz vectorul.
n cazul unui vector oarecare trebuie s se execute parcurgeri repetate,
pn ce se constat c s-a obinut un vector ordonat. Procesul de sortare poate fi
accelerat dac se ine seama de faptul c dup o parcurgere o parte dintre
elementele vectorului (ncepnd de la cel de-al doilea din ultima pereche
modificat) sunt deja sortate.
Elemente sortate la
parcurgerile anterioare
+1
Ultima modificare
Elementele localizate la dreapta locaiei ultimei interschimbri nu mai
trebuie analizate la urmtoarea parcurgere, pentru c acestea sunt deja sortate
deci numrul de perechi analizate trebuie actualizat la sfritul fiecrei
parcurgeri, aa cum se procedeaz n algoritmul urmtor (prezentat n pseudocod
i schem logic).
79
BubbleSort(X, N)
Begin
NP = N 1 //NP este nceputul prii sortate din list
DO
UltimaModificare = 0
pentru fiecare pereche i de la 1 la NP execut
{
dac ordine incorect atunci
{
interschimb valorile
UltimaModificare = i
}
}
NP = UltimaModificare 1
WHILE UltimaModificare > 1
END
80
Figura 3-22 Schema logic pentru BubbleSort (consideram plaja de valori a indexului elementelor listei: 1-N)
81
Listing 3-2 Procedura VB pentru BubbleSort
Sub bubbleSort(vector)
Debug.Print ("lista initiala (neordonata):")
afiseazaVector (vector)
nrPasi = UBound(vector) 1
minIndex = LBound(vector)
Do
ultimaModificare = 0
For i = minIndex To nrPasi
If vector(i) > vector(i + 1) Then
temp = vector(i)
vector(i) = vector(i + 1)
vector(i + 1) = temp
ultimaModificare = i
End If
Next
nrPasi = ultimaModificare - 1
Debug.Print ("pas intermediar:")
afiseazaVector (vector)
Loop While ultimaModificare > 1
Debug.Print ("lista sortata:")
afiseazaVector (vector)
End Sub
Sub afiseazaVector(v)
sir = ""
For i = LBound(v) To UBound(v)
sir = sir & v(i) & ","
Next
Debug.Print (sir)
End Sub
End Sub
82
83
procesul de parcurgere ncepe cu cel de-al doilea element al listei; dac este
mai mare dect primul rmne pe loc, iar dac nu (este mai mic dect
primul), primul trece pe locul celui de-al doilea iar cel de-al doilea trece pe
primul
84
Lista iniial
sortate
sortate
sortate
sortate
30
1
25
10
17
30
1
30
25
10
17
1
30
1
25
30
10
17
1
25
30
1
10
25
30
17
1
10
25
30
30
1
25
10
17
1
30
25
10
17
25
1
25
30
10
17
10
1
10
25
30
17
17
1
10
17
25
30
30
25
10
17
25
10
17
25
1
30
10
17
10
17
10
1
25
30
17
17
17
1
10
25
30
Lista sortat
85
86
Debug.Print ("MULTIMEA INITIALA (neordonata): " & getStringFromVector(vector) &
Chr(13))
For i = LBound(vector)+1 To UBound(vector)
temp = vector(i)
Debug.Print ("
valoarea temp la pasul- " & i & " - este :" & temp)
locGasit = False
k = i - 1
Do While (Not locGasit) And k >= LBound(vector)
If temp > vector(k) Then
locGasit = True
Else
vector(k + 1) = vector(k)
k = k - 1
End If
Loop
vector(k + 1) = temp
Debug.Print ("
dupa executia pasului - " & i & " - vectorul
& getStringFromVector(vector))
Next
Debug.Print (Chr(13) & "MULTIMEA ORDONATA: " & getStringFromVector(vector))
End Sub
Function getStringFromVector(v)
sir = ""
For i = LBound(v) To UBound(v)
sir = sir & v(i) & ","
Next
getStringFromVector = sir
End Function
al
Ubound(vector))
doilea,
utilizm
(For
i=Lbound(vector)+1
funciile
LBound(vector)
to
i
pentru
test
este
declarat
mod
clasic,
Dim
87
Debug.Print ("
valoarea temp la pasul- " & i & " - este :" & temp
Debug.Print ("
dupa executia pasului - " & i & " - vectorul
getStringFromVector(vector))
getStringFromVector()
care
preia
un
tablou
88
3.2.
Recursivitate
89
90
Apel funcie
(invocare)
FactorialRecursiv(1)
N=1
Return 1
Transfer rezultat
FactorialRecursiv(2)
N=2
Return 2
FactorialRecursiv(3)
N=3
Debug.print( FactorialRecursiv(4) )
Return 6
N=4
FactorialRecursiv(4)
Return 24
Figura 3-27 Paii parcuri la execuia funciei factorialRecursiv() cu n=4
91
fib:N->N
fib(n)=1, daca n=0 sau n=1
=fib(n-2)+fib(n-1), daca n>1
Iat cteva din numerele acestui ir: 1 , 1 , 2 , 3 , 5 , 8 , 13
Iat i implementarea algoritmului recursiv in VB:
Function fibonacciNumber(n)
If n = 1 Or n = 0 Then
Debug.Print (1)
fibonacciNumber = 1
Else
fibonacciNumber = fibonacciNumber(n - 1) + fibonacciNumber(n - 2)
End If
92
Figura 3-28 Apeluri recursive pentru aflarea numrului de pe poziia 5 din irul Fibonacci
aceleai valori.
Iat i o rezolvare iterativ a aceluiai algoritm, care necesit timp liniar.
Function fib2(n)
i = 1
j = 1
For k = 2 To n
Debug.Print (j)
j = i + j
i = j - i
Next
fib2 = j
End Function
93
TextInvers(abcd)=d+(textInvers(abc))
cba
= c+ textInvers(ab)
= b+textInvers(a)
dcba
ba
a
=a
Iat i implementarea algoritmului n VB