Sunteți pe pagina 1din 125

08l90f8ll8l08 0l8 8800

f800ll8l08 00 $lll890
08l00f8 00 N8l0N8ll0, flIl0 l l8l0fN8ll0
PROGRAMAREA
CALCULATOARELOR
ELECTRONICE
Curs pentru studenii anului II de la Facultatea de $tiine Economice,
profilul Contabilitate yi Informatic de Gestiune
Bogdan PATRU
8800 Z004
Bogdan Ptru Programarea calculatoarelor electronice
1
Universitatea din Bacu
Facultatea de $tiine
Catedra de matematic-fizic-informatic
PROGRAMAREA
CALCULATOARELOR
ELECTRONICE
Curs pentru studenii anului II de la Facultatea de $tiine
Economice, profilul Contabilitate yi Informatic de Gestiune
Bogdan PATRU
bogdanub.ro
http://stiinte.ub.ro/bogdan
Bacu - 2004
Bogdan Ptru Programarea calculatoarelor electronice
2
Refereni ytiinifici:
S prof. univ. dr. Grigor Moldovan, Universitatea "Babe-Bolvai" Cluf-Napoca, Facultatea de
Matematic i Informatic
S prof. univ. dr. Ioan Andone, Universitatea "Alexandru Ioan Cu:a" Iai, Facultatea de Economie
i Administrarea Afacerilor
ISBN:
Descrierea CIP a Bibliotecii Naionale:
Bogdan Ptru Programarea calculatoarelor electronice
3
Cuvnt nainte
Cursul ii propune s familiari:e:e studenii cu principalele noiuni despre programare. Dup ce se
definesc conceptele fundamentale despre date, algoritmi, se face o introducere in conceptele de
ba: ale programrii structurate. Urmtoarele capitole se refer la subprograme, la paradigma
programrii obiectuale i la principiile care stau la ba:a programrii orientate pe obiecte i
dirifate de evenimente.
Partea a doua a cursului pre:int cteva din tehnicile de ba: utili:ate in programarea vi:ual,
exemplificnd prin proiectarea i implementarea unor programe concrete, cu o mare aplicabilitate
in practic.
Cursul se incheie cu un capitol despre modul in care trebuie s concepem un produs software
complex, urmat de o recapitulare.
Cursul se adresea: studenilor economiti din anul II, profilul Contabilitate i informatic de
gestiune i este urmat de acetia in semestrul I al anului al II-lea de facultate, avnd o prelegere pe
sptmn. Este insoit de lucrri de laborator, ce se vor desfura in edine sptmnale de cte
dou ore.
Cursul poate fi studiat i de ali studeni de la seciile economice, inginerie etc., precum i de orice
persoan dornic s ptrund in tainele programrii calculatoarelor folosind una dintre cele mai
moderne, mai simple i mai eficiente tehnici, programarea vi:ual.
Parcurgerea cursului presupune o bun cunoatere a modului de operare cu un calculator
electronic i, de asemenea, noiuni de limba engle:.
Cursul va fi pus la dispo:iia studenilor i on-line, la adresa web.
http://stiinte.ub.ro/bogdan/cursuri
Autorul
Not: pentru ntrebri si nelmuriri, trimitei e-mail la bogdanub.ro sau bogdanedusoft.ro.
Bogdan Ptru Programarea calculatoarelor electronice
4
Cuprins
1ematica seminariilor yi a lucrrilor practice
Mod de notare
Bibliografie
Capitolul 1. Introducere - prelegerea I
- care este obiectul de studiu al disciplinei Programarea calculatoarelor electronice si ce loc ocup
aceasta n cadrul disciplinelor inIormatice
Capitolul 2. Date - prelegerea I
2.1. Constante yi variabile. Expresii - ce sunt si la ce Iolosesc, cum se Iormeaz expresiile
2.2. Tipuri de date simple - cum se reprezint diIerite date n calculator
2.3. Tipuri de date structurate - noiunea de tablou, articol, Iisier si crearea unor structuri de date
complexe
2.4. Fiyiere - deschiderea, nchiderea Iisierelor, tipuri de acces n Iisiere, exempliIicri n Visual
Basic
Capitolul 3. Algoritmi - prelegerea a II-a
3.1. Etapele rezolvrii unei probleme - cum se analizeaz o problem si cum se proiecteaz si
implementeaz metoda sa de rezolvare
3.2. Definiia algoritmului - ce este un algoritm, ce este pasul de algoritm, instruciunea
3.3. Caracteristicile algoritmului - ce condiii trebuie s ndeplineasc o metod de rezolvare a
unei probleme pentru a Ii considerat algoritm
Capitolul 4. Elementele programrii structurate - prelegerea a III-a si a IV-a
4.1. Structurile de baz - se vor prezenta structurile liniar, alternativ si repetitiv condiionat
anterior, pe un exemplu din cotidian
4.2. Structurile auxiliare - se vor prezenta alte structuri alternative si repetitive
4.3. Teorema programrii structurate - se va prezenta teorema programrii structurate si se va
aplica pe cazul unor algoritmi diversi
4.4. Instruciunea de atribuire. Opera ii de intrare yi ieyire - ce este instruciunea de atribuire,
care este semantica ei, ce sunt operaiile de intrare si iesire si cum se utilizeaz ele
4.5. Implementarea structurilor de control - cum se descriu elementele programrii structurate n
cazul unor limbaje de programare diIerite
4.6. Exemple de algoritmi - se vor proiecta algoritmi pentru calcule simple matematice, Iinanciar-
contabile, dar si algoritmi mai complecsi de cutare, sortare etc.
4.7. Complexitatea algoritmilor - se va Iace o scurta si sumar introducere n teoria complexitii
algoritmilor, cu exempliIicri
Capitolul 5. Subprograme - prelegerea a V-a
5.1. Definirea subprogramelor - ce sunt subprogramele (procedurile, (sub)rutinele, Iunciile) si
cum se declar si se deIinesc ele n cadrul unui program; exempliIicri n diIerite limbaje de
programare
5.2. Circuitul datelor ntre subprograme - cum se apeleaz subprogramele, modaliti de
transmitere a parametrilor
Bogdan Ptru Programarea calculatoarelor electronice
5
Capitolul . Conceptele programrii orientate pe obiecte - prelegerea a VI-a
6.1. Introducere - o iniiere intuitiv n teoria programrii orientate pe obiecte, cu exempliIicri din
lumea real
6.2. Definirea claselor - cum se deIinesc clasele, cmpuri si metode, cmpuri private si publice;
exempliIicri n diIerite limbaje de programare obiectual
6.3. Derivare - realizarea derivrii unei clase din alt clas, mostenirea cmpurilor
6.4. Polimorfism - cnd si cum se realizeaz polimorIismul
6.5. Metode virtuale - deIinirea si Iolosirea metodelor virtuale
Capitolul 7. Bazele programrii vizuale - prelegerea a VII-a
7.1. Consideraii generale - ce este programarea vizual si prin ce se deosebeste de alte paradigme
7.2. Forme- ce sunt Iormele
7.3. Controale yi propriet ile lor - ce sunt controalele si cum se proiecteaz interIaa unei
aplicaii vizuale
7.4. Evenimente - ce sunt evenimentele, ce evenimente pot aprea asupra diIeritelor controale si
cum pot Ii ele Iolosite
7.5. Legarea evenimentelor de controale - cum se realizeaz legtura ntre controale si diIeritele
evenimente ce pot avea loc asupra lor; scrierea codului procedurilor si realizarea programului
7.6. Proprieti yi metode - ce sunt acestea si cum se Iolosesc; notaia cu punct
Capitolul 8. Programarea vizual n mediul 1isual Basic - prelegerile a VIII-a, a IX-a, a
X-a, a XI-a, a XII-a - vor Ii n strns legtur cu practica, din cadrul lucrrilor de laborator.
8.1. Pornirea mediului de programare Visual Basic 5
8.2. Primul tu program
8.3. Un salut special pentru tine!
8.4. Un calculator cu opera ii aritmetice
8.5. Butoane de opiune yi cadre
8.6. Casete de validare
8.7. Vector de controale
8.8. Liste yi propriet i vectori
8.9. Metode pentru liste
8.10. Un joc cu imagini yi cronometre
8.11. Tabele
8.12. Grafice
8.13. Fiyiere text - s salvm yi s restaurm datele
8.14. Ordonarea datelor din tabel
Anexa 1. 1eme pentru proiecte
Anexa 2. Subiecte pentru examen
Bogdan Ptru Programarea calculatoarelor electronice
6
Tematica seminariilor yi a lucrrilor practice
Acestea se vor desfura in laboratorul de informatic, despre care se presupune c poate asigura
lucrul a maxim 2 elevi la un calculator performant. Orele de practic trebuie s le succead pe cele
de teorie, de la curs. Pe toat durata cursului, este recomandabil ca studenii s lucre:e
suplimentar in laboratorul de informatic, mai ales cnd vor trebui s-i reali:e:e aplicaia proprie
(discutat in edinele de laborator 9-13).
$edina 1. Recapitulare - sedin de tip seminar
Studenii vor Ii testai asupra modului n care stiu s utilizeze un calculator, ca operatori ai
sistemului de operare si al unor produse de birotic (procesor de texte, de tabele, editor graIic).
Laboratorul poate s constea n elaborarea unei lucrri complexe, care s mbine lucrul cu diIerite
pachete de programe.
$edina 2. Date yi modaliti de reprezentare a datelor - sedin de tip seminar
n discuie se va aborda tema noiunii de dat. Se vor clasiIica datele, se vor da exemple de
modaliti de reprezentare a datelor, modelnd situaii din lumea real.
$edina 3. Algoritmi - sedin de tip seminar
Se va discuta cu studenii, sub Iorma unor studii de caz, care sunt etapele rezolvrii unei probleme.
Se vor Iormula diIerite probleme si se va studia care din ele pot Ii rezolvate prin algoritmi si care
nu. Se vor enuna caracteristicile algoritmilor si se va discuta pe marginea acestei teme.
$edina 4. Elementele programrii structurate - sedin de tip laborator
Se vor trece n revist structurile de control Iolosite n programarea procedural, exempliIicndu-se
prin scrierea unor algoritmi de calcule matematice si Iinanciar-contabile, precum si a unor algoritmi
de cutare si sortare. Algoritmii vor Ii implementaui sub Iorma unor simple programe n limbajul
utilizat de mediul de programare ce va Ii predat ulterior (Visual Basic, Delphi, Visual EoxPro etc.).
n Iinal, vor Ii analizai algoritmii din punct de vedere al complexitii lor.
$edina 5. Module - sedin de tip laborator
Vor Ii tratate diIerite aspecte ale realizrii modulelor, a transmiterii parametrilor ntre module. Se
vor exempliIica cu module n diIerite limbaje de programare, insistndu-se cu exemple din limbajul
Iolosit de mediul de programare care va Ii studiat mai trziu.
$edina 6. Clase yi obiecte - sedin de tip laborator
Se vor realiza programe simple care s Ioloseasc clase. Programele vor Ii scrise n limbajul de
programare ales.
$edina 7. Mediul de programare ... (Visual Basic, Delphi, Visual FoxPro etc.) - sedin
de tip seminar
Studenii vor Ii Iamiliarizai cu mediul de programare care va Ii studiat n continuare. Vor Ii
nvate principalele comenzi de lucru cu Iisiere, modul de deIinire a proiectelor si crearea
programului executabil, lucrul cu Iormele etc. Se va crea o aplicaie simpl, se va compila, depana
si executa.
Bogdan Ptru Programarea calculatoarelor electronice
7
$edina 8. Aplicaie practic - sedin de tip laborator
n aceast sedin de laborator, studenii vor realiza o aplicaie practic Iinanciar-contabil, sub
ndrumarea cadrului didactic, care va utiliza controalele studiate la curs, dar va anticipa si Iolosirea
unora noi.
$edinele 9, 10, 11, 12 yi 13. Lucrare practic - sedine de tip laborator
Pe parcusul acestor sedine, studenii vor lucra n echipe de 2-4 persoane pentru realizarea concret
a unei aplicaii vizuale pentru domeniul Iinanciar-contabil (vezi anexa 1), sub ndrumarea si
coordonarea cadrului didactic. Lucrul studenilor nu se va rezuma doar la cele dou ore spmnale,
cuprinse n planul de nvmnt, ci si n studiul individual, acas sau n laboratorul de inIormatic.
La orele de laborator, studenii vor prezenta cadrului didactic, sptmnal, stadiul la care au ajuns
cu lucrarea, ce probleme au ntmpinat, iar cadrul didactic i va ajuta s le soluioneze si le va
sugera mbuntiri ce pot Ii aduse lucrrii. La Iinal, lucrarea practic realizat de studeni trebuie s
Iie nsoit si de un document scris, n care se prezint scopul, modul de realizare si de utilizare a
aplicaiei.
$edina 14. Prezentarea lucrrii practice - sedin de tip colocviu
n aceast ultim lucrare, studenii vor prezenta aplicaia realizat comisiei de notare. Comisia va Ii
Iormat din cadrul didactic de la seminar, titularul de curs si doi reprezentani numii de studeni si
evideniai prin aportul lor deosebit la desIsurarea orelor de laborator.
Mod de notare
Cursul de Programarea calculatoarelor electronice se termin cu examen, n care studenii vor
primi o not, calculat ca o medie ponderat dup cum urmeaz:
- Activitatea la laborator - 25 (nota minim 5 pentru a intra n examen; sunt admise
maxim 4 absene nemotivate)
- Nota primit la colocviul de prezentare a lucrrii practice - 25 (nota minim 5 pentru a
intra n examen; vezi anexa 1)
- Lucrare scris la examen - 25 (nota minim 5; vezi anexa 2)
- Examinare oral/practic la examen - 25 (nota minim 5, ntrebri din curs, orele de
laborator, proiect si din bibliografie)
Atenie: pentru promovarea examenului consultarea bibliograIiei este obligatorie!
Bibliografie
1. Ptru, Bogdan - nvai limbajul Pascal n 12 lecii, Editura Teora, Bucuresti, 1997-2004
2. Ptru, Bogdan - Aplicaii n Visual Basic, Editura Teora, Bucuresti, 1998-2004
3. Mark Steven Heyman- Bazele Visual Basic 4, Editura Teora, Bucuresti, 1998
4. Ptru, Bogdan, Mariana Milosescu - InIormatic, manual pentru clasa a IX-a, Editura Teora,
Bucuresti, 1999-2003
5. Ptru, Bogdan - Aplicaii n Delphi, Editura Teora, Bucuresti, 2001-2004
6. Ptru, Bogdan - Aplicaii n C si C, Editura Teora, Bucuresti, 1998-2004
7. Adrian Atanasiu - Cum se scrie un algoritm? Simplu!, Editura Agni, Bucuresti
8. Kovacs, Sandor - Ghid de utilizare Delphi 3.0, Editura Albastr, Cluj-Napoca
9. Liviu Negrescu - Introducere n limbajul C, Editura MicroInIormatica, Cluj-Napoca
Bogdan Ptru Programarea calculatoarelor electronice
8
Capitolul 1. Introducere
DiIerii autori dau diIerite deIiniii inIormaticii, dar, n esen, tote aceste deIiniii Iac apel la
originea cuvntului. Cuvntul inIormatic provine din Iranuzescul informatique, care, la rndu-i
provine din information inIormaie si automatique n mod automat, automatic.
Informatica este un complex de discipline stiiniIice care se ocup de prelucrarea si transmiterea
electronic a inIormaiei.
Eireste, o asemenea deIiniie presupune ca noi s stim ce nseamn att inIormaia, ct si ce se
nelege prin prelucrare si transmitere electronic.
Conceptul de inIormaie este strns legat de cel de dat.
Datele sunt numere, caractere, imagini sau orice alte modaliti de reprezentare (nregistrare) a unor
entiti reale ntr-o Iorm ce poate Ii accesat de om sau, n mod special, introdus ntr-un
calculator, stocat si procesat acolo sau transmis pe cale electronic.
O dat nu are ea nssi un neles, dect cnd este interpretat de un anumit sistem de prelucrare a
datelor, care i d un neles si atunci data devine informaie.
Datele pot Ii reprezentate pe baza unor sabloane si putem obine inIormaii, prin interpretarea lor.
InIormaiile sunt utilizate pentru a ne spori cunoytinele.
Deoarece cunostinele sunt o condiie esenial a nvrii, noi ntotdeauna dorim mai multe date si
inIormaii. Dar, cum societatea modern converge ctre suprancrcarea inIormaional, avem
nevoie n mod special de mai multe ci de a gsi sabloane.
Exemple:
- 1234567.89 este dat.
- "Contul meu bancar a crescut de 80 de ori, ajungnd la 1234567.89 mii lei" este inIormaie.
- "Nimeni nu are atia bani ca mine." este cunostin.
- "Mai bine as vorbi cu cei de la banc nainte de a cheltui banii, pentru c stiu eu ce au pit alii
ntr-o situaie similar." este o nvtur.
Pentru a nelege mai bine cum stau lucrurile, s considerm un caz concret din realitate. La o
Iacultate se d concurs de admitere. Numele candidailor si notele obinute de ei sunt date. Se
realizeaz o list a candidailor mpreun cu notele acestora.
Lista poate Ii considerat o inIormaie, pentru c Iiecare element al listei, constituit dintr-un nume si
un numr, are o anumit semniIicaie.
Lista este ordonat n ordinea descresctoare a notelor. Acesta este un proces de prelucrare a
inIormaiilor sau a datelor. Se obin alte inIormaii sau date, care compun lista ordonat. Dac
ordonarea a Iost realizat cu ajutorul unui calculator electronic, nseamn c a avut loc o prelucrare
automat a datelor, prin mijloace electronice.
Bogdan Ptru Programarea calculatoarelor electronice
9
Ulterior, lista ordonat va putea Ii transmis ministerului, Iie prin post, Iie pe ci electronice (de
pild prin post electronic).
Unitatea de msur a datelor/inIormaiei este bitul, o ciIr (engl. digit) care poate Ii 0 sau 1. S-a
constatat c sistemul de numeraie binar (care Ioloseste doar cele dou ciIre) poate Ii utilizat pentru
a reprezenta orice inIormaie. Reprezentarea binar a unei inIormaii se numeste si digiti:are. De
Iapt, putem observa cu usurin c toat natura are o organizare binar.
Multiplul bitului este: octetul (sau byte-ul), care este o grupare de 8 bii. Multiplii octetului sunt:
kilooctetul sau kilobyte-ul (notat Kb sau Ko) 1 Kb 1024 bytes (octei)
megaoctetul sau megabyte-ul (notat Mb sau Mo) 1Mb 1024 Ko
gigaoctetul sau gigabyte-ul (notat Gb sau Go) 1 Gb 1024 Mb (1024 2
10
)
Spuneam c inIormatica este un complex de discipline stiiniIice ce rezolv astIel de probleme.
AstIel, distingem, n cadrul inIormaticii urmtoarele discipline mai importante, care constituie tot
attea direcii de studiu si cercetare:
- Arhitectura calculatoarelor - se ocup de componentele Iizice (hardware) ale unui calculator,
de modul lor de Iuncionare, precum si de legturile existente ntre ele;
- Sisteme de operare - se ocup de componenta soItware de baz a unui calculator (sistemul de
operare), de modul de proiectare a acestuia, de Ielul n care pot Ii getionate mai eIicient
resursele Iizice ale calculatorului (memoria, procesorul, discurile);
- Reele de calculatoare - reprezint o disciplin strns legat de cele dou anterioare, ocupndu-
se de modul de realizare si conIigurare soItware si hardware a unei reele de calculatoare, de
integrarea reelelor de calculatoare ntre ele, de tipurile de reele de calculatoare
- Structuri de date - este o disciplin strns legat de programarea calculatoarelor, ocupndu-se
de gsirea si mbuntirea modalitilor de reprezentare a datelor n calculator, n Iuncie de
necesiti si de algoritmii ce le vor prelucra
- Baze de date - este o disciplin nrudit cu precedenta, ocupndu-se, ns, de coleciile de date
mari, cu structuri asemntoare, ce pot Ii stocate pe suporturi Iizice externe, precum si de modul
de interogare a unor baze de date pentru a realiza selecii
- Analiza, proiectarea yi sinteza algoritmilor - dup cum spune si denumirea, aceast disciplin
se ocup de modalitile, tehnicile si strategiile cele mai eIiciente de rezolvare a problemelor, de
stocare a datelor, de prelucrare a inIormaiilor n vederea obinerii altor inIormaii, precum si de
transmitere eIicient a lor pe ci electronice
- Programarea calculatoarelor - se ocup de implementarea algoritmilor proiectai pe
calculatoarele electronice, astIel nct acestia s poat Ii pusi la lucru, deci este arta si stiina de
a crea programe de calculator
- Limbaje de programare - un algoritm proiectat va Ii implementat sub Iorma unui program, iar
programul este scris ntr-un anumit limbaj de programare, adic o convenie de simboluri si
cuvinte, precum si reguli de mbinare a acestora, mpreun cu nelesurile lor ce pot Ii
recunoscute de calculator; disciplina se ocup si de evoluia si studiul limbajelor de programare,
pentru a determina cel mai potrivit limbaj de programare utilizabil ntr-o anumit situaie
Bogdan Ptru Programarea calculatoarelor electronice
10
- Limbaje formale yi construc ia compilatoarelor - o disciplin care studiaz (sub o Iorm
algebric) modalitile prin care un program scris ntr-un limbaj de programare poate Ii
recunoscut ca Iiind corect de ctre un automat sau o gramatic de descriere a limbajului de
programare respectiv; de asemenea, disciplina se ocup si cu construirea compilatoarelor, adic
a acelor translatoare ntre limbajul de programare si limbajul procesorului (cod masin)
- Ingineria software - este un domeniu strns legat de programarea calculatoarelor, de data
aceasta la un nivel mai ridicat, al proiectrii programelor complexe
- Grafic computaional - se ocup de tehnicile de reprezentare graIic pe calculator a
curbelor, supraIeelor, corpurilor, de modalitile de ascundere a supraIeelor nevizibile,
domeniu strns legat de geometrie
- Inteligen artificial - se ocup cu rezolvarea unor probleme pentru care se Iolosesc algoritmi
speciIici; domeniul doreste s simuleze pe calculator unele componente ale inteligenei umane,
cum ar Ii recunoasterea textelor scrise, a vorbirii, deducia, gsirea rspunsurilor creative,
capacitatea de a nva din experien si capacitatea de a trage concluzii pe baza unor inIormaii
incomplete.
- Cercetere operaional - se ocup, n general, de rezolvarea unor probleme de decizie si
conducere ce apar n economie
- Analiz numeric - este un domeniu de grani ntre inIormatic si matematic, ocupndu-se de
rezolvarea pe cale numeric a unor probleme de analiz matematic (derivabile, integrale,
interpolri, rezolvarea de ecuaii, calcule cu matrice si determinani)
- Teoria grafurilor - este un domeniu de grani ntre inIormatic si matematic, care se ocup
de rezolvarea problemelor legate de graIuri, cu aplicabilitate n diIerite domenii ale stiinei si
tehnicii (management, proiectare n construcii etc.).
Obiectul de studiu al disciplinei Programarea calculatoarelor electronice va Ii, asadar reprezentat
de arta si stiina crerii de programe, pe baza unor algoritmi, scrise ntr-un limbaj de programare.
De aceea, acest curs va trece n revist, mai nti cteva modaliti eseniale de reprezentare a
datelor, apoi vom vorbi despre algoritmi si proprietile lor.
Cursul va continua cu prezentarea principalelor stiluri (paradigme) de programare Iolosite n
prezent, pe care le vom prezenta ntr-o succesiune gradat, pn vom ajunge la programarea
vizual.
Conceptele programrii vizuale si o scurt introducere practic n domeniu va constitui partea a
doua a cursului, ce se va ncheia cu un capitol reIeritor la proiectarea, realizarea si ntreinerea
produselor soItare si o recapitulare pentru examen.
Bogdan Ptru Programarea calculatoarelor electronice
11
Capitolul 2. Date
2.1. Constante yi variabile. Expresii
n primul capitol am precizat ce sunt datele, iar n acest capitol ne vom ocupa de reprezentarea lor
intern, adic n memoria calculatorului si pe suporturi externe, Iizice, n Iisierele de pe discuri.
Datele apar n cadrul unor programe scrise ntr-un limbaj de programare sau altul, reprezentate prin
niste cuvinte de identiIicare, numite identificatori . n mai toate limbajele de programare, un
identiIicator este un sir de litere sau ciIre, eventual si alte simboluri (cum ar Ii ""), ce ncepe cu o
liter.
n cadrul programului, datele pot Ii declarate ca Iiind constante sau variabile. O constant este o
dat a crei valoare nu se poate modifica pe parcursul execuiei programului, deci rmne constant.
O variabil este o dat a crei valoare se poate modifica pe parcursul execuiei programului, deci
ea poate varia, dar acest lucru nu este obligatoriu. AstIel, se poate declara o dat ca Iiind variabil n
cadrul unui program, apoi ea s primeasc o anumit valoare, iar aceast valoare s rmn asociat
respectivei variabile pn la terminarea programului.
Evident, atunci cnd se va declara o dat constant, se va preciza si valoarea ei, iar cnd se va
declara o dat variabil, se subnelege c ulterior, pentru a putea Ii Iolosit, aceast variabil va
primi o anumit valoare. Majoritatea limbajelor de programare asigneaz o valoare iniial
variabilelor, o dat cu declararea lor. AstIel, sirurile de caractere sunt iniializate la sirul vid, iar
numerele sunt considerate cu valoarea zero.
Eireste, att constantele ct si variabilele au o anumit structur, mai simpl sau mai complicat, si
o anumit natur, dat de mulimea valorilor posibile pentru o dat. Cu ele se pot Iace anumite
operaii, n Iuncie de natura si structura lor. AstIel, vom spune c o dat are un anumit tip. Prin tip
de date vom nelege o mulime de valori, mpreun cu operaiile ce se pot executa cu ele. Eiecrei
variabile, la declarare, i se va asocia un anumit tip. Tipul unei constante poate Ii determinat implicit
din valoarea constantei, sau poate Ii precizat explicit ca n cazul variabilelor.
AstIel, dac constanta K are valoarea numeric 7, putem trage concluzia c ea este de tip ntreg, sau
de tip real, nu si logic sau sir de caractere. Totusi, exist si limbaje n care se Iac anumite convenii,
de pild c orice numr diIerit de zero este considerat ca Iiind cu valoarea de adevr adevrat, iar
numrul zero are valoarea de adevr fals.
Unele limbaje de programare permit declararea unor variabile Ir a se preciza tipul lor,
considerndu-se astIel ca avnd un anumit tip general. AstIel, atunci cnd va Ii Iolosit, variabila
respectiv va Ii considerat ca avnd cel mai adecvat tip cu putin, n situaia concret respectiv.
De pild, dac este declarat o variabil X, iar la un moment dat i se atribuie valoarea 3,. atunci ea
poate Ii considerat ca avnd un tip numeric. Dac ulterior, variabila X va primi valoarea "abc",
adic un sir de caractere, se poate considera c X este de tip sir de caractere.
Pe baza constantelor si variabilelor se Iormeaz expresii. Bineneles, n Iormarea expresiilor se vor
Iolosi acei operatori, precum si acele Iuncii, permise de tipurile valorilor asupra crora se opereaz.
Expresiile mici pot conduce la elaborarea de expresii mai mari, din ce n ce mai complexe.
Bogdan Ptru Programarea calculatoarelor electronice
12
Pentru a nelege cum stau lucrurile, vom considera limbajul Visual Basic, iar exemplele ce vor
urma vor Ii date n acest limbaj.
S considerm urmtoarele declaraii de variabile:
Dim X As Integer, Y As Integer, S As String
Dim V
AstIel, X si Y sunt variabile ntregi (cu valori n mulimea numerelor ntregi), S este variabil de tip
sir de caractere (cuprinse ntre ghilimele), iar V este o variabil a crui tip nu a Iost precizat. Visual
Basic pune astIel la dispoziie tipul de date Variant, care reuneste, sub un cadru general, toate
celelalte tipuri de date.
Urmtoarele expresii sunt corecte din punct de vedere sintactic, n limbajul Visual Basic:
2, X, X5, XY, X4*Sqr(Y), S, V, V3, VX, SS, XLen(S), LeIt(S,2)Right(S,3)
X, Y, V si S pot primi valori n dou Ieluri: prin atribuire direct sau prin citire (de la tastatur sau
dintr-un Iisier).
Atribuirea se Iace cu instruciunea de atribuire, care are Iorma:
Variabil Expresie sau Let Variabil Expresie
Citirea valorilor se poate Iace Iolosind o operaie de citire, ca de pild:
Input Variabil
S considerm urmtoarele operaii prin care se atribuie valori variabilelor declarate anterior:
Y 16
S "abcd"
Y 7
Input V
X Y Len(S) 1
Iniial lui Y i se atribuie valoarea 16, dar apoi el primeste valoarea 7, renunndu-se la 16. Dac de
la tastatur se va da valoarea 8 lui V, atunci V va Ii considerat ca Iiind de tip ntreg. X va lua
valoarea 12, adic suma 7 4 1, 4 Iiind lungimea sirului de caractere S ("abcd"). n cadrul
secvenei anterioare apar 4 constante si anume: numrul 16, sirul "abcd", numerele 7 si 1.
Urmtoarele expresii nu sunt corecte din punct de vedere sintactic, deci, de Iapt, ele nu sunt
expresii:
X , X****, X Y, S
Exist si cazuri speciale, cum ar Ii X S sau S V. Unele limbaje de programare consider
asemenea entiti ca Iiind incorecte, pe cnd altele le consider expresii perIect corecte. De pild, n
primul caz, X considerat ca Iiind numr, iar S ca Iiind sir de caractere, rezultatul acelei adunri
poate Ii considerat Iie concatenarea dintre X convertit la sir de caractere si S, Iie ca numrul obinut
din adunarea lui X cu sirul S, convertit la numr. n general, se alege n Iuncie de tipul ce se
doreste a-l avea expresia.
Bogdan Ptru Programarea calculatoarelor electronice
13
De pild, dac X are valoarea 5, S are valoarea "123", atunci printr-o atribuire de genul S X S
vom putea nelege c S va primi valoarea "5123" (adic "5" concatenat cu "123"), iar printr-o
atribuire de genul X X S, vom considera c X primeste valoarea 128 (adic suma 5 123).
Majoritatea limbajelor de programare deIinesc expresiile dup un sistem de reguli sintactice, care,
n general sunt urmtoarele:
1. orice constant este expresie;
2. orice variabil este expresie;
3. dac E este expresie, atunci si (E), -E, E, E(E) sunt expresii, unde E este numele unei Iuncii
aplicabile expresiei E;
4. dac E1 si E2 sunt expresii, atunci si E1E2, E1-E2, E1*E2, E1/E2 sunt expresii.
Acum, pe baza regulilor de mai sus putem construi expresii Ioarte complexe, pornind de la
constante si variabile. AstIel, s considerm entitatea (3A)*(5/(-BC)) si s veriIicm dac ea este
expresie sau nu. S presupunem c A, B si C sunt variabile numerice ntregi.
Cum 3 este constant, conIorm regulii 1, ea este si expresie. A, Iiind variabil este, conIorm regulii
2 expresie. Acum, conIorm regulii 4, 3A este expresie, iar (3A) este tot expresie, conIorm regulii
3. Dup simbolul nmulirii (reprezentat adesea prin *), avem: 5 este expresie, Iiind constant, B, C,
apoi -B si -BC sunt expresii. n Iine, conIorm regulii 3, (-BC) este tot expresie, apoi si (5/(-BC))
este expresie, n conIormitate cu regula 4, si, tot dup aceast regul, si (3A)*(5/(-BC)) este
expresie.
2.2. Tipuri de date simple
Spuneam c Iiecare constant, variabil sau expresie are un anumit tip de date. Tipul unei date
determin comportamentul acesteia, pentru c el limiteaz sau extinde modul de operare asupra sa.
n general, se accept c datele pot Ii considerate ca Iiind simple, primare, adic avnd o structur
atomic, indivizibil, sau structurate, construite pe baza altor date, cu ajutorul unor constructori
speciali.
n general, sunt acceptate ca Iiind atomice sau simple, urmtoarele tipuri de date: mulimea
numerelor ntregi si operaiile cu numere ntregi, care dau rezultat ntreg; mulimea numerelor reale
mpreun cu operaiile ce se pot executa cu ele; mulimea caracterelor reprezentabile n calculator si
operaiile cu ele; mulimea valorilor de adevr, adevrat si fals, ce constituie tipul logic de date.
Personal, consider si tipul sir de caractere ca Iiind un tip simplu, datorit Iaptului c este Ioarte
necesar n elaborarea unor algoritmi simpli, de baz, si pentru c asupra lui se poate aciona cu
operaii directe, ntlnite si la celelalte tipuri de date. Totusi, tipul sir de caractere este un tip
structurar.
Tipurile de date poart si ele nume, deci sunt denumite prin identiIicatori. De obicei, tipul ntreg se
numeste Integer, dar pot exista mai multe tipuri ntregi, n Iuncie de necesiti particulare. AstIel, n
Visual Basic, Integer reprezint numerele ntregi din intervalul -32768 .. 32767, iar Byte reprezint
numerele ntregi ntre 0 si 255. De asemenea, Long este tot un tip ntreg, cu valori ntre
-2147483648 si 2147483647. n Iuncie de mrimea numerelor de reprezentat, o valoare ntreag
poate Ii stocat Iolosind 1, 2 sau 4 octei. AstIel, de pild, o dat de tip Byte se memoreaz pe un
octet, una de tip Integer pe doi octei, iar una de tip Long pe 4.
Bogdan Ptru Programarea calculatoarelor electronice
14
n mod similar, Single stocheaz valori reale pe 4 octei, iar Double valori reale pe 8 octei. uuuuuu
Pentru siruri de caractere se va Iolosi tipul String, iar caracterele individuale sunt considerate ca
Iiind siruri de caractere de lungime 1. n Pascal, de pild, exist ns tipul de date Char pentru
reprezentarea caracterelor.
Boolean este tipul de date logic, cuprinznd valorile constante True si Ealse. n Visual Basic exist
si tipul general Variant, despre care am mai vorbit, precum si alte tipuri speciale, cum ar Ii Decimal,
Currency sau Date.
n general, cu datele numerice pot Ii realizate operaiile speciIice numerelor, cum ar Ii adunarea,
scderea, nmulirea (reprezentat de *), mprirea (reprezentat de \ la numere ntregi, n Visual
Basic, de pild, sau / la numere reale). Exist si unele Iuncii matematice cum ar Ii Iunciile
trigonometrice (Sin, Cos, Tan, Atan), Iuncia logaritm zecimal (Log), Iuncia radical (Sqr) sau
Iuncia modul (Abs).
Cu datele de tip logic (Boolean) se realizeaz operaii speciIice, cum ar Ii conjuncia, disjuncia
(inclusiv si exclusiv), negaia, a cror tabele sunt prezentate mai jos (A adevrat, E Ials):
and (si) - conjuncia logic
A and A A
A and E E and A E and E E
or (sau) - disjuncia logic inclusiv
E or E E
A or E E or A A or A A
xor (sau exclusiv) - disjuncia logic exclusiv
A and E E and A A
A and A E and E E
not (non, nu) - negaia logic
not A E
not E A
n Visual Basic, cu datele de tip Boolean se pot realiza si operaiile de implicaie si echivalen
logic, prin operatorii Imp, respectiv Eqv.
Conversiile de la un tip la altul se pot realiza Iie explicit, Iolosind Iuncii speciale, Iie implicit, dup
caz. AstIel, n Visual Basic, dac X, Z sunt de tip Integer, iar Y este de tip Byte, dac scriem
ZXY, atunci automat Y este convertit la tipul Integer, nainte ca s se realizeze adunarea.
Conversii mai importante se Iac n cazuri ca acestea:
Dim X as Integer
Dim Y as Double
X Y
sau
Dim X as Integer
Dim S as String
S X sau X S
Bogdan Ptru Programarea calculatoarelor electronice
15
n primul caz, evident c X va primi partea ntreag a lui Y, iar n celelalte dou cazuri, Iie X se
converteste la sir, Iie se preia din S numrul.
Totusi, putem Iolosi si Iunciile Int pentru a extrage partea ntreag dintr-un numr real, respectiv
Str pentru a converti un numr la un sir si Val pentru a obine un numr dintr-un sir.
Cu datele de oricare tip de date se pot realiza comparaii. AstIel, de obicei se Iolosesc notaiile
urmtoare:
, ~ pentru mai mic si mai mare;
, ~ pentru mai mic sau egal, respectiv mai mare sau egal;
~ sau ! pentru diIerit
sau pentru egal
2.3. Tipuri de date structurate
Pe baza datelor simple se pot construi date structurate. De pild, putem s ne imaginm situaia n
care dorim s stocm lista numelor si notelor candidailor la concursul de admitere n Iacultate. O
modalitatea Ioarte ineIicient este de a pstra cte o variabil pentru numele Iiecrei persoane si
cte o variabil pentru nota obinut de Iiecare persoan. Dar nu vom sti cte persoane vom avea, de
aceea este practic imposibil s procedm astIel.
Mult mai bine este s Iolosim un tip de date care s ne permit declararea a dou variabile, s zicem
Nume si Nota, care s pstreze cele dou liste. Acest tip de date se numeste tablou si permite
gruparea de date de acelasi tip sub un singur nume. Componentele vor putea Ii reIerite printr-un
numr de ordin, numit indice. Pentru ca operarea s Iie eIicient, va trebui ca nota persoanei cu
indicele i din tabloul de nume s Iie pe poziia i n tabloul de note.
Mult mai natural ar Ii s avem un singur tablou, n loc de dou. AstIel, n loc de a pstra un tablou
pentru numele persoanelor si unul pentru notele lor, mai bine am avea un singur tablou de persoane.
AstIel, ar trebui ca Iiecare component a tabloului mare s conin un articol, care s grupeze la un
loc att numele, ct si nota unei persoane. n acest sens ne vine n sprijin tocmai tipul de date
nregistrare (sau articol) ce poate ncapsula sub un singur nume date de tipuri diIerite.
Cu toate c un tablou de articole poate stoca eIicient si natural datele despre candidaii la un concurs
de admitere, aceasta nu este ntotdeauna soluia cea mai bun. Datele dintr-un tablou se stocheaz n
memoria intern a calculatorului si, cu toate c pot Ii accesate rapid si direct, ele nu sunt pstreaz
de la o rulare a programului la alta sau cnd calculatorul este oprit. Iat si motivul pentru care ar Ii
necesar ca datele s Iie pstrate pe un suport Iizic extern, sub Iorma unui Iisier pe disc. Un alt motiv
pentru care trebuie utilizat Iisierul n locul tabloului este c un Iisier poate avea dimensiuni mult
mai mari dect un tablou.
Structurile de date complexe se creeaz pe baza celor simple sau complexe create anterior, aplicnd
niste constructori speciali.
n Visual Basic, un tip nregistrare se deIineste astIel:
Type NumeDeTip
cmp1 As Tip1
cmp2 As Tip2
.......................
Bogdan Ptru Programarea calculatoarelor electronice
16
End Type
Pot exista n cadrul deIiniiei unui tip de date nregistrare si cmpuri de tip tablou.
Exemplu:
Type Candidat
nume As String
nota As Single
End Type
n continuare, putem declara o variabil de tip Candidat prin
Dim C as Candidat
Pentru a Iace reIerirea la un anumit cmp se Ioloseste notaia cu punct, sau operatorul punct, astIel:
NumeDeVariabilnregistrare.NumeDeCmp: C.nume este numele candidatului C, iar C.nota este
nota aceluiasi candidat. Nu se poate citi ansamblul C n ntregime, prin Input C, ci doar pe
componente, prin Input C.nume si Input C.nota.
Nu exist o deIiniie special pentru un tip tablou, dar Iaptul c X este o variabil de tip tablou se
poate scrie astIel:
Dim X(n) as Tip
AstIel, X s-a declarat ca Iiind o variabil de tip tablou, cu n componente, numerotate de la 0 la n-1.
Eiecare component este de tipul Tip. Dac se doreste ca numerotarea s se Iac de la o anumit
valoare v1 la o alt valoare v2 se va scrie:
Dim X(v1 To v2) as Tip
Exemplu:
AstIel, de pild, Dim X(1 to 10) as Integer declar un tablou cu 10 numere ntregi.
ReIerirea elementelor unui tablou se Iace cu ajutorul operatorului ( ) (la alte limbaje se Iolosesc
parantezele ptrate | | n loc de cele rotunde). AstIel, X(1) este prima component a tabloului X, iar
X(10) este ultima.
Exemplu:
S considerm urmtoarea declaraie:
Dim Cand(1 To 500) as Candidat
AstIel, am declarat 500 de candidai, iar Cand(i).nume este numele candidatului al i-lea, pe cnd
Cand(i).nota este nota acestuia.
Pn acum am vorbit despre tablouri unidimensionale, numite si vectori. Exist ns si posibilitatea
de a declara tablouri bidimensionale (numite matrice) sau chiar cu mai multe dimensiuni.
AstIel, declaraia:
Bogdan Ptru Programarea calculatoarelor electronice
17
Dim A (1 To 10, 1 To 15)
deIineste o matrice cu numele A, cu 10 linii si 15 coloane. Elementul de la intersecia liniei i cu
coloana j se va reIeri prin A(i,j).
2.4. Fiyiere
Fiyierele sunt, dup cum spuneam, modaliti de stocare a datelor pe suporturi magnetice externe,
pe discuri. Ele permit regsirea ulterioar a inIormaiei, pentru a putea Ii citit, stears sau
actualizat.
La nivel Iizic, evident c Iisierele stocheaz datele sub Iorma unui sir de octei, ns pentru
programator, grupuri de asemenea octei pot avea o anumit semniIicaie.
Accesul ntr-un Iisier se poate Iace direct sau secvenial. Accesul direct nseamn c se poate accesa
direct o i-a component, pe cnd cel secvenial presupune trecerea prin primele i-1 componente
pentru a ajunge la a i-a.
Datele pot Ii scrise sau citite dintr-un Iisier. Dar nainte de o asemenea operaie, Iisierul trebuie s
Iie deschis. Dup ce se opereaz citiri sau scrieri ntr-un Iisier, el trebuie nchis. AltIel, exist riscul
ca unele date s nu Iie scrise n totalitate n Iisier sau ca Iisierul s nu mai poat Ii deschis sau s se
deterioreze.
n general, programul lucreaz cu niste idenIicatori de Iisiere, adic cu niste variabile de tip Iisier.
ntre acestea si Iisierul Iizic propriu-zis are loc o asociere (asignare), prin care se precizeaz calea si
numele Iisierului propriu-zis.
Asadar, tehnica lucrului cu Iisiere este urmtoarea:
asignare si deschidere
scriere/citire
nchidere
n Visual Basic, se poate opera n mai multe Ieluri cu Iisierele. Instruciunea Open realizeaz att
asignarea ct si deschiderea unui Iisier. Eormatul (sintaxa) su este:
Open nume Eor mod |Access acces| |blocaj| As |#|numar |Lenlungime|
n care:
nume - este numele complet al Iisierului (inclusiv unitatea de disc si calea de directoare sau Ioldere,
dac este nevoie) si este parametru necesar; nume este o expresie de tip String;
mod - este un parametru necesar, speciIicnd modul Iisierului: Append, Binary, Input, Output sau
Random (implicit)
acces - parametru opional speciIicnd operaiile permise unui Iisier deschis Read, Write sau
Read Write;
blocaj - acest parametru opional speciIic Iaptul ce operaii sunt permise altor procese s le Iac
asupra Iisierului deschis: Shared, Lock Read, Lock Write si Lock Read Write.
Bogdan Ptru Programarea calculatoarelor electronice
18
numar - acesta este un parametru necesar, indicnd numrul Iisierului (din domeniul 1-511) si poate
Ii orice numr neales nc. Euncia EreeEile ne permite s obinem urmtorul numr de Iisier
disponibil
lungime - acesta este un parametru opional cel mult egal cu 32767 (octei); pentru Iisierele deschise
n acces aleator (Random), aceast valoare este lungimea unui articol (unei nregistrri); pentru
Iisierele secveniale, aceast valoare este numrul de caractere din zona de tampon (buIIer)
Dup cum am spus, orice Iisier trebuie s Iie deschis nainte vreunei operaii de intrare sau iesire
(scriere/citire). Instruciunea Open alocheaz un buIIer (o zon tampon) Iisierului si determin
modul de acces pentru Iolosirea cu buIIer-ul. Dac Iisierul speciIicat prin nume nu exist, el este
creat atunci cnd Iisierul se deschide ntr-unul din modurile Append, Binary, Output sau Random
Dac Iisierul este deja deschis de un alt proces si tipul de acces nu este permis, atunci operaia Open
esueaz si apare o eroare.
Clauza Len este ignorat dac modul este Binary.
Observaie
Putei deschide un Iisier n modurile Binary, Input sau Random utiliznd un numr de Iisier diIerit,
Ir ca mai nti s-l nchidei. n modurile Append si Output, trebuie ca mai nti s nchidei
Iisierul nainte de a l deschide cu un alt numr de Iisier.
Exemplu:
Urmtoarea secven de program deschide Iisierul TEST.TXT n modul de citire secvenial:
Open "TEST" Eor Input As #1
Urmtorul exemplu deschide acelasi Iisier n modul Binary doar pentru operaii de scriere:
Open "TEST" Eor Binary Access Write As #1
n continuare, se deschide Iisierul n modul Random. Eisierul conine nregistrri de tipul Candidat,
deIinit de utilizator:
Type Candidat
ID as Integer
nume As String*20
nota As Single
End Type
Declaraia String*20 deIineste un sir de caractere de lungime 20 (numrul de caractere alocate).
Dim C As Candidat
Open "TEST" Eor Random As #1 Len Len(C)
Bogdan Ptru Programarea calculatoarelor electronice
19
n continuare, se prezint un exemplu n care Iisierul este deschis pentru scrieri secveniale, iar nici
un proces nu poate citi sau scrie n Iisier:
Open "TEST" Eor Output Shared As #1
n Ine, urmtorul exemplu deschide Iisierul n modul Binary pentru citire, iar alte procese nu pot citi
din Iisier:
Open "TEST" Eor Binary Access Read Lock Read As #1
Exemplu:
Cel mai adesea, exemplele din aceast lucrare vor Iace reIerine la Iisiere text, care vor Ii deschise
n acces secvenial, ca n exemplele urmtoare:
Open "TEST" Ior Output As #1
Print #1, "Programarea"
Print #1, "calculatoarelor"
Close #1
Secvena de mai sus scrie, pe linii separate, cele dou cuvinte, iar secvena urmtoare le citeste n
variabilele s si t:
Open "TEST" Ior Input as #1
Line Input #1, s
Line Input #1, t
Close #1
Dac totusi se doreste s se lucreze cu Iisiere de nregistrri, atunci se va lucra cu Iisiere n acces
direct. n acest sens, instruciunea Seek realizeaz poziionarea pe o anumit nregistrare.
Exemplu:
Urmtorul exemplu Ioloseste instruciunea Seek pentru a stabili poziia urmtoarei citiri sau scrieri
n cadrul unui Iisier. Se presupune c exist Iisierul TEST, iar acesta conine nregistrri de tipul
Candidat, deIinit de utilizator:
Type Candidat
ID As Integer
nume As String * 20
nota As Single
End Type
Pentru Iisierele deschise n modul Random, Seek stabileste Iace poziionarea indicatorului de
citire/scriere n Iisier pe urmtoarea nregistrare:
Dim C As Candidat, MaxSize, i
Open "TEST" Eor Random As #1 Len Len(C)
MaxSize LOE(1) \ Len(C) ' preia numrul de nregistrri din Iisier
' Iuncia LOE d lungimea Iisierului, iar Len lungimea unei nregistrri
' urmtorul ciclu citeste toate nregistrrile ncepnd cu ultima
Bogdan Ptru Programarea calculatoarelor electronice
20
Eor i MaxSize To 1 Step - 1
Seek #1,i ' Stabileste poziia
Get #1, , MyRecord ' citeste nregistrarea
Next i
Close #1
Citirea din Iisier se realizeaz cu instruciunea Get, iar scrierea se realizeaz cu instruciunea Put.
Pentru Iisierele deschise n oricare alt mod, n aIara lui Random, Seek stabileste poziia octetului la
care va avea loc urmtorea operaie. S presupunem c TEST este un Iisier coninnd cteva linii de
text.
Dim MaxSize, NextChar, MyChar
Open "TEST" Eor Input As #1
MaxSize LOE(1) ' preia lungimea Iisierului n octei
' Urmtorul ciclu citeste toate caracterele din Iisier, ncepnd cu ultimul
Eor NextChar MaxSize To 1 Step -1
Seek #1, NextChar ' stabileste poziia
MyChar Input(1, #1) ' citeste caracterul
Next NextChar
Close #1
Pentru a nelege mai bine modul de Iuncionare a Iunciilor si instruciunilor de lucru cu Iisiere,
trebuie consultat documentaia produsului Visual Basic.
Ceea ce am dorit s punem n eviden aici a Iost, n primul rnd, c Iisierele reprezint un tip de
date structurat cu multiple posibiliti de acces secvenial si direct.
Programele pe care le vei realiza vor Iolosi aceast structur de date pentru datele n cantiti mari
sau cu grad mare de generalitate, iar datele interne, speciIice aplicaiei, vor putea Ii stocate n
tablouri sau nregistrri, dup caz, sau chiar n variabile simple, nestructurate.
Bogdan Ptru Programarea calculatoarelor electronice
21
De ce AND si nu OR?
Tipul Boolean. Operatorii logici. Legile lui De Morgan. Logica matematica
- Adevarat sau Ials. A treia varianta nu exista!
In urma cu multi, multi ani, oamenii si-au pus problema "sa se joace cu adevarul", adica sa Iaca rationamente,
pornind de la propozitii simple. Aristotel a inventat logica ce-i poarta numele, iar mai apoi Boole, un matematician
englez, a Iormalizat lucrurile obtinand ceea ce ne intereseaza pe noi in programare si anume logica booleana. In aceasta
logica avem de a Iace cu doua valori de adevar: Ials si adevarat. A treia varianta nu exista.
La un monent dat, ceva (o aIirmatie, o propozitie) poate Ii Iie adevarat, Iie Ials, dar niciodata amandoua. Unii spun
despre o anumita aIirmatie ca este "in general adevarata". In programare, in logica booleana, asa ceva nu exista. O
expresie booleana nu poate Ii in general adevarata. Cand spui "in general adevarat" inseamna, de Iapt, Ials. Pentru ca ce
nu este "intotdeauna" adevarat este Ials. De exemplu, aIirmatia (propozitia) logica "programatorii sunt buni la
matematica" nu poate Ii in general adevarata, atata timp cat o privim din punct de vedere logic, boolean. Daca nu exista
nici un programator care sa nu Iie bun la matematica, atunci propozitia noastra este adevarata. Daca insa exista cel putin
un programator care sa nu Iir bun la matematica, propozita noastra este Ialsa. Cum este propozitia noastra, din punct de
vedere logic? Ealsa, pentru ca am cunoscut eu un programator care nu se pricepea deloc la matematica! Din punctul de
vedere al vietii cotidiene, dar nu din punct de vedere logic, despre aIirmatia "programatorii sunt buni la matematica" se
poate spune ca este in general adevarata.
Sa luam acum un exemplu mai din programare. Acolo operam cu variabile, constante si expresii. Constantele nu-si
modiIica valorile, deci vor avea una (si numai una) din cele doua valori, care, in multe limbaje de programare sunt
notate cu True si respectiv Ealse. In alte limbaje de programare (de exemplu in C si C), in loc de Ealse se Ioloseste 0
(zero), iar orice alt numar in aIara de 0 corespunde valorii True.
Sa consideram doua variabile X si Y. Sa zicem ca X are valoarea 3, iar Y are valoarea 5. AIirmatia "X este mai mic
decat Y" (notata XY) este adevarata, pe cand aIirmatia "X este mai mare decat Y" este Ialsa. Dar si arirmatia "X este
mai mic sau egal cu Y-2" este adevarata, asa cum se va vedea mai tarziu.
- Negatia
Ceva poate Ii adevarat sau Ials, dar niciodata amandoua simultan. Cand spunem ceva, in programare ne reIerim,
este clar, la variabile, la constante si expresii. Prin negatie obtinem cealalta valoare, adica valoarea de adevar opusa
valorii curente. AstIel, daca P este o propozitie adevarata, atunci negatia lui P (notata adesea non P sau ~P sau P sau
not P (in Pascal), sau !P (in C/C)) este o propozitie Ialsa. Invers, daca Q este Ialsa, non Q este adevarata.
De multe ori in programare operam cu relatii intre diIerite variabile numerice, de exemplu scriem XY. O
asemenea expresie este una logica, deci de tip Boolean. Multi programatori incepatori nu stiu cum sa nege o asemenea
expresie. Desi se poate scrie not (XY) (in Pascal), se poate scrie mai simplu X~Y (cu sensul ca X este mai mare sau
egal cu Y). Este gresit sa se creada ca negatia lui XY este X~Y, pentru ca daca X nu este mai mic decat Y atunci Iie
este mai mare, Iie cele doua numere sunt egale. Deci, atentie!
- Si
Conjunctia este o operatie cu valori logice. Ea se reIera la operatorul "si" (notat cu . in logica, sau cu and in unele
limbaje de programare (ex. Pascal, Basic), respectiv cu "&&" in C/C.).
Ce inseamna, de Iapt, P si Q? Inseamna ca se intampla si P si Q, iar P si Q este o expresie adevarata daca si numai daca
P este adevarata si Q este adevarata (in acelasi timp). AstIel, o aIirmatie de Iorma "X~0 and Y~0" va Ii adevarata doar
daca ambele valori X si Y vor Ii pozitive nenule. Daca macar una dintre ele este Ialsa, atunci intreaga conjunctie este
Ialsa. La Iel si daca amandoua sunt Ialse.
- Sau
De obicei conjunctia nu ridica probleme. Nu acelasi caz este in cazul disjunctiei, reprezentata prin operatorul "sau".
Acesta se noteaza cu "v" in logica matematica, cu or in Pascal si Basic si cu in limbajul C/C. O expresie X or Y
este adevarata in trei din cele patru cazuri posibile: cand X este adevarata si Y este Ialsa, cand X este Ialsa si Y este
adevarata, dar si in cazul cand X este adevarata si Y este adevarata. Acest lucru nu prea se intelege in limbajul curent.
De exemplu, daca un om este intrebat ce va Iace in concediu si el raspunde prin "Ma duc la mare sau la tara.", noi
intelegem ca Iie se va duce la mare, Iie la tara, dar nu ne gandim ca s-ar putea duce in ambele locuri. Daca spunem ca o
Iemeie este Iie Irumoasa, Iie desteapta, excludem in mod gresit ca este posibil ca o Iemeie sa Iie si Irumoasa si desteapta
in acelasi timp! Aceasta excludere, daca are loc atunci cand programam, inseamna ca noi conIundam operatia "sau" cu
operatia "sau exclusiv", pe care o vom prezenta in continuare.
Bogdan Ptru Programarea calculatoarelor electronice
22
S Sau exclusiv versus Sau
Prin "sau" in programare se intelege, de Iapt, un "sau inclusiv", adica daca atat P, cat si Q sunt adevarata, atunci si
P sau Q este adevarata. Prin "sau exclusiv" (notat in Pascal si Basic prin xor) se intelege ca ori P este adevarata, ori Q
este adevarata, dar niciodata amandoua simultan. AstIel, P xor Q este o propozitie adevarata numai daca exact una
dintre propozitiile P si Q este adevarata. Daca P si Q sunt amandoua Ialse, sau amandoua sunt adevarate (atentie!),
atunci P xor Q este o propozitie Ialsa. Asadar, de multe ori, in limbajul curent intelegem prin cuvantul "sau" ceea ce in
programare intelegem prin operatorul de disjunctie exclusiva xor.
- Proprietati ale operatorilor logici
Operatorii logici (not, and, or si xor) au si ei niste proprietati, ca si operatorii aritmetici (, - etc.). AstIel, prioritatea
cea mai mare o are negatia (not), urmata de conjunctie si apoi de or si xor. Daca nu ne convine ordinea in care se vor
eIectua operatiile, nu avem decat sa Iolosim paranteze, de cate ori avem nevoie. AstIel, stim de prin clasa a II-a ca daca
avem de calculat 23*4 rezultatul este 14 si nu 20. Ni se pare evident ca rezultatul este 14 si ne intrebam de ce ar Ii 20,
dar uitam ca "ne-a intrat in sange" sa eIectuam mai intai operatia de inmultire (3*4 12) si apoi adunarea cu 2, ca sa ne
dea 14. Daca am Ii Iacut intai operatia de adunare (tinand cont ca este prima intalnita), am Ii avut 235 si apoi,
eIectuand inmultirea am Ii obtinut 5*420. Daca am Ii dorit sa obtinem acest rezultat, trebuia sa Iolosim paranteze,
astIel: (23)*4 si totul era OK.
Asa stau lucrurile si cu operatiile or si and, de exemplu. Daca scriem X or Y and Z, aceasta expresie este
echivalenta cu X or (Y and Z) si nu cu (X or Y) and Z. AstIel, daca X ar Ii Ialsa, Y adevarata si Z adevarata, atunci
expresia in discutie este una adevarata (corect). Daca in mod gresit am Iace operatiile de la stanga la dreapta, Iara a tine
cont de prioritatea lui "and" Iata de "or", expreia ar iesi, in mod gresit, una Ialsa.
Spuneam ca negatia are oricum prioritatea cea mai mare. AstIel, daca scriem "not X or Y", inseamna ca am scris
ceva echivalent cu "(not X) or Y" si nu cu "not (X or Y)". Sa nu ne mire atunci ca daca X si Y sunt adevarate, expresia
"not X or Y" este tot adevarata si nu Ialsa!
S Legile lui De Morgan
Legile lui De Morgan le-am intalnit la operatii cu multimi, dar lucruri similare se intampla si in cazul operatorilor
logici. Daca Iacem analogii cu multimile, atunci in loc de complementara unei multimi avem negatia, in loc de
intersectie avem conjunctia, iar in loc de reuniune avem disjunctia. Nu e de mirare, atunci, ca si simbolurile seamana
intre ele: Pe de o parte, reuniunea se noteaza cu , iar disjunctia cu v, iar pe de alta parte intersectia se noteaza cu si
conjunctia cu ..
Legile lui De Morgan in cazul logicii booleene ne ajuta pentru a scrie unele expresii logice ceva mai elegant sau
mai usor de urmarit. Ele sunt urmatoarele:
(P v Q) P . Q
si
(P . Q) P v Q
Acum sa consideram un caz concret din programare. Sa zicem ca avem de exprimat Iaptul ca X nu apartine
intervalului |A,B). Putem scrie not (X~A and XB), dar putem scrie si not (X~A) or not (XB). SimpliIicam lucurile
si ajungem la varianta XA or X~B, care este cea mai eleganta. Incepatorii gresesc, pentru ca ar scrie XA and X~B,
or asta nici nu este adevarat, nici macar nu se poate, pentru ca A este mai mic decat B!
Asadar, cu AND si cu OR nu ne jucam cum vrem noi, pentru ca intotdeauna trebuie sa rationam corect si logic.
Bogdan Ptru Programarea calculatoarelor electronice
23
Capitolul 3. Algoritmi
3.1. Etapele rezolvrii unei probleme
Rezolvarea unei probleme nu trebuie realizat niciodat la ntmplare. Este mult mai bine s se
procedeze sistematic, dect haotic. Este bine s se determine anumite reguli care, urmate, s
conduc la obinerea soluiei.
Rezolvarea unei probleme cu ajutorul calculatorului electronic presupune mai multe etape.
n primul rnd, trebuie ca problema s Iie Iormalizat. Aceasta presupune s clariIicm ce se d si
ce se cere: care sunt datele de intrare si care sunt datele de iesire. O dat cunoscute acestea, se vor
determina structurile de date cele mai potrivite reprezentrii lor n calculator.
Al doilea pas este analiza problemei. Ea se bazeaz pe aplicarea unei gndiri algoritmice, bazat pe
raionamente de tip matematic si logic, n urma crora se obine o metod general de rezolvare,
descris clar, Iolosind reprezentri Iormale (scheme, limbaje, tabele). AstIel se obine un algoritm.
O alt etap Ioarte important a rezolvrii problemei este programarea. AstIel, soluia este
reprezentat sub o Iorm acceptat de calculatorul electronic, adic un program.
Implementarea este ultima etap, ce const n aplicarea n practic a soluiei date, adic scrierea
programului pe un calculator.
Schematic, rezolvarea unei probleme cu ajutorul calculatorului se realizeaz astIel:
Analiza
Programarea
Implementarea
Problema
(formalizata)
Metoda generala
si clara de
rezolvare
(algoritm)
Program
(scris intr-un
limbaj de
programare)
Program
implementat
pe un
calculator
CUM CE CU CE
3.2. Definiia algoritmului
Un algoritm este o metod general de rezolvare a unei probleme. El este constituit dintr-o
succesiune Iinit de payi sau etape.
Prin pas de algoritm se nelege o secven Iinit de operaii (aciuni) care se pot eIectua ntr-o
unitate stabilit de timp. Un pas conine cel puin o aciune.
Bogdan Ptru Programarea calculatoarelor electronice
24
Dup Iiecare pas urmeaz exact un pas, n execuia algoritmului, eventual n Iuncie de anumite
condiii.
S considerm problema ordonrii cresctoare a n elemente de acelasi tip, comparabile ntre ele,
care ar Ii stocate sub Iorma unui vector X cu n elemente, numerotate de la 1 la n. Aceste elemente
se aIl, iniial, ntr-o ordine oarecare, iar la sIrsit ar trebui s ndeplineasc condiia ca Iiecare s Iie
mai mic sau egal dect succesorul su: X(1)X(2)...X(n). AstIel, am rezolvat etapa Iormalizrii
problemei.
A doua etap este analiza problemei si proiectarea algoritmului de rezolvare. Metoda pe care o vom
Iolosi (cunoscut sub denumirea de "sortarea prin bule") const n interschimbarea, pe rnd, a cte
dou elemente succesive din sir, pn cnd sirul va Ii ordonat.
AstIel, se compar X(1) cu X(2) si, dac nu snt n ordine (adic X(1)~X(2)), atunci se
interschimb. Apoi se procedeaz analog cu X(2) si X(3), X(3) si X(4) s.a.m.d., pn la X(n-1) si
X(n). Procesul se reia pn cnd, la o anumit parcurgere a vectorului, nu are loc nici o
interschimbare, ceea ce reprezint Iaptul c vectorul este ordonat.
Metoda de rezolvare trebuie acum scris sub Iorma unui algoritm. Pentru a realiza acest lucru se
poate Iolosi una din modalitile de reprezentare a algoritmilor.
- limbaje de tip pseudocod;
- scheme logice.
Limbajele de tip pseudocod sunt acelea care Iolosesc diIerite cuvinte numite cuvinte cheie,
preluate dintr-un limbaj natural, care au un neles strict, ele neputnd Ii Iolosite n alt context.
Exemple: dac, atunci, altIel, ct timp, execut, repet, pn cnd, pentru s.a.. Acestea Iormeaz
lexicul (vocabularul) limbajului. Regulile de Iormare a instruciunilor, pe baza cuvintelor cheie,
mpreun cu alte cuvinte sau simboluri, determin sintaxa limbajului. Instruciunea este
considerat cea mai mic entitate executabil dintr-un limbaj de programare, dar, prin generalizare,
ea poate Ii considerat chiar un pas de algoritm, cnd acesta se reprezint sub Iorm de limbaj
pseudocod. De Iapt, limbajele de tip pseudocod seamn Ioarte mult cu cele de programare.
Semantica limbajului este dat de nelesurile pe care le capt instruciunile ce alctuiesc un
algoritm.
Limbajele de tip pseudocod Iolosesc o sintax mult mai liber dect cele Iolosite de limbajele de
programare, acesta Iiind cele care permit scrierea unor programe recunoscute de un calculator. Ele
au si avantajul c un algoritm scris ntr-un limbaj pseudocod poate Ii neles de toi programatorii, n
timp ce unul scris ntr-un limbaj de programare va Ii neles doar de cunosctorii respectivului
limbaj.
Eolosind o reprezentare de tip pseudocod, metoda de ordonare descris se poate scrie ca algoritm
astIel:
Citeste(n, X)
repet
ordonat Adevrat;
pentru i de la 1 la n-1 execut
dac X(i)~X(i1) atunci
ordonat Eals;
interschimb pe X(i) cu X(i-1)
pn cnd ordonatAdevrat
Bogdan Ptru Programarea calculatoarelor electronice
25
O alt modalitate de reprezentare a algoritmilor o constituie utilizarea schemelor logice.
Schemele logice sunt niste scheme graIice, realizate cu ajutorul unor simboluri speciale care
deIinesc instruciuni sau condiii, pentru reprezentarea unui algoritm. Eiecare schem logic ncepe
cu un dreptunghi avnd colurile rotunjite, n care este scris cuvntul START. Schema logic se
termin cu unul sau mai multe dreptunghiuri rotunjite la coluri, ce conine cuvntul STOP.
Elementele constituente ale unei scheme logice sunt legate ntre ele prin sgei, care indic sensul
desIsurrii calculelor.
Instruciunile simple sunt reprezentate prin dreptunghiuri, n interiorul crora se scrie aciunea
realizat de respectiva instruciune. ntr-un dreptunghi intr cel puin o sgeat, dar iese exact una.
Romburile sunt Iolosite pentru a reprezenta condiii. Unii autori preIer s utilizeze triunghiuri n
locul romburilor. n orice caz, prin unul din coluri se intr cu o sgeat, iar prin alte dou coluri se
iese cu cte o sgeat. Cele dou sgei au atasate cuvintele DA, respectiv NU, sau ADEVRAT,
respectiv EALS, care indic n ce Iel este condiia din interiorul rombului (triunghiului).
Din dreptunghiul START pleac o sgeat, care indic nceputul execuiei algoritmului, iar n
dreptunghiul STOP intr sgei, pentru terminarea algoritmului.
Exemplu:
Rezolvarea ecuaiei de gradul I axb0 se poate descrie n schem logic astIel:
DA NU
DA NU
START
a=0
SCRIE
('NEDET')
b=0 x:=-b/a
SCRIE
('x=',x)
SCRIE
('IMPOS')
STOP
n limbaj natural, putem spune c rezolvarea ecuaiei se Iace astIel: se testeaz dac a este 0 sau nu;
dac a0, atunci dac si b este zero, ecuaia este nedeterminat, iar altIel este imposibil. Dac a nu
este zero, soluia ecuaiei este unic, x -b/a. Descriei dumneavoastr rezolvarea acestei ecuaii n
limbaj pseudocod. Realizai, de asemenea, schema logic a algoritmului de ordonare a vectorului X
cu n numere.
Bogdan Ptru Programarea calculatoarelor electronice
26
Observaie
Algoritmul problemei ecuaiei de gradul I presupune, totusi, citirea mai nti a valorilor lui a si b, iar
la sIrsit aIisarea unui text sau a valorii lui x. Acestea sunt instruciuni speciale, pentru realizarea
operaiilor de intrare si iesire (citire/scriere). Unii autori Iolosesc romburi pentru a reprezenta
asemenea operaii, n interiorul crora Iigureaz "citeste ... ", respectiv "scrie ...". Alii preIer ca
operaiile de citire (introducere) de date s Iie reprezentate prin trapeze isoscele cu baza mare sus,
iar scrierile s Iie reprezentate prin trapeze isoscele cu baza mare jos, n interiorul trapezelor scriind
doar valorile, expresiile sau variabilele n cauz.
3.3. Caracteristicile algoritmului
Am observat c algoritmul de rezolvare a problemei ordonrii a n numere, ca si cel de rezolvare a
ecuaiei de gradul I sunt generali, n sensul c ei rezolv cele dou probleme pe orice caz.. Se spune
c algoritmul rezolv o clas ntreag de probleme nrudite.
Cnd spunem c un algoritm rezolv o problem nelegem c se va ajunge la soluie dup un
numr Iinit (chiar dac Ioarte mare) de pasi. De asemenea, observm c algoritmii nostri nu au Iost
descrisi cu ambiguitate, deci sunt descrisi clar. Observm, de asemenea, c rezolvarea celor dou
probleme este posibil cu resursele pe care le avem la dispoziie.
Toate aceste trsturi caracterizeaz un algoritm, deosebindu-l astIel de orice alt metod de
rezolvare a unei probleme.
Asadar, un algoritm este o metod de soluionare a unei clase de probleme, metod reprezentat de
o succesiune Iinit de pasi, care are urmtoarele caracteristici:
- este descris clar, Ir ambiguiti n privina ordinei de execuie a instruciunilor;
- este corect, deci este o metod care rezolv problema pe orice caz, deci rezolv o ntreag clas
de probleme;
- este Iinit, deci se termin dup un numr Iinit de pasi, indiIerent ci de muli;
- este realizabil cu resursele disponibile
Denumirea de algoritm vine de la numele matematicianului persan Abu Ja`Iar ibn Musa al
Khowari:mi, adic din orasul Khowarazm (astzi Khiva, n Uzbekistan). Este acelasi care a introdus
denumirea de algebr n matematic.
Dndu-se o anumit problem, se pune ntrebarea: exist un algoritm care s o rezolve? Avem trei
rspunsuri posibile: DA, caz n care se construieste un algoritm; NU, caz n care se poate demonstra
(destul de diIicil) c nu exist o soluie algoritmic pentru respectiva problem; NU STIM dac
exist sau nu, caz n care s-ar putea ca problema s aib o soluie algoritmic, iar noi o cutm.
Eireste, pentru a rezolva o problem, orice algoritm gsit poate Ii acceptat, ns se preIer cei care
consum resurse spaio-temporale mai mici. n disputa spaiu-timp, de obicei se d cstig de cauz
timpului.
Un programator va cuta ntotdeauna s scrie algoritmi ct mai perIormani din punct de vedere al
timpului de execuie, determinat ca o Iormul n Iuncie de cantitatea datelor de intrare. Mrimea
Bogdan Ptru Programarea calculatoarelor electronice
27
datelor de intrare se numeste dimensiunea problemei , iar timpul necesitat de un algoritm n Iuncie
de dimensiunea problemei poart denumirea de complexitate a algoritmului .
Un exemplu concludent de comparare a complexitii a doi algoritmi l oIer problema determinrii
apartenenei unui numr p la un sir de n numere a
1
, a
2
, ..., a
n
ordonat (cresctor). AstIel, o metod
general de cutare, cum este cea a cutrii secveniale, este mult mai nceat, n general, dect
cutarea binar. n cutarea secvenial se pleac dintr-un capt al sirului ctre cellalt, pn se
gseste elementul p sau pn se ajunge la cellalt capt al sirului. Aceast metod este Ioarte
Iolositoare n cazul n care nu se cunoaste nimic despre aranjarea elementelor din sir. Pe de alt
parte, cutarea binar proIit de ordonarea deja existent n cadrul sirului a
1
, ... a
n
, procednd dup
cum urmeaz:
+ dac numrul din mijloc este mai mic dect numrul cutat, atunci cutm n a doua jumtate;
+ dac numrul din mijloc este mai mare ca numrul cutat, atunci cutm n prima jumtate;
+ dac numrul din mijloc este egal cu numrul cutat, nseamn c am gsit numrul n cauz si
trebuie s oprim cutarea.
Cutarea n jumtatea aleas se Iace tot la Iel, deci se va njumti si aceast zon s.a.m.d, pn se
termin zona de cutare.
De un real interes se bucur asa numiii algoritmi recursivi , care au proprietatea c n descrierea
lor se autoapeleaz (de obicei pentru probleme de dimensiuni mai mici). Chiar si algoritmul de
cutare binar poate Ii scris sub o Iorm recursiv.
Ce e important si ce nu in programare?
Despre algoritmi si programe. Limbaje si medii de programare. Cum alegem un mediu de programare
- Daca inlocuiesti stiloul cu pana nu ajungi poet.
E mai mult decat evident! Au Iost atatia scriitori care au scris noaptea, la lumina lumanarii si cu pana si au lasat
omenirii opere literare de mare valoare. Asa cum un amator netalentat poate Iolosi stiloul cu penita de aur cel mai
scump sau chiar calculatorul si imprimanat si sa nu realizeze nimic valoros din punct de vedere literar. Asa stau
lucrurile si in programare. Poti apela la un mediu de programare Ioarte perIormant si sa nu poti realiza nimic valoros,
sub aspect informatic, pe cand- poate - Iolosind un mediu de programare mai putin dezvoltat, sa realizezi programe
care sa-i incante pe toti. Mediul de programare este pentru programator, precum pana sau stiloul pentru scriitor. Iar
programul este precum un roman sau o poezie.
Eireste, daca Iolosesti un toc a carui penita o inmoi mereu in calimara cu cerneala, poti avea diverse probleme.
Poate ca din greseala rastorni calimara si patezi tot ce ai scris sau poate penita va scrie in unele locuri mai ingrosat, iar
in altele mai subtire. Asta, insa, nu va aIecta nicicum valoarea operei literare si nu va schimba cu nimic opinia criticilor
despre ea. Daca scriitorul va Iolosi un stilou cu rezerve de cerneala sau multe din problemele sale se vor rezolva. Daca
va apela la un calculator, va putea corecta cu usurinta greselile, adauga noi Iragmenet de text printre cele scrise deja si
va putea imprima lucrarea Iolosind caractere diIerite. Va lucra mult mai comod, deci schimbarea instrumentului este in
Iavoarea scriitorului si nu a cititorului. Asa se intampla si cu programele. Eolosind medii de programare avansate,
programatorul isi va usura o importanta parte din munca sa, dar pentru a veni in intampinarea "cititorilor" sau, va trebui
sa dea dovada de mult talent, de multa pricepere si imaginatie, pentru ca "opera" sa sa Iie deosebita si sa raspunda
cerintelor beneIiciarilor.
Bogdan Ptru Programarea calculatoarelor electronice
28
- Ce este algoritmul? De ce trebuie sa inveti sa soIezi in general si nu sa conduci Dacia?
Pentru ca daca inveti sa conduci Dacia, s-ar putea sa nu te descurci decat cu autoturismul Dacia, eventual pe un alt
model, dar nu si pe o masina la volanul careia nu te-ai asezat niciodata. Sa presupunem ca intr-o buna zi vei avea un
Mercedes. Daca vei stapani tehnica soIatului in general si nu vei invata pe de rost cateva comenzi de la masina Dacia,
vei reusi sa te adaptezi cu usurinta noului tau autoturism si, Iara experienta prea mare la volanul sau, vei putea, in cateva
zile, sa conduci acest Mercedes asa cum conduceai Dacia.
Programarea se rezolva cu rezolvarea de probleme. Eireste, nu orice gen de probleme, ci acelea care opereaza cu
inIormatii si pot Ii modelate pe calculator. Daca nu stim o metoda generala de rezolvare a problemelor, ci doar un
numar de rezolvari de probleme particulare, nu vom putea sa ne descurcam cu usurinta in situatii noi. Noi trebuie sa
stapanim tehnica rezolvarii de probleme de programare si nu sa invatam pe de rost cum se rezolva problema X sau
problema Y. Daca stim sa realizam un program prin care sa desenam, pe ecranul calculatorului, un patrat rosu si un
patrat verde nu trebuie sa Iim multumiti! Trebuie sa vedem cum putem desena un patrat de orice culoare si in orice
pozitie a ecranului. Adica sa determinam algoritmul de rezolvare a problemei desenarii patratelor.
Algoritmul nu este altceva decat o metoda de rezolvare a unei clase de probleme, adica a unor probleme Ioarte
asemanatoare intre ele. In general aceste probleme diIera intre ele prin dimensiunea lor, exprimata adesea printr-un
numar natural n. Pentru a intelege mai bine, vom exempliIica. Mai intai, vom considera doua probleme Ioarte
asemanatoare.
Sa consideram ca avem un pahar cu vin si unul cu suc si un pahar gol. Pentru a interschimba continutul primelor
doua pahare, putem turna vinul in paharul al treilea. Acum primul pahar este gol si putem turna in el continutul celui de-
al doilea pahar, adica sucul. Paharul al doilea devine gol si turnand din paharul al treilea in el, vom avea aici vinul.
A doua problema este exact ca prima, doar ca in loc de vin si suc avem apa si bere. Eireste, problema se rezolva la
Iel. In general, pe programator nu-l intereseaza ce se gaseste in cele doua pahare, el pur si simplu doreste sa gaseasca
metoda de interschimbare a continuturilor celor doua pahare, pur si simplu. AstIel, din punct de vedere inIormatic, cele
doua probleme prezentate mai sus nu sut doua probleme de programare diIerite, ci doar una. Asta deoarece
inIormaticianul nu ia niciodata in considerare "continuturile paharelor", deci nu-l (prea) intereseaza valorile datelor pe
care le prelucreaza. Pentru el e Ioarte putin important daca in cele doua pahare se aIla vin, bere, suc sau chiar acid
clorhidric sau sulIuric. Lucruri esentiale pentru cei ce utilizeaza un program pot Ii Iara nici o importanta pentru
programator!
Spuneam, totusi, ca in general problemele rezolvate de acelasi algoritm diIera printr-un numar natural n. AstIel, in
cele doua cazuri de mai sus avem de a Iace cu o singura problema de inIormatica, care se numeste interschimbarea
valorilor a doua variabile. Nu se poate spune despre cele doua probleme ca Iormeaza o clasa de probleme, dar sa dam
un alt exemplu.
Mai multe persoane candideaza la un concurs de admitere la un liceu sau la o Iacultate. Candidatii pot Ii aranjati in
ordinea descrescatoare a mediilor sau in ordinea alIabetica a numelor lor sau in Iunctie de orice alt criteriu. Candidatii
pot Ii oricati, Iie 100, Iie 2000 Iie chiar mai multi, deci putem nota numarul lor cu n. Acum avem de a Iace cu o clasa de
probleme, care pot Ii rezolvate prin acelasi algoritm. Daca vom gasi metoda generala de rezolvare, adica algoritmul,
vom sti sa aranjam 100 candidati, descrescator dupa note, sau 2000 de candidati, in ordine alIabetica.
Asadar, algoritmul este o metoda generala de rezolvare a unei clase de probleme. Nu este de ajuns. Exista multe
asemenea metode de rezolvare, dar trebuie sa le consideram doar pe cele care se termina intr-un timp Iinit, sau intr-un
timp util pentru noi. De asemenea, esential este Iaptul ca un algoritm sa Iie descris clar, Iara ambiguitati, pentru a putea
Ii inteles de oricine.
Cum am putea descrie o metoda de rezolvare a unei probleme asa incat sa poata Iie inteleasa exact de catre oricine?
Sunt mai multe cai, dar Iolosind limba romana, sau engleza sau orice alta limba naturala, vorbita, este posibil ca sa nu
Iim intelesi de toata lumea si intotdeauna. Cu atat mai mult de catre un calculator, care nu este atat de inteligent incat sa
inteleaga o limba naturala. El poate invata o limba (un limbaj) simplu, cu un vocabular redus si cu putine reguli de
sintaxa, dar pe care trebuie sa le invatam (si noi si el) si sa le respectam cu mare rigurozitate.
In limbajul natural pot aparea ambiguitati. Un exemplu este celebra Iraza "Am vazut un om pe deal cu un telescop".
Aceasta Iraza poate Ii inteleasa in trei Ieluri: "Eolosind un telescop, am vazut un om, care era pe deal.", "Am vazut pe
dealul pe care era un telescop, un om" sau "Am vazut pe deal un om, care avea un telescop la el".
Limbajul natural a Iost Iolosit cu mult succes de invatatoarea noastra, atunci cand ne-a invatat adunarea si scaderea
numerelor, cu mai multe ciIre (numerele, nu invatatoarea!) Cand am invatat scaderea, ne-a spus sa asezam numerele
unul sub altul si e Ioarte probabil ca toata lumea a inteles ca trebuie sa aseze al doilea numar (scazatorul) sub primul
(descazutul) si nu invers. Apoi ne-a explicat ca trebuie sa scadem ciIra din ciIra, iar cand nu ne ajunge sa ne
"imprumutam" de la ciIra din dreapta. Noi am inteles, mai repede sau mai tarziu, cum se procedeaza, care ciIra din care
se scade, de la cine ne imprumutam. Am reusit sa invatam din doua motive: pentru ca suntem inteligenti (iar
calculatorul, atentie!, nu este) si pentru ca am exersat pe mai multe exemple (ceea ce nu se pune problema in cazul
calculatorului).
Bogdan Ptru Programarea calculatoarelor electronice
29
AstIel, pentru a nu aparea ambiguitati, vom reprezenta algoritmii Iolosind limbaje artiIiciale, create de om, ca sa
vina in sprijinul calculatorului. Cele mai Iolosite modalitati de reprezentare ale algoritmilor sunt limbajele pseudocod si
schemele logice. Despre ele se discuta in manualul de inIormatica.
- Ce este programul? Ce este un limbaj de programare?
Nu e de ajuns sa gasesti un algoritm pentru a rezolva o anumita problema. Trebuie sa-l si descrii, adica sa-l
reprezinti. Cel mai bine este sa Iolosesti totusi, un limbaj de programare, adica un limbaj de compromis intre om si
calculator. Programul este, practic, reprezentarea intr-un asemenea limbaj a unui algoritm. Daca vrei ca algoritmul tau
sa poata Ii inteles usor de multa lume, care stie sau nu stie un limbaj de programare sau altul, este bine sa apelezi la
limbajele pseudocod. Ele seamana mult cu limbajele de programare, dar au mai putine restrictii sintactice si oIera mai
multa libertate programatorului.
Dar cel mai bine este sa scrii direct programul, Iolosind un limbaj sau altul de programare, adecvat problemei pe
care doresti sa o rezolvi prin respectivul algoritm. In general, programatorii stiu sa "citeasca" un program scris intr-un
limbaj de programare pe care nu-l cunosc, deoarece limbajele de programare seamana mult intre ele, sunt cam la Iel
gandite si realizate. Seamana intre ele mai mult decat limbile vorbite. Exista, Iireste, si limbaje de programare speciale,
care nu se aseamana cu celelalte, dar sunt mai putine si nu ne vom reIeri la ele in aceasta lucrare.
Pascal, C, C, Java, Basic sunt limbaje de programare. Ele au Iost inventate de oameni, cu creionul pe hartie. E ca
si cum ai inventa tu acum o limba noua. Inventezi cateva cuvinte (care sa deIineasca substantive, verbe, adjective), apoi
reguli de scriere, de sintaxa a propozitiei si a Irazei si intelesurile (semantica) unor asemenea constructii gramaticale.
Asta nu inseamna ca cineva va sti sa si vorbeasca limba inventata de tine!
- Ce este un mediu de programare?
Asa stau lucrurile si cu Pascal, C, C si celelalte. Ele au Iost inventate de oameni ca Niklaus Wirth, Denis Ritchie,
Bjarne Stroupstroup, dar apoi a trebuit sa se realizeze implementari ale lor. Adica niste programe speciale (scrise in alte
limbaje de programare, mai vechi si mai primitive) care puse pe calculator sa stie sa inteleaga (compileze sau
interpreteze) un text (program) in Pascal, C, C etc. O implementare a unui limbaj de programare devine un mediu de
programare. Dar un mediu de programare de astazi are mult mai multe Iunctii decat cea principala, de interpretare si
executare a programului scris de noi. Un mediu de programare modern te ajuta sa depanezi programul realizat, sa-i
schimbi ordinea de executie a instructiunilor din el, sa vizualizezi diIerite aspecte legate de datele de intrare, de
rezultate sau sa realizezi o serie de prelucrari necesare bunei Iunctionari a programului. De asemenea, un mediu de
programare vine cu modiIicari si imbunatatiri la limbajul de programare de baza, standard.
Turbo Pascal, Delphi sunt medii de programare bazate pe limbajul Pascal, C Builder si Visual C sunt medii de
programare bazate pe limbajele C si C, iar Visual Basic este un mediu de programare bazat pe limbajul Basic.
- Concluzie! Cine stie sa soIeze poate conduce un Mercedes!
Asadar, am plecat de la problema de programare. Ea prelucreaza inIormatii pentru a obtine altele. Pentru a rezolva
o problema (si toate asemenea ei), avem nevoie de un algoritm. Ca algoritmul sa Iie descris Iara ambiguitati si sa Iie
inteles de un calculator, cel mai bine este sa Iolosim un limbaj de programare adecvat. Algoritmul devine program.
Pentru ca totul sa mearga repede, Irumos si bine si ca sa punem programul la lucru, vom Iolosi un mediu de programare
corespunzator.
Limbajele de programare sunt cu sutele, iar mediile de programare cu zecile. Eiecare mediu de programare se
comercializeaza impreuna cu o carte groasa, numita documentatia sa, in care este descris si nimeni nu va putea sa stie
pe de rost tot ce este acolo, nici macar cei care au creat mediul de programare si au scris cartea. Nici nu trebuie sa-ti bati
capul prea mult cu asta. Tu trebuie sa stii sa rezolvi probleme, deci sa elaborezi algoritmii potriviti problemei date. Vei
alege apoi cu mare usurinta limbajul de programare si mediul de programare adecvat si te vei adapta la momentul
potrivit lui. Nu vei putea tine niciodata pasul cu evolutia impresionanta a tehnologiei din ultimii ani, de aceea nici nu
trebuie sa-ti bati capul cu noile medii de programare care apar pe piata. Ele sunt simple produse comerciale, mai mult
sau mai putin perIormante. Tu invata baza, adica sa programezi, ceea ce inseamna in primul rand sa rezolvi probleme si
sa elaborezi algoritmi. Cine stie sa soIeze va putea sa conduca si cel mai soIisticat Mercedes!
Bogdan Ptru Programarea calculatoarelor electronice
30
Capitolul 4. Elementele programrii structurate
4.1. Structurile de baz
O caracteristic important a descrierii n limbaj pseudocod a algoritmilor este utilizarea grupurilor
de cuvinte: dac...atunci...altIel... si att timp ct... execut... .
De asemenea, ntr-un algoritm, instruciunile se execut ntr-o ordine bine deIinit, care se exprim
n limbajul pseudocod prin instruciuni scrise una dup alta, de sus n jos, adic secvenial. n cele
ce urmeaz vom descrie n limbaj psudocod un algoritm care Ioloseste toate aceste elemente.
S considerm problema intrrii unui bolnav ntr-un cabinet medical. Putem aprecia c aceast
problem se rezolv astIel: mai nti, bolnavul va bate la us; dac medicul rspunde aIirmativ (prin
'poItim!), atunci pacientul va intra, altIel va astepta pn cnd se va elibera cabinetul, dup care va
intra.
n limbaj pseudocod am putea scrie:
1. bate la us;
2. dac rspunsul poItim !` atunci
2.1. intr n cabinet
altIel
2.2.1. att timp ct cabinetul este ocupat execut
2.2.1.1. asteapt;
2.2.2. intr n cabinet
Putem reprezenta schematic succesiunea anterioar de instruciuni astIel:
Primul dreptunghi corespunde instruciunii 1, al doilea instruciunii mari 2. Aceasta este compus
din mai multe instruciuni:2.1, 2.2.1 si 2.2.2. Instruciunea 2.2.1 este compus din anumite cuvinte
speciale si din instruciunea 2.2.1.1. De aceea am desenat ngrosat cel de al doilea dreptunghi.
Instruciunea respectiv se detaliaz astIel:
Bogdan Ptru Programarea calculatoarelor electronice
31
Asadar, condiia ncadrat de cuvintele dac si atunci este reprezentat n schema alturat printr-un
romb, cu o intrare si dou iesiri spre cele dou ramuri: NU si DA. Ramura NU conine, la rndul ei
o instruciune complex:
Si instruciunea att timp ct... execut... conine o condiie dintr-un romb. Ea este ncadrat de
grupurile de cuvinte att timp ct si execut.
Exemplul anterior ne-a permis s evideniem trei structuri de control de baz , cu ajutorul crora
se pot descrie algoritmii: secvena, decizia si repetiia condiionat anterior.
Bogdan Ptru Programarea calculatoarelor electronice
32
Eireste, prin instructiune (pas de algoritm) se poate nelege, n toate cele trei cazuri, Iie o
instruciune simpl, Iie una compus.
O instruciune compus este Iormat dintr-o secven de instruciuni, eventual ncadrate de
cuvintele inceput si sfrit. Instruciunile componente pot conine, la rndul lor, blocuri de
alternativ si repetiie.
Cele trei structuri prezentate sunt numite structuri de baz. Ultima este, de Iapt, o repetiie cu test
iniial, sau condiionat anterior. Vom vedea mai trziu c exist si alt gen de repetiii, cnd vom
nva despre structurile auxiliare.
Acum putem da schema complet a problemei intrrii n cabinetul medical, care Ioloseste cele trei
structuri de baz:
Prin generalizare, putem spune c programarea este arta si tehnica realizrii de algoritmi, care
ulterior vor Ii descrisi si implementai n programe pe calculator, scrise ntr-un limbaj de
programare.
Programarea pe baza celor trei structuri (si a celor auxiliare, ce vor Ii prezentate) se numeste
programare structurat .
InIormaticienii Bhm si Jacopini au Iormulat un principiu al programrii structurate, sub Iorma
unei teoreme: cele trei structuri (secvena, decizia si repetiia condiionat anterior) sunt suIiciente
pentru a descrie orice algoritm.
Oricrei scheme logice i se pot aduga noi instruciuni si noi condiii (predicate) astIel nct s se
obin o schem logic structurat, echivalent primeia.
Pentru a nelege ce ar nsemna programare nestructurat, s reconsiderm algoritmul de intrare n
cabinetul medical. Repetiia att timp ct cabinetul este ocupat execut ateapt poate Ii rescris
astIel:
Bogdan Ptru Programarea calculatoarelor electronice
33
A: dac cabinetul este ocupat atunci
asteapt
treci la pasul A
Aceast ntoarcere ("treci la pasul A") poate deranja, deoarece revenirea nseamn si nerespectarea
regulii conIorm creia instruciunile se execut secvenial, una dup alta. Trecerea execuiei
programului la o anumit instruciune etichetat poate avea loc si peste un numr Ioarte mare de alte
instruciuni, iar o astIel de instruciune, numit instruciunea de salt necondi ionat trebuie evitat.
Programarea se numeste nestructurat dac Ioloseste instruciunea de salt necondiionat.
Dac saltul ar Ii ctre o instruciune Ioarte ndeprtat, atunci ar Ii mai greu de urmrit algoritmul.
InIormaticienii au demonstrat c nici nu e nevoie s Iie Iolosit aceast instruciune de salt,
deoarece cele trei elemente ale programrii structurate sunt suficiente pentru a descrie orice
algoritm. Dac, ns, Iolosirea instruciunii de salt ar Iace procedura mai lizibil, atunci se poate
apela la aceast instruciune.
Observaie
De remarcat c structurile secvenial, alternativ si repetitiv condiionat anterior sunt suIiciente,
nu si neaprat necesare pentru proiectarea structurat a unui algoritm.
De asemenea, structura alternativ se poate elimina, Iolosind dou structuri repetitive, n combinaie
cu introducerea unei variabile logice (un element ce poate Ii adevrat sau Ials), dup cum urmeaz:
dac c atunci i
1
altIel i
2
se nlocuieste, Iolosind variabila logic b, cu:
bAdevrat;
ct timp (badevrat) si (c) execut
i1; bEals;
ct timp (badevrat) si (c) execut
i2; b:Ials sIrsit
4.2. Structurile auxiliare
S revenim asupra algoritmului de ordonare a unui vector X cu n elemente, pe care l-am prezentat
n paragraIul 3.2:
Citeste(n, X)
repet
ordonat Adevrat;
pentru i de la 1 la n-1 execut
dac X(i)~X(i1) atunci
ordonat Eals;
interschimb pe X(i) cu X(i-1)
pn cnd ordonatAdevrat
Bogdan Ptru Programarea calculatoarelor electronice
34
Observai c descrierea algoritmului n pseudocod Ioloseste trei structuri de control asemntoare
celor prezentate deja, dar au anumite diIerene Ia de ele. AstIel de structuri de control , numite
auxiliare, au Iost introduse tocmai pentru a usura scrierea algoritmilor, dar ele pot Ii substituite de
celelalte.
Prima dintre ele este decizia cu ramur vid, adic:
dac condiie atunci
instruciune
adic nu mai exist ramura cu altfel
n acest caz, dac este adevrat condiia, atunci se execut instruciunea, iar dac este Ials
condiia, nu se mai execut nimic. Ai observat, probabil, c s-a Iolosit aceast structur n
algoritmul de sortare prezentat mai sus.
Exist si o Iorm special de decizie, numit decizia multipl :
n caz c e este
e
1
: instruciune
1
;
e
2
: instruciune
2
;
..........................
AstIel, se evalueaz expresia e, iar dac valoarea ei este identic cu valoarea uneia dintre expresiile
e
1
, e
2
s.a.m.d., atunci se execut instruciunea corespunztoare.
Algoritmul de sortare descris mai nainte Ioloseste dou structuri speciale:
structura repetitiv condiionat posterior:
repet
instruciune
1
;
instruciune
2
;
.....................
pn cnd condiie
Aceasta nseamn c se execut n mod repetat secvena de instruciuni speciIicat, pn la
ndeplinirea condiiei de la Iinal. Spre deosebire de structura repetitiv condiionat anterior, aici
secvena de instruciuni se execut cel puin o dat. n cazul lui ct timp ... execut ..., dac de la
bun nceput nu era ndeplinit condiia, atunci instruciunea sau instruciunile din ciclu nu se
execut.
AstIel, structura repet poate Ii scris, pe baza structurilor de baz astIel:
instruciune
1
;
instruciune
2
;
....................
ct timp not condiie execut
instruciune
1
;
instruciune
2
;
....................
Bogdan Ptru Programarea calculatoarelor electronice
35
Att n cazul repetiiei condiionat anterior, ct si n cea condiionat posterior, prezentate mai
nainte, numrul de pasi ai ciclului nu poate Ii calculat aprioric. Asemenea structuri repetitive se
mai numesc si cu numr necunoscut de payi .
Structura special pentru este o structur repetitiv cu numr cunoscut de payi . AstIel, numrul
de pasi ai ciclului poate Ii calculat aprioric pe baza celor trei expresii ce compun structura:
pentru v de la e
1
la e
2
|cu pasul e
3
| execut
instruciune
Structura pentru poate Ii considerat Iie condiionat anterior, Iie condiionat posterior, iar acest
lucru depinde de implementarea limbajului n care structura se regseste sub Iorma unei
instruciuni. n general, ea este o structur condiionat anterior, iar semniIicaia ei este:
Dac e
3
lipseste, atunci se consider e
3
1.
Dac (e
3
~ 0 si e
1
~e
2
) sau (e
3
0 si e
1
e
2
), atunci nu se execut nimic.
n orice alt caz, structura este echivalent cu:
v e
1
;
ct timp v~e
2
execut
instruciune;
v v e
3
Asadar, orice structur de control de tip pentru, ca si celelalte structuri auxiliare, poate Ii scris pe
baza celor de baz.
4.3. Teorema programrii structurate
Exist o serie de teoreme care se reIer la programarea structurat, dar pentru noi are importan
teorema de structur a lui Bhm si Jacopini care se poate enuna astIel: orice schem logic
nestructurat poate Ii nlocuit cu una echivalent, dar structurat, prin adugarea de noi aciuni si
condiii. Asadar, orice program poate Ii pus sub o Iorm structurat, adic s conin doar structurile
de baz si/sau structurile auxiliare, prin utilizarea unor variabile boolene asociate unor Iuncii
suplimentare.
S exempliIicm pe cazul unui algoritm scris n limbaj pseudocod. Algoritmul urmtor determin
cel mai mic element (notat min) din sirul de n elemente X:
Citeste(n, X);
i 2;
min X(1);
A: dac i~n atunci
treci la pasul B
altIel
dac X(i)min atunci
min X(i);
i i1;
treci la pasul A
B: Scrie(min)
Bogdan Ptru Programarea calculatoarelor electronice
36
Observai c algoritmul nu este scris sub o Iorm structurat (apare instruciunea de salt
necondiionat "treci la pasul"). n schimb, urmtoarea Iorm reprezint acelasi algoritm si este
structurat:
Citeste(n, X);
min X(1);
pentru i de la 2 la n execut
dac X(i)min atunci
min X(i);
Scrie(min)
Aceasta este cea mai elegant Iorm de scriere a algoritmului de determinare a minimului. O alt
Iorm, care Ioloseste doar structurile de baz ar Ii:
Citeste(n, X);
min X(1);
i 2;
ct timp i n execut
dac X(i)min atunci
min X(i);
i i1
Scrie(min)
4.4. Instruciunea de atribuire. Operaii de intrare yi ieyire
Instruciunea de atribuire
Vom reveni n acest paragraI si vom insista asupra unor instruciuni eseniale n orice limbaj de
programare.
n primul rnd, avem instruciunea de atribuire, numit si de calcul sau de asignare, prin care o
variabil primeste valoarea unei expresii date. n general, n pseudocod, instruciunea de atribuire se
noteaz prin v e, iar n limbajele de programare astIel:
Basic: v e sau Let v e; Pascal: v : e; C/C: v e; EoxPro: v e sau Store e To v.
n toate cazurile, v este o variabil, iar e este o expresie. Se consider c v si e au acelasi tip sau c
exist o compatibilitate ntre tipul lui v si tipul lui e. Prin aceast instruciune, vechea valoare a
variabilei v se pierde (dac v avea o anumit valoare), expresia e se evalueaz, iar valoarea lui e este
dat variabilei v; Iireste, expresia e nu suIer nici o modiIicare.
Exemplu:
Vom da un exemplu n limbajul Basic. Presupunem c avem trei variabile x, y si z de tip ntreg.
Dim x As Integer, y As Integer, z As Integer
x 3 (x devine egal cu 3)
y 2 (y devine egal cu 2)
z x y (z devine egal cu 3 2, deci cu 5)
x x 1 (acum x devine egal cu 3 1, adic se adun la Iosta valoare a lui x (3) valoarea 1, iar
rezultatul (4) se atribuie variabilei x)
Bogdan Ptru Programarea calculatoarelor electronice
37
y x z (acum y devine egal cu 4 5, deci 9)
S considerm un alt exemplu, din limbajul Pascal:
Eie declaraiile de variabile:
var m, n: Integer; x, y: Real; c, d: Boolean;
Putem avea urmtoarele atribuiri, considerate corecte:
x : 2 3 (rezultatul este 5, numr ntreg, dar si real, iar x va deveni egal cu 5)
m : Round(x/3); (rezultatul este 1, adic 5/3 rotunjit la cel mai apropiat numr ntreg)
n : 4; (n ia valoarea 4, numr ntreg)
c : m n; (c este o variabil boolean; comparndu-se valorile lui m si n, se constat c m este
diIerit de n (1 este diIerit de 4), asadar c va Ii Ealse)
d : not c (d va Ii True)
n limbajul C se pot Iace conversii prin chiar instruciunea de atribuire, de la un tip la altul, ca n
exemplul urmtor:
int m, n;
Iloat x;
char c;
x 5.3;
m x;
n 65;
c n;
n acest exemplu, prima dat x ia valoarea 5,3, dup care m ia valoarea prii ntregi a lui x, adic 5;
penultima instruciune atribuie lui n valoarea numeric 65, iar prin instruciunea c n, caracterul c
devine egal cu 'A', pentru c n este 65, iar caracterul avnd acest cod ASCII este tocmai 'A'.
Operatori de incrementare/decrementare n limbajul C
Limbajul C pune la dispoziia programatorilor niste operatori speciali pentru realizarea unor operaii
speciale de atribuire numite incrementri sau decrementri. Dac valoarea variabilei a creste cu
valoarea 1 putem scrie a sau a, n loc de clasicul aa1. De asemenea, o decrementare cu o
unitate se poate scrie a-- sau --a, n loc de aa-1.
Dac se doreste incrementarea, respectiv decrementarea lui a cu o valoare b oarecare, se va scrie:
ab, respectiv a-b. AstIel, ab semniIic aab, iar a-b semniIic aa-b. Evident, operaia
a1 este echivalent cu aa, iar a-1 cu a--.
Cu toate c aparent, a si a (ca si a-- si --a) semniIic acelasi lucru, adic o incrementare
(decrementare) cu o unitate a lui a, totusi, exist cazuri cnd cele dou instruciuni au nelesuri
diIerite. AstIel, a nseamn "Ioloseste-l pe a, apoi incrementeaz-l pe a cu 1", pe cnd a
nseamn inversarea celor dou operaii: "incrementeaz-l pe a cu 1, apoi Ioloseste-l".
AstIel, pentru a calcula suma componentelor unui tablou unidimensional cu indici de la 0 la 9
declarat prin int x|10| putem scrie:
Ior (S0; i0; ) Sa|i| sau Ior (S0; i-1; ) Sa|i|
Bogdan Ptru Programarea calculatoarelor electronice
38
n primul caz se Ioloseste i ca indice n vectorul a, apoi se incrementeaz, iar n al doilea caz i se
incrementeaz, apoi se Ioloseste pe post de indice n cadrul vectorului a.
Asadar, Sa|i| este echivalent cu Sa|i|; ii1,
pe cnd Sa|i| este echivalent cu ii1; Sa|i|.
Operaii de intrare yi ieyire
Eoarte importante ntr-un limbaj de programare sunt si operaiile de intrare yi ieyire. Prin acestea
se realizeaz comunicarea ntre om si calculator. Operaiile de intrare, numite si de citire sunt
acelea prin care anumite variabile primeste valori dintr-un mediu extern, Iie dintr-un Iisier, Iie de la
tastatur (considerat si ea ca un Iisier). Operaiile de iesire, numite si de scriere sau de afiyare
sunt acelea prin care ntr-un mediu extern (Iisier, ecran sau imprimant) se scriu (aIiseaz, imprim)
valorile unor expresii. Exist, n multe medii de programare, anumite Iisiere standard pentru intrare,
respectiv iesire. De pild, n limbajul C, prin stdin se nelege Iisierul standard de intrare, iar prin
stdout Iisierul standard de iesire. n general, acestea se consider a Ii tastatura, respectiv monitorul,
dar pot Ii redeIinite.
Operaiile de intrare si iesire sunt realizate Iie prin apelarea unor proceduri speciale (ca n cazul
limbajului Pascal sau C/C), Iie prin Iolosirea unor instruciuni speciale (ca n Basic).
n limbaj de tip pseudocod vom scrie:
Citeste(v
1
, v
2
, ..., v
n
) pentru a citi valori pentru variabilele v
1
, v
2
s.a.m.d;
Scrie(e
1
, e
2
, ..., e
n
) pentru a scrie valorile expresiilor e
1
, e
2
s.a.m.d..
n limbajul de tip pseudocod am Iolosit operaiile de citire/scriere doar pentru Iisierele standard
(tastatur/monitor). n limbajele de programare putem avea si alte Iisiere de citire/scriere.
AstIel, n Basic am vorbit deja despre instruciunile:
Input #I, v
1
, v
2
, ..., v
n
, prin care de la Iisierul deschis cu numrul de identiIicare I se citesc valori
pentru variabilele v
1
, ..., v
n
Line Input #I, v
1
, v
2
, ..., v
n
, care lucreaz ca si instruciunea precedent, dar citeste linii de siruri de
caractere;
Print #I, e
1
, e
2
, ..., e
n
prin care n Iisierul deschis cu numrul de identiIicare I se scriu valorile
expresiilor e
1
, e
2
, ..., e
n
Dac #I lipseste, atunci se consider c operaiile se execut cu tastatura/monitorul.
S considerm acum cazul limbajului Pascal. Exist dou proceduri de citire si dou proceduri de
scriere, care pot lucra cu Iisiere, respectiv cu tastatura/monitorul.
AstIel, prin Read(v
1
, v
2
, ..., v
n
) se citesc valori pentru cele n variabilele, de la tastatur, Ir a se citi
si caracterul Enter, deci Ir sIrsitul de rnd; pe cnd prin ReadLn(v
1
, v
2
, ..., v
n
) se citeste si
caracterul Enter.
n mod similar, Write(e
1
, e
2
, ..., e
n
) aIiseaz, una dup alta, valorile celor n expresii, lsnd cursorul
de scriere la dreapta ultimei expresii aIisate, iar WriteLn(e
1
, e
2
, ..., e
n
) procedeaz ca si Write, dar
trece cursorul pe urmtorul rnd, deci mai "aIiseaz" un Enter.
Bogdan Ptru Programarea calculatoarelor electronice
39
Pentru a citi doar Enter-ul putem Iolosi ReadLn, iar pentru a trece pe urmtorul rnd WriteLn.
Apelul ReadLn(x,y) este echivalent cu secvena: Read(x,y); ReadLn, iar apelul WriteLn(x,y,z) este
echivalent cu secvena: Write(x,y,z); WriteLn sau cu secvena: Write(x,y); WriteLn(z) sau cu
secvena: Write(x); WriteLn(y,z).
Lucrul cu Iisierele este similar, n sensul c numele variabilei de tip Iisier este trecut ca prim
argument n apelul procedurilor de citire/scriere.
AstIel, prin ReadLn(I,s) (n care var I: Text; s: String) se citeste din Iisierul I sirul de caractere s; iar
prin WriteLn(I,x,y,xy) (n care var x,y: Integer; iar x are valoarea 2 si y valoarea 3) va aIisa n
Iisierul text I numerele: 2 3 5, iar cursorul va trece pe rndul urmtor, pentru eventuala urmtoare
scriere.
Pentru realizarea operaiilor de intrare n C si C exist Ioarte multe Iuncii, pe care cititorul le
poate descoperi singur consultnd un manual al acestor limbaje.
Observaie:
Citirea unui singur caracter de la tastatur, Ir acionarea tastei Enter dup citire, este considerat
Ioarte util si, de aceea, n multe limbaje sunt puse la dispoziie Iuncii speciale. AstIel, de pild, n
mediul Turbo (Borland) Pascal, exist Iunciile speciale (din biblioteca Crt) KeyPressed si
ReadKey. KeyPressed returneaz True dac tocmai s-a apsat o tast, iar ReadKey d chiar
caracterul ASCII al tastei apsate. Eunciile nu lucreaz pentru tastele reci: Ctrl, Alt sau ShiIt, caz n
care utilizatorul trebuie s se Ioloseasc de alte elemente de programare.
4.5. Implementarea structurilor de control
Elementele (de baz sau auxiliare) programrii structurate se regsesc n toate limbajele de
programare, Iie c ele sunt procedurale, Iie c nu. Limbajele procedurale se bazeaz pe o anumit
paradigm de programare asupra creia vom reveni n capitolul urmtor.
n continuare vom prezenta sintaxa Iiecrei instruciuni n mai multe limbaje de programare. Am
ales Visual Basic, Pascal, C/C si EoxPro.
Instruciunea compus - structura secvenial
n limbajul Pascal, instruciunile sunt separate de simbolul ";", iar o secven de instruciuni
cuprinse ntre cuvntul begin si cuvntul end Iormeaz o instruciune compus. n limbajul C,
instruciunile simple se termin prin ";", deci nu sunt separate de ";" ca n Pascal, iar instruciunile
compuse din C sunt ncadrate de "" si "}".
begin
instruciune
1
; instruciune
1
instruciune
2
; instruciune
2
.................... ....................
instruciune
n
instruciune
n
end }
Observaie:
n limbajul C o instruciune compus poate conine si declaraii (de variabile).
Bogdan Ptru Programarea calculatoarelor electronice
40
n Visual Basic sau n EoxPro o secven de instruciuni nu trebuie ncadrat n vreun Iel de dou
cuvinte speciale. De obicei, structurile de control alternative sau repetitive accept, n diIeritele lor
seciuni, o secven de mai multe instruciuni, deci o instruciune compus, asa cum se va vedea
imediat. De asemenea, n EoxPro, instruciunile se separ prin Carriage Return (CR sau Enter). n
Visual Basic, separatorii sunt Carriage Return sau simbolul ":", atunci cnd trebuie separate
instruciuni de pe acelasi rnd.
Instruciunea decizional IF
n Pascal are Iorma:
iI condiie then
instruciune
1
else
instruciune
2
n care ramura cu else poate lipsi. Atenie c ntre instruciune
1
si cuvntul else nu se pune ";",
deoarece acest simbol separ dou instruciuni, or if-then-else este o singur instruciune.
n C condiia trebuie ncadrat de paranteze rotunde si, de Iapt, poate Ii orice expresie. Dac
valoarea ei este zero (adic Eals), atunci se execut (dac exist), cea de a doua instruciune, n orice
alt caz (considerat Adevrat) se execut prima instruciune. Cuvntul then lipseste.
iI (condiie-expresie)
instruciune
1
else
instruciune
2
Evident, dac instruciune
1
este o instruciune simpl, atunci ea se va termina cu ";", ceea ce ar
justiIica apariia acestui simbol nainte de else n cazul limbajului C.
n EoxPro lipseste, de asemenea, cuvntul then. Eorma structurii este:
iI condiie
instruciuni
1
else
instruciuni
2
endiI
ConIorm sintaxei, putem avea mai multe instruciuni, n cele dou seciuni, corespunztoare celor
dou ramuri, separate prin CR (Enter). Am putea spune c Iorma lui if n EoxPro este:
iI condiie
instruciune
1
'
instruciune
2
'
....................
else
instruciune
1
"
instruciune
2
"
....................
endiI
Bogdan Ptru Programarea calculatoarelor electronice
41
Cuvntul endif termin structura if. Dac apare ramura cu else, atunci cuvntul endif apare dup
grupul al doilea de instruciuni, iar dac nu apare ramura cu else, cuvntul endif apare, Iireste, dup
primul grup de instruciuni ca mai jos:
iI condiie
instruciune
1
'
instruciune
2
'
....................
endiI
Ca si n Pascal, ramura cu else poate lipsi n C si n EoxPro.
n Visual Basic exist mai multe Iorme ale acestei instruciuni, pe care le prezentm n continuare:
iI condiie then instruciune
1
': instruciune
2
': .....
iI condiie then instruciune
1
': instruciune
2
': ..... else instruciune
1
": instruciune
2
": .....
sau, ca si n EoxPro:
iI condiie
instruciune
1
'
instruciune
2
'
....................
else
instruciune
1
"
instruciune
2
"
....................
endiI
si
iI condiie
instruciune
1
'
instruciune
2
'
....................
endiI
Instruciunea de selecie multipl
n Pascal ea are Iorma:
case expresie oI
caz
1
: instruciune
1
;
caz
2
: instruciune
2
;
.............................
else instruciune
end
Bogdan Ptru Programarea calculatoarelor electronice
42
Se evalueaz expresia, care trebuie s Iie de tip ordinal (Boolean, Char, Integer, subdomeniu sau
enumerare, nu si Real sau String). Dac ea este egal cu una din expresiile aprute ntr-unul din
cazurile date, atunci se execut instruciunea corespunztoare. Dac nu, atunci se execut, n caz c
exist, instruciunea de dup else. Ramura cu else este Iacultativ. Unele variante de Pascal mai
vechi Ioloseau, n cazul instruciunii case, cuvntul otherwise n loc de else, dar desemna acelasi
lucru. Prin ca: nelegem o list sau un domeniu de expresii, de acelasi tip cu expresia n Iuncie de
care are loc discuia. Iat un exemplu concret:
case zi oI
1..3, 4, 5: WriteLn('Zi lucratoare');
6: WriteLn('Sambata');
7: WriteLn('Duminica')
else WriteLn('Eroare...')
end
Instruciunea care realizeaz selecia multipl n Basic este Select Case:
Sintaxa ei este:
Select Case exptest
|Case listaexp
n
|instr
n
|| ...
|Case Else
|instr||
End Select
exptest este o parte obligatorie n sintax; ea este orice expresie numeric sau sir de caractere;
listaexp
n
este necesar, dac apare un Case; reprezint una sau mai multe liste de Iorma: expresie,
expresie To expresie, Is operatordecomparaie expresie. Cuvntul cheie To speciIic domeniul
valorilor. Dac utilizai To, cea mai mic valoare trebuie s apar nainte de To.
Pentru a speciIica un domeniu de valori putei Iolosi cuvntul cheie Is mpreun cu operatori de
comparaie. Dac nu este scris, cuvntul Is este automat insertat.
instr
n
este o parte opional, reprezentnd una sau mai multe instruciuni ce se execut dac exptest
se potriveste unei pri din listaexp
n
.
instr este una sau mai multe instruciuni (opionale) ce se execut dac exptest nu se potriveste nici
uneia dintre clausele Case.
Observaie:
Dac exptest se potriveste uneia dintre expresiile dintr-o list, atunci instruciunile ce urmeaz
clausa Case corespunztoare se execut pn la ntlnirea urmtorului cuvnt Case, sau, pentru
ultima claus, pn la End Select. Dup aceast execuie, controlul este dat instruciunii ce urmeaz
dup End Select. Dac expresia de test (testexp) se potriveste mai multor expresii din lista
listaexp, doar instruciunile ce urmeaz dup prima potrivire se vor executa. Acest lucru este
valabil, de altIel, si n limbajul Pascal.
Clausa Case Else este Iolosit pentru a indica Iaptul c instruciunea instr s se execute dac nu se
gaseste nici o potrivire anterioar. Dac aceast claus nu exist, iar nici o potrivire nu are loc,
atunci nu se va executa nimic.
Bogdan Ptru Programarea calculatoarelor electronice
43
Exemplu:
Putei utiliza mai multe expresii sau domenii n Iiecare clauz Case.
Case 1 To 4, 7 To 9, 11, 13, Is ~ MaxNumber
Un alt exemplu:
Case "everything", "nuts" To "soup", TestItem
Urmtorul exemplu determin ce Iel de zi a sptmnii este o anumit zi, a crui numr de ordine se
cunoaste:
Select Case numar
Case 1 To 5
Print "Zi lucratoare"
Case 6
Print "Sambata"
Case 7
Print "Duminica"
Case Else
Print "Nu este un numar corect"
End Select
Instruciunea C care realizeaz selecia multipl este switch. Eormatul ei este:
switch(exp)
case listaexp
n
: instr
n
...
|deIault instr|
}
Instruciunea switch este similar celor din Pascal si din Visual Basic. Dar, dac exp se potriveste
unei liste de expresii, atunci se execut instruciunea corespunztoare, dar si instruciunile
urmtoare, lucru care nu se ntmpla n Pascal, de pild.
AstIel, o secven de Iorma:
switch(exp)
case e
1
: sirinstr
1
;
case e
2
: sirinstr
2
;
}
se va executa asa:
dac exp este egal cu e
1
, atunci se execut sirul de instruciuni sirinstr
1
si apoi sirinstr
2
(dac nu
cumva sirinstr
1
deIineste el nsusi o alt secven); dac exp este egal cu e
2
, atunci se execut
sirinstr
2
; dac exp este diIerit att de e
1
, ct si de e
2
, atunci instruciunea switch nu este eIectiv.
Observaie:
Pentru ca s se obin aceeasi semniIicaie ca n limbajul Pascal, Iiecare sir de instruciuni poate Ii
terminat cu break, care determin ntreruperea instruciunii switch.
AstIel, o secven de Iorma:
Bogdan Ptru Programarea calculatoarelor electronice
44
switch(exp)
case e
1
: sirinstr
1
; break;
case e
2
: sirinstr
2
; break;
deIault: instr
3
}
se va executa asa:
dac exp este egal cu e
1
, atunci se execut sirul de instruciuni sirinstr
1
; dac exp este egal cu e
2
,
atunci se execut sirinstr
2
; dac exp este diIerit att de e
1
, ct si de e
2
, atunci se execut instr
3
.
Propunem cititorului s descopere singur n mediile EoxPro ce instruciune se Ioloseste pentru
selecia multipl.
Instruciunea repetitiv condiionat posterior
n limbajul Pascal, aceasta are Iorma sintactic urmtoare:
repeat
instruciune
1
;
instruciune
2
;
...................
instruciune
n
until condiie
Semantica este: se execut, n mod repetat, instruciunile pn cnd condiia este ndeplinit. Dac
de la bun nceput condiia era ndeplinit, aceasta nseamn c instruciunile se vor executa, totusi,
mcar o dat.
n limbajul C avem urmtoarea instruciune:
do
instruciune
while (condiie)
Instruciunea dintre "do" si "while" poate Ii simpl sau compus (deci cu acolade), iar condiia este
o expresie ce poate Ii adevrat (nenul) sau Ials (nul).
O instruciune de Iorma de mai sus se poate scrie n Pascal astIel:
repeat
instruciune
until not condiie
Asadar, condiiile din cele dou Iorme (Pascal si C) sunt opuse una alteia.
n Visual Basic avem instruciunea:
Do
instruciuni
Loop Until condiie
sau
Bogdan Ptru Programarea calculatoarelor electronice
45
Do
instruciuni
Loop While condiie
Prima Iorm este echivalent cu varianta din Pascal, iar cea de a doua cu cea din C.
Instruciunea repetitiv FOR
n EoxPro avem instruciunea Eor n dou variante:
Ior v e
1
to e
2
instruiuni
endIor
pentru parcurgere cresctoare cu pasul 1 de la expresia e
1
la expresia e
2
, respectiv
Ior v e
1
to e
2
step p
instruciuni
endIor
pentru parcurgere cresctoare (p~0) sau descresctoare (p0) de la e
1
la e
2
.
De pild, secvena de program urmtoare:
Ior i 10 to 1 step -1
?? i
endIor
aIiseaz pe un rnd numerele de la 10 la 1 (n ordine descresctoare).
Instruciunea repetitiv Eor din Visual Basic este asemntoare celei din EoxPro:
Eor v e
1
To e
2
instruciuni
Next v (sau Next)
si:
Eor v e
1
To e
2
Step p
instruciuni
Next v (sau Next)
p este pasul de parcurgere care poate Ii pozitiv sau negativ, oricum este reprezentat de o expresie
ntreag nenul.
Limbajul Pascal este cam "srac" n privina instruciunii repetitive EOR, pentru c aici pasul poate
Ii doar 1 sau -1:
Ior v : e
1
to e
2
do
instruciune
(pasul este 1)
Bogdan Ptru Programarea calculatoarelor electronice
46
si:
Ior v : e
1
downto e
2
do
instruciune
(pasul este -1)
n orice caz, structura Ior cu pasul 1 este suIicient pentru a nlocui execuia unei instruciuni EOR
cu orice alt pas, pozitiv sau negativ.
Dac n Pascal EOR-ul este Ioarte simplu, n C/C el este Ioarte complex. Aceasta deoarece, n
comparaie cu alte limbaje de programare, n C instruciunea Ior poate executa n mod repetat o
instruciune att timp ct o condiie de continuare este ndeplinit, ceea ce Iace ca instruciunea Ior
din C s Iie, de Iapt, un "while":
Ior (e
1
; e
2
; e
3
)
instruciune
n aceast instruciune repetitiv, e
1
este expresie de start (iniial), e
2
este o expresie ce reprezint o
condiie de continuare, iar e
3
este o expresie de reiniializare a ciclului, care, de obicei, este o
instruciune ce Iace repetarea.
Instruciunea Ior din limbajul C se execut conIorm urmtorilor pasi:
1. se execut secvena de iniializare deIinit de expresia e
1
;
2. se evalueaz e
2
; dac e
2
are valoarea zero, atunci se iese din ciclu, adic se trece la instruciunea
ce urmeaz dup instruciunea Ior; altIel se execut instruciunea din corpul ciclului;
3. dup executarea ciclului, se execut secvena de reiniializare deIinit de expresia e
3
; apoi se reia
secvena de la pasul 2.
Dac e
2
este nul de la nceput, instruciunea din corpul lui Ior poate s nu se execute niciodat.
Expresiile din antetul instruciunii Ior pot Ii si vide, dar simbolul ";" trebuie s apar de dou ori.
Pascal
Exemple:
Pentru a calcula suma S 123...n putem scrie:
S 0;
Ior (i1; in; ii1)
SSi
La Iel de bine, putem include S0 alturi de iniializarea lui i n cadrul primei expresii din antetul
lui Ior:
Ior (S0; i1; in; i)
Si
Am Iolosit operatorii speciali "" si "" din limbajul C;
Dup cum spuneam, expresiile pot Ii si vide; astIel, suma anterioar poate Ii calculat si asa:
Bogdan Ptru Programarea calculatoarelor electronice
47
S0; i1;
Ior ( ; in; )
Si
Instruciunea Ior din C/C este cea mai complex instruciune repetitiv.
4.6. Exemple de algoritmi
n acest paragraI vom prezenta civa algoritmi care vor rezolva diIerite probleme, de la cele mai
simple, pn la unele mai complicate, din domeniul matematic, dar si din domeniul Iinanciar-
contabil. De asemenea, vor Ii prezentai algoritmi clasici de cutare si sortare (ordonare).
Algoritmi din matematic
1. Aumere prime
Vom ncepe prin a veriIica dac numrul natural n este sau nu prim. Un numr este prim dac este
divizibil doar prin 1 si el nsusi. 0 si 1 le vom considera ca neIiind prime.
Pentru a veriIica dac un numr natural n este prim sau nu se testeaz, mai nti, dac el este 0, 1
sau 2. 2 este numr prim (singurul par). Apoi se veriIic paritatea sa. Dac este par, nu mai poate Ii
prim. n Iine, se mparte n la toate numerele d impare pn la partea ntreag a rdcinii ptrate a lui
n, notat cu rad. Dac n intervalul |3,rad| exist un divizor d, atunci numrul nu este prim, altIel
este prim. Eaptul c numrul este prim sau nu se va memora Iolosind variabila logic prim.
Pentru c deja cunoastem unele elemente din limbajul Visual Basic, vom descrie algoritmul
prezentat n acest limbaj. nainte, ns de a proiecta programul, trebuie s precizm c nu cunoastem
nc modul n care se introduc date de la tastatur si cum se aIiseaz pe ecran n mediul Visual
Basic. De aceea, vom Iolosi dou instruciuni speciale, Input pentru citire si Print pentru aIisare.
Aceste instruciuni Iac parte din lexicul limbajului Basic (nevizual) si, cum deocamdat ne
intereseaz partea algoritmic, le vom Iolosi pentru a descrie algoritmi, urmnd ca n capitolele 7-8,
o dat cu nvarea programrii vizuale s descoperim si cum se realizeaz citirile si scrierile ntr-
un program vizual.
Algoritmul (programul) este:
Dim n As Integer, d As Integer, rad As Integer, prim As Boolean
Print "Dati numarul n:"
Input n
II n0 or n1 then
prim Ealse
Else
II n2 Then
prim True
Else
II n mod 2 0 Then
prim Ealse
Else
prim True: d 3: rad Abs(Sqr(n))
While d rad And prim True
Bogdan Ptru Programarea calculatoarelor electronice
48
II n Mod d 0 Then
prim Ealse
Else
d d 2
End II
Wend
End II
End II
End II
II prim True then
Print "Numarul este prim"
Else
Print "Numarul nu este prim"
Grupul de instruciuni ncadrat Iuncioneaz astIel: se pleac de la premisa c n ar putea Ii prim.
Pn la proba contrarie (reprezentat de n Mod p 0) variabila prim rmne cu valoarea adevrat.
Trecerea de la un numr impar la altul se realizeaz prin instruciunea d d2. Condiia de test a
buclei este o condiie compus, veriIicndu-se dou lucruri:
O c nu s-a ajuns la capt: d s n;
O c nc nu s-a determinat un divizor d al lui n: prim True.
2. Algoritmul lui Euclid
Vom calcula cel mai mare divizor comun al dou numere Iolosind algoritmul lui Euclid: pentru a
obine cel mai mare divizor comun al dou numere ntregi a si b, b=0, mprim a cu b; dac restul
mpririi r
1
este zero, atunci b este cmmdc; dac nu, mprim pe b la restul mpririi anterioare, r
1
,
si obinem restul r
2
; apoi mprim pe r
1
la r
2
si obinem un nou rest r
3
s.a.m.d.. Ultimul rest nenul
este c.m.m.d.c. al celor dou numere.
JustiIicarea algoritmului lui Euclid este dat de proprietatea: cmmdc(a,b)cmmdc(b,a mod b).
Dim a As Integer, b As Integer, deimp As Integer, imp As Integer
Dim cmmdc As Integer, cmmmc As Integer
Print "Dati a: ": Input a: Print "Dati b: ": Input b
deimp a: imp b
While imp~0
rest deimp mod imp
deimp imp: imp rest
Wend
cmmdc deimp
Print "C.m.m.d.c. ", cmmdc
cmmmc a*b \ cmmdc
Print "C.m.m.m.c. ", cmmmc
Algoritmul nostru determin si cel mai mic multiplu comun al celor dou numere dup Iormula:
cmmmc a*b \ cmmdc, n care operatorul \ semniIic mprirea ntreag, adic ctul mpririi
primului operand la cel de al doilea.
Bogdan Ptru Programarea calculatoarelor electronice
49
O variant a algoritmului lui Euclid este urmtoarea, care Ioloseste scderi n loc de mpriri: ct
timp numerele a si b sunt diIerite ntre ele, scdem numrul mai mic din cel mai mare; la sIrsit, att
a, ct si b, a devenit cel mai mare divizor comun al numerelor iniiale.
Dim a As Integer, b As Integer, a0 As Integer, b0 As Integer
Dim cmmdc As Integer, cmmmc As Integer
Print "Dati a: ": Input a: Print "Dati b: ": Input b
a0 a: b0 b
While a0~b0
II a0~b0 then
a0 a0 - b0
Else
b0 b0 - a0
End II
Wend
cmmdc a0
Print "C.m.m.d.c. ", cmmdc
cmmmc a*b \ cmmdc
Print "C.m.m.m.c. ", cmmmc
3. Sirul lui Fibonacci
Sirul lui Eibonacci este un sir de numere ntregi a
1
, a
2
, a
3
, ... deIinit n Ielul urmtor:
a
1
1, a
2
1, a
n
a
n-1
a
n-2
, pentru orice n>3. O astIel de deIiniie, n care un anumit termen se
construieste din termeni anterior determinai, se numeste deIiniie recurent (recursiv).
Pentru a determina al n-lea termen al sirului lui Eibonacci, va trebui s determinm toi termenii
pn la al n-1-lea inclusiv. Vom Iolosi trei variabile: t2, t1, t, corespunztoare termenilor a
n-2
, a
n-1
si a
n
.
Dim t1 As Integer, t2 As Integer, t As Integer
Print "Dati n: ": Input n
II (n1) Or (n2) Then
t 1
Else
t2 1: t1 1
i 2
While in
t t2 t1
t2 t1
t1 t
i i1
Wend
End II
Print "Termenul cerut este: ", t
Bogdan Ptru Programarea calculatoarelor electronice
50
4. Media aritmetic a mai multe numere reale
S presupunem c avem n numere reale a
1
, a
2
, ..., a
n
. Pentru a determina media aritmetic a lor, va
trebui s calculm suma numerelor si apoi s o mprim la n. O alt variant este s calculm, de la
bun nceput, suma: a
1
/n a
2
/n ... a
n
/n, care este identic mediei aritmetice.
Eireste, pentru a stoca cele n numere vom declara un tablou unidimensional (vector) de numere
reale. Vom Iolosi instruciunea Eor pentru a citi componentele tabloului si, de asemenea, pentru a
determina suma numerelor.
Dim n As Integer, i As Integer
Dim A(1 To 30) As Single
Dim suma As Single, media As Single
Print "Dati n: ": Input n
Eor i 1 To n
Print "Dati componenta nr. ", i
Input A(i)
Next i
suma 0
Eor i 1 To n
suma suma A(i)
Next i
media suma / n
Print "Media aritmetica este: ", media
De remarcat c se putea determina pe msura citirii numerelor suma, ba chiar si media aritmetic a
lor. De asemenea, structura de tablou nu era absolut necesar, putndu-se Iolosi o singur variabil
pentru citirea si utilizarea n calcule a Iiecruia dintre cele n numere. Am apelat, totusi, la structura
de tablou, pentru a stoca cele n numere, n eventualitatea n care ar Ii nevoie de ele pentru calcule
ulterioare.
Algoritmi diveryi
1. Maximul dintr-un vector
Vom scrie un algoritm structurat care s determine maximul dintr-un vector de n elemente (de
acelasi Iel si comparabile). Determinarea maximului se Iace n Ielul urmtor: se consider primul
element ca Iiind maxim. Apoi, parcurgnd vectorul, se compar maximul cu Iiecare element curent
din vector. Dac elementul curent este mai mare dect maximul considerat pn atunci, atunci se
consider maxim acest element gsit mai mare. La sIrsit, avem maximul din tot vectorul.
Determinarea minimului se Iace similar. De asemenea, determinarea maximului sau a minimului
dintr-o matrice se Iace ntr-un mod similar, parcurgerea Iacndu-se att pe linii, ct si pe coloane,
deci pe ambele dimensiuni.
Dim n As Integer, i As Integer
Dim X(1 To 50) As Single, maxim As Single
Print "Dati numarul de elemente: ": Input n
Eor i 1 To n
Print "Dati elementul de pe pozitia ", i
Bogdan Ptru Programarea calculatoarelor electronice
51
Input X(i)
Next i
maxim X(1)
Eor i 2 To n
II X(i) ~ maxim Then maxim X(i)
Next i
Print "Cel mai mare element din vector este: ", maxim
2. Inversarea unui vector
S considerm un sir de elemente si dorim s obinem inversul su, adic n loc de primul element
s Iie ultimul, n loc de al doilea s Iie penultimul s.a.m.d., pn cnd n locul ultimului element s
Iie primul.
Pentru a rezolva problema, s considerm memorat sirul de caractere sub Iorma unui sir de
elemente de lungime n: s
1
, s
2
, ..., s
n
. Deci s
i
este al i-lea element din sirul s. Acesta trebuie
interschimbat cu elementul de pe poziia n1-i din acelasi sir. Deci are loc o interschimbare ntre s
i
si s
n1-i
, interschimbare ce se realizeaz pn la jumtatea sirului, deoarece, dac interschimbm
dup jumtatea sirului, elementele vor reveni pe poziiile lor iniiale, asa nct algoritmul nu va avea
nici un eIect.
Dim n As Integer, i As Integer
Dim S(1 To 30) As Single: Dim aux As Single
Print "Dati n: ": Input n
Eor i 1 To n
Print "Dati elementul al ", i, "-lea"
Input S(i)
Next i
Eor i 1 To n \ 2
aux S(i)
S(i) S(n1-i)
S(n1-i) aux
Next i
Eor i 1 To n
Print S(i)
Next i
Interschimbarea ntre cele dou elemente S(i) si S(n1-i) este realizat cu ajutorul unei variabile
suplimentare, aux, de acelasi tip cu tipul de baz al vectorului S. Aici am considerat tipul real
Single, dar poate Ii orice tip.
Algoritmi de cutare yi sortare
Eoarte importani n programare sunt algoritmii de cutare si se ordonare sau sortare, care apar
Ioarte des n programe. Se spune c n jur de o treime din operaiile pe care le execut un calculator
sunt reprezentate de cutri si sortri. n cele ce urmeaz vom prezenta civa algoritmi clasici si
simpli din acest domeniu.
n general, problemele care se pun sunt:
Bogdan Ptru Programarea calculatoarelor electronice
52
a) Problema de cutare: se d un vector X cu n elemente de un anumit tip si un element A de acelasi
tip. Se cere s se determine dac elementul A este egal cu cel puin unul din elementele vectorului
X.
b) Problema de sortare: se d un vector X cu n elemente de un anumit tip, comparabile ntre ele. Se
cere s se aranjeze elementele lui X n ordine cresctoare.
a) Algoritmi de cutare
Cutarea secvenial
n cazul n care nu se cunoaste nimic special despre vectorul X, deci elementele lui X nu au o
anumit proprietate, pentru a permite aplicarea unui algoritm de cutare adecvat, se poate Iolosi o
metod de cutare secvenial. Aceasta const n parcurgerea element cu element a vectorului, pn
cnd s-a terminat de parcurs, sau pn s-a gsit un element identic celui cutat. Cutarea poate Ii
Icut n orice sens, Iie de la stnga la dreapta, Iie de la dreapta la stnga. O variabil special
boolean, notat mai jos prin gasit, este iniial cu valoarea Ials, urmnd ca la gsirea lui A n X s se
schimbe n adevrat.
AstIel, algoritmul se poate descrie n Basic astIel:
Dim n As Integer, i As Integer
Dim X(1 To 30) As Single
Dim A As Single: Dim gasit As Boolean
Print "Dati numarul n: ": Input n
Eor i 1 to n
Print "Dati elementul de pe pozitia ", i, " din vector: "
Input X(i)
Next i
Print "Dati elementul cautat: ": Input A
gasit Ealse
While (in) And (not gasit)
II X(i) A Then
gasit True
Else
i i 1
Wend
II gasit Then
Print "Elementul a Iost gasit pe pozitia ", i
Else
Print "Elementul nu a Iost gasit"
End II
Cutarea binar
n ipoteza c elementele vectorului sunt deja asezate n ordine cresctoare, se poate alege ca
algoritm de cutare unul mai eIicient. Cutarea binar const n execuia, n mod repetat, a unei
cutri n acea jumtate a vectorului X n care elementul A ar putea exista. AstIel, cum elementele
sunt n ordine cresctoare, s comparm mai nti elementul A cu elementul X(m), unde m este
mijlocul vectorului. Eireste, dac ele sunt identice, atunci nseamn c putem opri cutarea si am
avut succes.
Bogdan Ptru Programarea calculatoarelor electronice
53
Dac ns ele diIer, atunci nseamn c A este mai mic dect X(m) sau mai mare. Dac este mai
mic, evident A nu se poate aIla dect n prima parte a vectorului, adic nainte de poziia m. Acest
lucru se ntmpl tocmai pentru c stim c elementele sunt puse n ordine cresctoare n cadrul
vectorului, asadar nu are sens s mai cutm n partea din dreapta a vectorului.
Similar, dac A ar Ii mai mare dect X(m), atunci se va cuta n partea din dreapta.
Cu zona de cutare nou se procedeaz la Iel, mprind-o si pe ea, Icnd comparaia cu elementul
din mijloc, alegnd noua zon de cutare, mai mic si asa mai departe.
Cutarea se opreste n dou cazuri: s-a gsit un m cu X(m) A (succes) sau zona de cutare rmas
este vid (esec). Pentru a implementa algoritmul, vom Iolosi dou variabile, notate prin s si d, prin
care notm captul din stnga, respectiv pe cel din dreapta, al zonei de cutare curente. Eireste,
iniial, s1 si dn, unde n este numrul de elemente ale lui X.
n Basic, algoritmul se descrie astIel:
Dim X(1 To 30) OI Single
Dim A As Single
Dim n As Integer, i As Integer, m As Integer
Dim s As Integer, d As Integer
Dim gasit As Boolean
Print "Dati numarul n: ": Input n
Eor i 1 to n
Print "Dati elementul de pe pozitia ", i, " din vector: "
Input X(i)
Next i
Print "Dati elementul cautat: ": Input A
gasit Ealse: s 1: d n
While (sd) and (not gasit)
m (s d) \ 2
II X(m) A Then
gasit True
Else
II A X(m) Then
d m - 1
Else
s m 1
End II
End II
Wend
II gasit Then
Print "Elementul a Iost gasit pe pozitia ", m
Else
Print "Elementul nu a Iost gasit"
End II
b) Algoritmi de sortare
Dup cum s-a artat, algoritmul de cutare secvenial se poate aplica doar dac vectorul X este
deja ordonat cresctor. Probleme de ordonare cresctoare sau descresctoare a elementelor unui
Bogdan Ptru Programarea calculatoarelor electronice
54
vector apar Ioarte des ca subprobleme n probleme mai complexe, din diIerite domenii de activitate.
De aceea, programatorii si-au concentrat Ioarte mult atenia asupra problemei sortrii, astIel nct
astzi sunt cunoscui mai muli algoritmi de sortare, mai eIicieni sau nu. Cel mai eIicient algoritm
de sortare, n cazul n care vectorul X nu are vreo proprietate special, este algoritmul QuickSort.
Descrierea acestuia presupune ns cunostine despre recursivitate, care vor Ii prezentate ulterior.
De aceeam n cele ce urmeaz ne vom rezuma la a prezenta doi algoritmi de sortare simpli.
Sortarea prin interschimbare (bubble-sort)
Acest algoritm presupune parcugerea n mod repetat a vectorului X si interschimbarea, la nevoie, a
cte dou elemente de pe poziii succesive, pn cnd, la o anumit parcurgere a vectorului,
elementele sunt ordonate cresctor. Asadar, dac vectorul ar Ii ordonat, am avea
X(1)X(2)...X(n). Dac exist i ntre 1 si n-1 astIel nct X(i)~X(i1), atunci nseamn c
vectorul nu este ordonat. Se interschimb X(i) cu X(i1) si se continu procedeul. Variabila
ordonat de tip Boolean va indica dac elementele din X sunt sau nu ordonate.
Dim X(1 To 30) As Single: Dim aux As Single
Dim n As Integer, i As Integer
Dim ordonat As Boolean
Print "Dati numarul de elemente al vectorului: ": Input n
Eor i 1 To n
Print "Dati X(", i, "): "
Input X(i)
Next i
Do
ordonat True
Eor i 1 To n - 1
II X(i) ~ X(i1) Then
aux X(i)
X(i) X(i1)
X(i1) aux
ordonat Ealse
End II
Next i
Loop Until ordonat
Sortarea prin selecie direct
Metoda const n determinarea, la Iiecare pas i din cei n-1, a celui mai mic element dintre X(i),
X(i1), X(i2), ... X(n), care va ocupa poziia i. Asadar, n Iiecare pas i vom compara pe X(i) cu
elementele X(j), cu j de la i1 la n, iar ori de cte ori se gseste un element X(j) mai mare dect
X(i), cele dou elemente se interschimb. Prin urmare, la pasul i are loc o selecie direct a
elementului ce va ocupa poziia a i-a n vectorul ordonat.
Dim X(1 To 30) As Single: Dim aux As Single
Dim n As Integer, i As Integer
Print "Dati numarul de elemente al vectorului: ": Input n
Eor i 1 To n
Print "Dati X(", i, "): "
Input X(i)
Next i
Bogdan Ptru Programarea calculatoarelor electronice
55
Eor i 1 To n - 1
Eor j i 1 To n
II X(i) ~ X(j) Then
aux X(i)
X(i) X(j)
X(j) aux
End II
Next j
Next i
Algoritmi din contabilitate
1. Soldul unui cont
S considerm un cont cu soldul iniial (debitor sau creditor) cunoscut si niste modiIicri asupra
acestui cont. Se cere s se determine soldul Iinal si tipul su (debitor sau creditor).
Vom stoca n doi vectori cu numele Debit si Credit valorile iniiale din cont, precum si modiIicrile
din debit si credit. Vom declara Debit si Credit ca avnt componentele numerotate ncepnd cu
indicile zero. Una din valorile Debit(0) si Credit(0) va conine soldul iniial, iar cealalt va Ii zero.
ModiIicrile, n numr de ndebit, respectiv ncredit, vor Ii trecute n celelalte componente din
vectori. Se vor calcula sumele Debit(0) Debit(1) ... Debit(ndebit), respectiv Credit(0)
Credit(1) ... Credit(ncredit). Cele dou sume vor Ii comparate si sczute una din alta pentru a
determina soldul Iinal.
Dim Debit(0 To 20) As Integer, Credit(0 To 20) As Integer
Dim ndebit As Integer, ncredit As Integer, i As Integer
Dim sumadebit As Integer, sumacredit As Integer
Dim soldinitial As Integer, soldIinal As Integer
Dim tip as String*1
Print "Dati soldul initial: ": Input soldinitial
Print "Dati tipul soldului initial (D/C) ": Input tip
II (tip "D") Or (tip "d") Then
Debit(0) soldinitial: Credit(0) 0
Else
Debit(0) 0: Credit(0) soldinitial
End II
Print "Dati numarul de modiIicari din debit: ": Input ndebit
Eor i 1 To ndebit
Print "Dati suma nr. ", i, " trecuta la debit: "
Input Debit(i)
Next i
Print "Dati numarul de modiIicari din credit: ": Input ncredit
Eor i 1 To ncredit
Print "Dati suma nr. ", i, " trecuta la credit: "
Input Credit(i)
Next i
sumadebit 0
Eor i 1 To ndebit
Bogdan Ptru Programarea calculatoarelor electronice
56
sumadebit sumadebit Debit(i)
Next i
Eor i 1 To ncredit
sumacredit sumacredit Credit(i)
Next i
II sumadebit ~ sumacredit Then
soldIinal sumadebit - sumacredit
Print "Soldul Iinal este debitor: ", soldIinal
Else
soldIinal sumacredit - sumadebit
Print "Soldul Iinal este creditor: ", soldIinal
End II
2. Calculul anuitilor
Cnd trebuie rambursat un credit obligatar sau cnd trebuie amortizat un activ concesionat, au loc
anumite operaiuni de amortizare. Suma pltit anual de ctre debitor creditorului se numeste
anuitate. Anuitatea cuprinde rata de rambursat si dobnda. n cazul n care se stabileste ca anuitatea
s Iie constant, ea se determin cu relaia: A C*r/(1-(1r)
-n
), unde A anuitatea de rambursat, C
capitalul mprumutat (mprumutul de rambursat iniial); r rata dobnzii (procentual), n durata
rambursrii mprumutului (n ani).
O dat rambursat o rat de mprumut, mrimea acestuia se diminueaz si se modiIic structura
anuitii, n sensul reducerii dobnzii si cresterii corespunztoare a ratei de rambursat. Deci, dup
achitarea Iiecrei anuiti se determin suma creditului restant (mprumutul de rambursat la valoarea
actual sau soldul), dobnda aIerent si, prin diIerena dintre anuitate si dobnd, se calculeaz rata
de rambursat.
Dobnda se calculeaz, anual, cu relaia: D C*r/100, n care D reprezint suma dobnzii anuale, r
este rata dobnzii (ca procent), iar C este suma creditului restant (mprumutul de rambursat la
nceputul anului respectiv).
n continuare este prezentat un program care realizeaz aceste calcule si scrie n Iisierul PLAN.TXT
planul de rambursare esalonat a mprumutului.
Dim Imprumut As Single, RataDobanda As Single, Produs As Single
Dim Anuitate As Single, TotalR As Single, TotalD As Single
Dim Dobanda As Single, RataRestituita As Single
Dim NrAni As Integer, an As Integer
Open "PLAN.TXT" Eor Output As #1
Print "Dati capital imprumutat: ": Input(Imprumut)
Print #1, "Capital imprumutat ", Imprumut
Print "Dati numarul de ani: ": Input NrAni
Print #1, NrAni
Print "Dati rata dobanzii (): ": Input RataDobanda
RataDobanda RataDobanda / 100
Print #1, "Rata dobanzii ", RataDobanda
Bogdan Ptru Programarea calculatoarelor electronice
57
Produs 1
Eor an 1 to NrAni
Produs Produs * (1 RataDobanda)
Next an
Anuitate Imprumut * RataDobanda / (1 - 1/Produs)
Print #1, "Anuitatea: ", Anuitate
RataRestituita 0
Print #1, "Plan de rambursare esalonata a imprumutului"
Print #1, "An Anuit. Dobanda Rata r. Sold ramas"
Eor an 1 to NrAni
Imprumut Imprumut - RataRestituita
Dobanda Imprumut * RataDobanda
TotalD TotalD Dobanda
RataRestituita Anuitate - Dobanda
TotalR TotalR RataRestituita
Print #1, an, Anuitate, Dobanda, RataRestituita, Imprumut
Next an
Print #1, "TOTAL", NrAni*Anuitate, TotalD, TotalR
Close #1
4.7. Complexitatea algoritmilor
Estimarea timpului de calcul
S considerm problema determinrii celui mai mare element dintr-un vector; algoritmul de
rezolvare a acestei probleme a Iost deja prezentat:
Dim n As Integer, i As Integer
Dim X(1 To 50) As Single, maxim As Single
Print "Dati numarul de elemente: ": Input n
Eor i 1 To n
Print "Dati elementul de pe pozitia ", i
Input X(i)
Next i
maxim X(1)
Eor i 2 To n
II X(i) ~ maxim Then maxim X(i)
Next i
Print "Cel mai mare element din vector este: ", maxim
La sIrsit, variabila max conine cel mai mare element din vectorul X.
Timpul de execuie a acestui algoritm depinde, n primul rnd, de n, care aici este numrul de
componente al vectorului X.
Pentru a estima timpul de calcul necesar, ar trebui s inventariem toate instruciunile programului si
s stim de cte ori se execut Iiecare dintre ele (n Iuncie de n). Mai mult, ar trebui s cunoastem
ct dureaz execuia Iiecrui tip de instruciune .
Bogdan Ptru Programarea calculatoarelor electronice
58
Ordinul de complexitate
n orice problem putem observa c exist un anumit numr n de date de intrare de care depinde, de
obicei, timpul de execuie al algoritmului care rezolv acea problem. De exemplu, dac se pune
problema determinrii tuturor permutrilor unei mulimi, atunci n este numrul de elemente al
acelei mulimi, dac se pune problema sortrii unui vector, n este numrul de elemente al
vectorului.
Deoarece nu putem sti ntotdeauna cu exactitate de cte ori se execut o anumit instruciune (de
pild atribuirea max X(i)), este destul de greu de determinat timpul total de execuie. Totusi,
putem considera c exist o proporionalitate ntre valoarea n si numrul de execuii.
n plus, timpul de execuie al unei instruciuni este dependent de calculatorul utilizat.
Majoritatea instruciunilor se execut de un numr de ori destul de mic astIel c timpul aIectat lor
este neglijabil. De aceea, se alege o operaie (instruciune) esenial, numit operaie de ba: si se
determin de cte ori se execut ea. Cerina pentru operaia de baz este ca numrul de execuii al
acesteia s se poat calcula n Iuncie de n, de la nceput.
Timpul de calcul estimat pentru un algoritm oarecare se numeste ordinul su de complexitate. El se
noteaz astIel:
O(numr estimat de execuii ale operaiei de ba:)
Dac, de exemplu, un algoritm eIectueaz 2n
2
4n3 operaii de baz, vom spune c acesta este un
algoritm al crui ordin de complexitate este O(n
2
) sau se mai spune c algoritmul are un timp de
execuie ptratic. (Pentru n Ioarte mare, 4n3 este o valoare neglijabil comparativ cu 2n
2
, iar 2n
2
este comparabil cu n
2
.).
Exemple:
a) Pentru aIlarea maximului (minimului) dintr-un vector cu n componente, ordinul de complexitate
este O(n).
b) Pentru generarea permutrilor (n cazul n care se consider ca operaie de baz generarea unei
permutri) ordinul de complexitate este O(n!).
n cazul unor probleme nu putem preciza nici macr numrul de execuii ale operaiei de baz. De
exemplu, la sortarea prin interschimbare (bubble-sort), dac vectorul este deja sortat, se execut n-1
comparaii (se parcurge vectorul o singur dat). Dac vectorul este sortat invers, se execut
n(n-1)/2 operaii de baz (se parcurge vectorul de n ori).
n astIel de cazuri se poate Iace o discuie asupra a trei valori:
- timpul minim de calcul;
- timpul mediu de calcul;
- timpul maxim de calcul.
De Iiecare dat cnd se vorbeste despre timpul estimat, se precizeaz si despre care este vorba
(minim, mediu sau maxim). n practic prezint interes timpul mediu si timpul maxim.
Tipuri de ordine de complexitate
Dac timpul estimat este sub Iorma O(n), spunem c algoritmul este n timp liniar.
Bogdan Ptru Programarea calculatoarelor electronice
59
Dac timpul estimat este sub Iorma O(n
k
), spunem c algoritmul este n timp polinomial (n2 -
ptratic, n3 - cubic etc.).
Dac timpul estimat este sub Iorma O(2
n
), O(3
n
) si asa mai departe, spunem c algoritmul este n
timp exponenial.
Un algoritm n timp O(n!) este asimilat unui algoritm n timp exponenial deoarece
n!12.n~22.22
n-1
.
n practic nu sunt admisi dect algoritmi n timp polinomial, desi nu este deloc indiIerent gradul
polinomului.
n concluzie, ori de cte ori avem de rezolvat o problem, cutm pentru aceasta un algoritm de
timp polinomial. Mai mult, vom cuta un algoritm care s rezolve problema n timp polinomial de
grad minim.
Exemple:
a) Pentru problema aIlrii maximului, operaia de baz va Ii comparaia (Iiind dat n, se Iac n-1
comparaii pentru calculul maximului).
b) n cazul problemei generrii permutrilor, este greu de stabilit o anumit operaie de baz. Dac
se consider comparaia, va Ii diIicil de determinat numrul total de comparaii necesar generrii
permutrilor. De aceea, putem considera drept operaie de baz generarea unei permutri. Vom avea
astIel n! operaii de baz (un numr Ioarte mare).
Generarea permutarilor se poate Iace pe baza mai multor algoritmi. Alegerea ca operaie de baz a
comparaiei permite ca acestia s Iie comparai ntre ei, dar alegerea ca operaie de baz a generrii
unei permutri nu permite acest lucru, doarece toi algoritmii vor avea de determinat acelasi numr
de permutri: n!.
n astIel de cazuri (cnd avem de ales ntre mai multe operaii de baz), vom alege acea operaie
care corespunde ct mai bine scopului propus.
De ce sunt necesari algoritmii eficien i
Ai observat, probabil, c n ultimii ani viteza de calcul a microprocesoarelor devine din ce n ce
mai mare. Ne punem problema dac este necesar gsirea de algoritmi din ce n ce mai eIicieni
pentru rezolvarea problemelor, sau ar Ii mai bine s asteptm urmtoarele generaii de calculatoare.
S presupune c lucrm cu un calculator capabil s eIectueze un milion de operaii (elementare) pe
secund. n tabelul urmtor sunt indicai timpii necesar eIecturii a n
2
, n
3
, 2
n
, 3
n
operaii cu ajutorul
unui astIel de calculator, pentru diIerite valori ale lui n.
O n20 n30 n40 n50 n60
n
2
0,0004
secunde
0,0009
secunde
0,0016
secunde
0,0025
secunde
0,0036
secunde
n
3
0,001
secunde
0,008
secunde
0,0027
secunde
0,125
secunde
0,216
secunde
2
n
o secund 17,9
minute
12,7 zile 35,7
ani
366 secole
3
n
58 minute 6,5
ani
3855
secole
210
8
secole
1,310
13
secole
Bogdan Ptru Programarea calculatoarelor electronice
60
S presupunem c, pentru o anumit problem, cunoastem un algoritm al crui timp de execuie
pentru cazuri de mrime n este de 2
n
secunde. Din tabel reiese c pentru n20 algoritmul are nevoie
de o secund, iar pentru n60 acelasi algoritm are nevoie de 366 de secole! Dac vom cumpara un
calculator de 100 de ori mai rapid, atunci timpul de rulare pentru n60 ar Ii 366/100 secole 3,66
secole (deci un timp, de asemenea, neacceptabil).
Dar ce Iacem dac avem de rezolvat cazuri pentru un n mult mai mare decat 50? Soluia nu poate Ii
alta dect gsirea unui alt algoritm mult mai eIicient.
Principalul motiv pentru care unii algoritmi pot s ajung la timpi de lucru practic inIinii, chiar
pentru valori relativ mici ale lui n, si gseste explicaia nu n lipsa de perIormane a calculatoarelor,
ci n Iaptul c Iuncia exponenial I(n)a
n
, cu a~1, creste extraordinar de repede.
ConIorm celor de mai sus, este Ioarte indicat ca pentru o problem dat s elaborm algoritmi care
s nu Iie exponeniali. Sunt considerai 'buni algoritmii pentru care numrul operaiilor este
polinomial (adic se poate exprima sub Iorma unui polinom de gradul n, unde n este numrul
datelor de intrare). Nu este posibil sa evitm totdeauna algoritmii exponeniali; un exemplu l
constituie problema generrii tuturor permutrilor de n elemente sau a submulimilor unei mulimi
cu n elemente, cnd numrul rezultatelor este n!, respectiv 2
n
si deci numrul de operaii va Ii
inerent exponenial.
Concret si abstract
Cazuri particulare si generale. De la concret la abstract si invers. Constante si variabile
- Concret si abstract
Un programator trebuie sa gandeasca abstract. Acest lucru este atat de important in programare, incat orice
incercare de a invata sa programezi, Iara a avea o gandire abstracta, este sortita esecului. Cine nu poate intelege
abstractiunile matematice din scoala generala sau liceu, de pilda, nu poate sa ajunga sa programeze (bine). Ca
programatori, va trebui sa realizati diIerite programe pentru oameni Ioarte diIeriti ca nivel cultural, pregatire. Veti intra
in contact cu economisti, ingineri, psihologi, sau oameni de litere, medici sau avocati, care va vor solicita sa le Iaceti un
program pe calculator care sa le rezolve anumite probleme din domeniul lor de activitate. Probabil cu exceptia
inginerilor, veti constata ca majoritatea au un anumit mod de a se exprima si de a va prezenta problema de rezolvat
incompatibil, intr-o oarecare masura, cu modul dumneavoastra de a vorbi si de a intelege problema. Cel mai bun sIat ar
Ii acela de a-i lasa sa va explice tot ce vor, Iara sa-i intrerupeti, dupa care sa incercati sa "preluati dumneavoastra carma"
si, prin intrebari simple, la care interlocutorul sa va raspunda doar prin da sau nu, sa intelegeti esenta problemei pe care
trebuie sa o rezolvati.
In general, beneIiciarii programului dumneavoastra, vor Ii Ioarte concreti. Ei nu vor prezenta in linii mari, generale,
lucrarea pe care vor sa o inIormatizeze, generale, ci vor da tot soiul de exemple, care nu au nici o relevanta pentru
problema, din perspectiva dumneavoastra. Va trebui sa identiIicati, in explicatiile interlocutorului sau in raspunsurile
acestuia, urmatoarele elemente:
- ce se da si ce se cere programului, pentru ca orice program/algoritm prelucreaza anumite date de intrare pentru a
obtine niste inIormatii, drept rezultate;
- cum se vor da datele de intrare si in ce ordine, ce conditionari exista intre ele, pentru a putea proiecta interIata cu
utilizatorul, pentru introducerea datelor;
- ce inIormatii se asteapta de la program si in ce Iorma, in ce ordine, pentru a sti cum sa proiectati interIata cu
utilizatorul, pentru extragerea rezultatelor;
- care sunt Iormulele de calcul care se Iolosesc, in ce ordine si ce conditionari exista intre ele.
Bogdan Ptru Programarea calculatoarelor electronice
61
In privinta interIetei cu utilizatorul, Iiti convinsi ca beneIiciarul se va razgandi de mai multe ori, mai ales atunci
cand programul capata o Iorma apropiata de cea Iinala, de aceea nu trebuie sa acordati prea multa atentie acestui aspect,
pentru inceput. Concentrati-va asupra Iormulelor de calcul si e posibil ca aici sa aveti multe diIicultati de a le obtine din
cauza ca ele nu va vor Ii prezentate, pur si simplu! Cei mai multi preIera sa va dea exemple si dumneavoastra sa
deduceti singur Iormulele de calcul, decat sa va spuna care este Iormula din teorie. Deci, va trebui sa gasiti generalul din
cazurile lor particulare si sa abstractizati tot ceea ce va prezinta ei concret.
- Constante si variabile
Sa revenim la problema desenarii pe ecranul calculatorului. Sa presupunem ca dispunem de un mediu de
programare, in care, pentru a desena un cerc de raza r, cu centrul cercului in punctul de coordonate x,y trebuie sa
Iolosim instructiunea CIRCLE(x,y,r). De obicei, instructiunile sunt prezentate Iolosind variabile (precum x, y si r) si nu
constante (numere ca 100, 150, 215, 342). Pentru a desena un cerc avand centrul in punctul de coordonate 200, 300, si
cu raza de 10 de unitati vom scrie, asadar, CIRCLE(200,300,10), pastrand ordinea celor trei parametri ai instructiunii.
La Iel, putem particulariza Iolosirea lui CIRCLE, si pentru cercul de coordonate 200, 300 si de raza 20:
CIRCLE(200,300,20). Evident, cele doua cercuri sunt concentrice, pentru ca au aceleasi coordonate pentru centru.
Pentru a desena 15 asemenea cercuri concentrice, de raze de 10, 20, 30 etc., ar trebui sa Iolosim 15 instructiuni
CIRCLE, in care cel de-al treilea parametru sa Iie schimbat, pe rand, in 10, 20 s.a.m.d.. Acest mod de rezolvare a
problemei desenarii celor 15 cercuri concentrice denota o gandire pur concreta, care se bazeaza pe utilizarea a 15 cazuri
particulare de desenare a unor cercuri. Un programator bun nu va proceda asa, el va cauta sa gaseasca o regula pentru
desenarea mai usoara a celor 15 cercuri, eventual pomenind o singura data de comanda CIRCLE. AstIel, el va incerca
sa inlocuiasca constantele numerice 10, 20, 30, ..., 150, cu o singura data, care sa varieze intre 10 si 150, din 10 in 10. O
asemenea data se numeste variabila. Ea isi va schimba valoarea, in Iunctie de necesitati. AstIel, notand cu R acea
variabila, cele cincisprezece cazuri concrete vor ajunge cazul abstract CIRCLE(200,300,R), unde R variaza intre 10 si
150, cu pasul 10. Limbajele de programare oIera diIerite posibilitati de a-l Iace pe R sa ia pe rand valorile 10, 20 etc.,
dar putem sa ne gandim mai departe la o alta variabila I, care sa varieze intre 1 si 15, si sa scriem
CIRCLE(200,300,10*I), unde I variaza intre 1 si 15, cu pasul 1. Putem continua, considerand un caz si mai general,
deci mai abstract, in care pasul sa nu Iie 10, ci un numar oarecare, reprezentat de variabila P. Atunci vom scrie
CIRCLE(200,300,P*I), considerandul-l pe I intre 1 si 15. Dar s-ar putea ca sa avem nevoie sa desenam nu doar 15
cercuri, ci 20 sau 50, adica un numar N oarecare. Si poate acestea vor avea centrul intr-un punct de coordonate X, Y,
oarecare, iar razele sa inceapa sa creasca de la valoarea T. AstIel, cel mai abstract caz este: CIRCLE(X,Y,TP*I), unde
I ia valori, din 1 in 1, intre 0 si N-1. AstIel, X, Y, T, P si N sunt date de intrare in problema, I este o variabila de lucru,
iar rezultatul ar Ii cele N cercuri desenate pe ecran.
Procesul de abstractizare este Ioarte complex si este greu de explicat ce mecanisme intelectuale si psihice intra in
joc, atunci cand abstractizam. Trebuie sa dovedim multa imaginatie si sa incercam sa ne gandim si la alte situatii decat
cele concrete cu care avem de a Iace la un moment dat. Pentru a abstractiza cat mai mult o problema si rezolvarea ei, va
trebui sa ne punem intrebari de genul "ce-ar Ii daca nu as cunoaste aceasta valoare?" sau "ce-ar Ii daca as schimba
aceasta valoare cu alta?" si sa incercam sa raspundem la asemenea intrebari, rescriind algoritmul.
Bogdan Ptru Programarea calculatoarelor electronice
62
Capitolul 5. Subprograme
5.1. Definirea subprogramelor
S considerm urmtoarea problem. Se citesc dou numere ntregi m si n. Se cere s se determine
numrul m!n!. Pentru aceasta, va trebui s calculm cele dou produse: m!12...m, respectiv
n!12...n. n limbajul Pascal vom scrie:
program SumaEactoriale;
var m,n,mI,nI,i: LongInt;
begin
Write('Dati m: '); ReadLn(m);
Write('Dati n: '); ReadLn(n);
mf.1, for i.1 to m do mf.mf*i,
nf.1, for i.1 to n do nf.nf*i,
WriteLn('m!n!',mInI)
end.
Observm c exist dou secvene de instruciuni asemntoare (scrise aplecat), asadar, pentru
simpliIicarea calculului n asemenea situaii, ar Ii de preIerat s dispunem de o Iuncie care s ne
dea Iactorialul unui numr ntreg oarecare x. S presupunem c am dispune de o asemenea Iuncie,
cu numele fact. Atuncim, cele dou secvene de instruciuni evideniate n program ar Ii nlocuite
de:
mI:Iact(m); nI:Iact(n);
DeIinirea de Iuncii este posibil n toate limbajele de programare, inclusiv n Pascal.
Eunciile grupeaz o serie de instruciuni pentru a calcula o anumit valoare, n Iuncie de
argumentele Iunciei. Exist si cazuri cnd Iunciile nu au argumente.
De asemenea, majoritatea limbajelor de programare pun la dispoziia programatorilor si alte
modaliti de a grupa mai multe instruciuni sub un nume, iar aceste instruciuni s execute anumite
operaii n Iuncie de anumite argumente, eventual s comunice cu exteriorul prin alte argumente.
De obicei se numesc subprograme sau rutine sau subrutine sau proceduri.
AstIel, n Pascal avem conceptul de procedur si conceptul de Iuncie. Procedurile si Iunciile poart
denumirea de subprograme. Ele se declar si se deIinesc n partea declarativ a programului, deci
naintea instruciunii compuse din care este constituit programul propriu-zis.
O procedur se deIineste n Pascal astIel:
procedure numeprocedura(listadeparametriIormali);
declaraii locale;
begin
instruciuni
end;
Bogdan Ptru Programarea calculatoarelor electronice
63
n lista parametrilor Iormali sunt precizate argumentele Iunciei, mpreun cu tipurile lor, unele
argumente putnd Ii precedate de cuvntul var, ceea ce nseamn c sunt parametri variabili. n lista
de declaraii locale pot Ii declarate constante, variabile, tipuri de date, chiar si altesubprograme.
Exemplu:
Urmtoarea procedur determin Iactorialul unui numr n:
procedure Eactorial(n: LongInt; var I: LongInt);
var i: LongInt;
begin
I:1; Ior i:1 to n do I:I*i
end;
Similar, o Iuncie care s calculeze acelasi Iactorial se va scrie:
Iunction Eact(n: LongInt): LongInt;
var i,I: LongInt;
begin
I:1; Ior i:1 to n do I:I*i;
Eact:I
end;
n program, procedura se va apela (chema, Iolosi) prin: Eactorial(n,nI) si Eactorial(m,mI), iar
Iuncia prin nI:Eact(n); mI:Eact(m).
Motivul pentru care apare cuvntul var n Iaa parametrului f din procedura Factorial va Ii explicat
ulterior, n paragraIul urmtor.
n Basic avem Iuncii, iar procedurile se numesc subrutine. Eactorialul se va calcula prin subrutina:
Sub Iactorial(ByVal n As Long, ByReI I As Long)
Dim i As Long
I 1
Eor i 1 To n
I I * i
Next i
End Sub
Apelul se va realiza prin: Iactorial m, mI, n care m este o valoare, iar mI o variabil.
O Iuncie care s calculeze Iactorialul lui n este:
Eunction Iact(n As Long) As Long
Dim i As Long, I As Long
I 1
Eor i 1 To n
I I * i
Next i
Iact I
End Eunction
Bogdan Ptru Programarea calculatoarelor electronice
64
A
C E
E
B
D
G H
Putem Iolosi aceast Iuncie astIel: mI Iact(m).
n limbajul C nu exist proceduri sau subrutine, ci doar Iuncii. Totusi, exist Iuncii de tip vid
(void), care nu returneaz valori, astIel nct aceste Iuncii se comport asemenea unor proceduri
din limbajul Pascal.
5.2. Circuitul datelor ntre subprograme
Programul principal, dar si subprogramele se mai numesc si blocuri si, conIorm unor autori,
module. Totusi, exist limbaje precum Modula-2 care deIinesc altIel noiunea de modul, asa cum
vom vedea si noi mai trziu.
Subprogramele pot comunica ntre ele, adic s se apeleze unele pe altele. Unele limbaje de
programare (precum Pascal sau C) au drept restricie Iaptul c dac un subprogram P apeleaz un
subrogram Q, atunci trebuie ca Q s Iie scris naintea lui P. n unele limbaje de programare (Pascal,
de exemplu), blocurile pot Ii cuprinse n alte blocuri.
Exist trei reguli de valabilitate sau vizibilitate a identiIicatorilor:
- n cadrul unui bloc, un identiIicator poate Ii declarat o singur dat.
Un acelasi identiIicator poate Ii declarat n blocuri diIerite. n acest caz se aplic regula:
- Natura unui identiIicator id care apare ntr-o instruciune se stabileste cutnd cel mai interior
bloc ce include att instruciunea, ct si declararea lui id.
- Nu se poate Iolosi un identiIicator n exteriorul blocului n care a Iost declarat.
Pentru a exempliIica aplicarea acestor reguli Iie schema de program modularizat:
Putem vorbi de o ierarhizare a blocurilor pe nivele:
Bloc Nivel
P 0
A,B 1
C,D 2
E,E,G 3
H 4
Domeniile de vizibilitate (valabilitate) ale identiIicatorilor sunt:
P
Bogdan Ptru Programarea calculatoarelor electronice
65
IdentiIicatorii declarai n blocul: sunt accesibili n blocul:
P P, A, B, C, D, E, E, G, H
A A, C, E, E
B B, D, G, H
C C, E, E
D D, G, H
E E
E E
G G, H
H H
De exemplu, o variabil declarat n blocurile B si G si apelat n blocul H va avea tipul precizat n
declaraia coninut de blocul G.
Paradigma de programare care se bazeaz pe blocuri si pe instruciuni de control ca cele menionate
n capitolul precedent se numeste programare procedural .
S revenim la apelul unui bloc Q din cadrul altui bloc P. Primul se numeste apelat, iar al doilea
apelant. Dac Q are lista parametrilor Iormali I
1
, I
2
, ..., I
n
, atunci apelul lui Q se realizeaz prin
Q(e
1
, e
2
, ..., e
n
) (n Basic nu se pun paranteze), n care e
1
, ..., e
n
sunt asa numiii parametri efectivi,
care sunt Iie valorile unor expresii, Iie variabile (depinde de modul de transmitere a parametrilor).
ntre parametrii eIectivi si cei Iormali se realizeaz o coresponden, n ordine. AstIel, lui I
i
i
corespunde e
i
.
Pentru a nelege cum se transmit parametri, menionm c exist mai multe modaliti de
transmitere a lor, dar cel mai adesea, n limbajele de programare procedurale, vom ntlni
tramsmiterea prin valoare si transmiterea prin referin. n limbajul Pascal, dac un parametru
Iormal din antetul unui subprogram este precedat de cuvntul var, atunci transmiterea se Iace prin
reIerin, altIel prin valoare. La Basic se Iolosesc cuvintele rezervate ByReI, respectiv ByVal.
Limbajul C nu dispune de modalitatea de transmitere a parametrilor prin reIerin, dar aceasta poate
Ii simulat cu ajutorul transmiterii prin valoare, n care parametrii sunt niste pointeri, adic adresele
de memorie unde sunt stocate variabilele respective.
Cnd transmiterea parametrilor este prin valoare, nseamn c parametrii eIectivi din blocul apelant
sunt niste expresii. Acestea se evalueaz si se transmit blocului apelat. n blocul apelat, parametrii
Iormali primesc valori de la parametrii eIectivi, adic parametrii formali iau valorile respectivelor
expresii. n interiorul procedurii este posibil ca parametrii Iormali s-si modiIice valorile, dar aceste
modiIicri nu inIlueneaz n nici un Iel valorile expresiilor care Iormau parametrii eIectivi. Asadar,
comunicarea se Iace de la blocul apelant la cel apelat, nu si invers.
n transmiterea prin reIerin, parametrii eIectivi sunt variabile, din cadrul blocului apelant. n
blocul apelat, parametrii Iormali vor primi, iniial, valori de la parametrii eIectivi, apoi orice
modiIicare asupra parametrilor Iormali, n cadrul blocului apelat, se va transmite si asupra
variabilelor care reprezint parametrii Iormali. Asadar, comunicarea are loc n ambele sensuri, ntre
blocul apelant si cel apelat. Aceasta deoarece parametrii formali se suprapun parametrilor efectivi,
adic, parametrii eIectivi vor Ii alte nume pentru parametrii Iormali.
Bogdan Ptru Programarea calculatoarelor electronice
66
Exemple:
Pentru a nelege ce este transmiterea parametrilor prin valoare, ca si transmiterea prin reIerin,
vom considera cazul limbajului Pascal.
Urmtoarea procedur calculeaz suma a dou numere ntregi a si b:
program Suma(a,b: Integer; var c: Integer);
begin
c : a b
end;
Aceast procedur este blocul apelat. a si b sunt parametri transmisi prin valoare, deci pot Ii orice
dou expresii, pe cnd c este parametru transmis prin reIerin, deci va Ii doar o variabil.
n blocul apelant (o alt procedur sau programul principal), s presupunem c avem urmtoarele
declaraii de variabile:
var x,y,z,a,b,c: Integer;
Vom putea avea apeluri de genul:
- Suma(2,3,x) - care determin ca x s primeasc valoarea 235;
- Suma(2,3,a) - care determin ca a s primeasc valoarea 235, unde variabila a este cea din
blocul apelant, neavnd nici o legtur cu parametrul Iormal a de la blocul apelat;
- Suma(2,x,y) - care evalueaz pe x (s zicem c x este 5), apoi paseaz pe 2 lui a, pe 5 (x) lui b,
n parametrii Iormali ai procedurii, unde se calculeaz valoarea parametrului c, a crui valoare
(7) este transmis lui y.
- Suma(2x,3,y), Suma(2x,3y,z) sunt apeluri corecte ale procedurii Suma
- Suma(a,bc,300), Suma(2,3,xy), Suma(2x,3,x2) sau Suma(2x,3y,x4) sunt apeluri
gresite, pentru c nici 300, nici xy, nici x2, nici x4 nu sunt variabile.
S considerm acum urmtoarea procedur:
procedure Schimba(x,y: Integer);
var aux: Integer;
begin
aux:x; x:y; y:aux
end;
Desi un apel de Iorma Schimb(a,b) este corect, valorile variabilelor x si y nu se schimb, deoarece
transmiterea se Iace prin valoare.
Pentru ca ntr-adevr valorile celor dou variabile s se schimbe, va trebui ca x si y s Iie parametri
transmisi prin reIerin:
procedure Schimba(var x,y: Integer);
var aux: Integer;
begin
aux:x; x:y; y:aux
end;
Bogdan Ptru Programarea calculatoarelor electronice
67
Capitolul 6. Conceptele programrii orientate pe
obiecte
Atenie! tratarea subiectului este Icut n Pascal.
6.1. Introducere
Programarea orientat pe obiecte (POO, OOP) este o tehnic de programare, un stil, ghidat de
principii Ioarte riguroase, asa cum este si programarea structurat, ns aceste dou tehnici nu se
exclud una pe alta, ci, dimpotriv, ele se completeaz reciproc n procesul realizrii unor produse
soIt ct mai perIormante, ct mai complexe si ct mai Ilexibile.
Pentru a nelege noiunea de obiect din inIormatic, trebuie s Iacem analogia cu obiectele
concrete din din realitatea nconjurtoare. S ne gndim, de pild, la vehicule. Ele sunt obiecte bine
cunoscute nou, dar clasa vehiculelor este prea larg, asa nct putem s o mprim n cea a
vehiculelor aeriene, cea a vehiculelor terestre, cea a vehiculelor de ap (marine si... submarine) si a
vehiculelor subpmntene.
La rndul ei, clasa vehiculelor aeriene s-ar putea mpri n clasa avioanelor si clasa elicopterelor.
Vehiculele terestre pot Ii de osea sau pe cale ferat. Cele pe cale Ierat pot Ii in localiti
(tramvaie) sau intre localiti (trenuri). Pn acum toat clasiIicarea noastr a vehiculelor n clase si
subclase, poate Ii reprezentat arborescent - sub Iorma din Iigura dat mai jos.
Am putea spune, astIel c avem clasa vehiculelor aeriene derivat din cea a vehiculelor (n
general), iar din aceast clas derivat se deriveaz clasa elicopterelor si cea a avioanelor. La Iel cu
trenurile derivate din 'vehicule din localiti, clasa acestor vehicule Iiind derivat din cea 'a
vehiculelor pe cale ferat, clas derivat - la rndul ei - din cea 'a vehiculelor terestre, al crui
strmoy este clasa general 'vehicule.
Putem spune c vehiculele pe cale Ierat moytenesc toate caracteristicile vehiculelor (n general) si,
eventual, au caracteristici noi. Dar si metroul este un tren, cu toate c merge pe sub pmnt. Asadar,
dac am considera si clasa metrourilor, aceasta ar avea trsturile urmtoarelor clase: a trenurilor, a
vehiculelor din localiti si cea a vehiculelor subpmntene. Deci ar Ii o derivare multipl din mai
multe clase.
n aIar de aceast clasiIicare care se poate Iace chiar si mai bine, pentru a evita eventualele derivri
multiple, toate vehiculele (deci de la orice nivel) se caracterizeaz prin structura si prin
funcionalitatea lor.
AstIel, dac la nivelul clasei generale a vehiculelor nu putem spune - reIerindu-ne la structur -
dect c un vehicul are Ia, spate, numr de locuri si conductor, cnd ne situm la nivelul
avioanelor sau al trenurilor putem deja vorbi despre pilot sau despre mecanic de locomotiv.
De asemenea, ne punem problema: ce Iuncii poate ndeplini un vehicul, adic ce poate s Iac un
vehicul sau ce se poate Iace cu un vehicul. Eireste, orice vehicul, indiIerent de clasa particular n
care ar putea Ii ncadrat, se deplasea:, deci realizeaz acest lucru, chiar dac la nivelul clasei
generale 'vehicule nu putem deIini prea detaliat sau prea clar ce nseamn acest lucru, adic cum
se realizeaz aceast deplasare, poate doar prin Iaptul c, si schimb poziia n spaiu, dintr-un loc
n altul. Dar dac ne situm n cadrul clasei elicopterelor, de pild, ne dm seama c deplasarea se
Bogdan Ptru Programarea calculatoarelor electronice
68
Iace prin :bor, Iolosindu-se o elice, acionat de un motor. AstIel, devine clar modul de realizare a
deplasrii elicopterului, ba chiar apare o caracteristic structural n plus, speciIic elicopterelor si
nu tuturor vehiculelor, elicea.
VEHICULE
SUBPAMANTENE TERESTRE DE APA AERIENE
MARINE SUBMARINE DE SOSEA
PE CALE
FERATA
ELICOPTERE AVIOANE
IN
LOCALITATI
INTRE
LOCALITATI
METROURI
TRAMVAIE TRENURI
ns, pentru a vorbi despre un vehicul, trebuie ca acesta s existe, deci trebuie s Iie creat sau
construit. Cnd nu ne mai trebuie, l distrugem.
Toat realitatea nconjurtoare este guvernat de astIel de 'reguli, iar inIormaticienii au ncercat -
si n mare parte au reusit - s Ioloseasc toate acestea n programare. AstIel a aprut ideea de obiect
n programare.
Ca si n lumea real, n inIormatic, un obiect ar Ii caracterizat de structura sa - deIinit de anumite
cmpuri - ca la tipul nregistrare, precum si de Iuncionalitatea sa, deIinit de anumite proceduri yi
funcii proprii clasei respective de obiecte.
Un obiect poate Ii construit - dac se Ioloseste un constructor, precum si distrus - cu un
destructor.
AstIel, n Turbo-Pascal, apare - ca o extindere natural a tipului record - noul tip object. Dac vrem
s deIinim o clas a obiectelor de tip tren, va trebui s Iolosim o declaraie de genul:
type
Trenobject
mecanic: String; numele mecanicului de locomotiv\}
tip: (demarIa,depersoane); cele trei cmpuri sunt ca la record}
NV: Integer; numarul de vagoane ale trenului}
procedure Deplaseaza; aceasta e o procedura ce poate Ii executata}
end;
Nu e mare IilosoIie! Ei bine, un tren este caracterizat de cele trei cmpuri ce-i determin structura:
numele mecanicului, tipul trenului (aici ales dintr-o enumerare), precum si de Iaptul c se poate
deplasa, deci de acea procedur Deplaseaza. Singurele restricii sunt acelea c procedurile si
Iunciile (pot Ii mai multe !) trebuie s Iigureze dup toate cmpurile de structur, iar dup ultima
procedur trebuie scris simbolul '; neaprat.
Bogdan Ptru Programarea calculatoarelor electronice
69
Acum dac T este o variabil de tip Tren, iar MultimeDeTrenuri un vector de trenuri: var T: Tren;
MultimeDeTrenuri: array|1..10| oI Tren; putem s ne reIerim la numele mecanicului din trenul T
prin T.mecanic, precum si la al treilea tren din MultimeDeTrenuri, prin MultimeDeTrenuri|3|, tipul
acestui din urm tren neIiind reIerit dect prin MultimeDeTrenuri|3|.tip.
Pentru a spune c vrem s se execute procedura Deplaseaza asupra trenului T vom scrie pur si
simplu T.Deplaseaza si la Iel si pentru al treilea tren din vector: MultimeDeTrenuri|3|.Deplaseaza.
Cum s-ar descrie aceast procedur? Cum ea este ceva ce caracterizeaz nu numai pe T sau pe
Iiecare component a vectorului MultimeDeTrenuri, ci ntreaga clas a obiectelor de tip Tren, se va
descrie n Ielul urmtor:
procedure Tren.Deplaseaza;
begin
........ }
end;
n aIar de astIel de proceduri, putem avea si constructori si destructori. Desi pot Ii considerai si
Iolosii pentru a iniializa cmpurile de structur (atributele) unui obiect, ei se Iolosesc si n alte
scopuri
6.2. Definirea claselor
Un tip obiect se declar ca un tip nregistrare, speciIicndu-se toate atributele (cmpurile
structurale) si metodele (cmpurile Iuncionale) obiectelor. Ambele tipuri de cmpuri pot Ii Iie
publice (implicit), Iie private. Cmpurile private, Iie c sunt atribute, Iie c sunt metode, nu vor
putea Ii recunoscute n exteriorul obiectelor. Asadar, dac se declar un cmp atribut privat, asupra
lui nu se va putea aciona dect din cadrul unei metode a obiectui respectiv. De asemenea, o metod
privat va putea Ii apelat doar din cadrul altei metode a obiectului, nu si din exterior. Metodele
publice vor Ii cele ce vor permite comunicarea ntre obiect si mediul exterior, ele putnd Ii apelate
si din blocul n care a Iost deIinit tipul obiect respectiv. La Iel n cazul atributelor private.
Declararea unor cmpuri publice, respectiv private se Iace cu directivele public, respectiv private.
Dac nu se speciIic, cmpurile se consider implicit publice.
n cazul cel mai general, o clas de obiecte se declar astIel:
type idtipobiect object
public
cmpuripublice;
private
cmpuriprivate;
end;
O variabil de acest tip se va declara: var v:idtipobiect.
Completa deIinire a tipului idtipobiect presupune si deIinirea explicit a tuturor metodelor
declarate.
Bogdan Ptru Programarea calculatoarelor electronice
70
De pild, dac vrem s deIinim un obiect graIic oarecare, pe care s putem s-l ncadrm ntr-o zon
dreptunghiular determinat de (x1,y1,x2,y2), iar obiectul s poat Ii iniializat, desenat, sters si
mutat cu mouse-ul, am putea scrie:
type TObiect object
private
x1,y1,x2,y2: Integer;
procedure Display;
procedure Clear;
public
procedure Init(x10,y10,x20,y20: Integer);
procedure Move;
end;
n exterior nu ne intereseaz atributele obiectelor, nici procedurile de aIisare, stergere. Avem nevoie
doar de procedura de iniializare, n care x10, y10, x20 si x20 sunt coordonatele ce deIinesc poziia
iniial a obiectului, precum si de procedura de mutare a unui obiect cu mouse-ul.
Metoda Init va prelua valorile din lista de parametri si le va da cmpurilor x1, y1, x2 si y2, apoi va
aIisa obiectul graIic respectiv, apelnd la metoda privat Display, la care Init are acces.
procedure TObiect.Init; OI }
begin x1:x10; y1:y10; x2:x20; y2:y20; Display end;
Mutarea obiectelor va Ii realizat cu mouse-ul ntr-o manier asemntoare celei de desenare a unui
dreptunghi pe care o Ioloseam la programul Desenator din lecia precedent. Ea va apela la
metodele Clear (care va sterge obiectul din vechea poziie) si Display, care l va reaIisa n noua
poziie. Deocamdat nu ne intereseaz cum s-ar implementa Display, deoarece aceast metod
diIer de la obiect la obiect, cert este c Display va aIisa ceva n zona dreptunghiular
(x1,y1,x2,y2), ceva ce Clear va putea sterge cu ClearViewPort, procedur pe care am descris-o si
pus-o deja n biblioteca noastr graIic Graph1.
procedure TObiect.Clear; OC ]
begin ClearView(x1,y1,x2,y2) end;
procedure TObiect.Display;
begin va Ii deIinita ulterior } end;
procedure TObiect.Move; OM ]
var b,px,py,x,y: Integer;
begin
MouseData(b,px,py);
iI (b1) and Apartine(px,py,x1,y1,x2,y2) then
begin
SetWriteMode(1); MouseHide;
repeat
MouseData(b,x,y); Rectangle(x1x-px,y1y-py,x2x-px,y2y-py);
MouseShow; Delay(50); MouseHide;
Rectangle(x1x-px,y1y-py,x2x-px,y2y-py);
until b0;
SetWriteMode(0); Clear;
x1:x1(x-px); y1:y1(y-py); x2:x2(x-px); y2:y2(y-py);
Display; MouseShow
end
end;
Bogdan Ptru Programarea calculatoarelor electronice
71
S considerm c obiectele graIice pe care dorim s le aIism si mutm sunt niste elipse. Atunci
vom deIini metoda Display a tipului TObiect n Ielul de mai jos:
procedure TObiect.Display; OD ]
begin Ellipse((x1x2)div 2,(y1y2)div 2,0,360,(x2-x1)div 2,(y2-y1)div 2)
end;
n acest moment, putem realiza deja un simplu program graIic, care s ne permit mutarea cu
mouse-ul a unei elipse desenate pe ecran. Ea se 'aga cu butonul din stnga al mouse-ului din
interiorul dreptunghiului ce ar ncadra-o. Pe parcursul deplasrii mouse-ului (cu butonul din stnga
inut apsat), un dreptunghi va urma direcia de deplasare a mouse-ului. Cnd ne oprim (eliberm
butonul de mouse), dreptunghiul dispare, coordonatele acestuia se actualizeaz, elipsa dispare din
vechea poziie si reapare n cea nou. Programul este urmtorul, n care am pus n loc de proceduri,
marcajele lor anterioare.
program ObiectGrafic;
uses Graph, Graph1, uMouse, Crt;
function Apartine(x,y,x1,y1,x2,y2: Integer): Boolean;
begin
Apartine : (x1x) and (xx2) and (y1y) and (yy2)
end;
type TObiectobject
private
x1,y1,x2,y2: Integer;
procedure Display;
procedure Clear;
public
procedure Init(x10,y10,x20,y20: Integer);
procedure Move;
end;
OI; OC; OD; OM;
var Obiect: TObiect;
begin
OpenGraph; Obiect.Init(100,100,150,180);
MouseInit; MouseShow;
repeat Obiect.Move until KeyPressed;
CloseGraph
end.
6.3. Derivare
n continuare, s considerm c dorim s extindem obiectul graIic din exemplul anterior, punndu-i
un nou atribut si anume raza unui cercule care s se deseneze n interiorul elipsei. Vom deIini
astIel, un nou obiect, care va avea toate caracteristicile celui anterior, plus atributul raza. Dar un
astIel de obiect va trebui s aib o nou procedur de aIisare, pe care s o numim, deocamdat,
DisplayC, care va desena o elips si un cercule de raz raza. Aceast procedur va desena un mic
Bogdan Ptru Programarea calculatoarelor electronice
72
cercule, dup care va apela procedura Display. Vom spune c elipsa cu cercule moyteneyte elipsa
de tip TObiect. prelunindu-i toate cmpurile (inclusiv pe Display), si are noi cmpuri: raza (atribut)
si DisplayC (metod). Operaia prin care clasa elipselor cu cercule mosteneste clasa TObiect, a
elipselor simple, se numeste si derivare. Se spune c tipul TElipsaCerc este derivat din tipul
TObiect. Vom scrie, n general, acest lucru n Ielul urmtor:
type obderivat object(obdebaza)
........
end;
n cazul nostru concret avem:
program ObiecteGraficeDerivate ;
....... ca in programul precedent }
DERIVARE }
type TElipsaCerc object(TObiect)
raza: Integer; publice }
procedure DisplayC;
end;
METODA NOUA }
procedure TElipsaCerc.DisplayC;
begin
Circle((x1x2) div 2, (y1y2) div 2, raza); Display
end;
var E: TElipsaCerc;
begin
OpenGraph; E.Init(100,100,150,180);
E.raza:5; E.DisplayC; ReadLn; CloseGraph
end.
Eireste, vom putea s Iolosim n continuare metoda Move a clasei printe, ns nu trebuie ca, dup
mutare, s ne asteptm ca elipsa s cuprind si cerculeul, deoarece metoda Move va apela metoda
Display si nu metoda DisplayC !
6.4. Polimorfism
Pentru a rezolva problema ivit n paragraIul precedent, recurgem la polimorfism. Aceasta
nseamn c putem s avem n clasa derivat TElipsaCerc o metod nou Display, care s aib
acelasi nume cu metoda din clasa printe (TObiect), ns s execute alt lucru. AstIel, vom nlocui pe
TElipsaCerc.DisplayC cu TElipsaCerc.Display. ns, de aceast dat, va trebui s precizm explicit
n cadrul acestei metode c se apeleaz metoda cu acelasi nume a clasei mostenite. De aceea vom
scrie : TObiect.Init. Programul este dat mai jos. Vom obine acelasi rezultat ca si n cel de mai
nainte (seciunea 3), ns cele dou metode (din clasa printe si cea derivat) au acelasi nume. n
plus, am redenumit metoda Init care va permite, de aceast dat s punem cmpul raza ca privat
(lucru mai indicat n programarea pe obiecte), deoarece raza va Ii iniializat de aceast metod,
rmas public.
Bogdan Ptru Programarea calculatoarelor electronice
73
Dup ce se deseneaz elipsa cu cercule, se asteapt mutarea sa cu mouse-ul. Aceasta se realizeaz,
ns cerculeul nu se mut, din pcate, tocmai pentru c se apeleaz metoda Init a clasei printe si nu
cea a clasei derivate...
program MetodePolimorfe ;
. . . . . . . . ca mai inainte }
type TElipsaCercobject(TObiect)
private
raza: Integer;
public
procedure Init(x10,y10,x20,y20,raza0: Integer);
procedure Display;
end;
procedure TElipsaCerc.Init;
begin
TObiect.Init(x10,y10,x20,y20); apel metoda clasei de baza }
raza:raza0 initializarea razei cercului }
end;
procedure TElipsaCerc.Display;
begin
TObiect.Display; Circle((x1x2) div 2, (y1y2) div 2, raza)
end;
var E: TElipsaCerc;
begin
OpenGraph; E.Init(100,100,150,180,5); E.Display;
MouseInit; MouseShow;
repeat E.Move until KeyPressed; CloseGraph
end.
6.5. Metode virtuale
Pentru a rezolva si ultima problem pus n paragraIul anterior, se declar metoda Display (care este
apelat de metoda de mutare a obiectelor Move) ca Iiind metod virtual sau dinamic, Iolosind
directiva virtual. n acest Iel, metoda Move, cnd Iace apel la metoda Display va identiIica n
momentul execuiei tipul obiectului pentru care trebuie s se Iac aIisarea si, n Iuncie de acesta, se
va apela procedura Display corespunztoare.
n acest caz, ns, orice redeIinire a metodei, n cadrul claselor derivate, se va Iace Iolosind tot
cuvntul virtual. De aesemenea, aceste clase vor trebui s aibe cte o metod speciIic, numit
consructor, care creeaz n memorie o tabel de metode virtuale.
Constructorul este prima metod ce se apeleaz n cadrul obiectului si are un rol dublu:
- dup apelul constructorului, relativ la un obiect, o metod care apare redeIinit este apelat din
cadrul obiectului pentru care s-a Icut apelul constructorului si nu din cadrul obiectului din care
s-a Icut apelul;
- n cadrul constructorului se pot Iace opional si alte operaii, de pild iniializri, motiv pentru
care n exemplul nostru vom considera drept constructor metoda Init.
Bogdan Ptru Programarea calculatoarelor electronice
74
Menionm c metodele de tip constructor nu pot Ii virtuale. De asemenea, nu pot Ii redeIinite
atributele (cmpurile structurale) dintr-o clas de obiecte.
program MetodeVirtuale ;
uses Graph, Graph1, uMouse, Crt;
function Apartine(x,y,x1,y1,x2,y2: Integer): Boolean;
begin Apartine : (x1x) and (xx2) and (y1y) and (yy2) end;
type TObiect object
private
x1,y1,x2,y2: Integer;
procedure Display; virtual;
procedure Clear;
public
constructor Init(x10,y10,x20,y20: Integer);
procedure Move;
end;
type TElipsaCercobject(TObiect)
private
raza: Integer;
public
constructor Init(x10,y10,x20,y20,raza0:Integer);
procedure Display; virtual;
end;
constructor TElipsaCerc.Init;
begin
TObiect.Init(x10,y10,x20,y20); raza:raza0
end;
procedure TElipsaCerc.Display;
begin
TObiect.Display; Circle((x1x2) div 2, (y1y2) div 2, raza)
end;
constructor TObiect.Init;
begin
x1:x10; y1:y10; x2:x20; y2:y20; Display
end;
procedure TObiect.Clear;
begin ClearView(x1,y1,x2,y2) end;
procedure TObiect.Display;
begin
Ellipse((x1x2)div 2,(y1y2)div 2,0,360,(x2-x1)div 2,(y2-y1)div 2)
end;
procedure TObiect.Move;
var b,px,py,x,y: Integer;
begin
MouseData(b,px,py);
iI (b1) and Apartine(px,py,x1,y1,x2,y2) then
begin
SetWriteMode(1); MouseHide;
repeat
MouseData(b,x,y); Rectangle(x1x-px,y1y-py,x2x-px,y2y-py);
Bogdan Ptru Programarea calculatoarelor electronice
75
MouseShow; Delay(50); MouseHide;
Rectangle(x1x-px,y1y-py,x2x-px,y2y-py);
until b0;
SetWriteMode(0); Clear;
x1:x1(x-px); y1:y1(y-py); x2:x2(x-px); y2:y2(y-py);
Display; MouseShow
end
end;
var O: TObiect; E: TElipsaCerc;
begin
OpenGraph; E.Init(100,100,150,180,5); O.Init(200,200,270,240);
E.Display; O.Display; MouseInit; MouseShow;
repeat E.Move; O.Move until KeyPressed; CloseGraph
end.
Un exemplu mai complex care Ioloseste metodele virtuale este dat de programul urmtor. Acesta
permite mutarea cu mouse-ului a mai multor obiecte diIerite, memorate n niste vectori. Aceste
obiecte sunt de tipurile TDrept si respectiv TDisc, ambele clase Iiind derivate din clasa general
TObiect, a crei metod Display este vid, ea Iiind redeIinit la nivelul claselor ce o mostenesc.
si constructorii sunt redeIinii la nivelul claselor derivate. AstIel, dac constructorul clasei de baz
are patru parametri pentru iniializare (coordonatele x1, y1, x2, y2), constructorul unui dreptunghi
primeste si culoarea iniial cul0, iar cel pentru disc att culoarea, ct si stilul de hasur: cul0, has0.
program ObiecteGraficeDiverse ;
uses Graph, Graph1, uMouse, Crt;
function Apartine(x,y,x1,y1,x2,y2: Integer): Boolean;
begin
Apartine : (x1x) and (xx2) and (y1y) and (yy2)
end;
type TObiect object
private
x1,y1,x2,y2: Integer;
procedure Display; virtual;
procedure Clear;
public
constructor Init(x10,y10,x20,y20: Integer);
procedure Move;
end;
constructor TObiect.Init;
begin x1:x10; y1:y10; x2:x20; y2:y20; Display end;
procedure TObiect.Clear;
begin ClearView(x1,y1,x2,y2) end;
procedure TObiect.Display;
begin va Ii redeIinita } end;
procedure TObiect.Move;
var b,px,py,x,y: Integer;
begin
MouseData(b,px,py);
Bogdan Ptru Programarea calculatoarelor electronice
76
iI (b1) and Apartine(px,py,x1,y1,x2,y2) then
begin
SetWriteMode(1); MouseHide;
repeat
MouseData(b,x,y);
Rectangle(x1x-px,y1y-py,x2x-px,y2y-py);
MouseShow; Delay(50); MouseHide;
Rectangle(x1x-px,y1y-py,x2x-px,y2y-py);
until b0;
SetWriteMode(0); Clear;
x1:x1(x-px); y1:y1(y-py); x2:x2(x-px); y2:y2(y-py);
Display; MouseShow
end
end;
type TDrept object(TObiect)
private
cul: Byte;
public
constructor Init(x10,y10,x20,y20,cul0: Integer);
procedure Display; virtual;
end;
constructor TDrept.Init;
begin
cul:cul0;
TObiect.Init(x10,y10,x20,y20) se apeleaza constructorul clasei de baza}
end;
procedure TDrept.Display;
begin
SetColor(cul); Rectangle(x1,y1,x2,y2) redeIinirea metodei }
end;
type TDisc object(TObiect)
private cul,has: Byte;
public
constructor Init(x10,y10,x20,y20,cul0,has0: Integer);
procedure Display; virtual;
end;
constructor TDisc.Init;
begin
cul:cul0; has:has0;
TObiect.Init(x10,y10,x20,y20) apel constructor clasa parinte}
end;
procedure TDisc.Display;
begin
SetEillStyle(has,cul);
EillEllipse((x1x2) div 2,(y1y2) div 2,(x2-x1) div 2, (y2-y1) div 2)
end;
const NrDreptunghiuri 5; NrDiscuri 3;
var Drp: array|1..NrDreptunghiuri| oI TDrept;
Dsc: array|1..NrDiscuri| oI TDisc; i: Integer;
begin
Bogdan Ptru Programarea calculatoarelor electronice
77
OpenGraph; SetBkColor(Blue); MouseInit; MouseShow;
Ior i:1 to NrDreptunghiuri do
Drp|i|.Init(1050*i,100,5050*i,10010*i,8i);
Ior i:1 to NrDiscuri do
Dsc|i|.Init(1050*i,300,5050*i,30010*i,8i,i);
repeat
Ior i:1 to NrDreptunghiuri do Drp|i|.Move;
Ior i:1 to NrDiscuri do Dsc|i|.Move
until KeyPressed; CloseGraph
end.
Observaii
+ Derivarea poate genera si relaii de mostenire mai 'mari, n sensul c putem avea o clas de
obiecte B derivat dintr-o clas printe A, iar din B s se deriveze o clas C. Atunci, C va mosteni si
de la A, iar A este un strmos att pentru B, ct si, indirect, pentru obiectele de tip C.
+ Dac avem un obiect de tip TObiect, s zicem var O: TObiect, si un obiect var D: TDrept, unde
TDrept este derivat din TObiect, atunci putem realiza o aribuire de genul O:D, nu si invers: D:O.
+ Variabilele de tip obiect pot Ii parametri pentru proceduri ca si variabilele de orice tip. De
asemenea, dac un parametru Iormal ntr-o procedur este de un obiect strmos, atunci procedurii i
se poate trimite ca parametru eIectiv un obiect descendent din acesta.
Rmne la latitudinea cititorului ca s se Ioloseasc de toate avantajele pe care le oIer programarea
orientat pe obiecte. Lucrrile de la bibliograIie notate cu semnul ' pot Ii consultate pentru o
documentare mai bun n legtur cu programarea orientat pe obiecte si posibilitile oIerite de
aceast tehnic.
Bogdan Ptru Programarea calculatoarelor electronice
78
Capitolul 7. Bazele programrii vizuale
7.1. Consideraii generale
Programarea vizual este un exemplu de programare orientat pe obiecte i dirifat de evenimente.
Programele sunt structurate ca sisteme reactive. Evenimente ce apar in mediu determin execuia
unui Iragment de program. Un numr de dispozitive graIice (controale) sunt aIisate pe ecran pentru
a mediatiza dialogul om-calculator. Prin operarea asupra acestor controale, utilizatorul genereaz
evenimente, care determin execuia unor anumite Iragmente de program.
Programarea vizual este o modalitate de structurare a proiectrii de nivel nalt, care poate Ii apoi
detaliat n implementri convenionale.
Se Ioloseste pentru aplicaii GUI (interIee graIice utilizator), de tip Windows. Se pot realiza rapid
aplicaii comerciale si perIormante.
Programatorul are deja construite elementele interIeei, astIel nct interIaa cu utilizatorul se
proiecteaz cu Ioarte mare usurin. De aceea, programatorul si poate concentra atenia asupra
algoritmului de baz, evitnd operaiile de rutin, care, de obicei, in de proiectarea interIeei om-
calculator.
Noiunile de baz n programarea vizual sunt: forma, controlul, evenimentul si procedura.
7.2. Forme
O aplicaie Windows este Iormat din una sau mai multe Ierestre, care apar n diIerite momente ale
programului, n Iuncie de comenzile date de utilizator. Asemenea Ierestre, ca si altele, neaIisabile,
se numesc Iorme. O Iorm conine unul sau mai multe obiecte (controale) asupra crora se poate
aciona pentru a controla execuia programului.
7.3. Controale yi proprietile lor
Obiectele vizibile dintr-o Iorm, prin intermediul crora se realizeaz interaciunea om-calculator se
numesc sau obiectele invizibile asupra crora pot avea loc evenimente ce pot determina execuia
unor Iragmente de program se numesc controale.
Exemple
controale vizibile:
butoane
casete de introducere a unui text
casete de selecie
butoane radio
liste derulante de selecie
liste combinate
meniuri
controale invizibile:
cronometre
controale multimedia
control pentru o Iereastra de dialog
controale pentru comunicaie prin porturi
paralele sau seriale
Bogdan Ptru Programarea calculatoarelor electronice
79
7.4. Evenimente
Orice aciune asupra unui echipament periIeric sau component intern (mouse, tastatur,
imprimant, ceas etc.) se numeste eveniment.
Apariia unui eveniment asupra unei Iorme sau a unui control poate Ii exploatat pentru execuia
unui anumit bloc de program
Exemple:
- click de mouse pe un buton
- dublu-click pe un element dintr-o list derulant
- agare si deplasare asupra unei zone de desenare
- apariia unei erori la imprimant
- scurgerea unui interval de timp pentru un cronometru
7.5. Legarea evenimentelor de controale
Procedura este un Iragment de program care corespunde asocierii realizate ntre un control si un
eveniment. Ea limiteaz sau extinde comportamentul unui control la apariia unui eveniment asupra
sa.
Procedura se comport ca orice subprogram de tip procedur din programarea procedural clasic.
Ordinea de apel a procedurilor este stabilit de utilizatorul programului si nu de programator.
Procedurile pot Iunciona n paralel. Programatorul poate controla desIsurarea lucrurilor prin
intermediul unor variabile globale, proprieti ale obiectelor etc.
O aplicaie vizual trebuie vzut ca un ciclu inIinit, n care procedurile sunt executate n Iuncie
de ordinea n care sunt apelate de utilizator.
Controalele sunt n asteptarea apariiei unui eveniment asupra lor, care va determina execuia unei
anumite proceduri. Aplicatia este oprit tot de ctre utilizator.
7.6. Proprieti yi metode
Eormele si controalele sunt obiecte avnd anumite atribute care le caracterizeaz structura sau
comportamentul, numite proprieti. Metodele exprim ceea ce Iace un obiect (control sau Iorm).
Metodele sunt proceduri ncorporate ntr-un obiect.
Exemple:
proprieti:
- LeIt, Top - poziia unui obiect pe ecran
- Width, Height - dimensiunile obiectului
- Sorted - este sau nu o list sortat
- MultiSelect - se permite sau nu selectarea mai multor elemente dintr-o list
- Name - numele obiectului
Bogdan Ptru Programarea calculatoarelor electronice
80
metode:
- Move - deplasarea unui obiect pe ecran
- Show - aIisarea unui obiect
- Hide - ascunderea unui obiect
Notaia cu punct
ReIerirea la o anumit proprietate P a unui obiect O se realizeaz prin notaia: O.P
Unele proprieti pot primi valori att n timpul proiectrii aplicaiei, ct si n timpul execuiei sale,
prin instruciuni de atribuire din program. Att proprietile unui tip de obiect, ct si valorile pe care
le poate lua ea pot Ii determinate n timpul programrii, direct din mediul de programare.
Apelarea unei metode M a unui obiect O cu argumentele A
1
, A
2
, ... A
n
se Iace prin: O.M(A
1
, A
2
, ...
A
n
) (eventual Ir paranteze, ca n Visual Basic).
Pe cnd proprietile descriu un obiect (sunt date), metodele permit unui obiect s fac ceva (sunt
cod).
Obiectele sunt substantive, proprietile sunt adjective, iar metodele sunt verbe.
Bogdan Ptru Programarea calculatoarelor electronice
81
Capitolul 8. Programarea in Visual Basic
8.1. Pornirea mediului de programare Visual Basic 5
Se poate Iace n mai multe moduri, de exemplu:
1. Dublu-click pe iconia corespunztoare, dac exist o asemenea iconi pe Desktop-ul
calculatorului ("masa de lucru")
2. Acionnd butonul Start din partea de stnga joc a ecranului, apoi opiunea Programs, apoi
alegnd grupul MicrosoIt Visual Basic 5 si, n Iinal, MicrosoIt Visual Basic 5.
La pornire vei Ii ntmpinat de un ecran precum cel din Iigura de mai jos si, pentru a crea o
aplicaie executabil standard, deocamdat vei alege "Standard exe" si vei aciona butonul Open.
Dup aceasta, Visual Basic va arta ca n Iigura urmtoare, n care am pus n eviden principalele
elemente care ne intereseaz pentru dezvoltarea unor aplicaii simple.
Bogdan Ptru Programarea calculatoarelor electronice
82
Asadar, urmreste cu atenie cele 6 zone din mediul VB5, Iiecare avnd importana ei si mai trziu
vei nelege mai bine la ce ajut Iiecare.
Deocamdat i spun c un program (aplicaie sau proiect) VB este compus din una sau mai multe
Iorme. Acestea sunt Ierestre ca cele din Windows, asa cum arat si Iorma ta Eorm1, din centrul
ecranului (vezi zona 4). Deocamdat vom realiza mpreun programe ce vor Iolosi doar o singur
Iorm, dar dac te vei descurca bine vom trece si la programe cu mai multe Iorme. Structura
proiectului tu se prezint n zona 5. Pe Iorme pot Ii amplasate diIerite obiecte, precum butoane de
comand, casete de text, liste derulante sau tot Ielul de alte elemente de interIa pe care le-ai
ntlnit n mai toate aplicaiile din Windows (vezi zona 6). Vom numi aceste obiecte controale. Ele,
ca si Iorma, dealtIel, pot Ii personalizate, stabilind diIerite valori pentru proprietile lor, precum
culoare, Iont, poziie (vezi zona 7). Pentru ca ele s acioneze n sensul dorit de tine, va trebui s le
atasm anumite proceduri sau subrutine, adic mici buci de cod, adic de program, scrise n
Visual Basic.
Dac vrei s Iaci trecerea de la vizualizarea interIeei la vizualizarea codului si napoi, va trebui s
apesi pe butoanele din zona 3.
Aplicaia ta este deja Iuncional, dac o vei porni:vei avea o Iereastr simpl, Iorma Eorm1, pe
care o poi muta, redimensiona si nchide, ca orice Iereastr din Windows. Deocamdat esti n Iaza
de proiectare (design), iar de acest lucru i poi da seama n mai multe Ieluri. n zona 1 apare scris,
printre altele, cuvntul "design". Pe de alt parte, Eorm1 are o serie de puncte pe ea, care nu sunt
2. Butoanele de
pornire si oprire
1. Remarcai c suntei n Iaza de "design".
5. Structura proiectului tu.
4. Eorma programul tu
3. View Code si View Object
6. Controalele ce vor Ii amplasate
pe Iorma ta si vor Ii programate de
tine.
7. Tabelul cu proprietile Iormei
sau ale controalelor de pe ea.
Bogdan Ptru Programarea calculatoarelor electronice
83
altceva dect punctele Iixe ale unei grile, care te poate ajuta la amplasarea mai exact a controalelor
pe Iorm. n plus, n zona 2, butonul Start (ce seamn cu butonul Play de la orice casetoIon) este
activ, pe cnd celelalte dou nu.
Dac vrei s pornesti aplicaia, trebuie s acionezi pe butonul Start sau pe tasta E5. Cuvntul
"design" din zona 1 va Ii nlocuit de cuvntul "run" (deci aplicaia ruleaz), grila de pe Eorm1 va
disprea, iar butonul Start va deveni inactiv, dar se vor activa celelalte dou butoane (ne intereseaz
butonul End). Abia acum poi muta sau redimensiona Iereastra ta, iar dac vrei s opresti
programul, vei apsa pe butonul End din zona 2 sau pe X-ul din colul dreapta-sus al Ierestrei
Eorm1.
8.2. Primul tu program
Ca s realizezi primul tu program n VB care s arate puin altIel, s Iie personalizat, si s mai si
Iac ceva, trebuie s privesti cu atenie tabelul de proprieti din dreapta. Acolo sunt trecute
proprietile obiectului curent selectat, n cazul nostru Eorm1. n stnga tabelului sunt trecute
proprietile, n ordine alIabetic, iar n dreapta valorile lor. De exemplu, proprietatea BackColor
desemneaz culoarea de Iundal a Iormei, care are valoarea ButtonEace (n general gri) si o poi
modiIica, de exemplu, n albastru, ales din paleta de culori.
O alt proprietate este Caption, care reprezint textul scris n antetul Iormei. Scrie acolo, n loc de
"Eorm1", textul "Primul meu program". Ai grij s nu conIunzi proprietatea Caption cu proprietatea
(Name), care apare prima n tabelul de proprieti si desemneaz chiar numele Iormei tale (Eorm1).
Schimb si proprietatea BorderStyle la valoarea 1-Eixed Single, pentru ca Iereastra ta s nu mai
poat Ii redimensionat n timpul rulrii programului tu.
Dac mai amplasezi pe Iorm, prin drag and drop, un buton de comand, dup ce l-ai ales din bara
de instrumente din zona 6, el va aprea att cu numele Command1, dar si cu proprietatea Caption
avnd valoarea tot Command1. Schimb-o n "Salut". Ai grij ca nu cumva s schimbi proprietatea
Caption de la Eorm1! Pentru a schimba valoarea unei anumite proprieti a unui anumit obiect,
trebuie ca mai nainte s selectezi acel obiect, de exemplu printr-un simplu Click pe el.
Porneste acum programul tu si, desi dac apesi pe butonul Command1 (pe care st scris cuvntul
"Salut") nu se ntmpl nimic, oricum arat mai bine!
Bogdan Ptru Programarea calculatoarelor electronice
84
Hai s Iacem ca atunci cnd apesi pe butonul acesta s apar un mesaj, cu textul "Bun ziua!". Ei
bine, ca s determinm calculatorul/programul s se comporte asa, va trebui s stii c atunci cnd
acionezi ntr-un Iel sau altul (de exemplu prin click de mouse) pe un control sau pe o Iorm, VB
nelege c ai produs un anumit eveniment. Un asemenea eveniment se numeste Click si se produce
atunci cnd tu apesi simplu cu mouse-ul pe butonul Command1. Pentru a-l Iace pe calculator s
reacioneze la Click-ul utilizatorului pe butonul Command1, va trebui s scriem o subrutin, numit
chiar Command1Click. Aceasta va Ii o bucat de cod n VB ce va conine o secven de
instruciuni, prin care se precizeaz ce anume trebuie s execute calculatorul/programul, de Iiecare
dat cnd se execut Click pe butonul Command1.
Subrutina va ncepe cu Private Sub urmat de numele ei (Command1Click) si se va ncheia cu End
Sub.
Pentru a o scrie, trebuie ca programul tu s Iie oprit. Apoi vei alege din zona 2 primul buton (View
Code) si vei Iace click pe el. Deasupra paginii albe care va aprea stau dou liste (n prima scrie
(general), iar n a doua (declarations)). Alege din prima controlul cu pricina, adic butonul de
comand Command1, iar n a doua va aprea automat cel mai Irecvent eveniment asupra unui buton
de comand, adic evenimentul Click (dac vei derula lista, vei observa c sunt mult mai multe
evenimente acolo, dar pe tine deocamdat doar Click te intereseaz).
Dup aceea scrie acest text, ca n Iigura de mai jos, apas pe View Object (n zona 2) si vei vedea c
butonul reacioneaz la apsarea ta.
La apsarea butonului, vei obine urmtoarea caset de mesaj (denumirea procedurii MsgBox
tocmai de acolo vine), n care vbInIormation este o constant numeric ce simbolizeaz semnul de
inIormaie din caset. Opreste programul si ncearc si vbExclamation sau vbCritical pentru a vedea
eIectul.
Dac esti n Iaza de proiectare si vrei s ajungi mai repede la codul asociat unui anumit obiect, poi
s Iaci dublu-click pe respectivul obiect; de exemplu, dac ai dat View Object si execui dublu-click
pe butonul Command1, vei ajunge la subrutina Command1Click, Ir s mai acionezi tu pe View
Code (n zona 2).
Bogdan Ptru Programarea calculatoarelor electronice
85
8.3. Un salut special pentru tine!
Vom ncerca s complicm puin exemplul anterior, astIel nct VB s te salute special pe tine sau
pe cineva, al crui nume s Iie scris ntr-o caset de text. Hai s amplasm, asadar, sub butonul
nostru o caset de text. Priveste zona 6 si alege de acolo simbolul care conine un "ab" (TextBox).
Deseneaz caseta de text sub butonul Command1 si apoi denumeste aceast caset Persoana,
modiIicnd proprietatea (Name) (prima din lista lui Text1). Sterge apoi coninutul din interiorul
casetei de text, care era trecut cu valoarea Text1 la proprietatea Text a acestei casete de text.
E momentul s stii c dac ai un obiect (Iorm sau control) care se numeste X si el are o
proprietatea P, pentru a Iace reIerin la valoarea proprietii P a obiectului X va trebui s notezi
acest lucru, n programul tu, prin X.P. AstIel, proprietatea Caption a butonului Command1 (care
are valoarea Salut) se noteaz prin Command1.Caption, iar proprietatea Text a casetei de text
Persoana prin Persoana.Text. Textul din interiorul casetei de text Persoana va trebui "adugat" sau,
mai bine zis, alipit (concatenat) salutului nostru, din subrutina Command1Click. Asadar, pentru ca
s primim un salut pentru persoana al crei nume va Ii scris n caseta Persoana (n timpul
Iuncionrii programului), va trebui s modiIicm subrutina Command1Click astIel:
Private Sub Command1_Click()
MsgBox "Buna ziua "+Persoana.Text+"!", vbInformation, "Salutare"
End Sub
Ce se va obine? Dac pornesti programul si scrii n caseta de text Diana, vei obine, la apsarea
butonului Command1 un salut special pentru Diana:
Aceast caset de
text se numea
Text1, acum se
numeste
Persoana
Bogdan Ptru Programarea calculatoarelor electronice
86
Asadar, simbolul matematic nseamn, cnd este vorba despre texte, concatenare, adic alipirea
unor texte. Probabil ai observat deja c textele (sirurile de caractere) constante (precum "Bun ziua"
sau "Salutare") se scriu ntre ghilimele (si nu apostroIuri, ca de exemplu n limbajul Pascal). Dac
nu vei introduce nimic n caseta de text, atunci nu te astepta dect la un salut ca cel de mai nainte.
AstIel, Persoana.Text va Ii considerat sirul vid (Ir nimic n el) si va avea valoarea notat prin "".
8.4. Un calculator cu operaii aritmetice
Renun la proiectul vechi si ncepe unul nou. Dac vrei s renuni, apesi n meniu Eile-~Remove
project si i se va cere s-l salvezi. Va trebui s dai un nume att pentru Iisierul ce cuprinde Iorma ta
(interIaa si codul ei) Eorm1, ct si un nume pentru proiectul n ansamblul su. Primul Iisier va avea
extensia ERM, iar al doilea VBP. Dac mai trziu vei realiza un Iisier ce va conine m Iorme si n
module (cod Ir interIee), cnd va trebui s salvezi, vei da nume la mn1 Iisiere, ultimul Iiind
nsusi proiectul, adic un Iisier n care se pstreaz inIormaii despre structura aplicaiei tale.
De data aceasta, te rog s amplasezi pe Iorma ta trei casete de text (Ir text n ele), Iie ele
Operand1, Operand2 si Rezultat (denumeste-le asa modiIicnd proprietile Name de la Iiecare),
precum si patru butoane, pe care te rog s le denumesti ButonPlus, ButonMinus, ButonOri si
ButonSupra, pentru a avea nume mai sugestive pentru cele patru butoane corespunztoare celor
patru operaii aritmetice pe care vrem s le implementm n programul nostru.
ModiIic si proprietile Caption de la Iiecare din cele patru butoane, punnd pe ele simbolurile , -,
x si :. Dac i se pare c aceste simboluri sunt prea mici pentru butoanele pe care apar, nu ai dect s
te Iolosesti de proprietatea Eont si s le mresti sau s le evideniezi (cu Bold).
Bogdan Ptru Programarea calculatoarelor electronice
87
Ataseaz primului buton, cel pentru adunare (ButonPlus) urmtoarea subrutin, care vrea s adune
numrul ce va Ii scris n caseta Operand1 cu cel din caseta Operand2 si s pun rezultatul n caseta
Rezultat.
Private Sub ButonPlus_Click()
Rezultat.Text = Operand1.Text + Operand2.Text
End Sub
Acum porneste programul, introdu un numr n caseta Operand1, un altul n caseta Operand2, apas
pe butonul de adunare si... vei constata c numerele nu se adun corect.
Dac observi cu atenie, ele sunt considerate ca niste texte care se "adun" precum textele, adic se
concateneaz. Acest lucru este Iiresc, deoarece Visual Basic interpreteaz coninuturile celor dou
casete de text (Operand1 si Operand2) ca Iiind texte (siruri de caractere sau date de tip String) si
nicidecum numere. Pentru ca totul s mearg asa cum ne-am propus, adic s adugm numere, va
trebui ca s convertim aceste texte la valorile numerice corespunztoare, cu alte cuvinte s
"scoatem" ghilimelele de la "20" si "45", pentru a obine 20 si 45, deci si suma lor 65 si nu 2045.
De "scoaterea" ghilimelelor se ocup Iuncia Val, iar de "punerea lor" se ocup Iuncia invers ei,
numit Str. Corect ar Ii s scriem asa:
Rezultat.TextStr(Val(Operand1.Text)Val(Operand2.Text)),
dar conversia de la valoarea numeric la textul necesar casetei Rezultat se Iace automat, asadar e
suIicient s nlocuim subrutina gresit de mai sus cu cea corect de mai jos:
Private Sub ButonPlus_Click()
Rezultat.Text = Val(Operand1.Text) + Val(Operand2.Text)
End Sub
Bogdan Ptru Programarea calculatoarelor electronice
88
Acum nu ne rmne dect s realizm si celelalte trei subrutine asemntoare, pentru ButonMinus,
ButonOri si ButonSupra:
Private Sub ButonMinus_Click()
Rezultat.Text = Val(Operand1.Text) - Val(Operand2.Text)
End Sub
Private Sub ButonOri_Click()
Rezultat.Text = Val(Operand1.Text) * Val(Operand2.Text)
End Sub
Private Sub ButonSupra_Click()
Rezultat.Text = Val(Operand1.Text) / Val(Operand2.Text)
End Sub
IndiIerent cum ai notat Caption-urile de pe cele dou butoane pentru nmulire si mprire, cnd va
trebui s scriei codul vei Iolosi * pentru nmulire si / pentru mprire.
Totul pare acum OK, dar ncearc s mpari un numr oarecare la 0! Vei obine un mesaj de eroare,
apoi apas pe End (si nu pe Debug!). E normal, deoarece nu are sens mprirea la zero. Asadar,
trebuie s testm dac nu cumva se ncearc o mprire la zero, iar dac mpritorul ar Ii 0 s nu se
mai realitzeze mprirea, ci s aIism un mesaj de eroare, ntr-o caset de mesaj.
Asadar, subrutina corect pentru butonul de mprire ar putea Ii urmtoarea:
Private Sub ButonSupra_Click()
If Val(Operand2.Text) = 0 Then
MsgBox "Nu se poate imparti la 0!", vbCritical, "Eroare"
Else
Rezultat.Text = Val(Operand1.Text) / Val(Operand2.Text)
End If
End Sub
sau, echivalent:
Private Sub ButonSupra_Click()
If Val(Operand2.Text) <> 0 Then
Rezultat.Text = Val(Operand1.Text) / Val(Operand2.Text)
Else
MsgBox "Nu se poate imparti la 0!", vbCritical, "Eroare"
End If
End Sub
Bogdan Ptru Programarea calculatoarelor electronice
89
Acum programul nu se va bloca la mprirea la zero:
8.5. Butoane de opiune yi cadre
S ncepem un nou proiect, n care vom amplasa patru butoane de opiune (Option Button):
Option1, Option2, Option3 si Option4, ale cror Caption-uri vor Ii respectiv Ieminin, masculin,
neIumator si Iumator. Dac amplasai cele patru butoane de opiune n cadrul Iormei, vei observa,
la rularea programului, c nu putei alege dou din ele simultan, cum ar Ii Ieminin si neIumtor, dar
ar Ii normal s se poat asa ceva.
Atunci stergei cele patru opiuni si desenai dou cadre (Erame), n care vei grupa cte dou
opiunile, iar cadrelor le vei pune Caption-urile "Sex" si respectiv "Eumator?", ca n Iigura
urmtoare. Mai mult, alegei valoarea True pentru proprietatea Value a lui Option1 si a lui Option3,
deci pentru "Ieminin" si "neIumator". De data aceasta, vom putea alege, de exemplu, o Iemeie
Bogdan Ptru Programarea calculatoarelor electronice
90
neIumtoare.. Mai adaug si un buton de comand Command1 si o caset de text Text1, ca n Iigura
urmtoare:
Ne propunem n continuare s scriem subrutina care atunci cnd executm click pe butonul
Command1 (cu Caption"Cel Iel de om esti?") s primim rspunsul corespunztor n caseta de texte
Text1. De exemplu, pentru situaia din Iigura anterioar ar trebui s obinem "Esti o Iemeie
neIumatoare.".
Nu este greu, dac Iolosim dou instruciuni IE imbricate (una ntr-alta). De remarcat c primul
ELSE va corespunde ultimului IE s.a.m.d.! Pentru a reIeri proprietatea Value pentru opiunile
Option1, Option2 s.c.l, vom scrie Option1.Value, Option2.Value etc. Acestea pot avea valori
boolene, deci pot Ii True (adevrat) sau Ealse (Ials). Discuia celor patru cazuri se va Iace mai nti
dup sex, iar apoi dup Iaptul dac persoana respectiv Iumeaz sau nu.
Private Sub Command1_Click()
If Option1.Value = True Then ' este femeie
If Option3.Value = False Then
Text1.Text = "Esti o femeie nefumatoare."
Else
Text1.Text = "Esti o femeie fumatoare."
End If
Else 'este barbat
If Option3.Value = False Then
Text1.Text = "Esti un barbat nefumator."
Else
Text1.Text = "Esti un barbat fumator."
End If
End If
End Sub
Comentariile sunt scrise cu apostroI n Ia si ele sunt ignorate de VB; au doar rolul de a ne Iace pe
noi s urmrim mai bine programul pe care l-am scris.
Iat un exemplu din timpul Iuncionrii acestui program:
Text1
Command1
Option1
Option2
Option3
Option4
Bogdan Ptru Programarea calculatoarelor electronice
91
8.6. Casete de validare
Urmtorul proiect ne va spune ce pasiuni avem, dup ce noi le vom selecta (biIa) dintr-un sir de
patru pasiuni disponibile: literatura, muzica, sportul si excursiile. Acestea vor Ii reprezentate de
patru casete de validare (Check Box), pe care le vom amplasa pe Iorma noastr si se vor numi
Check1, Check2, Check3, respectiv Check4.
S le pstrm denumirile originale si s le stabilim valorile pentru proprietile Caption ca Iiind:
literatura, muzica, sportul si, respectiv, excursiile. Completeaz Iorma cu un buton de comand
(Command1, avnd Caption-ul "Ce pasiuni ai?"), precum si cu o caset de text Text1, Ir text n
interiorul ei (Text""). Caut proprietatea MultiLine pentru caseta de text Text1 si stabileste-i
valoarea la True, astIel nct textul va aprea acolo pe mai multe linii (dac va Ii cazul).
Cnd vei porni programul, vei constata c poi alege 0, 1, 2, 3 sau chiar toate cele patru pasiuni,
ceea ce nu se putea n cazul butoanelor de opiune. O alt deosebire ntre casetele de validare
(CheckBox) si butoanele de opiune (OptionButton) este c acestea din urm aveau Value de tip
Bogdan Ptru Programarea calculatoarelor electronice
92
Boolean (cu Ealse si True), pe cnd casetele de validare au Value de tip Integer, cu una din valorile
0 nemarcat, 1 marcat, 2 gri, inactiv. Asadar, dac vrem s spunem, de exemplu, c am marcat
(biIat) caseta de validare Check1, vom scrie Check1.Value1.
Vrem ca la apsarea butonului de comand s ne apar n caseta Text1 un text de Iorma: "Pasiunile
tale sunt literatura, sportul,". Sunt prea multe posibiliti de a selecta sau nu cele patru pasiuni (mai
precis sunt 16 variante), ca s Iacem o discuie cu IE-THEN-ELSE, asa c vom Iolosi patru IE-uri
(Ir ELSE), pentru a vedea dac Iiecare din cele patru casete de validare este biIat sau nu. Daca
este, atunci Caption-ul ei va Ii lipit unui sir de caractere T, iniial vid.
Subrutina va Ii:
Private Sub Command1_Click()
T = ""
If Check1.Value = 1 Then T = T + Check1.Caption + ", "
If Check2.Value = 1 Then T = T + Check2.Caption + ", "
If Check3.Value = 1 Then T = T + Check3.Caption + ", "
If Check4.Value = 1 Then T = T + Check4.Caption + ", "
Text1.Text = "Pasiunile tale sunt " + T
End Sub
8.7. Vector de controale
Programul anterior are un mic dezavantaj evident: apar patru instruciuni Ioarte asemntoare scrise
una sub alta, iar dac am avea 20 de pasiuni Check1... Check20, ar trebui s scriem practic o
instruciune de 20 de ori, cu mici modiIicri de numere de la un rnd la altul. Mai Iiresc ar Ii s
putem vorbi despre un vector de 4 sau 20 asemenea casete de validare, n loc de 4 sau 20 de casete
de validare distincte. Un vector grupeaz date de acelasi Iel, iar Visual Basic ne permite s grupm
chiar si controale de acelasi Iel (n principiu numerotarea indicilor se Iace de la zero si se pstreaz
n proprietatea Index a Iiecrui control din vector, n parte). Cel mai simplu mod de a crea un vector
de controale este urmtorul:
S amplasm primul control si-i dm numele pe care vrem s-l aib vectorul;
Bogdan Ptru Programarea calculatoarelor electronice
93
S selectm controlul si l copiem n Clipboard (Edit-~Copy)
S apoi readucem copia sa din Clipboard prin lipire (Edit-~Paste) si rspundem aIirmativ la
ntrebarea dac vrem s crem un vector de controale.
n cazul nostru, vom amplasa prima caset de validare, o vom numi Check, iar apoi cu o comand
Copy si 3 comenzi Paste vom crea restul elementelor din vector. Prima component a vectorului va
Ii caseta Check(0) (are Index0), iar celelalte Check(1), Check(2) si Check(3). La componenta
Check(1) vom Ii ntrebai asa si vom rspunde prin Yes:
Acum putem s adugm si celelalte controale (butonul Command1 si caseta Text1), iar codul
butonului, pentru evenimentul Click, va Ii urmtorul, mult mai elegant:
Private Sub Command1_Click()
T = ""
For i = 0 To 3
If Check(i).Value = 1 Then T = T + Check(i).Caption + ", "
Next i
Text1.Text = "Pasiunile tale sunt " + T
End Sub
8.8. Liste yi proprieti vectori
Listele (simple) (ListBox), ca si casetele combinate (ComboBox) au att proprieti de tipul celor cu
care ne-am obisnuit deja, avnd tipuri de date elementare, ct si proprieti de tip vectori. Vom
discuta despre acestea mai trziu, cnd vom prezenta un exemplu mai complex.
Check(0)
Check(3)
Check(1)
Command1
Text1
Check(2)
Bogdan Ptru Programarea calculatoarelor electronice
94
Deocamdat te rog s amplasezi n Iorma ta o list simpl si s scrii mai multe elemente n ea,
Iiecare pe un singur rnd. Aceste elemente vor Ii niste denumiri de Iructe si vor Ii scrise n
proprietatea List, separate de CtrlEnter. La Iinal, vei apsa Enter.
Noi am scris urmtoarele valori: mere, pere, portocale, caise, ananas, visine,. cirese, prune, gutui,
zmeura, capsuni, piersici, dar lista ne aIiseaz doar primele care ncap si automat creeaz o bar de
derulare, pentru a permite vizualizarea si celorlalte elemente (itemi) din list, n timpul rulrii
programului:
Observ c Iructele apare n ordinea n care au Iost introduse de noi, dar poate vrei ca ele s apar n
ordine alIabetic. Pentru asta va trebui s modiIici proprietatea Sorted a listei, din valoarea Ealse n
valoarea True. Eructele vor aprea ordonate alIabetic (cresctor) n timpul rulrii programului. De
asemenea, dac vrei s poi alege mai multe Iructe simultan, va trebui s schimbi valoarea
proprietii MultiSelect, de la 0 la 1 sau 2.
n continuare s Iacem un mic program care, la acionarea listei prin click (mai precis a unui
element din ea, selectat sau nu), s ni se aIiseze ntr-o caset de text Text1 acel element. Trebuie s-
i spun c exist proprietatea Text pe care o au listele si care pstreaz ntotdeauna ultimul element
din list pe care s-a Icut click. AstIel, dac MultiSelect0, atunci acesta este elementul selectat, dar
pentru MultiSelect1 sau MultiSelect2, va Ii doar ultimul element pe care s-a executat Click, ce
poate Ii selectat sau deselectat napoi.
Bogdan Ptru Programarea calculatoarelor electronice
95
Iat programul:
Private Sub Fructe_Click()
Text1.Text = Fructe.Text
End Sub
n continuare micsoreaz puin caseta de texte Text1, apoi amplaseaz ntre list si Text1 un buton
de comand Command1, asa cum se vede n Iigura de mai jos.
Sterge codul subrutinei List1Click, apoi ataseaz butonului Command1 si evenimentului Click
urmtoarea subrutin:
Private Sub Command1_Click()
n = 0
For i = 0 To Fructe.ListCount - 1
If Fructe.Selected(i) = True Then
n = n + 1
End If
Next i
Text1.Text = n
End Sub
EIectul va Ii urmtorul: vei selecta mai multe Iructe din list, iar cnd vei apsa pe buton, numrul
lor va aprea n caseta de text Text1.
Acesta este ultimul
element pe care s-a
executat Click cu
mouse-ul.
Caseta de text
Text1
Lista Eructe
Bogdan Ptru Programarea calculatoarelor electronice
96
Hai s-i explic cum Iuncioneaz aceast subrutin. n primul rnd, trebuie s stii c numrul de
elemente dintr-o list (de exemplu din lista Eructe) se stocheaz n proprietatea ListCount. Aceast
proprietate nu poate Ii accesat n Iaza proiectrii, din tabelul de proprieti, dar poate Ii Iolosit de
programator n cod. Elementele listei se pstreaz n proprietatea List, care este o proprietate de tip
vector (de siruri de caractere) si sunt numerotate ncepnd de la 0. Asadar, primul Iruct din lista
noastr va Ii Eructe.List(0), al doilea Eructe.List(1), al treilea Eructe.List(2) s.a.m.d, iar cum
numrul lor este Eructe.ListCount, ultimul va Ii Eructe.List(Eructe.ListCount-1).
Similar proprietii List este si proprietatea Selected, care este tot un vector, de valori logice
(boolene), Eructe.Selected(i) True nsemnnd c Iructul (elementul) respectiv este selectat, iar
Eructe.Selected(i) Ealse nsemnnd c nu. Subrutina anterioar parcurge cu instruciunea EOR
lista Eructe si, de Iiecare dat cnd gseste un element selectat, creste cu o unitate variabila n (iniial
aceasta Iiind 0), iar la Iinal depune valoarea n n caseta de text Text1, n reprezentnd acum cte
elemente s-au selectat.
8.9. Metode pentru liste
Asa cum ai observat mai nainte, listele au tot Ielul de proprieti, Iie c ele sunt simple sau
structurate (vectori). Dar att listele, ct si alte obiecte mai simple sau mai complexe mai au si
metode. Acestea sunt niste aciuni (proceduri) atasate obiectelor respective, de exemplu metoda
Clear a unei liste va elimina din list toate elementele sale (o va "cura"). AstIel, dac vrem ca ca
n lista de Iructe s nu mai Iie nici un Iruct, atunci va trebui s scriem Eructe.Clear, care este un
apelul metodei Clear pentru lista Eructe.
De asemenea, dac amplasm o caset de text Text2 si vrem ca s Iie adugat elementul din ea, la
click pe un buton Command2, va trebui s scriem subrutina:
Private Sub Command2_Click()
Fructe.AddItem Text2.Text
End Sub
Bogdan Ptru Programarea calculatoarelor electronice
97
S amplasm n Iorma noastr aceste controale (Command2, Text2), precum si nc o list, numit
Salata, si un nou buton de comand numit Command3, ca n Iigura de mai jos.
Vrem ca la acionarea butonului Command3, toate elementele care au Iost selectate n lista Eructe s
Iie trecute n lista Salata.
Iat codul acestei subrutine:
Private Sub Command3_Click()
Salata.Clear
For i = 0 To Fructe.ListCount - 1
If Fructe.Selected(i) = True Then
Salata.AddItem Fructe.List(i)
End If
Next i
End Sub
Ea Iuncioneaz astIel: se parcurge lista Eructe si Iiecare element i care este selectat
(Eructe.Selected(i) True) se adaug listei Salata (prin Salata.AddItem Eructe.List(i)).
Iat si rezultatul:
caseta de text
Text2
noua list
Salata
lista Eructe
Text1
Command1
Command3
Command2
Bogdan Ptru Programarea calculatoarelor electronice
98
8.10. Un joc cu imagini yi cronometre
n continuare ne propunem s realizm un joc simplu, n care trebuie s omorm, prin click de
mouse, niste muste care apar n cinci zone ale Iormei noastre (n cele patru coluri si n centru).
Mustele apar la un anumit interval de timp, iar dac nu le "strivim", vor disprea dup acelasi
interval de timp. Dac, ns, vom executa click pe ele, ct timp stau vii pe ecran, le vom omor,
vom cstiga un punct si apoi vor disprea.
Pentru a implementa un asemenea joc, avem nevoie de urmtoarele noi controale: imagini (Image),
pentru a reprezenta mustele, si cronometre (Timer) pentru a ine evidena intervalelor de timp si a
apariiei/dispariiei mustelor). De Iapt, chiar dac juctorul va avea impresia c apar mai multe
muste, noi vom Iolosi cinci controale de tip Image, n care vom avea Iie imaginea unei muste vii, Iie
a unei muste moarte, Iie nimic, cu sensul c n zona respectiv nu a aprut n acel moment nici o
musc. De asemenea, vom Iolosi proprietatea Tag pentru a stoca starea mustelor: 0 lips, 1 vie,
2 moart. Proprietatea Tag este comun tuturor controalelor si este Iolosit pentru a stoca o
inIormaie suplimentar asociat respectivului control.
Vom Iolosi dou Iisiere cu imagini, numite "muscav.jpg" pentru musca vie, respectiv "muscam.jpg"
pentru cea moart. Un control de tip Image are o proprietate Picture n care se stocheaz imaginea
propriu-zis. Acolo trebuie ncrcat imaginea dintr-un Iisier, Iolosind Iuncia LoadPicture. AstIel,
dac avem o musc de indice Index, vom scrie astIel: Musca(Index).Picture
LoadPicture(App.Path"\muscav.jpg") pentru a ncrca imaginea cu musca vie n Musca(Index).
App.Path semniIic calea aplicaiei noastre, adic directorul n care am salvat proiectul nostru
Visual Basic.
S ncepem proiectarea interIeei jocului nostru: mai nti amplasm o imagine n centrul ecranului,
pe care o denumim Musca. Controlul de tip Image, respectiv cronometru arat astIel:
Apoi, asa cum am multiplicat casetele de text dintr-o seciune anterioar, vom multiplica imaginea
noastr, Iolosind Copy si Paste, Iormnd un vector de imagini, celelalte patru componente ale
vectorului Iiind amplasate n colurile Iormei. AstIel, prima imagine va avea Index-ul 0, iar celelalte
Musca(0) Image
Musca(1) Image
Musca(2) Image
Musca(4) Image
Musca(3) Image
Bogdan Ptru Programarea calculatoarelor electronice
99
patru vor avea Index-ul 1, 2, 3 si respectiv 4, asa ca n imaginea de mai jos:
Apoi vom amplasa un cronometru n dreptul imaginii din centru, l vom denumi Crono si, cu Copy
si Paste l vom multiplica de 4 ori, crend un vector. Iat rezultatul:
Aceste cronometre sunt un exemplu de controale "invizibile", n sensul c ele Iuncioneaz Ir ca
s ni se nIiseze n vreun Iel anume, de aceea poziia lor nici nu conteaz. Ele vor "disprea"
imediat ce vom porni programul.
Cronometrele au o singur proprietate important numit Interval. Este intervalul de timp dup care
intr n aciune. Dup Iiecare Interval milisecunde apare evenimentul Timer asupra cronometrulului
si noi trebuie s spunem ce vrem ca s se ntmple la Iiecare astIel de "tic" al cronometrului. Eireste,
dac musca asociat nu este pe ecran, atunci ea va aprea vie, iar dac este (vie sau moart) va
disprea.
O alt subrutin pe care va trebui s o realizm este asociat mustelor si evenimentului Click, prin
care noi ncercm s omorm mustele. Dac Iacem click pe o musc vie, atunci o omorm, iar dac
musca nu este Iacem click degeaba. Tot degeaba Iacem click si pe o imagine cu o musc moart,
deoarece nu putem omor o musc de dou ori.
Vorbim de muste vii si moarte, dar vom avea nevoie de cele dou Iisiere n care s le pstrm
imaginile lor. Ori le desenm noi, ori Iace rost de ele ntr-un Iel sau altul, sau de imagini similare.
Iat imaginile Iolosite de mine:
muscav.jpg
muscam.jpg
Crono(1)
Crono(2)
Crono(4)
Crono(0)
Crono(3)
Bogdan Ptru Programarea calculatoarelor electronice
100
Acum e momentul s scriem codul aplicaiei noastre. n primul rnd trebuie s scriem subrutina
EormLoad, care este lansat n execuie la pornirea aplicaiei, adic la ncrcarea Iormei. Aici vom
Iace iniializrile necesare. La nceput nu este nici o musc pe ecran, iar cronometrele vor avea
anumite valori pentru intervale.
Private Sub Crono_Timer(Index As Integer)
If Musca(Index).Tag = 0 Then 'musca nu este
Musca(Index).Tag = 1 'musca va aparea vie
' incarcam si imaginea din fisierul muscav.jpg
' din calea curenta a aplicatiei
Musca(Index).Picture = LoadPicture(App.Path + "\muscav.jpg")
Else
Musca(Index).Tag = 0
Musca(Index).Picture = LoadPicture() 'sterge musca
End If
End Sub
n continuare vom scrie subrutina asociat trecerii intervalului de timp pentru un cronometru. Desi
sunt cinci cronometre, vom scrie doar o singur subrutin, care va avea ca argument indicele
cronometrului. n aceast subrutin trebuie s descriem Iaptul c dac musca respectiv nu este pe
ecran, atunci ea s apar pe ecran vie, iar dac este pe ecran (vie sau moart) s dispar.
Private Sub Form_Load()
Crono(0).Interval = 1200
Crono(1).Interval = 1500
Crono(2).Interval = 2000
Crono(3).Interval = 1800
Crono(4).Interval = 1300
For i = 0 To 4
Musca(i).Tag = 0
Next i
' facem fundalul alb pentru forma
Form1.BackColor = RGB(255, 255, 255)
End Sub
Ultima subrutin va descrie ce se ntmpl cnd se execut click pe o musc. Dac este vie va Ii
omort, iar dac e deja moart sau nu, nu se va ntmpla nimic. Dac vrem ca s existe un punctaj
care s creasc la Iiecare musc omort, atunci va trebui s declarm ca Iiind global variabila
punctaj. La (General)(Declarations) vom scrie:
Dim punctaj as Integer.
Restul modiIicrilor le vei Iace tu! Ar Ii bine ca, periodic, punctajul s Iie reprezentat ntr-o
etichet, iar durata jocului s Iie controlat de un alt cronometru.
Private Sub Musca_Click(Index As Integer)
If Musca(Index).Tag = 1 Then
Musca(Index).Tag = 2
Musca(Index).Picture = LoadPicture(App.Path + "\muscam.jpg")
End If
End Sub
Un asemenea joc este prezentat n cartea mea "Aplicaii n Visual Basic", aprut la Editura Teora,
Bucuresti, 1998-2003.
Bogdan Ptru Programarea calculatoarelor electronice
101
8.11. Tabele
Un control Ioarte util n dezvoltarea multor aplicaii este MicrosoIt Elex Grid. Acest control nu
poate Ii gsit de la bun nceput n bara de instrumente din partea stng a mediului Visual Basic. El
trebuie adugat n Ielul urmtor: din meniul VB alegi opiunea Project, apoi Components... si vei
obine o list de alte componente ce pot Ii adugate la Toolbox, pentru proiectul tu. Alege din list
MicrosoIt Elex Grid si biIeaz n dreptul acestei componente, apoi apas pe butonul OK. n
Toolbox va aprea simbolul controlului acesta:
Apoi vei putea amplasa un tabel (care iniial va Ii denumit MSElexGrid1, dar noi l vom redenumi
T, de la tabel). Iniial are dou rnduri si dou coloane, dar putem modiIica proprietile Rows si
Cols pentru a modiIica numrul de rnduri, respectiv de coloane. Te rog s alegi valoarea 10 pentru
Rows si 5 pentru Cols. De Iapt, rndurile sunt numerotate ncepnd cu 0 si pn la T.Rows-1, iar
coloanele de la 0 la T.Cols-1. Observi c primul rnd si prima coloan sunt gri. Ele sunt, de Iapt,
Iixe, inaccesibile evenimentelor Click sau KeyPress. Si numrul de rnduri, respectiv coloane Iixe
se poate schimba, cu ajutorul proprietilor EixedRows si EixedCols.
Bogdan Ptru Programarea calculatoarelor electronice
102
Proprieti Ioarte importante sunt Row rndul curent, Col coloana curent si Text textul din
celula curent. Dac vrem s punem n celula (csua) de pe rndul 2 si coloana 3 inIormaia (textul)
"ABC" vom scrie urmtoarea secven de trei atribuiri:
T.Row = 2
T.Col = 3
T.Text = "ABC"
O alt modalitate mult mai simpl va Iolosi proprietatea TextMatrix, care este o matrice a tuturor
textelor din tabel. AstIel, acelasi lucru se poate scrie mai simplu:
T.TextMatrix(2,3)="ABC".
Vei observa c toate rndurile au aceeasi nlime si toate coloanele au aceeasi lime. Cu
RowHeight si ColWidth poi s modiIici valorile, aceste proprieti Iiind vectori. De exemplu, prin
atribuirea T.ColWidth(0) T.ColWidth(0) / 2 vom njumti grosimea primei coloane.
Proprietatea AllowUserResizing are diIerite valori ce permit utilizatorului s redimensioneze
rndurile/coloanele tabelului.
n continuare vom prezenta o mic subrutin care apeleaz la evenimentul KeyPress pentru a scrie
n celulele tabelului T. Apoi vom Iolosi aceast subrutin n cadrul unui program care va calcula
mediile unor studeni, a cror nume apar n coloana 1, iar notele la teorie si la practic n coloanele
2 si 3.
Private Sub T_KeyPress(KeyAscii As Integer)
If (KeyAscii = 8) And (T.Text <> "") Then
L = Len(T.Text)
T.Text = Left(T.Text, L - 1)
Else
If KeyAscii >= 32 Then
T.Text = T.Text + Chr$(KeyAscii)
End If
End If
End Sub
Bogdan Ptru Programarea calculatoarelor electronice
103
Private Sub Command1_Click()
For i = 1 To T.Rows - 1
If T.TextMatrix(i, 1) <> "" Then
x = Val(T.TextMatrix(i, 2))
y = Val(T.TextMatrix(i, 3))
T.TextMatrix(i, 4) = (x + y) / 2
End If
Next i
End Sub
Private Sub Form_Load()
T.ColWidth(0) = T.ColWidth(0) / 2
T.ColWidth(1) = T.ColWidth(1) * 2
For i = 1 To T.Rows - 1
T.TextMatrix(i, 0) = i
Next i
T.TextMatrix(0, 0) = "Nr.crt"
T.TextMatrix(0, 1) = "Numele si prenumele"
T.TextMatrix(0, 2) = "Nota t."
T.TextMatrix(0, 3) = "Nota p."
T.TextMatrix(0, 4) = "Media"
End Sub
Private Sub T_KeyPress(KeyAscii As Integer)
If (KeyAscii = 8) And (T.Text <> "") Then
L = Len(T.Text)
T.Text = Left(T.Text, L - 1)
Else
If KeyAscii >= 32 Then
T.Text = T.Text + Chr$(KeyAscii)
End If
End If
End Sub
Bogdan Ptru Programarea calculatoarelor electronice
104
8.12. Grafice
Ar Ii interesant s putem reprezenta graIic notele si mediile acestor studeni. Pentru aceasta vom
Iolosi un alt control, pe care l adugm n aceeasi manier ca si pe ElexGrid. Se numeste MicrosoIt
Chart Control si are proprieti asemntoare controlului Ms Elex Grid, numai c, n loc de Col
apare Column, n loc de Cols apare ColumnCount, n loc de Rows apare RowCount si n loc de Text
apare Data. Eireste mai apar si alte proprieti, dar te las s le descoperi singur.
Amplaseaz un control Ms Chart n Iorma ta, alturi de tabelul T, alegnd pentru acesta
Columns3, Rows9. Denumeste graIicul G si modiIic la True valoarea proprietii RandomEill.
Apoi amplaseaz butonul Command2 si asociaz-i codul de mai jos, care va reprezenta graIic datele
din tabelul T. Din pcate Ms Chart nu are o proprietate de genul lui TextMatrix, asa c va trebui s
lucrm cu Row, Column si Data. Dup ce scrii subrutina de mai jos, adaug la subrutina
EormLoad linia:
Command2_Click.
Private Sub Command2_Click()
For i = 1 To T.Rows - 1
For j = 2 To 4
G.Row = i
G.Column = j - 1
G.Data = Val(T.TextMatrix(i, j))
Next j
Next i
End Sub
Bogdan Ptru Programarea calculatoarelor electronice
105
8.13. Fiyiere text - s salvm yi s restaurm datele
Cu Open cale nume fiier Eor Output as #numr putem crea/deschide pentru scriere un Iisier text
cu numele si calea precizate, asociindu-i numrul 1. Orice reIerire la acest Iisier se va Iace prin
intermediul numrului 1. Pentru ca s operm simultan cu un al doilea Iisier, va trebui s Iolosim un
alt numr ntreg.
Pentru a aduga la datele existente altele, va trebui ca Iisierul text s se deschid prin:
Open cale nume fiier Eor Append as #numr.
Pentru a deschide Iisierul n vederea citirii de date din el se Ioloseste:
Open cale nume fiier Eor Input as #numr.
nchiderea unui Iisier deschis pentru citire/scriere/adugare se Iace prin Close #numr.
Scrierea de date se Iace cu Print #numr, expresiiledescris, iar citirea cu Input #numr,
variabileledecitit (pentru numere) sau cu Line Input #numr, variabileledecitit (pentru siruri de
caractere).
Completnd programul nostru cu cele dou butoane (Command3, Command4), ca n Iigura de mai
sus, si scriind subrutinele de mai jos vom putea salva si restaura datele salvate din Iisierul text
TABEL.TXT:
Bogdan Ptru Programarea calculatoarelor electronice
106
Private Sub Command3_Click()
' salvarea datelor
Open App.Path + "\tabel.txt" For Output As #1
For i = 0 To T.Rows - 1
For j = 0 To T.Cols - 1
Print #1, T.TextMatrix(i, j)
Next j
Next i
Close #1
End Sub
Private Sub Command4_Click()
' incarcarea datelor
Open App.Path + "\tabel.txt" For Input As #1
For i = 0 To T.Rows - 1
For j = 0 To T.Cols - 1
Line Input #1, s
T.TextMatrix(i, j) = s
Next j
Next i
Close #1
End Sub
8.14. Ordonarea datelor din tabel
n sIrsit, s adugm aplicaiei noastre nc dou butoane, unul pentru a ordona elevii alIabetic
(crector dup nume), iar unul pentru ordonarea descresctoare dup medii a elevilor. Ambele
subrutinte vor Iolosi metoda de ordonare prin selecie direct. Detalii despre metodele de sortare pot
Ii gsite n cursul meu de Programarea calculatoarelor electronice.
Bogdan Ptru Programarea calculatoarelor electronice
107
Private Sub Command5_Click()
For i = 1 To T.Rows - 2
For j = i + 1 To T.Rows - 1
If T.TextMatrix(i, 1) > T.TextMatrix(j, 1) Then
For k = 1 To 4
aux = T.TextMatrix(i, k)
T.TextMatrix(i, k) = T.TextMatrix(j, k)
T.TextMatrix(j, k) = aux
Next k
End If
Next j
Next i
End Sub
Private Sub Command6_Click()
For i = 1 To T.Rows - 2
For j = i + 1 To T.Rows - 1
If T.TextMatrix(i, 4) < T.TextMatrix(j, 4) Then
For k = 1 To 4
aux = T.TextMatrix(i, k)
T.TextMatrix(i, k) = T.TextMatrix(j, k)
T.TextMatrix(j, k) = aux
Next k
End If
Next j
Next i
End Sub
Bogdan Ptru Programarea calculatoarelor electronice
108
Programul poate Ii mbuntit n mai multe moduri: pentru a permite un numr variabil de elevi,
pentru a cere utilizatorului numele Iisierului n care s se salveze datele sau de unde s se restaureze
datele si multe altele.
Bogdan Ptru Programarea calculatoarelor electronice
109
Anexa 1
Teme pentru proiecte
Tema sau denumirea proiectului
Numr de
persoane din
echip (orientativ)
1. Venitur si cheltuieli 1
2. Stat de plat 2
3. Balan contabil 3
4. Calcule statistice 1
5. Evoluia cursurilor valutare 1
6. Contul de proIit si pierdere 1
7. Jocuri de animaie 2
8. Jocuri logice 2
9. Gestiunea clienilor 2
10. Agend electronic 2
11. Program de marketing 1
12. Program complex de contabilitate 4
13. Gestiunea stocurilor 2
14. Rambursarea unui mprumut 1
15. Amortizare (liniar, degresiv, accelerat) 1
Bogdan Ptru Programarea calculatoarelor electronice
110
Anexa 2
Subiecte pentru examen
1. Subiecte tip test gril (pentru proba scris)
Din lista de ntrebri se aleg 9 subiecte pentru a Iorma ntrebrile pentru un numr. Eiecare ntrebare
aleas are 0, 1, 2 sau mai multe rspunsuri corecte. Eiecare ntrebare este notat cu 1 punct, din
oIiciu acordndu-se 1 punct.
1. Ce va afisa urmatoarea secventa de program?
x=2
y=3
If x>=y Then
z=x
x=y
y=z
Else
z=x+1
x=y
y=z-1
End if
MsgBox Str(x)+Str(y)
a)secventa este gresita h)str(3)+str(2) o)2,3
b)calculatorul se va bloca I)va afisa 2, apoi se va bloca p)3,2
c)nu va afisa nimic j)va afisa 3, apoi se va bloca r)33
d)cel mai mic numar dintre x si y k)23 s)33
e)str(2)=str(3) l)23 t)3,3
f)str(2)+str(2) m)32 u)3,3
g)str(3)+str(3) n)32 v)5,5
2. Care din urmatoareIe subrutine va reaIiza copierea textuIui din caseta a doua in prima caseta Ia
apasarea butonuIui?
Text1 Text2
Command1
a) Sub Command1_Click(KeyAscii As Integer)
If KeyAscii=13 Then
Text1.Text=Text2.Text
End If
End Sub
b) Sub Command1_click()
x=Text2.Text
y=Text1.Text
x=y
End Sub
g) Sub Command1_Click()
Text2.Text=Text1.Text
End Sub
h) Sub Copiere_Click()
Text1.Text=Text2.Text
End Sub
i) Sub Copiere_Click()
Text2.Text=Text1.Text
End Sub
Copiere
Bogdan Ptru Programarea calculatoarelor electronice
111
c) Sub Command1_Click()
x=Text2.Text
y=Text1.Text
End Sub
d) Sub Command1__KeyPress(KeyAscii As Integer)
If KeyAscii=13 Then
Text1.Text=Text2.Text
End If
End Sub
e) Sub Command1_Click()
If KeyPress Then
x=Text2.Text
Text1.Text=x
End If
End Sub
f) Sub Command1_Click()
Text1.Text=Text2.Text
x=Text1.Text
Text2.Text=x
End Sub
j) Sub Copiere_Click()
x=Text2.Text
Text1.Text=x
Text2.Text=Text1.Text
End Sub
k) Sub Command1_Click()
Text1.Text=Text2.Text
End Sub
3. Care din urmatoareIe subrutine va caIcuIa suma S=1
2
+2
2
+3
2
+...+n
2
(unde n este vaIoarea scrisa in prima caseta) si o va scrie in caseta a doua atunci cand se va apasa
pe buton?
n Text2
a) Sub Command1_Click()
N=Val(x.Text)
S=0
For i=1 To N
S=S+i*i
Next I
Text2.Text=Str(S)
End Sub
b) Sub Buton_Click()
S=0
For i=1 To N
S=S+i*i
Next i
Text2.Text=Str(S)
End Sub
c) Sub Buton_Click()
S=0
i=1
While i<=N
S=S+i*i
i=i+1
Wend
Text2.Text=Str(S)
End Sub
d) Sub Buton_Click()
S=0
P=Val(x.Text)
i=N
While i>=1
S=i*i+S
i=i-1
WEnd
Text2.Text=Str(S)
End Sub
e) Sub Calcul_Click()
P=Val(x.Text)
S=0
i=0
Do
i=i+1
S=i*i+S
Loop Until i=P
Text2.Text=Str(S)
End Sub
Calcul
Bogdan Ptru Programarea calculatoarelor electronice
112
f) Sub Buton_Click()
S=o
i=Val(x.Text)
Do
S=i*i+S
i=i-1
Loop Until i=-1
Text2.Text=Str(S)
End Sub
g) nici una din variante nu e corecta
4.Ce actiune reaIizeaza fiecare din urmatoareIe secvente de program? (Iegai secveneIe de
rspunsuriIe corespunztoare)
Text1 Text2
a)x=Text1.Text a')goleste casetele de text
Text1.Text=Text2.Text b')copiaza continutul lui Text2 in Text1
Text2.Text=x c')copiaza continutul lui Text1 in Text2
d')interschimba continuturile celor doua casete de text
b)x=Text1.Text
Text2.Text=x
x=Text2.Text
c)Text1.Text=x
x=Text2.Text
Text2.Text=Text1.Text
5.Care din urmatoareIe subrutine reaIizeaza aceIasi Iucru cu subrutina:
List1
Sub Command1_Click() Text1
List1.AddItem Text1.Text
End Sub
Command1
a)Sub List1_Click()
Text1.Text=List1.Text
End Sub
b)Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii=13 Then
List1.AddItem Text1.Text
End If
End Sub
c)Sub Command1_Click()
List1.Text=Text1.Text
End Sub
d)Sub List1_Click()
List1.AddItem Text1.Text
End Sub
e)Sub Command1_Click()
S=Text1.Text
List1.AddItem S
End Sub
f)nici una din variantele a-e
Bogdan Ptru Programarea calculatoarelor electronice
113
6.Fie decIaratiiIe:
Dim X(1 To 10) As Integer
Dim I As Integer
Dim ordonat as BooIean
si urmatoarea secventa de program:
ordonat=True
For i=1 To 9
If X(i)>X(i+1) Then
ordonat=FaIse
End If
Next i
Ce reaIizeaza ea?
a)nimic
b)secventa este gresita
c)verifica daca vectorul X este ordonat descrescator
d)verifica daca vectorul X este ordonat crescator
e)ordoneaza crescator vectorul X
f)ordoneaza descrescator vectorul X
7. Fie decIaratiiIe:
Dim X(1 To 10) As Integer
Dim I As Integer
Dim a As Integer
si urmatoarea secventa de program:
For i=1 To 9
For j=j+1 To 10
If X(i)>X(j) Then
a=X(i)
X(i)=X(j)
X(j)=a
End If
Next j
Nexti
Ce reaIizeaza ea?
a)nimic
b)secventa este gresita
c)verifica daca vectorul X este ordonat descrescator
d)verifica daca vectorul X este ordonat crescator
e)ordoneaza crescator vectorul X
f)ordoneaza descrescator vectorul X
8.Fie decIaratiiIe:
Dim X(1 To 10) As Integer
Dim i As Integer
Dim Suma As Integer
Ce reaIizeaza urmatoarea secventa de program?
Suma=0
For i=0 To 10
Suma=Suma+X(i)/10
Next i
a)nimic
b)este gresita
c)calculeaza (in Suma) suma elementelor vectorului X
d)calculeaza (in Suma) media aritmetica a elementelor vectorului X
Bogdan Ptru Programarea calculatoarelor electronice
114
9.Fie decIaratiiIe:
Dim X(1 To 10) As Integer
Dim i As Integer
Dim Suma As Integer
Ce reaIizeaza urmatoarea secventa de program?
Suma=0
For i=1 To 10
If X(i)<0 Then
Suma=Suma-X(i)
End If
Next I
a)
b)
c)calculeaza modulul sumei elementelor negative
d)
10.Care din urmatoareIe secvente de program reaIizeaza interschimbarea vaIoriIor variabiIeIor x si y?
a) a=x b) a=y c) x=a d) x=y e) a=x
x=y y=x a=y a=x y=a
y=a x=a y=x y=a x=y
f)nici una din variantele anterioare
g)asa ceva nu se poate realiza
11.Presupunem ca avem 3 Iiste,
unde L1 si L2 au aceIasi numar
de eIemente.Care din urmatoareIe subrutine vor in L3 eIementeIe minime comparand L1 cu L2, Ia
actionarea butonuIui?
L1 L2 L3 Buton
a)nu se poate realiza acest lucru
b)Sub Minim_Click()
N=L1.ListCount-1
For i=0 To N
If L1.List(i)<L2.List(i) Then
L3.AddItem L1.List(i)
Else
L3.AddItem L2.List(i)
End If
Next i
End Sub
c)Sub Buton_KeyPress
N=L1.ListCount-1
If KeyAscii=13 Then
For i=0 To N
If Val(L1.List(i))<Val(L2.List(i)) Then
L3.AddItem L1.List(i)
Else
L3.AddItem L2.List(i)
End If
Next i
End If
End Sub
d)Sub Buton_Click()
For i=0 To ListCount-1
If L1.List(i)>L2.List(i) Then
L3.AddItem L2.List(i)
Else
L3.AddItem L1.List(i)
End If
Next i
End Sub
Minim
Bogdan Ptru Programarea calculatoarelor electronice
115
e)Sub Buton_Click()
N=L2.ListCount
For i=0 To N
x=L1.List(i-1)
y=L2.List(i-1)
If x<y Then
L3.List(i)=x
Else
L3.List(i)=y
End If
Next i
End Sub
f)Sub Buton_Click()
N=L1.ListCount
i=0
While i<N
x=Val(L1.List(i))
y=Val(L2.List(i))
L3.AddItem x
If x>y Then L3.AddItem
i=i+1
Wend
End Sub
g)Sub Buton_Click()
N=L1.ListCount
i=0
While i<=N-1
x=List1.List(i)
y=List2.List(Ii)
i=i+1
If Val(x)>Val(y) Then
L3.AddItem L1.List(i)
Else
L3.AddItem L2.List(i)
End If
Wend
End Sub
h)Sub Buton_Click()
i=0
Do While i<(L1.ListCount+L2.ListCount)/2
Minim=Val(L1.ListCount(i))
If Val(L2.List(i))<Minim Then
Minim=Val(L2.List(i))
End If
i=i+1
L3.AddItem Minim
Loop
End Sub
i)Sub Buton_Click()
N=L2.ListCount:i=0
Do While i<N
x=L1(i)
y=L2(i)
If Val(x)<Val(y) Then
L3.AddItem x
Else
L3.AddItem y
End If
i=i+1
Loop
End Sub
T
0 1 2 3
0
B
12.Presupunem ca avem un tabeI: 1
Ce reaIizeaza urmatoarea subrutina?
Sub B_CIick() 2
For I To 9
If T.TextMatrix(I,2)<1.19 Then
T.TextMatrix(I,3)=T.TextMatrix(I,1)
End If
Next I
T.TextMatrix(10,I)="TOTAL" 10
End Sub
a)subrutina este gresita
mere
pere
prune
20
20
10
Pret
TVA
Calcul
Bogdan Ptru Programarea calculatoarelor electronice
116
b)nimic
c)face ceva dar nu afecteaza continutul
d)calculeaza pretul cu TVA si-l afiseaza in coloana a treia
e)scrie in coloana a treia numele produselor cu preturi mai mici de 1.19e
f)ca la d) apoi face totalul
g)doar scrie in coloana 10, linia 10, "TOTAL
h)altceva decat variantele a-g
13.Care din urmatoareIe subrutine va schimba continutuI butonuIui A cu ceI aI Iui B atunci cand se
apasa pe C?
Butoane
A B C
a)nu se poate acest lucru
b)Sub C_Click()
D=A.Text
A.Text=B.Text
B.Text=d
End Sub
c)Sub C_Click()
D=A.Caption
D=B.Caption
B.Caption=A.Caption
End Sub
d)Sub C_Click()
D=A.Caption:E=B.Caption
If D<C.Caption Then
A.Caption=E
B.Caption=D
Else
x=A.Caption
A.Caption=E
B.Caption=x
End If
End Sub
e)Sub C_Click()
A.Caption=x
B.Caption=y.Caption
x=B.Caption
End Sub
f)Sub C_Click()
x=A.Caption
y=B.Caption
A.Caption=B.Caption
B.Caption=x
End Sub
g)Sub C_Click()
If KeyPress Then
AUX=A.Caption
A.Caption=B.Caption
B.Caption=AUX
End If
End Sub
h)Sub C_Click()
AUX=C.Caption
C.Caption=A.Caption
A.Caption=B.Caption
B.Caption=C.Caption
C.Caption=AUX
End Sub
14.Care din urmatoareIe subrutine sunt gresite din punct de vedere sintactic?
B
T
a)Sub B_Click()
MsgBox B.Caption
End Sub
b)Sub T_KeyPress(KeyAscii As Integer)
MsgBoxOK
End Sub
c)Sub T_KeyPress(KeyAscii As Integer)
If KeyAscii=13 Then
MsgBoxOK
End If
End Sub
d)Sub B_Click()
If KeyAscii=13 Then
MsgBoxOK
End If
End Sub
e)Sub B_Click()
MsgBoxB.Txet
End Sub
f)Sub B_Click()
MsgBoxB.Text
End Sub
Mesaj
Bogdan Ptru Programarea calculatoarelor electronice
117
15.Fie o forma in care avem o caseta de text A si o caseta de text B. Care din urmatoareIe secvente
de program vor copia in caseta de text A continutuI casetei B?
a) Text1.Text=A
B=Text2.Text A B
b) A.Text=B.Text
c) B.Text=A.Text
d) A.Text=Text1.Text
Text1.Text=B.Text
e) A.Text1=B.Text2
f) Text1.A=Text2.B
16. Avem o forma cu trei casete de text: Text1, Text2 si Text3 si un buton: Command1. Care din
urmatoareIe subrutine determina ceI mai mic numar dintre ceIe doua scrise in Text1 si Text2 si iI
pune in Text3?
a)Sub Text1_KeyPress(KeyAscii As Integer) Text1 Text2
If KeyAscii=13 Then
Text3.Text=Min(Text1.Text,Text2.Text)
End If Command1
End Sub
b)Sub Command1_Click() Text3
x=Val(Text1.Text)
y=Val(Text2.Text)
If x<y Then
Text3.Text=Str(x)
Else
Text3.Text=Str(y)
End If
End Sub
17.Care din urmatoareIe instructiuni va depune in caseta x textuI "examen"?
x
a)Text.Text=examen
b)Text.x=examen
c)examen=x.Text
d)x=examen
e)x.Text=examen
f)Text1.Text=examen
g)x.Text=examen
h)examen.Text
i)Text1.x=examen
j)x.Text1=examen
k)x.Text1=examen
l)x.Text='examen'
18.Cum se copiaza textuI din Text1 in Text2?
Text1 Text2
a)Text1.Text:=Text2.Text
b)x=Text1.Text
Text2.Text=x
c)Text1.Text=Text2.Text
d)x=Text1.Text
Text1.Text=Text2.Text
Text2.Text=x
e)x=Text2.Text
x=Text1.Text
f)Text1.Text=Text2
g)Text2.Text=Text1.Text
Bogdan Ptru Programarea calculatoarelor electronice
118
19.Care din urmatoareIe variante este corecta pentru a adauga continutuI casetei de text in Iista
atunci cand se apasa butonuI "adauga"?
x
Command1
a) Sub Command1_KeyPress(KeyAscii As Integer)
List1.AddItem x.Text
End Sub
b) Sub Command1_Click()
If KeyAscii Then
List1.AddItem x.Text
End If
End Sub
c) Sub Command1_Click()
y=x.Text
List1.Text=y
End Sub
d) Sub Command1_Click()
y=x.Text
z=x.Text
List1.AddItem x.Text
End Sub
e) Sub Adauga_Click()
List1.text=x.text
End Sub
f) Sub Adauga_Click()
List1.AddItem x.Text
End Sub
g) Sub Command1_Click()
List1.AddItem x.Text
End Sub
h) Sub Adauga_Click()
List1.AddItem x.Text
End Sub
i) Sub Command1_Click()
x.Text=List1.AddItem
End Sub
20.Ce reaIizeaza subrutina urmatoare?
Command1 Text1
L1
Sub Command1_CIick()
N=List1.ListCount
Text1.Text=List1.List(0)
For i=1 to N-1
If Text1.Text<List1.List(i) Then
Text1.text=List1.List(i)
End If
Next i
End Sub
a)este gresita;
b)determina suma elementelor negative din lista si o pune in Text1;
c)determina cel mai mic element din lista si il pune in Text1;
d)determina cel mai mare element din lista si il pune in Text1;
e)ordoneaza crescator elementele din L1;
OK
adauga
Bogdan Ptru Programarea calculatoarelor electronice
119
f)ordoneaza descrescator elementele din L1 .
21. Care din urmatoareIe segmente de instructiuni sunt corecte?
a) x=2
y=3
z=x-y
b) x=2
y=3
x-y=z
c) x=2
y=2+3
z+2=x
d) x+y=5
x=2
y=3
22.Care din urmatoareIe subrutine reaIizeaza copierea eIementeIor seIectate din prima Iista in Iista a
II-a Ia apasarea butonuIui?
L1 L2 Buton
a)Sub Buton_Click(KeyAscii As Integer)
If KeyAscii=13 Then
For i= 0 to n-1
List2.AddItem List1.List(i)
Next i
End If
End Sub
b)Sub Buton_Click()
L=List1.ListCount-1
For i=0 to L
If List1.List(i).Selected Then
List2.AddItem List1.List(i)
End If
Next i
End Sub
c)Sub Buton_Click()
For i=0 to L-1
If List1.Selected(i)=true Then
List1.AddItem List1.List(i)
End If
Next i
End Sub
d)Sub Buton_Click()
For i=0 to List1.ListCount-1
If List1.Selected(i) Then
List2.AddItem List1.List(i)
End If
Next i
End Sub
e)Sub Buton_Click()
For i=0 to List1.ListCount-1
If List1.Selected(i) Then
List2.List(i)=List1.List(i)
End If
Next i
End Sub
f)Sub Buton_Click()
For i=1 to List1.ListCount
If List1.Selected(i-1) Then
List1.AddItem List2.List(i-1)
End If
Next i
End Sub
g)Sub Buton_Click
i=0
N=List1.ListCount-1
While i<N+1
If List1.Selected(i)=true Then
List2.Text=List1.Text
Next i
i=i+1
WEnd
End Sub
h)Sub Buton_Click()
i=0
N=List1.Listcount
Do While i<N
If List1.Selected(i) Then
List2.AddItem List1.List(i)
i=i+1
End If
Loop
End Sub
i)nici una din variantele anterioare
Bogdan Ptru Programarea calculatoarelor electronice
120
23. Care din urmatoareIe subrutine va pune in caseta Text3 vaIoarea minima a numereIor din caseteIe
de text:Text1 si Text2, atunci cand se va apasa butonuI?
Text1 Text2 Text3 Buton
a)Sub Buton_KeyPress(KeyAscii As Integer)
If KeyAscii=13 Then
X=Val(Text1.Text)
Y=Val(Text2.Text)
If X<Y Then
Text3.Text=Str(X)
Else
Text3.Text=Str(Y)
End If
End If
End Sub
b)Sub Minim_Click()
If Val(Text1.Text)<Val(Text2.Text) Then
Text3.Text=Text1.Text
Else
Text3.Text=Text2.Text
End If
End Sub
c)Sub Buton_Click()
If Text1.Text<Text2.Text Then
Text3.Text=Text1.Text
Else
Text3.Text=Text2.Text
End If
End Sub
d)Sub Buton_Click()
Text3.Text=Text1.Text
If Val(Text1.Text)>Val(Text2.Text) Then
Text3.Text=Str(Val(Text2.Text))
End If
End Sub
e)Sub Buton_Click()
Text3.Text=Text1.Text
If Val(Text3.Text)<Val(Text2.Text) Then
Text3.Text=Text2.Text
End If
End Sub
f)Sub Minim_Click()
If Val(Text1.Text)<Val(Text2.Text) Then
m=Text1.Text
Else
m=Text2.Text
End If
Text3.Text=m
End Sub
g)Sub Buton_Click()
If Val(Text1.Text)<Val(Text2.Text) Then
Minim=Text2.Text
Else
Minim=Text1.Text
End If
Text3.Text=Minim
End Sub
h) nu se poate realiza acest lucru
i) nici una din variantele a-h
24.Care din urmatoareIe subrutine caIcuIeaza suma eIementeIor din Iista si o scrie in caseta de text
atunci cand se apasa butonuI?
a)Sub B_Click()
For i=0 To L-1 L Text1 Buton
S=S+L.List(i)
Next i
T.Text=S
End Sub
b)Sub B_Click()
S=0
For i=1 To L.ListCount
S=S+Val(L.List(i))
Next i
T.Text=Str(S)
End Sub
Minim
T B
Bogdan Ptru Programarea calculatoarelor electronice
121
c)Sub B_Click()
S=0
For i=1 To L.ListCount-1
x=Val(L.List(i-1))
S=S+x
Next i
T.Text=Str(S)
End Sub
d)Sub B_Click()
S=0
For i=0 To L.ListCount-1
x=Val(L.List(i))
S=x+S
Next i
T.Text=S
End Sub
e)Sub B_click()
S=0
i=0
While i<=L.ListCount+1
If i<L.ListCount Then
S=Val(L.List(i))+S
End If
i=i+1
WEnd
End Sub
f)Sub B_Click()
S=0:i=1
Do While i<L.ListCount+1
x=Val(L.List(i-1))
i=i-1:S=x+S
Loop
T.Text=S
End Sub
g)Sub B_Click()
S=0:i=0
Do While i<L.ListCount
i=i+1
x=L.List(i-1)
S=S+x
Loop
T.Text=S
End Sub
h)nici una din variantele anterioare
2. Subiecte tip eseu + cunoytine teoretice (pentru proba scris )
NUMARUL 1 NUMARUL 2
1 (3p - subiect obligatoriu). Obiectul de
studiu, locul si rolul disciplinei "Programarea
calculatoarelor" in cadrul inIormaticii.
Legatura acesteia cu alte discipline
inIormatice. Importanta studiului acestei
discipline de catre studentii economisti.
1 (3p - subiect obligatoriu). Obiectul de
studiu, locul si rolul disciplinei "Programarea
calculatoarelor" in cadrul inIormaticii.
Legatura acesteia cu alte discipline
inIormatice. Importanta studiului acestei
discipline de catre studentii economisti.
2 (0,5p). Constante si variabile. Expresii. 2 (0,5p). Instructiunea de atribuire
3 (0,5p). Algoritmi. DeIinitie si proprietati 3 (0,5p). Tipuri de date simple
4 (1p). Tablouri si inregistrari 4 (1p). Exploatarea Iisierelor in Visual Basic
5 (1p). Structuri de decizie (selectie).
Implementari in Visual Basic
5 (1p). Structuri repetitive. Implementari in
Visual Basic
6 (1p). Algoritmul de determinare a sumei si
a mediei aritmetice a mai unui sir de numere
reale
6 (1p). Algoritmul de determinare a celui mai
mici si a celui mai mare element dintr-un sir
de numere reale
7 (1p). Algoritmul de cautare binara SAU
Algoritmul de sortare bubble-sort
7 (1p). Algoritmul de cautare secventiala
SAU Algoritmul de sortare prin selectie
8 (1p). Modul de Iunctionare a unui program
realizat in Visual Basic
8 (1p). Subprograme. Apel si transmiterea
parametrilor
Bogdan Ptru Programarea calculatoarelor electronice
122
3. Subiecte n care se cere realizarea de subrutine
NUMRUL 1
Oficiu - 1p
1. Variabile yi instruciuni - 1p
n programul urmtor subliniai cu o linie variabilele, ncadrai n dreptunghiuri instruciunile de atribuire si
ncercuii condiiile.
Private Sub Command1_Click()
If Option1.Value = True Then ' este femeie
If Option3.Value = False Then
Text1.Text = "Esti o femeie nefumatoare."
Else
Text1.Text = "Esti o femeie fumatoare."
End If
Else 'este barbat
If Option3.Value = False Then
Text1.Text = "Esti un barbat nefumator."
Else
Text1.Text = "Esti un barbat fumator."
End If
End If
End Sub
2. Casete de text - 2p
Eorma Eorm1 cuprinde dou casete de text X si Y si un buton de comand B. Scriei subrutina asociat
butonului B si evenimentului Click prin care n caseta de text Y apare dublul numrului din X.
3. Casete de validare yi/sau butoane de opiune - 2p
Eorma Eorm1 cuprinde o caset de validare C si dou butoane de opiune A1 si A2. Scriei subrutinele
asociate evenimentului Click asupra butoanelor de opiune A1 si A2, prin care caseta de validare C s devin
marcat, dac A1 este marcat, respectiv C s devin nemarcat, dac A2 nu este marcat.
4. Liste - 2p
Eorma Eorm1 cuprinde un buton de comand numit X si trei liste cu numele Numere, Pozitive si respectiv
Negative. n lista Numere avem mai multe numere ntregi, unele pozitive si altele negative, dar listele
Pozitive si Negative sunt iniial vide. Scriei subrutina asociat butonului X si evenimentului Click prin care
toate numerele pozitive din Numere s Iie copiate n lista Pozitive, iar numerele negative din Numere n lista
Negative. 0 se consider a Ii numr pozitiv.
5. Tabele - 2p
Eorma Eorm1 cuprinde un tabel de tip MicrosoIt Elex Grid numit A, un buton de comand T si o caset de
validare W. Tabelul are 2 coloane si mai multe rnduri. Scriei o subrutin asociat butonului T si
evenimentului Click prin care dac W este marcat toate elementele din coloana 1 s devin egale, rnd pe
rnd, cu ptratele celor din coloana 0.
Bogdan Ptru Programarea calculatoarelor electronice
123
NUMRUL 2
Oficiu - 1p
1. Variabile yi instruciuni - 1p
n programul urmtor subliniai cu o linie variabilele, ncadrai n dreptunghiuri instruciunile de atribuire si
ncercuii condiiile.
Private Sub Form_Load()
Check(0).Caption = "Literatura"
Check(1).Caption = "Muzica"
Check(2).Caption = "Sportul"
Check(3).Caption = "Excursiile"
End Sub
Private Sub Command1_Click()
T = ""
For i = 0 To 3
If Check(i).Value = 1 Then
T = T + Check(i).Caption + ", "
End If
Next i
Text1.Text = "Pasiunile tale sunt " + T
End Sub
2. Casete de text - 2p
Eorma Eorm1 cuprinde dou casete de text X si Y si un buton de comand B. Scriei subrutina asociat
butonului B si evenimentului Click prin care n caseta de text Y apare de dou ori textul din X.
3. Casete de validare yi/sau butoane de opiune - 2p
Eorma Eorm1 cuprinde o caset de validare C, un buton de comand B si o caset de text T. Scriei subrutina
asociat evenimentului Click asupra butonului B, prin care caseta de validare C s devin marcat, dac
numrul din T este par, respectiv nemarcat dac este impar.
4. Liste - 2p
Eorma Eorm1 cuprinde un buton de comand numit X si trei liste cu numele Cuvinte, CuvinteLungi si
respectiv CuvinteScurte. In lista Cuvinte avem mai multe elemente, dar listele CuvinteLungi si
CuvinteScurte sunt iniial vide. Scriei subrutina asociat butonului X si evenimentului Click prin care toate
elementele din lista Cuvinte care au un de cel puin 7 litere s treac n lista CuvinteLungi, iar cele cu un
numr de litere mai mic dect 7 in lista CuvinteScurte.
5. Tabele - 2p
Eorma Eorm1 cuprinde un tabel de tip MicrosoIt Elex Grid numit A, un buton de comand T si o caset de
validare W. Tabelul are 2 coloane si mai multe rnduri. Scriei o subrutin asociat butonului T si
evenimentului Click prin care dac W este marcat toate elementele din coloana 0 s Iie copiate n coloana 1.
Bogdan Ptru Programarea calculatoarelor electronice
124
NUMRUL 3
Oficiu - 1p
1. Variabile yi instruciuni - 1p
n programul urmtor subliniai cu o linie variabilele, ncadrai n dreptunghiuri instruciunile de atribuire si
ncercuii condiiile.
Private Sub Form_Load()
Fructe.Clear
Fructe.AddItem "Mere"
Fructe.AddItem "Pere"
Fructe.AddItem "Caise"
Fructe.AddItem "Capsuni"
End Sub
Private Sub Command1_Click()
n = 0
For i = 0 To Fructe.ListCount - 1
If Fructe.Selected(i) = True Then
n = n + 1
End If
Next i
Text1.Text = n
End Sub
2. Casete de text - 2p
Eorma Eorm1 cuprinde trei casete de text X, Y si Z si un buton de comand B. Scriei subrutina asociat
butonului B si evenimentului Click prin care n caseta de text Z apare textul din X, apoi cel din Y, apoi din
nou cel din X, apoi cel din Y si tot asa de cinci ori.
3. Casete de validare yi/sau butoane de opiune - 2p
Eorma Eorm1 cuprinde trei butoane de opiune B1, B2 si B3, un buton de comand T si o caset de text A.
Scriei subrutina asociat evenimentului Click asupra butonului B, prin care textul din A s devin egal cu
Caption-ul butonului de opiune selectat.
4. Liste - 2p
Eorma Eorm1 cuprinde un buton de comand numit X si dou liste cu numele Numere si Speciale. In lista
Numere avem mai multe numere intregi, unele pozitive si altele negative, dar lista Speciale este iniial vid.
Scriei subrutina asociat butonului X si evenimentului Click prin care toate numerele pozitive si selectate
din Numere s Iie copiate n lista Speciale.
5. Tabele - 2p
Eorma Eorm1 cuprinde un tabel de tip MicrosoIt Elex Grid numit A, un buton de comand T si o caset de
validare W. Tabelul are 2 coloane si mai multe rnduri. Scriei o subrutin asociat butonului T si
evenimentului Click prin care toate elementele din coloana 0 s apar si n coloana 1, dar n ordine invers
(primul element pe ultimul rnd, al doilea pe penultimul s.a.m.d.).

S-ar putea să vă placă și