programare pc

106
UNIVERSITATEA „HYPERION” DIN BUCURESTI Conf. univ. dr. Anca Gheorghiu PROGRAMAREA CALCULATOARELOR ELECTRONICE MANUAL pentru învatamânt la distanta EDITURA VICTOR 2004

Upload: robertyno

Post on 08-Aug-2015

278 views

Category:

Documents


27 download

DESCRIPTION

Programare

TRANSCRIPT

Page 1: Programare PC

UNIVERSITATEA „HYPERION” DIN BUCURESTI

Conf. univ. dr. Anca Gheorghiu

PROGRAMAREA CALCULATOARELOR

ELECTRONICE MANUAL

pentru învatamânt la distanta

EDITURA VICTOR

2004

Page 2: Programare PC

1

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

Numarul total de ore de curs: 28 ore Numarul total de ore de laborator si activitati tutoriale: 28 ore Forma de finalizare: examen la sfârsitul semestrului I Strucura notei finale: 50% nota examen scris+

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

Pentru obtinerea notei maxime studentul trebuie: - sa însumeze calificativ maxim la examenul scris; - sa efectueze cele 10 aplicatii de laborator, certificate prin semnatura tutorelui; - sa realizeze 2 referate originale legate de tematica propusa de profesorul coordonator sau de tutore

redactate de mâna (nu printate, decât cel mult listingul aplicatiei). Nota: 1. Frauda se pedepseste 2. În cazul în care referate realizate de 2 studenti diferiti sunt asemanatoare în pondere mai mare

de trei paragrafe, acestea sunt descalificate din calculul notei finale pentru ambele persoane, chiar daca unul dintre acestia urmeaza alta forma de învatamânt.

OBIECTIVELE CURSULUI:

- Cunoasterea conceptelor fundamentale hardware si software ale calculatoarelor electronice;

- Formarea deprinderilor de analiza si proiectie logica în procesul de alcatuire a unui program;

- Însusirea principalelor tehnici de programare; - Prezentarea caracteristicilor principiale ale câtorva limbaje de programare (TurboPascal,

C++, VisualBasic6, Java etc.)

Page 3: Programare PC

2

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 Pascal si C 58 10 Limbajul de programare Visual Basic 83 Bibliografie minimala recomandata

Preambul

Page 4: Programare PC

3

Descoperirile ultimului secol au revolutionat mijloacele de lucru. Se vorbeste tot mai mult despre a treia

revolutie industriala marcata de calculator si de retelele de interconectare electronice. Oamenii au devenit mai apropiati prin aparitia telefonului (mai nou a videofonului) si în acelasi timp tot mai înstrainati prin boom-ul tehnologic.

Ultimele doua decenii au facut ca sa dispara meserii, cum ar fi cele de desenator tehnic sau de dactilografa,

si-n schimb sa apara altele noi (designer web, info-arhitect, programator în diverse limbaje). De asemenea, datorita calculatorului si a retelelor internet, s-a schimbat radical conceptia asupra muncii si a întreprinderii. Vorbim astazi despre telelucrul, lucrul de acasa, vorbim despre noi mijloace de munca si ne preocupa la un alt nivel pastrarea secretului de fabricatie fata de atacurile din retea.

Ajunge sa avem o conexiune Internet la Predeal sau în Bahamas pentru a intra pe chat sa vedem ce mai fac

prietenii nostri virtuali, indivizi a caror identitate este marcata de un sir impersonal de litere si cifre, oameni pe care, poate nu i-am vazut niciodata, dar cu care dialogam pe diverse teme, la felurite ore din zi sau din noapte.

Banalul telefon cu disc de pe vremea mamei mari a devenit întâi si întâi fara fir, apoi tot mai sofisticat, cu

tot mai multe facilitati si cautarile tehnologice au tendinta de a face ca acesta sa înceapa a concura cu calculatoarele.

Si toate acestea pentru ca a fost descoperit curentul electric!... Va puteti închipui o lume fara curent electric? Fara baterii, fara baterii solare, fara banala priza de 220V? Sa

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

Cu sau fara patetism, daca nu ar fi existat descoperirea curentului electric, a treia revolutie tehnologica nu ar

fi existat cu toate implicatiile si facilitatile oferite de aparatura din ce în ce mai sofisticata si cu toate implicatiile socio-umane si frustrarile rezultate din înstrainarea individului fata de colectivitate.

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

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

limbaje:

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

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

supravietui în noua civilizatie.

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

Page 5: Programare PC

4

Anul anterior ati studiat notiuni generale privitoare la utilizarea calculatorului si sistemele de operare

principale care exista pe piata actuala în cadrul cursurilor de „Informatica generala”. În cursul de „Birotica” ati fost familiarizati în mod deosebit cu cele mai populare aplicatii din pachetul Microsoft Office, respectiv Word, Excel, PowerPoint, Front Page.

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

gândire al calculatorului, cu modalitatile de construire a unui algoritm logic, cu etapele de proiectare software si nu în ultimul rand cu prezentarea caracteristicilor câtorva limbaje de programare si anume:

• TurboPascal; • C si C++; • VisualBasic6; • Java; • Limbaje proprii paginilor Internet

La finele acestui curs veti fi capabili sa construiti scurte si simple aplicatii software. Destinatia cursului

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

Page 6: Programare PC

5

2. Etapele unui proces de compilare

Etapele unui proces de compilare sunt: 1. Analiza lexicala descompune un program-sursa (PS) în atomi lexicali (identificatori, cuvinte rezervate,

constante, operatori), pe care îi introduce în tabele de simboluri sub forma codificata. 2. Analiza sintactica, prin care sirul de atomi lexicali este analizat în vederea depistarii unor structuri

sintactice ca expresii, liste sau proceduri, plasându-le într-un arbore de derivare (arbore sintactic). 3. Analiza semantica foloseste structura programului si informatiile din tabela de simboluri pentru

generarea unui grup de instructiuni simple cu format fix (codul intern); daca arborele sintactic nu respecta gramatica limbajului, semnalizeaza erori.

4. Optimizarea codului presupune eliminarea redundantelor, a lungimii si a variabilelor initiale, în vederea unei executii mai eficiente.

5. Generarea codului aloca zone de memorie pentru pastrarea datelor în timpul executiei, aloca registre si produce codul obiect.

6. Gestiunea structurilor de date – reprezinta o colectie de proceduri care creeaza si actualizeaza baza de date cu care lucreaza celelalte faze; în baza de date se gasesc tabelele identificatorilor, constantelor, constructorilor, cuvinte-cheie si produsi standard, care, uneori, sunt înglobate într-o tabela unica de simboluri (fig. 2.5).

7. Tratarea erorilor este realizata de o colectie de proceduri care sunt activate când se depisteaza o eroare în program; utilizatorul primeste mesaje de diagnostic, iar compilatorul continua analiza sintactica pentru a depista alte erori.

În ceea ce priveste translatoarele de limbaje, specificam urmatoarele: � asamblorul este determinat de limbajul-masina specific fiecarui sistem de calcul, iar compilatorul este

specific unui anumit limbaj de programare, independent de sistemul de calcul; � compilatorul ofera posibilitatea scrierii de programe pentru orice sistem de calcul ce dispune de

compilatorul respectiv; Compilatorul este componenta software care realizeaza traducerea programului-sursa (PS) în program cod-

obiect (PO). Din punct de vedere al traducerii programului-sursa în codul intern al calculatorului deosebim: – limbaje de programare standard sau specifice (PASCAL, COBOL, FORTRAN, C) care cer scrierea

programului în totalitatea sa, fara a anunta pe parcurs greselile, ci numai la final, fie prin prezentarea unei recapitulatii a erorilor, fie prin parcurgerea pas cu pas a erorilor pâna la eliminarea lor completa [10].

– limbaje de programare interactive (Ex: BASIC), ceea ce însemna ca imediat dupa tastarea unei comenzi, calculatorul o analizeaza si anunta daca este gresita. În acest caz componenta software care realizeaza traducerea programului-sursa se numeste interpretor.

� Astfel asamblorul translateaza o definitie simbolica a programului-sursa într-o singura definitie prin programul-obiect, în timp ce compilatorul o poate translata în mai multe definitii prin programul-obiect (PO); memoria ocupata astfel de asamblor necesita mai putin spatiu, dar compilatorul este mai puternic datorita includerii într-o definitie-sursa a mai multor definitii-obiect;

� interpretorul este util, în special, în controlul proceselor industriale care se desfasoara în timp real, însa interpretarea este mai lenta decât compilarea;

� executia repetata a unui program este facilitata de compilator care realizeaza translatarea o singura data, în timp ce interpretorul îl translateaza de fiecare data.

Exista componente ale S.O. ce sunt concepute ca programe generalizate care, în functie de necesitatile utilizatorului, se pot adapta pentru a realiza un grup de functii; aceasta se realizeaza în faza de asamblare, prin intermediul unui macro-limbaj care asigura generarea secventelor de program (PS sau PO) specificate.

Macrolimbajul foloseste macroinstructiuni – instructiuni ale PS care asigura, prin intermediul comenzilor, inserarea în PS a secventei de instructiuni în locul unde a aparut macroinstructiunea.

De remarcat faptul ca utilizarea macrolimbajului nu economiseste decât timpul utilizatorului.

Page 7: Programare PC

6

Macroasamblorul este componenta programelor de serviciu ale sistemelor de operare care trateaza macroinstructiunile, având ca activitati de baza:

� recunoasterea macrodefinitiilor indicate prin MACRO, ENDM; � memorarea definitiilor macroinstructiunilor necesare pentru a le expanda la un apel macro; � recunoasterea apelului macroinstructiunii cu secventa de instructiuni corespunzatoare; � înlocuirea macroinstructiunii cu secventa de instructiuni corespunzatoare. Structura externa a unui program-sursa este alcatuita din:

– sectiune; – segment; – program.

Sectiunea este o unitate de program independenta, constituita dintr-o secventa de definire a datelor si o secventa de instructiuni ce asigura posibilitatea comunicarii cu alte unitati ale PS (program-sursa).

Definirea datelor si procedurilor serveste atât propriei sectiuni, cât si altor sectiuni. Comunicatia între sectiuni este ilustrata în figura 2.1.

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

Compilatorul asigura, pe lânga generarea codului obiect, si informatii de legatura între sectiuni, astfel (fig.

2.2): � informatii de identificare (nume sectiune, punctul de intrare); � informatii de legatura.

Nume sectiune

Punct de intrare

Dictionar de legaturi Codul obiect

Figura 2.2. Structura unei sectiuni dupa compilare.

Dictionarul de legaturi (fig. 2.2) rezulta în urma determinarii de catre compilator a elementelor de comunicatie specificate în fiecare sectiune a programului sursa si contine doua tipuri de simboluri:

� externe – nedefinite în sectiune, cu adresa necunoscuta; � interne – definite în sectiune, dar referite din exteriorul acesteia. Segmentul este o succesiune de sectiuni între care au fost rezolvate legaturile; acesta contine:

� numele segmentului; � punctul de intrare în segment; � codul obiect al sectiunilor aranjate într-o anumita ordine.

Programul este o structura arborescenta de segmente (segment principal si segmente subordonate, organizate pe substructuri); acesta este organizat într-o structura multifazica de catre editorul de legaturi. Editorul de legaturi, pe baza numelor segmentelor din care este alcatuit programul si a secventei de sectiuni din care este compus fiecare segment, creeaza structura de program pe care o depune pe suport extern (de obicei hard-disk), de unde ulterior va fi încarcat în RAM pentru executie.

Page 8: Programare PC

7

Editorul de legaturi prelucreaza programul-obiect (PO) în urma compilarii sectiunilor în scopul construirii structurii pe segmente a programului (fig. 2.3); el este o componenta a programelor de servicii care asigura urmatoarele functii:

� construirea dictionarului de legaturi între diverse sectiuni; � înlocuirea fiecarei sectiuni din cadrul unui segment cu un factor de relocare corespunzator adresei de

încarcare în RAM; � alocarea de zone continue pentru segment; � modificarea constantelor de adresa relocabile, pentru a contine valorile relocate ale simbolurilor lor; � cautarea în biblioteca relocabila a modelelor obiect catalogate; � construirea directorilor de segmente ai programelor executabile.

Încarcatorul – este componenta sistemului de operare care încarca programul-obiect executabil (POE) în RAM în vederea executiei si initializeaza executia.

Încarcarea programelor în RAM pentru executie se poate face: � imediat dupa translatare, când sistemul de operare are inclus încarcatorul în compilator (Load and Go); � în momentul editarii de legaturi (încarcatorul inclus în Link ); � dupa editarea de legaturi, ca proces distinct.

Depanatorul este un program de servicii ce ofera utilizatorului mijloace convenabile pentru depanarea si controlul operatiilor programului sau, prin:

� lansarea în executie a programului; � suspendarea executiei în puncte predeterminate (breakpoints) sau executie pas cu pas; � examinarea si modificarea continutului cuvintelor din RAM si registre; � realizarea de modificari si corectii aditio nale la rularea programului, utilizând codul binar, octal sau

hexazecimal.

Figura 2.3. Activitatea editorului de legaturi

Page 9: Programare PC

8

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

Page 10: Programare PC

9

apreciere a valorii unui algoritm fata de altul. De regula, prevaleaza algoritmii de rezolvare în pasi mai putini sau cei pentru care memoria alocata este minima.

e) Testarea aplicatiilor. Orice problema pentru care s-a elaborat si validat un algoritm optim poate fi supusa testarii prin programarea într-un limbaj ales dupa anumite criterii de catre programator (în functie de experienta într-un limbaj sau altul, caracteristicile fizice ale sistemului pe care urmeaza a se implementa, gradul de dificultate etc.). De regula, etapa de testare a aplicatiilor este alcatuita din sase faze :

1. redactarea programului în conformitate cu algoritmul; 2. valoarea acestuia; 3. depanarea (eventuala) si corectarea greselilor (daca exista); 4. trasarea (profiling) – testarea programului pentru diferite date de intrare, determinarea timpului de calcul

si a memoriei necesare; 5. compararea rezultatelor cu fundamentele teoretice si, pe de alta parte, a parametrilor de lucru (timp de

executie, memorie etc.); 6. optimizarea programului (daca este cazul). Modalitatile de reprezentare a algoritmilor de rezolvare sunt felurite si putem aminti: reprezentarea în

cuvinte, prin pasi, ilustrarea cu ajutorul schemelor logice (nestructurate si structurate); tabele de decizie; arbori de programare; pseudocoduri sau limbaje de prezentare etc.

Un aspect cu care ne confruntam cel mai adesea în problemele ce urmeaza a fi rezolvate este iterativitatea, care este procesul prin care rezultatul unei etape de rezolvare poate fi obtinut dupa parcurgerea executiei repetate a unui set de operatii, de fiecare data cu alte valori de intrare. Numarul de iteratii poate fi cunoscut sau necunoscut, dar determinabil (pe baza unor restrictii) pe parcursul executiei. Oricum, asa cum am definit conceptul algoritmic, numarul de iteratii trebuie sa fie întotdeauna finit.

De aici rezulta conc eptul de recursivitate, care reprezinta procesul iterativ prin care valoarea unei variabile se determina pe baza uneia sau mai multora dintre propriile ei valori anterioare. Dupa cum valoarea curenta a variabilei depinde de una sau mai multe valori anterio are, procesul poate fi unirecursiv sau multirecursiv.

Declansarea procesului recursiv presupune: – definirea uneia sau mai multor formule de start; – valoarea initiala a parametrului ce intra în procesul recursiv; – declararea formulei recursive (sau de recurenta); – declararea si/sau restrictionarea numarului de cicli de calcul. Algoritmi aparent banali cum ar fi cel de numarare sau factorialul utilizeaza procesul de recursivitate.

Exemplul 3.1: Redactati o procedura de numarare de la 0 la 1000, fara ca valorile intermediare sa fie pastrate în memorie.

Rezolvare: A numara înseamna a porni de la o valoare initiala, în cazul nostru 00 =V si a aduna o unitate. Etapa urmatoare presupune a adauga o unitate la valoa-rea calculata si tot asa un numar finit de pasi, pâna când rezulta valoarea finala ,1000=fV sau prin declararea executiei aplicatiei pe parcursul a 1000 de pasi.

1 0

2 1

3 2

1

1

111

1

1.

i i

n n

V VV VV V

V V

V V

= += += +

= +

= +

LLL

LLL

Page 11: Programare PC

10

În procesul de mai sus se disting: 0 0V = → formula de start 1 1i iV V −= + → formula de recurenta pentru 1, .i 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:

0V = → formula de start 1V V= + → formula de recurenta pentru 1, .i n=

Exemplul 3.2: Pentru calculul factorialului lui n, n! este necesara a fi cunoscuta valoarea initiala, în cazul nostru 10 =P si numarul n de iteratii:

0

1 0 0

2 0 1

3 0 2

1( 1)( 2)( 3)

PP P PP P PP P P

== += += +

0 1

0 1

..............( )

( )i i

n n

P P i P

P P n P−

= += +

Sub aspectul redactarii algoritmului, scrierea simplificata va fi:

0 1P = → formula de start 0 1( ) iP P i P−= + → formula recursiva pentru .,1 ni =

Page 12: Programare PC

11

4. Reprezentarea algoritmilor prin scheme logice (organigrame).

Logica programarii a demonstrat ca în procesul de initiere, dar si în urmarirea etapelor, reprezentarea algoritmilor în forma de scheme sau grafuri logice este foarte ilustrativa.

Un graf neorientat G este definit prin perechea ),( EVG = unde V este o multime nevida de elemente numite vârfuri (vertex), iar E este o submultime (care poate fi si vida) de perechi neordonate cu componente distincte ale lui V care se numesc muchii (edges). Daca E este multimea vida, spunem ca G este trivial.

În cazul în care multimea V este finita spunem ca graful este finit. Daca ,Ee∈ ,),( vv uue == se spune ca muchia e are ca extremitati u, v sau ca muchia e este determinata

de vârfurile u si v, respectiv ,Eu ∈v adica u, v sunt incidente cu muchia e. Fie grafurile ),,( iii EVG = .2,1=i 2G este un subgraf al grafului 1G daca 12 VV ⊂ si .12 EE ⊂ Daca 2G

este un subgraf al lui 21, GG este un graf partial al lui ,1G daca .12 VV = Un graf orientat se mai numeste digraf . El este o structura ),,( EVD = unde V este o multime nevida de

obiecte denumite conventional vârfuri, iar E este o multime (posibil si vida) de perechi ordonate cu componente elemente distincte din V. Conventional, elementele multimii E sunt numite arce sau muchii ordonate.

Se numeste graf ponderat o structura ),,,( WEV unde ),( EVG = este un graf, iar W este o functie, ).,0(: ∞→EW Functia W este numita pondere si poate asocia fiecarei muchii a grafului o durata, un cost, un

câstig etc. al parcurgerii ei. Reprezentarea grafica a unui graf este considerata cea mai ilustrativa (fig. 4.1 si fig. 4.2). Fiecare vârf este figurat printr-un punct, respectiv muchiile sunt reprezentate prin segmente de arc sau

dreapta orientate (digrafuri) sau neorientate si etichetate (cazul grafurilor ponderate) sau neponderate, având ca extremitati punctele corespunzatoare vârfurilor care le determina.

Exemple

1. Fie ),( EVG = un graf cu },7,6,5,4,3,2,1{=V )}.6,5)(5,4(),6,3(),4,2(),6,1(),3,1(),2,1{(=E Reprezentarea grafului G se da în figura 4.1. 2. Fie ),( EVD = un digraf, cu }6,5,4,3,2,1{=V si )}.5,4(),5,3(),4,2(),3,1(),2,1{(=E Reprezentarea digrafului D se da în figura 4.2.

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

Page 13: Programare PC

12

O alta modalitate de reprezentare este cea prin matrice de alternanta. Daca ),( EVG = este un graf (sau digraf) cu ,|| uV = atunci matricea de adiacenta })1,0({nxnMA∈ are componentele:

= ,altfel,0

),(daca,1 Ea ji

ijvv

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

În cazul unui graf neorientat matricea de adiacenta este simetrica, adica ,,1,)( nji =∀ jiij aa = (perechile de vârfuri care caracterizeaza muchiile sunt neordonate, deci daca ,Eu ∈v atunci si ),Eu ∈v spre deosebire de cazul unui digraf în care este posibil ca ,), Eji ∈v(v dar ,), Eij ∉v(v cu alte cuvinte .jiij aa ≠

Spre ilustrare, pentru exemplele din figurile 4.1 si 4.2 matricele de adiacenta au formele de mai jos:

0 1 1 0 0 1 01 0 0 1 0 0 01 0 0 0 0 1 00 1 0 0 1 0 00 0 0 1 0 1 01 0 1 0 1 0 00 0 0 0 0 0 0

A

=

pentru graful din figura 4.1 si, respectiv,

0 1 1 0 0 0 00 0 0 1 0 0 00 0 0 0 1 0 00 0 0 0 1 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 0

A

=

pentru digraful din figura 4.2. Una dintre cele mai importante proprietati ale grafurilor o constituie posibilitatea de accesare, prin

intermediul unei secvente de muchii (arce, cai), a oricarui vârf al grafului plecând dintr-un vârf dat, proprietate numita si conexitate sau conexiune.

Fie nuuu ,,,: 10 KΓ un drum în graful ).,( EVG = Γ este un drum închis daca .0 nuu = În caz contrar, Γ se numeste drum deschis. Drumul Γ este elementar daca oricare doua vârfuri din Γ sunt distincte, cu exceptia, eventual, a extremitatilor. Drumul Γ este proces daca, pentru orice ,10 −≤≠≤ nji .11 ++ ≠ jjii uuuu Orice drum elementar este un proces.

Un arbore orientat este un arbore directionat si cu radacina. Este un caz particular de digraf. În afara de reprezentarile uzuale ale grafurilor despre care am mai discutat si ale caror reguli se extind si la arbori, una dintre cele mai eficiente modalitati de analiza a sa este reprezentarea TATA-FIU-FRATE, care consta în numerotarea conventionala a vârfurilor grafului si în retinerea, pentru fiecare vârf i al arborelui a urmatoarelor informatii:

– FIU (i) – reprezinta numarul atasat primului descendent al vârfului i; – FRATE (i) – reprezinta numarul atasat vârfului descendent al tatalui vârfului i si care urmeaza imediat lui

i; – INF (i) – reprezinta informatia atasata vârfului i (de regula valoarea lui i). Pentru reprezentarea arborelui se retine radacina si numarul nodur ilor. Absenta „fiului”, respectiv a „fratelui” unui vârf este marcata printr-o valoare diferita de numerele atasate

vârfurilor (de obicei valoarea 0). Exemplu:

Arborele alaturat este un arbore orientat cu N = 12 noduri, cu o radacina );1( =R FIU = (2, 0, 0, 5, 0, 7, 8, 0, 10, 0, 0) „fiul” lui 1 este 2, „fiul” lui 2 este 5, „fiul” lui 3 este 7 etc. FRATE = (0, 3, 4, 0, 6, 0, 0, 9, 0, 11, 12) „fratele” lui 3 este 4, iar fratele lui 11 este 12.

Page 14: Programare PC

13

Cele mai uzuale reguli de parcurgere a arborilor orientati sunt: 1. parcurgerea în A – preordine care presupune initial vârful curent ca fiind radacina arborelui si se

identifica descendentii lui (drumuri sau alte conexiuni arborescente) pâna la ultima „ramura” a arborelui. 2. parcurgerea în A – postordine care presupune vizitarea arborelui de la ultima ramificatie spre „centrul”

arborelui, spre radacina. 3. parcurgerea pe niveluri care presupune vizitarea arborelui (de sus în jos sau de jos în sus) în functie de

nivelurile de structurare a informatiilor. Schemele logice sunt grafuri orientate în care arcele au în vârfuri blocuri logice. Într-un astfel de graf sunt

admise urmatoarele categorii de blocuri (instructiuni) 1) Blocul START în care nu pot sosi arce; este simbolizat conventional ca mai jos:

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

Orice schema logica poate avea mai multe arce finale. Acestea indica oprirea logica a executiei algoritmului.

3) Blocul CITESTE – eticheteaza un arc ce indica citirea unor valori de la mediul de intrare a unei secvente de valori, denumite date de intrare. Cuvântul CITESTE este însotit de variabilele ce descriu datele de intrare:

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

5) Blocul de atribuire este un arc etichetat cu informatia: evaluarea unei expresii e si înscrierea (atribuirea) rezultatului în locatia de memorie corespun-zatoare unui parametru v, conventional reprezentata într-una din formele de mai jos:

e=v sau e←v sau e → v

6) Blocul de ramificare (selectie) este caracterizat prin n arce care pleaca din acelasi punct, arce etichetate cu predicatele nppp ,,, 21 K definite astfel încât:

1p or 2p or … or =np TRUE (adevarat) si

ip and =jp FALSE (fals) pentru oricare ,ji ≠ nji ,1, = sau:

1p or 2p or … or 1=np

ip and ,0=jp ,)( ji ≠∀ .,1, nji =

În fapt, doar unul din predicate poate fi satisfacut (adevarat):

Page 15: Programare PC

14

Pentru cazul 2=n se poate scrie echivalent:

sau

Definitie: Se numeste schema logica un graf orientat în care: a) exista un singur bloc START si cel putin un bloc STOP; b) orice vârf (diferit de extremitatea finala a unui bloc START) este extremitatea initiala a unui unic bloc; c) orice arc este etichetat cu unul din blocurile: START, STOP, CITESTE, SCRIE, atribuire, un predicat (în

acest din urma caz extremitatea initiala a arcului coincide cu extremitatea initiala a unui bloc de ramificatie; d) pentru orice arc exista cel putin un drum care începe cu bloc START, se termina cu un bloc STOP si

contine arcul considerat. Definitie: Se numeste subschema logica un graf orientat în care: a) exista un unic vârf initial (în care nu sosesc arce) si un vârf final (din care nu pleaca arce); b) oricare arc este etichetat cu una din urmatoarele informatii: START sau STOP; CITESTE, SCRIE,

atribuire, un predicat (bloc de ramificatie); c) daca subschema contine blocul START (STOP), atunci extremitatea initiala/finala a blocului este chiar

vârful initial/final; d) orice arc face parte din cel putin un drum care uneste vârful initial cu cel final. Structurile fundamentale care fac parte din schemele logice sunt urmatoarele: a) structura secventiala – formata din arce conectate, etichetate cu blocuri distincte de cea de ramificare

(fig. 4.3).

Figura 4.3. Structura secventiala.

b) Structuri decizionale (alternative) – contin, obligatoriu, cel putin un predicat si cel putin un bloc functional (altul decât START sau ramificativ). Structurile decizionale sunt de urmatoarele forme (fig. 5.6):

– IF (α; a, b) – Daca α atunci executa a altfel b (fig. 5.6,a) – IF (α; a) – Daca α atunci executa a (fig. 5.6,b); – CASE ).,,,;,,,( 2121 nn aaappp KK Daca 1p atunci executa ,1a daca 2p atunci executa ,,2 Ka daca np

atunci executa na (fig. 5.6,c).

Page 16: Programare PC

15

Figura 5.6. Structuri decizionale.

c) Structuri repetitive, denumite si structuri de tip ciclu sau structuri iterative, contin obligatoriu un bloc predicativ si un bloc functional care se executa de un numar finit de ori pâna când predicatul îsi schimba valoarea. Structurile repetitive sunt de urmatoarele forme:

– WHILE (α; a) – cât timp conditia α este adevarata se executa a, apoi se continua cu urmatorul bloc sau cu urmatoarea instructiune (fig. 5.7,a; ciclu cu test initial);

– REPEAT (α; a) – Repeta a pâna când conditia α este adevarata, apoi executa instructiunea urmatoare (fig. 5.7,b; ciclu cu test final);

– FOR (α; a, b, c) este o structura repetitiva similara cu WHILE alcatuita din trei blocuri cu urmatoarele roluri:

– blocul a este un bloc functional de initializare; – blocul b descrie instructiunea/instructiunile ce urmeaza a se executa când conditia α este adevarata; – blocul c descrie actualizarea starilor variabilelor programului cu rol deosebit în evaluarea conditiei α (fig.

5.7,c; ciclu cu contor).

Figura 5.7. Structuri repetitive.

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

Page 17: Programare PC

16

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:

Page 18: Programare PC

17

procedure nume )]a,,a,p[(a n21 K function nume )g,,g,f(g m21 K

/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;

naaa ,,, 21 K− 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;

mggg ,,, 21 K− 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.

Page 19: Programare PC

18

Ilustrare comparativa a structurilor fundamentale

Structura seventiala (liniara). Este ilustrata în figura 5.1.

Figura 5.1. Structura secventiala.

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

Figura 5.2. Structuri alternative.

Page 20: Programare PC

19

Programarea structurata accepta ca echivalente structurile IF –THEN–ELSE cu IF–ELSE

Structuri repetitive. Câteva exemple sunt reprezentate în figura 5.3.

Figura 5.3. Structuri repetitive.

Page 21: Programare PC

20

6. Structuri elementare de date

Tipuri de date. Caracteristici

De modul în care sunt structurate datele, depinde eficient a algoritmilor de prelucrare. O colectie de date pe care s-a evidentiat un anumit mod de structurare si s-au stabilit procedee de înregistrare/identificare a componentelor se numeste structura de date. Ea este o entitate de sine statatoare, identificabila prin nume ale carei componente îsi mentin tipul (proprietatile). Selectarea componentelor unei structuri de date se poate realiza folosind identificatori asociati acestora, caz în care vorbim de accesul prin nume sau prin pozitia pe care o ocupa în structura, în ordinea specificata de algoritm.

Identificatorul este un nume care se asociaza datei cu ajutorul caruia aceasta se poate distinge de alte date si la care se poate face referire în procesele de prelucrare.

Data care pastreaza aceeasi valoare pe tot parcursul prelucrarii se numeste constanta. În caz contrar, data se numeste variabila. Ele pot fi enumerate sau indicate printr-o proprietate comuna.

Atributele precizeaza proprietati ale datei si ele determina modul în care aceasta va fi tratata în procesul de prelucrare. Tipul datei, domeniul de valori, modul de reprezentare în sistemul de calcul, precizia reprezentarii, valoarea initiala etc., sunt atribute.

Datele pot fi elementare sau structuri (substructuri) de date. Pentru o data elementara trebuie specificate: – un identificator; – atribute; – valorile datei.

Din punct de vedere al domeniului de valori asociat unei date se disting urmatoarele clase: – date de tip integer (numere întregi); – date de tip real sau float (cu elemente din multimea numerelor reale sau în reprezentarea cu virgula

mobila); – date de tip boolean (se refera la valorile logice de adevar true/false); – date de tip char sau string (date elementare de tip alfanumeric); – date de tip array (structura de date de tip tablou matricial, care ocupa locatii succesive în memoria

sistemului de calcul, identificabile prin pozitie); – date de tip record sau file (structura cu componente diverse, identificabile prin nume) Exemplu:

…………………… integer n, m, k, x real a, b, y, aux string nume, facultatea, functia, curs boolean y, z array a (n, m), b (m), x (n) ……………………

Cu urmatoarele explicatii: n, m, k – sunt variabile simple de tip întreg; x – este variabila indexata si are n elemente de tip întreg; a – este variabila indexata cu doi indici si are mn ∗ elemente de tip real; b – este variabila indexata si are un element de tip real; y, aux – sunt variabile simple de tip real;

Page 22: Programare PC

21

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.

Page 23: Programare PC

22

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).

Page 24: Programare PC

23

Figura 5.12.

unde: * este elementul de legatura spre elementul succesor; # este elementul de legatura spre elementul predecesor.

La acest tip de lista fiecare element pastreaza legatura, respectiv contine informatii de legatura catre ambii vecini (predecesor/succesor).

c) lista circulara (fig. 5.13). O lista circulara este o lista în care, dupa ultimul nod, urmeaza primul si fiecare element din lista pastreaza

informatii despre câte un „vecin”.

Figura 5.13.

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

Figura 5.14.

Operatii curente care se fac în liste sunt: – inserarea unui nod; – stergerea unui nod; – concatenarea unor liste; – numararea elementelor unei liste; – etc. Implementarea unei liste se poate face în doua moduri: – implementarea secventiala, în locatii succesive de memorie, respectând ordinea nodurilor listei. Aceas ta

metodologie are avantajul unui acces rapid la traseul nodurilor si gasirea rapida a primului/ultimului nod. Ca dezavantaje se disting inserarea/stergerea relativ dificila a unui nod si pe de alta parte neutilizarea întregii memorii alocate listei.

Page 25: Programare PC

24

– implementarea înlantuita (cazul listelor dublu înlantuite) are avantajul ca alocarea memoriei fiecarui nod se face în mod dinamic, în timpul rularii programului. Accesul la un nod necesita parcurgerea tuturor predecesorilor sai, deci un timp mai îndelungat; în schimb inserarea/stergerea unui nod este foarte rapida.

În tabelul 5.2 se prezinta o comparatie sintetica între stive si liste

� Coada (queue) Utilizând o structura de date de tip lista simpla, prin aplicarea operatiei de introducere de elemente de

informatie doar la unul dintre capete si aplicarea operatiei de extragere doar la celalalt capat, obtinem o coada sau o structura de tip FIFO (First In-First Out – primul intrat, primul iesit).

Tabelul 5.2 Comparatie sintetica între stive si liste

VECTORI (STIV E) LISTE

� fiecare element poate fi utilizat (si accesat) prin apelul la indexul sau;

� pentru a utiliza un element se pleaca de la un element cunoscut (ex: de la radacina) si se urmeaza legaturile

� se aloca static � se aloca dinamic

� dimensiunea este cunoscuta din etapa elaborarii programului

� dimensiunea unei liste se stabileste în momentul executiei, programul construind si distrugând dinamic elementele listei

� se stocheaza ca succesiune de octeti

� se pastreaza în memorie sub forma de variabile de înregistrare alocate dinamic, fiind suficient a fi cunoscuta adresa radacinii pentru a se identifica ulterior orice element

Analize algoritmice în pseudocod

În cele ce urmeaza vom dezvolta algoritmic câteva probleme tipice pentru fixarea notiunilor prezentate în paragrafele anterioare.

Înmultirea a doua numere „a la russe” Aceasta metoda presupune scrierea deînmultitului si înmultitorului în doua coloane alaturate. Se împarte

deînmultitul la 2, succesiv, ignorând fractiile, pâna când numarul de sub deînmultit este 1. În acelasi timp, se înmulteste înmultitorul cu 2 atâtea etape câte au fost necesare împartirii deînmultitului pentru a ajunge la valoarea 1. În coloana a treia se trec valorile înmultitorului multiplicat cu 2 corespunzatoare rubricilor în care în coloana deînmultitului sunt numere impare, inclusiv cea corespunzatoare valorii 1. Cifrele din coloana a treia se aduna iar rezultatul este chiar produsul celor doua numere.

Sa exemplificam prin înmultirea 54 × 21; avem:

54 21 –

27 42 42

13 84 84

6 168 –

3 336 336

1 672 672

REZULTAT: 1134

Page 26: Programare PC

25

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

Page 27: Programare PC

26

Operatii de manipulare a stivelor

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

Figura 5.15. Ilustrarea încarcarii stivei.

O procedura de verificare a stivei, daca mai poate accepta noi date este cea de mai jos. procedure insert (G, N, ps, t) integer N, ps, t array G(N) if ps<N

then ←ps ps+1 ←G(ps) t return end

else write ’stiva plina’;

end

Procedura de mai sus verifica daca stiva mai accepta elemente de introdus în ea. În mod similar se poate elabora un algoritm de extragere a elementelor si verificarea daca în stiva mai exista sau nu elemente:

procedure extract (G, N, ps, t) integer N, ps, t array G(N) if ps>0

then ←t G(ps) ←ps ps-1

return end

else write ’stiva goala’

end

Page 28: Programare PC

27

7.Medii de programare. Caracteristici. Generalitati

Conceptul de programare este indisolubil legat de evolutia suportului hardware, precum si de memoria unor aplicatii tot mai complexe, care sa poata furniza date sau decizii optime într-un timp de prelucrare cât mai redus.

A decide care limbaj de programare este mai bun decât altul este ca si cum am statua ca o piesa muzicala de Brahms este mai buna decât un automobil ecologic. Fiec are limbaj (mediu) de programare are destinatia sa preponderenta spre un domeniu de aplicatii sau altul iar comparatiile care s-ar putea face ar fi între o versiune sau alta ale aceluiasi tip de mediu de operare (ce îmbunatatiri, ce instructiuni noi au aparut, ce alte instructiuni considerate statistic neutilizate au disparut, ce utilitati grafice au aparut etc.).

Oricum, în jurul anilor 60 ai secolul trecut ca urmare a dezvoltarii oarecum necontrolate a programelor cod-masina, dar mai ales a depanarii post-elaborare extrem de dificila s-au impus standarde si norme comune astfel încât un depanator sa poata întelege logica de calcul pe care o avusese primul proiectant sau ultimul depanator al proiectului respectiv. Astfel, s-au statuat primele elemente ale programarii structurate, care de altfel reprezinta „o filosofie ce declara ca programele ar trebui scrise într-un mod ordonat, fara multe salturi înainte si înapoi” (Greedy).

Programarea structurata include urmatoarele trei elemente fundamentale: – secventa; – decizia (sau selectia); – bucla (denumita si repetitie sau iteratie). Limbajele de programare bazate pe programarea structurata se numesc si limbaje procedurale sau

algoritmice, destinate descrierii algoritmilor de rezolvare a problemelor sub forma unor succesiuni de instructiuni. Ele mai sunt denumite si limbaje universale, nefiind limitate la o clasa particulara de probleme.

Înainte de a analiza câteva tipuri uzuale de limbaje de programare, se cuvine a face o incursiune în evolutia acestora. Scopul principal al acestui demers este de a vedea de unde s-a pornit si cum a evoluat gândirea logica al carei deziderat este obtinerea unui/unor suporti software apropiati de natura umana atât în elaborare, cât si în optimizare, în decizie sau în inteligenta artificiala.

Evolutia limbajelor de programare

Dupa cum s-a mentionat în capitolele anterioare un limbaj de programare reprezinta o notatie conventionala prin care este descris un proces de calcul si care împreuna cu un set de date concrete pot fi prelucrate de calculator.

Limbajele în cod-masina au constituit prima generatie de limbaje de programare. Dezavantajele principale în utilizarea uzuala de catre programatori erau:

– necesitatea descompunerii problemei de rezolvat în operatii elementare, constituind mii de instructiuni în cod numeric, alocari de adrese de memorie a acestora si a datelor;

– rata mare a erorilor; – dependenta de un anumit tip de calculator; – dimensiune mare a programelor; – productivitate scazuta.

Page 29: Programare PC

28

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.

Page 30: Programare PC

29

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.

Page 31: Programare PC

30

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.

Page 32: Programare PC

31

Despre o filosofie a programarii

Programarea structurala, denumita si programare dirijata de prelucrari are ca reprezentant cunoscutul Pascal, limbaj de programare dotat cu un compilator destul de eficient pentru anii ’70, din secolul trecut care poate prelucra cele trei constructii fundamentale despre care am facut referire mai înainte si anume:

– secventa; – decizia; – bucla. La scurt timp de la lansarea sa, Pascal va avea un competitor de marca, limbajul C, mediu de programare

eficient cu multiple valente, care în scurt timp va acapara procente serioase din piata mediilor de dezvoltare. Initial, limbajul C a fost elaborat ca extensie a sistemului de operare UNIX. Scopul principal al nasterii limbajului C a fost evitarea programarii greoaie în limbaj de asamblare (limbaj de nivel jos) si, pe de-alta parte, elaborarea unei platforme de programe structurata (limbaj de nivel înalt), fiind cunoscut astazi ca limbaj înalt de nivel jos.

Astfel, majoritatea aplicatiilor sunt scrise în C (sau C++), spre deosebire de trecut când erau scrise în limbaj de asamblare. Avantajul usurintei de programare în C++ sunt evidente, cu atât mai mult cu cât volumul de comenzi este redus.

Succesorul limbajului C a fost C++, un limbaj similar cu precedentul, dar cu facilitati de programare orientata spre obiecte.

Practic, spre sfârsitul anilor ’70 din secolul trecut program area dirijata de prelucrari devenise greoaie si uneori ineficienta. Adeseori, o modificare minora în structura datelor sau în script putea ridica probleme serioase de prelucrare.

Problemele mentionate pot fi evitate sau reduse prin încapsularea datelor si a procedurilor într-o entitate numita obiect . Accesul la date sau proceduri se realizeaza prin intermediul unor operatii, care constituie interfata obiectului. Procedurile care realizeaza interfata unui obiect se numesc metode. Obiectul este apelat de o cerere pe care o poate executa, o poate realiza sau o poate transmite altui obiect. Observam ca se opereaza cu entitati iar programarea devine dirijata de date si nu de prelucrarile care trebuie realizate.

Un limbaj de programare orientat pe obiecte se carac terizeaza prin: – identitate; – clasificare; – polimorfism; – mostenire; – încapsulare. Identitatea este legata de faptul ca datele sunt cuantificate în entitati discrete si distincte (obiecte). Un obiect

poate fi concret sau conceptual (virtual). Fiecare obiect poseda propria sa identitate si este caracterizat prin proprietatile (atributele) sale: nume, dimensiune, eticheta etc.

Clasificarea presupune ca obiectele au aceeasi structura sau aceleasi atribute precum si acelasi comportament (aceleasi operatii) si toate sunt grupate în clase. Fiecare clasa descrie un ansamblu de obiecte individuale. O clasa are un identificator (un nume) si câmpuri membre.

Polimorfismul reprezinta capacitatea unui obiect de a-si modifica forma, precum si capacitatea ca aceeasi operatie sa se comporte diferit asupra unor clase diferite.

Mostenirea permite partajarea atributelor si operatiilor comune între clase, pastrând, în acelasi timp, diferentele. Astfel, o clasa poate fi rafinata în sub-clase din ce în ce mai fine. Fiecare sub-clasa mosteneste toate proprietatile clasei sale si adauga propriile sale proprietati.

Page 33: Programare PC

32

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.

Page 34: Programare PC

33

8. Limbajele Pascal, C si C++

Consideratii generale

Limbajele de programare Pascal si C au fost create aproximativ în aceeasi perioada; o diferenta de un an le desparte unul de celalalt. Limbajul Pascal a fost creat de profesorul Miklaus Wirth de la Universitatea Tehnica din Zurich, în 1968 si a fost destinat îndeosebi scopului didactic fiind deosebit de util pentru învatarea principiilor programarii structurate. De altfel, cu toate ca a cunoscut un succes în mediile universitare si, mai recent, în mediile preuniversitare, el a fost limitat la aceste sfere, foarte putini programatori profesionisti acceptând sa-l foloseasca în sfera tehnica sau de afaceri.

Spre deosebire de Pascal, limbajul C a fost creat ca o completare a sistemului de operare Unix devenind la scurta vreme un mediu de programe de sine statator adaptabil si recognoscibil de o multitudine de sisteme de operare (inclusiv Windows sau Linux). Asa cum s-a mentionat în capitolul precedent, limbajul C a capatat o dubla conotatie de limbaj înalt de nivel jos în conexiune cu limbajul de asamblare, dar si valente de sine statatoare de limbaj de programare de nivel înalt prin perfectionarea sa în versiunile C++ si/sau Visual C++.

Întrucât limbajele C++ si Pascal au aparut cam în acelasi timp, în cadrul acestui capitol se va face mereu o comparatie între cele doua limbaje, fara a dori sa scoatem în evidenta superioritatea sau avantajele unuia fata de celalalt.

Limbajele de programare de nivel înalt au la baza un vocabular si o sintaxa. Vocabularul contine cele mai simple elemente cu semnificatie lingvistica numite si entitati lexicale. Sintaxa este formata dintr-un ansamblu de reguli referitoare la modul de combinare logica a elementelor de vocabular

pentru a obtine mesaje corecte alcatuite din instructiuni, definitii de tipuri de date si de date propriu-zise, etichete, declaratii si definitii de proceduri sau de functii etc.

Cele mai simple unitati lexicale sunt alcatuite din caractere ASCII imprimabile si acestea sunt: – simbolurile speciale; – identificatorii; – literalele; – etichetele; – comentari ile; – directivele de compilare. Simbolurile speciale sunt de doua categorii: – simbolurile propriu-zise;

– cuvinte-cheie rezervate.

� Cuvinte-cheie în limbajul Pascal:

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

Page 35: Programare PC

34

� Cuvinte-cheie definite pe standardul ANSI1 C

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

� Cuvinte cheie suplimentare în limbajul C++

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

Identificatorii sunt nume asociate datelor si tipurilor acestora, proceduri, functii, fisiere, unit -uri alcatuite

din caractere alfanumerice în care primul simbol obligatoriu este o litera si nu cifre (v. exemplul). Spre deosebire de Pascal, în care nu se face distinctie între majuscule si minuscule, la limbajul C aceasta distinctie exista, astfel „Ion” sau „ION” nu sunt diferite pentru Pascal, dar pentru C reprezinta identificatori diferiti. Exemple:

În limbaj Pascal În limbaj C

Corect Incorect Corect Incorect FLORIN1 17Flavius florin14 58albastru

FLORIN Ura! M_Ion a…54X cartea_mare cartea…mare teoretic excelent!

Numarul maxim de caractere ale unui identificator luate în consideratie de compilatorul Pascal este de 63 de

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

identificator si toate caracterele sunt semnificative.

1 ANSI – acronim pentru American National Standard Institute. Exista mai multe comisii care stabilesc standarde ANSI pentru

definirea limbajelor destinate calculatorului.

Page 36: Programare PC

35

Literalele reprezinta forma de reprezentare a valorii datelor într-un format inteligent acceptat de utilizator/programator si de calculator. Ele sunt de doua tipuri:

– numerice; – alfanumerice. Literalele numerice pot fi: – întregi; – reale. Exemple de literale întregi: 381; – 732 – numere întregi în reprezentare zecimala; $4D; – $72F1 – numere întregi în reprezentare hexazecimala.

Literalele flotante reprezinta numere rationale, formate din trei elemente:

– partea întreaga – partea fractionara

care alcatuiesc mantisa,

– exponent

Exprimarea literalelor flotante este de tipul: mantisa E exponent

Iata câteva exemple: 3.54 E – 7 – 4.51 E + 2 0.784 E 3

Literalele booleene sunt TRUE si FALSE, care, desi nu sunt cuvinte rezervate ale limbajului Pascal, nu pot fi folosite ca identificatori. Spre deosebire de Pascal, în care acestea au semnificatie logica, pentru limbajul C aceste elemente trebuie definite în context.

Literalele alfanumerice sau literalele caracter pot fi alcatuite dintr-un caracter sau o secventa de caractere marcate la extremitati, astfel:

Pascal ’Opera ”Oedip Rege” este interesanta’

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

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

Comentariile sunt siruri de caractere în care programatorul poate introduce titluri, comentarii personale, detalii de programare etc. Ele au doar rol informativ si pot lua una din încadrarile de mai jos:

Page 37: Programare PC

36

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

constante # define declaratii constante

Type typedef definire tip; declaratii tipuri declaratii variabile;

Var

Zona declarativa

declaratii variabile void main ( ) begin

instructiune 1 instructiune 2 .............. instructiune n

{ instructiune 1 instructiune 2 .............. instructiune k }

Corpul programului

end

Tipuri de date

Tipuri de date standard

Indiferent daca este vorba de constante sau variabile, datele standard se pot clasifica în sase tipuri de baza: – tipul întreg (numere întregi); – tipul real (numere reale); – tipul alfanumeric (sir de caractere); – tipul boolean sau logic (existent în limbajul Pascal, iar în C trebuie definit explicit); – tipul pointer;

Page 38: Programare PC

37

– 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]

Tip Dimensiune aproximativa în biti

Domeniu minimal de valori

char 8 de la –127 la 127

unsigned char 8 de la 0 la 255

signed char 8 de la –127 la 127

int 16 de la –32767 la 32767

unsigned int 16 de la 0 la 65535

signed int 16 similar cu int

short int 16 similar cu int

unsigned short int 16 de la 0 la 65535

signed short int 16 similar cu short int

long int 32 de la –2.147.483.647 la 2.147.483.647

signed long int 32 similar cu long int

unsigned long int 32 de la 0 la 4.294.967.295

float 32 sase zecimale exacte

double 64 zece zecimale exacte

long double 80 zece zecimale exacte

Definirea constantelor se face conform sintaxei de mai jos: Pascal

const nume_const = valoare;

C # define nume_const valoare

În mod similar, definirea variabilelor respecta sintaxa urmatoare: var nume_variabila: tip_variabila; tip_variabila nume_variabila;

Exemple de definire de date standard:

Pascal C++ a : Boolean; bool a; b : Real; double b;

c : Char; char c; d : Integer; int d; volum : array [1…10] of integer int volum [11];

în care a este o marime logica, b este o data reala, c un caracter, d o marime întreaga iar volum un sir de date întregi. De remarcat faptul ca la siruri în limbajul C se porneste numararea elementelor de la 0. Astfel, pentru

Page 39: Programare PC

38

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}

Page 40: Programare PC

39

Tipul interval (subdomeniu)

Acest tip este caracteristic limbajului Pascal si este o parte a unui tip ordinal deja definit. Obligatoriu se vor preciza limitele inferioara si superioara ale subdomeniului dupa urmatoarea sintaxa:

type sd_1 = min 1… max 1; sd_2 = min 2…max 2; ................... sd_n = min n…max n;

Exemple: type

vara = iun…aug; alfabet = ’a’…’z’

Operatori

Expresiile algoritmetice reprezinta modalitatea de prelucrare a variabilelor prin utilizarea operatorilor. Acestia din urma sunt de urmatoarele tipuri:

– aritmetici; – logici; – relationali; – de tip sir; – operatii la nivel de bit; – de tip multime; – de tip adresa. Cei mai uzuali operatori pentru limbajele C++ si Pascal sunt prezentati în tabelul 8.2

Tabelul 8.2 Operatori uzuali

Pascal C++ Descrierea operatiei + + adunare

– – scadere

/ / împartire * * înmultire

MOD % restul împartirii

: = = atribuire

Exemplu de utilizare a operatorului atribuire:

Pascal Marius := 25: C

Marius = 25

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

Page 41: Programare PC

218

Pascal x = x + 1 y = y – 1

C x + + 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

Page 42: Programare PC

40

Exemple: Pascal C not true → false not false → true

!(0) → 1 not logic !(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: 3 6 | 7

36înbinar7înbinar

ORasuprabi tilorrezultat

1 0 0 1 0 00 0 0 1 1 1|1 0 0 1 1 1

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: 3 6 ^ 7

36înbinar7înbinar

XORasuprabi tilorrezultat

1 0 0 1 0 00 0 0 1 1 1

^1 0 0 0 1 1

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.

Page 43: Programare PC

41

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; Ana; Maria

Ion; Ana; Maria;

Page 44: Programare PC

42

Î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; b = a > 10 ? 73 : 540;

este similar cu a scrie a = 15 if a > 10 b=73 else b=540

Instructiuni Instructiuni I/O de date si instructiuni de atribuire

Pentru a fi mai plastici, în abordarea acestui subiect vom pleca de la un exemplu în care dorim sa citim date si, respectiv, sa tiparim datele citite. Tiparirea implicita se face direct pe monitorul calculatorului, daca nu se precizeaza altfel.

Fie urmatoarele definitii de date (în cele doua limbaje analizate comparativ):

Variabila Pascal C Valoarea

m1 Char char M m2 String [8] char [9] Albastru a1 Integer int 2003 a2 Char char A a3 Real float 74.32

Observatie: marimile m2 si a2 au în limbajul C un caracter suplimentar caruia i se aloca valoarea [0] si semnifica terminatia dimensiunii, asa cum am precizat într-un paragraf anterior:

Pascal program citire-scriere;

var m1: char; m2: string [8]; a1 : integer; a2 : char; a3 : real;

begin

readln (a1, m2);

readln (a2, a3, m1);

writeln (a1, m2);

writeln (a2, a3, m1);

end.

Page 45: Programare PC

43

C // citire-scriere # include <stdio.h)> char m1, m2 [7], a2; float a3; int a1; {

scanf (”% d % s”, & a1,

& m2); scanf (”% c % f % s”, & a2,

& a3 & m1); printf (”\n d% c”, a1, m2); printf (”\n % c % f % c”, a2,

a3, m1); }

Rezultatul va fi

2003 Albastru

iar pe urmatorul rând A 74.32 M

În aplicatia de mai jos se da schema logica si programul de calculare a TVA în limbaj Pascal.

Aplicatie SCHEMA LOGICA A PROGRAMULUI TVA. PAS

Const

Tva=19/10; Var Pu, C, Pt1, TVA1 : Real; I, Nrciclu:Integer;

begin readln (Nrciclu); For I:=1to Nrciclu do

begin Writeln (’Introduceti pretul unitar’);

readln (Pu); Writeln (’Introduceti cantitatea’);

readln (C); Pt1:= Pu*C; TVA1:= Pt1*Tva;

Writeln (’Pretul total al produselor cumparate este’, Pt1); Writeln (’TVA este’, TVA1);

end; end.

* Pu = pretul unitar al produsului; C = cantitate; Pt1 = pretul total; Tva1 = TVA-ul platit; Tva ‚ cota de TVA

Page 46: Programare PC

44

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 %

Page 47: Programare PC

45

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> void main (void) { double a; a = 43.727528; printf (”% f \ n”, a); printf (”% 012 f \ n”, a); printf (” \ na = % f”, a); }

Rezultatul programului va fi: 43. 7275280 0043. 7275280 a = 43. 7275280

Instructiuni de atribuire

Sintaxa instructiunilor de atribuire este:

Pascal C variabila := expresie;

variabila = 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 then instructiune 1

else instructiune 2;

if (conditie) instructiune 1; else

instructiune 2; sau if conditie

then instructiune if (conditie)

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.

Page 48: Programare PC

46

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 of

val 1: instructiune 1;

val 2: instructiune 2;

............... val n:

instructiune n; end.

Page 49: Programare PC

47

C switch (expresie) { case

val 1: instructiune 1; break;

case

val 2: instructiune 2; break; ....................

.... case

val n: instructiune n, break; default: // este optional instructiune implicita; break; }

Exemple : Pascal

case ch of ’A’ : Add ( ); ’D’ : Delete (

); ’M’ : Modify (

); ’Q’ : ; {nu

face nimic} end;

C switch (ch): of { case ’A’ :

Add ( ); break;

case ’D’ : Delete ( ); break;

case ’M’ : Modify ( ); break;

case ’Q’ : break; // nu

face nimic }

Page 50: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

48

c) Instructiuni repetitive

� Instructiunea while Sintaxa generala este urmatoarea:

Pascal C while conditie do instructiune;

while (conditie) instructiune;

Exemple :

Pascal C a : = 0; while (a < 30) do a: = a + 1;

a = 0; while (a < 30) 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

instructiune 1; instructiune 2; ............... instructiune n;

until conditie;

do { instructiune

} while (conditie); //instructiunea poate fi simpla sau un

set de instructiuni.

Pascal

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

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

Page 51: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

49

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

{unde n2 > n1} do begin instructiune {pasul = 1} {executia buclei in mod

crescator} end

for (i = 0; i < n; i++ { instructiuni }

� bucla de executie descrescatoare for i:= a1 downto a2

{unde a2 < a1} do begin instructiune {pasul = –1} {executia buclei in mod

descrescator} end

for (a = 0; i > a; i–– { instructiuni }

� bucla de executie implicita for v : = m1 to m2

do begin instructiune end

for (initializare, conditie, increment) { instructiuni }

Î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];

Page 52: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

50

salnet [k] = salbrut [k] – 23.33/100 * salbrut [k] – 7/100 * salbrut [k] –7/100 * salbrut [k] – 11.67/100 * salbrut [k]– 1/100 * salbrut[k]– 5/100 * salbrut [k] – 2/100 * salbrut [k]– 0.75/10 0 * salbrut [k]; cout << ”salariatul ”<<k>>” are salariul net ”<<salnet [k] <<’\n’; }

void main ( ) { int l;

clrscr ( ); cout <<”introduceti nr de ore pentru cei cinci angajati”<<’\n’; for (int m = 0; m<5; m++) cin>>nrore [m]; clrscr ( ); cout<<”introduceti plata pe ora pentru cei cinci angajati ”<<’\n’; for (int j = 0; j<5; j++) cin>>priceora [j]; clrscr ( ); cout<<’\n’<<”daca vreti sa aflati salariul pentru un singur salariat”<<’\n’<< ”apasati nr de ordine dorit intre 0 si 5: ”<<’\n’<<\n’<<”daca doriti salariul pentru toti angajatii ”<<’\n’ <<” apasati un nr mai mare de 5”<<’\n’; cin>>l; if (l>=0&&l<5) {clrscr ( ); calculsalariunet (l); } else { clrscr ( ); for (int o=0; o<5; o++) calculsalariunet (o); }

}

d) Instructiunea break-continue

Aceasta instructiune exista doar pentru limbajul C si nu în Pascal. Ea functioneaza cu for si realizeaza bucle scurte de verificare conectate cu instructiuni if, dupa care trece la restul executiei programului.

Sintaxa generala este: for (i = 0, i < n; i ++) {

if (a [i] < 0) break; // Inchiderea buclei if (a [i] = = 0) continue; // Continua cu urmatorul i v = a [i]; // daca s-a atins prima valoare pozitiva a[i] > 0 instructiuni

}

Page 53: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

51

Proceduri si functii. Subprograme

Asa cum se preciza în capitolele anterioare un subprogram descrie un subalgoritm al unei probleme, elaborat într-un limbaj de programare care are proprietatea ca prin apelare unica sau multipla sa eficientizeze programul central sau un alt subprogram denumit program apelant.

Subprogramul poate fi privit ca o unitate separata de program care poate fi apelata de o alta unitate de program si se mai numeste program apelat.

Caracteristicile subprogramelor: a) Subprogramul se defineste o singura data si poate fi apelat de mai multe ori. b) Definitia subprogramului se face în termeni generali utilizând pentru aceasta parametri formali.

O parte dintre parametrii formali au semnificatia de date de intrare în subprogram iar cealalta parte alcatuieste datele de iesire din subprogram.

La apelarea subprogramului, programul apelant trebuie sa ofere parametrii actuali care înlocuiesc parametrii formali si care trebuie sa fie de acelasi tip si aceeasi ordine de definire în ambele unitati de program.

Acolo unde este posibil se recomanda utilizarea subprogramelor care au rolul: – sa simplifice activitatea de programare; – sa reduca complexitatea programelor. Procedurile si functiile sunt subprograme. Diferenta dintre cele doua categorii de subprograme

rezida în numarul valorilor returnate programului apelant. Astfel, – procedura calculeaza si returneaza oricâte valori implicite sau explicite; – functia calculeaza si returneaza întotdeauna o singura valoare de tipul specificat în programul

apelant. Limbajul C nu face diferente de denumire, astfel încât procedurile sunt tratate tot ca functii, dar

declansarea acesteia se face cu void marcând existenta unei functii-program, iar returnarea este alcatuita din date multiple prin comanda return.

Sintaxa generala este: Pascal C � procedura � functie-subprogram procedure nume

(arg1:integer;arg2:char); ... begin ... end;

void nume (int art1,char art2)

{ ... }

� functie � functie propriu-zisa

Page 54: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

52

function nume (arg1,arg2:integer):real;

... begin ... nume: = expresie; end;

double nume (int arg1, int arg 2)

{ return expresie; }

� element procedural rapid if (conditie) return ...

Sub aspectul plasarii acestora în ansamblul codului-sursa (a programului) vom descrie întâi aspecte legate de limbajul Pascal.

Program denumire; declaratii de date; Procedure nume (parametrii ...); declaratii de parametri; begin

instructiune1; ... instructiune k;

end; {Programul principal} begin

instructiune p1; ... instructiune pk; nume (parametri...); {apelarea procedurii} instructiune pk+1; ... instructiune pm

end. În aplicatia de mai jos se prezinta un program redactat în Pascal pentru calculul consumului de

benzina Aplicatie

Program Consum Benzina; {BENZREC.PAS} USES Crt,Inform;

TYPE Datarec=RECORD

Datum: String[10]; Cant: Real; Km: Integer;

END; arttyp = (load,save);

Page 55: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

53

VAR data: Array[1…100] Of datarec; fis: File Of datarec; nume fis: String; medie: Array [1..100] Of Real; canttot.medietot: Real: totalkm, numar,I: Integer; aleg: Char;

(*$I BENZIN.INC*) (*$I MEDIE.INC*) (*$I OUTMENU.INC*) (*$I FILCHECK.INC*) (*$I SAVEBENZ.INC*) (*$I LOADBENZ.INC*) (*$I BENZMENU.INC*)

BEGIN ClrScr; Numar = 0; REPEAT

Window(1,1,80,25) ClrScr; Menu;

UNTIL aleg = #27; END

PROCEDURE Introd; {BENZIN.INC} VAR

taste: Char BEGIN

ClrScr; WriteLn(‘Creare fisier nou <1>’); WriteLn(‘Continuare fisier <0>’); taste: ReadKey; IF taste = ’1’ THEN numar: = 0; ClrScr; REPEAT

Inc(numar); WITH data[numar] DO BEGIN

WRITE(^j^m,numar:3,’: Data (Intrerupere cu <x>):’); datum: = ReadDatum if datum <>’x’ THEN BEGIN WriteLn; Write(‘ cant in 1:‘); Cant: = ReadReal(4) Write(‘ Kilometri ‘); km:=ReadInt(3)

Page 56: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

54

END; END;

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

END;

PROCEDURE CalculMedie; {MEDIE.INC} BEGIN

canttot: = 0; totalkm: = 0; FOR i: = 0 TO numar DO

WITH data[i] DO BEGIN Medie[i]: = cant/km*100; canttot: = canttot+cant; totalkm: = totalkm+km,

END; medietot: = canttot/totalkm*100;

END;

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

taste: Char; ad: Text;

BEGIN Window(1,1,80,25); ClrScr; Assign(ad, device); ReWrite(ad); WriteLn(ad’ Calcul consum de benzina litri la 100 Km ‘) WriteLn(ad’ Data Litri Kilometri Consum 1/100 Km ‘); WriteLn(ad’ ‘); FOR i: = 1 TO 50 DO Write(ad’-‘); WriteLn(ad); FOR i: = 1 TO NUMAR DO

With DATA[i] DO WriteLn(ad’ ‘,datum:8, cant:8:2,km:10,medie[i]:14:1);

Write(ad’ ‘); FOR i: = 1 TO 50 DO Write(ad’-‘); WriteLn(ad); WriteLn(ad,’ Total: ‘, canttot:8:2, totalkm:10, medietot:14:1); Close(ad); Write(^j’<RETURN>)’) taste: = ReadKey

END

Page 57: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

55

PROCEDURE AfisMenu; {OUTMENU.INC}

VAR

taste: Char; BEGIN

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

END; Apelul unei functii în Pascal respecta urmatoarea sintaxa:

Program denumire; declaratii de date Function nume (parametri): tip; declaratii de parametri begin

instructiune 1 ... instructiune n

end; {Programul principal}

begin instructiune p1 ... instructiune pk {Ex: S = nume*m} ... instructiune pm

end.

Întâlnirea unui apel al unei functii sau proceduri pe parcursul executiei programului suspenda temporar pe aceasta si executa prelucrarea subprogramului apelat pâna la atingerea instructiunii end; abia apoi se trece din nou la prelucrarea în continuare a programului principal.

Corespondenta între programul principal si subprogram se realizeaza prin parametrii situati în aceeasi pozitie între cele doua liste si de acelasi tip.

Spre deosebire de cele de mai sus, în limbajul C, o functie trebuie declarata înainte de a fi apelata. Declararea se face la începutul scriptului si se mai numeste prototipul functiei. Desi, spre deosebire de Pascal, plasarea functiei poate sa aiba loc oriunde în script aceasta trebuie sa fie pozitionata înaintea primei apelari a acesteia. Totusi, pentru eleganta în programare, recomandam plasarea dupa declararea datelor principale ale programului central.

Page 58: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

56

Sintaxa generala este urmatoarea: double functie (int art1,intart2);//Prototipul functiei int main ( ) { double x; ... x = functie (5000,16); ... } ...

//Revenire la programul principal

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

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

Unit, header, pre -procesor

Unit reprezinta o entitate, un program de dimensiuni reduse (64 Ko) caracteristic limbajului Pascal. Unit-urile pot fi subprograme deja testate, organizate sub forma de biblioteci-utilizator.

Sintaxa generala este:

uses unit_1, unit_2, ..., unit k;

Extensia unit-urilor este .TPU (Turbo Pascal Unit). Utilizatorul poate utiliza oricâte unit-uri are nevoie pentru executia programului central.

Unit-urile pot fi de doua categorii: – unit-uri standard stocate în biblioteca limbajului; – unit-uri utilizator stocate în biblioteci-utilizator. Unit-urile standard sunt reduse ca numar si acestea sunt:

system – contine toate procedurile si functiile de baza Pascal, precum si un set de parametri predefiniti. Acest unit este încorporat în mediul Pascal si nu necesita actiunea comenzii uses, utilizarea sa fiind implicita;

dos – contine proceduri si functii echivalente cu comenzile sistemului de operare MS-DOS. Utilizarea sa se face cu actionarea comenzii uses;

overlay – care permite folosirea tehnicii de segmentare si de apelare a unit-urilor doar la comanda a programelor foarte mari si de a le executa „bucata cu bucata”, astfel încât programul sa functioneze ca un tot (overlay);

crt – unit legat de folosirea ecranului în mod text, citirea tastaturii, generarea sunetelor; printer – contine variabila predefinita lst de tip text care la initializare asigneaza imprimanta LPT1 si o

acceseaza pentru scriere. graph – contine elemente si subprograme pentru folosirea ecranului în mod grafic.

Page 59: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

57

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].

Page 60: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

58

9. Programarea orientata spre obiecte la limbajele Pascal si C

Programarea orientata spre obiecte este legata atât de conceptul de abstractizare a datelor, cât si de abstractizarea procedurilor de prelucrare a datelor. În esenta programarea orientata spre obiecte reprezinta un concept filosofic si o tehnica de regrupare a datelor, a fisierelor si a entitatilor de prelucrare (programe, subprograme) pe baza anumitor criterii. Privita sub acest aspect, practic orice limbaj de programare modern are calitati de programare orientata spre obiecte.

Un obiect constituie un modul de program care descrie caracteristicile si comportamentul unei entitati conceptuale sau fizice ce intervine în sistemul implementarii de program [23]. El este alcatuit din date care descriu caracteristicile entitatii si din metode care îi descriu comportamentul.

Un limbaj cu caracteristici de programare orientata spre obiecte trebuie sa ofere mecanisme pentru urmatoarele operatii:

a) încapsularea; b) mostenirea; c) polimorfismul metodelor.

Asupra celor de mai sus nu vom insista întrucât principiile generale au fost descrise în capitolul

anterior. Un program orientat spre obiecte (OOP – Object Oriented Programming) are putine date

globale, iar blocurilor logice de tip algoritmic le iau locul clasele si obiectele.

În conceptia lui Booch [38], OOP este o metoda de implementare în care programele sunt

organizate ca si colectii de obiecte ce coopereaza între ele, fiecare obiect reprezentând instanta unei

clase; fiecare clasa apartine unei ierarhii de clase, clasele fiind unite prin relatii de mostenire.

Practic, avem de-a face cu macroalgoritmi care opereaza cu obiecte, care la rândul lor constituie

instanta unei clase, care are calitati comune cu o alta datorita proprietatilor de mostenire.

Un limbaj de programare care ofera suport pentru utilizarea claselor si obiectelor dar care nu are

implementat mecanismul relatiilor de mostenire între clase este un limbaj bazat pe obiecte iar

programarea bazata pe clase si pe obiecte, care nu face uz de relatia de mostenire se mai numeste

programare cu tipuri de date abstracte.

Clasele si obiectele grupate si stocate într-o forma fizica alcatuiesc module. Modulele formeaza

arhitectura fizica a programului. Conceptul de modularizare reprezinta posibilitatea divizarii

programului într-un numar de subansamble (module) care pot fi compilate separat, dar care sunt cuplate

între ele.

Modularizarea respecta câteva reguli generale, si anume:

1. Structura fiecarui modul trebuie sa fie suficient de simpla pentru a putea fi complet înteleasa;

2. Implementarea unui modul trebuie sa depinda doar de interfetele altor module;

3. Detaliile sistemului, care se presupune ca vor suferi modificari indepen-dente, vor fi plasate în

module diferite;

4. Singurele legaturi între module vor fi acelea a caror modificare este improbabila;

Page 61: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

59

5. Orice structura de date este încapsulata într-un modul; ea poate fi accesata direct din interiorul

modulului, dar nu poate fi accesata din afara modulului decât prin intermediul obiectelor si claselor

continute în acel modul.

Caracteristici OOP la limbajul Pascal

Începând cu versiunea 5.5. a limbajului Turbo Pascal s-a introdus tipul obiect (object) Sintaxa generala este urmatoarea:

type numeob = object camp_1: tip_1; camp_2: tip_2; ... camp_n: tip_n; procedure nume p[(p1, p2, ..., pn)];[virtual;] function nume f[(f1, f2, ..., fn)]: tip;[virtual;] constructor nume c [(c1, c2, ..., cp)]; destructor nume d[(d1, 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;

Page 62: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

60

– 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; p 2. init; p 1. insert(20); x:=p1.urm;

sau

with p1 do

begin init; insert(10); 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.

Page 63: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

61

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;

Page 64: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

62

crt: = cap end; function A1. prim:integer; begin

crt: = crt ^.next; urm : = crt ^.val

end; procedure A1. insert (n:integer); begin

while crt ^. val 0 do crt: = crt ^.next; crt ^. val: = n; new: = crt ^.next; crt: = crt ^.next; crt ^. val: =0; crt ^. next =nil

end; destructor A1.term; begin

crt: = cap; while cap nil do

begin cap: = crt ^. next; dispose (crt); crt: = cap end

end; end;

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

Caracteristici OOP la limbajul C++

Dupa cum s-a mentionat într-un capitol anterior, de-a lungul timpului s-au conturat trei mari familii de limbaje orientate spre obiecte; astfel astazi se deosebesc :

– limbaje de clase; – limbaje de cadre (frames); – limbaje de tip actor. Limbajul C++ apartine familiei limbajelor de clase. O clasa este un tip de date care descrie un ansamblu de obiecte cu aceeasi structura si acelasi

comportament. Clasele pot fi îmbogatite si completate pentru a defini noi familii de obiecte. Principiile de mostenire si încapsulare sunt similare cu cele prezente în paragraful anterior.

O clasa poate contine atât sectiuni particulare, cât si publice. Implicit, toate elementele definite într-o clasa sunt particulare si, deci, o functie care nu face parte din acea clasa nu poate avea acces la ele.

Page 65: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

63

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

{ date si functii private

specificator_acces: date si functii publice

specificator_acces : date si functii protejate ...

specificator_acces: date si functii } lista de obiecte

sau într-o forma simplificata:

class nume_clasa { ... declaratii variabile membre ... declaratii functii membre ... }

Lista de obiecte poate fi optionala. Daca este prezenta, în ea sunt declarate obiecte ale clasei. Specificatorii de acces constituie cuvinte cheie care definesc clasele. Acestea pot fi de tip public,

private si protected. Datele si functiile publice pe care le contine clasa sunt cunoscute prin proprietati si metode.

Metodele care caracterizeaza functiile publice se mai numesc si functii de interfata. Exemplu:

class facultate { public :

facultate (char * specializare) {str cpy (Facultate: : specilizare, specializare);}; void arata_specializare (void) {cout <<specializare<<endl;};

protected float taxa; void arata_taxa (void) {cout <<taxa<<endl;};

private char nume_student [40] char prenume_student [40] };

Operatorul „::” este specific limbajului C ++ si este denumit operator de rezolutie sau operator de acces sau de domeniu. El permite accesul la un identificator, dintr-un bloc sau în care acesta nu este vizibil datorita unei alte declaratii locale.

Page 66: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

64

În exemplul de mai sus, obiectele derivate din clasa facultate pot accesa membrii taxa si arata_taxa ca si cum ar fi publici. În afara de obiectele derivate, programul trebuie sa trateze membrii protejati ca si cum ar fi privati.

Asa cum se poate observa, fata de limbajul C ++ limbajul Pascal nu poseda conceptul de clasa, ci doar de obiect (object) ca entitate abstracta alcatuita din date si metode. În C ++ entitatea-obiect este extinsa spre clase, tipuri de clase si familii de clase, termenul fiind mai cuprinzator si mai sugestiv.

Notiunea de clasa devine astfel o generalizare a notiunii de structura de date care descrie un ansamblu de obiecte similare. Astfel, un obiect este instantierea unei clase.

Un mesaj trimis unui obiect este compus din trei elemente: a) numele obiectului care contine metoda; b) numele metodei; c) valori pentru toti parametrii de intrare ai metodei (daca aceasta are parametri de intrare). Cu alte cuvinte o clasa este schema dupa care este creat un obiect. În interiorul acesteia sunt

precizate denumirile tuturor variabilelor si tipurile de date pe care acestea le vor stoca alaturi de toate operatiile (metodele) pe care un obiect, construit din respectiva clasa, le va contine.

Operatia prin care este creat un obiect, dupa schema precizata de o clasa, se numeste instantiere, iar obiectul creat dupa planul oferit de o clasa este o instanta a acelei clase.

Ordinea de lucru în OOP este urmatoarea:

A. Crearea claselor, care cuprinde: – precizarea denumirii variabilelor, a tipurilor acestora (standard sau derivat), a domeniului de

vizibilitate (public, private, protected); – precizarea signaturii metodelor componente (denumirea, definirea parametrilor de intrare si

de iesire), a corpului programului (codul care descrie comportamentul metodei), domeniului de vizibilitate precum si alte proprietati care concura la definirea metodei orientate obiect.

B. Crearea obiectelor prin specificarea clasei dupa al carui model a fost creat obiectul respectiv si prin asignarea de valori variabilelor precizate la definitia clasei.

Precizam ca doar în momentul instantierii unei clase, care marcheaza nasterea unui obiect, se aloca în memorie variabilele definite de clasa si care pot fi ulterior prelucrate de catre metode.

În figura 7.3. este prezentat un exemplu de mostenire a claselor, care, dupa cum se vede este posibila pe diverse nivele2.

Figura. 7.3. Mostenirea claselor.

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

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

instantierii rezulta un obiect.

Page 67: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

65

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.

Page 68: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

66

Daca o clasa nu dispune de constructori/destructori, compilatorul C++ genereaza automat un constructor, respectiv un destructor implicit.

Exemplu:

Dune :: Dune ( ) // constructor implicit {

x = 0; y = 0;

} Dune :: Dune (unsigned X, unsigned Y) {

x = X; y = Y;

} Dune::~Dune( ) { }

Pe de alta parte, mai înainte s-a mentionat ca una din caracteristicile claselor este încapsularea. Aceasta caracteristica nu poate fi respectata întotdeauna. În acest sens exista în limbajul C++ un concept de declarare a claselor ca fiind prietene. Acest concept desi încalca principiul de încapsulare rezolva situatiile particulare. Se recomanda, totusi ca folosirea sa sa fie facuta cu prudenta.

Mecanismul friend (= prieten) a aparut datorita imposibilitatii ca o metoda sa fie membru a mai multor clase.

Functiile prietene reprezinta functii care nu sunt metode ale unei clase, dar care au totusi acces la membrii privati ai acesteia. Orice functie poate fi prietena unei clase, daca a fost astfel declarata, indiferent de natura acesteia.

Sintaxa declararii unei functii prietene este: friend Nume_functie

si nu are nici o importanta în cadrul carei sectiuni este declarata functia prietena. Exemplu:

class Dune {

friend unsigned long Traiectorie (unsigned x, unsigned y); public: friend unsigned long Arakis ::Traiectorie

(unsigned x, unsigned y); ... }

unsigned long Traiectorie (unsigned x, unsigned y); {

return x * y unsigned long Arakis ::Traiectorie (unsigned x, unsigned y);

{ ...

Page 69: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

67

}

Î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; };

Page 70: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

68

10. Limbajul de programare Visual Basic

Elementele limbajului Visual Basic. Caracteristici generale

Visual Basic a fost lansat în ultimul deceniu (dupa 1990) al secolului trecut de catre firma Microsoft si reprezinta o varianta perfectionata a limbajului BASIC (Begiuner’s All-Purpose Symbolic Instruction Code care în traducere libera este similar cu codul instructiunilor simbolice de uz general pentru începatori).

Termenul „Visual” este legat de posibilitatea proiectarii unei interfete grafice cu utilizatorul (GUI).

Versiuni simplificate sau derivate ale limbajului Visual Basic sunt Visual Basic for Applications (VBA) si Visual Basic Scripting (VBScript) care sunt suporti de dezvoltare a multor aplicatii din Windows sau MS Office. Principiile de programare si de dezvoltare sunt similare pentru întreaga familie Visual Basic.

Caracteristicile generale ale limbajului Visual Basic sunt urmatoarele: – este un mediu integrat de dezvoltare (IDE), deoarece integreaza functiile de proiectare,

editare text, compilare si depanare în cadrul unui mediu comun; – este un limbaj interactiv, întrucât Visual Basic interpreteaza on-line fiecare cuvânt pe masura

ce este introdus de la tastatura, propunând si cuvinte-instructiuni existente în biblioteca proprie de functii, recunoscând cuvinte-cheie si compilând partial codul. Cu ajutorul acestei facilitati multe erori de redactare îsi diminueaza frecventa de aparitie;

– combina elemente de programare orientata pe obiecte cu elemente de programare orientata pe evenimente;

– are capacitatea de a recunoaste si de a interactiona cu o paleta larga de fisiere de date sau construite de sisteme de gestiune a bazelor de date (SGBD-uri) cum ar fi: Microsoft Access, dBase, FoxPro si Visual Fox Pro, Paradox, SQL Server etc;

– permite accesul la documente si aplicatii INTERNET sau INTRANET. Mediul integrat de dezvoltare Visual Basic (IDE) contine urmatoarele elemente (fig. 10.1): � Bara cu meniuri – contine elementele standard ale unei aplicatii Windows si anume File, Edit,

View, Windows, Help, precum si meniuri specifice programarii în Visual Basic (Project, Format, Debug etc.);

Page 71: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

69

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

Fereastra Form Layout Fereastra Form Designer Fereastra Properties

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

� Toolbar (Bara cu instrumente) – permite accesul rapid bazat pe icon-uri la comenzile uzuale în

Windows (deschidere de fisier, salvare, tiparire, copiere etc.); � Toolbox (Cutia cu instrumente) – contine un set de instrumente cu ajutorul carora se pot

configura controale pe formular; � Meniuri contextuale – contin comenzi rapide pentru actiuni frecvente. Activarea lor se

realizeaza actionând click-dreapta pe mouse. � Fereastra Object Explorer – afiseaza formularele, modulele si fisierele continute de proiectul

curent, precum si intercorelarea între aceste categorii; � Fereastra Properties – afiseaza si permite configurarea rapida a proprietatilor pentru formularul

sau controlul selectat; � Fereastra Form Designer – afiseaza un formular gol (planseta de lucru) pe care

utilizatorul/dezvoltatorul îl poate personaliza adaugând controale, etichete, imagini etc.; � Fereastra Code Editor – este editorul de text în care se înscrie codul aplicativ pentru formular

sau pentru controalele inserate, gradul de subordonare, logica aplicatiei etc. (fig. 10.2); � Fereastra Object Browser – afiseaza obiectele disponibile în proiect, precum si proprietatile,

metodele si evenimentele obiectului curent selectat (fig. 10.3). Visual Basic are calitati de programare orientata spre obiecte îmbinate cu calitati de programare

pe evenimente bazate pe o interfata grafica usor de configurat.

Page 72: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

70

Figura 10.2. Fereastra Code Editor.

Figura 10.3. Object Browser.

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

Page 73: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

71

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.

Page 74: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

72

Tabelul 10.1

OBIECT PREFIX EXEMPLU

Forma frm frm Initiala

Buton de comanda cmd, btn cmd Citeste

Eticheta lbl lbl Dorinta

Caset a de text txt txt Legenda

Meniu mnu mnu Meniu

Buton de optiune opt opt Tiparire

Caseta de validare chk chk Verificare

Caseta de imagine pic, img pic Peisaj

Caseta cu lista lst lst Candidati

Caseta cu lista combinata cbo cbo Grupe

Caseta cu lista fisierelor fil fil Fisiere

Cadru fra fra Cadru

Bara de derulare verticala vsb vsb Dimensiune

Bara de derulare orizontala osb osb Distanta Sintaxa generala de declarare a unui obiect este:

Obiect.Proprietate = Variabila

Numele procedurilor, variabilelor si constantelor declarate în Visual Basic (prescurtat: VB) trebuie sa respecte câteva reguli fara de care pot fi generate erori la compilare. Acestea sunt destinate procedurilor Sub si Function, variabile, constante si orice alt parametru cu rol de obiect, si anume:

– trebuie sa înceapa cu o litera; – nu pot contine simbolul punct în interiorul lor sau caractere declarative de tip (caractere speciale

care definesc un tip de data); – nu pot fi mai lungi de 255 caractere. Controalele, formularele, clasele si modulele nu pot avea

nume mai lungi de 40 caractere; – nu pot avea aceleasi nume cu cuvintele-cheie. Exemple: Nume: identificatorul obiectului respectiv; Format: specifica formatul de afisare; Status Bar: corespunde mesajului ce va fi afisat în bara de stare atunci când cursorul este

pozitionat pe caseta de text; Visible: poate avea valoarea True sau False în cazul în care se doreste ca obiectul sa fie vizibil,

respectiv, invizibil; Locked: poate interzice accesul la continutul controlului sau nu, prin marcarea true, respectiv,

false; Scroll Bar: adauga bare de defilare; Left, Top, Width, Height: precizeaza pozitia pe ecran în cadrul formei obiectului;

Font Color: precizeaza culoarea fonturilor; Back Color: culoarea fundalului.

Page 75: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

73

Metode

Metodele au sintaxa generala: [Object]. Metoda [lista-parametri]

În momentul redactarii metodei VB activeaza sistemul de asistenta care ofera portofoliul de metode existente în biblioteca de obiecte (Object Browser).

Pentru a afisa biblioteca de obiecte se selecteaza din meniul View comanda Object Browser. Exemplu:

Private Sub Form_Load( ) Command 1. Caption = „OK” Command 1. Visible = True Command 1. Top = 2000 Command 1. Left = 5000 Command 1. Enabled = True

End Sub

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

Evenimente

Un eveniment este raspunsul unui obiect la o actiune a utilizatorului sau la o actiune a programului.

Pentru un eveniment sau mai precis pentru producerea sa trebuie scrise linii de program. Visual Basic pune la dispozitia utilizatorului informatii despre proprietatile, metodele si

evenimentele obiectelor prin intermediul bibliotecii de obiecte. Pentru a obtine informatii despre evenimentele unui anumit obiect, se selecteaza obiectul

respectiv din cadrul listei Classes si apoi se selecteaza evenimentul din partea dreapta a ferestrei bibliotecii de obiecte.

În fereastra de editare a codului este afisat un sablon pentru procedura eveniment.

Etapele proiectarii unei aplicatii în Visual Basic

Proiectarea unei aplicatii în Visual Basic cuprinde urmatoarele etape: 1. Definirea aplicatiei de rezolvat; 2. Proiectarea interfetei grafice cu utilizatorul; 3. Stabilirea proprietatilor; 4. Scrierea codului (liniilor de program); 5. Rularea aplicatiei; 6. Salvarea proiectului.

Page 76: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

74

Proiectarea interfetei cu utilizatorul În Visual Basic, interfata cu utilizatorul este alcatuita din: – formulare (forms); – obiecte (objects).

� Formulare Formularul este principalul element al interfetei grafice cu utilizatorul. Un formular reprezinta o

zona rectangulara pe care se pot amplasa obiectele. Pe ecran pot aparea una sau mai multe forme (fig. 10.5).

Exista doua stiluri de interfete: – interfata tip document sin-gular (SDI – Singular

Document Interface) – interfata tip document multiplu (MDI –Multiple

Document Interface) Formularele contin obiecte numite comenzi sau

controale (controls). Încarcarea se face prin apelare din meniul File a

comenzii New Project, ocazie cu care apare în mod automat un formular general.

De asemenea, din meniul File se selecteaza New Form sau executând click pe bara de instrumente la New Form.

Atribuirea de proprietati

Proprietatile unui formular definesc caracteristicile fizice ale acestuia: � Caption – stabileste textul care va fi afisat în bara de titlu a formularului; � Icon – stabileste pictograma care va fi afisata atunci când formularul va fi minimizat; � Maxbutton si Minbutton – arata daca formularul poate fi maximizat, respectiv minimizat; � BorderStyle – controleaza comportamentul formularului la redimen-sionare; � Height (înaltime) si Width (latime) – dau dimensiunile formularului; � Left (stânga) si Top (sus) determina dispunerea formularului relativ la coltul din stânga-sus al

ecranului; � WindowState (starea ferestrei) poate fi stabilita astfel încât, la pornire, formularul sa apara în

forma Maximed (maximizata), Minimized (minimizata) sau Normal (normala); � Name – atribuie un nume formularului, nume prin care acesta va fi apelat în cadrul codului

Visual Basic. Observatie. Daca programatorul nu atribuie un nume, formularul va primi valoarea initiala Form

1, Form 2 etc. Pentru fiecare formular dintr-o aplicatie, exista un modul formular asociat (cu extensia .frm) care

contine programul (codul ) sau. Fiecare modul formular cuprinde proceduri eveniment. Acestea sunt sectiuni de program în care

pot fi inserate instructiuni care se vor executa ca raspuns la evenimentele specificate. Formularele pot contine controale, pentru care se redacteaza proceduri în cadrul modului

formular.

Figura 10.5. Formular în Visual Basic.

Page 77: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

75

Î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.

Page 78: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

76

Un control are: Un control dispune de: – forma; – proprietati; – dimensiune; – metode; – culoare – evenimente. – text; – eticheta;

Visual Basic permite sa scrie cod (linii de programe) pentru proprietatile, metodele si evenimentele unui control.

Proprietatile unui control descriu controlul respectiv (dimensiune, culoare). Metodele unui control permit efectuarea unor actiuni asupra controlului, cum ar fi pozitionarea si

redimensionarea. Evenimentele unui control permit scrierea codului pentru a raspunde la o actiune (ex. click cu

mouse-ul sau apasarea unei taste). Proprietati. Odata plasat pe un formular, unui control i se pot modifica proprietatile, i se pot

apela metodele si se poate scrie cod (program) pentru evenimentele sale. Proprietatile unui control pot fi modificate atât în momentul proiectarii, cât si în momentul

executiei. Modificarile se pot face prin cod sau prin fereastra de proprietati. Metode. Fiecare control ofera cel putin o metoda. O metoda este o actiune pe care programul o

poate efectua asupra controlului. Sintaxa de apelare la metoda este:

obiect. metoda

Pentru a afla informatii despre metodele unui control se poate utiliza sistemul de asistenta din Visual Basic (Help) sau se poate apela la biblioteca de obiecte (Object Browser) din Visual Basic, selectând comanda Object Browser din meniul View.

Visual Basic va afisa biblioteca de obiecte, adica proprietatile, metodele si evenimentele unui control. La selectarea unuia dintre obiecte, în partea de jos a ecranului, Visual Basic afiseaza o scurta descriere privind proprietatile obiectului sau posibilitatile de conectare în program etc.

Evenimente. Pe lânga proprietati si metode, majoritatea controalelor au cel putin un eveniment. Pentru un element se poate scrie cod (linii de program).

Pentru a afla informatii despre evenimentele unui control se poate folosi sistemul de asistenta sau biblioteca de obiecte.

Controale de tip buton Visual Basic permite crearea a doua tipuri de controale de tip buton: – butoane de comanda (Command Button ); – butoane imagine (Image Button).

Controale pentru butoane de comanda

Procedura apelata este procedura eveniment Click . Utilizarea butonului de comanda se face pentru a începe, întrerupe sau a sfârsi un proces.

Pentru a adauga butoane de comanda pe un formular se parcurg etapele:

Page 79: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

77

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 tastarea simultana a tastelor (fig. 10.6):

Alt + tasta literei subliniate.

Pentru fiecare formular se recomanda a se proiecta: � un buton implicit de comanda (ENTER) prin

atribuirea valorii True proprietatii Default; � un buton implicit de anulare al formularului (END)

pentru care se atribuie valoarea True proprietatii CANCEL. Când un buton de comanda este activat, proprietatea sa Value are valoarea True, evenimentul

Click al butonului este declansat si este apelat codul scris pentru procedura eveniment Click . Un buton de comanda poate fi perfectionat modificând proprietatea Style alegând între optiunile 0

– Standard si 1 – Graphical si folosind apoi proprietatile Picture, Down Picture si Disabled Picture. În acest fel butonului de comanda i se poate adauga o pictograma sau un bitmap. De asemenea,

imaginea se poate modifica în functie de „starea” butonului „respectiv ne-apasat – apasat.

Controale care afiseaza imagini si grafica

Visual Basic contine patru controale care afiseaza imagini si grafica: � controlul imagine; � controlul forma; � controlul linie; � controlul caseta cu imagini.

Controlul imagine (Image)

Controlul imagine este folosit pentru a afisa pictograme în formate: pictograma, bitmap, metafile, metafile îmbunatatit, .JPEG sau .GIF.

Controlul imagine raspunde la evenimentul Click si poate fi folosit pe post de buton de comanda sau la crearea unei bare de instrumente sau pentru crearea de animatii simple.

O imagine poate fi comprimata astfel încât sa înceapa într-un control imagine. Imaginile pot fi încarcate în controlul imagine:

Tastare Alt+S

Figura 10.6. Posibilitatea obtinerii de comenzi rapide.

Page 80: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

78

� în momentul proiectarii, atribuind proprietatii Picture din cadrul ferestrei de proprietati a controlului un nume de fisier si o cale;

� în momentul executiei proprietatii Picture si a functiei Load Picture. La încarcarea imaginii în controlul imagine, aceasta se redimensioneaza automat pentru a putea

încapea în dimensiunile alocate controlului imagine, în functie de versiunea Visual Basic folosita.

Controlul forma (Shape)

Controlul forma se foloseste la desemnarea unor formate grafice predefinite pe suprafata formularului si nu au alt rol decât de decorativitate, deci nu au atasat nici un eveniment. Formele grafice pot fi:

– dreptunghi; – cerc; – patrat; – dreptunghi cu colturi rotunjite; – oval; – patrat cu colturi rotunjite etc. Pentru fiecare forma desenata pe formular se poate stabili:

– stilul; – culoarea; – stilul de umplere si de linie; – stilul si culoarea chenarului.

prin atribuirea urmatoarelor

proprietati:

� FillStyle si BackStyle ofera diferite stiluri de umplere predefinita (solid, transparent, linie orizontala, linie verticala, diagonala în sus, diagonala în jos, cruce si cruce diagonala);

� BorderStyle are stiluri predefinite privind linia de chenar si anume: transparent, solid, linie, punct, linie-punct, linie-punct-punct si plin;

� BorderColor, BackColor si FillColor permit stabilirea culorilor de chenar si de umplere din paleta de culori;

� Height si Width stabilesc dimensiunile formei. Proprietatile BorderStyle, BorderWidth, FillStyle si DrawMode controleaza modul de desenare

a formei.

Controlul linie (Line)

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

Controlul caseta cu imagine (Picture Box)

Comportamentul casetelor cu imagine este asemanator cu controlul imagine, având în plus si capacitatea de a actiona ca un container pentru celelalte controale si compatibilitatea cu metodele grafice.

Cea mai obisnuita utilizare a unui container de tip caseta cu imagine este o bara cu instrumente sau o bara de stare.

Page 81: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

79

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

Controale pentru afisarea si introducerea textului

Pentru afisarea si introducerea textului, Visual Basic ofera doua tipuri de controale: – controale eticheta; – controale caseta cu text.

� Controale eticheta Un control eticheta afiseaza text care poate fi doar citit, nu si modificat, în mod direct, de catre

utilizator. Textul afisat într-o eticheta este controlat: – în momentul proiectarii, atribuind o valoare proprietatii Caption din fereastra de proprietati a

controlului; lungimea proprietatii Caption este de 1024 octeti; – în momentul executiei prin cod (linii de program). Controlul eticheta este folosit pentru: – a identifica obiectele unui formular; – a afisa informatii ca raspuns la un eveniment sau proces din aplicatie, în momentul executiei; – a identifica controale care nu au proprietati Caption proprie, cum ar fi caseta cu text, casete

lista, casete combinate etc.) – a adauga un text descriptiv la formular; – la crearea tastelor de acces pentru celelalte controale. Atribuirea valorii 1 proprietati BorderStyle creeaza un chenar în jurul etichetei. De asemenea, fondul etichetei, nuanta caracterelor, dimensiunea si tipul fontului pot fi selectate

din proprietatile BackColor, BackStyile, ForeColor si Font. Eticheta poate fi auto-dimensionata cu ajutorul proprietatilor AutoSize si AutoWrap prin

alocarea valorii True. De asemenea, prin Alignament, se poate face alinierea textului la stânga, centrat sau la dreapta

prin selectarea optiunilor Left Justify – 0, Center – 1, Right Justify – 2.

� Controale caseta cu text (Text Box) Controlul Text Box afiseaza text introdus de utilizator. Textul este controlat de proprietatea Text si i se poate atribui o valoare: – în momentul proiectarii prin proprietatea Text din fereastra de proprietati a controlului; – în momentul executiei prin cod; – de catre utilizator, în momentul executiei. În mod implicit, textul introdus în caseta de text poate avea maximum 2048 caractere. Textul dintr-o caseta poate fi modificat (cu exceptia cazului când se atribuie valoarea True

proprietatii Locked), afisat pe mai multe linii, adaptat la dimensiunile controlului si formatat. Aspectul si comportarea unei casete cu text sunt controlate de proprietatile: Multiline si ScrollBars în momentul proiectarii. Un control caseta cu text afiseaza, în mod implicit, o singura linie de text si nu poseda bare de

derulare.

Page 82: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

80

Atribuind valoarea True proprietatii Multiline, o caseta cu text afiseaza mai multe linii de text în momentul executiei, putându-se introduce maximum 32 kiloocteti cu text.

Trecerea de pe o linie pe alta a cuvintelor întregi este executata de proprietatea de împachetare a textului WordWrap (pe care o întâlnim la majoritatea procesoarelor de texte).

Controale care prezinta optiuni pentru utilizator

Exista, de asemenea, mai multe controale standard, cum ar fi: � caseta de validare (Check Box); � controlul buton de optiune (Option Button); � controlul caseta cu lista (ListBox); � controlul caseta combinata (Combo Box).

� Caseta de validare (Check Box) Controlul Caseta de validare îi permite utilizatorului sa aleaga una sau mai multe optiuni si

afiseaza un marcaj de validare când este selectat (fig. 10.7).

Figura 10.7. Utilizarea casetelor de validare Figura 10.8. Utilizarea butoanelor de optiune.

(Check Box).

O caseta de validare arata daca o conditie este îndeplinita sau nu, oferind utilizatorului optiuni de tipul DA/NU, ADEVARAT/FALS.

Întrucât casetele de validare sunt independente unele de altele, utilizatorul poate selecta oricâte casete la un moment dat.

Arareori apare o singura caseta de validare. Cel mai adesea, ele sunt grupate pentru a afisa optiuni multiple, dintre care utilizatorul poate selecta una sau mai multe.

Starea controlului caseta de validare este controlata de proprietatea Value: invalidat (0 – unchecked); validat (1 – checked); indisponibil (2 – Grayed).

Implicit, controlul caseta de validare este în starea invalidat. La executie, utilizatorul poate executa click pe controlul caseta de validare pentru a indica starea de validat sau invalidat.

� Controlul buton de optiune (Option Button) Butoanele de optiune sunt folosite pentru a afisa optiuni, dintre care utilizatorul poate alege una

singura (fig. 10.8). Butoanele de optiune trebuie sa faca parte dintr-un grup, selectarea unui buton de optiune

invalidându-le pe toate celelalte butoane din grup.

Page 83: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

81

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 + ↓).

Selectarea 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;

Page 84: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

82

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

Scrierea codului (liniilor de program)

Codul Visual Basic consta din instructiuni ale limbajului, constante si declaratii. Codul Visual Basic este stocat în trei tipuri de module: – module formular, cu extensia .FRM, contin descrieri textuale ale formularului si controalelor

sale, inclusiv valorile atribuite proprietatilor, proceduri care trateaza evenimentele acelui formular, proceduri generale si declaratii de variabile, constante, tipuri la nivelul modulului;

– module standard, cu extensia .BAS, sunt containere pentru proceduri si declaratii folosite în comun de alte module din cadrul aplicatiei;

– module clasa, cu extensia .CLS, sunt fundamentele programarii orientate pe obiecte din Visual Basic, asemanatoare cu modulele formular, cu deosebirea ca nu poseda o interfata vizibila cu utilizatorul. Modulele clasa pot fi folosite pentru crearea de obiecte noi, inclusiv codul pentru metode si proprietati.

Fiecare modul contine doua parti: – declaratii de variabile, constante, tipuri, proceduri la nivelul întregului modul; – proceduri. O procedura contine portiuni de cod (program) care poate fi executat ca un tot unitar. Pentru scrierea codului de program asociat unui obiect din proiect se apeleaza la fereastra

editorului de Cod (Code Editor) din Visual Basic. Pentru a deschide fereastra Code Editor se executa dublu-click pe formularul sau controlul

respectiv, sau din fereastra Project Explorer se alege numele formularului sau modulului si apoi se selecteaza View Code .

Cantitatea de cod care poate fi încarcata într-un formular, într-o clasa sau într-un modul standard, nu poate depasi 65 534 de linii.

O singura linie de cod poate fi alcatuita din cel mult 1023 octeti. Liniile de cod prea lungi se pot continua pe rândul urmator cu ajutorul liniutei de subliniere –

underline ( _ ). Într-o singura linie de cod nu pot fi introduse mai mult de 25 de caractere underline ( _ ) (de

continuare). Textul propriu-zis al unei linii poate fi precedat de pâna la 256 de caractere de spatiu. Un comentariu trebuie precedat de simbolul apostrof (’). Comentariul poate succede unei instructiuni aflate pe acelasi rând sau poate ocupa tot rândul. Daca pe un rând se doreste a se plasa doua sau mai multe instructiuni, acestea se vor separa prin

caracterul doua puncte (:). Visual Basic ofera doua facilitati de completare automata a codului: AutoList Members si

AutoQuickInfo care sunt accesibile pentru activare sau dezactivare, prin comanda Options din meniul Tools.

Page 85: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

83

Elementele limbajului Visual Basic

Variabile Visual Basic

Asa cum s-a aratat si în capitolele anterioare, o variabila reprezinta o locatie din memoria interna a calculatorului, utilizata pentru stocarea temporara a datelor.

O variabila se caracterizeaza prin urmatoarele atribute: – nume; – tip de date; – domeniu. Numele identifica în mod unic o variabila printre celelalte variabile existente la un moment dat în

memorie. Numele unei variabile trebuie sa respecte urmatoarele reguli: – sa înceapa cu o litera; – sa contina numai litere, cifre si caracterul subliniere; – sa contina cel mult 256 caractere; – sa nu coincida cu cuvinte rezervate ale limbajului Visual Basic (precum Sub sau Function etc.) În tabelul 10.3 se prezinta mai multe tipuri de variabile în Visual Basic.

Tabelul 10.3

TIP (nume) SUFIX DIMENSIUNE ÎN MEMORIE

DOMENIU

Byte fara 1 octet 0 – 255 caractere

Boolean fara 2 octeti True/False; Da/Nu; Pornit/Oprit

Integer % 2 octeti – 32.768 pâna la 32.767

Long (Integer) & 4 octeti – 2.147.483.648 pâna la + 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

Date fara 8 octeti între 1 Ian. 0000 si 31 Dec. 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.

Page 86: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

84

Declararea variabilelor

Sintaxa generala a declararii variabilelor în Visual Basic este: Dim nume_variabila [As tip]

Variabilele declarate prin Dim în cadrul unei proceduri exista atâta timp cât aceasta se executa, dupa care valorile acestora dispar, ceea ce confera un caracter de alocare dinamica a memoriei.

Valorile declarate prin Dim au caracter local acelei proceduri, nefiind permis accesul la ele din cadrul altor proceduri, aceasta fiind un element tipic al programar ii orientate spre obiecte. Aceeasi variabila poate lua denumiri diferite în proceduri diferite fara ca prin aceasta sa apara conflicte de procesare.

Daca însa, o variabila este declarata în sectiunea Declarations a unui modul formular, modul standard sau modul clasa ea va fi vizibila si comuna pentru toate procedurile din modul. În acest caz, nu mai sunt permise redenumiri ale acestor variabile în interiorul procedurilor.

Daca o variabila este declarata prin cuvântul-cheie Public va fi vizibila pentru întreaga aplicatie. De asemenea, daca o variabila este denumita Static valoarea acesteia nu se va mai pierde dupa

încheierea procedurii. Spre deosebire de limbajele analizate anterior a caror structura avea doua sectiuni principale, cea

declarativa si corpul programului, în Visual Basic exista posibilitatea declararii implicite a variabilelor chiar în corpul programului. Cu toate acestea recomandam evitarea acestei facilitati, fie si doar pentru eleganta programarii, dar si pentru usurinta post-depanarii în cazul aparitiei erorilor la rularea aplicatiei.

O mare atentie trebuie acordata denumirii variabilelor private sau publice, al caror nume trebuie sa nu coincida cu numele procedurilor, functiilor sau cuvintelor-cheie. Pentru aceasta, putem spune ca notatia maghiara are un rol salvator si o recomandam a fi utilizata în toate cazurile.

O variabila poate apela si un obiect. Metodologia de declarare are doua etape, si anume: – declararea variabilei ca apartinând categoriei clasa:

Dim variabila As clasa

– asocierea unui obiect: Set variabila = obiect

Sintaxa generala va fi deci: {Dim|Redim|Static|Private|Public} variabila As [New] clasa

Cuvântul cheie New este folosit pentru a genera un nou obiect, definit de clasa sa, instantiind formulare, clase definite în modulele clasa si colectii.

Pentru a utiliza o variabila de un anumit tip, ea trebuie declarata cu una din instructiunile: Private, Public, Dim sau Static utilizând sintaxa:

Instructiune NumeVariabila As Tip Data

Exemplu: Dim Popescu As String

Pentru a crea o variabila, Visual Basic ofera doua posibilitati: – prin utilizarea operatorului de atribuire; – declarând variabilele cu comanda Dim.

Page 87: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

85

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

Exemplu:

Vârsta = 1 Nume = „Ion Popescu”

Tipul de date String (sir de caractere) contine siruri de caractere de lungime variabila. Programatorul poate declara siruri de lungime fixa utilizând sintaxa:

String ∗ dimensiune

� Daca o variabila String de lungime fixa primeste ca valoare un sir de caractere cu o lungime mai mica decât cea declarata, acesta este completat la dreapta cu caracterul spatiu pâna se ajunge la dimensiunea declarata a variabilei.

� Daca variabila String primeste ca valoare un sir mai lung decât lungimea dec larata a variabilei, Visual Basic trunchiaza sirul.

Matrice de variabile

Matricea permite apelarea unei serii de variabile care au acelasi nume si care folosesc un index spre a le deosebi unele de altele.

Toate elementele dintr-o matrice au acelas i tip de date iar matricele au limite inferioare si limite superioare.

În Visual Basic exista doua tipuri de matrice de variabile: – matrice de dimensiune fixa, care ramâne mereu atribuita prin declaratiile initiale la aceeasi

dimensiune; – matrice dinamice a caror dimensiune se poate modifica în timpul executiei programului. Dupa locul în care este declarata, o matrice de dimensiune fixa poate fi: – matrice publica daca este declarata în sectiunea Declarations a unui modul cu instructiunea

Public; – matrice privata daca este declarata Private în sectiunea Declarations; – matrice locala declarata Private în sectiunea Declarations. Exemple:

Dim Matrice (18)As Double Public Tablou (20) As Integr Private Sir (7) As Double

sau cu index declarat de forma: Dim Matrice (1 To 19) as Double Public Tablou (20 To 40) As Integer Private Sir (100 To 107) As Double

Pot fi si situatii în care o matrice de tip Variant sa contina doua sau mai multe matrice cu diverse tipuri de date, cum este în exemplul urmator.

Exemplu: Private Sub Command 1_Click( ) Dim intI As Integer ’Declara variabila contur

Page 88: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

86

’Declara o matrice de întreg Dim Tablou (8) As Double

For intI = 0 To 7 Tablou (intI) = 5

Next intI ’Declara si populeaza o matrice de siruri de caractere Dim Legatura (8) As String

For intI = 0 To 7 Legatura (intI) = ”Salutare”

Dim Arata As Variant ’Declara o noua matrice cu doi membri Arata (1) = Tabloul( ) ’Populeaza matricea cu celelalte matrice Arata (2) = Legatura( ) MsgBox Arata (1)(2) ’Afiseaza cate un membru din fiecare matrice MsgBox Arata (2)(3)

End Sub

Un caz aparte îl reprezinta matricele dinamice. Aceasta situatie apare atunci când nu se cunosc cu precizie dimensiunile acesteia, iar Visual Basic ofera facilitatea de a redimensiona în orice moment, utilizând dinamic memoria. Tipul datelor continute de o matrice dinamica este similar cu al matricelor de variabile.

Declararea are forma implicita iar pe parcursul codului este obligatorie inversarea instructiunii executabile ReDim.

Exemplu: Dim Matrice As Integer Sub Calculeaza( ) ....... ReDim Matrice (20, 40) End Sub

Dupa executia procedurii/aplicatiei matricea dinamica se goleste de date, eliberând memoria. Visual Basic initializeaza valorile astfel:

– Empty (pentru matrice Variant); – 0 (zero, pentru matrice numerice); – siruri de caractere de lungime nula (pentru matrice sir de caractere); – Nothing (pentru matrice de obiecte). Matricea dinamica poate fi redimensionata fara a se pierde datele daca este utilizat cuvântul-cheie

Preserve, care modifica limita superioara a unei matrice multidimensionale:

ReDim Preserve Matrice (UBound (Matrice) + 1)

Matrice multidimensionale Sintaxa de declarare:

Static M1(5,6) As Double

declara o matrice cu doua dimensiuni 6 × 7 în cadrul unei proceduri. Matricele dinamice se declara Public, Static sau Dim si i se da lista dimensiunilor vida:

Page 89: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

87

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

Re Dim Matrice (x, y)

Tipuri de date definite de utilizator (user defined)

Programatorul poate defini propriile tipuri de date utilizând oricare tip fundamental de date din Visual Basic prin declaratii de tip TYPE/END TYPE cu sintaxa:

TYPE tip-nou Var-1 As tip-1 Var-2 As tip-2 .............. END TYPE

Exemplu: a) se defineste tipul de date:

Type STUDENT Marca As Integer Nume As String ∗ 15 Prenume As String ∗ 10 Facultate As String Grupa As String End Type

b) Se declara cu Dim o variabila de acest tip: Dim Stud As Student

c) Se atribuie valori noii variabile: Stud. Marca = InputBox (”Tastati marca:”) Stud. Nume = InputBox (”Tastati numele:”) Stud. Prenume = InputBox (”Tastati prenumele:”) Stud. Facultate = InputBox (”Tastati facultatea:”) Stud. Grupa = InputBox (”Tastati grupa:”)

O metoda de programare mai buna este aceea de a declara variabilele folosind comanda Dim, cu sintaxa:

Dim NumeVariabila 1, NumeVariabila 2… Exemplu:

SubForm1_Load ( ) Dim Varsta, Nume Varsta = 18 Nume = ”Popescu Ion”

End Sub Tipul de date al unei variabile se poate declara în mod implicit sau explicit. Pentru a declara în mod implicit tipul unei variabile se ataseaza numelui acesteia un caracter de

declarare a tipului de date la prima utilizare a variabilei. Exemplu: Vârsta % = 18 Caracterul ”%” utilizat arata ca variabila „Vârsta” este de tip Integer (întreg).

Page 90: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

88

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.

Page 91: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

89

Constante Visual Basic

Constantele pot fi: – intrinseci sau definite de sistem, proprii limbajului Visual Basic si enumerate în cadrul

bibliotecilor de obiecte Visual Basic (VB) si Visual Basic for Application (VBA) din cadrul utilitarului Object Browser.

– simbolice sau definite de utilizator declarate prin instructiunea Const. Sintaxa de declarare este: [Public|Private]Const nume-constanta-expresie

unde: nume-constanta – este un nume simbolic valid (care respecta aceleasi reguli ca pentru formarea

numelui variabilelor); expresie – reprezinta o expresie compusa din constante numerice, siruri de caractere si din

operatori. Exemple:

Const Pi = 3.14 Const Universitate = ”Hyperion” Const AN_NASTERE = 1975 Const DATA_INSCRIERE = # 1/10/2002 #

Domeniul unei constante poate fi prin declarare de tip: – local; – privat (de tip modul); – public (global). Constantele locale sunt definite în cadrul unei proceduri si nu pot fi folosite decât în cadrul

procedurii pentru care au fost declarate. Constante de modul sau private trebuie declarate în sectiunea Declarations a modulului; ele sunt

accesibile tuturor procedurilor dintr-un modul. Constante publice sau globale trebuie declarate în sectiunea Declarations a modulului standard,

iar înaintea cuvântului cheie Const trebuie pus cuvântul cheie Public. Constantele publice sunt accesibile întregii aplicatii. Ele nu pot fi declarate într-un modul formular sau într-un modul clasa.

Concluzii asupra tipurilor de date

Declaratiile tipurilor de date sunt urmatoarele: – Public – vizibila în întreaga aplicatie; – Private – vizibila în modul sau în procedura, dupa caz; – Dim – data cu caracter dinamic vizibila doar în procedura în care a fost declarata; dispare dupa

închiderea procedurii în care a fost declarata; – Static – data a carei valoare nu dispare dupa încheierea procedurii în care a fost declarata. Exista un caz suplimentar, cazul implicit, în care o data declarata ca fiind Variant poate lua

oricare din caracteristicile de mai sus. Utilizarea excesiva a acesteia poate genera ambiguitati de interpretare în compilarea aplicatiei sau alocarile de memorie de tip Variant pot ocupa zone apreciabile, care pot duce la imposibilitatea rularii aplicatiei generate de depasirea de memorie.

Tipurile de date numerice pot fi: – Integer, Long (întreg lung), Single (virgula mobila simpla precizie), Double (virgula mobila în dubla precizie) si Currency (monetar).

Page 92: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

90

Tipul de date Byte este alcatuit din matrice de date binare. Daca variabilele de tip String sunt convertite în formate ANSI sau Unicode, datele binare ale variabilei pot fi modificate; aceasta convertire se poate realiza atunci când:

– se citeste din fisiere; – se scrie în fisiere; – sunt apelate componente DLL; – sunt apelate metode si proprietati ale obiectelor; Variabilele de tip string se pot declara si ca sir de lungime fixa dupa sintaxa:

string ∗ dimensiune

Exemplu: Dim Strada As String ∗ 100

Tipul de date boolean contine doar informatii simple de tipul adevarat/fals, da/nu, pornit/oprit. Tipul de date Date contine informatii temporale de genul data unei zile dintr-un an, ora, ziua din

saptamâna etc. Tipul de date Obiect. Acestea sunt stocate ca adrese pe 32 de biti (4 octeti) si apeleaza obiectele

din cadrul unei aplicatii sau al altor aplicatii. Daca, ulterior este utilizata declaratia Set, variabilelor declarate ca Object li se pot atribui valori care sa apeleze orice obiect recunoscut de aplicatie.

Exemplu: Dim obj Restantieri As Object SEt obj Restantieri = Open Database (”f: \Note\Mate.mdb”)

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

Tabelul 10.4

Functia de conversie Converteste o expresie la tipul

Cbool Boolean

Cbyte Byte

Ccur Currency

Cdate Date

CDbl Double

Cint Integer

CLng Long

CSng Single

CStr String

Cvar Variant

CVErr Error

Page 93: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

91

Operatori Visual Basic

Visual Basic pune la dispozitie patru tipuri de operatori: – aritmetici; – logici; – de comparatie; – de concatenare.

� Operatori aritmetici; acestia sunt:

+ adunare;

– scadere;

* înmultire;

/ (slash) împarte doua numere si prezinta rezultatul sub forma unui numar zecimal;

\ (back slash) împarte doua numere, rezultatul fiind redat sub forma unui numar întreg;

MOD (MODULO) împarte doua numere si retine numai restul împartirii.

^ ridicare la putere.

� Operatori logici (TRUE/FALSE): AND – returneaza valoarea TRUE când toate variabilele din expresie au valoarea TRUE; OR – returneaza valoarea FALSE numai daca variabilele din expresie au valoarea FALSE. Exemplu:

UM = InputBox (”Tastati unitatea de masura”) IF UM = ”kG” OR UM = ”MP” OR UM = ”BUC” THEN PRINT ”UNITATEA DE MASURA ESTE CORECTA” END IF

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

FALSE

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

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

� Operatori de comparatie Acesti operatori compara doua numere sau doua siruri de caractere si returneaza valoarea TRUE

sau FALSE

< mai mic;

< = mai mic sau egal;

> mai mare;

> = mai mare sau egal;

= egal;

< > diferit.

Page 94: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

92

Exemplu de comparare a doua siruri de caractere: „informatica” = „informatica” returneaza valoarea TRUE : „informatica” = „INFORMATICA” returneaza valoarea FALSE ; „INFORMATICA” < > „INFORMATICA” returneaza valoarea FALSE.

� Operatori de concatenare – operatorul +, care necesita conversia variabilei numerice în sir, cu ajutorul functiei Cstr

(numar); – operatorul &, care forteaza ca o variabila sa devina de tipul adecvat.

Functii

O functie, asa cum s-a precizat si în capitolele anterioare, efectueaza o anumita sarcina în VB si returneaza o valoare.

Sintaxa generala este: Rezultat = nume – functie ([lista argumente])

Exista urmatoarele tipuri de functii predefinite: – Functii pentru dialog cu utilizatorul; – Functii matematice si statistice; – Functii pentru siruri de caractere; – Functii de editare; – Functii financiare.

Functii pentru dialog cu utilizatorul

Functia InputBox( ) Afiseaza o invitatie într-o caseta de dialog, asteptând ca utilizatorul sa introduca date de la

tastatura, apoi returneaza unei variabile o valoare tip Variant sau String, în functie de sintaxa utilizata. Sintaxa pentru aceasta functie este: a) pentru tipul Variant:

Variabila = InputBox (prompt, title, default, xpos, ypos, helpfile, context)

b) pentru tipul String (sir de caractere): Variabila $ = InputBox (prompt, title, default, xpos, ypos, helpfile, context)

unde: prompt – precizeaza invitatia adresata utilizatorului; este singurul argument obligatoriu. Daca invitatia

contine mai multe linii, între fiecare doua rânduri succesive se introduce un caracter de retur de car (CHR(13) si unul de avans de linie CHR(10), sau constanta Vbcrlf;

title – este un text care se afiseaza pe bara de titlu a casetei de dialog; default – sir de caractere ce reprezinta un raspuns prestabilit care va fi afisat implicit în caseta de text

din caseta de dialog, daca nu se introduce altceva;

Page 95: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

93

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

Expresia numerica Butonul selectat Constanta simbolica recomandata în locul expresiei numerice

1 OK Vb OK

2 Cancel Vb Cancel

3 Abort Vb Abort

4 Retry Vb Retry

5 Ignore Vb Ignore

6 Yes Vb Yes

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

Functii matematice si statistice

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

ABS (– 45) este 45 ABS (10–30) este 20 ABS (30–10) este 20

EXP (exp N ) – determina valoarea lui e (baza logaritmilor naturali) ridicat la puterea argumentului (exp N)

Page 96: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

94

Exemplu:

EXP (0) este 1,00 EXP (1) este 2,72

INT (exp N) – determina partea întreaga a argumentului: Exemple:

INT(12.5) este 12 INT(6,25∗2) este 12 INT(– 12,5) este 12

LOG (exp N) – determina logaritmul natural din valoarea argumentului Exemple:

LOG(1)este 0 V = EXP(2) → LOG(V) = 2,00

RND (exp N1, exp N2) – rotunjeste rezultatul la un numar real, cu un numar de zecimale dat: exp N1 reprezinta expresia de rotunjit exp N2 este numarul de zecimale ce se returneaza

Exemple:

RND(1234.1962, 3) ⇒ 1234,196 RND(1234.1962, – 3) ⇒ ∗ ∗ ∗

SQR (exp N) – determina radacina patrata din exp N Exemple:

SQR (4) este 2 SQR (57.6 ∗ 14,3) este 28,70

ATN(exp N) – determina valoarea în radiani a functiei arctg, din valoarea argumentului. Exemple:

ATN (0) este 0,00 V = PI( )/ 2 → ATN (V) este 1,00

SIN (exp N) – determina valoarea functiei trigonometrice sin, din valoarea argumentului, în radiani.

Exemple: SIN(0) este 0,00 SIN(PI[( ) / 2 → este 1,00.

COS (exp N) – determina valoarea functiei trigonometrice cos, din valoarea argumentului, în radiani.

TAN (exp N) – determina valoarea functiei trigonometrice tg, din valoarea argumentului, în radiani.

Functii pentru siruri de caractere

Len (expresie-sir) – returneaza lungimea unui sir Exemplu:

DIM Nume As String DIM LungimeSir As Integer

Page 97: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

95

Nume = ”Contabilitate si Informatica” LungimeSir = Len (”Contabilitate si Informatica”) Print Lungime Sir

Rezultatul este 28

Lcase (expresie-sir) – transforma literele majuscule în minuscule Vcase (expresie-sir) – transforma minusculele în majuscule Left $ (expresie-sir, N) – extrage caractere dintr-un sir începând cu cel din stânga

Exemplu: DIM sirIntreg As String DIM sirExtras As String SirIntreg = ”Calea Calarasilor 169” SirExtras = LEft $ (SirIntreg, 4) Print SirExtras

Rezultat: Cale

Right $ (expresie-sir, N) – extrage caractere dintr-un sir începând cu cel din dreapta. Instr (sir-complet, sir-cautat) – returneaza pozitia unui subsir dintr-un sir

Exemplu: Subsir = Instr (”Contabilitate”, ”b”) Print Subsir

Rezultatul este 6

Ltrim (expresie-sir) – elimina spatiile de la începutul sirului Rtrim (expresie-sir) – elimina spatiile de la sfârsitul unui sir. Trim (expresie-sir) – elimina spatiile de la începutul si sfârsitul sirului.

8.5.5.4. Functii de editare

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

8.5.5.5. Functii financiare

DDB – calculeaza si returneaza amortismentul unui bun pe parcursul unei perioade specificate, urmând metoda amortismentului degresiv cu rata dubla sau dupa un coeficient care ramâne de specificat.

FV – calculeaza si returneaza valoarea viitoare a unei investitii IPMT – calculeaza si returneaza suma dobânzilor unei investitii pentru o perioada data; IRR – calculeaza si returneaza rata de rentabilitate interna pentru fluxurile financiare pozitive si

negative finantate la rate diferite; MIRR – calculeaza si returneaza rata de rentabilitate interna a unei investitii fara a tine seama de

costurile de finantare si de plusvalorile de reinvestire; NPER – calculeaza si returneaza numarul de plati pentru o investitie data; NPV – calculeaza si returneaza valoarea actuala neta a unei investitii pe baza fluxurilor

financiare variabile; PMT – calculeaza suma totala a fiecarei rambursari periodice a unei investitii si ratele dobânzii

constante; PPMT – calculeaza partea varsamântului principal al unui împrumut pentru o perioada data;

Page 98: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

96

PV – calculeaza valoarea actuala a unei investitii; RATE – calculeaza amortismentul liniar al unui bun pentru o perioada de timp data; SLN – calculeaza amortismentul liniar al unui bun pentru o perioada de timp data; SYD – calculeaza amortismentul unui bun pentru o perioada data pe baza metodei americane

Sum-of-Years Digits.

Proceduri

Pentru ca un program realizat în Visual Basic sa fie mai usor de scris, de modificat (de depanat), de desenat si de înteles el poate fi împartit în entitati logice mai mici, denumite proceduri.

O procedura reprezinta o secventa de instructiuni executate ca un tot unitar si care realizeaza sarcini repetabile sau partajabile.

Procedurile, de principiu, pot fi folosite si în cadrul altor programe cu sau fara modificari. Tipuri de proceduri în Visual Basic: – proceduri Sub (subrutina); – proceduri Function; – proceduri de tip proprietate.

Proceduri Sub

O procedura Sub (procedura subrutina) este o unitate de cod (program) care executa o anumita sarcina ca raspuns la un eveniment, dar nu returneaza nici o valoare explicita.

Sintaxa generala a unei proceduri Sub este: [Private|Public|Static]Sub nume-procedura (argument)

instructiuni End Sub

Instructiunile cuprinse între Sub si End Sub vor fi executate ori de câte ori va fi apelata subrutina declarata prin nume-procedura.

Argumentele unei proceduri reprezinta variabile, transmise proceduri atunci când ea este apelata. Procedurile Sub sunt de doua tipuri: – proceduri generale; – proceduri-eveniment. O procedura generala comunica aplicatiei cum sa efectueze o anumita sarcina. Dupa ce o procedura generala a fost definita, ea trebuie apelata în mod explicit de catre aplicatie. O procedura generala poate fi plasata în oricare din cele trei tipuri de module: standard, de clasa

sau module formular. O procedura-eveniment ramâne inactiva pâna când este apelata pentru a raspunde unor

evenimente provocate de utilizator sau declansate de sistem. O procedura de tratare a unui eveniment este atasata unui obiect Visual Basic (formular, buton de

comanda, caseta de validare etc.). Când un obiect Visual Basic recunoaste aparitia unui eveniment, el apeleaza automat procedura-eveniment folosind numele corespunzator evenimentului. Acest tip de programare se numeste programare condusa de evenimente (”event-driven”).

Întrucât numele evenimentului stabileste o asociere între obiect si cod, procedurile eveniment pot fi:

Page 99: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

97

� proceduri eveniment atasate unui control � proceduri eveniment atasate unui formular

Relatia dintre procedura generala si procedurile eveniment este ilustrata în figura 8.9.

Figura 8.9. Interactiunea între procedura generala si procedurile eveniment. Sintaxa generala pentru procedurile eveniment este

Private Sub control_eveniment (argumente) instructiuni

End Sub sau

Private Sub Form_eveniment (argumente) instructiuni

End Sub

Proceduri Function

O procedura Function (procedura functie) este o procedura care efectueaza o anumita sarcina într-un program Visual Basic si returneaza o valoare catre procedura apelata.

În afara de functiile intrinseci sau incluse, programatorul poate crea propriile functii (PDF – Programmer Defined Function) utilizând procedura Function.

O functie definita într-un modul începe cu o instructiune Function si se termina cu o instructiune End Function.

Sintaxa generala pentru proceduri Function este: [Private|Public|Static]Function nume-procedura (argumente) [As tip]

instructiuni End Function

Daca clauza As lipseste, tipul de data implicit este tipul Variant. Apelarea din programul central se face dupa sintaxa:

Variabila_solicitata = functie ( )

Procedurile Function sunt apelate implicit ca în exemplul de mai jos în care este apelata procedura functie Patrat:

X = a ∗ Patrat If Patrat = 100 Then Y = Sqr (a^2 + b^2)

Spre deosebire de cele de mai sus, procedurile Sub sunt apelate prin ”call” ca în exemplul de mai jos:

Call Alpha (argument 1, argument 2, ..., argument n)

Page 100: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

98

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

Procedurile de tip proprietate

Procedurile de tip proprietate pot returna si atribui valori si pot stabili referinte la obiecte. Procedurile de tip proprietate permit unui obiect sa-si protejeze si sa-si valideze propriile date. Tipuri de proceduri tip proprietate: � Property Get – returneaza valoarea unei proprietati; � Property Let – atribuie o valoare unei proprietati; � Property Set – atribuie o valoare unui obiect proprietate.

Procedurile de tip proprietate sunt implicit publice. Sintaxa procedurilor de tip proprietate:

Property Get nume_proprietate (1, …, n) As Type Property Let nume_proprietate (1, …, n, n + 1) Property Set nume_proprietate (1, …, n, n + 1)

Argumentele (1, ..., n) trebuie sa îndeplineasca urmatoarele cerinte: – sa partajeze acelasi nume si acelasi tip de date în toate procedurile Property care au acelasi

nume; – toti parametrii necesari din lista trebuie sa se afle înaintea primului parametru optional; – procedura Property Get trebuie sa aiba un parametru mai putin decât Property Let sau Property

Set; – tipul de date al procedurii Property Get trebuie sa fie acelasi cu tipul de date al ultimului

argument (n + 1) din Property Let sau Property Set; – tipul de date al ultimului argument din Property Set trebuie sa fie un tip de obiect sau un

Variant.

Crearea noilor proceduri

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

Selectarea unei proceduri existente

� din meniul View se selecteaza Object Browser; � din caseta Project/Library se selecteaza proiectul; � din lista Classses se selecteaza modulul; � din lista Members of se selecteaza procedura; � se selecteaza View Definition.

Apelul procedurilor

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

sau Nume_procedura argument 1, ..., argument n

Page 101: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

99

Observatii: 1. O procedura Sub nu poate fi apelata prin nume în cadrul unei expresii, ci se recomanda

declararea unei variabile si utilizarea sa în expresie. Variabila declarata cheama subrutina conform sintaxei de mai sus.

2. Daca procedura Sub este apelata prin Call, argumentele se trec în paranteze. 3. Daca procedura Sub este apelata fara Call, argumentele nu se trec în paranteze.

Comenzi pentru structurile de control ale programelor

Ca si în limbajele de programare studiate anterior si în cazul Visual Basic, comenzile pentru structurile fundamentale de control se împart în:

– comenzi pentru structuri alternative (de decizie); – comenzi pentru structuri repetitive (de tip bucla).

Comenzi pentru structuri alternative

Asemenea comenzi sunt: If ... Then If ... Then ... Else Select case

În continuare se prezinta sintaxele pentru acest tip de comenzi. If ... Then

Sintaxa generala este: If conditie Then instructiune

sau If conditie Then

instructiuni EndIf

Pentru comanda If ... Then pe un singur rând nu este nevoie de EndIf. Pentru comanda If ... Then pe mai multe rânduri; EndIf se impune obligatoriu.

If ... Then ... Else Sintaxa generala este:

If conditie 1 Then [instructiuni]

EleseIf conditie 2 Then [instructiuni 2]]

...................... Else

[instructiuni n]] EndIf Select Case

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

Select Case expresie_de_analizat Case lista_de_expresii_1

Page 102: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

100

[instructiuni_1] Case lista_de_expresii_2

[instructiuni_2]] ...................... [Case Else

[instructiuni_n]] End Select

8.5.7.2. Comenzi pentru structuri repetitive

Asemenea comenzi vor fi prezentate în continuare

While ... Wend Sintaxa pentru aceasta comanda este

While conditie instructiuni

Wend

Do ... Loop Sintaxa comenzii pentru conditionare anterioara

Do While conditie instructiuni

Loop sau

Do Until conditie instructiuni

Loop Sintaxa comenzii pentru conditionare posterioara

Do instructiuni

Loop Until conditie sau

Do instructiuni

Loop While conditie

For ... Next Sintaxa pentru aceasta comanda este:

For contor = inceput To sfarsit [Step pas] instructiuni

Next [contor] Exemplu:

For i = Vi To Vf [Stop 2] a = a + a ∗ 0.5 ∗ i Next [i]

Observatie. Daca Step lipseste valoarea implicita este 1.

ForEach ... Next Sintaxa acestei comenzi este:

For Each element In grup instructiuni

Page 103: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

101

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 programarea 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.

Page 104: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

102

Tabelul 10.6

Proprietatea sau metoda Explicatie

Metoda Add adauga elemente la colectie

Proprietatea Count returneaza numarul de elemente din colectie

Metoda Item returneaza un element, dupa index sau dupa cheie

Metoda Remove sterge un element din colectie, dupa index sau dupa cheie

Metodele mentionate în tabelul 8.6 au urmatoarele sintaxe de utilizare: Sub Add (element As Variant [,cheie AsVariant] [,before As Variant][,after AsVariant]obiect. Remove index

si, respectiv set variabila = obiect. Item (index)

Clasele se deosebesc de modulele standard prin modul de stocare al datelor. Principala diferenta este aceea ca datele din modulele standard exista atâta timp cât exista programul activ în timp ce clasele exista atâta timp cât exista obiectul care le-a instantiat sau pe baza caruia au derivat. Pe de alta parte o variabila declarata Public într-un modul standard este vizibila în întregul proiect, în timp ce variabilele Public dintr-un modul clasa pot fi accesate prin variabila obiect care face referinta la clasa respectiva.

Page 105: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

103

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. * * * MicrosoftR Visual Basic 6.8, Ghidul programatorului , Editura Teora, Bucuresti, 2002. 44. D. Benage, A. Mirza, Visual StudioTM6, Editura Teora, Bucuresti, 2001.

Page 106: Programare PC

PROGRAMAREA CALCULATOARELOR ELECTRONICE – Note de curs

104

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