Você está na página 1de 106

UNIVERSITATEA „HYPERION” DIN BUCURESTI

Conf. univ. dr. Anca Gheorghiu

PROGRAMAREA CALCULATOARELOR
ELECTRONICE
MANUAL
pentru învatamânt la distanta

EDITURA VICTOR
2004
Cursul „Programarea calculatoarelor electronice” este des tinat în mod deosebit studentilor Facultatii de
Stiinte Economice din cadrul Universitatii Hyperion forma de învatamânt la distanta.

Numarul total de ore de curs: 28 ore


Numarul total de ore de laborator si activitati tutoriale: 28 ore

Forma de finalizare: examen la sfârsitul semestrului I

Strucura notei finale: 50% nota examen scris+


30% m edia activitatilor practice+
20%nota referate realizate pe parcursul semestrului prin activitati individuale.

Pentru obtinerea notei maxime studentul trebuie:


- sa însumeze calificativ maxim la examenul scris;
- sa efectueze cele 10 aplicatii de laborator, certificate prin semnatura tutorelui;
- sa realizeze 2 referate originale legate de tematica propusa de profesorul coordonator sau de tutore
redactate de mâna (nu printate, decât cel mult listingul aplicatiei).

Nota: 1. Frauda se pedepseste


2. În cazul în care referate realizate de 2 studenti diferiti sunt asemanatoare în pondere mai mare
de trei paragrafe, acestea sunt descalificate din calculul notei finale pentru ambele persoane, chiar daca unul dintre
acestia urmeaza alta forma de învatamânt.

OBIECTIVELE CURSULUI:

- Cunoasterea conceptelor fundamentale hardware si software ale calculatoarelor


electronice;
- Formarea deprinderilor de analiza si proiectie logica în procesul de alcatuire a unui
program;
- Însusirea principalelor tehnici de programare;
- Prezentarea caracteristicilor principiale ale câtorva limbaje de programare (TurboPascal,
C++, VisualBasic6, Java etc.)

1
CUPRINS
CAP. TEME DE STUDIU PAG
1 Preambul 3
2 Etapele unui proces de compilare 5
3 Algoritmi de programare 8
4 Reprezentarea algoritmilor prin scheme logice 11
5 Reprezentarea algoritmilor în pseudocod 16
6 Structuri elementare de date 20
7 Medii de programare. Caracteristici. Generalitati 27
8 Limbajele Pascal, C si C++ 33
9 Programarea orientata pe obiecte la limbajele P ascal si C 58
10 Limbajul de programare Visual Basic 83
Bibliografie minimala recomandata

Preambul
2
- Teme si dileme asupra societatii informatizate
- O scurta introducere în structura cursului

Descoperirile ultimului secol au revolutionat mijloacele de lucru. Se vorbeste tot mai mult despre a treia
revolutie industriala marcata de calculator si de retelele de interconectare electronice. Oamenii au devenit mai
apropiati prin aparitia telefonului (mai nou a videofonului) si în acelasi timp tot mai înstrainati prin boom-ul
tehnologic.

Ultimele doua decenii au facut ca sa dispara meserii, cum ar fi cele de desenator tehnic sau de dactilografa,
si-n schimb sa apara altele noi (designer web, info-arhitect, programator în diverse limbaje). De asemenea,
datorita calculatorului si a retelelor internet, s-a schimbat radical conceptia asupra muncii si a întreprinderii.
Vorbim astazi despre telelucrul, lucrul de acasa, vorbim despre noi mijloace de munca si ne preocupa la un alt
nivel pastrarea secretului de fabricatie fata de atacurile din retea.

Ajunge sa avem o conexiune Internet la Predeal sau în Bahamas pentru a intra pe chat sa vedem ce mai fac
prietenii nostri virtuali, indivizi a caror identitate este marcata de un sir impersonal de litere si cifre, oameni pe
care, poate nu i-am vazut niciodata, dar cu care dialogam pe diverse teme, la felurite ore din zi sau din noapte.

Banalul telefon cu disc de pe vremea mamei mari a devenit întâi si întâi fara fir, apoi tot mai sofisticat, cu
tot mai multe facilitati si cautarile tehnologice au tendinta de a face ca acesta sa înceapa a concura cu
calculatoarele.

Si toate acestea pentru ca a fost descoperit curentul electric!...

Va puteti închipui o lume fara curent electric? Fara baterii, fara baterii solare, fara banala priza de 220V? Sa
nu mai facem dialog virtual? Bancomatele ar deveni obiecte inutile si odata cu ele si evidentele financiare de mari
dimensiuni. Bibliotecile Internet s-ar spulbera ca un fum. (Si astazi regretam incendierea Bibliotecii din
Alexandria si a bogatiei informationale a lumii antice pierdute irevocabil). O lume ar pieri fara aceasta? Poate da,
poate nu... Cert este ca acum suntem dependenti de aceste facilitati...

Cu sau fara patetism, daca nu ar fi existat descoperirea curentului electric, a treia revolutie tehnologica nu ar
fi existat cu toate implicatiile si facilitatile oferite de aparatura din ce în ce mai sofisticata si cu toate implicatiile
socio-umane si frustrarile rezultate din înstrainarea individului fata de colectivitate.

Vorbim astazi de o noua alfabetizare... Va pieri cuvântul scris de mâna? Va fi complet înlocuit stiloul
pentru o tastatura?... Va fi bine? Va fi rau?...

Iata câteva întrebari pe care vi le ofer spre reflectie si pe care vi le propun pentru un dialog viitor.
Se spune ca omul viitorului, alaturi de limba materna, va trebui sa fie cunoscator a cel putin alte trei
limbaje:

• un limbaj de comunicare (o limba de circulatie internationala);


• un limbaj informatic;
• un limbaj artistic.

Aceasta nu înseamna ca va fi un erudit, ci va fi capabil sa-si comunice sentimentele si nevoile pentru a putea
supravietui în noua civilizatie.

3
Anul anterior ati studiat notiuni generale privitoare la utilizarea calculatorului si sistemele de operare
principale care exista pe piata actuala în cadrul cursurilor de „Informatica generala”. În cursul de „Birotica” ati
fost familiarizati în mod deosebit cu cele mai populare aplicatii din pachetul Microsoft Office, respectiv Word,
Excel, PowerPoint, Front Page.

În cadrul cursului de Programarea Calculatoarelor Electronice vom caut a sa ne familiarizam cu modul de


gândire al calculatorului, cu modalitatile de construire a unui algoritm logic, cu etapele de proiectare software si
nu în ultimul rand cu prezentarea caracteristicilor câtorva limbaje de programare si anume:
• TurboPascal;
• C si C++;
• VisualBasic6;
• Java;
• Limbaje proprii paginilor Internet

La finele acestui curs veti fi capabili sa construiti scurte si simple aplicatii software. Destinatia cursului
este catre aplicatiile economice. Nu ne-am propus ca sa deveniti softisti de mare calibru. Pentru aceasta exista alte
specializari universitare în cadrul carora, pe parcursul a mai multi ani, studentii proiecteaza aplicatii complexe.
Scopul final este ca dumneavoastra sa fiti capabili sa întelegeti oportunitatile si limitele software. Sa stiti ce sa
cereti de la un dezvoltator de aplicatii în conditiile unei tehnologii date si de ce nu, sa cunoasteti filosofia
proiectarii unui program software necesar activitatii curente.

4
2. Etapele unui proces de compilare

Etapele unui proces de compilare sunt:


1. Analiza lexicala descompune un program-sursa (PS) în atomi lexicali (identificatori, cuvinte rezervate,
constante, operatori), pe care îi introduce în tabele de simboluri sub forma codificata.
2. Analiza sintactica, prin care sirul de atomi lexicali este analizat în vederea depistarii unor structuri
sintactice ca expresii, liste sau proceduri, plasându-le într-un arbore de derivare (arbore sintactic).
3. Analiza semantica foloseste structura programului si informatiile din tabela de simboluri pentru
generarea unui grup de instructiuni simple cu format fix (codul intern); daca arborele sintactic nu respecta
gramatica limbajului, semnalizeaza erori.
4. Optimizarea codului presupune eliminarea redundantelor, a lungimii si a variabilelor initiale, în vederea
unei executii mai eficiente.
5. Generarea codului aloca zone de memorie pentru pastrarea datelor în timpul executiei, aloca registre si
produce codul obiect.
6. Gestiunea structurilor de date – reprezinta o colectie de proceduri care creeaza si actualizeaza baza de
date cu care lucreaza celelalte faze; în baza de date se gasesc tabelele identificatorilor, constantelor,
constructorilor, cuvinte-cheie si produsi standard, care, uneori, sunt înglobate într-o tabela unica de simboluri (fig.
2.5).
7. Tratarea erorilor este realizata de o colectie de proceduri care sunt activate când se depisteaza o eroare
în program; utilizatorul primeste mesaje de diagnostic, iar compilatorul continua analiza sintactica pentru a
depista alte erori.

În ceea ce priveste translatoarele de limbaje, specificam urmatoarele:


— asamblorul este determinat de limbajul-masina specific fiecarui sistem de calcul, iar compilatorul este
specific unui anumit limbaj de programare, independent de sistemul de calcul;
— compilatorul ofera posibilitatea scrierii de programe pentru orice sistem de calcul ce dispune de
compilatorul respectiv;
Compilatorul este componenta software care realizeaza traducerea programului-sursa (PS) în program cod-
obiect (PO).
Din punct de vedere al traducerii programului-sursa în codul intern al calculatorului deosebim:
– limbaje de programare standard sau specifice (PASCAL, COBOL, FORTRAN, C) care cer scrierea
programului în totalitatea sa, fara a anunta pe parcurs greselile, ci numai la final, fie prin prezentarea unei
recapitulatii a erorilor, fie prin parcurgerea pas cu pas a erorilor pâna la eliminarea lor completa [10].
– limbaje de programare interactive (Ex: BASIC), ceea ce însemna ca imediat dupa tastarea unei comenzi,
calculatorul o analizeaza si anunta daca este gresita. În acest caz componenta software care realizeaza traducerea
programului-sursa se numeste interpretor.
— Astfel asamblorul translateaza o definitie simbolica a programului-sursa într-o singura definitie prin
programul-obiect, în timp ce compilatorul o poate translata în mai multe definitii prin programul-obiect (PO);
memoria ocupata astfel de asamblor necesita mai putin spatiu, dar compilatorul este mai puternic datorita
includerii într-o definitie-sursa a mai multor definitii-obiect;
— interpretorul este util, în special, în controlul proceselor industriale care se desfasoara în timp real, însa
interpretarea este mai lenta decât compilarea;
— executia repetata a unui program este facilitata de compilator care realizeaza translatarea o singura data, în
timp ce interpretorul îl translateaza de fiecare data.
Exista componente ale S.O. ce sunt concepute ca programe generalizate care, în functie de necesitatile
utilizatorului, se pot adapta pentru a realiza un grup de functii; aceasta se realizeaza în faza de asamblare, prin
intermediul unui macro-limbaj care asigura generarea secventelor de program (PS sau PO) specificate.
Macrolimbajul foloseste macroinstructiuni – instructiuni ale PS care asigura, prin intermediul
comenzilor, inserarea în PS a secventei de instructiuni în locul unde a aparut macroinstructiunea.
De remarcat faptul ca utilizarea macrolimbajului nu economiseste decât timpul utilizatorului.

5
Macroasamblorul este componenta programelor de serviciu ale sistemelor de operare care trateaza
macroinstructiunile, având ca activitati de baza:
— recunoasterea macrodefinitiilor indicate prin MACRO, ENDM;
— memorarea definitiilor macroinstructiunilor necesare pentru a le expanda la un apel macro;
— recunoasterea apelului macroinstructiunii cu secventa de instructiuni corespunzatoare;
— înlocuirea macroinstructiunii cu secventa de instructiuni corespunzatoare.
Structura externa a unui program-sursa este alcatuita din:
– sectiune;
– segment;
– program.
Sectiunea este o unitate de program independenta, constituita dintr-o secventa de definire a datelor si o
secventa de instructiuni ce asigura posibilitatea comunicarii cu alte unitati ale PS (program-sursa).
Definirea datelor si procedurilor serveste atât propriei sectiuni, cât si altor sectiuni.
Comunicatia între sectiuni este ilustrata în figura 2.1.

Figura 2.1. Comunicatia între doua sectiuni ale unui program-sursa.

Compilatorul asigura, pe lânga generarea codului obiect, si informatii de legatura între sectiuni, astfel (fig.
2.2):
— informatii de identificare (nume sectiune, punctul de intrare);
— informatii de legatura.

Nume sectiune
Punct de intrare
Dictionar de legaturi
Codul obiect

Figura 2.2. Structura unei sectiuni dupa compilare.

Dictionarul de legaturi (fig. 2.2) rezulta în urma determinarii de catre compilator a elementelor de
comunicatie specificate în fiecare sectiune a programului sursa si contine doua tipuri de simboluri:
— externe – nedefinite în sectiune, cu adresa necunoscuta;
— interne – definite în sectiune, dar referite din exteriorul acesteia.
Segmentul este o succesiune de sectiuni între care au fost rezolvate legaturile; acesta contine:
— numele segmentului;
— punctul de intrare în segment;
— codul obiect al sectiunilor aranjate într-o anumita ordine.
Programul este o structura arborescenta de segmente (segment principal si segmente subordonate,
organizate pe substructuri); acesta este organizat într-o structura multifazica de catre editorul de legaturi. Editorul
de legaturi, pe baza numelor segmentelor din care este alcatuit programul si a secventei de sectiuni din care este
compus fiecare segment, creeaza structura de program pe care o depune pe suport extern (de obicei hard-disk), de
unde ulterior va fi încarcat în RAM pentru executie.

6
Editorul de legaturi prelucreaza programul-obiect (PO) în urma compilarii sectiunilor în scopul construirii
structurii pe segmente a programului (fig. 2.3); el este o componenta a programelor de servicii care asigura
urmatoarele functii:
— construirea dictionarului de legaturi între diverse sectiuni;
— înlocuirea fiecarei sectiuni din cadrul unui segment cu un factor de relocare corespunzator adresei de
încarcare în RAM;
— alocarea de zone continue pentru segment;
— modificarea constantelor de adresa relocabile, pentru a contine valorile relocate ale simbolurilor lor;
— cautarea în biblioteca relocabila a modelelor obiect catalogate;
— construirea directorilor de segmente ai programelor executabile.
Încarcatorul – este componenta sistemului de operare care încarca programul-obiect executabil (POE) în
RAM în vederea executiei si initializeaza executia.
Încarcarea programelor în RAM pentru executie se poate face:
— imediat dupa translatare, când sistemul de operare are inclus încarcatorul în compilator (Load and Go);
— în momentul editarii de legaturi (încarcatorul inclus în Link );
— dupa editarea de legaturi, ca proces distinct.
Depanatorul este un program de servicii ce ofera utilizatorului mijloace convenabile pentru depanarea si
controlul operatiilor programului sau, prin:
— lansarea în executie a programului;
— suspendarea executiei în puncte predeterminate (breakpoints) sau executie pas cu pas;
— examinarea si modificarea continutului cuvintelor din RAM si registre;
— realizarea de modificari si corectii aditio nale la rularea programului, utilizând codul binar, octal sau
hexazecimal.

Figura 2.3. Activitatea editorului de legaturi

7
3. Algoritmi de programare
Sub aspect istoric, introducerea conceptelor de logica matematica se datoreaza matematicianului arab Abu
Ja’ far Mahammed bin Musa Al-Khuwarizmi (n. cca. 800 – m. cca. 863) cunoscut si prin pronuntia fonetica „Al-
Horezmi” (din orasul Khuwarizm sau Khiva din Uzbekistan-ul de astazi). Acesta a fost autorul unor tratate de
aritmetica si algebra în care a indicat reguli precise pentru operatiile aritmetice fundamentale, cea mai cunoscuta
lucrare fiind tradusa în latina si cunoscuta ca Algoritmi de numero Indorum, ulterior reintitulata de exegeti ca
Liber algorithmi.
În opinia lui Al-Horezmi, dar si a matematic ienilor Evului Mediu, un algoritm reprezenta o procedura sau o
regula pe baza careia se efectuau calcule matematice.
Secolul XX, prin dezvoltarea si matematizarea unor stiinte precum fizica, biologia, genetica si nu în ultimul
rând tehnica informationala, a transformat conceptul matematic, astfel ca prin algoritm în extenso putem întelege
o metoda generala de rezolvare a unei probleme sau tip de problema, respectând etape, restrictii si parametri
impusi de aceasta.
Un algoritm matematic (aritmetic si logic), este descris printr-o secventa finita de etape clare si riguros
prezentate si indiferent de existenta sau nu a datelor de intrare, el trebuie sa furnizeze cel putin o valoare de iesire.
Pentru a fi implementabile pe calculator, aceste etape caracterizate de o suita de operatii trebuie sa fie definite sau
definibile, cu alte cuvinte trebuie sa cunoastem clar ce anume trebuie executat. Pe de-alta parte, operatiile trebuie
sa fie efective, adica fiecare pas sa se poata executa într-un timp finit. Putem concluziona ca un algoritm trebuie sa
se termine dupa un numar finit de operatii, într-un timp rezonabil de lung. Daca numerele întregi au caracter de
efectivitate, operatiile cu acestea pot da un numar real cu un numar nedeterminat de zecimale, caz în care avem
de-a face cu un caracter de ne-efectivitate, ceea ce distruge complet tentativa de a construi un algoritm. Cu toate
acestea, putem sa apelam la artificii, cum ar fi cel prin care definim strict numarul de zecimale acceptate sau
stabilim un numar finit de pasi de executie, dupa care în urma validarii rezultatului se poate trece la o alta etapa de
rezolvare a problemei.
Rezolvarea unei probleme, asa cum am mai precizat, parcurge mai multe etape care pot fi structurate în trei
momente importante, si anume:
1. Declararea si citirea datelor de intrare specifice problemei ce urmeaza a fi rezolvata;
2. Prelucrarea datelor de intrare pe baza unui/unor modele matematice cu scopul obtinerii valorilor datelor
de iesire;
3. Scrierea valorilor datelor de iesire, care reprezinta solutia problemei si finalizarea algoritmului.
Studiul algoritmului cuprinde mai multe aspecte:
a) Elaborarea algoritmilor constituie o adevarata arta ce se bazeaza pe intuitia si experienta analistului în
programare si care nu poate a fi pe deplin automatizata, tinând mai curând de capacitatea de sinteza a acestuia.
b) Exprimarea algoritmilor se recomanda a fi efectuata într-un stil clar si concis, în concordanta cu tipul
limbajului de programare (bazata pe evenimente sau orientata – obiect), nu neaparat legata de un limbaj de
programare anume impus.
c) Validarea algoritmilor. Un algoritm odata elaborat nu trebuie neaparat a fi implementat sub un mediu de
programare pentru a demonstra daca functioneaza corect indiferent de situatie. El poate fi redactat într-o forma
oarecare si verificata logica expusa si mai ales a rezultatelor furnizate indiferent de limbajul de programare în care
va fi ulterior programat. Aceasta etapa se numeste validarea algoritmului.
d) Analiza algoritmului. O problema poate fi rezolvata, de regula, prin mai multe cai, deci prin diversi
algoritmi. Pentru a putea hotarî care algoritm este mai bun, oportun a fi implementat, trebuie sa definim criterii de

8
apreciere a valorii unui algoritm fata de altul. De regula, prevaleaza algoritmii de rezolvare în pasi mai putini sau
cei pentru care memoria alocata este minima.
e) Testarea aplicatiilor. Orice problema pentru care s-a elaborat si validat un algoritm optim poate fi
supusa testarii prin programarea într-un limbaj ales dupa anumite criterii de catre programator (în functie de
experienta într-un limbaj sau altul, caracteristicile fizice ale sistemului pe care urmeaza a se implementa, gradul de
dificultate etc.). De regula, etapa de testare a aplicatiilor este alcatuita din sase faze :
1. redactarea programului în conformitate cu algoritmul;
2. valoarea acestuia;
3. depanarea (eventuala) si corectarea greselilor (daca exista);
4. trasarea (profiling) – testarea programului pentru diferite date de intrare, determinarea timpului de calcul
si a memoriei necesare;
5. compararea rezultatelor cu fundamentele teoretice si, pe de alta parte, a parametrilor de lucru (timp de
executie, memorie etc.);
6. optimizarea programului (daca este cazul).

Modalitatile de reprezentare a algoritmilor de rezolvare sunt felurite si putem aminti: reprezentarea în


cuvinte, prin pasi, ilustrarea cu ajutorul schemelor logice (nestructurate si structurate); tabele de decizie; arbori de
programare; pseudocoduri sau limbaje de prezentare etc.
Un aspect cu care ne confruntam cel mai adesea în problemele ce urmeaza a fi rezolvate este iterativitatea,
care este procesul prin care rezultatul unei etape de rezolvare poate fi obtinut dupa parcurgerea executiei repetate
a unui set de operatii, de fiecare data cu alte valori de intrare. Numarul de iteratii poate fi cunoscut sau
necunoscut, dar determinabil (pe baza unor restrictii) pe parcursul executiei. Oricum, asa cum am definit
conceptul algoritmic, numarul de iteratii trebuie sa fie întotdeauna finit.
De aici rezulta conc eptul de recursivitate, care reprezinta procesul iterativ prin care valoarea unei variabile
se determina pe baza uneia sau mai multora dintre propriile ei valori anterioare. Dupa cum valoarea curenta a
variabilei depinde de una sau mai multe valori anterio are, procesul poate fi unirecursiv sau multirecursiv.
Declansarea procesului recursiv presupune:
– definirea uneia sau mai multor formule de start;
– valoarea initiala a parametrului ce intra în procesul recursiv;
– declararea formulei recursive (sau de recurenta);
– declararea si/sau restrictionarea numarului de cicli de calcul.
Algoritmi aparent banali cum ar fi cel de numarare sau factorialul utilizeaza procesul de recursivitate.
Exemplul 3.1: Redactati o procedura de numarare de la 0 la 1000, fara ca valorile intermediare sa fie
pastrate în memorie.
Rezolvare: A numara înseamna a porni de la o valoare initiala, în cazul nostru V0 = 0 si a aduna o unitate.
Etapa urmatoare presupune a adauga o unitate la valoa-rea calculata si tot asa un numar finit de pasi, pâna când
rezulta valoarea finala V f = 1000 , sau prin declararea executiei aplicatiei pe parcursul a 1000 de pasi.
V1 = V0 + 1
V2 = V1 + 1
V3 = V2 + 1
LLL
Vi = Vi − 1 + 1
LLL
Vn = Vn − 1 + 1.

9
În procesul de mai sus se disting:
V0 = 0 → formula de start
Vi = Vi −1 + 1 → formula de recurenta pentru i = 1, n.
Când valorile obtinute nu necesita pastrarea în memorie, nu sunt necesare mai multe locatii, ci una singura,
care va fi suprascrisa la fiecare iteratie:
V =0 → formula de start
V = V +1 → formula de recurenta pentru i = 1, n.
Exemplul 3.2: Pentru calculul factorialului lui n, n! este necesara a fi cunoscuta valoarea initiala, în cazul
nostru P0 = 1 si numarul n de iteratii:
P0 = 1
P1 = ( P0 + 1)P0
P2 = ( P0 + 2)P1
P3 = ( P0 + 3) P2
..............
Pi = (P0 + i) Pi − 1
Pn = ( P0 + n) Pn − 1
Sub aspectul redactarii algoritmului, scrierea simplificata va fi:
P0 = 1 → formula de start
P = (P0 + i) Pi −1 → formula recursiva pentru i = 1, n.

10
4. Reprezentarea algoritmilor prin scheme logice (organigrame).

Logica programarii a demonstrat ca în procesul de initiere, dar si în urmarirea etapelor, reprezentarea


algoritmilor în forma de scheme sau grafuri logice este foarte ilustrativa.
Un graf neorientat G este definit prin perechea G = (V , E ) unde V este o multime nevida de elemente
numite vârfuri (vertex), iar E este o submultime (care poate fi si vida) de perechi neordonate cu componente
distincte ale lui V care se numesc muchii (edges). Daca E este multimea vida, spunem ca G este trivial.
În cazul în care multimea V este finita spunem ca graful este finit.
Daca e ∈ E, e = (u , v ) = uv, se spune ca muchia e are ca extremitati u, v sau ca muchia e este determinata
de vârfurile u si v, respectiv uv ∈ E, adica u, v sunt incidente cu muchia e.
Fie grafurile G i = (Vi , E i ), i = 1,2. G 2 este un subgraf al grafului G1 daca V2 ⊂ V1 si E2 ⊂ E1. Daca G 2
este un subgraf al lui G1 , G2 este un graf partial al lui G1 , daca V2 = V1.
Un graf orientat se mai numeste digraf . El este o structura D = (V , E ), unde V este o multime nevida de
obiecte denumite conventional vârfuri, iar E este o multime (posibil si vida) de perechi ordonate cu componente
elemente distincte din V. Conventional, elementele multimii E sunt numite arce sau muchii ordonate.
Se numeste graf ponderat o structura (V , E , W ), unde G = (V , E ) este un graf, iar W este o functie,
W : E → (0, ∞). Functia W este numita pondere si poate asocia fiecarei muchii a grafului o durata, un cost, un
câstig etc. al parcurgerii ei.
Reprezentarea grafica a unui graf este considerata cea mai ilustrativa (fig. 4.1 si fig. 4.2).
Fiecare vârf este figurat printr-un punct, respectiv muchiile sunt reprezentate prin segmente de arc sau
dreapta orientate (digrafuri) sau neorientate si etichetate (cazul grafurilor ponderate) sau neponderate, având ca
extremitati punctele corespunzatoare vârfurilor care le determina.
Exemple
1. Fie G = (V , E ) un graf cu V = {1, 2, 3, 4, 5, 6, 7},
E = {(1, 2), (1, 3), (1, 6), (2, 4), (3, 6), (4, 5)(5, 6)}.
Reprezentarea grafului G se da în figura 4.1.
2. Fie D = (V , E ) un digraf, cu V = {1, 2, 3, 4, 5, 6} si
E = {(1, 2 ), (1, 3), ( 2 , 4 ), ( 3, 5 ), ( 4 , 5 )}.
Reprezentarea digrafului D se da în figura 4.2.

Figura 4.1. Reprezentarea unui graf Figura 4.2. Schema unui digraf

11
O alta modalitate de reprezentare este cea prin matrice de alternanta. Daca G = (V , E ) este un graf (sau
digraf) cu | V | = u , atunci matricea de adiacenta A ∈ M nxn ({0, 1}) are componentele:

 1, daca ( vi , v j ) ∈ E
aij =  ,
 0, altfel

unde vi , v j reprezinta cel de-a i-lea, respectiv al j-lea nod din V .


În cazul unui graf neorientat matricea de adiacenta este simetrica, adica ( ∀) i , j = 1, n, aij = a ji (perechile de
vârfuri care caracterizeaza muchiile sunt neordonate, deci daca uv ∈ E, atunci si vu ∈ E ), spre deosebire de cazul
unui digraf în care este posibil ca (v i , v j ) ∈ E , dar (v j , vi ) ∉ E , cu alte cuvinte aij ≠ a ji .
Spre ilustrare, pentru exemplele din figurile 4.1 si 4.2 matricele de adiacenta au formele de mai jos:
 0 1 1 0 0 1 0  0 1 1 0 0 0 0
 1 0 0 1 0 0 0  0 0 0 1 0 0 0
 1 0 0 0 0 1 0  0 0 0 0 1 0 0
   
A =  0 1 0 0 1 0 0  pentru graful din figura 4.1 si, respectiv, A =  0 0 0 0 1 0 0 
 0 0 0 1 0 1 0  0 0 0 0 0 0 0
 1 0 1 0 1 0 0  0 0 0 0 0 0 0
 0 0 0 0 0 0 0  0 0 0 0 0 0 0
   
pentru digraful din figura 4.2.
Una dintre cele mai importante proprietati ale grafurilor o constituie posibilitatea de accesare, prin
intermediul unei secvente de muchii (arce, cai), a oricarui vârf al grafului plecând dintr-un vârf dat, proprietate
numita si conexitate sau conexiune.
Fie Γ : u0 , u1 , K, u n un drum în graful G = (V , E ). Γ este un drum închis daca u0 = un . În caz contrar, Γ se
numeste drum deschis. Drumul Γ este elementar daca oricare doua vârfuri din Γ sunt distincte, cu exceptia,
eventual, a extremitatilor. Drumul Γ este proces daca, pentru orice 0 ≤ i ≠ j ≤ n − 1, ui ui + 1 ≠ u j u j + 1. Orice
drum elementar este un proces.
Un arbore orientat este un arbore directionat si cu radacina. Este un caz particular de digraf. În afara de
reprezentarile uzuale ale grafurilor despre care am mai discutat si ale caror reguli se extind si la arbori, una dintre
cele mai eficiente modalitati de analiza a sa este reprezentarea TATA-FIU-FRATE, care consta în numerotarea
conventionala a vârfurilor grafului si în retinerea, pentru fiecare vârf i al arborelui a urmatoarelor informatii:
– FIU (i) – reprezinta numarul atasat primului descendent al vârfului i;
– FRATE (i) – reprezinta numarul atasat vârfului descendent al tatalui vârfului i si care urmeaza imediat lui
i;
– INF (i) – reprezinta informatia atasata vârfului i (de regula valoarea lui i).
Pentru reprezentarea arborelui se retine radacina si numarul nodur ilor.
Absenta „fiului”, respectiv a „fratelui” unui vârf este marcata printr-o valoare diferita de numerele atasate
vârfurilor (de obicei valoarea 0).
Exemplu:
Arborele alaturat este un arbore orientat cu N = 12 noduri,
cu o radacina (R = 1);
FIU = (2, 0, 0, 5, 0, 7, 8, 0, 10, 0, 0)
„fiul” lui 1 este 2, „fiul” lui 2 este 5,
„fiul” lui 3 este 7 etc.
FRATE = (0, 3, 4, 0, 6, 0, 0, 9, 0, 11, 12)
„fratele” lui 3 este 4, iar fratele lui 11 este 12.
12
Cele mai uzuale reguli de parcurgere a arborilor orientati sunt:
1. parcurgerea în A – preordine care presupune initial vârful curent ca fiind radacina arborelui si se
identifica descendentii lui (drumuri sau alte conexiuni arborescente) pâna la ultima „ramura” a arborelui.
2. parcurgerea în A – postordine care presupune vizitarea arborelui de la ultima ramificatie spre „centrul”
arborelui, spre radacina.
3. parcurgerea pe niveluri care presupune vizitarea arborelui (de sus în jos sau de jos în sus) în functie de
nivelurile de structurare a informatiilor.
Schemele logice sunt grafuri orientate în care arcele au în vârfuri blocuri logice. Într-un astfel de graf sunt
admise urmatoarele categorii de blocuri (instructiuni)
1) Blocul START în care nu pot sosi arce; este simbolizat conventional ca mai jos:

Orice schema logica are un unic arc initial, care indica punctul de unde începe executia unui algoritm.
2) Blocul STOP (v. simbolul) eticheteaza un arc final (din a carui extremitate finala nu pot pleca alte arce):

Orice schema logica poate avea mai multe arce finale. Acestea indica oprirea logica a executiei
algoritmului.
3) Blocul CITESTE – eticheteaza un arc ce indica citirea unor valori de la mediul de intrare a unei secvente
de valori, denumite date de intrare. Cuvântul CITESTE este însotit de variabilele ce descriu datele de intrare:

4) Blocul SCRIE – eticheteaza un arc ce indica înregistrarea la mediul de iesire a rezultatelor algoritmului,
denumite date de iesire:

5) Blocul de atribuire este un arc etichetat cu informatia: evaluarea unei expresii e si înscrierea (atribuirea)
rezultatului în locatia de memorie corespun-zatoare unui parametru v, conventional reprezentata într-una din
formele de mai jos:
v =e sau v ←e sau e→v
6) B locul de ramificare (selectie) este caracterizat prin n arce care pleaca din acelasi punct, arce etichetate
cu predicatele p1 , p2 , K, pn definite astfel încât:
p1 or p2 or … or pn = TRUE (adevarat) si
pi and p j = FALSE (fals) pentru oricare i ≠ j, i, j = 1, n
sau:
p1 or p 2 or … or p n = 1
pi and p j = 0, (∀) i ≠ j, i, j = 1, n.
În fapt, doar unul din predicate poate fi satisfacut (adevarat):

13
Pentru cazul n = 2 se poate scrie echivalent:

sau
Definitie: Se numeste schema logica un graf orientat în care:
a) exista un singur bloc START si cel putin un bloc STOP;
b) orice vârf (diferit de extremitatea finala a unui bloc START) este extremitatea initiala a unui unic bloc;
c) orice arc este etichetat cu unul din blocurile: START, STOP, CITESTE, SCRIE, atribuire, un predicat (în
acest din urma caz extremitatea initiala a arcului coincide cu extremitatea initiala a unui bloc de ramificatie;
d) pentru orice arc exista cel putin un drum care începe cu bloc START, se termina cu un bloc STOP si
contine arcul considerat.
Definitie: Se numeste subschema logica un graf orientat în care:
a) exista un unic vârf initial (în care nu sosesc arce) si un vârf final (din care nu pleaca arce);
b) oricare arc este etichetat cu una din urmatoarele informatii: START sau STOP; CITESTE, SCRIE,
atribuire, un predicat (bloc de ramificatie);
c) daca subschema contine blocul START (STOP), atunci extremitatea initiala/finala a blocului este chiar
vârful initial/final;
d) orice arc face parte din cel putin un drum care uneste vârful initial cu cel final.
Structurile fundamentale care fac parte din schemele logice sunt urmatoarele:
a) structura secventiala – formata din arce conectate, etichetate cu blocuri distincte de cea de ramificare
(fig. 4.3).

Figura 4.3. Structura secventiala.


b) Structuri decizionale (alternative) – contin, obligatoriu, cel putin un predicat si cel putin un bloc
functional (altul decât START sau ramificativ). Structurile decizionale sunt de urmatoarele forme (fig. 5.6):
– IF (α; a, b) – Daca α atunci executa a altfel b (fig. 5.6,a)
– IF (α; a) – Daca α atunci executa a (fig. 5.6,b);
– CASE ( p1 , p2 , K, pn ; a1 , a2 , K, an ). Daca p1 atunci executa a1 , daca p2 atunci executa a 2 , K, daca pn
atunci executa an (fig. 5.6,c).

14
Figura 5.6. Structuri decizionale.

c) Structuri repetitive, denumite si structuri de tip ciclu sau structuri iterative, contin obligatoriu un bloc
predicativ si un bloc functional care se executa de un numar finit de ori pâna când predicatul îsi schimba valoarea.
Structurile repetitive sunt de urmatoarele forme:
– WHILE (α; a) – cât timp conditia α este adevarata se executa a, apoi se continua cu urmatorul bloc sau cu
urmatoarea instructiune (fig. 5.7,a; ciclu cu test initial);
– REPEAT (α; a) – Repeta a pâna când conditia α este adevarata, apoi executa instructiunea urmatoare (fig.
5.7,b; ciclu cu test final);
– FOR (α; a, b, c) este o structura repetitiva similara cu WHILE alcatuita din trei blocuri cu urmatoarele
roluri:
– blocul a este un bloc functional de initializare;
– blocul b descrie instructiunea/instructiunile ce urmeaza a se executa când conditia α este adevarata;
– blocul c descrie actualizarea starilor variabilelor programului cu rol deosebit în evaluarea conditiei α (fig.
5.7,c; ciclu cu contor).

Figura 5.7. Structuri repetitive.

Astfel, cu ajutorul structurilor logice de mai sus se pot construi scheme logice structurate mai mult sau mai
putin complexe în functie de problema data si de algoritmul de rezolvare ales.

15
5. Reprezentarea algoritmilor prin pseudocod
O alta forma de descriere a unui algoritm este redactarea într-un limbaj algoritmic denumit si pseudocod.
Aceasta forma de descriere nu are la baza un limbaj anume, ci poate fi creata de oricine, cu conditia ca sa contina
structuri de baza suficiente pentru a rezolva orice algoritm.
Pseudocodul este format dintr-un numar de instructiuni, care contin condensat subscheme frecvent utilizate,
cu ajutorul carora se pot descrie/dezvolta algoritmi oricât de complecsi, redactarea acestora fiind foarte apropiata
de codificarea algoritmilor într-un limbaj de programare de nivel înalt.
Instructiunile utilizate pentru descrierea algoritmilor sub forma de pseudocod se împart în doua categorii:
– declaratii de date;
– instructiuni efective,
iar structura formala a unui algoritm descris în pseudocod se recomanda a fi urmatoarea:
/comentariu/
declaratii de date
instructiune 1
instructiune 2
......................
instructiune n
stop
end
unde:
– prin comentariu se precizeaza destinatia algoritmului sau informatii tip memo utile în procesul proiectarii
pseudocodului si, ulterior, în situatia depanarii sau a dezvoltarii în cadrul altei aplicatii;
– prin declaratiile de date se fac precizari referitoare la tipul datelor de intrare utilizate în algoritm, precum
si precizari referitoare la modul de organizare a acestora;
– prin secventa formata din: instructiune 1, instructiune 2, …, inst ructiune n se precizeaza operatiile care se
efectueaza asupra datelor de intrare, astfel încât dupa un numar finit de pasi sa se obtina valorile datelor de iesire;
– prin instructiunea stop se pune în evidenta sfârsitul logic al algoritmului;
– prin instructiunea end se pune în evidenta sfârsitul fizic al algoritmului.
Descrierea în pseudocod trebuie sa corespunda configuratiilor desfasurate într-o schema logica structurata si
reciproc, deci sa fie compatibile cu programarea structurata.
În cazul în care problema ce urmeaza a fi rezolvata este mai complexa si necesita un algoritm mai laborios
se recomanda analiza problemei si descom-punerea acesteia în subprobleme. Pentru fiecare subproblema se poate
elabora un subalgoritm, care ulterior poate fi inserat sau apelat de catre algoritmul-central (mult simplificat de asta
data).
Subalgoritmii se descriu cu ajutorul procedurilor atunci când exista una sau mai multe date de intrare care
determina una sau mai multe date de iesire, sau se pot descrie cu ajutorul functiilor în cazul în care pornind de la
una sau mai multe date de intrare se determina o singura data de iesire.
De asemenea, acolo unde problema necesita repetarea apelarii subalgo-ritmului, se recomanda ca aceasta sa
se faca ori de câte ori este necesar.
Structura formala a unui subalgoritm poate fi într-una din formele de mai jos:

16
procedure nume p[(a1,a2,K,an )] function nume f(g 1,g 2,K,g m )
/comentariu/ /comentariu/
[declaratii de date] [declaratii de date]
instructiune 1 instructiune 1
instructiune 2 instructiune 2
..................... .....................
instructiune k instructiune n
return return
end end
în care:
– nume p si nume f reprezinta numele subaplicatiei, respectiv a procedurii sau a functiei, dupa caz, nume ce
va fi invocat în momentul în care se apeleaza subalgoritmul;
− a1 , a2 , K, an sunt parametrii formali ai procedurii; o parte dintre ei (de regula primii au semnificatia
datelor de intrare, iar ceilalti au semnificatia de date de iesire din procedura;
− g1 , g 2 , K , g m sunt parametrii formali ai functiei si toti au semnificatia de date de intrare în subalgoritm, iar
valoarea calculata se va regasi în variabila nume f, ceea ce presupune ca în subalgoritm trebuie sa existe cel putin o
instructiune de atribuire a acesteia.
– declaratiile de date trebuie sa fie prezentate într-un subalgoritm, atunci când tipul anumitor date si modul
lor de organizare nu se cunoaste din algoritmul care îl apeleaza;
– instructiunile descriu operatiile care se efectueaza asupra parametrilor formali (a datelor de intrare în
subalgoritm) în vederea obtinerii datelor de iesire din acesta;
– instructiunea return marcheaza sfârsitul logic al subalgoritmului si determina revenirea în algoritmul-
mama la instructiunea imediat urmatoare instructiunii call în cazul în care a fost apelata o procedura, iar în cazul
în care se apeleaza o functie, se va face revenirea în algoritm cu valoarea calculata a functiei;
– instructiunea end marcheaza sfârsitul fizic al subalgoritmului.
În concluzie, o procedura poate apela o alta procedura (interna sau externa). Instructiunea de apel poate avea
forma:
call nume [(lista parametrilor actuali}]
sau:
nume [(lista parametrilor actuali)],

unde lista parametrilor actuali contine date definite în procedura-mama sau procedura-apelanta. Acestea trebuie sa
corespunda ca numar, ordine si tip cu parametrii formali din procedura-fiica sau procedura-apelata.
Expresiile prin care se fac declaratiile de date sau cele de tip instructiune ca si expresiile stop, return, end,
procedure, function se numesc cuvinte cheie sau cuvinte rezervate si nu pot fi folosite pentru a da nume de date,
proceduri sau functii.

17
Ilustrare comparativa a structurilor fundamentale
Structura seventiala (liniara). Este ilustrata în figura 5.1.

Figura 5.1. Structura secventiala.


Structuri alternative . Câteva tipuri de asemenea structuri sunt ilustrate în figura 5.2

Figura 5.2. Structuri alternative.

18
Programarea structurata accepta ca echivalente structurile IF –THEN–ELSE cu IF–ELSE
Structuri repetitive. Câteva exemple sunt reprezentate în figura 5.3.

Figura 5.3. Structuri repetitive.

19
6. Structuri elementare de date

Tipuri de date. Caracteristici

De modul în care sunt structurate datele, depinde eficient a algoritmilor de prelucrare. O colectie de date pe
care s-a evidentiat un anumit mod de structurare si s-au stabilit procedee de înregistrare/identificare a
componentelor se numeste structura de date. Ea este o entitate de sine statatoare, identificabila prin nume ale
carei componente îsi mentin tipul (proprietatile). Selectarea componentelor unei structuri de date se poate realiza
folosind identificatori asociati acestora, caz în care vorbim de accesul prin nume sau prin pozitia pe care o ocupa
în structura, în ordinea specificata de algoritm.
Identificatorul este un nume care se asociaza datei cu ajutorul caruia aceasta se poate distinge de alte date
si la care se poate face referire în procesele de prelucrare.
Data care pastreaza aceeasi valoare pe tot parcursul prelucrarii se numeste constanta. În caz contrar, data se
numeste variabila. Ele pot fi enumerate sau indicate printr-o proprietate comuna.
Atributele precizeaza proprietati ale datei si ele determina modul în care aceasta va fi tratata în procesul de
prelucrare. Tipul datei, domeniul de valori, modul de reprezentare în sistemul de calcul, precizia reprezentarii,
valoarea initiala etc., sunt atribute.
Datele pot fi elementare sau structuri (substructuri) de date.
Pentru o data elementara trebuie specificate:
– un identificator;
– atribute;
– valorile datei.
Din punct de vedere al domeniului de valori asociat unei date se disting urmatoarele clase:
– date de tip integer (numere întregi);
– date de tip real sau float (cu elemente din multimea numerelor reale sau în reprezentarea cu virgula
mobila);
– date de tip boolean (se refera la valorile logice de adevar true/false);
– date de tip char sau string (date elementare de tip alfanumeric);
– date de tip array (structura de date de tip tablou matricial, care ocupa locatii succesive în memoria
sistemului de calcul, identificabile prin pozitie);
– date de tip record sau file (structura cu componente diverse, identificabile prin nume)
Exemplu:
……………………
integer n, m, k, x
real a, b, y, aux
string nume, facultatea, functia, curs
boolean y, z
array a (n, m), b (m), x (n)
……………………
Cu urmatoarele explicatii:
n, m, k – sunt variabile simple de tip întreg;
x – este variabila indexata si are n elemente de tip întreg;
a – este variabila indexata cu doi indici si are n ∗ m elemente de tip real;
b – este variabila indexata si are un element de tip real;
y, aux – sunt variabile simple de tip real;

20
nume, facultatea, functia, curs – sunt variabile simple de tip alfanumeric;
y, z – sunt variabile simple de tip logic.
Structurile de date si modul acestora de organizare într-un algoritm de programare este complex.
Cunoasterea functionalitatii si a tipului structurii de date poate fi cheia unei elaborari algoritmice mai simpla sau
mai laborioasa.
— Dupa modul de selectare a componentelor, se disting:
– structuri cu acces direct – la care o componenta este selectata fara a tine seama de celelalte
componente (ordine, ierarhizare, adrese etc.);
– structuri cu acces secvential – la care localizarea unei componente se face printr-un proces de
parcurgere a mai multor componente (denumita si traversare);
— Dupa tipul componentelor, structurile de date pot fi împartite în:
– omogene (datele componente sunt de acelasi tip);
– neomogene (componente de tipuri diferite).
— Dupa nivelul de definire si de acces, structurile de date pot fi:
– structuri interne;
– structuri externe (fisiere).
— În functie de modul de alocare a zonelor de memorie se disting:
– date de tip static (pentru care sunt alocate zone de memorie bine definite în momentul compilarii);
– date de tip dinamic (pentru care zonele de memorie sunt alocate în momentul executiei în functie de
necesitati, fiind posibila chiar eliberarea memoriei ocupate de unele date. Tipul dinamic corespunde
tipului referinta (POINTER).

Structuri de date

— Stiva (stack)
Dupa cum s-a mentionat în §.3.4. datele pot fi memorate cu ajutorul diferitelor tipuri de suporti de memorie,
cu roluri specifice în procesul de prelucrare a datelor. Un asemenea suport special format din registru sau locatii
din memoria RAM o constituie stiva (stack), în care sunt salvate temporar diferite tipuri de date. Astfel stiva este
o structura de date asupra carora se pot efectua doua operatii:
– introducerea unui element în stiva, deasupra celor existente (daca exista), iar în caz în care nu mai exista
alte elemente, acesta se considera a fi primul element din stiva;
– extragerea elementului din vârful stivei, daca acesta exista.
Cu alte cuvinte, stiva functioneaza dupa algoritmul LIFO (Last In-First Out) sau ultimul intrat este primul
iesit (v. si §.3.4.).
Pentru a pastra datele în structura de date de tip stiva, trebuie rezervat un spatiu corespunzator. Aceasta se
poate realiza utilizând alocari dinamice (denumite si alocari de structuri înlantuite prin pointeri) sau vectori. De
regula, alocarile dinamice sau vectorii au dimensiuni mai mari sau cel mult egale cu numarul de elemente ce se vor
pastra în stiva. Aceasta se mai numeste si dimensionarea stivelor.
Orice stiva are un „capat” fata de care au loc referintele ulterioar e, denumit si vârf de stiva (declarat ca
numar întreg si reprezinta dimensiunea alocata a stivei).
Aceasta modalitate de identificare si declarare a stivei asigura urmatoarele:
– arata numarul de elemente din vectorul dat, care nu este neaparat necesar a fi identic cu numarul
elementelor stivei, ci face posibila deducerea numarului elementelor stivei;
– arata capatul (referentialul) vectorului la care se efectueaza operatiile.
21
Indicatorul de stiva (stack pointer) constituie o informatie suplimentara, necesara structurii de date de tip
stiva, care precizeaza capul stivei, locul la care se realizeaza operatiile de introducere/extragere (I/O) de elemente.
— Pointeri
Pointerii asigura flexibilitate în operare cu zone de memorie, indiferent de tip si dimensiune.
Prin alocare dinamica se realizeaza o utilizare eficienta a memoriei, fragmentarea memoriei în dimensiuni
cuantificate facând imposibila existenta unor tablouri de dimensiuni mari, care ar conduce la încetinirea pâna la
oprire a sistemului în demersul de cautare a unei marimi. În schimb, cu ajutorul tehnicilor de simulare a memoriei
virtuale sau caché acest lucru este mult facilitat.
Prin alocare dinamica se ofera posibilitatea alegerii structurilor de date (dupa jaloanele impuse de algoritm)
în momentul executiei programului. În absenta alocarii dinamice, programatorul ar fi obligat sa stabileasca
dimensiunea zonelor de date înaintea executiei programului, în faza elaborarii acestuia.
O variabila pointer pastreaza adresa unei zone de memorie. Pointer-ul actioneaza ca un intermediar între cel
ce o foloseste si zona de memorie pe care o reprezinta.
Asupra variabilelor pointer se pot efectua doua operatii:
– utilizarea adresei, prin simpla invocare a numelui pointer-ului;
– utilizarea continutului zonei de memorie indicate de pointer, realizabila prin folosirea unui operator
specific, în conjunctie cu numele pointer-ului.
Se defineste operatorul de dereferentiere a unui pointer, operatorul care permite, prin aplicarea la o
variabila, accesul la zone de memorie pe care o indica aceasta.
Definirea unui pointer ca fiind nul semnifica faptul ca pointerul respectiv nu este valid si nu reprezinta o
zona de memorie.

— Liste
Listele constituie un caz particular de grafuri.
O lista este o colectie de elemente de informat ie (noduri, pointeri), aranjate într-o anumita ordine. Lungimea
unei liste este data de numarul de noduri din lista. Structura de lista trebuie sa permita determinarea eficienta a
locului în care se gasesc elementele „vecine”, respectiv predecesorul/succesorul (daca exista).
În functie de numarul de pointeri pastrati de fiecare element, listele pot fi:
a) lista simplu înlantuita (fig. 5.11).

Figura 5.11.
unde: inf – reprezinta informatia utila;
* este informatia de legatura despre vecinul sau (în cazul nostru, din stânga);
element 1 – primul element denumit si capul (radacina) listei;
element 4 – ultimul element denumit si coada listei.
b) lista dublu înlantuita (fig. 5.12).

22
Figura 5.12.

unde: * este elementul de legatura spre elementul succesor;


# este elementul de legatura spre elementul predecesor.
La acest tip de lista fiecare element pastreaza legatura, respectiv contine informatii de legatura catre ambii
vecini (predecesor/succesor).
c) lista circulara (fig. 5.13).
O lista circulara este o lista în care, dupa ultimul nod, urmeaza primul si fiecare element din lista pastreaza
informatii despre câte un „vecin”.

Figura 5.13.

d) lista circulara dublu înlantuita (fig. 5.14).

Figura 5.14.

Operatii curente care se fac în liste sunt:


– inserarea unui nod;
– stergerea unui nod;
– concatenarea unor liste;
– numararea elementelor unei liste;
– etc.
Implementarea unei liste se poate face în doua moduri:
– implementarea secventiala, în locatii succesive de memorie, respectând ordinea nodurilor listei. Aceas ta
metodologie are avantajul unui acces rapid la traseul nodurilor si gasirea rapida a primului/ultimului nod. Ca
dezavantaje se disting inserarea/stergerea relativ dificila a unui nod si pe de alta parte neutilizarea întregii memorii
alocate listei.

23
– implementarea înlantuita (cazul listelor dublu înlantuite) are avantajul ca alocarea memoriei fiecarui nod
se face în mod dinamic, în timpul rularii programului. Accesul la un nod necesita parcurgerea tuturor
predecesorilor sai, deci un timp mai îndelungat; în schimb inserarea/stergerea unui nod este foarte rapida.
În tabelul 5.2 se prezinta o comparatie sintetica între stive si liste
— Coada (queue)
Utilizând o structura de date de tip lista simpla, prin aplicarea operatiei de introducere de elemente de
informatie doar la unul dintre capete si aplicarea operatiei de extragere doar la celalalt capat, obtinem o coada sau
o structura de tip FIFO (First In-First Out – primul intrat, primul iesit).
Tabelul 5.2
Comparatie sintetica între stive si liste

VECTORI (STIV E) LISTE


— fiecare element poate fi utilizat — pentru a utiliza un element se pleaca de la un
(si accesat) prin apelul la element cunoscut (ex: de la radacina) si se
indexul sau; urmeaza legaturile
— se aloca static — se aloca dinamic
— dimensiunea este cunoscuta din — dimensiunea unei liste se stabileste în momentul
etapa elaborarii programului executiei, programul construind si distrugând
dinamic elementele listei
— se stocheaza ca succesiune de — se pastreaza în memorie sub forma de variabile de
octeti înregistrare alocate dinamic, fiind suficient a fi
cunoscuta adresa radacinii pentru a se identifica
ulterior orice element

Analize algoritmice în pseudocod

În cele ce urmeaza vom dezvolta algoritmic câteva probleme tipice pentru fixarea notiunilor prezentate în
paragrafele anterioare.
Înmultirea a doua numere „a la russe”
Aceasta metoda presupune scrierea deînmultitului si înmultitorului în doua coloane alaturate. Se împarte
deînmultitul la 2, succesiv, ignorând fractiile, pâna când numarul de sub deînmultit este 1. În acelasi timp, se
înmulteste înmultitorul cu 2 atâtea etape câte au fost necesare împartirii deînmultitului pentru a ajunge la valoarea
1. În coloana a treia se trec valorile înmultitorului multiplicat cu 2 corespunzatoare rubricilor în care în coloana
deînmultitului sunt numere impare, inclusiv cea corespunzatoare valorii 1. Cifrele din coloana a treia se aduna iar
rezultatul este chiar produsul celor doua numere.
Sa exemplificam prin înmultirea 54 × 21; avem:
54 21 –
27 42 42
13 84 84
6 168 –
3 336 336
1 672 672
REZULTAT: 1134

24
Desi este aparent ciudata, aceasta metoda are avantajul ca nu obliga calculatorul sa memoreze tabele de
înmultire, ci se rezuma la adunari si împartiri/înmultiri cu 2 si un transfer în alt vector (coloana).
Algoritmul programul corespunzator pentru exemplul de înmultire de mai sus este urmatorul:
function russe (A, B)
/înmultirea a doua numere „a la russe”/
array X[i], Y[i], prod, i
/initializare/
X[1]← A
Y[1]← B
i ←1
while X[i]>1 do
X[i+1]← X[i] div 2
/div reprezinta partea întreaga a rezultatului împartirii/
Y[i+1]← Y[i]+Y[i]
i ← i+1
/aduna numerele Y[i] corespunzatoare numerelor X[i] impare/
prod ← 0
while i > 0 do
if X[i] este impar
then prod ← prod+Y[i]
i ← i-1
return
end

Dupa cum se poate observa algoritmul de rezolvare a problemei de mai sus se refera la înmultirea a doua
numere întregi pozitive oarecare.
Ordonarea crescatoare a trei numere reale
Fie trei numere reale a, b, c. Sa se elaboreze un algoritm de ordonare a acestor numere.
Algoritmul rezolvarii este:
/Ordonarea crescatoare a trei numere reale/
/Citirea datelor de intrare/
real a, b, c, aux
read a, b, c
if a > b then aux ← a
a←b
b ← aux
/schimbarea între ele a valorilor celor doua variabile a si b/
endif
if a > c then a ↔ c
/compara a si c între ele/
endif
if b > c then b ↔ c
/compara b si c între ele/
endif
write a, b, c
stop
end

25
Operatii de manipulare a stivelor

Fie N numarul maxim de elemente ale stivei G si ps indicele pointer (vârful stivei). g ( ps ) desemneaza
vârful stivei (ultimul element din stiva) iar g (1) este primul element al stivei (fig. 5.15).

Figura 5.15. Ilustrarea încarcarii stivei.

O procedura de verificare a stivei, daca mai poate accepta noi date este cea de mai jos.
procedure insert (G, N, ps, t)
integer N, ps, t
array G(N)
if ps<N
then ps ← ps+1
G(ps)← t
return
end
else
write ’stiva plina’;
end

Procedura de mai sus verifica daca stiva mai accepta elemente de introdus în ea. În mod similar se poate
elabora un algoritm de extragere a elementelor si verificarea daca în stiva mai exista sau nu elemente:
procedure extract (G, N, ps, t)
integer N, ps, t
array G(N)
if ps>0
then t ← G(ps)
ps ← ps-1
return
end
else
write ’stiva goala’
end

26
7.Medii de programare. Caracteristici.
Generalitati
Conceptul de programare este indisolubil legat de evolutia suportului hardware, precum si de memoria unor
aplicatii tot mai complexe, care sa poata furniza date sau decizii optime într-un timp de prelucrare cât mai redus.
A decide care limbaj de programare este mai bun decât altul este ca si cum am statua ca o piesa muzicala de
Brahms este mai buna decât un automobil ecologic. Fiec are limbaj (mediu) de programare are destinatia sa
preponderenta spre un domeniu de aplicatii sau altul iar comparatiile care s-ar putea face ar fi între o versiune sau
alta ale aceluiasi tip de mediu de operare (ce îmbunatatiri, ce instructiuni noi au aparut, ce alte instructiuni
considerate statistic neutilizate au disparut, ce utilitati grafice au aparut etc.).
Oricum, în jurul anilor 60 ai secolul trecut ca urmare a dezvoltarii oarecum necontrolate a programelor cod-
masina, dar mai ales a depanarii post-elaborare extrem de dificila s-au impus standarde si norme comune astfel
încât un depanator sa poata întelege logica de calcul pe care o avusese primul proiectant sau ultimul depanator al
proiectului respectiv. Astfel, s-au statuat primele elemente ale programarii structurate, care de altfel reprezinta „o
filosofie ce declara ca programele ar trebui scrise într-un mod ordonat, fara multe salturi înainte si înapoi”
(Greedy).
Programarea structurata include urmatoarele trei elemente fundamentale:
– secventa;
– decizia (sau selectia);
– bucla (denumita si repetitie sau iteratie).
Limbajele de programare bazate pe programarea structurata se numesc si limbaje procedurale sau
algoritmice, destinate descrierii algoritmilor de rezolvare a problemelor sub forma unor succesiuni de instructiuni.
Ele mai sunt denumite si limbaje universale, nefiind limitate la o clasa particulara de probleme.
Înainte de a analiza câteva tipuri uzuale de limbaje de programare, se cuvine a face o incursiune în evolutia
acestora. Scopul principal al acestui demers este de a vedea de unde s-a pornit si cum a evoluat gândirea logica al
carei deziderat este obtinerea unui/unor suporti software apropiati de natura umana atât în elaborare, cât si în
optimizare, în decizie sau în inteligenta artificiala.

Evolutia limbajelor de programare

Dupa cum s-a mentionat în capitolele anterioare un limbaj de programare reprezinta o notatie conventionala
prin care este descris un proces de calcul si care împreuna cu un set de date concrete pot fi prelucrate de
calculator.
Limbajele în cod-masina au constituit prima generatie de limbaje de programare. Dezavantajele principale
în utilizarea uzuala de catre programatori erau:
– necesitatea descompunerii problemei de rezolvat în operatii elementare, constituind mii de instructiuni în
cod numeric, alocari de adrese de memorie a acestora si a datelor;
– rata mare a erorilor;
– dependenta de un anumit tip de calculator;
– dimensiune mare a programelor;
– productivitate scazuta.

27
A doua generatie de programe o reprezinta limbajele de asamblare care înlocuiesc codurile numerice ale
operatorilor cu coduri mnemonice. Problemele principale constau în necesitatea cunoasterii sistemului de operare
în detaliu, incompatibilitatea partiala între un calculator sau altul, utilizar ea unui limbaj greoi, nenatural,
dimensiuni mari ale programelor si, ca si la generatia anterioara, o productivitate scazuta.
Problematicile cu care se confruntau atât programatorii cât si analistii din programare ai anilor ’50 si ’60 din
secolul trecut au condus la elaborarea unui „tampon” sau a unei interfete între codul-masina sau limbajul de
asamblare si tinta spre care se tindea si anume realizarea unui limbaj de redactare apropiat de limbajul natural.
Dupa cum s-a mai mentionat, aceasta interfata se numeste compilator, care este un program complex ce
realizeaza traducerea unui program-sursa (redactat într-un limbaj de nivel superior) în programul-obiect (limbaj
de asamblare sau, direct, în cod-masina), operatie a carei schema simplificata este prezentata în figura 7.1 si
despre care s-a facut referire într-unul din capitolele anterioare.
Rezultatul acestei etape a fost elaborarea în 1954, de catre un colectiv condus de John Backus, a unui limbaj
de nivel înalt, un limbaj care nu are legatura directa cu limbajul masina, denumit FORTRAN (FORmula
TRANslator). Caracteristicile principale ale acestui limbaj erau:
– un vocabular format din simboluri, cuvinte, fraze, operatori ce apeleaza la un lexic bazat pe limba engleza
structurata (ceea ce face ca script-ul sa fie mult mai usor de scris/citit, reducându-se substantial timpul de
elaborare si erorile de programare);
– dispune de biblioteci de functii si proceduri-tip;
– un limbaj procedural (care urmareste pas cu pas procedura algoritmica de rezolvare a problemei, denumit
si limbaj orientat spre problema;
– compatibilitate de a fi rulate pe aproape orice tip de calculator sau sistem de operare, fiind necesara doar
existenta compilatorului.

Figura 7.1. Schema bloc a interfetei dintre limbajele de programare de nivel înalt
si limbajul propriu al calculatorului.

28
Limbajele de generatia a treia probabil ca au fost cele mai longevive, dominând ca principii piata limbajelor
de programare mai bine de 30 de ani. Destinatia unui mediu de programare preponderent spre un domeniu, sau
altul a facut ca sa intervina o clasificare, care într-o forma simplificata ar putea fi urmatoarea:
A. Limbaje pentru calcule stiintifice:
FORTRAN (FORmula TRANslator)
ALGOL (ALGOrithmical Language)
B. Limbaje pentru calcule economice:
COBOL (COmmon Business Oriented Language)
C. Limbaje pentru aplicatii speciale:
a) pentru simulare: SIMULA;
b) pentru aplicatii militare/civile în timp real: ADA; Modulo;
c) pentru programarea robotilor si a masinilor unelte FORTH;
d) pentru programare obiect: SMALLTALK;
D. Limbaje pentru destinatii multiple:
a) pentru instruire:
BASIC (Beginners All purpose Symbolic Instruction Code)
PASCAL
b) derivate din sisteme de operare:
Qbasic, C, C++
c) pentru programare functionala:
Lisp (LIST Processing)
APL (A Programming Language).
Odata cu extinderea sistemelor de gestiune a bazelor de date (SGBD) s-a constituit cea de-a patra generatie
a limbajelor de programare. Principalele caracteristici ale acestora erau:
– destinatia catre o categorie mai larga de utilizatori, chiar si neinformaticieni;
– o interfata mai prietenoasa (cu meniuri);
– un caracter neprocedural (utilizatorul trebuind sa indice ce anume sa faca sistemul, nicidecum cum sa
faca).
Din aceasta generatie fac parte dBASE, FoxPro, Paradox, Excel, Access, SQL (Structured Query Language),
Delphi etc.
Limbajele generatiei a cincea se utilizeaza pentru rezolvarea unor probleme de programare logica, Prolog
fiind unul din exponentii acestei perioade.
Dupa modul de abstractizare, a metodologiei programarii sau a structurii mediului de programare, acestea se
pot clasifica în:
A. Limbaje pentru programarea modulara si structurata:
Fortran;
Algol;
Cobol;
Pascal;
C.
B. Limbaje pentru programarea orientata pe obiecte:
Smalltalk;
Java.

29
Figura 7.2. Evolutia celor mai importante limbaje de programare si relatiile dintre ele.
C. Limbaj pentru programarea logica (sisteme expert):
Prolog.
D. Limbaje destinate cu preponderenta SGBD-urilor:
SQL;
Delphi;
Access.
E. Limbaje pentru programarea vizuala:
Visual Basic;
Visual C++;
Visual FoxPro.
Aceasta clas ificare poate fi orientativa, deoarece fiecare din aceste medii de programare înglobeaza facilitati
care le pot plasa în doua sau trei categorii de limbaje. Astfel, Visual Basic are valente de programare vizuala, dar
si de programare orientata obiect si poate fi suport pentru dezvoltarea SGBD-urilor.
Evolutia celor mai importante limbaje de programare procedurale si orientate spre obiect este redata în
figura 7.2.

30
Despre o filosofie a programarii

Programarea structurala, denumita si programare dirijata de prelucrari are ca reprezentant cunoscutul


Pascal, limbaj de programare dotat cu un compilator destul de eficient pentru anii ’70, din secolul trecut care
poate prelucra cele trei constructii fundamentale despre care am facut referire mai înainte si anume:
– secventa;
– decizia;
– bucla.
La scurt timp de la lansarea sa, Pascal va avea un competitor de marca, limbajul C, mediu de programare
eficient cu multiple valente, care în scurt timp va acapara procente serioase din piata mediilor de dezvoltare.
Initial, limbajul C a fost elaborat ca extensie a sistemului de operare UNIX. Scopul principal al nasterii limbajului
C a fost evitarea programarii greoaie în limbaj de asamblare (limbaj de nivel jos) si, pe de-alta parte, elaborarea
unei platforme de programe structurata (limbaj de nivel înalt), fiind cunoscut astazi ca limbaj înalt de nivel jos.
Astfel, majoritatea aplicatiilor sunt scrise în C (sau C++), spre deosebire de trecut când erau scrise în limbaj
de asamblare. Avantajul usurintei de programare în C++ sunt evidente, cu atât mai mult cu cât volumul de
comenzi este redus.
Succesorul limbajului C a fost C++, un limbaj similar cu precedentul, dar cu facilitati de programare
orientata spre obiecte.
Practic, spre sfârsitul anilor ’70 din secolul trecut program area dirijata de prelucrari devenise greoaie si
uneori ineficienta. Adeseori, o modificare minora în structura datelor sau în script putea ridica probleme serioase
de prelucrare.
Problemele mentionate pot fi evitate sau reduse prin încapsularea datelor si a procedurilor într-o entitate
numita obiect . Accesul la date sau proceduri se realizeaza prin intermediul unor operatii, care constituie interfata
obiectului. Procedurile care realizeaza interfata unui obiect se numesc metode. Obiectul este apelat de o cerere pe
care o poate executa, o poate realiza sau o poate transmite altui obiect. Observam ca se opereaza cu entitati iar
programarea devine dirijata de date si nu de prelucrarile care trebuie realizate.
Un limbaj de programare orientat pe obiecte se carac terizeaza prin:
– identitate;
– clasificare;
– polimorfism;
– mostenire;
– încapsulare.
Identitatea este legata de faptul ca datele sunt cuantificate în entitati discrete si distincte (obiecte). Un obiect
poate fi concret sau conceptual (virtual). Fiecare obiect poseda propria sa identitate si este caracterizat prin
proprietatile (atributele) sale: nume, dimensiune, eticheta etc.
Clasificarea presupune ca obiectele au aceeasi structura sau aceleasi atribute precum si acelasi
comportament (aceleasi operatii) si toate sunt grupate în clase. Fiecare clasa descrie un ansamblu de obiecte
individuale. O clasa are un identificator (un nume) si câmpuri membre.
Polimorfismul reprezinta capacitatea unui obiect de a-si modifica forma, precum si capacitatea ca aceeasi
operatie sa se comporte diferit asupra unor clase diferite.
Mostenirea permite partajarea atributelor si operatiilor comune între clase, pastrând, în acelasi timp,
diferentele. Astfel, o clasa poate fi rafinata în sub-clase din ce în ce mai fine. Fiecare sub-clasa mosteneste toate
proprietatile clasei sale si adauga propriile sale proprietati.

31
Si în cazul limbajelor orientate pe obiecte exista o sub-clasificare vis-à-vis de pozitia limbajului fata de
obiect, propusa în lucrarea [26]:
– Limbaje cu clase – care favorizeaza aspectul structural. Obiectul este tipul de date care defineste un model
pentru structura reprezentarilor fizice si a multimii operatiilor ce pot fi aplicate acestei structuri.
– Limbaje cu cadre – care favorizeaza aspectul conceptual. Obiectul este unitatea de cunostinte care
reprezinta prototipul unui concept.
– Limbaje cu actori – care furnizeaza aspectul actor. Obiectul este o entitate autonoma care se reproduce
prin copiere.
O alta tendinta de dezvoltare a mediilor de programare este cea orientata spre grafica, denumite si limbaje
de programare grafice. Programatorii, dar si utilizatorii neinformaticieni au posibilitatea de a realiza programe
functionale prin simpla mutare a obiectelor grafice pe ecran. Pentru implementarea unei interfete grafice-utilizator
(GUI) usor de manipulat se tine cont de câteva concepte, privite ca entitati (agenti) de sine statatori, care pot
interactiona iar proiectarea se poate realiza independent una de cealalta [27]:
1. modelarea aplicatiei;
2. folosirea agent ilor pentru mentinerea consistentei vizuale a GUI;
3. modelarea paletelor cu unelte (toolbox);
4. modelarea zonei de lucru;
5. posibilitatea modelarii de concepte complexe;
6. existenta relatiei parinte-fiu;
7. capacitatea abstractizarii;
8. capacitatea mentinerii relatiei semantice dintre doua entitati prin intermediul unui agent.
Întrucât în vocabularul si gramatica acestor tipuri de limbaje sunt elemente grafice, practic aceste limbaje
detin o sintaxa vizuala (legate de embleme, pozitii spatiale ale entitatilor, culori etc.)
Termenul de „limbaj vizual” poate avea doua interpretari principale:
a) cazul în care obiectele operate de limbaj sunt vizuale, cu alte cuvinte este vorba de un limbaj care
prelucreaza informatii vizuale;
b) cazul în care însusi limbajul este vizual, deci un limbaj utilizat pentru programarea cu expresii vizuale,
denumit limbaj de programare vizuala;
Limbajele de prelucrare a informatiilor vizuale (VIPL – Visual Information Processing Language) se
bazeaza pe o interpretare liniara clasica cu obiecte vizuale (imagini) carora li se ataseaza o interpretare logica
operate si prelucrate de rutine grupate în biblioteci sau chiar pachete software.
Limbaje de programare vizuala (VPL – Visual Programming Language) opereaza cu obiecte care nu au o
reprezentare vizuala, dar fac parte din categoriile de date cunoscute (stive, liste, cozi, tipuri de date orientate pe
aplicatie ca forme, documente, baze de date etc.). Constructiile-program si regulile de combinare folosesc o
reprezentare vizuala. Domeniul aplicatiilor limbajelor de programare vizuala include grafica pe calculator,
proiectarea interfetelor utilizator, interfete cu baze de date, gestiunea formelor, proiectarea asistata pe calculator
etc.

32
8. Limbajele Pascal, C si C++

Consideratii generale

Limbajele de programare Pascal si C au fost create aproximativ în aceeasi perioada; o diferenta de un an le desparte
unul de celalalt. Limbajul Pascal a fost creat de profesorul Miklaus Wirth de la Universitatea Tehnica din Zurich, în 1968 si a
fost destinat îndeosebi scopului didactic fiind deosebit de util pentru învatarea principiilor programarii structurate. De altfel,
cu toate ca a cunoscut un succes în mediile universitare si, mai recent, în mediile preuniversitare, el a fost limitat la aceste
sfere, foarte putini programatori profesionisti acceptând sa-l foloseasca în sfera tehnica sau de afaceri.
Spre deosebire de Pascal, limbajul C a fost creat ca o completare a sistemului de operare Unix devenind la scurta
vreme un mediu de programe de sine statator adaptabil si recognoscibil de o multitudine de sisteme de operare (inclusiv
Windows sau Linux). Asa cum s-a mentionat în capitolul precedent, limbajul C a capatat o dubla conotatie de limbaj înalt de
nivel jos în conexiune cu limbajul de asamblare, dar si valente de sine statatoare de limbaj de programare de nivel înalt prin
perfectionarea sa în versiunile C++ si/sau Visual C++.
Întrucât limbajele C++ si Pascal au aparut cam în acelasi timp, în cadrul acestui capitol se va face mereu o comparatie
între cele doua limbaje, fara a dori sa scoatem în evidenta superioritatea sau avantajele unuia fata de celalalt.
Limbajele de programare de nivel înalt au la baza un vocabular si o sintaxa.
Vocabularul contine cele mai simple elemente cu semnificatie lingvistica numite si entitati lexicale.
Sintaxa este formata dintr-un ansamblu de reguli referitoare la modul de combinare logica a elementelor de vocabular
pentru a obtine mesaje corecte alcatuite din instructiuni, definitii de tipuri de date si de date propriu-zise, etichete, declaratii si
definitii de proceduri sau de functii etc.
Cele mai simple unitati lexicale sunt alcatuite din caractere ASCII imprimabile si acestea sunt:
– simbolurile speciale;
– identificatorii;
– literalele;
– etichetele;
– comentari ile;
– directivele de compilare.
Simbolurile speciale sunt de doua categorii:
– simbolurile propriu-zise;
– cuvinte-cheie rezervate.

— Cuvinte-cheie în limbajul Pascal:

absolute file mod shr


and for nil string
array forward not then
begin function of to
case goto or type
const if pached unit
div implementation procedure until
do in program uses
downt inline record var
else interface repeat while
end interrupt set with
external label shl xor

33
— Cuvinte-cheie definite pe standardul ANSI1 C

auto double int struct


break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto size of volatile
do if static while

— Cuvinte cheie suplimentare în limbajul C++

asm overload
bool private
catch protected
class public
const_cast reinterpret_cast
delete static_cast
dynamic_cast template
explicit this
false throw
friend true
inline try
mutable typeid
namespace using
new virtual
operator wchar_t

Identificatorii sunt nume asociate datelor si tipurilor acestora, proceduri, functii, fisiere, unit -uri alcatuite
din caractere alfanumerice în care primul simbol obligatoriu este o litera si nu cifre (v. exemplul). Spre deosebire
de Pascal, în care nu se face distinctie între majuscule si minuscule, la limbajul C aceasta distinctie exista, astfel
„Ion” sau „ION” nu sunt diferite pentru Pascal, dar pentru C reprezinta identificatori diferiti. Exemple:

În limbaj Pascal În limbaj C


Corect Incorect Corect Incorect
FLORIN1 17Flavius florin14 58albastru
FLORIN Ura! M _Ion a…54X
cartea _mare cartea…mare teoretic excelent!

Numarul maxim de caractere ale unui identificator luate în consideratie de compilatorul Pascal este de 63 de
caractere, restul de caractere ce depasesc numarul mentionat nu va fi luat în consideratie de acesta.
În mod similar C accepta ca simboluri semnificative pentru un identificator maximum 31 de caractere.
Spre deosebire de C limbajele C++ si versiunile ulterioare nu statueaza limite ale lungimii scriptice a unui
identificator si toate caracterele sunt semnificative.

1
ANSI – acronim pentru American National Standard Institute. Exista mai multe comisii care stabilesc standarde ANSI pentru
definirea limbajelor destinate calculatorului.
34
Literalele reprezinta forma de reprezentare a valorii datelor într-un format inteligent acceptat de
utilizator/programator si de calculator. Ele sunt de doua tipuri:
– numerice;
– alfanumerice.
Literalele numerice pot fi:
– întregi;
– reale.
Exemple de literale întregi:
381; – 732 – numere întregi în reprezentare zecimala;
$ 4D; – $ 72F1 – numere întregi în reprezentare hexazecimala.

Literalele flotante reprezinta numere rationale, formate din trei elemente:


– partea întreaga
care alcatuiesc mantisa,
– partea fractionara
– exponent
Exprimarea literalelor flotante este de tipul:
mantisa E exponent
Iata câteva exemple:
3.54 E – 7
– 4.51 E + 2
0.784 E 3
Literalele booleene sunt TRUE si FALSE, care, desi nu sunt cuvinte rezervate ale limbajului Pascal, nu pot
fi folosite ca identificatori. Spre deosebire de Pascal, în care acestea au semnificatie logica, pentru limbajul C
aceste elemente trebuie definite în context.
Literalele alfanumerice sau literalele caracter pot fi alcatuite dintr-un caracter sau o secventa de caractere
marcate la extremitati, astfel:

Pascal
’Opera ”Oedip Rege” este interesanta’

C
’Opera \”Oedip Rege\” este interesanta’

Etichetele, din ce în ce mai rar utilizate si recomandate a fi evitate, au rolul unor jaloane necesare în unele
zone ale programului atunci când se impune utilizarea comenzii goto explicit data în cazul unui soft spre o alta
sectiune a programului dinainte etichetat. Pentru eleganta, programatorii cauta sa evite utilizarea acestei comenzi,
totusi sunt cazuri în care acest lucru nu se poate ignora. Comanda goto este considerata o comanda caracteristica
limbajelor de generatie anterioara de tipul FORTRAN, ALGOL sau Basic si poate fi generatoare de dificultati în
depanarea programelor întrucât este o comanda de salt neconditionat la o alta secventa, fara a mai parcurge firul
normal al procesarii.
Comentariile sunt siruri de caractere în care programatorul poate introduce titluri, comentarii personale,
detalii de programare etc. Ele au doar rol informativ si pot lua una din încadrarile de mai jos:

35
Pascal
{Limbajele de programare sunt complicate}
(*Programarea este o arta*)

C
/*Limbajele de programare sunt complicate*/
//Acesta este un comentariu

Orice program este alcatuit, de regula, din doua parti principale, si anume zona declarativa si corpul
programului.
În zona declarativa se includ numele programului, declaratii de constante si variabile si tipul acestora,
declaratii de unit-uri, proceduri, functii care vor participa la rezolvarea problemei date, sau chiar biblioteci de
functii ale mediului de programare, cum este cazul C. Referitor la acest ultim aspect bibliotecile de functii pot fi
predefinite si fac parte din bibliotecile programului sau pot fi bibliotec i-utilizator, aplicatii pre-testate de
programator si arhivate pentru utilizari ulterioare în aplicatii mai complexe.
Structura principala a programelor în cele doua limbaje este ilustrata mai jos:

Pascal C
Antet {Program nume} /Program nume/
Const # include <stdio.h>
declaratii de # define declaratii
constante constante
Zona
Type typedef definire tip;
declarativa declaratii tipuri declaratii variabile;
Var
declaratii variabile
begin void main ( )
instructiune 1 {
instructiune 2 instructiune 1
Corpul .............. instructiune 2
programului instructiune n ..............
instructiune k
}
end

Tipuri de date

Tipuri de date standard

Indiferent daca este vorba de constante sau variabile, datele standard se pot clasifica în sase tipuri de baza:
– tipul întreg (numere întregi);
– tipul real (numere reale);
– tipul alfanumeric (sir de caractere);
– tipul boolean sau logic (existent în limbajul Pascal, iar în C trebuie definit explicit);
– tipul pointer;
36
– tipul enumerare.
În tabelul 8.1 sunt ilustrate tipurile de date definite prin standardul ANSI C.
Tabel 8.1
Tipuri de date definite prin standardul ANSI C [35]
Dimensiune aproximativa Domeniu minimal
Tip
în biti de valori
char 8 de la –127 la 127
unsigned char 8 de la 0 la 255
signed char 8 de la –127 la 127
int 16 de la –32767 la 32767
unsigned int 16 de la 0 la 65535
signed int 16 similar cu int
short int 16 similar cu int
unsigned short int 16 de la 0 la 65535
signed short int 16 similar cu short int

long int 32 de la –2.147.483.647 la


2.147.483.647
signed long int 32 similar cu long int
unsigned long int 32 de la 0 la 4.294.967.295
float 32 sase zecimale exacte
double 64 zece zecimale exacte
long double 80 zece zecimale exacte

Definirea constantelor se face conform sintaxei de mai jos:


Pascal
const nume _const = valoare;
C
# define nume_ const valoare

În mod similar, definirea variabilelor respecta sintaxa urmatoare:


var nume_variabila: tip _variabila; tip_variabila nume_variabila;
Exemple de definire de date standard:
Pascal C++
a : Boolean; bool a;
b : Real; double b;
c : Char; char c;
d : Integer; int d;
volum : array [1…10] of integer int volum [11];

în care a este o marime logica, b este o data reala, c un caracter, d o marime întreaga iar volum un sir de date
întregi. De remarcat faptul ca la siruri în limbajul C se porneste numararea elementelor de la 0. Astfel, pentru
37
identificarea elementului 3 din sirul volum ne vom referi la volum [2]) si se mai adauga un element suplimentar
de valoare nula, care are rolul de a marca sfârsitul sirului.
În afara de tipurile standard exista si alte tipuri pe care si le poate defini utilizatorul si anume:
– tipul enumerat;
– tipul interval (subdomeniu).

Tipul enumerat

Acest tip este legat de însiruirea ordonata a unor marimi asupra carora pot actiona functiile de precedenta
sau de succesiune si se caracterizeaza prin urmatoarele proprietati:
– tipul de variabila si cel al valorii atribuite acesteia este identic;
– valorilor enumerate li se atribuie un rang sau prioritati de acces (echivalent cu numerele de ordine din
vorbirea curenta);
– prioritatile de acces se considera a fi în ordine strict crescatoare;
– datorita ordonarii este posibila utilizarea operatorilor relationali în vederea comparatiilor;
– în cazul definirii a mai multor variabile de tip enumerat, multimile acestora sunt disjuncte.
Sintaxa variabilelor de tip enumerat este urmatoarea:
Pascal
type serie = (val 1, val 2,…,val n);
C
enum serie {val 1, val 2,…,val n};

Exemple:
Pascal
type
saptamana = (L, M, Mc, J, V, S, D)
curcubeu = (R, O, G, V, A, I, VI)
premiu = (întâi, doi, trei)
C
enum saptamana {L, M, Mc, J, V, S, D}
enum curcubeu {R, O, G, V, A, I, VI}
enum premiu {întâi, doi, trei}

38
Tipul interval (subdomeniu)

Acest tip este caracteristic limbajului Pascal si este o parte a unui tip ordinal deja definit. Obligatoriu se vor
preciza limitele inferioara si superioara ale subdomeniului dupa urmatoarea sintaxa:
type
sd_1 = min 1… max 1;
sd_2 = min 2…max 2;
...................
sd_n = min n…max n;
Exemple:
type
vara = iun…aug;
alfabet = ’a’…’z’

Operatori
Expresiile algoritmetice reprezinta modalitatea de prelucrare a variabilelor prin utilizarea operatorilor.
Acestia din urma sunt de urmatoarele tipuri:
– aritmetici;
– logici;
– relationali;
– de tip sir;
– operatii la nivel de bit;
– de tip multime;
– de tip adresa.
Cei mai uzuali operatori pentru limbajele C++ si Pascal sunt prezentati în tabelul 8.2
Tabelul 8.2
Operatori uzuali

Pascal C++ Descrierea operatiei


+ + adunare
– – scadere
/ / împartire
* * înmultire
MOD % restul împartirii
:= = atribuire

Exemplu de utilizare a operatorului atribuire:


Pascal
Marius := 25: C
Marius = 25

Daca la Pascal incrementarea, respectiv decrementarea trebuie data explicit,


la C exista doi operatori „minune” si anume – – si, respectiv + + (de unde si
denumirea versiunilor ulterioare ale C). Acesti operatori realizeaza scaderea,
respectiv adunarea cu 1:

39
Pascal C
x = x + 1 x + +
y = y – 1 y – –

Pe de-alta parte, în expresiile complexe, atunci când sunt folosite paranteze, prelucrarea începe din
interior spre exterior si de la stânga la dreapta, asa cum este ilustrat mai jos:

Asa cum s-a aratat în capitolele anterioare, alaturi de operatorii aritmetici de o mare importanta sunt si
operatorii relationali si operatorii logici. Cu toate ca limbajul C este un limbaj cu putine cuvinte logice
(cele 32 despre care faceam referire la începutul acestui capitol) el contine mai multi operatori simbolici decât
orice alt limbaj de programare. Aceasta îl face eficient si capabil a descrie o multitudine de operatii cu
minimum de elemente lexicale pe o linie de program, desi aparent da senzatia de încriptare si de lectura
anevoioasa.
În tabelul 8.3 se prezinta operatorii relationali si operatorii logici din limbajele C si Pascal.

Tabel 8.3
Operatori relationali si logici
Pascal C Semnificatie
OPERATORI RELATIONALI
= == egal
> > mai mare
< < mai mic
<> != diferit
<= <= mai mic sau egal
>= >= mai mare sau egal
OPERATORI LOGICI
and && si
or || sau
xor ^^ sau exclusiv
not ! negare

218
Exemple:
Pascal C
not true → false !(0) → 1 not logic
not false → true !(1) → 0 not logic
De remarcat faptul ca operatorii aritmetici au prioritate fata de operatorii relationali.
Dat fiind faptul ca limbajul C a fost proiectat ca o extensie superioara a limbajelor de asamblare, a caror
principala caracteristica este trimiterea informatiei la adrese alocate, deci lucrul direct cu forme binare, una
din facilitatile importante a acestuia este existenta operatorilor la nivel de bit (tabel 8.4). Acesti operatori se
pot aplica datelor de tip întreg (char, int, short, long, cu sau fara semn).
Tabelul 8.4
Operatori la nivel de bit (limbajul C)

Simbol Semnificatie
& si logic la nivel de bit
| sau logic la nivel de bit
^ sau exclusiv la nivel de bit
<< deplasare stânga
>> deplasare dreapta
~ negare la nivel de bit
Observatie: Daca operatorii relationali si logici determina întotdeauna un rezultat care poate fi 0 sau 1,
operatorii similari la nivel de bit pot conduce la alte valori sau alte actiuni.
Exemplu 1: 36|7

100100 36înbinar
7înbinar
|000111 ORasuprabi tilor
100111
rezultat
Rezultatul exemplului de mai sus reflecta operatia OR pe bit, pe care, daca, prin absurd l-am transpune
în cod zecimal ar fi egal cu 39, ceea ce nu are logica aritmetica si, de altfel operatiunea a actionat pe bit,
nicidecum pe un ansamblu convertibil în alt sistem de numeratie supus operatorilor aritmetici.
Exemplu 2:
36^7

100100 36înbinar
7înbinar
000111
^ XORasuprabi tilor
100011 rezultat

Si în acest caz operatia asupra bitilor are o cu totul alta semnificatie privind operatia de prelucrare,
întrucât operatorul XOR actioneaza si compara doua simboluri binare, initializând cu 1 daca bitii sunt diferiti
Operatorii de deplasare pentru biti, >> si <<, deplaseaza toti bitii dintr-o variabila spre dreapta sau spre
stânga, dupa cum se specifica sub aspectul numarului de pasi. Sintaxa generala este:
variabila >> numar de pozitii ale bitilor
pentru o deplasare a variabilei spre dreapta si, respectiv,
variabila << numar de pozitii ale bitilor
pentru deplasarea acesteia spre stânga.

40
Aceasta actiune este ireversibila, pozitiile ramase goale dupa deplasarea variabilei fiind ocupate de 0
logic iar bitii componenti ai variabilei daca depasesc capatul locatiei sunt pierduti definitiv. Acest tip de
actiuni este foarte util în decodificarea informatiilor externe, cum ar fi sistemele de achizitii de date dotate cu
convertoare analog-numerice cuplate la calculator.
Exemplu:
/* operatii de deplasare pe biti */
# include <stdio.h >
void main (void)
{
unsigned int a;
int b;
a = 1;
for (b = 0; b < 8; b ++)
{ a = a << 2
printf (”deplasare la stanga % d:%d\n”, b,a);
{
for (b=0; b < 8; b++)
{a = a >>2
printf (”deplasare la dreapta % d:% d\n”, b,a);
}
}
Un tip de operatori aparte este constituit de categoria operatorilor de atribuire combinati care
modifica sintaxa
<variabila> = <variabila> <operator> <var _sau_const>
într-o forma mult simplificata, si anume:
<variabila> <operator> = <var _sau_const>
Exemple de operatori combinati:
+ = similar cu atribuire cu adunare
– = atribuire cu scadere
* = atribuire cu înmultire
/ = atribuire cu împartire
% = atribuire cu împartire modulo
În limbajul C, virgula (,) este un operator binar, care leaga diferite expresii. Lectura marimilor separate
prin virgula se face prin citirea de la stânga la dreapta.
Functia operatorului virgula (,) nu are semnificatie similara cu punct si virgula (;) în C. Pe de-alta
parte în Pascal punctul si virgula actioneaza ca un separator în timp ce la C++ acelasi simbol actioneaza ca o
terminatie.
Exemple de utilizare a simbolului(;)

Pascal C++
Ion; Ion;
Ana; Ana;
Maria Maria;

41
În exemplul de mai sus, marimile din Pascal pot avea si valente de enumerare, daca nu exista o
instructiune suplimentara care sa precizeze rolul datelor enumerate, în timp ce la C++, datele prezentate sunt
marimi distincte al caror rol trebuie definit si nicidecum nu reprezinta o enumerare.
Exemple de utilizare a virgulei în C++
1. # define funct (a,b)
temp = a, a = b, b = temp
2. for (i = 0, j = 1; i < m; i + = 2, j + = 2)
printf (”% d, % d”, i, j);

Operatorul conditional (?:) este un operator foarte puternic si util al limbajului C, care înlocuieste
anumite instructiuni de forma daca-atunci-altfel si are sintaxa:
Expresie 1 ? Expresie 2: Expresie 3;
în care se evalueaza <Expresie 1>. Daca este adevarata se evalueaza <Expresie 2> si valoarea acesteia se
atribuie variabilei continute de acesta din urma. Daca <Expresie 1> este falsa, se evalueaza <Expresie 3> si
valoarea acesteia se atribuie variabilei continute de <Expresie 3>
Exemplu:
a = 15; este similar cu a scrie a = 15
b = a > 10 ? if a >
73 : 540; 10 b=73
else
b=540
Instructiuni
Instructiuni I/O de date si instructiuni de atribuire
Pentru a fi mai plastici, în abordarea acestui subiect vom pleca de la un exemplu în care dorim sa citim
date si, respectiv, sa tiparim datele citite. Tiparirea implicita se face direct pe monitorul calculatorului, daca
nu se precizeaza altfel.
Fie urmatoarele definitii de date (în cele doua limbaje analizate comparativ):

Variabila Pascal C Valoarea


m1 Char char M
m2 String [8] char [9] Albastru
a1 Integer int 2003
a2 Char char A
a3 Real float 74.32
Observatie: marimile m2 si a2 au în limbajul C un caracter suplimentar caruia i se aloca valoarea [0] si
semnifica terminatia dimensiunii, asa cum am precizat într-un paragraf anterior:
Pascal readln (a1,
program citire- m2);
scriere; readln (a2, a3,
var m1);
m1: char; writeln (a1,
m2: string [8]; m2);
a1 : integer; writeln (a2,
a2 : char; a3, m1);
a3 : real; end.
begin

42
C & m2);
// citire-scriere scanf (”% c % f % s”, & a2,
# include <stdio.h)> & a3 & m1);
char m1, m2 [7], a2; printf (”\n d% c”, a1, m2);
float a3; printf (”\n % c % f % c”, a2,
int a1; a3, m1);
{ }
scanf (”% d % s”, & a1,
Rezultatul va fi
2003 Albastru
iar pe urmatorul rând
A 74.32 M
În aplicatia de mai jos se da schema logica si programul de calculare a
TVA în limbaj Pascal.

Aplicatie
SCHEMA LOGICA A PROGRAMULUI TVA. PAS

Const
Tva=19/10;
Var
Pu, C, Pt1, TVA1 : Real;
I, Nrciclu:Integer;
begin
readln (Nrciclu);
For I:=1to Nrciclu do
begin
Writeln (’Introduceti pretul unitar’);
readln (Pu);
Writeln (’Introduceti cantitatea’);
readln (C);
Pt1:= Pu*C;
TVA1:= Pt1*Tva;
Writeln (’Pretul total al produselor cumparate
este’, Pt1);
Writeln (’TVA este’, TVA1);
end;
end.

* Pu = pretul unitar al produsului;


C = cantitate;
Pt1 = pretul total;
Tva1 = TVA-ul platit;
Tva ‚ cota de TVA

43
Desi functionalitatea comenzilor read si readln, respectiv write si writeln, este similara exista mici
deosebiri si anume:
— readln (a 1,…,am) sau readln pot fi apelate cu sau fara parametri, în timp ce read ca sa poata fi
functionala trebuie specificati parametrii de lecturare;
— readln fara parametri ignora restul necitit al liniei curente si efectueaza salt la linia urmatoare;
— în cazul writeln se realizeaza functiile procedurii write, în sensul ca se afiseaza pe ecran rezultatele
programului, iar dupa efectuarea afisarii se muta cursorul pe urmatoarea linie de program. Valorile
parametrilor din urmatoarea procedura write sau writeln se vor scrie, deci, pe o linie noua.
— procedura writeln fara parametri are ca efect mutarea cursorului pe o linie noua, ca si cum ar fi un
salt peste un rând.
Pentru limbajul C exista functiile de tip printf/scanf a caror sintaxa generala este:
scanf (”lista de argumente”, variabila 1, …, variabila n);
printf (”mesaje si lista de argumente”, variabila 1, …, variabila n);
Efectul similar cu writeln de salt pe urmatoarea linie se poate realiza în limbajul C prin inserarea
simbolului ”\n” ca în exemplul de mai jos:
printf (”astru \ n B \ n C”) care va avea efectul:
astru
B
C
Pentru functia scanf efectul este similar cu readln, cu amendamentul ca lectura parametrilor se face în
concordanta cu descriptorii acestora.
În tabelele 8.5 si 8.6 sunt exemplificate câteva tipuri de descriptori
Tabel 8.5
Specificatori de format pentru scanf ( )
Cod Semnificatie
%c citeste un singur caracter
% d sau % i citeste un numar întreg din baza zece
% e sau % f citeste un numar în virgula mobila
%o citeste un numar în octal
%s citeste un sir
%x citeste un numar în hexazecimal
%p citeste un pointer
%n primeste o valoare egala cu numarul de caractere citite pâna atunci
%u citeste un numar întreg fara semn

Tabel 8.6
Specificatori de format printf ( )
Cod Format
%c caracter
% d sau % i numere întregi în baza 10, cu semn
%e numar zecimal în notatie stiintifica cu e mic
%E numar zecimal în notatie stiintifica cu E mic
%f numar zecimal în virgula mobila
%o numar în octal fara semn
%s sir de caractere
%u numere întregi în baza zece fara semn
%x numere hexazecimale fara semn cu caractere mici (minuscule)
%X numere hexazecimale fara semn cu caractere mari (majuscule)
%p afiseaza un pointer
%n argumentul asociat este un pointer de tip întreg în care a fost plasat
numarul de caractere scrise pâna atunci
%% afiseaza un semn %

44
Un alt aspect important este operatorul adresa ”&” care realizeaza citirea direct din adresa alocata
marimii stocate ceea ce face ca viteza de acces a unui program redactat în limbaj C sa fie considerabil mai
mare si mai eficienta decât a unuia similar redactat în Pascal.
Sub aspectul formatului de scriere, care, în cele mai multe cazuri este necesar sub aspectul explicitarii
datelor afisate, dar si a elegantei în programare, se impun unele precizari asupra formatelor de iesire.
Exemplu:
#include <stdio.h> Rezultatul programului va fi:
void main (void) 43. 7275280
{ 0043. 7275280
double a;
a = 43. 7275280
a = 43.727528;
printf (”% f \ n”,
a);
printf (”% 012 f \
n”, a);
printf (” \ na = %
f”, a);
}
Instructiuni de atribuire

Sintaxa instructiunilor de atribuire este:

Pascal C
variabila := variabila =
expresie; expresie

În aplicatia de mai jos se prezinta un program de calcul a dobânzii simple, redactat în limbaj Pascal.

Instructiuni compuse
a) Instructiuni de tip if
Sintaxa generala a acestui tip de instructiuni es te urmatoarea:
Pascal C
if conditie if (conditie)
then instructiune 1 instructiune 1;
else
else instructiune 2;
instructiune 2;
sau
if conditie if (conditie)
then instructiune instructiune;

Observatii:
Pentru limbajul Pascal:
— delimitatorul punct si virgula (;) se poate omite atunci când este pozitionat înaintea cuvântului-
cheie end;
— înaintea cuvântului-cheie else care este în legatura cu instructiunea if curenta nu este permisa
utilizarea separatorului (;);
Pentru limbajul C:
— înainte de else trebuie utilizat delimitatorul (;);
Reamintim faptul ca, desi este posibila dezvoltarea de secvente if înglobate unele în altele, aceasta
trebuie facuta cu atentie întrucât poate fi generatoare de erori logice frecvente.

45
Exemplu: (determinarea maximului dintre trei valori date):
Pascal
program maxim;
var
a, b, c : real;
begin
write (’a = ’);
readln (a);
write (’b = ’);
readln (b);
write (’c = ’);
readln (c);
write (’maximul :’)
if (a>b) and (a>c)
then writeln (a)
else if (b>a) and (b>c)
then writeln (b)
else writeln (c);
end.
C
# include <stdio.h>
float a, b, c;
void main (void)
{
printf (”a = ”); scanf (”% f”, & a);
printf (”b = ”); scanf (”% f”, & b);
printf (”c = ”); scanf (”% f”, & c);
printf (”maximul : ”);
if (a > b && a > c)
{
printf (”%f”, a);
}
else
if (b > a && b > c);
printf (”%f”, b);
else
printf (”%f”, c);
}
b) Instructiuni de tip case/switch
Sintaxa generala este:
Pascal ...............
case expresie val n:
of instructiune n;
val 1: end.
instructiune 1;
val 2:
instructiune 2;

46
C val 2: instructiune 2; break;
switch ....................
(expresie) ....
{ case
case val n: instructiune n, break;
val 1: instructiune default: // este optional
1; break; instructiune implicita;
case break;
}
Exemple :
Pascal
C
case ch of
’A’ : Add ( ); switch (ch): of
{
’D’ : Delete ( case ’A’ :
); Add ( );
’M’ : Modify ( break;
); case ’D’ :
’Q’ : ; {nu Delete ( );
face nimic} break;
case ’M’ :
end; Modify ( );
break;
case ’Q’ :
break; // nu
face nimic
}

47
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

c) Instructiuni repetitive

— Instructiunea while
Sintaxa generala este urmatoarea:

Pascal C
while conditie while (conditie)
do instructiune; instructiune;
Exemple :

Pascal C
a : = 0; a = 0;
while (a < 30) while (a < 30)
do a: = a + 1; a = a +1;
— Instructiunea repeat/until – do/while
Instructiunea repeat-until itereaza atâta timp cât conditia impusa este falsa; închiderea buclei se
realizeaza atunci când aceasta conditie devine adevarata. Acest tip de instructiune apartine limbajului
Pascal.
Echivalentul instructiunii precedente în limbajul C este do/while. Caracteristica acesteia este ca
mentine iterarea atâta timp cât conditia data ramâne adevarata si se închide atunci când aceasta devine
falsa.
Sintaxa generala este:

Pascal C
repeat do {
instructiune 1; instructiune
instructiune 2; } while (conditie);
............... //instructiunea poate fi simpla sau un
instructiune n; set de instructiuni.
until conditie;

Pascal
a:= 50;
repeat
a:= a + 1;
until a > 100;

C
a = 50;
do { // observa acolada!
a = a + 1;
} while (a < = 100);

48
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Asa cum se poate observa exista o mica diferenta între exemplul redactat în limbaj Pascal (a >
100) si cel redactat în C (a < = 100).
Aceasta bucla, a exemplului din limbajul Pascal, va fi efectuata atâta timp cât a < 100, iar la
valoarea a = 101 bucla se va închide, deci echivalenta dintre cele doua exemple este evidenta.

c) Instructiunea for
Sintaxa generala este urmatoarea:
Pascal C
— bucla de executie crescatoare
for i : = n1 to n2 for (i = 0; i < n; i++
{unde n2 > n1} {
do begin instructiuni
instructiune }
{pasul = 1}
{executia buclei in mod
crescator}
end
— bucla de executie descrescatoare
for i:= a1 downto a2 for (a = 0; i > a; i––
{unde a2 < a1} {
do instructiuni
begin }
instructiune
{pasul = –1}
{executia buclei in mod
descrescator}
end
— bucla de executie implicita
for v : = m1 to m2 for (initializare, conditie, increment)
do {
begin instructiuni
instructiune }
end

În Aplicatia de mai jos se prezinta un program redactat în C pentru calculul salariului net.
Aplicatie
Calcul salariu net (Redactare în C)
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
int nrore [5];
float priceora [5];
float salbrut [5];
float salnet [5];
void calculsalariunet (int k)
(salbrut [k] = nrore [k] * priceora [k];

49
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

salnet [k] = salbrut [k] – 23.33/100 * salbrut [k] – 7/100 *


salbrut [k] –7/100 * salbrut [k] – 11.67/100 * salbrut [k]– 1/100 *
salbrut[k]– 5/100 * salbrut [k] – 2/100 * salbrut [k]– 0.75/10 0 *
salbrut [k];
cout << ”salariatul ”<<k>>” are salariul net ”<<salnet [k] <<’\n’;
}
void main ( )
{ int l;
clrscr ( );
cout <<”introduceti nr de ore pentru cei cinci angajati”<<’\n’;
for (int m = 0; m<5; m++)
cin>>nrore [m];
clrscr ( );
cout<<”introduceti plata pe ora pentru cei cinci angajati ”<<’\n’;
for (int j = 0; j<5; j++)
cin>>priceora [j];
clrscr ( );
cout<<’\n’<<”daca vreti sa aflati salariul pentru un singur
salariat”<<’\n’<< ”apasati nr de ordine dorit intre 0 si 5:
”<<’\n’<<\n’<<”daca doriti salariul pentru toti angajatii ”<<’\n’
<<”
apasati un nr mai mare de 5”<<’\n’;
cin>>l;
if (l>=0&&l<5)
{clrscr ( );
calculsalariunet (l);
}
else
{
clrscr ( );
for (int o=0; o<5; o++)
calculsalariunet (o);
}
}

d) Instructiunea break -continue

Aceasta instructiune exista doar pentru limbajul C si nu în Pascal. Ea functioneaza cu for si


realizeaza bucle scurte de verificare conectate cu instructiuni if, dupa care trece la restul executiei
programului.
Sintaxa gener ala este:
for (i = 0, i < n; i ++)
{
if (a [i] < 0) break; // Inchiderea buclei
if (a [i] = = 0) continue; // Continua cu urmatorul i
v = a [i]; // daca s-a atins prima valoare pozitiva a[i] > 0
instructiuni
}

50
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Proceduri si functii. Subprograme

Asa cum se preciza în capitolele anterioare un subprogram descrie un subalgoritm al unei


probleme, elaborat într-un limbaj de programare care are proprietatea ca prin apelare unica sau multipla
sa eficientizeze programul central sau un alt subprogram denumit program apelant.
Subprogramul poate fi privit ca o unitate separata de program care poate fi apelata de o alta
unitate de program si se mai numeste program apelat.
Caracteristicile subprogramelor:
a) Subprogramul se defineste o singura data si poate fi apelat de mai multe ori.
b) Definitia subprogramului se face în termeni generali utilizând pentru aceasta parametri formali.
O parte dintre parametrii formali au semnificatia de date de intrare în subprogram iar cealalta parte
alcatuieste datele de iesire din subprogram.
La apelarea subprogramului, programul apelant trebuie sa ofere parametrii actuali care înlocuiesc
parametrii formali si care trebuie sa fie de acelasi tip si aceeasi ordine de definire în ambele unitati de
program.
Acolo unde este posibil se recomanda utilizarea subprogramelor care au rolul:
– sa simplifice activitatea de programare;
– sa reduca complexitatea programelor.
Procedurile si functiile sunt subprograme. Diferenta dintre cele doua categorii de subprograme
rezida în numarul valorilor returnate programului apelant. Astfel,
– procedura calculeaza si returneaza oricâte valori implicite sau explicite;
– functia calculeaza si returneaza întotdeauna o singura valoare de tipul specificat în programul
apelant.
Limbajul C nu face diferente de denumire, astfel încât procedurile sunt tratate tot ca functii, dar
declansarea acesteia se face cu void marcând existenta unei functii-program, iar returnarea este alcatuita
din date multiple prin comanda return.
Sintaxa generala este:
Pascal C
— procedura — functie-subprogram
procedure nume void nume (int art1,char
(arg1:integer;arg2:char); art2)
... {
begin ...
... }
end;
— functie — functie propriu-zisa

51
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

function nume double nume (int arg1, int


(arg1,arg2:integer):real; arg 2)
... {
begin return expresie;
... }
nume: = expresie;
— element procedural rapid
end;
if (conditie)
return
...
Sub aspectul plasarii acestora în ansamblul codului-sursa (a programului) vom descrie întâi
aspecte legate de limbajul Pascal.
Program denumire;
declaratii de date;
Procedure nume (parametrii ...);
declaratii de parametri;
begin
instructiune1;
...
instructiune k;
end;
{Programul principal}
begin
instructiune p1;
...
instructiune pk;
nume (parametri...); {apelarea procedurii}
instructiune pk+1;
...
instructiune pm
end.
În aplicatia de mai jos se prezinta un program redactat în Pascal pentru calculul consumului de
benzina

Aplicatie

Program Consum Benzina; {BENZREC.PAS}

USES Crt,Inform;
TYPE
Datarec=RECORD
Datum: String[10];
Cant: Real;
Km: Integer;
END;
arttyp = (load,save);

52
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

VAR
data: Array[1…100] Of datarec;
fis: File Of datarec;
nume fis: String;
medie: Array [1..100] Of Real;
canttot.medietot: Real:
totalkm, numar,I: Integer;
aleg: Char;
(*$I BENZIN.INC*)
(*$I MEDIE.INC*)
(*$I OUTMENU.INC*)
(*$I FILCHECK.INC*)
(*$I SAVEBENZ.INC*)
(*$I LOADBENZ.INC*)
(*$I BENZMENU.INC*)
BEGIN
ClrScr;
Numar = 0;
REPEAT
Window(1,1,80,25)
ClrScr;
Menu;
UNTIL aleg = #27;
END

PROCEDURE Introd; {BENZIN.INC}

VAR
taste: Char
BEGIN
ClrScr;
WriteLn(‘Creare fisier nou <1>’);
WriteLn(‘Continuare fisier <0>’);
taste: ReadKey;
IF taste = ’1’ THEN numar: = 0;
ClrScr;
REPEAT
Inc(numar);
WITH data[numar] DO BEGIN
WRITE(^j^m,numar:3,’: Data (Intrerupere cu <x>):’);
datum: = ReadDatum
if datum <>’x’ THEN BEGIN
WriteLn;
Write(‘ cant in 1:‘);
Cant: = ReadReal(4)
Write(‘ Kilometri ‘);
km:=ReadInt(3)

53
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

END;
END;
UNTIL data[numar].datum = ’x’;
DEC(numar);
END;

PROCEDURE CalculMedie; {MEDIE.INC}

BEGIN
canttot: = 0;
totalkm: = 0;
FOR i: = 0 TO numar DO
WITH data[i] DO BEGIN
Medie[i]: = cant/km*100;
canttot: = canttot+cant;
totalkm: = totalkm+km,
END;
medietot: = canttot/totalkm*100;
END;

PROCEDURE Afisare(device:String); {BENZOUT.INC}

VAR
taste: Char;
ad: Text;
BEGIN
Window(1,1,80,25);
ClrScr;
Assign(ad, device);
ReWrite(ad);
WriteLn(ad’ Calcul consum de benzina litri la 100 Km ‘)
WriteLn(ad’ Data Litri Kilometri Consum 1/100 Km ‘);
WriteLn(ad’ ‘);
FOR i: = 1 TO 50 DO Write(ad’-‘);
WriteLn(ad);
FOR i: = 1 TO NUMAR DO
With DATA[i] DO
WriteLn(ad’ ‘,datum:8, cant:8:2,km:10,medie[i]:14:1);
Write(ad’ ‘);
FOR i: = 1 TO 50 DO Write(ad’-‘);
WriteLn(ad);
WriteLn(ad,’ Total: ‘, canttot:8:2, totalkm:10, medietot:14:1);
Close(ad);
Write(^j’<RETURN>)’)
taste: = ReadKey
END

54
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

PROCEDURE AfisMenu; {OUTMENU.INC}

VAR
taste: Char;
BEGIN
ClrScr;
WriteLn(‘Afisare la ecran <0>‘);
WriteLn(‘Afisare la imprim <1>‘);
taste: = ReadKey
IF taste = ’1’ THEN Afisare(‘prn’) else Afisare(‘con’);
END;

Apelul unei functii în Pascal respecta urmatoarea sintaxa:

Program denumire;
declaratii de date
Function nume (parametri): tip;
declaratii de parametri
begin
instructiune 1
...
instructiune n
end;
{Programul principal}
begin
instructiune p1
...
instructiune pk {Ex: S = nume*m}
...
instructiune pm
end.

Întâlnirea unui apel al unei functii sau proceduri pe parcursul executiei programului suspenda
temporar pe aceasta si executa prelucrarea subprogramului apelat pâna la atingerea instructiunii end;
abia apoi se trece din nou la prelucrarea în continuare a programului principal.
Corespondenta între programul principal si subprogram se realizeaza prin parametrii situati în
aceeasi pozitie între cele doua liste si de acelasi tip.
Spre deosebire de cele de mai sus, în limbajul C, o functie trebuie declarata înainte de a fi apelata.
Declararea se face la începutul scriptului si se mai numeste prototipul functiei. Desi, spre deosebire de
Pascal, plasarea functiei poate sa aiba loc oriunde în script aceasta trebuie sa fie pozitionata înaintea
primei apelari a acesteia. Totusi, pentru eleganta în programare, recomandam plasarea dupa declararea
datelor principale ale programului central.

55
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Sintaxa generala este urmatoarea:


double functie (int art1,intart2);//Prototipul functiei
int main ( )
{
double x;
...
x = functie (5000,16);
...
}
...
//Revenire la programul principal

sau într-o forma implicita, simplificata, bazata pe definitia functiei:


doublefunctie(int arg1,int arg2, ...) // definitia functiei
{
instructiune 1
...
intructiune k
}

Unit, header, pre -procesor

Unit reprezinta o entitate, un program de dimensiuni reduse (64 Ko) caracteristic limbajului
Pascal. Unit-urile pot fi subprograme deja testate, organizate sub forma de biblioteci-utilizator.
Sintaxa generala este:
uses unit_1, unit_2, ..., unit k;
Extensia unit-urilor este .TPU (Turbo Pascal Unit). Utilizatorul poate utiliza oricâte unit-uri are
nevoie pentru executia programului central.
Unit-urile pot fi de doua categorii:
– unit-uri standard stocate în biblioteca limbajului;
– unit-uri utilizator stocate în biblioteci-utilizator.
Unit-urile standard sunt reduse ca numar si acestea sunt:
system – contine toate procedurile si functiile de baza Pascal, precum si un set de parametri predefiniti.
Acest unit este încorporat în mediul Pascal si nu necesita actiunea comenzii uses, utilizarea sa
fiind implicita;
dos – contine proceduri si functii echivalente cu comenzile sistemului de operare MS-DOS. Utilizarea
sa se face cu actionarea comenzii uses;
overlay – care permite folosirea tehnicii de segmentare si de apelare a unit-urilor doar la comanda a
programelor foarte mari si de a le executa „bucata cu bucata”, astfel încât programul sa
functioneze ca un tot (overlay);
crt – unit legat de folosirea ecranului în mod text, citirea tastaturii, generarea sunetelor;
printer – contine variabila predefinita lst de tip text care la initializare asigneaza imprimanta LPT1 si o
acceseaza pentru scriere.
graph – contine elemente si subprograme pentru folosirea ecranului în mod grafic.

56
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Echivalentul comenzii uses din limbajul Pascal este cel al directivelor de compilare ce alcatuiesc
pre-procesorul. Acestea se plaseaza întotdeauna la începutul codului înainte de declaratiile de date si
sunt marcate de simbolul „#”.
Pre-procesorul contine urmatoarele directive:
# if # include
# ifdef # define
# ifndef # undef
# else # line
# elif # error
# endif # pragma
Directivele de pre-procesor nu pot lucra decât cu accesarea bibliotecilor programului, bibliotecile-
utilizator, parametri etc. care se mai numesc header (denumirea provenind din pozitia acestora în faza
de început a script-ului codului). Detalii de utilizare a pre-procesorului si a head-elor se pot gasi în
lucrarea [35].

57
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

9. Programarea orientata spre obiecte


la limbajele Pascal si C

Programarea orientata spre obiecte este legata atât de conceptul de abstractizare a datelor, cât si de
abstractizarea procedurilor de prelucrare a datelor. În esenta programarea orientata spre obiecte
reprezinta un concept filosofic si o tehnica de regrupare a datelor, a fisierelor si a entitatilor de
prelucrare (programe, subprograme) pe baza anumitor criterii. Privita sub acest aspect, practic orice
limbaj de programare modern are calitati de programare orientata spre obiecte.
Un obiect constituie un modul de program care descrie caracteristicile si comportamentul unei
entitati conceptuale sau fizice ce intervine în sistemul implementarii de program [23]. El este alcatuit
din date care descriu caracteristicile entitatii si din metode care îi descriu comportamentul.
Un limbaj cu caracteristici de programare orientata spre obiecte trebuie sa ofere mecanisme pentru
urmatoarele operatii:
a) încapsularea;
b) mostenirea;
c) polimorfismul metodelor.
Asupra celor de mai sus nu vom insista întrucât principiile generale au fost descrise în capitolul
anterior. Un program orientat spre obiecte (OOP – Object Oriented Programming) are putine date
globale, iar blocurilor logice de tip algoritmic le iau locul clasele si obiectele.
În conceptia lui Booch [38], OOP este o metoda de implementare în care programele sunt
organizate ca si colectii de obiecte ce coopereaza între ele, fiecare obiect reprezentând instanta unei
clase; fiecare clasa apartine unei ierarhii de clase, clasele fiind unite prin relatii de mostenire.
Practic, avem de-a face cu macroalgoritmi care opereaza cu obiecte, care la rândul lor constituie
instanta unei clase, care are calitati comune cu o alta datorita proprietatilor de mostenire.
Un limbaj de programare care ofera suport pentru utilizarea claselor si obiectelor dar care nu are
implementat mecanismul relatiilor de mostenire între clase este un limbaj bazat pe obiecte iar
programarea bazata pe clase si pe obiecte, care nu face uz de relatia de mostenire se mai numeste
programare cu tipuri de date abstracte.
Clasele si obiectele grupate si stocate într-o forma fizica alcatuiesc module. Modulele formeaza
arhitectura fizica a programului. Conceptul de modularizare reprezinta posibilitatea divizarii
programului într-un numar de subansamble (module) care pot fi compilate separat, dar care sunt cuplate
între ele.
Modularizarea respecta câteva reguli generale, si anume:
1. Structura fiecarui modul trebuie sa fie suficient de simpla pentru a putea fi complet înteleasa;
2. Implementarea unui modul trebuie sa depinda doar de interfetele altor module;
3. Detaliile sistemului, care se presupune ca vor suferi modificari indepen-dente, vor fi plasate în
module diferite;
4. Singurele legaturi între module vor fi acelea a caror modificare este improbabila;

58
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

5. Orice structura de date este încapsulata într-un modul; ea poate fi accesata direct din interiorul
modulului, dar nu poate fi accesata din afara modulului decât prin intermediul obiectelor si claselor
continute în acel modul.

Caracteristici OOP la limbajul Pascal

Începând cu versiunea 5.5. a limbajului Turbo Pascal s-a introdus tipul obiect (object)
Sintaxa generala este urmatoarea:
type numeob = object
camp_1: tip_1;
camp_2: tip_2;
...
camp_n: tip_n;
procedure nume p[(p1, p2, ..., pn)];[virtual;]
function nume f[(f1, f2, ..., fn)]: tip;[virtual;]
constructor nume c [(c1, c2, ..., cp)];
destructor nume d[(d 1, d2, ..., dq)]: tip;[virtual;]
end;

Definirea metodelor aferente unui obiect se face în zona declarativa a unui program principal sau
a unui unit.
În continuare se prezinta câteva exemple.
Exemplu:
procedure numeob. numep [(p1, p2,..., pn)];
{declaratii de variabile si etichete}
{definitii de tipuri si constante}
{declaratii si definitii de proceduri si functii}
begin
{corpul procedurii numep care apartine obiectului numeob}
end;

Întrucât un tip obiect are doua categorii de componente (câmpuri si metode) încapsulate în
obiectul dat, accesul la componentele unei variabile de tip obiect se va face respectând anumite criterii,
astfel:
– orice câmp poate fi accesat direct în corpul oricarei metode încapsulate în obiect (ca si cum
aceasta s-ar afla sub incidenta instructiunii with);
– din afara metodelor, accesarea se face cu ajutorul variabilelor tip obiect, al caror nume urmat de
caracterul „⋅”, trebuie sa prefateze numele câmpului;
– orice metoda poate fi apelata de o alta metoda a aceluiasi obiect, similar cu apelarea unui
subprogram, dar nu poate fi apelata de o metoda încapsulata în alt obiect;
– orice metoda poate fi apelata de un subprogram clasic de tip procedura sau functie sau functia
sau de programul principal astfel:
– prin precizarea numelui metodei urmat de parametrii actuali si prefatat de numele
variabilei obiect urmat de caracterul punct;

59
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

– prin specificarea numelui metodei urmat de parametrii actuali, daca se afla sub incidenta
instructiunii with;
– metodele de tip constructor, de regula se apeleaza primele, iar cele de tip destructor se apeleaza
ultimele, sintaxa de apel fiind similara cu cazul procedurilor.

p 1. init; with p1
sau
p 2. init; do
p 1. begin
insert(20) init;
; insert(10);
x:=p1.urm; insert(20);
y: = prim
end;

Desi utilizatorul are la dispozitie un set complet de metode pentru prelucrarea câmpurilor
obiectului, accesul la sectiunea declarativa privind declararea obiectului poate fi întrucâtva îngradit în
sensul ca începând cu versiunea 6 a limbajului Turbo Pascal acesta poate fi divizat în doua sectiuni: una
publica (accesibila din afara obiectului) si una privata (accesibila doar în cadrul obiectului, inclusiv în
declaratiile metodelor sale).
În continuare se da un exemplu de definire a unui obiect în limbaj Pascal
unit pers;
interface
type ani = 0 ... 150;
persoana = object
procedure init;
procedure afisare;
function afla_nume: string;
function afla_varsta: ani;
private
nume: string [20];
prenume: string [20];
vârsta: ani;
end;
implementation
procedure persoana. init;
begin
{definirea metodelor}
end.
Un tip obiect poate sa mosteneasca componentele (câmpurile si metodele) unui alt tip obiect
definit anterior [16]. Tipul care mosteneste se numeste descendent al tipului de la care s-a facut
mostenirea, iar tipul de la care s-a mostenit se numeste stramos al tipului descendent.
Procesul de mostenire nu este limitat, astfel ca un obiect poate fi descendentul unei serii de
stramosi având caracteristici comune cu toate obiectele din a caror ierarhie provine.

60
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Daca într-un arbore de mosteniri, într-un obiect component se redefineste metoda, aceasta nu se
mai mosteneste de catre fostii descendenti, dar se poate crea o noua ramura de descendenta cu
caracteristici comune.
În cazul în care într-o ierarhie de tipuri obiect avem mai multe metode nedefinite se poate realiza
apelarea selectiva a acestora în functie de urmatoarele posibilitati:
1. legatura între un program apelant si o metoda se stabileste odata cu compilarea programului si
ramâne nemodificata (statica) pe toata durata executiei acestuia, caz în care spunem ca metoda este
statica;
2. se poate realiza apelarea selectiva a metodelor redefinite, daca acestea au fost declarate metode
virtuale, prin adaugarea optiunii virtual.
În asemenea cazuri, toate metodele descendent ale acesteia vor fi virtuale.
Virtualizarea se realizeaza cu ajutorul unei tabele de metode virtuale (virtual method table –
VMT), care contine adresele metodelor virtuale si trebuie ca în definitia tipului obiect sa existe cel putin
o metoda speciala de tip constructor.
Constructorul trebuie apelat înaintea oricarei metode virtuale.
Functia inversa constructorului este destructorul (destructor), care are rolul de a „curata”
obiectele deja prelucrate si va fi ultima metoda apelata a unui obiect.
Un obiect poate avea un numar arbitrar de perechi constructor/destructor care pot fi mosteniti.
Constructorii nu pot fi virtualizati.
Exemplu:
unit A;
interface
type leg = ^ elem;
elem = record
val :integer;
next:leg
end;
A1 = object;
constructor init;
function prim:integer;
function urm:integer;
procedure insert (n: integer);
destructor term;
private
cap, crt: leg;
end;
implementation
constructor A1. init;
begin
new (cap);
crt: = cap;
cap ^ . val: = 0
cap ^ . next: = nil
end
function A1.prim:integer
begin
prim: = cap ^ .val;

61
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

crt: = cap
end;
function A1. prim:integer;
begin
crt: = crt ^ .next;
urm : = crt ^ .val
end;
procedure A1. insert (n:integer);
begin
while crt ^ . val 0
do
crt: = crt ^ .next;
crt ^ . val: = n;
new: = crt ^ .next;
crt: = crt ^.next;
crt ^ . val: =0;
crt ^ . next =nil
end;
destructor A1.term;
begin
crt: = cap;
while cap nil do
begin
cap: = crt ^ . next;
dispose (crt);
crt: = cap
end
end;
end;

În exemplul de mai sus s-a definit obiectul A1 si declaratiile metodelor sale.

Caracteristici OOP la limbajul C++

Dupa cum s-a mentionat într-un capitol anterior, de-a lungul timpului s-au conturat trei mari
familii de limbaje orientate spre obiecte; astfel astazi se deosebesc :
– limbaje de clase;
– limbaje de cadre (frames);
– limbaje de tip actor.
Limbajul C++ apartine familiei limbajelor de clase.
O clasa este un tip de date care descrie un ansamblu de obiecte cu aceeasi structura si acelasi
comportament. Clasele pot fi îmbogatite si completate pentru a defini noi familii de obiecte. Principiile
de mostenire si încapsulare sunt similare cu cele prezente în paragraful anterior.
O clasa poate contine atât sectiuni particulare, cât si publice. Implicit, toate elementele definite
într-o clasa sunt particulare si, deci, o functie care nu face parte din acea clasa nu poate avea acces la
ele.

62
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Sintaxa generala de declarare a unei clase în C++ este :


class nume_clasa
{
date si functii private
specificator_acces:
date si functii publice
specificator_acces :
date si functii protejate
...
specificator_acces:
date si functii
}
lista de obiecte
sau într-o forma simplificata:
class nume_clasa
{
...
declaratii variabile membre
...
declaratii functii membre
...
}
Lista de obiecte poate fi optionala. Daca este prezenta, în ea sunt declarate obiecte ale clasei.
Specificatorii de acces constituie cuvinte cheie care definesc clasele. Acestea pot fi de tip public,
private si protected.
Datele si functiile publice pe care le contine clasa sunt cunoscute prin proprietati si metode.
Metodele care caracterizeaza functiile publice se mai numesc si functii de interfata.
Exemplu:
class facultate
{
public :
facultate (char * specializare)
{str cpy (Facultate: : specilizare, specializare);};
void arata_specializare (void)
{cout <<specializare<<endl;};
protected
float taxa;
void arata_taxa (void)
{cout <<taxa<<endl;};
private
char nume_student [40]
char prenume_student [40]
};
Operatorul „::” este specific limbajului C ++ si este denumit operator de rezolutie sau operator de
acces sau de domeniu. El permite accesul la un identificator, dintr-un bloc sau în care acesta nu este
vizibil datorita unei alte declaratii locale.

63
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

În exemplul de mai sus, obiectele derivate din clasa facultate pot accesa membrii taxa si
arata_taxa ca si cum ar fi publici. În afara de obiectele derivate, programul trebuie sa trateze membrii
protejati ca si cum ar fi privati.
Asa cum se poate observa, fata de limbajul C ++ limbajul Pascal nu poseda conceptul de clasa, ci
doar de obiect (object) ca entitate abstracta alcatuita din date si metode. În C ++ entitatea-obiect este
extinsa spre clase, tipuri de clase si familii de clase, termenul fiind mai cuprinzator si mai sugestiv.
Notiunea de clasa devine astfel o generalizare a notiunii de structura de date care descrie un
ansamblu de obiecte similare. Astfel, un obiect este instantierea unei clase.
Un mesaj trimis unui obiect este compus din trei elemente:
a) numele obiectului care contine metoda;
b) numele metodei;
c) valori pentru toti parametrii de intrare ai metodei (daca aceasta are parametri de intrare).
Cu alte cuvinte o clasa este schema dupa care este creat un obiect. În interiorul acesteia sunt
precizate denumirile tuturor variabilelor si tipurile de date pe care acestea le vor stoca alaturi de toate
operatiile (metodele) pe care un obiect, construit din respectiva clasa, le va contine.
Operatia prin care este creat un obiect, dupa schema precizata de o clasa, se numeste instantiere,
iar obiectul creat dupa planul oferit de o clasa este o instanta a acelei clase.
Ordinea de lucru în OOP este urmatoarea:
A. Crearea claselor, care cuprinde:
– precizarea denumirii variabilelor, a tipurilor acestora (standard sau derivat), a domeniului de
vizibilitate (public, private, protected);
– precizarea signaturii metodelor componente (denumirea, definirea parametrilor de intrare si
de iesire), a corpului programului (codul care descrie comportamentul metodei), domeniului de
vizibilitate precum si alte proprietati care concura la definirea metodei orientate obiect.
B. Crearea obiectelor prin specificarea clasei dupa al carui model a fost creat obiectul respectiv
si prin asignarea de valori variabilelor precizate la definitia clasei.
Precizam ca doar în momentul instantierii unei clase, care marcheaza nasterea unui obiect, se
aloca în memorie variabilele definite de clasa si care pot fi ulterior prelucrate de catre metode.
În figura 7.3. este prezentat un exemplu de mostenire a claselor, care, dupa cum se vede este
posibila pe diverse nivele2 .

Figura. 7.3. Mostenirea claselor.

Definirea unei noi clase se mai numeste si derivare. Noua clasa, obtinuta prin procedeul
mentionat se numeste clasa derivata nascuta dintr-o clasa de baza (sau din mai multe). Clasa derivata

2
Mostenirea nu este similara cu instantierea ei. Numai o clasa poate mosteni proprietatile altei clase! În urma
instantierii rezulta un obiect.

64
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

mosteneste de la clasa de baza structura de date si metodele aferente la care, eventual, se pot adauga noi
date sau metode sau se pot redefini unele metode. Daca o clasa derivata este provenita din mai multe
clase de baza, operatia se numeste si mostenire multipla.
Accesarea membrilor unei clase se face dupa sintaxa generala:
obiect. Variabila Membra = valoare
pentru accesul la o variabila membra si
obiect. Functie Membra ( )
pentru apelarea unei functii membre.
Pentru gestiunea dinamica a memoriei, în limbajul C se foloseau functiile malloc ( ) si free ( ). În
limbajul C ++ se utilizeaza doi operatori mult mai sugestivi si anume: new si delete.
Operatorul new este folosit pentru alocarea memoriei si are sintaxa:
variabila = new tip, //aloca spatiu pentru variabila //dar nu o
initializeaza
variabila = new tip (valoare initiala);
//aloca spatiu pentru variabila si o //initializeaza cu valoarea
specificata
variabila = new tip [n];
//aloca un tablou de dimensiune n.

Operatorul new furnizeaza ca rezultat un pointer care contine adresa zonei de memorie alocate, în
caz de succes, sau un pointer cu valoarea NULL atunci când alocarea nu a reusit.
Eliminarea unei variabile dinamice sau eliberarea zonei de memorie aferente se realizeaza cu
ajutorul operatorului delete, a carui sintaxa este:
delete variabila;

Nu în toate situatiile new si delete rezolva problemele de gestionare a obiectelor. Pentru aceasta se
recomanda utilizarea unor functii membre speciale numite constructori si, respectiv destructori.
Constructorul este apelat automat la instantierea unei clase (statica sau dinamica).
Destructorul este apelat automat la eliminarea unui obiect, la încheierea timpului de viata în cazul
static, sau la apelul unui delete în cazul dinamic.
Constructorul este apelat dupa alocarea memoriei necesare în faza finala a crearii obiectului, iar
destructorul înaintea eliberarii memoriei aferente (adica în faza distrugerii sale).
Caracteristicile constructorilor si destructorilor sunt:
– se definesc similar cu celelalte functii membre;
– numele lor coincide cu numele clasei din care fac parte;
– destructorii se disting de constructori prin faptul ca sunt precedati de simbolul ~
– nu pot returna nici un rezultat;
– nu se pot utiliza pointeri catre constructori sau destructori;
– constructorii pot avea parametri; un constructor fara parametri se mai numeste constructor
implicit;
– destructorii nu pot avea parametri.

65
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Daca o clasa nu dispune de constructori/destructori, compilatorul C++ genereaza automat un


constructor, respectiv un destructor implicit.
Exemplu:
Dune :: Dune ( )
// constructor implicit
{
x = 0;
y = 0;
}
Dune :: Dune (unsigned X, unsigned Y)
{
x = X;
y = Y;
}
Dune::~Dune( )
{
}
Pe de alta parte, mai înainte s-a mentionat ca una din caracteristicile claselor este încapsularea.
Aceasta caracteristica nu poate fi respectata întotdeauna. În acest sens exista în limbajul C++ un
concept de declarare a claselor ca fiind prietene. Acest concept desi încalca principiul de încapsulare
rezolva situatiile particulare. Se recomanda, totusi ca folosirea sa sa fie facuta cu prudenta.
Mecanismul friend (= prieten) a aparut datorita imposibilitatii ca o metoda sa fie membru a mai
multor clase.
Functiile prietene reprezinta functii care nu sunt metode ale unei clase, dar care au totusi acces la
membrii privati ai acesteia. Orice functie poate fi prietena unei clase, daca a fost astfel declarata,
indiferent de natura acesteia.
Sintaxa declararii unei functii prietene este:
friend Nume_functie
si nu are nici o importanta în cadrul carei sectiuni este declarata functia prietena.
Exemplu:
class Dune
{
friend unsigned long Traiectorie (unsigned x, unsigned y);
public:
friend unsigned long Arakis ::Traiectorie
(unsigned x, unsigned y);
...
}
unsigned long Traiectorie (unsigned x, unsigned y);
{
return x * y
unsigned long Arakis ::Traiectorie (unsigned x, unsigned y);
{
...

66
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

În afara de functii prietene, exista si clase prietene. Acestea sunt clase care au acces la membrii
privati ai altei clase declarata ca atare. Relatia de prietenie nu este tranzitiva iar proprietatea de prietenie
nu se mosteneste în clasele derivate.
Sintaxa de declarare a claselor prietene este:
friend class Nume Clasa Prietena

Exemplu:
class Alpha
{
...
};
class Beta
}
...
friend class Alpha;
};

67
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

10. Limbajul de programare Visual Basic

Elementele limbajului Visual Basic.


Caracteristici generale

Visual Basic a fost lansat în ultimul deceniu (dupa 1990) al secolului trecut de catre firma
Microsoft si reprezinta o varianta perfectionata a limbajului BASIC (Begiuner’s All-Purpose Symbolic
Instruction Code care în traducere libera este similar cu codul instructiunilor simbolice de uz general
pentru începatori).
Termenul „Visual” este legat de posibilitatea proiectarii unei interfete grafice cu utilizatorul
(GUI).
Versiuni simplificate sau derivate ale limbajului Visual Basic sunt Visual Basic for Applications
(VBA) si Visual Basic Scripting (VBScript) care sunt suporti de dezvoltare a multor aplicatii din
Windows sau MS Office. Principiile de programare si de dezvoltare sunt similare pentru întreaga
familie Visual Basic.
Caracteristicile generale ale limbajului Visual Basic sunt urmatoarele:
– este un mediu integrat de dezvoltare (IDE), deoarece integreaza functiile de proiectare,
editare text, compilare si depanare în cadrul unui mediu comun;
– este un limbaj interactiv, întrucât Visual Basic interpreteaza on-line fiecare cuvânt pe masura
ce este introdus de la tastatura, propunând si cuvinte-instructiuni existente în biblioteca proprie de
functii, recunoscând cuvinte-cheie si compilând partial codul. Cu ajutorul acestei facilitati multe erori
de redactare îsi diminueaza frecventa de aparitie;
– combina elemente de programare orientata pe obiecte cu elemente de programare orientata pe
evenimente;
– are capacitatea de a recunoaste si de a interactiona cu o paleta larga de fisiere de date sau
construite de sisteme de gestiune a bazelor de date (SGBD-uri) cum ar fi: Microsoft Access, dBase,
FoxPro si Visual Fox Pro, Paradox,
SQL Server etc;
– permite accesul la documente si aplicatii INTERNET sau INTRANET.
Mediul integrat de dezvoltare Visual Basic (IDE) contine urmatoarele elemente (fig. 10.1):
— Bara cu meniuri – contine elementele standard ale unei aplicatii Windows si anume File, Edit,
View, Windows, Help, precum si meniuri specifice programarii în Visual Basic (Project, Format,
Debug etc.);

68
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Bara cu meniuri
Bara cu instrumente
Cutia cu instrumente Fereastra Project Explorer

Fereastra Form Layout


Fereastra Form Designer Fereastra Properties

Figura 10.1. Forma standard la deschiderea unei noi aplicatii în Visual Basic.

— Toolbar (Bara cu instrumente) – permite accesul rapid bazat pe icon-uri la comenzile uzuale în
Windows (deschidere de fisier, salvare, tiparire, copiere etc.);
— Toolbox (Cutia cu instrumente) – contine un set de instrumente cu ajutorul carora se pot
configura controale pe formular;
— Meniuri contextuale – contin comenzi rapide pentru actiuni frecvente. Activarea lor se
realizeaza actionând click-dreapta pe mouse.
— Fereastra Object Explorer – afiseaza formularele, modulele si fisierele continute de proiectul
curent, precum si intercorelarea între aceste categorii;
— Fereastra Properties – afiseaza si permite configurarea rapida a proprietatilor pentru formularul
sau controlul selectat;
— Fereastra Form Designer – afiseaza un formular gol (planseta de lucru) pe care
utilizatorul/dezvoltatorul îl poate personaliza adaugând controale, etichete, imagini etc.;
— Fereastra Code Editor – este editorul de text în care se înscrie codul aplicativ pentru formular
sau pentru controalele inserate, gradul de subordonare, logica aplicatiei etc. (fig. 10.2);
— Fereastra Object Browser – afiseaza obiectele disponibile în proiect, precum si proprietatile,
metodele si evenimentele obiectului curent selectat (fig. 10.3).
Visual Basic are calitati de programare orientata spre obiecte îmbinate cu calitati de programare
pe evenimente bazate pe o interfata grafica usor de configurat.

69
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Figura 10.2. Fereastra Code Editor.

Figura 10.3. Object Browser.


Cu toate acestea Visual Basic nu este întru totul un limbaj de programare orientata spre obiecte
întrucât mostenirea claselor nu se realizeaza în mod complet, nu permite polimorfismul, ci este simulat.
Pe de-alta parte Visual Basic foloseste obiecte predefinite si, în plus, executia programului se realizeaza
prin subrutine, deci procedural.

70
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Faptul ca Visual Basic (VB) foloseste obiecte predefinite îngradeste întrucâtva creativitatea
programatorului, dar paleta larga de controale, elemente de grafica, imagini etc. suplinesc „micul”
neajuns mentionat mai sus.
Putem spune ca un obiect în Visual Basic dispune de:
– proprietati;
– metode;
– evenimente.
Proprietati
Proprietatile unui obiect VB descriu caracteristicile fizice si logice ale acestuia, cum ar fi:
– dimensiune;
– culoare;
– pozitie;
– numele obiectului;
– etc.
Aceste proprietati constituie atributele obiectului (fig. 8.4).
Modificarile proprietatilor se pot realiza fie în momentul proiectarii (în
fereastra Properties), fie în momentul executiei, prin modificari în cod
(program).
Atunci când programul este de dimensiuni mari si are o
multitudine de obiecte, variabile si/sau evenimente o notatie sugestiva
poate fi un ajutor de pret. Se recomanda, prin conventie, atribuirea
unor prefixe alcatuite din 2-4 caractere cu ajutorul carora se pot face
clasificari de obiecte, destinatii între acestea etc. Acest tip de alocare
de prefixe sugestive se mai numeste si „notatia maghiara”. În tabelul
10.1 sunt prezentate câteva categorii de prefixe des utilizate în
programarea în Visual Basic. Notatiile prezentate sunt o sugestie, o
conventie des utilizata de programatori, dar nu exclusiva, în sensul ca
pot fi create si alte prefixe daca programul o cere.

Figura10.4. Fereastra de
proprietati.

71
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Tabelul 10.1
OBIECT PREFIX EXEMPLU
Forma frm frm Initiala
Buton de comanda cmd, btn cmd Citeste
Eticheta lbl lbl Dorinta
Caset a de text txt txt Legenda
Meniu mnu mnu Meniu
Buton de optiune opt opt Tiparire
Caseta de validare chk chk Verificare
Caseta de imagine pic, img pic Peisaj
Caseta cu lista lst lst Candidati
Caseta cu lista combinata cbo cbo Grupe
Caseta cu lista fisierelor fil fil Fisiere
Cadru fra fra Cadru
Bara de derulare verticala vsb vsb Dimensiune
Bara de derulare orizontala osb osb Distanta

Sintaxa generala de declarare a unui obiect este:


Obiect.Proprietate = Variabila
Numele procedurilor, variabilelor si constantelor declarate în Visual Basic (prescurtat: VB)
trebuie sa respecte câteva reguli fara de care pot fi generate erori la compilare. Acestea sunt destinate
procedurilor Sub si Function, variabile, constante si orice alt parametru cu rol de obiect, si anume:
– trebuie sa înceapa cu o litera;
– nu pot contine simbolul punct în interiorul lor sau caractere declarative de tip (caractere speciale
care definesc un tip de data);
– nu pot fi mai lungi de 255 caractere. Controalele, formularele, clasele si modulele nu pot avea
nume mai lungi de 40 caractere;
– nu pot avea aceleasi nume cu cuvintele-cheie.
Exemple:
Nume: identificatorul obiectului respectiv;
Format: specifica formatul de afisare;
Status Bar: corespunde mesajului ce va fi afisat în bara de star e atunci când cursorul este
pozitionat pe caseta de text;
Visible: poate avea valoarea True sau False în cazul în care se doreste ca obiectul sa fie vizibil,
respectiv, invizibil;
Locked: poate interzice accesul la continutul controlului sau nu, prin marcarea true, respectiv,
false;
Scroll Bar: adauga bare de defilare;
Left, Top, Width, Height: precizeaza pozitia pe ecran în cadrul formei obiectului;
Font Color: precizeaza culoarea fonturilor;
Back Color: culoarea fundalului.

72
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Metode
Metodele au sintaxa generala:
[Object]. Metoda [lista-parametri]
În momentul redactarii metodei VB activeaza sistemul de asistenta care ofera portofoliul de
metode existente în biblioteca de obiecte (Object Browser).
Pentru a afisa biblioteca de obiecte se selecteaza din meniul View comanda Object Browser.
Exemplu:
Private Sub Form_Load( )
Command 1. Caption = „OK”
Command 1. Visible = True
Command 1. Top = 2000
Command 1. Left = 5000
Command 1. Enabled = True
End Sub

În exemplul de mai sus asupra obiectului Command 1 s-au aplicat o serie de metode însotite de
parametrii de descriere.

Evenimente
Un eveniment este raspunsul unui obiect la o actiune a utilizatorului sau la o actiune a
programului.
Pentru un eveniment sau mai precis pentru producerea sa trebuie scrise linii de program.
Visual Basic pune la dispozitia utilizatorului informatii despre proprietatile, metodele si
evenimentele obiectelor prin intermediul bibliotecii de obiecte.
Pentru a obtine informatii despre evenimentele unui anumit obiect, se selecteaza obiectul
respectiv din cadrul listei Classes si apoi se selecteaza evenimentul din partea dreapta a ferestrei
bibliotecii de obiecte.
În fereastra de editare a codului este afisat un sablon pentru procedura eveniment.

Etapele proiectarii unei aplicatii în Visual Basic

Proiectarea unei aplicatii în Visual Basic cuprinde urmatoarele etape:


1. Definirea aplicatiei de rezolvat;
2. Proiectarea interfetei grafice cu utilizatorul;
3. Stabilirea proprietatilor;
4. Scrierea codului (liniilor de program);
5. Rularea aplicatiei;
6. Salvarea proiectului.

73
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Proiectarea interfetei cu utilizatorul


În Visual Basic, interfata cu utilizatorul este alcatuita din:
– formulare (forms);
– obiecte (objects).
— Formulare
Formularul este principalul element al interfetei grafice cu utilizatorul. Un formular reprezinta o
zona rectangulara pe care se pot amplasa obiectele. Pe ecran pot aparea una sau mai multe forme (fig.
10.5).
Exista doua stiluri de interfete:
– interfata tip document sin-gular (SDI – Singular
Document Interface)
– interfata tip document multiplu (MDI –Multiple
Document Interface)
Formularele contin obiecte numite comenzi sau
controale (controls).
Încarcarea se face prin apelare din meniul File a
comenzii New Project, ocazie cu care apare în mod
automat un formular general. Figura 10.5. Formular în Visual Basic.
De asemenea, din meniul File se selecteaza New
Form sau executând click pe bara de instrumente la New Form.
Atribuirea de proprietati
Proprietatile unui formular definesc caracteristicile fizice ale acestuia:
— Caption – stabileste textul care va fi afisat în bara de titlu a formularului;
— Icon – stabileste pictograma care va fi afisata atunci când formularul va fi minimizat;
— Maxbutton si Minbutton – arata daca formularul poate fi maximizat, respectiv minimizat;
— BorderStyle – controleaza comportamentul formularului la redimen-sionare;
— Height (înaltime) si Width (latime) – dau dimensiunile formularului;
— Left (stânga) si Top (sus) determina dispunerea formularului relativ la coltul din stânga-sus al
ecranului;
— WindowState (starea ferestrei) poate fi stabilita astfel încât, la pornire, formularul sa apara în
forma Maximed (maximizata), Minimized (minimizata) sau Normal (normala);
— Name – atribuie un nume formularului, nume prin care acesta va fi apelat în cadrul codului
Visual Basic.
Observatie. Daca progr amatorul nu atribuie un nume, formularul va primi valoarea initiala Form
1, Form 2 etc.
Pentru fiecare formular dintr-o aplicatie, exista un modul formular asociat (cu extensia .frm) care
contine programul (codul ) sau.
Fiecare modul formular cuprinde proceduri eveniment. Acestea sunt sectiuni de program în care
pot fi inserate instructiuni care se vor executa ca raspuns la evenimentele specificate.
Formularele pot contine controale, pentru care se redacteaza proceduri în cadrul modului
formular.

74
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

În afara de procedurile eveniment, modulele formular contin si proceduri generale valabile pentru
modulul formular în întreg ansamblul sau.
Codul care nu este legat de un anumit formular sau control, dar poate fi inserat în codul general,
se mai numeste modul standard si are terminatia .bas. Acesta contine doar linii de program.
Un modul clasa are terminatia .cls, contine linii de program si date si defi-neste o clasa.
Indiferent de tip, modulele pot contine urmatoarele:
– declaratii – în care pot fi declaratii de constante, de tipuri, de variabile si de proceduri DLL
(dynamic - link library – biblioteca de legaturi dinamice);
– proceduri – acestea pot fi de tipul Sub (echivalentul subprogramelor), Function (functie) sau
Property (proprietati ale obiectului).
Comentar iile în Visual Basic au un rol similar cu al celor descrise în capitolul anterior, de
informare si de furnizare de documentatie în interiorul codului. Comentariile se marcheaza cu un
apostrof la începutul liniei ca în exemplele de mai jos. Pozitia lor poate fi chiar pe o linie de program,
dar este recomandabil ca plasarea lor sa se faca pe o linie noua.
Exemple de comentarii:
’Acest program este destinat
’unor activitati complexe
sau
Tex1. Text = ”Salut!” ’Aici se marcheaza
’ un raspuns
Un comentariu nu poate sta dupa un caracter de continuare a liniei de program, pe acelasi rând.
În mod curent Visual Basic opereaza cu numere zecimale pe care le compileaza ulterior în
sistemul de numeratie binar. Exista, însa, si cazuri în care este necesar a se realiza o aplicatie care
utilizeaza baze de numeratie octale sau hexazecimale. Simbolizarea acestora în Visual Basic se face ca
în exemplul ilustrat în tabelul 10.2.

Tabelul 10.2
Zecimal Octal (&O) Hexazecimal (& H)
16 & 020 & H 10
255 & 0377 & HFF

Controale

Obiectele (Objects) sunt elemente care apar într-un formular sub forma:
– butoane de comanda;
– butoane de optiune;
– casete de dialog;
– casete de validare;
– bare de derulare;
– etc.
În Visual Basic, obiectele se mai numesc controale (controls) sau comenzi.

75
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Un control are: Un control dispune de:


– forma; – proprietati;
– dimensiune; – metode;
– culoare – evenimente.
– text;
– eticheta;
Visual Basic permite sa scrie cod (linii de programe) pentru proprietatile, metodele si
evenimentele unui control.
Proprietatile unui control descriu controlul respectiv (dimensiune, culoare).
Metodele unui control permit efectuarea unor actiuni asupra controlului, cum ar fi pozitionarea si
redimensionarea.
Evenimentele unui control permit scrierea codului pentru a raspunde la o actiune (ex. click cu
mouse-ul sau apasarea unei taste).
Proprietati. Odata plasat pe un formular, unui control i se pot modifica proprietatile, i se pot
apela metodele si se poate scrie cod (program) pentru evenimentele sale.
Proprietatile unui control pot fi modificate atât în momentul proiectarii, cât si în momentul
executiei. Modificarile se pot face prin cod sau prin fereastra de proprietati.
Metode. Fiecare control ofera cel putin o metoda. O metoda este o actiune pe care programul o
poate efectua asupra controlului.
Sintaxa de apelare la metoda este:
obiect. metoda
Pentru a afla informatii despre metodele unui control se poate utiliza sistemul de asistenta din
Visual Basic (Help) sau se poate apela la biblioteca de obiecte (Object Browser) din Visual Basic,
selectând comanda Object Browser din meniul View.
Visual Basic va afisa biblioteca de obiecte, adica proprietatile, metodele si evenimentele unui
control. La selectarea unuia dintre obiecte, în partea de jos a ecranului, Visual Basic afiseaza o scurta
descriere privind proprietatile obiectului sau posibilitatile de conectare în program etc.
Evenimente. Pe lânga proprietati si metode, majoritatea controalelor au cel putin un eveniment.
Pentru un element se poate scrie cod (linii de program).
Pentru a afla informatii despre evenimentele unui control se poate folosi sistemul de asistenta sau
biblioteca de obiecte.
Controale de tip buton
Visual Basic permite crearea a doua tipuri de controale de tip buton:
– butoane de comanda (Command Button );
– butoane imagine (Image Button).

Controale pentru butoane de comanda

Procedura apelata este procedura eveniment Click . Utilizarea butonului de comanda se face
pentru a începe, întrerupe sau a sfârsi un proces.
Pentru a adauga butoane de comanda pe un formular se parcurg etapele:

76
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

1. Se executa click pe pictograma pentru butoane de comanda din caseta cu instrumente de lucru;
2. Se deplaseaza cursorul pe locul din formular în care se doreste dese-narea butonului de
comanda. Se afiseaza initial eticheta implicita command 1, care poate fi modificata ca denumire din
fereastra Properties la rubrica Caption.
— Proprietatea Caption poate avea maximum 255 de
caractere.
— Caption poate fi folosita pentru a crea taste de
comenzi rapide pentru butoanele de comanda, prin adaugarea
unui caracter ampersand (&) înaintea literei care se doreste
utilizata drept tasta de acces.
În momentul executiei, prima litera a butonului de
comanda va fi subliniata iar comanda poate fi apelata prin Tastare Alt+S
tastarea simultana a tastelor (fig. 10.6):
Alt + tasta literei subliniate.

Pentru fiecare formular se recomanda a se proiecta:


— un buton implicit de comanda (ENTER) prin
atribuirea valorii True proprietatii Default;
Figura 10.6. Posibilitatea obtinerii de
— un buton implicit de anulare al formularului (END) comenzi rapide.
pentru care se atribuie valoarea True proprietatii CANCEL.
Când un buton de comanda este activat, proprietatea sa Value are valoarea True, evenimentul
Click al butonului este declansat si este apelat codul scris pentru procedura eveniment Click .
Un buton de comanda poate fi perfectionat modificând proprietatea Style alegând între optiunile 0
– Standard si 1 – Graphical si folosind apoi proprietatile Picture, Down Picture si Disabled Picture.
În acest fel butonului de comanda i se poate adauga o pictograma sau un bitmap. De asemenea,
imaginea se poate modifica în functie de „starea” butonului „respectiv ne-apasat – apasat.

Controale care afiseaza imagini si grafica

Visual Basic contine patru controale care afiseaza imagini si grafica:


— controlul imagine;
— controlul forma;
— controlul linie;
— controlul caseta cu imagini.

Controlul imagine (Image)


Controlul imagine este folosit pentru a afisa pictograme în formate: pictograma, bitmap, metafile,
metafile îmbunatatit, .JPEG sau .GIF.
Controlul imagine raspunde la evenimentul Click si poate fi folosit pe post de buton de comanda
sau la crearea unei bare de instrumente sau pentru crearea de animatii simple.
O imagine poate fi comprimata astfel încât sa înceapa într-un control imagine.
Imaginile pot fi încarcate în controlul imagine:

77
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

— în momentul proiectarii, atribuind proprietatii Picture din cadrul ferestrei de proprietati a


controlului un nume de fisier si o cale;
— în momentul executiei proprietatii Picture si a functiei Load Picture.
La încarcarea imaginii în controlul imagine, aceasta se redimensioneaza automat pentru a putea
încapea în dimensiunile alocate controlului imagine, în functie de versiunea Visual Basic folosita.

Controlul forma (Shape)


Controlul forma se foloseste la desemnarea unor formate grafice predefinite pe suprafata
formularului si nu au alt rol decât de decorativitate, deci nu au atasat nici un eveniment. Formele grafice
pot fi:
– dreptunghi; – cerc;
– patrat; – dreptunghi cu colturi rotunjite;
– oval; – patrat cu colturi rotunjite etc.
Pentru fiecare forma desenata pe formular se poate stabili:
– stilul;
– culoarea; prin atribuirea urmatoarelor
proprietati:
– stilul de umplere si de linie;
– stilul si culoarea chenarului.
— FillStyle si BackStyle ofera diferite stiluri de umplere predefinita (solid, transparent, linie
orizontala, linie verticala, diagonala în sus, diagonala în jos, cruce si cruce diagonala);
— BorderStyle are stiluri predefinite privind linia de chenar si anume: transparent, solid, linie,
punct, linie-punct, linie-punct-punct si plin;
— BorderColor, BackColor si FillColor permit stabilirea culorilor de chenar si de umplere din
paleta de culori;
— Height si Width stabilesc dimensiunile formei.
Proprietatile BorderStyle, BorderWidth, FillStyle si DrawMode controleaza modul de desenare
a formei.

Controlul linie (Line)


Controlul linie, ca si controlul forma, are rol decorativ, având o functionalitate limitata (afisare si
tiparire). Pot fi controlate pozitia, lungimea, culoarea si stilul liniei cu ajutorul proprietatilor
BorderStyle.

Controlul caseta cu imagine (Picture Box)


Comportamentul casetelor cu imagine este asemanator cu controlul imagine, având în plus si
capacitatea de a actiona ca un container pentru celelalte controale si compatibilitatea cu metodele
grafic e.
Cea mai obisnuita utilizare a unui container de tip caseta cu imagine este o bara cu instrumente
sau o bara de stare.

78
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Caseta cu imagine poate fi afisata în orice margine a formularului, atribuind proprietati Align
(aliniere) valorile Top (sus), Bottom (jos), Left (stânga) sau Right (dreapta), în momentul proiectarii.

Controale pentru afisarea si introducerea textului

Pentru afisarea si introducerea textului, Visual Basic ofera doua tipuri de controale:
– controale eticheta;
– controale caseta cu text.
— Controale eticheta
Un control eticheta afiseaza text care poate fi doar citit, nu si modificat, în mod direct, de catre
utilizator.
Textul afisat într-o eticheta este controlat:
– în momentul proiectarii, atribuind o valoare proprietatii Caption din fereastra de proprietati a
controlului; lungimea proprietatii Caption este de 1024 octeti;
– în momentul executiei prin cod (linii de program).
Controlul eticheta este folosit pentru:
– a identifica obiectele unui formular;
– a afisa informatii ca raspuns la un eveniment sau proces din aplicatie, în momentul executiei;
– a identifica controale care nu au proprietati Caption proprie, cum ar fi caseta cu text, casete
lista, casete combinate etc.)
– a adauga un text descriptiv la formular;
– la crearea tastelor de acces pentru celelalte controale.
Atribuirea valorii 1 proprietati BorderStyle creeaza un chenar în jurul etichetei.
De asemenea, fondul etichetei, nuanta caracterelor, dimensiunea si tipul fontului pot fi selectate
din proprietatile BackColor, BackStyile, ForeColor si Font.
Eticheta poate fi auto-dimensionata cu ajutorul proprietatilor AutoSize si AutoWrap prin
alocarea valorii True.
De asemenea, prin Alignament, se poate face alinierea textului la stânga, centrat sau la dreapta
prin selectarea optiunilor Left Justify – 0, Center – 1, Right Justify – 2.
— Controale caseta cu text (Text Box)
Controlul Text Box afiseaza text introdus de utilizator.
Textul este controlat de proprietatea Text si i se poate atribui o valoare:
– în momentul proiectarii prin proprietatea Text din fereastra de proprietati a controlului;
– în momentul executiei prin cod;
– de catre utilizator, în momentul executiei.
În mod implicit, textul introdus în caseta de text poate avea maximum 2048 caractere.
Textul dintr-o caseta poate fi modificat (cu exceptia cazului când se atribuie valoarea True
proprietatii Locked), afisat pe mai multe linii, adaptat la dimensiunile controlului si formatat.
Aspectul si comportarea unei casete cu text sunt controlate de proprietatile:
Multiline si ScrollBars în momentul proiectarii.
Un control caseta cu text afiseaza, în mod implicit, o singura linie de text si nu poseda bare de
derulare.

79
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Atribuind valoarea True proprietatii Multiline, o caseta cu text afiseaza mai multe linii de text în
momentul executiei, putându-se introduce maximum 32 kiloocteti cu text.
Trecerea de pe o linie pe alta a cuvintelor întregi este executata de proprietatea de împachetare a
textului WordWrap (pe care o întâlnim la majoritatea procesoarelor de texte).

Controale care prezinta optiuni pentru utilizator

Exista, de asemenea, mai multe controale standard, cum ar fi:


— caseta de validare (Check Box);
— controlul buton de optiune (Option Button);
— controlul caseta cu lista (ListBox);
— controlul caseta combinata (Combo Box).
— Caseta de validare (Check Box)
Controlul Caseta de validare îi permite utilizatorului sa aleaga una sau mai multe optiuni si
afiseaza un marcaj de validare când este selectat (fig. 10.7).

Figura 10.7. Utilizarea casetelor de validare Figura 10.8. Utilizarea butoanelor de optiune.
(Check Box).

O caseta de validare arata daca o conditie este îndeplinita sau nu, oferind utilizatorului optiuni de
tipul DA/NU, ADEVARAT/FALS.
Întrucât casetele de validare sunt independente unele de altele, utilizatorul poate selecta oricâte
casete la un moment dat.
Arareori apare o singura caseta de validare. Cel mai adesea, ele sunt grupate pentru a afisa optiuni
multiple, dintre care utilizatorul poate selecta una sau mai multe.
Starea controlului caseta de validare este controlata de proprietatea Value: invalidat (0 –
unchecked); validat (1 – checked); indisponibil (2 – Grayed).
Implicit, controlul caseta de validare este în starea invalidat. La executie, utilizatorul poate
executa click pe controlul caseta de validare pentru a indica starea de validat sau invalidat.
— Controlul buton de optiune (Option Button)
Butoanele de optiune sunt folosite pentru a afisa optiuni, dintre care utilizatorul poate alege una
singura (fig. 10.8).
Butoanele de optiune trebuie sa faca parte dintr-un grup, selectarea unui buton de optiune
invalidându-le pe toate celelalte butoane din grup.

80
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Pentru a crea grupuri suplimentare de optiune într-un cadru sau într-o caseta de imagine, trebuie
desenate întâi si abia apoi introduse butoanele de optiune în interiorul acestora. Aceasta permite
selectarea si mutarea concomitenta a cadrului sau a casetei cu imagini odata cu controalele.
Un buton de optiune poate fi selectat în momentul executiei:
– executând click cu mouse-ul pe el;
– folosind tasta TAB pentru a selecta un grup de butoane de optiune si apoi folosind tastele cu
sageti pentru a selecta un buton din grup;
– creând o tasta de comanda rapida în titlul butonului apelabila prin ALT + prima litera a textului
butonului.
— Controlul caseta cu lista (ListBox)
O caseta cu lista (ListBox) afiseaza pe verticala o lista de optiuni din care utilizatorul alege una
sau mai multe.
Daca numarul optiunilor depaseste capacitatea de afisare a casetei cu lista, acesteia i se asociaza
automat bare de derulare care permit derularea pe verticala si pe orizontala.
— Controlul caseta combinata (Combo Box)
Combo Box ofera utilizatorului o lista de optiuni reunind caracteristicile unei casete cu text cu
cele ale unei casete cu lista.
Daca numarul elementelor din lista depaseste capacitatea de afisare a casetei combinate, Visual
Basic adauga automat bare de derulare verticala si orizontala.
Exista trei stiluri de caseta combinata gestionata de valorile proprietatii Style:
– caseta combinata derulanta (0 – DropDown Combo) – este stilul implicit. Utilizatorul poate
introduce textul direct sau poate executa click pe sageata din dreapta casetei combinate pentru a
deschide lista de optiuni (sau apasând ALT + ↓).
Selectar ea uneia dintre optiuni are ca efect inserarea acesteia în zona cu text din partea superioara
a casetei combinate.
– caseta combinata simpla (1 – Simple Combo) este o caseta în care lista de optiuni este
întotdeauna vizibila. Bara de derulare verticala este adaugata în mod automat, daca este cazul. Putem
introduce text direct.
– caseta cu lista derulanta (2 – DropDown List) – afiseaza o lista de optiuni în momentul în
care, utilizatorul executa click pe sageata din dreapta casetei. Nu putem introduce text direct.
— Controale bara de derulare orizontala si verticala (ScrollBar)
Controalele bara de derulare orizontala (HscrollBar) si bara de derulare verticala (VscrollBar)
functioneaza independent de alte controale si au propriul set de evenimente, proprietati si metode.
— Evenimentele utilizate de controalele bara de derulare sunt:
— Change, care survine dupa miscarea unei casete de derulare de-a lungul barei de derulare;
— Scroll, care ofera acces la valoarea barei de derulare pe masura ce este miscata.
— Proprietatile controalelor bara de derulare sunt:
— Value, indica pozitia casetei de derulare în cadrul barei de derulare printr-o valoare întreaga
(valoarea implicita este zero). Programatorul stabileste valoarea (Min) si valoarea (Max) a barei de
derulare, iar valoarea care indica pozitia casetei de derulare trebuie sa fie întotdeauna între Min si Max;

81
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

— Large Change si Small Change determina viteza de derulare prin click chiar pe bara sau pe
sagetile de derulare.

Scrierea codului (liniilor de program)

Codul Visual Basic consta din instructiuni ale limbajului, constante si declaratii.
Codul Visual Basic este stocat în trei tipuri de module:
– module formular, cu extensia .FRM, contin descrieri textuale ale formularului si controalelor
sale, inclusiv valorile atribuite proprietatilor, proceduri care trateaza evenimentele acelui formular,
proceduri generale si declaratii de variabile, constante, tipuri la nivelul modulului;
– module standard, cu extensia .BAS, sunt containere pentru proceduri si declaratii folosite în
comun de alte module din cadrul aplicatiei;
– module clasa, cu extensia .CLS, sunt fundamentele programarii orientate pe obiecte din Visual
Basic, asemanatoare cu modulele formular, cu deosebirea ca nu poseda o interfata vizibila cu
utilizatorul. Modulele clasa pot fi folosite pentru crearea de obiecte noi, inclusiv codul pentru metode si
proprietati.
Fiecare modul contine doua parti:
– declaratii de variabile, constante, tipuri, proceduri la nivelul întregului modul;
– proceduri. O procedura contine portiuni de cod (program) care poate fi executat ca un tot unitar.
Pentru scrierea codului de program asociat unui obiect din proiect se apeleaza la fereastra
editorului de Cod (Code Editor) din Visual Basic.
Pentru a deschide fereastra Code Editor se executa dublu-click pe formularul sau controlul
respectiv, sau din fereastra Project Explorer se alege numele formularului sau modulului si apoi se
selecteaza View Code .
Cantitatea de cod care poate fi încarcata într-un formular, într-o clasa sau într-un modul standard,
nu poate depasi 65 534 de linii.
O singura linie de cod poate fi alcatuita din cel mult 1023 octeti.
Liniile de cod prea lungi se pot continua pe rândul urmator cu ajutorul liniutei de subliniere –
underline ( _ ).
Într-o singura linie de cod nu pot fi introduse mai mult de 25 de caractere underline ( _ ) (de
continuare).
Textul propriu-zis al unei linii poate fi precedat de pâna la 256 de caractere de spatiu.
Un comentariu trebuie precedat de simbolul apostrof (’).
Comentariul poate succede unei instructiuni aflate pe acelasi rând sau poate ocupa tot rândul.
Daca pe un rând se doreste a se plasa doua sau mai multe instructiuni, acestea se vor separa prin
caracterul doua puncte (:).
Visual Basic ofera doua facilitati de completare automata a codului: AutoList Members si
AutoQuickInfo care sunt accesibile pentru activare sau dezactivare, prin comanda Options din meniul
Tools.

82
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Elementele limbajului Visual Basic

Variabile Visual Basic

Asa cum s-a aratat si în capitolele anterioare, o variabila reprezinta o locatie din memoria interna
a calculatorului, utilizata pentru stocarea temporara a datelor.
O variabila se caracterizeaza prin urmatoarele atribute:
– nume;
– tip de date;
– domeniu.
Numele identifica în mod unic o variabila printre celelalte variabile existente la un moment dat în
memorie.
Numele unei variabile trebuie sa respecte urmatoarele reguli:
– sa înceapa cu o litera;
– sa contina numai litere, cifre si caracterul subliniere;
– sa contina cel mult 256 caractere;
– sa nu coincida cu cuvinte rezervate ale limbajului Visual Basic (precum Sub sau Function etc.)
În tabelul 10.3 se prezinta mai multe tipuri de variabile în Visual Basic.
Tabelul 10.3
DIMENSIUNE
TIP (nume) SUFIX DOMENIU
ÎN MEMORIE
Byte fara 1 octet 0 – 255 caractere
True/False; Da/Nu;
Boolean fara 2 octeti
Pornit/Oprit
Integer % 2 octeti – 32.768 pâna la 32.767
– 2.147.483.648 pâna la
Long (Integer) & 4 octeti
+ 2.147.483.647
Single (Precision) ! 4 octeti – 3.40E38 si 3.40E38
Double (Precision) # 8 octeti – 1.80E308 si 1.80E308
Currency @ 8 octeti – 9.22E14 si 9.22E14
între 1 Ian. 0000 si 31 Dec.
Date fara 8 octeti
9999
Object fara 4 octeti Adresa oricarui obiect

Tipul implicit pentru orice variabila Visual Basic este de tipul Variant (nedefinit).
Tipul Variant este un tip special de date care poate contine date numerice, siruri de caractere si
date calendaristice precum si valorile speciale Empty si Null.
Empty este o valoare speciala care indica faptul ca o variabila nu a fost initializata si este egala cu
zero când se refera la valori numerice sau are lungime nula când se refera la siruri de caractere.
Null este o valoare speciala care indica faptul ca o variabila nu contine nici o data valida, în mod
deliberat.
Tipul de date Variant poate fi folosit în locul oricarui tip fundamental de date.

83
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Declararea variabilelor

Sintaxa generala a declararii variabilelor în Visual Basic este:


Dim nume_variabila [As tip]
Variabilele declarate prin Dim în cadrul unei proceduri exista atâta timp cât aceasta se executa,
dupa care valorile acestora dispar, ceea ce confera un caracter de alocare dinamica a memoriei.
Valorile declarate prin Dim au caracter local acelei proceduri, nefiind permis accesul la ele din
cadrul altor proceduri, aceasta fiind un element tipic al programar ii orientate spre obiecte. Aceeasi
variabila poate lua denumiri diferite în proceduri diferite fara ca prin aceasta sa apara conflicte de
procesare.
Daca însa, o variabila este declarata în sectiunea Declarations a unui modul formular, modul
standard sau modul clasa ea va fi vizibila si comuna pentru toate procedurile din modul. În acest caz, nu
mai sunt permise redenumiri ale acestor variabile în interiorul procedurilor.
Daca o variabila este declarata prin cuvântul-cheie Public va fi vizibila pentru întreaga aplicatie.
De asemenea, daca o variabila este denumita Static valoarea acesteia nu se va mai pierde dupa
încheierea procedurii.
Spre deosebire de limbajele analizate anterior a caror structura avea doua sectiuni principale, cea
declarativa si corpul programului, în Visual Basic exista posibilitatea declararii implicite a variabilelor
chiar în corpul programului. Cu toate acestea recomandam evitarea acestei facilitati, fie si doar pentru
eleganta programarii, dar si pentru usurinta post-depanarii în cazul aparitiei erorilor la rularea aplicatiei.
O mare atentie trebuie acordata denumirii variabilelor private sau publice, al caror nume trebuie
sa nu coincida cu numele procedurilor, functiilor sau cuvintelor-cheie. Pentru aceasta, putem spune ca
notatia maghiara are un rol salvator si o recomandam a fi utilizata în toate cazurile.
O variabila poate apela si un obiect. Metodologia de declarare are doua etape, si anume:
– declararea variabilei ca apartinând categoriei clasa:
Dim variabila As clasa
– asocierea unui obiect:
Set variabila = obiect
Sintaxa generala va fi deci:
{Dim|Redim|Static|Private|Public} variabila As [New] clasa
Cuvântul cheie New este folosit pentru a genera un nou obiect, definit de clasa sa, instantiind
formulare, clase definite în modulele clasa si colectii.
Pentru a utiliza o variabila de un anumit tip, ea trebuie declarata cu una din instructiunile:
Private, Public, Dim sau Static utilizând sintaxa:
Instructiune NumeVariabila As Tip Data
Exemplu:
Dim Popescu As String
Pentru a crea o variabila, Visual Basic ofera doua posibilitati:
– prin utilizarea operatorului de atribuire;
– declarând variabilele cu comanda Dim.

84
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Operatorul de atribuire asigneaza (atribuie) o valoare unei variabile utilizând sintaxa:


NumeVariabila = Valoare
Exemplu:
Vârsta = 1
Nume = „Ion Popescu”

Tipul de date String (sir de caractere) contine siruri de caractere de lungime variabila.
Programatorul poate declara siruri de lungime fixa utilizând sintaxa:
String ∗ dimensiune
— Daca o variabila String de lungime fixa primeste ca valoare un sir de caractere cu o lungime
mai mica decât cea declarata, acesta este completat la dreapta cu caracterul spatiu pâna se ajunge la
dimensiunea declarata a variabilei.
— Daca variabila String primeste ca valoare un sir mai lung decât lungimea dec larata a variabilei,
Visual Basic trunchiaza sirul.

Matrice de variabile

Matricea permite apelarea unei serii de variabile care au acelasi nume si care folosesc un index
spre a le deosebi unele de altele.
Toate elementele dintr-o matrice au acelas i tip de date iar matricele au limite inferioare si limite
superioare.
În Visual Basic exista doua tipuri de matrice de variabile:
– matrice de dimensiune fixa, care ramâne mereu atribuita prin declaratiile initiale la aceeasi
dimensiune;
– matrice dinamice a caror dimensiune se poate modifica în timpul executiei programului.
Dupa locul în care este declarata, o matrice de dimensiune fixa poate fi:
– matrice publica daca este declarata în sectiunea Declarations a unui modul cu instructiunea
Public;
– matrice privata daca este declarata Private în sectiunea Declarations;
– matrice locala declarata Private în sectiunea Declarations.
Exemple:
Dim Matrice (18)As Double
Public Tablou (20) As Integr
Private Sir (7) As Double
sau cu index declarat de forma:
Dim Matrice (1 To 19) as Double
Public Tablou (20 To 40) As Integer
Private Sir (100 To 107) As Double
Pot fi si situatii în care o matrice de tip Variant sa contina doua sau mai multe matrice cu diverse
tipuri de date, cum este în exemplul urmator.
Exemplu:
Private Sub Command 1_Click( )
Dim intI As Integer
’Declara variabila contur

85
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

’Declara o matrice de întreg


Dim Tablou (8) As Double
For intI = 0 To 7
Tablou (intI) = 5
Next intI
’Declara si populeaza o matrice de siruri de caractere
Dim Legatura (8) As String
For intI = 0 To 7
Legatura (intI) = ”Salutare”
Dim Arata As Variant
’Declara o noua matrice cu doi membri
Arata (1) = Tabloul( )
’Populeaza matricea cu celelalte matrice
Arata (2) = Legatura( )
MsgBox Arata (1)(2)
’Afiseaza cate un membru din fiecare matrice
MsgBox Arata (2)(3)
End Sub

Un caz aparte îl reprezinta matricele dinamice. Aceasta situatie apare atunci când nu se cunosc cu
precizie dimensiunile acesteia, iar Visual Basic ofera facilitatea de a redimensiona în orice moment,
utilizând dinamic memoria. Tipul datelor continute de o matrice dinamica este similar cu al matricelor
de variabile.
Declararea are forma implicita iar pe parcursul codului este obligatorie inversarea instructiunii
executabile ReDim.
Exemplu:
Dim Matrice As Integer
Sub Calculeaza( )
.......
ReDim Matrice (20, 40)
End Sub
Dupa executia procedurii/aplicatiei matricea dinamica se goleste de date, eliberând memoria.
Visual Basic initializeaza valorile astfel:
– Empty (pentru matrice Variant);
– 0 (zero, pentru matrice numerice);
– siruri de caractere de lungime nula (pentru matrice sir de caractere);
– Nothing (pentru matrice de obiecte).
Matricea dinamica poate fi redimensionata fara a se pierde datele daca este utilizat cuvântul-cheie
Preserve, care modifica limita superioara a unei matrice multidimensionale:
ReDim Preserve Matrice (UBound (Matrice) + 1)

Matrice multidimensionale
Sintaxa de declarare:
Static M1(5,6) As Double
declara o matrice cu doua dimensiuni 6 × 7 în cadrul unei proceduri.
Matricele dinamice se declara Public, Static sau Dim si i se da lista dimensiunilor vida:

86
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Dim Matrice 1 ( )
Matricei dinamice declarate i se poate aloca numarul efectiv de elemente cu instructiunea ReDim:
Re Dim Matrice (x, y)

Tipuri de date definite de utilizator (user defined)

Programatorul poate defini propriile tipuri de date utilizând oricare tip fundamental de date din
Visual Basic prin declaratii de tip TYPE/END TYPE cu sintaxa:
TYPE tip-nou
Var-1 As tip-1
Var-2 As tip-2
..............
END TYPE
Exemplu:
a) se defineste tipul de date:
Type STUDENT
Marca As Integer
Nume As String ∗ 15
Prenume As String ∗ 10
Facultate As String
Grupa As String
End Type
b) Se declara cu Dim o variabila de acest tip:
Dim Stud As Student
c) Se atribuie valori noii variabile:
Stud. Marca = InputBox (”Tastati marca:”)
Stud. Nume = InputBox (”Tastati numele:”)
Stud. Prenume = InputBox (”Tastati prenumele:”)
Stud. Facultate = InputBox (”Tastati facultatea:”)
Stud. Grupa = InputBox (”Tastati grupa:”)
O metoda de programare mai buna este aceea de a declara variabilele folosind comanda Dim, cu
sintaxa:
Dim NumeVariabila 1, NumeVariabila 2…
Exemplu:
SubForm1_Load ( )
Dim Varsta, Nume
Varsta = 18
Nume = ”Popescu Ion”
End Sub
Tipul de date al unei variabile se poate declara în mod implicit sau explicit.
Pentru a declara în mod implicit tipul unei variabile se ataseaza numelui acesteia un caracter de
declarare a tipului de date la prima utilizare a variabilei.
Exemplu: Vârsta % = 18
Caracterul ”%” utilizat arata ca variabila „Vârsta” este de tip Integer (întreg).

87
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Daca ultimul caracter din numele unei variabile nu este un caracter de declarare a tipului %, &, !,
#, @, $ – tipul implicit este Variant (nedefinit).
Declararea explicita a tipului de date al variabilelor se realizeaza utilizând instructiunea Dim la
începutul unei proceduri cu sintaxa
Dim Nume Variabila As Tip Data
Exemplu:
Dim Varsta As Integer
Dim Nume As String
Daca se doreste limitarea sirului la care se poate limita o variabila se utilizeaza sintaxa:
Dim Nume Variabila As String ∗ Lungimea
Exemplu:
Dim Nume As String ∗ 10

Domeniul variabilei

Domeniul unei variabile defineste zonele din program în care variabila este vizibila, precum si
modul în care Visual Basic are acces la o variabila în cadrul unui program.
Domeniul unei variabile poate fi fixat:
– la nivelul unei proceduri;
– la nivelul unui modul;
– la nivelul tuturor modulelor.
În functie de nivelul la care este fixat domeniul, variabilele pot fi:
– locale;
– private;
– publice (globale).
Exemple: Definirea unei variabile locale:
Dim Albastru As Integer
Static Roz As Integer
Diferenta dintre Dim si Static este legata de durata lor de viata; astfel Dim se refera la perioada
cât se executa procedura, în timp ce Static defineste o variabila permanenta ori de câte ori se executa
procedura. Ambele declaratii sunt valabile numai în cadrul procedurii în care au fost declarate.
Variabilele locale sunt o alegere potrivita pentru calcule temporare.
Definirea unei variabile private: se face cu sintaxa:
Private int_X1 As Integer
Variabilele private (sau variabile de modul) sunt declarate la nivelul unui modul si sunt
disponibile pentru toate procedurile din cadrul aceluiasi modul.
Variabilele publice (sau globale) au cel mai vast domeniu de vizibilitate; ele sunt disponibile
pentru toate modulele, procedurile sau pentru fiecare linie de cod din aplicatie.
Sintaxa pentru aceste variabile este:
Public int_X1 As Integer
Pentru a evita erorile de programare, se recomanda sa se dea variabilelor nume distincte.

88
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Constante Visual Basic

Constantele pot fi:


– intrinseci sau definite de sistem, proprii limbajului Visual Basic si enumerate în cadrul
bibliotecilor de obiecte Visual Basic (VB) si Visual Basic for Application (VBA) din cadrul utilitarului
Object Browser.
– simbolice sau definite de utilizator declarate prin instructiunea Const. Sintaxa de declarare este:
[Public|Private]Const nume-constanta-expresie
unde:
nume-constanta – este un nume simbolic valid (care respecta aceleasi reguli ca pentru formarea
numelui variabilelor);
expresie – reprezinta o expresie compusa din constante numerice, siruri de caractere si din
operatori.
Exemple:
Const Pi = 3.14
Const Universitate = ”Hyperion”
Const AN_NASTERE = 1975
Const DATA_INSCRIERE = # 1/10/2002 #
Domeniul unei constante poate fi prin declarare de tip:
– local;
– privat (de tip modul);
– public (global).
Constantele locale sunt definite în cadrul unei proceduri si nu pot fi folosite decât în cadrul
procedurii pentru care au fost declarate.
Constante de modul sau private trebuie declarate în sectiunea Declarations a modulului; ele sunt
accesibile tuturor procedurilor dintr-un modul.
Constante publice sau globale trebuie declarate în sectiunea Declarations a modulului standard,
iar înaintea cuvântului cheie Const trebuie pus cuvântul cheie Public. Constantele publice sunt
accesibile întregii aplicatii. Ele nu pot fi declarate într-un modul formular sau într-un modul clasa.

Concluzii asupra tipurilor de date

Declaratiile tipurilor de date sunt urmatoarele:


– Public – vizibila în întreaga aplicatie;
– Private – vizibila în modul sau în procedura, dupa caz;
– Dim – data cu caracter dinamic vizibila doar în procedura în care a fost declarata; dispare dupa
închiderea procedurii în care a fost declarata;
– Static – data a carei valoare nu dispare dupa încheierea procedurii în care a fost declarata.
Exista un caz suplimentar, cazul implicit, în care o data declarata ca fiind Variant poate lua
oricare din caracteristicile de mai sus. Utilizarea excesiva a acesteia poate genera ambiguitati de
interpretare în compilarea aplicatiei sau alocarile de memorie de tip Variant pot ocupa zone apreciabile,
care pot duce la imposibilitatea rularii aplicatiei generate de depasirea de memorie.
Tipurile de date numerice pot fi: – Integer, Long (întreg lung), Single (virgula mobila simpla
precizie), Double (virgula mobila în dubla precizie) si Currency (monetar).

89
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Tipul de date Byte este alcatuit din matrice de date binare. Daca variabilele de tip String sunt
convertite în formate ANSI sau Unicode, datele binare ale variabilei pot fi modificate; aceasta convertire
se poate realiza atunci când:
– se citeste din fisiere;
– se scrie în fisiere;
– sunt apelate componente DLL;
– sunt apelate metode si proprietati ale obiectelor;
Variabilele de tip string se pot declara si ca sir de lungime fixa dupa sintaxa:
string ∗ dimensiune

Exemplu:
Dim Strada As String ∗ 100
Tipul de date boolean contine doar informatii simple de tipul adevarat/fals, da/nu, pornit/oprit.
Tipul de date Date contine informatii temporale de genul data unei zile dintr-un an, ora, ziua din
saptamâna etc.
Tipul de date Obiect. Acestea sunt stocate ca adrese pe 32 de biti (4 octeti) si apeleaza obiectele
din cadrul unei aplicatii sau al altor aplicatii. Daca, ulterior este utilizata declaratia Set, variabilelor
declarate ca Object li se pot atribui valori care sa apeleze orice obiect recunoscut de aplicatie.
Exemplu:
Dim obj Restantieri As Object
SEt obj Restantieri = Open Database (”f: \Note\Mate.mdb”)

O facilitate deosebita oferita de Visual Basic este existenta functiilor de conversie a datelor pe
parcursul aplicatiei. Acestea sunt date în tabelul 10.4.
Tabelul 10.4

Functia de conversie Converteste o expresie la tipul

Cbool Boolean
Cbyte Byte
Ccur Currency
Cdate Date
CDbl Double
Cint Integer
CLng Long
CSng Single
CStr String
Cvar Variant
CVErr Error

90
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Operatori Visual Basic

Visual Basic pune la dispozitie patru tipuri de operatori:


– aritmetici;
– logici;
– de comparatie;
– de concatenare.
— Operatori aritmetici; acestia sunt:
+ adunare;
– scadere;
* înmultire;
/ (slash) împarte doua numere si prezinta rezultatul sub forma
unui numar zecimal;
\ (back slash) împarte doua numere, rezultatul fiind redat sub
forma unui numar întreg;
MOD (MODULO) împarte doua numere si retine numai restul împartirii.
^ ridicare la putere.

— Operatori logici (TRUE/FALS E):


AND – returneaza valoarea TRUE când toate variabilele din expresie au valoarea TRUE;
OR – returneaza valoarea FALSE numai daca variabilele din expresie au valoarea FALSE.
Exemplu:
UM = InputBox (”Tastati unitatea de masura”)
IF UM = ”kG” OR UM = ”MP” OR UM = ”BUC”
THEN
PRINT ”UNITATEA DE MASURA ESTE CORECTA”
END IF

XOR (sau exclusiv) – returneaza valoarea TRUE numai daca toate variabilele au valori, fie TRUE, fie
FALSE

NOT – schimba o valoare egala cu TRUE în FALSE sau FALSE în TRUE

Exemplu
IF MAGAZIE NOT = 10
...................

— Operatori de comparatie
Acesti operatori compara doua numere sau doua siruri de caractere si returneaza valoarea TRUE
sau FALSE
< mai mic;
<= mai mic sau egal;
> mai mare;
>= mai mare sau egal;
= egal;
<> diferit.

91
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Exemplu de comparare a doua siruri de caractere:


„informatica” = „informatica” returneaza valoarea TRUE :
„informatica” = „INFORMATICA” returneaza valoarea FALSE ;
„INFORMATICA” < > „INFORMATICA” returneaza valoarea FALSE.
— Operatori de concatenare
– operatorul +, care necesita conversia variabilei numerice în sir, cu ajutorul functiei Cstr
(numar);
– operatorul &, care forteaza ca o variabila sa devina de tipul adecvat.

Functii

O functie, asa cum s-a precizat si în capitolele anterioare, efectueaza o anumita sarcina în VB si
returneaza o valoare.
Sintaxa generala este:
Rezultat = nume – functie ([lista argumente])
Exista urmatoarele tipuri de functii predefinite:
– Functii pentru dialog cu utilizatorul;
– Functii matematice si statistice;
– Functii pentru siruri de caractere;
– Functii de editare;
– Functii financiare.

Functii pentru dialog cu utilizatorul

Functia InputBox( )
Afiseaza o invitatie într-o caseta de dialog, asteptând ca utilizatorul sa introduca date de la
tastatura, apoi returneaza unei variabile o valoare tip Variant sau String, în functie de sintaxa utilizata.
Sintaxa pentru aceasta functie este:
a) pentru tipul Variant:
Variabila = InputBox (prompt, title, default, xpos, ypos, helpfile,
context)
b) pentru tipul String (sir de caractere):
Variabila $ = InputBox (prompt, title, default, xpos, ypos,
helpfile, context)
unde:
prompt – precizeaza invitatia adresata utilizatorului; este singurul argument obligatoriu. Daca invitatia
contine mai multe linii, între fiecare doua rânduri succesive se introduce un caracter de retur
de car (CHR(13) si unul de avans de linie CHR(10), sau constanta Vbcrlf;
title – este un text care se afiseaza pe bara de titlu a casetei de dialog;
default – sir de caractere ce reprezinta un raspuns prestabilit care va fi afisat implicit în caseta de text
din caseta de dialog, daca nu se introduce altceva;

92
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

xpos, ypos – sunt expresii numerice care specifica coordonatele x, y ale coltului din stânga sus a casetei
de dialog relativ la coltul din stânga sus a ecranului. În lipsa acestor argumente
pozitionarea se face implicit;
helpfile (un sir) si context (un întreg) – sunt argumente care pun la dispozitia utilizatorului asistenta
soft.
Functia Msg Box ( )
Afiseaza un mesaj într-o caseta de dialog si prin argumente specifica titlul si mesajul casetei,
precizând si tipul butoanelor ce trebuie afisate pe fereastra casetei. Utilizatorul va trebui sa actioneze
unul din butoanele respective. Dupa actionarea butonului dorit, functia returneaza într-o variabila un
numar întreg care reprezinta butonul selectat.
Se recomanda utilizarea constantelor simbolice, întrucât acestea sunt mai sugestive si totodata
vizibile în toate modulele de cod si de forma ale programului utilizator.
Sintaxa pentru aceasta functie este:
Msgbox (msg, type, title, helpfile, context)
unde:
msg – este o expresie sir afisata ca mesaj în caseta de dialog (acest argument este obligatoriu);
type – este o expresie numerica care specifica numarul si tipul butoanelor ce vor fi afisate.
Exemplu de alocare de tip type sunt date în tabelul 10.5.
Tabelul 10.5
Constanta simbolica recomandata
Expresia numerica Butonul selectat
în locul expresiei numerice
1 OK Vb OK
2 Cancel Vb Cancel
3 Abort Vb Abort
4 Retry Vb Retry
5 Ignore Vb Ignore
6 Yes Vb Yes
7 No Vb No

title – este o expresie sir care apare în bara de titlu a casetei de dialog;
helpfile (sir de caractere) si context (întreg) – asigura asistenta soft

Functii matematice si statistice

ABS (expN) – determina valoarea absoluta a expresiei numerice exp N


Exemple:
ABS (– 45) este 45
ABS (10–30) este 20
ABS (30–10) este 20
EXP (exp N ) – determina valoarea lui e (baza logaritmilor naturali) ridicat la puterea
argumentului (exp N)

93
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Exemplu:
EXP (0) este 1,00
EXP (1) este 2,72
INT (exp N) – determina partea întreaga a argumentului:
Exemple:
INT(12.5) este 12
INT(6,25∗2) este 12
INT(– 12,5) este 12
LOG (exp N) – determina logaritmul natural din valoarea argumentului
Exemple:
LOG(1)este 0
V = EXP(2) → LOG(V) = 2,00
RND (exp N1, exp N2) – rotunjeste rezultatul la un numar real, cu un numar de zecimale dat:
exp N1 reprezinta expresia de rotunjit
exp N2 este numarul de zecimale ce se returneaza
Exemple:
RND(1234.1962, 3) ⇒ 1234,196
RND(1234.1962, – 3) ⇒ ∗ ∗ ∗
SQR (exp N) – determina radacina patrata din exp N
Exemple:
SQR (4) este 2
SQR (57.6 ∗ 14,3) este 28,70
ATN(exp N) – determina valoarea în radiani a functiei arctg, din valoarea argumentului.
Exemple:
ATN (0) este 0,00
V = PI( )/ 2 → ATN (V) este 1,00
SIN (exp N) – determina valoarea functiei trigonometrice sin, din valoarea argumentului, în
radiani.
Exemple:
SIN(0) este 0,00
SIN(PI[( ) / 2 → este 1,00.
COS (exp N) – determina valoarea functiei trigonometrice cos, din valoarea argumentului, în
radiani.
TAN (exp N) – determina valoarea functiei trigonometrice tg, din valoarea argumentului, în
radiani.

Functii pentru siruri de caractere

Len (expresie-sir) – returneaza lungimea unui sir


Exemplu:
DIM Nume As String
DIM LungimeSir As Integer

94
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Nume = ”Contabilitate si Informatica”


LungimeSir = Len (”Contabilitate si Informatica”)
Print Lungime Sir
Rezultatul este 28
Lcase (expresie-sir) – transforma literele majuscule în minuscule
Vcase (expresie-sir) – transforma minusculele în majuscule
Left $ (expresie-sir, N) – extrage caractere dintr-un sir începând cu cel din stânga
Exemplu:
DIM sirIntreg As String
DIM sirExtras As String
SirIntreg = ”Calea Calarasilor 169”
SirExtras = LEft $ (SirIntreg, 4)
Print SirExtras
Rezultat: Cale
Right $ (expresie-sir, N) – extrage caractere dintr-un sir începând cu cel din dreapta.
Instr (sir-complet, sir-cautat) – returneaza pozitia unui subsir dintr-un sir
Exemplu:
Subsir = Instr (”Contabilitate”, ”b”)
Print Subsir
Rezultatul este 6
Ltrim (expresie-sir) – elimina spatiile de la începutul sirului
Rtrim (expresie-sir) – elimina spatiile de la sfârsitul unui sir.
Trim (expresie-sir) – elimina spatiile de la începutul si sfârsitul sirului.

8.5.5.4. Functii de editare

FORMAT ( ) – se utilizeaza pentru a afisa o expresie într-o forma dorita (formatarea expresiei)

8.5.5.5. Functii financiare

DDB – calculeaza si returneaza amortismentul unui bun pe parcursul unei perioade specificate,
urmând metoda amortismentului degresiv cu rata dubla sau dupa un coeficient care
ramâne de specificat.
FV – calculeaza si returneaza valoarea viitoare a unei investitii
IPMT – calculeaza si returneaza suma dobânzilor unei investitii pentru o perioada data;
IRR – calculeaza si returneaza rata de rentabilitate interna pentru fluxurile financiare pozitive si
negative finantate la rate diferite;
MIRR – calculeaza si returneaza rata de rentabilitate interna a unei investitii fara a tine seama de
costurile de finantare si de plusvalorile de reinvestire;
NPER – calculeaza si returneaza numarul de plati pentru o investitie data;
NPV – calculeaza si returneaza valoarea actuala neta a unei investitii pe baza fluxurilor
financiare variabile;
PMT – calculeaza suma totala a fiecarei rambursari periodice a unei investitii si ratele dobânzii
constante;
PPMT – calculeaza partea varsamântului principal al unui împrumut pentru o perioada data;

95
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

PV – calculeaza valoarea actuala a unei investitii;


RATE – calculeaza amortismentul liniar al unui bun pentru o perioada de timp data;
SLN – calculeaza amortismentul liniar al unui bun pentru o perioada de timp data;
SYD – calculeaza amortismentul unui bun pentru o perioada data pe baza metodei americane
Sum-of-Years Digits.

Proceduri

Pentru ca un program realizat în Visual Basic sa fie mai usor de scris, de modificat (de depanat),
de desenat si de înteles el poate fi împartit în entitati logice mai mici, denumite proceduri.
O procedura reprezinta o secventa de instructiuni executate ca un tot unitar si care realizeaza
sarcini repetabile sau partajabile.
Procedurile, de principiu, pot fi folosite si în cadrul altor programe cu sau fara modificari.
Tipuri de proceduri în Visual Basic:
– proceduri Sub (subrutina);
– proceduri Function;
– proceduri de tip proprietate.

Proceduri Sub

O procedura Sub (procedura subrutina) este o unitate de cod (program) care executa o anumita
sarcina ca raspuns la un eveniment, dar nu returneaza nici o valoare explicita.
Sintaxa generala a unei proceduri Sub este:
[Private|Public|Static]Sub nume-procedura (argument)
instructiuni
End Sub
Instructiunile cuprinse între Sub si End Sub vor fi executate ori de câte ori va fi apelata subrutina
declarata prin nume-procedura.
Argumentele unei proceduri reprezinta variabile, transmise proceduri atunci când ea este apelata.
Procedurile Sub sunt de doua tipuri:
– proceduri generale;
– proceduri-eveniment.
O procedura generala comunica aplicatiei cum sa efectueze o anumita sarcina.
Dupa ce o procedura generala a fost definita, ea trebuie apelata în mod explicit de catre aplicatie.
O procedura generala poate fi plasata în oricare din cele trei tipuri de module: standard, de clasa
sau module formular.
O procedura-eveniment ramâne inactiva pâna când este apelata pentru a raspunde unor
evenimente provocate de utilizator sau declansate de sistem.
O procedura de tratare a unui eveniment este atasata unui obiect Visual Basic (formular, buton de
comanda, caseta de validare etc.). Când un obiect Visual Basic recunoaste aparitia unui eveniment, el
apeleaza automat procedura-eveniment folosind numele corespunzator evenimentului. Acest tip de
programare se numeste programare condusa de evenimente (”event-driven”).
Întrucât numele evenimentului stabileste o asociere între obiect si cod, procedurile eveniment pot
fi:

96
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

— proceduri eveniment atasate unui control


— proceduri eveniment atasate unui formular
Relatia dintre procedura generala si procedurile eveniment este ilustrata în figura 8.9.

Figura 8.9. Interactiunea între procedura generala si procedurile eveniment.

Sintaxa generala pentru procedurile eveniment este


Private Sub control_eveniment (argumente)
instructiuni
End Sub
sau
Private Sub Form_eveniment (argumente)
instructiuni
End Sub

Proceduri Function

O procedura Function (procedura functie) este o procedura care efectueaza o anumita sarcina
într-un program Visual Basic si returneaza o valoare catre procedura apelata.
În afara de functiile intrinseci sau incluse, programatorul poate crea propriile functii (PDF –
Programmer Defined Function) utilizând procedura Function.
O functie definita într-un modul începe cu o instructiune Function si se termina cu o instructiune
End Function.
Sintaxa generala pentru proceduri Function este:
[Private|Public|Static]Function nume-procedura (argumente) [As tip]
instructiuni
End Function
Daca clauza As lipseste, tipul de data implicit este tipul Variant.
Apelarea din programul central se face dupa sintaxa:
Variabila_solicitata = functie ( )
Procedurile Function sunt apelate implicit ca în exemplul de mai jos în care este apelata procedura
functie Patrat:
X = a ∗ Patrat
If Patrat = 100 Then Y = Sqr (a^2 + b^2)
Spre deosebire de cele de mai sus, procedurile Sub sunt apelate prin ”call” ca în exemplul de mai
jos:
Call Alpha (argument 1, argument 2, ..., argument n)

97
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Alpha argument 1, argument 2, ..., argument n

Procedurile de tip proprietate

Procedurile de tip proprietate pot returna si atribui valori si pot stabili referinte la obiecte.
Procedurile de tip proprietate permit unui obiect sa-si protejeze si sa-si valideze propriile date.
Tipuri de proceduri tip proprietate:
— Property Get – returneaza valoarea unei proprietati;
— Property Let – atribuie o valoare unei proprietati;
— Property Set – atribuie o valoare unui obiect proprietate.
Procedurile de tip proprietate sunt implicit publice.
Sintaxa procedurilor de tip proprietate:
Property Get nume_proprietate (1, …, n) As Type
Property Let nume_proprietate (1, …, n, n + 1)
Property Set nume_proprietate (1, …, n, n + 1)
Argumentele (1, ..., n) trebuie sa îndeplineasca urmatoarele cerinte:
– sa partajeze acelasi nume si acelasi tip de date în toate procedurile Property care au acelasi
nume;
– toti parametrii necesari din lista trebuie sa se afle înaintea primului parametru optional;
– procedura Property Get trebuie sa aiba un parametru mai putin decât Property Let sau Property
Set;
– tipul de date al procedurii Property Get trebuie sa fie acelasi cu tipul de date al ultimului
argument (n + 1) din Property Let sau Property Set;
– tipul de date al ultimului argument din Property Set trebuie sa fie un tip de obiect sau un
Variant.

Crearea noilor proceduri

Se deschide fereastra de cod, se introduce de la tastatura cuvântul Sub sau Function urmat de
titlul procedurii si se apasa tasta ENTER. Visual Basic completeaza sablonul pentru noua procedura.

Selectarea unei proceduri existente

— din meniul View se selecteaza Object Browser;


— din caseta Project/Library se selecteaza proiectul;
— din lista Classses se selecteaza modulul;
— din lista Members of se selecteaza procedura;
— se selecteaza View Definition.

Apelul procedurilor

O procedura Sub sau Function este apelata printr-o instructiune Call cu sintaxa:
Call nume_procedura (argument 1, ..., argument n)
sau
Nume_procedura argument 1, ..., argument n

98
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Observatii:
1. O procedura Sub nu poate fi apelata prin nume în cadrul unei expresii, ci se recomanda
declararea unei variabile si utilizarea sa în expresie. Variabila declarata cheama subrutina
conform sintaxei de mai sus.
2. Daca procedura Sub este apelata prin Call, argumentele se trec în paranteze.
3. Daca procedura Sub este apelata fara Call, argumentele nu se trec în paranteze.

Comenzi pentru structurile de control ale programelor

Ca si în limbajele de programare studiate anterior si în cazul Visual Basic, comenzile pentru


structurile fundamentale de control se împart în:
– comenzi pentru structuri alternative (de decizie);
– comenzi pentru structuri repetitive (de tip bucla).

Comenzi pentru structuri alternative

Asemenea comenzi sunt:


If ... Then
If ... Then ... Else
Select case
În continuare se prezinta sintaxele pentru acest tip de comenzi.
If ... Then
Sintaxa gener ala este:
If conditie Then instructiune
sau
If conditie Then
instructiuni
EndIf
Pentru comanda If ... Then pe un singur rând nu este nevoie de EndIf.
Pentru comanda If ... Then pe mai multe rânduri; EndIf se impune obligatoriu.
If ... Then ... Else
Sintaxa generala este:
If conditie 1 Then
[instructiuni]
EleseIf conditie 2 Then
[instructiuni 2]]
......................
Else
[instructiuni n]]
EndIf

Select Case
Permite executia selectiva a unei singure secvente de instructiuni dintre mai multe secvente.
Sintaxa generala este
Select Case expresie_de_analizat
Case lista_de_expresii_1

99
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

[instructiuni_1]
Case lista_de_expresii_2
[instructiuni_2]]
......................
[Case Else
[instructiuni_n]]
End Select

8.5.7.2. Comenzi pentru structuri repetitive

Asemenea comenzi vor fi prezentate în continuare


While ... Wend
Sintaxa pentru aceasta comanda este
While conditie
instructiuni
Wend

Do ... Loop
Sintaxa comenzii pentru conditionare anterioara
Do While conditie
instructiuni
Loop
sau
Do Until conditie
instructiuni
Loop
Sintaxa comenzii pentru conditionare posterioara
Do
instructiuni
Loop Until conditie
sau
Do
instructiuni
Loop While conditie

For ... Next


Sintaxa pentru aceasta comanda este:
For contor = inceput To sfarsit [Step pas]
instructiuni
Next [contor]
Exemplu:
For i = Vi To Vf [Stop 2]
a = a + a ∗ 0.5 ∗ i
Next [i]
Observatie. Daca Step lipseste valoarea implicita este 1.
ForEach ... Next
Sintaxa acestei comenzi este:
For Each element In grup
instructiuni

100
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Next element
Spre deosebire de limbajele Pascal sau C++ în care programarea orientata spre obiecte constituie
o filozofie prin care procedurile declarate obiect se încapsuleaza si asambleaza un program central iar
mostenirea reprezinta un echivalent al derivarii din obiectul ascendent în familii de obiecte descendente,
nu acelasi lucru se petrece cu limbajul Visual Basic.
În Visual Basic obiectele reprezinta deja entitati cu forma si volum ce pot fi vizualizate pe
monitor (butoane, forme, etichete etc.) iar crearea codului este mai curând apropiata de programar ea
structurata decât orientata spre obiecte, convenindu-se ca mai proprie este denumirea de programare
orientata spre evenimente.
Asa cum s-a aratat în capitolul anterior, programarea orientata spre obiecte poate fi realizabila
printr-o disciplinare în activitatea de arhitecturare a unui program indiferent de limbajul care a stat la
baza sa.
Se poate arata ca si în limbajul Visual Basic exista instrumente de alcatuire a unei metodologii de
programare orientata spre obiecte în sensul filosofiei prezentate în capitolul precedent (referitor la C++
si Pascal).
Descrierea claselor este stocata în biblioteci de tipuri, care pot fi vizualizate de browsere de
obiecte.
Pentru a accesa un obiect, trebuie definita o referinta (sau o interfata) de legatura cu variabila
obiect care îl defineste. Legatura poate fi lenta (late bound) sau rapida (early bound). Interfata este
alcatuita dintr-un „pachet” de proprietati si metode.
Actiunea asupra unui obiect preexistent se face apelând la functia CallByName astfel:
Rezultat=CallByName(Obiect,NumeProcedura, TipApel,Argumente( ))
De asemenea atunci când asupra unui obiect urmeaza a se efectua mai multe actiuni se poate opta
pentru apelul direct si atribuirea mai multor proprietati simultan, în modul urmator:
Private Sub Form_Popescu ( )
With Ionescu 1
• Caption = ”ok”
• Top = 250
• Left = 300
End With
End Sub
în care a fost introdusa în subrutina Form_Popescu, obiectul Ionescu, caruia i s-au definit mai multe
proprietati.
Limbajul Visual Basic permite crearea colectiei proprii de obiecte în clasa generala Collection.
Astfel, pe masura ce programatorul îsi dezvolta seturi de aplicatii, poate salva în aceasta clasa colectii
de formulare sau de controale, pe care le poate folosi ulterior în alte aplicatii. Adaugarea de noi
proprietati/metode la un obiect anterior creat nu duce la distrugerea vechilor proprietati, ci, dimpotriva
la amplificarea valentelor sale în conformitate cu noua aplicatie din care urmeaza sa faca parte. Aceasta
caracteristica se numeste polimorfism3 .
Asupra unui obiect Collection pot opera proprietatile sau metodele din tabelul 10.6.

3
Formele sau controalele nu sunt polimorfe între ele, întrucât au coduri principial diferite. Polimorfismul se aplica la
aceeasi categorie, respectiv la dezvoltarea unui formular sau la dezvoltarea unui control.

101
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

Tabelul 10.6
Proprietatea sau metoda Explicatie
Metoda Add adauga elemente la colectie
Proprietatea Count returneaza numarul de elemente din colectie
Metoda Item returneaza un element, dupa index sau dupa cheie
Metoda Remove sterge un element din colectie, dupa index sau dupa cheie

Metodele mentionate în tabelul 8.6 au urmatoarele sintaxe de utilizare:


Sub Add (element As Variant [,cheie AsVariant] [,before As
Variant][,after AsVariant]obiect. Remove index
si, respectiv
set variabila = obiect. Item (index)
Clasele se deosebesc de modulele standard prin modul de stocare al datelor. Principala diferenta
este aceea ca datele din modulele standard exista atâta timp cât exista programul activ în timp ce clasele
exista atâta timp cât exista obiectul care le-a instantiat sau pe baza caruia au derivat. Pe de alta parte o
variabila declarata Public într-un modul standard este vizibila în întregul proiect, în timp ce variabilele
Public dintr-un modul clasa pot fi accesate prin variabila obiect care face referinta la clasa respectiva.

102
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

BIBLIOGRAFIE
1. A. Petrescu, T. Moisa, G. Rizescu, Viorica Harabor, M.Mârsanu, T. Mihu – ABC de calculatoare personale
si ... nu doar atât ..., Editura Tehnica, Bucuresti, 1991.
2. Anca Gheorghiu, I. Spânulescu, Masurari electronice, Editura Victor, Bucuresti, 2002.
3. S. Niculescu, L. Butnaru, V. Butnaru, Informatica, Editura Didactica si Pedagogica, Bucuresti, 2000.
4. Mariana Milosescu, Tehnologia informatiei; Informatica, Editura Teora, Bucuresti, 2001.
5. W. L. Rosch, Totul despre hardware, Ed. a II-a, Editura Teora, Bucuresti, 1999.
6. A. P. Andras, Claudia Roman, Ghid de initiere în informatica, Editura Dacia, Cluj-Napoca, 2001.
7. R. Mârsanu, Sisteme de operare, Editura All, Bucuresti, 1998.
8. Magdalena Popeanga, Windows XP – o noua optiune în sistemele de operare, www.agora.ro
9. * * * Intel, Limbaje de asamblare, Editura Teora, Bucuresti, 2001.
10. * * * http://referate.narod.ru.
11. * * * http://www.xguard.ro.
12. * * * Chip Special nr. 6, 2002.
13. * * * www.macos.ro.
14. * * * www.microsoft.com/Romania/Windows.
15. M . Veteanu, Manualul virusomanului. Ghidul programatorului pentru realizarea virusilor,
http:tempus.upit.ro/vma.
16. C. Zavoianu, Algoritmi si programare în Turbo Pascal, Editura Soft Computer, Petrosani, 2000.
17. G. Albeanu, Algoritmi si limbaje de programare, Editura Fundatiei România de Mâine, Bucuresti, 2000.
18. G. Albeanu, Luminita Radu, Algoritmica si programare în limbajul Pascal, Editura Fundatiei România de
Mâine, Bucuresti, 2001.
19. L. Dorin, Gestiunea proceselor în Linux, Comunicare particulara, Universitatea Transilvania Brasov,
Facultatea de Stiinte, Brasov, 2002.
20. G. Perry, Initiere în programarea calculatoarelor, Editura Teora, Bucuresti, 2000.
21. B. Eckel, Thinking in C++, 2nd , ed., vol. I si II, http://carti.ss.pub.ro/eckel.
22. B. Eckel, Thinking in Java, 2nd , ed., http://carti.ss.pub.ro/eckel.
23. T. Balanescu, S. Gavrila, H. Georgescu, M. Gheorghe, L. Sofonea, I. Vaduva, Programare în limbajele
Pascal si Turbo Pascal, vol. I si II, Editura Tehnica, Bucuresti, 1992.
24. * * * www.pascal.go.ro.
25. C. Constantin, Istoria limbajelor de programare pe limba calculatoarelor, Rev. CHIP, aprilie 2002, pag. 92-
93 (ISSN 1453-7079).
26. D. Chiorean, Limbaje orientate-obiect, www.netreport.ro/pcrep59/11.html.
27. C. A. Rusu, Programarea vizuala, www, byte.ro/byte97-08/progviz.htm
28. G. Saftescu, Sisteme expert-aplicatii în domeniul militar, http://expertsg.50megs.com/ gabi5.htm
29. * * * www.cdi.pub.ro/CDI/profilul_bioinginerului.htm.
30. Raluca Vasilescu, Inteligenta artificiala, http://www-2.cs.cmu.edu/mihaib/articole/ ai/ai-html.html.
31. D. Lupascu, Anca Cornelia Lupascu, O. Dinu, B. Mirodotescu, Sisteme integrate inteligente, www.upg-
ploiesti.ro/sescom/pdf/s07-| 19-tdl.pdf.
32. * * * www.div.ro.
33. Gh. Sofronic, R. Mârsanu, Tr. Surcel, O. Paiu, Medii de programare pentru gestiunea bazelor de date,
Editura Calipso 2000, Bucuresti, 2002.
34. M . Hyman, B. Arnson, Visual C++ pentru toti, Editura Teora, Bucuresti, 1996.
35. H. Schildt, C++, Manual C omplet, Editura Teora, Bucuresti, 2000.
36. K. Jasma, L. Klander, Totul despre C si C++, Editura Teora, Bucuresti, 2001.
37. Maria Litviu, Pascal C++, Syde by Side, www.concentric.net/~skylit.
38. * * * http://sateliti.hypermart.net/alinab/ALINA21.htm.
39. V. Cristea, I. Athanasiu, E. Kalisz, A. Panoiu, Turbo Pascal 6.0, Editura Teora, Bucuresti, 1992.
40. * * * www.liis.ro/~doina/informatica/POO/obiecte. html.
41. Doina Hrinciuc Logofatu, C++. Probleme rezolvate si algoritmi, Editura Polirom, Iasi, 2001.
42. D. Achiostachioaie, Curs de C++, http://www.biosfarm.ro/~dragos.
43. * * * Microsoft R Visual Basic 6.8, Ghidul programatorului, Editura Teora, Bucuresti, 2002.
44. D. Benage, A. Mirza, Visual StudioTM 6, Editura Teora, Bucuresti, 2001.

103
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

45. Doina Fusaru, Marius Daniel Mars, Gabriel Mihai, Visual Basic si Access, Editura Fundatiei România de
Mâine, Bucuresti, 2001.
46. C. J. Bockmann, L. Klander, L. Tang, Visual Basic, Biblioteca Programatorului, Editura Teora, Bucuresti,
2001.
47. A. D. Patterson, J. L. Hennessy, Computer Organization & Design, The Hardware /Software Interface, 2-nd.
edition, Morgan Kaufmann Publishers, Inc., 1998.
48. I. Spânulescu, S. I. Spânulescu, Circuite integrate, Editura Stiintifica, Bucuresti, 1991.
49. I. Spânulescu, S. I. Spânulescu, Circuite integrate si sisteme cu microprocesoare, Editura Victor, Bucuresti,
1996.
50. C. Lupu, S. Stancescu, Microprocesoare, Circuite, Proiectare, Editura Militara, Bucuresti, 1986.
51. * * * Zilog, Data Book , 1983-1984.
52. H. P. Vyas, R. S. L. Lutz and J. S. T. Huang, A trench-isolated submicrometer CMOS technology, IEEE
Trans. Electron devices , vol. ED -32, pp. 926-931, 1985.
53. M . A. Homorodean, Irina Iosapescu, Internet si pagini WEB, Editura Niculescu, Bucuresti, 2002.
54. M . Waite, R. Lafore, Structuri de date si algoritmi în Java, Editura Teora, Bucuresti, 2001.
55. M . C. Chan, S. W. Griffith, A. F. Iasi, Java, 1001 secrete pentru programatori, Editura Teora, Bucuresti,
2001.
56. E. Rotariu, http://horax.home.ro/java/-Limbajul Java.
57. Anca Gheorghiu, A. Bomher, Comunicare particulara, Universitatea Hyperion, Bucuresti, 2002.
58. I Spânulescu, Electronica, Editura Didactica si Pedagogica, Bucuresti, 1983.
59. I. Spânulescu, Dispozitive semiconductoare si circuite integrate analogice, Editura Victor, Bucuresti, 1998.
60. C. D. Vasile, www.cdv.ro/javacurs/cursuri.html.
61. N. J. Muller, Enciclopedia Internet, Editura Tehnica, Bucuresti, 2002.
62. R. Darnel, Totul despre HTML4, Editura Teora, Bucuresti, 2002.
63. V. Clocotici, http://thor.info.naic.ro/~val/ro-index.html.
64. * * * http://www.w3.org.
65. F. Iacob, Multiprocesoare, Editura Victor, Bucuresti, 2000.
66. K. Hwang, Advanced Calculator Architecture with Parallel Programming, McGrow-Hill, New York, 1993.
67. D. E. Culler, J. P. Singh, A. Gupta, Parallel Calculator Architecture, Morgan Kaufmann, San Francisco,
1998.
68. E. Szilárd, www.cs.utclui.ro/~szilard/Teaching/WebDesign.
69. * * * „Chip”, colectia 2001-2003, Bucuresti.
70. * * * „Chip”, Nr. 5, 2002, Bucuresti, 2002.
71. * * * PC Magazin, Nr. 2, 2003, Bucuresti, 2003.
* * * www.mkp.com/cod 2e.htm.
73. Anca Gheorghiu, Corina Maria Bichis – Informatica aplicata, Editura Victor, Bucuresti, 2004

104

Você também pode gostar