Programarea Calculatoarelor
Programarea Calculatoarelor
Programarea Calculatoarelor
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.
OBIECTIVELE CURSULUI:
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.
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:
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.
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
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.
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
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.
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).
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).
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
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).
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).
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.
18
Programarea structurata accepta ca echivalente structurile IF –THEN–ELSE cu IF–ELSE
Structuri repetitive. Câteva exemple sunt reprezentate în figura 5.3.
19
6. Structuri elementare de date
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.
Figura 5.13.
Figura 5.14.
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
Î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).
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.
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
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.
33
— Cuvinte-cheie definite pe standardul ANSI1 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:
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.
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
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
î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
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):
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.
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
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
50
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs
51
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs
Aplicatie
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
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;
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;
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
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;
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
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
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.
Î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;
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
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 .
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
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
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
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
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
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.
73
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs
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
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.
77
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs
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.
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).
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.
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
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
84
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs
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
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)
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
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
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
XOR (sau exclusiv) – returneaza valoarea TRUE numai daca toate variabilele au valori, fie TRUE, fie
FALSE
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
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.
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
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.
94
PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs
FORMAT ( ) – se utilizeaza pentru a afisa o expresie într-o forma dorita (formatarea expresiei)
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
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 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
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.
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.
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.
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
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
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
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