You are on page 1of 38

1

CONINUTURI Bacalaureat
1. Algoritmi
1.1. Noiunea de algoritm, caracteristici
1.2. Date, variabile, expresii, operaii
1.3. Structuri de baz (liniar, alternativ i repetitiv)
1.4. Descrierea algoritmilor (programe pseudocod)
2. Elementele de baz ale unui limbaj de programare (Pascal sau C, la
alegere)
2.1. Vocabularul limbajului
2.2. Constante. Identificatori
2.3. Noiunea de tip de dat. Operatori aritmetici, logici, relaionali
2.4. Definirea tipurilor de date
2.5. Variabile. Declararea variabilelor
2.6. Definirea constantelor
2.7. Structura programelor. Comentarii
2.8. Expresii. Instruciunea de atribuire
2.9. Citirea/scrierea datelor
2.10. Structuri de control (instruciunea compus, structuri alternative i repetitive)
3. Subprograme predefinite
3.1. Subprograme. Mecanisme de transfer prin intermediul parametrilor
3.2. Proceduri i funcii predefinite
4. Tipuri structurate de date //(tipul pointer)
4.1. Tipul tablou
4.2. Tipul ir de caractere
operatori, proceduri i funcii predefinite pentru: citire, afiare, concatenare,
cutare, extragere, inserare, eliminare i conversii (ir valoare numeric)
4.3. Tipul nregistrare
5. Fiiere text
5.1. Fiiere text. Tipuri de acces
5.2. Proceduri i funcii predefinite pentru fiiere text
6. Algoritmi elementari
6.1. Probleme care opereaz asupra cifrelor unui numr
6.2. Divizibilitate. Numere prime. Algoritmul lui Euclid
6.3. irul lui Fibonacci. Calculul unor sume cu termenul general dat
6.4. Determinare minim/maxim
6.5. Metode de ordonare (metoda bulelor, inseriei, seleciei, numrrii)
6.6. Interclasare
6.7. Metode de cutare (secvenial, binar)
6.8. Analiza complexitii unui algoritm (considernd criteriile de eficien durata
de executare i spaiu de memorie utilizat)
7. Subprograme definite de utilizator
7.1. Proceduri i funcii
declarare i apel
parametri formali i parametri efectivi
parametri transmii prin valoare, parametri transmii prin referin
variabile globale i variabile locale, domeniu de vizibilitate
7.2. Proiectarea modular a rezolvrii unei probleme
8. Recursivitate
2

8.1. Prezentare general
8.2. Proceduri i funcii recursive
9. Metoda backtracking (iterativ sau recursiv)
9.1. Prezentare general
9.2. Probleme de generare. Oportunitatea utilizrii metodei backtracking
10. Generarea elementelor combinatoriale
10.1. Permutri, aranjamente, combinri
10.2. Produs cartezian, submulimi
11. Grafuri
11.1. Grafuri neorientate
terminologie (nod/vrf, muchie, adiacen, inciden, grad, lan, lan
elementar, ciclu, ciclu elementar, lungime, subgraf, graf parial)
proprieti (conex, component conex, graf complet, hamiltonian,
eulerian)
metode de reprezentare (matrice de adiacen, liste de adiacen)
11.2. Grafuri orientate
terminologie (nod/vrf, arc, adiacen, inciden, grad intern i extern,
drum, drum elementar, circuit, circuit elementar, lungime, subgraf, graf parial)
proprieti (tare conexitate, component tare conex)
metode de reprezentare (matrice de adiacen, liste de adiacen)
11.3. Arbori
terminologie (nod, muchie, rdcin, descendent, descendent direct/fiu,
ascendent, ascendent direct/printe, frai, nod terminal, frunz)
metode de reprezentare n memorie (matrice de adiacen, liste de
descendeni, vector de tai)























3

I. Algoritmi

1.1. Noiunea de algoritm, caracteristici

Ce este un algoritm?
Conceptul de algoritm nu este nou. Termenul algoritm deriv din numele
unui matematician persan, Abu Jafar Mohammed ibn Musa al Khowarizmil (cca.
825 e.n.), care a scris o carte cunoscut sub denumirea latin de Liber
algorithmi.
Matematicienii Evului Mediu nelegeau prin algoritm o regul pe baza
creia se efectuau calcule aritmetice. Ulterior, termenul de algoritm a circulat ntr-
un sens restrns, exclusiv n domeniul matematicii. O dat cu dezvoltarea
calculatoarelor cuvntul algoritm a dobndit o semnificaie aparte, astfel nct
astzi gndirea algoritmic s-a transformat, dintr-un instrument specific
matematicii, ntr-o modalitate fundamental de abordare a problemelor n diverse
domenii.
Un algoritm reprezint o metod de rezolvare a problemelor de un anumit
tip.
A rezolva o problem nseamn a obine, pentru anumite date de intrare,
rezultatul problemei (date de ieire):

Date de intrare Date de ieire


Algoritmul este constituit dintr-o succesiune de operaii care descriu, pas cu
pas, modul de obinere a datelor de ieire, plecnd de la datele de intrare. Se pot
descrie algoritmi pentru rezolvarea problemelor din orice domeniu de activitate.
Scopul elaborrii algoritmului unei probleme este acela de a scrie un
program ntr-un anumit Iimbaj de programare. Dar dac avem de-a face cu o
problem mai complex, nainte de a scrie programul este bine s scriem paii
algoritmului; n acest scop avem la dispoziie o form foarte accesibil de
reprezentare a algoritmilor, i anume pseudocodul.

De exemplu, orice reet de buctrie poate fi considerat un algoritm prin care,
plecnd de la materiile prime, obinem printr-o succesiune finit de operaii
produsul finit.

Exemplul 1:
Presupunnd c dispunem de un aragaz, o tigaie, 2 ou, sare i 2oo ml ulei, s
pregtim ochiuri.
Date de intrare: ou, ulei, sare.
Date de ieire: ochiuri.
Pas 1: Se pune tigaia pe foc.
Pas 2: Se toarn uleiul n tigaie.
Pas 3: Ateptm pn cnd se ncinge uleiul.
Pas 4: Spargem cu ndemnare oule n tigaie.
Pas 5: Ateptm pn cnd oule se rumenesc.
Pas 6: Dac nu inem regim, adugm sare.
ALGORITM
4

Observm c am descris o succesiune de pai, prin care, pentru orice ,,date de
intrare (ulei, sare, ou), obinem rezultatul dorit (ochiuri). Fiecare pas const din
operaii culinare specice, care se execut n ordinea n care sunt specicate.
Exemplul 2
S analizm un alt exemplu, cu care suntem familiarizai de la matematic:
rezolvarea ecuaie de gradul I de forma : ax+b=0, cu a,b R.
Date de intrare: a, b R
Date de ieire: x R, soluia ecuaiei, sau un mesaj adecvat
Pas 1: citete datele de intrare a i b numere reale
Pas 2: dac a0 atunci
scrie soluia ecuaiei este , x -b/a
altfel
dac b=0 atunci
scrie infinitate de soluii
altfel
scrie relaie matematic imposibil
Aceast succesiune de pai rezolv ecuaia de forma specificat pentru
orice valori ale datelor de intrare, prin urmare este un algoritm.

Proprieti caracteristice ale algoritmilor

Exemplele precedente genereaz n mod resc dou ntrebri:
1. Pentru orice problem exist un algoritm de rezolvare?
Rspunsul este NU! Exist probleme pentru care se poate demonstra c
nu exist algoritmi de rezolvare, dar i probleme pentru care nici nu s-a
demonstrat c nu admit o metod de rezolvare algoritmic, dar nici nu s-a
descoperit soluia algoritmic.
2. Orice succesiune de pai reprezint un algoritm?
Din nou, rspunsul este NU! Pentru a un algoritm, secvena trebuie s
ndeplineasc condiiile:
Rezolvabilitate ~ algoritmul s aib cel puin o soluie;
Claritate ~ la ecare moment, operaia care urmeaz a executat
este unic determinat denit i realizabil (adic poate efectuat la
momentul respectiv, cu mijloacele disponibile);
Generalitate (universalitate) ~ o secven de pai reprezint un
algoritm de rezolvare a unei probleme dac obine date de ieire
(rezultate) pentru orice date de intrare specice problemei (adic s
rezolve o ntreag clas de probleme, nu una particular );
Finitudine ~ rezultatele problemei se obin dup un numr nit de
pai;
Eficiena ~ algoritmul s rezolve problema ntr-un numr ct mai mic
de pai pentru a se obine un timp de execuie ct mai mic alturi de
un consum mic de memorie.

n concluzie, dei nu putem deni cu rigurozitate noiunea de algoritm,
putem descrie mai detaliat aceast noiune astfel:

5

Un algoritm este constituit dintr-o succesiune clar i finit de operaii
realizabile, efectuate mecanic, care pornind de la un set de date de intrare
conduc n timp finit la obinerea unui set de date de ieire ( rezultate ).


Etapele rezolvrii unei probleme
Rezolvarea unei probleme constituie un proces complex, care comport mai
multe etape.
1. Analiza problemei n scopul stabilirii datelor de intrare, precum i a
rezultatelor pe care trebuie s le obinem prin rezolvarea problemei.
2. Elaborarea unui algoritm de rezolvare a problemei.
3. Implementarea algoritmului ntr-un limbaj de programare.
4. Vericarea corectitudinii algoritmului propus.
Un prim pas const n testarea programului pe diverse seturi de date de test.
Seturile de date de test trebuie elaborate cu atenie, astfel nct s acopere,
pe ct posibil, toate variantele de execuie a algoritmului, inclusiv situaii de
excepie, i s verice dac fiecare subproblem a problemei date este
rezolvat corect (dac este posibil, se va testa separat fiecare modul de
program).
5. Analiza complexitii algoritmului.
n general, exist mai muli algoritmi de rezolvare a unei probleme date.
Pentru a alege cel mai bun algoritm, trebuie s analizm aceti algoritmi n
scopul determinrii eficienei lor i, pe ct posibil, a optimalitii lor.
Eficiena unui algoritm se evalueaz din dou puncte de vedere:
a. Din punctul de vedere al spaiului de memorie necesar pentru
memorarea valorilor variabilelor care intervin n algoritm (complexitate
spaiu);
b. Din punctul de vedere al timpului de execuie (complexitate timp).

1.2 Date, variabile, expresii, operaii

Definiie: O dat este orice entitate cu care poate opera calculatorul.
Orice algoritm lucreaz cu date: date de intrare (datele pe care trebuie s le
primeasc un algoritm din exterior), date de ieire (datele pe care trebuie s le
furnizeze algoritmul n exterior), precum i date de manevr (date temporare,
necesare algoritmului pentru a obine datele de ieire pe baza datelor de intrare).
Datele cu care lucreaz algoritmii pot clasificate din mai multe puncte de
vedere. O prim clasicare a datelor, n funcie de posibilitatea de a-i modica
valoarea, este:
Constante - date care nu i modic valoarea; de exemplu: 10, 3 .14, sir
de caractere, A, fals ( 0 ).
Variabile - date care i modic valoarea. O variabil poate referit printr-
un nume (o succesiune de litere, cifre i liniu de subliniere, primul caracter
ind obligatoriu liter sau liniu de subliniere) i are asociat o valoare.
Numele unei variabile nu se schimb pe parcursul algoritmului, dar valoarea
acesteia se poate modica.
6

Pentru a cunoate natura valorilor care pot fi asociate variabilelor
precum i a operaiilor permise cu acestea, variabilele trebuie declarate
nainte de a fi utilizate.
n funcie de valoarea lor, datele pot fi clasicate astfel:
1) Date numerice - au ca valori numere ( naturale, ntregi sau reale );
2) Date alfabetice - au ca valori caractere sau iruri de caractere;
3) Date logice - au valoarea adevrat sau fals (1 sau 0).
Expresii
O expresie este constituit dintr-o succesiune de operanzi, conectai prin
operatori. Un operand poate fi o constant, o variabil, sau o expresie ncadrat
ntre paranteze rotunde. Operatorii desemneaz operaiile care se execut
asupra operanzilor. Operatorii care pot fi utilizai ntr-o expresie depind de tipul
operanzilor (numerici ntregi, numerici reali, caractere, iruri de caractere sau
logici).
Evaluarea unei expresii presupune calculul valorii expresiei, prin nlocuirea
valorilor variabilelor care intervin ca operanzi n expresie i efectuarea operaiilor
specicate de operatori.

Categorii de operatori:

Operatori aritmetici

Operatorii aritmetici definesc o operaie aritmetic i pot fi clasificai astfel:
1. Operatori aritmetici multiplicativi: * (nmulire), /(mprire), % (restul mpririi
ntregi).
Operatorul de mprire (/) are un efect diferit, n funcie de tipul operanzilor.
Dac ambii operanzi sunt ntregi, se face mprire ntreag (se obine ca
rezultat un numr ntreg, care este ctul mpririi primului operand la cel de-al
doilea).
Exemplu:
ntreg a,b
a7; b2
scrie a/b => expresia a/b are valoarea 3.
Dac cel puin unul dintre operanzi este real, se face mprire real (se obine
ca rezultat un numr real).
Exemplu:
real a,b
a7; b2
scrie a/b => expresia a/b are valoarea 3.5.
Operatorul % se poate aplica numai asupra operanzilor ntregi.

2. Operatori aritmetici aditivi: + (adunare) i -(scdere).
Operatorii aritmetici aditivi i multiplicativi sunt binari (acioneaz asupra a doi
operanzi). Operatorii aritmetici se pot aplica numai operanzilor numerici.
Rezultatul evalurii unei expresii aritmetice este numeric (ntreg sau real, n
funcie de operanzi i operatori).

Operatori relaionali
7


Operatorii relaionali descriu relaia de ordine sau de egalitate dintre cei doi
operanzi: < (mai mic), > (mai mare), (mai mic sau egal), (mai mare sau egal),
= (egal), (diferit).
Operatorii relaionali sunt operatori binari i se pot aplica numai operanzilor
numerici, logici ( fals < adevrat ) i de tip caracter ( ordinea caracterelor ind
determinat de codurile lor ASCII ).
Valoarea unei expresii relaionale este ntotdeauna de tip logic (deci poate
adevrat sau fals).
Operatori logici

Operatorii logici se pot aplica operanzilor logici. Valoarea unei expresii logice este
de tip logic.
Operatorii logici definesc o operaie logic: negaie logic - !; conjuncie Iogic -
i; disjuncie logic - sau. Operatorul ! este unar, operatorii i, sau sunt operatori
binari. Efectul acestor operatori este cel uzual. i reamintim n tabelul urmtor:
x y !x x sau y x i y
Fals (0) Fals (0) Adevrat (1) Fals (0) Fals (0)
Fals (0) Adevrat (1) Adevrat (1) Adevrat (1) Fals (0)
Adevrat (1) Fals (0) Fals (0) Adevrat (1) Fals (0)
Adevrat (1) Adevrat (1) Fals (0) Adevrat (1) Adevrat (1)

Evaluarea unei expresii
n procesul de evaluare a unei expresii se respect regulile de baz, nvate la
matematic ( n primul rnd se evalueaz expresiile dintre parantezele rotunde;
apoi se execut operaiile n ordinea prioritii lor; dac exist mai multe operaii
cu aceeai prioritate, se execut n ordine, n funcie de asociativitatea lor).

Prioritatea operatorilor este: (1 fiind considerat prioritatea maxim):
Prioritate Operatori Simbol Asociativitate
1. Negaia logic ! de la dreapta la stnga
2. Aritmetici multiplicativi *, /, % de la stnga la dreapta
3. Aritmetici aditivi +, - de la stnga la dreapta
4. Relaionali <, >, , , =, de la stnga la dreapta
5. Conjuncie logic i de la stnga la dreapta
6. Disjuncie logic sau de la stnga la dreapta

1.3 Structuri de baz (liniar, alternativ i repetitiv)

Principiile programrii structurate
Creterea complexitii aplicaiilor a impus la nceputul anilor 70 apariia
unei noi paradigme n programare: programarea structurat. Scopul era de a
dezvolta noi tehnici de programare care s permit dezvoltarea unor programe
fiabile, uor de elaborat n echip, uor de depanat, de ntreinut i de reutilizat.
Un prim principiu al programrii structurate este modularizarea. Pentru
proiectarea unor aplicaii complexe, este necesar descompunerea problemei
care trebuie rezolvat n subprobleme relativ independente, pentru fiecare dintre
8

aceste subprobleme scriindu-se module de program mai simple. Fiecare modul
efectueaz un set de prelucrri specifice i este relativ independent de celelalte
module, cu care comunic prin intermediul unui set de parametri, care constituie
interfaa.
Avantajele sunt multiple. Cum la orice firm se lucreaz n echip, modulele
de program pot fi implementate de mai muli programatori.
Modificarea unui modul nu afecteaz celelalte module. Fiecare modul poate
fi implementat, testat, depanat, modificat, independent de celelalte.


Un alt principiu fundamental este structurarea datelor i a prelucrrilor.
Programatorul are posibilitatea de a-i grupa datele n colecii, organizate dup
anumite reguli, denumite structuri de date.
Prelucrrile asupra datelor sunt structurate separat. Conform teoremei de
structur a lui Bohm - Jacopini, orice prelucrare poate fi descris prin
compunerea a trei structuri fundamentale: structura liniar ( secvenial ),
structura alternativ i structura repetitiv.

1.4 Reprezentarea algoritmilor n pseudocod

Pentru ca o secven de operaii s constituie un algoritm, ea trebuie s fie
clar, adic la orice moment operaia care urmeaz a executat trebuie s e
unic determinat, denit i realizabil (s poat efectuat la momentul
respectiv, cu mijloacele disponibile). Apare ntrebarea: care sunt operaiile
denite, cu ajutorul crora s putem descrie algoritmi?
Este nevoie de o metod universal de reprezentare a algoritmilor, ulterior
ecare programator avnd posibilitatea de a implementa algoritmii n limbajul pe
care l prefer.
De-a lungul timpului s-au impus dou modaliti de reprezentare a
algoritmilor: schemele logice i limbajele de tip pseudocod.
Schemele logice constituie o metod de reprezentare grac, foarte sugestiv,
dar cu o serie de dezavantaje: se d o egal importan componentelor principale
ca i detaliului, prin urmare schemele logice devin deosebit de stufoase i greu de
urmrit; pentru aplicaiile mai complexe, cnd este necesar modularizarea, este
practic imposibil de pus n eviden legturile dintre module n cadrul schemei
logice. Din acest motiv, treptat s-a impus o alt metod de reprezentare a
algoritmilor: pseudocodul.
Un limbaj de tip pseudocod este un ansamblu de convenii, respectate n
mod sistematic, care denesc operaiile permise (denumite i instruciuni) pentru
reprezentarea algoritmilor.
Un Iimbaj pseudocod se prezint sub form de text i se bazeaz pe nite
aa-numite cuvinte cheie. Fiecare cuvnt cheie identic n mod unic un anumit
tip de aciune.
Aciunile algoritmului se reprezint n pseudocod prin ceea ce numim
instruciuni. Ansamblul cuvintelor cheie mpreun cu regulile care trebuie
respectate n folosirea lor, alctuiesc ceea ce numim sintaxa Iimbajului
pseudocod.
9

Exist o mare diversitate de Iimbaje pseudocod. Practic, fiecare
programator i poate proiecta propriul pseudocod, denind cuvintele cheie ale
acestuia i impunnd nite reguli de sintax.

Structura secvenial

Declararea datelor
Sintaxa: variabila tip;

La nceputul oricrui algoritm, vom preciza datele de intrare, datele de ieire,
eventualele date de manevr precum i tipul acestora. nainte de a utiliza orice
variabil, dup cum am precizat i anterior, o vom declara, preciznd numele i
tipul ei. O variabil nu poate fi declarat de mai multe ori n acelai algoritm.
Exemple
x real;
c caracter;
i ntreg;

Operaia de citire
Sintaxa: citete variabila
1
, variabila
2
, ..., variabila
n
;
Efect: Prin operaia de citire (denumit 1 operaie de intrare) se preiau succesiv
valori de la tastatur i se asociaz, n ordine, variabilelor specicate.

Operaia de scriere
Sintaxa: scrie expresie
1
, expresie
2
, ..., expresie
n
;
Efect: Operaia de scriere (denumit i operaie de ieire) presupune evaluarea n
ordine a expresiilor specicate i aarea pe ecran a valorilor lor pe aceeai linie.

Operaia de atribuire
Sintaxa: variabila expresie;
Efect: se evalueaz expresia, apoi se atribuie valoarea expresiei variabilei din
membrul stng.

Observaii
1. Pentru claritate, putem insera ntr-un algoritm comentarii, mici texte
explicative. nceputul unui comentariu este marcat de succesiunea de
caractere /* iar sfritul comentariului este marcat de */.
Parcurgerea instruciunilor n secven, n ordinea specificrii lor, reprezint o
structur liniar ( secvenial ).

Structura alternativ
dac expresie atunci
instruciune_1
[altfel parantezele drepte indic faptul c ramura de altfel e opional
instruciune_2]
sf. dac
Efect:
Se evalueaz expresia.
10

Dac valoarea expresiei este adevrat, atunci se execut instruciune_1. Dac
valoarea expresiei este fals, se execut instruciune_2 dac ramura de altfel
exist iar n caz contrar nu se execut nimic.

Observaii
Att pe ramura atunci, ct i pe ramura altfel este permis executarea unei
singure instruciuni. n cazul in care este necesar efectuarea mai multor operaii,
acestea se grupeaz ntr-o singur instruciune compus.
Instruciunea dacatunci permite executarea unei singure instruciuni, n funcie
de valoarea unei expresii, deci permite selectarea condiionat a unei alternative.
Aceast instruciune implementeaz n pseudocod structura alternativ.
Aplicaii: Modulul unui numr, Verificarea paritii unui numr, Rezolvarea
ecuaiei de gradul II.

Structura repetitiv

n funcie de numrul de pai executai exist 2 tipuri de structuri repetitive:
cu numr necunoscut de pai; care n funcie de locul n care apare
condiia de repetiie se clasific n:
instruciune repetitiv condiionat anterior
instruciune repetitiv condiionat posterior
cu numr cunoscut de pai

Structur repetitiv cu numr necunoscut de pai:

- Instruciunea repetitiv condiionat anterior

ct timp expresie execut
instruciune
sf. ct timp
Efect:
Pas 1: se evalueaz expresia;
Pas 2: dac valoarea expresiei este fals(0), se iese din instruciunea ct
timpexecut;
daca valoarea expresiei este adevrat, se execut instruciunea, apoi se
revine la Pas 1.

Observaii
Instruciunea se execut repetat, ct timp valoarea expresiei este adevrat
(1). Pentru ca ciclul s nu fie innit, este obligatoriu ca instruciunea care se
execut s modifice cel puin una dintre variabilele care intervin n expresie, astfel
nct aceasta s poat lua valoarea fals(0).
Dac expresia are de la nceput valoarea fals(0), instruciunea nu se
execut nici mcar o dat.




11

- Instruciunile repetitive condiionate posterior

execut
instruciune
ct timp expresie;
Efect:
Pas 1: se execut instruciunea;
Pas 2: se evalueaz expresia;
Pas 3:dac valoarea expresiei este fals(0) se iese din instruciunea repetitiv;
dac valoarea expresiei este adevrat(1), se revine la Pas 1.

repet
instruciune
pn cnd expresie;
Efect:
Pas 1: se execut instruciunea;
Pas 2: se evalueaz expresia;
Pas 3:dac valoarea expresiei este adevrat(1) se iese din instruciunea
repetitiv; dac valoarea expresiei este fals(0), se revine la Pas 1.
Observaii:
1. Instruciunea execut...ct timp se execut repetat, ct timp valoarea expresiei
este adevrat(1). Pentru ca ciclul s nu fie infinit, este obligatoriu ca
instruciunea care se execut s modifice cel puin una dintre variabilele care
intervin n expresie, astfel nct aceasta s poat lua valoarea fals(0).
2. Instruciunea repet...pn cnd se execut repetat, ct timp valoarea expresiei
este fals(0). Pentru ca ciclul s nu fie infinit, este obligatoriu ca instruciunea
care se execut s modifice cel puin una dintre variabilele care intervin n
expresie, astfel nct aceasta s poat lua valoarea adevrat(1).
3. Deoarece evaluarea expresiei n ambele repetitive se face dup execuia
instruciunii, instruciunea se execut cel puin o dat.

Pentru ca instruciunea ct timpexecut s fie echivalent cu instruciunea
executct timp este necesar verificarea n prealabil a condiiei (expresiei
logice) astfel:

ct timp expresie execut
instruciune
sf. ct timp


dac expresie atunci
execut
instruciune
ct timp expresie;
sf. dac

Pentru ca instruciunea execut ct timp s fie echivalent cu instruciunea
repetpn cnd este necesar negarea condiiei (expresiei logice) astfel:

execut
instruciune
ct timp expresie


repet
instruciune
pn cnd !(expresie);


12

Structur repetitiv cu numr cunoscut de pai:

- Instruciunea repetitiv cu numr cunoscut de pai

Pentru contorexpresie
1
, expresie
2
,[pas] execut
Instruciune
Sf. pentru
Efect:
Pas 1: Se evalueaz expresie
1
.
Pas 2: Se atribuie variabilei contor valoarea expresiei expresie
1
.
Pas 3. Se evalueaz expresie
2
.
Pas 4: Dac valoarea variabilei contor este mai mare/mic (n funcie de valoarea pas,
adic pozitiv sau negativ) dect valoarea expresiei expresie
2
, atunci se iese din
instruciunea repetitiv. Dac valoarea variabilei contor este mai mic/mare sau egal
cu valoarea expresiei expresie
2
, atunci se execut instruciune i apoi se
incrementeaz/decrementeaz (se modific valoarea contorului cu pas) valoarea
variabilei contor, dup care se revine la Pas 3.

Observaii
1. Dac variabila pas lipsete se consider implicit 1.
2. Instruciunea repetitiv cu numr cunoscut de pai poate simulat cu ajutorul
celorlalte dou instruciuni repetitive.

Executarea repetat a unei instruciuni, controlat de valoarea unei expresii, reprezint
o structur repetitiv.























13

II. Elemente de baz ale limbajului C/C++

2.0 Noiuni introductive

Limbajul de programare este mijlocul de comunicare ntre utilizator i calculator.
Pentru a defini limbajul de programare se au n vedere 3 aspecte:
Sintaxa = reprezint totalitatea regulilor care trebuie respectate pentru definirea
elementelor limbajului;
Semantica = definete semnificaia construciilor sintactic corecte;
Pragmatica = definete modul de utilizare a elementelor limbajului.
Implementarea unui algoritm ntr-un limbaj de programare se numete program.

Evoluia limbajelor de programare
O clasificare a limbajelor de programare n funcie de nivel:
- de nivel sczut (cele pentru care programatorul trebuie s cunoasc modul de
funcionare a procesorului lucreaz cu regitrii procesorului);
- de nivel nalt (necesit cunotine tehnice de nivel minim);
Exemplu de limbaj de programare de nivel sczut: limbajele de asamblare.
Exemple de limbaje de nivel mediu i nalt:
1955 FORTRAN (Formula Translation) destinat aplicaiilor tehnico-tiinifice cu
caracter numeric
1960 ALGOL (Algorithmic Language) este primul limbaj definit riguros, cu o
sintax complet formalizat; folosit i astzi de proiectanii de limbaje de
programare
1960 COBOL (Common Business Oriented Language) destinat aplicaiilor
economice
1971 PASCAL conceput de Niklaus Wirth pentru studeni (ca s-i
nsueasc rapid arta programrii)
1972 C conceput de Brian Kernighan i Dennis Richie ca limbaj cu destinaie
universal
1980 Bjarne Stroustup public specificaiile limbajului C++ (extensie a
limbajului C destinat programrii pe obiecte (POO))
1995 James Gostling a publicat specificaiile limbajului Java (are ca obiectiv
principal portabilitatea, el fiind independent de maina pe care ruleaz)
Evoluia este i la nivel de programare Internet i grafic.

2.1 Vocabularul limbajului

Vocabularul limbajului este alctuit din: setul de caractere, identificatori, separatori i
comentarii.

Setul de caractere
n C/C++ setul de caractere acceptat este cel al codului ASCII;
- codul ASCII standard (codific de la 0-127)
- codul ASCII extins (codific de la 128-255) caractere grafice i semigrafice
Exist 256 de coduri ASCII.
Exemple:
a=097
14

A=065
0=048
Pentru a scrie n limbaj de programare un caracter utiliznd codul ASCII :
Alt (din dreapta ) + codul ASCII al caracterului.
Exemplu: Alt+179 scrie caracterul grafic |

Identificatorii sunt ntlnii i sub denumirea de nume i au rolul de a desemna
nume de variabile, constante , funcii, etc.
Din punct de vedere sintactic identificatorii sunt o succesiune de litere, cifre i liniue
de subliniere dintre care prima trebuie s fie liter sau liniu de subliniere.
Ex: nume corect de variabil: a, a3, _56, nr_cuv
nume greit de variabil: 3aq, nr cuv
Observaii:
- un identificator poate s aib orice lungime, semnificative sunt primele 31
caractere.
- C/C++ este case-sensitive (face distincie ntre literele mari i mici; adic un
identificator a difer de identificatorul A)
- identificatorii ar trebui s aib denumirea n conformitate cu scopul utilizrii lor.

O categorie special de identificatori este reprezentat de cuvintele rezervate
sau cuvinte cheie ale limbajului.
Din punct de vedere sintactic cuvintele cheie sunt identificatori utilizai numai n scopul
pentru care au fost creai.

Exemplu:
if (cuvnt cheie care marcheaz nceputul instruciunii alternative n C)
while (cuvnt cheie care marcheaz nceputul instruciunii repetitive n C)
Observaie: este eroare de sintax utilizarea cuvintelor cheie n alt scop dect cel
pentru care au fost create

Separatorii
Sunt utilizai pentru a separe unitile sintactice ntre ele;
Exist mai multe tipuri de separatori:
- separatori standard: spaiul ( ), tab(\t), enter (new line \n)
- delimitatori: operatorul virgul (,)
- separatori speciali: ;(este utilizat la finalul unei instruciuni), (apostroafe) i
(utilizai pentru constantele de tip caracter i ir de caractere)

Comentariile
Reprezint o succesiune de caractere pe care compilatorul (cel care transcrie
codul surs n limbaj main) nu le ia n considerare.
Exist n C/C++ dou tipuri de comentarii:
- pe mai multe linii cu marcajul /**/
- pe o singur linie (de la marcaj pn la sf. de linie) cu marcajul //
Sunt utilizate pentru a crete gradul de lizibilitate a programului i ajut utilizatorii
multiplii la nelegerea programului.


15


2.2 Constante

Variabilele - sunt date a cror valoare poate fi modificat pe parcursul execuiei
programului.
Constantele - sunt date ce nu pot fi modificate n cadrul programului.
Constantele ntregi sunt numere ntregi exprimate in:
zecimal - succesiuni de cifre zecimale (ex: 100)
octal - succesiuni de cifre octale precedate de 0 (ex: 024)
hexazecimal - succesiuni de cifre hexazecimale precedate de 0x sau 0X
(ex: 0xFF1) ; baza 16 are cifre 0..9 i litere A..F unde A=10F=15
Constantele reale pot fi specificate n notaia uzual sau n format exponenial
(tiinific). n forma uzual cuprind partea ntreag i partea zecimal, separate de
caracterul .(punct). n format exponenial se specific n plus un exponent al lui 10,
precedat de e sau E. n acest caz valoarea numrului se obine nmulind numrul
(corespunztor construciei din faa literei e/E) cu 10 la puterea specificat de
exponent.
Constantele caracter sunt constituite din caractere ncadrate ntre apostroafe. Se
pot construi secvene escape (formate din caracterul backslash \ urmat de codul
ASCII al caracterului - n baza 8 sau x i codul ASCII n baza 16 )
Exemple:
\65 este 5 n baza 8
\x35 este 5 n baza 16
Unele caractere negrafice au asociate secvene escape speciale:
Secven escape Caracter
\b Caracterul backslash (deplaseaz cursorul pe ecran cu o poziie la stnga)
\t Caracterul tab orizontal
\n Caracterul newline (determin trecerea cursorului la linie nou)
\a Caracterul alarm (genereaz un sunet)
\\ Caracterul backslash
\ Caracterul apostrof
\ Caracterul ghilimele

Constantele ir de caractere sunt constituite dintr-o succesiune de caractere
ncadrate ntre ghilimele. Sunt reprezentate intern prin codurile ASCII ale caracterelor
i terminate cu '\0' (terminatorul irurilor de caractere sau caracterul NULL).
O constant simbolic este o constant desemnat printr-un identificator. Poate fi
predefinit sau definit de utilizator.
Exemple de constante simbolice predefinite n C/C++:
- MAXINT cu valoarea 32767 (# define MAXINT 32767)
- MAXLONG cu valoarea 2147483647
Exemple de constante ir de caractere definite de utilizator:
Acesta este un sir

2.3 Noiunea de tip de dat. Operatori aritmetici, logici, relaionali

O dat este orice entitate cu care poate opera calculatorul.
16

Orice limbaj de programare dispune de un set de tipuri de date predefinite numite
i tipuri de date standard
Un tip de date este format din mulimea valorilor pe care le pot lua datele de tipul
respectiv, modul de reprezentare n memorie precum i operaiile care se pot aplica
datelor de tipul respectiv.
Observaie:
Mulimea valorilor unui anumit tip de date reprezint constantele tipului respectiv.

Operatori aritmetici, logici, relaionali
Operatorii aritmetici : +, -, *, /, %

Operatorul Tipul operaiei
+, - Semne (operatori unari)
*, /, % De multiplicitate (operatori binari)
+,- Aditivi (operatori binari)

Observaii:
Operatorul % se poate aplica numai datelor de tip ntreg.
Dac operatorul / se aplic cel puin unui operand de tip real atunci rezultatul
este real (idem pentru operatorii +,-,*)
Exemplu:
int a=5,b=2;
cout<<a/b; // 2
cout<<(float)a/b; // 2.5
cout<<5/2.0; //2.5
Operatorii logici sunt de dou tipuri: logici globali i logici pe bii (sunt operatori binari
toi n afar de negaia logic i pe bii care sunt unari)
Operatori logici globali (&&, ||, !)





Observaie: Operatorii logici globali se pot aplica datelor de orice tip standard,
rezultatul fiind ntotdeauna logic.
Exemplul 1: Exemplul 2: Exemplul 3: Exemplul 4: Exemplul 5: Exemplul 6:
int a=5,b=3;
if(a>0)
cout<<a; //5
else
cout<<b;
int a=5,b=3;
if (a)// a!=0
cout<<a; //5
else
cout<<b;
int a=5,b=3;
if(a&&b)
cout<<a+b;
//8
else
cout<<a-b;
int a=5,b=3;
if(a>0 && b<0) //1&&0==0
cout<<a+b;
else
cout<<a-b; //2
int a=5,b=3;
if(a>0 || b<0)
//1||0==1
cout<<a+b; //8
else
cout<<a-b;
int a=4;
cout<<(a<0)<<
<<!a<< <<
(a==4); // 0 0 1






&& 0 !0=1
0 0 0
!0=1 0 1
!
0 1
!0=1 0
|| 0 !0=1
0 0 1
!0=1 1 1
17

Operatori logici pe bii (&, |, ~, ^)

i pe bii sau pe bii negaia pe bii sau exclusiv sau
XOR











Operatori relaionali (<,>,<=,>=) se aplic datelor de tip standard i returneaz un
rezultat de tip logic.
Observaie: Negarea lui > este <=, negarea lui < este >=, negarea lui <= este >,
negarea lui >= este <.
Exemplu:
int a=5,b=3;
if(a>b) // a<b sau a>=b sau a<=b sau a!=b
cout<<a; //5
else
cout<<b;
Operatorul de egalitate i diferit(==,!=)
Exemplu:
int a=5,b=5;
if(a==b)
cout<<Da; // Da
else
cout<<Nu;
Observaie: Operatorul == i != apare doar n expresii logice

2.4 Tipuri standard de date. Conversii implicite i explicite

1) Tipul ntreg
Denumirea Nr. octei Valori Obs.
int 2 octei cu semn -32768..32767 0000000000000000
2
=0
10
1111111111111111
2
=32767
10
unsigned int 2 octei fr semn 065535
long int 4 ocei cu semn -21474836482147483647
unsigned long int 4 ocei fr semn 04294967295
Observaie: La oricare din tipurile ntregi n afar de int cuvntul rezervat int este
implicit long int long; unsigned int unsigned
Exemple:
int a; // declar un numr ntreg a crui valoare nu depete n modul 32767
unsigned b,c; // declar dou numere naturale a cror valoare nu depete 65535
& 0 1
0 0 0
1 0 1
| 0 1
0 0 1
1 1 1
~
0 1
1 0
^ 0 1
0 0 1
1 1 0
Exemplul & Exemplul | Exemplul ~
Exemplul ^
int a=10,b=5;
//a=1010
2
b=101
2
cout<<a&b; // 0
int a=10,b=6;
//a=1010
2
b =110
2

cout<<a&b; //2
int a=10,b=5;
// a=1010
2
b=0101
2
// a|b= 1111
2
=15
cout<<a|b; // 15
int a=10,b=6;
// a=1010
2
b=0110
2

// a|b= 1110
2
= 14
cout<<a|b; // 14
int a=10;
cout<<~a;
// 32757

int a=10,b=5;
//a=1010
2
b=0101
2

//a^b= 1111
2
=15
cout<<a^b; // 15
int a=10,b=6;
//a=1010
2
b=0110
2

//a^b= 1100
2
= 12
cout<<a^b; // 12
18

2) Tipul real
Denumirea Nr. octei - n
virgul mobil
Valori
float 4 octei [3.4*10
-38
,3.4*10
38
]U [-3.4*10
+38
,-3.4*10
-38
]
double 8 octei [1.7*10
-308
,1.7*10
308
]U [-1.7*10
+308
,-1.7*10
-308
]
long double 10 octei [3.4*10
-4932
,1.1*10
4932
]U [-3.4*10
+4932
,-1.1*10
-4932
]

3) Tipul caracter




Observaie: cuprinde caracterele din codul ASCII
irurile de caractere se obin prin concatenarea (lipirea caracterelor) ntre ele (nu
exist tipul ir de caractere ntre tipurile standard de date C/C++).

Conversiile de tip pot fi de 2 feluri: implicite i explicite.
Conversii implicite de tip:
Conversiile implicite au loc atunci cnd este necesar ca operatorii i argumentele
funciilor s corespund cu valorile ateptate pentru acestea. Acestea pot fi sintetizate
prin tabelul:
Tip Tip la care se convertete implicit
char int, short int, long int
int
char (cu trunchiere)
short int (cu trunchiere)
long int (cu extensia semnului)
short int ca i int
long int ca i int
float double, int, short int, long int
double float, int, short int, long int
Conversii aritmetice.
Cnd un operator binar se aplic ntre doi operanzi de tip diferit, are loc o
conversie implicit a tipului unuia dintre ei, i anume, operandul de tip mai restrns
este convertit la tipul mai larg al celuilalt operand. Astfel n expresia de mai jos:
int i;
float f;
f + i operandul int este convertit n float.
Operatorii aritmetici convertesc automat operanzii la un anumit tip, dac operanzii
sunt de tip diferit. Se aplic urmtoarele reguli:
operanzii char i short int se convertesc n int; operanzii float se convertesc n
double.
dac unul din operanzi este double restul operanzilor se convertesc n double
iar rezultatul este tot double.
dac unul din operanzi este long restul operanzilor se convertesc n long , iar
rezultatul este tot long.
Denumirea Nr. octei Valori
char 1 octet cu semn -128127
unsigned char 1 octet fr semn 0255
19

dac unul din operanzi este unsigned restul operanzilor se convertesc n
unsigned , iar rezultatul este tot unsigned.
dac nu se aplic ultimele 3 reguli, atunci operanzii vor fi de tip int i rezultatul
de asemeni de tip int.



double float

long

unsigned

int char, short

Astfel n = c - 0 n care c reprezint un caracter cifr calculeaz valoarea ntreag a
acestui caracter.
Conversii implicite se produc i n cazul operaiei de atribuire, n sensul c valoarea
din partea dreapt este convertit la tipul variabilei acceptoare din stnga.
Astfel pentru declaraiile de ai jos:
int i;
float f;
double d;
char c;
sunt permise atribuirile:
i=f; // cu trunchierea prii fracionare
f=i; d=f; f=d; c=i; i=c;

Conversiile de tip explicite (cast).
Conversiile explicite de tip (numite i cast) pot fi forate n orice expresie folosind
un operator unar (cast) ntr-o construcie de forma:
(tip) expresie
n care expresia este convertit la tipul numit.
Operatorul cast are aceeai preceden cu a unui operator unar.
Exemplu:
Astfel funcia sqrt() din biblioteca <math.h> cere un argument double, deci va fi
apelat cu un cast: sqrt((double) n) pentru a calcula rdcina ptrat a lui n.

2.5 Variabile. Declararea variabilelor

O variabil este o dat care i poate modica valoarea pe parcursul execuiei
programului.
n limbajul C/C++, nainte de a utiliza o variabil, trebuie s o declarm. La
declarare, trebuie s specicm numele variabilei, tipul acesteia i, eventual, o valoare
iniial pe care dorim s o atribuim variabilei.

Formatul general al unei declaraii de variabile este:
tip nume_var
1
[=expresie
1
] [, nume_var
2
[=expresie
2
]...];
20


Observaii
1. Prin tip specicm tipul variabilelor care se declar.
2. Prin nume_var
1
, nume_var
2
, specicm numele variabilelor care se declar
(acestea sunt identicatori).
3. Se pot declara simultan mai multe variabile de acelai tip, separnd numele lor
prin virgul.
4. La declarare, putem atribui variabilei o valoare iniial, specicnd dup numele
variabilei caracterul '=' i o expresie de iniializare. Expresia trebuie s e
evaluabil n momentul declarrii.
5. Parantezele [] utilizate n descrierea formatului general au semnicaia c
elementul ncadrat ntre paranteze este opional (poate s apar sau nu ntr-o
declaraie de variabile).
Exemple
int a, b=3, c=2+4;
char z;
float x=b*2.5, y;
Am declarat trei variabile a, b i c de tip int, o variabil z de tip char i dou
variabile x i y de tip float. Variabilei b i-am atribuit valoarea iniial 3, variabilei c i-am
atribuit valoarea 6, iar variabilei x i-am atribuit valoarea 7. 5;
Variabilelor a, y i z nu le-am atribuit nicio valoare iniial la declarare.
Declararea unei variabile trebuie s precead orice referire la variabila respectiv
i poate plasat n interiorul unei funcii (n cazul nostru, al funciei main ( ) ) sau n
exteriorul oricrei funcii (n cazul nostru, n exteriorul funciei main ( ) ). Dac
declaraia este plasat n interiorul unei funcii, variabila se numete local funciei,
altfel se numete global.
Variabilele globale sunt automat iniializate cu 0; cele locale nu sunt iniializate.
La declararea variabilelor nu se admit iniializri multiple (produc eroare de
sintax):
Greit (deoarece variabilele b i c nu sunt nc
declarate)
int a=b=c=5;

Corect
int a, b, c;
a=b=c=5;
2.6. Definirea constantelor
Pentru definirea constantelor simbolice se folosete (n zona de preprocesare)
construcia:
#define nume valoare
sau folosind modificatorul const astfel:
const tip nume=valoare;

Exemplul:
#define PI 3.1415;
const float PI=3.1415;

2.7. Structura unui program C/C++. Comentariile
Orice program C/C++ este alctuit dintr-o succesiune de module (numite funcii ),una
dintre acestea fiind funcia principal numit main().

21

Forma general a unei surse n C/C++ este:
int main()
{
..// corpul funciei n care se vor scrie declaraiile i instruciunile care trebuie executate i care acum e vid
return 0;
}
Cnd execuia unui program se termin cu succes, n mod uzual, programul
returneaz la ncheierea execuiei valoarea 0.
Programul va conine i o serie de fiiere antet (headere) n cazul n care vrem
s folosim funcii standard din fiierele respective.
Zona de preprocesare apare n partea de sus a sursei i este introdus de
caracterul #. n aceast zon vor fi incluse fiiere antet (headere) din care vor fi
folosite funcii standard (pentru citire/scriere , prelucrri de date, funcii matematice,
etc.)
Exemplu:
# include <iostream.h> // am inclus fiierul antet iostream.h care conine funcii pentru
citire/scriere
Observaie:
Dac realizm noi fiiere pe care vrem s le includem n antet acestea vor fi
incluse ntre ghilimele ca de exemplu: # include fisierul_meu.cpp
n zona de preprocesare se pot defini i constante simbolice de forma:
# define PI 3.1415

Comentariile
Reprezint o succesiune de caractere pe care compilatorul (cel care transcrie
codul surs n limbaj main) nu le ia n considerare.
Exist n C/C++ dou tipuri de comentarii:
- pe mai multe linii cu marcajul /**/
- pe o singur linie (de la marcaj pn la sf. de linie) cu marcajul //
Sunt utilizate pentru a crete gradul de lizibilitate a programului i ajut utilizatorii
multiplii la nelegerea programului.


2.8 Expresii. Instruciunea de atribuire
Expresiile sunt formate din operanzi i operatori. Operanzii reprezint valorile care
intr n calculul expresiei iar operatorii desemneaz operaiile care se execut n
expresie.
n timpul execuiei unui program, la ntlnirea unei expresii calculatorul
evalueaz expresia astfel: se nlocuiesc variabilele cu valorile lor i se obine valoarea
expresiei.
Expresiile pot fi simple sau compuse (se grupeaz n paranteze rotunde).

Tipuri (clase) de operatori care pot s apar n expresii:

Operatorii aritmetici : +,-,*,/,%

22

Operatorul Tipul operaiei
+, - Semne (operatori unari)
*, /,% De multiplicitate (operatori binari)
+,- Aditivi (operatori binari)
Observaii:
Operatorul % se poate aplica numai datelor de tip ntreg.
Dac operatorul / se aplic cel puin unui operand de tip real atunci rezultatul
este real (idem pentru operatorii +,-,*)
Exemplu:
int a=5, b=2;
cout<<-a; // afieaz -5
cout<<a/b; // 2
cout<<(float)a/b; // 2.5
cout<<5/2.0; //2.5
Operatorii logici sunt de dou tipuri: logici globali i logici pe bii (sunt operatori binari
toi n afar de negaia logic i pe bii care sunt unari)
Operatori logici globali (&&, ||, !)





Observaie:
Operatorii logici globali se pot aplica datelor de orice tip standard, rezultatul
fiind ntotdeauna logic.
Exemplul 1: Exemplul 2: Exemplul 3: Exemplul 4: Exemplul 5: Exemplul 6:
int a=5,b=3;
if(a>0)
cout<<a; //5
else
cout<<b;
int a=5,b=3;
if (a)// a!=0
cout<<a; //5
else
cout<<b;
int a=5,b=3;
if(a&&b)
cout<<a+b;
//8
else
cout<<a-b;
int a=5,b=3;
if(a>0 && b<0) //1&&0==0
cout<<a+b;
else
cout<<a-b; //2
int a=5,b=3;
if(a>0 || b<0)
//1||0==1
cout<<a+b; //8
else
cout<<a-b;
int a=4;
cout<<(a<0)<<
<<!a<< <<
(a==4); // 0 0 1


Operatori logici pe bii (&, |, ~, ^)

i pe bii sau pe bii negaia pe bii sau exclusiv sau XOR




&& 0 !0=1
0 0 0
!0=1 0 1
!
0 1
!0=1 0
|| 0 !0=1
0 0 1
!0=1 1 1
& 0 1
0 0 0
1 0 1
^ 0 1
0 0 1
1 1 0
| 0 1
0 0 1
1 1 1
~
0 1
1 0
Exemplul & Exemplul | Exemplul ~
Exemplul ^
int a=10,b=5;
//a=1010
2
b=101
2
cout<<a&b; // 0
int a=10,b=6;
//a=1010
2
b =110
2

int a=10,b=5;
// a=1010
2
b=0101
2
// a|b= 1111
2
=15
cout<<a|b; // 15
int a=10,b=6;
int a=10;
cout<<~a;
// 32758

int a=10,b=5;
//a=1010
2
b=0101
2

//a^b= 1111
2
=15
cout<<a^b; // 15
int a=10,b=6;
23









Operatori relaionali (<,>,<=,>=,!=) se aplic datelor de tip standard i returneaz un
rezultat de tip logic.
Observaie: Negarea lui > este <=, negarea lui < este >=, negarea lui <= este >,
negarea lui >= este <.
Exemplu:
int a=5,b=3;
if(a>b) // a<b sau a>=b sau a<=b sau a!=b
cout<<a; //5
else
cout<<b;
Operatorul de egalitate (==)
Exemplu:
int a=5,b=5;
if(a==b)
cout<<Da; // Da
else
cout<<Nu;
Observaie: Operatorul == apare doar n expresii logice

Operatori de incrementare/decrementare ++,--

Au dou forme: prefix i postfix
Observaii:
Incrementarea (++) / decrementare(--) presupune modificarea cu o unitate a
valorii variabilei
la forma prefix variabila intr n expresie cu valoarea modificat pe cnd la
forma postfix variabila se modific n urma evalurii expresiei
operatorii de incrementare/decrementare nu pot fi aplicai expresiilor
++(a+b) // greit

Exemple:
int a=5;
cout<<++a<< <<a++; // a=a+1 =>6 6=>a=a+1=7
int b=3,c=4;
cout<<(a+b)-c++; // 10-4=6 =>c=5
cout<<(a+b)-(++c); // 10-5=5 =>c=5
int j=5, i=6;
cout<<a&b; //2 // a=1010
2
b=0110
2

// a|b= 1110
2
= 14
cout<<a|b; // 14
//a=1010
2
b=0110
2

//a^b= 1100
2
= 12
cout<<a^b; // 12
24

j=j+(++i); // j=5+7=12
cout<<j;
j=j+(i++); // j=12+7=19 i i=8
cout<<j;

Operatori de deplasare pe bii (<<, >>)

Sunt operatori binari care realizeaz deplasarea pe bii la stnga respective la dreapta
astfel:
a<<b (reprezint n baza 2 numrul a i l deplaseaz la stnga cu un numr de
poziii binare egal cu valoarea operandului din dreapta adic a lui b). Se va completa
irul n dreapta cu un numr de 0-uri egal cu valoarea lui b (b de 0).
Exemplu:
12
10
<<2=00000000 00001100
2
<<2=00000000 00110000
2
=1*2
4
+1*2
5
=48

12%2=0
6%2=0
3%2=1
1%2=1
0
Observaie: Matematic operaia de deplasare la stnga pe bii se transcrie:
a<<b=a*2
b

a>>b (reprezint n baza 2 numrul a i l deplaseaz la dreapta cu un numr de poziii
binare egal cu valoarea operandului din dreapta adic a lui b). Se va completa irul n
n stnga cu un numr de 0-uri egal cu valoarea lui b (b de 0).

Exemplu:
12>>3=00000000 00001100
2
>>3=00000000 00000001
2
=1*2
0
=1

12%2=0
6%2=0
3%2=1
1%2=1
0
Observaie: Matematic operaia de deplasare la dreapta pe bii se transcrie:
a>>b=[a/2
b
]

Operatorul condiional (?:)
expresie1 ? expresie2 : expresie3
Efect: se evalueaz expresie1, dac rezultatul logic este adevrat (1) se execut
expresie2 altfel se execut expresie3.

Exemplu:
int x=-4;
cout<<(x<0 ? -x : x); // afieaz modulul lui x

25

Exemplu:
int a=4,b=2;
cout<<(a>b ? a : b); // afieaz maximul dintre valorile a i b

Operatorul referenial (&)
Efect: se utilizeaz pentru a obine adresa de memorie la care este salvat o variabil
Exemplu:
int a;
cout<<&a; // rezultatul este un numr n baza 16 reprezentnd adresa de memorie a lui a

Operatorul pentru determinarea spaiului de memorie ocupat (n octei)- are dou
forme: sizeof(tip) i respectiv sizeof(variabil)
Exemplu:
int a=20;
cout<<sizeof(int)<<endl; // 2 (reprezentnd spaiul ocupat n memorie)
cout<<sizeof(a); // 2 (reprezentnd spaiul ocupat n memorie)

Operatorul de conversie explicit (tip)
Efect: este utilizat pentru conversia forat a unei variabile sau expresii la un tip
standard tip
Exemplu:
float c;
int a=5,b=6;
c=(a+b)/2;
cout<<c; // 5 rezultat de tip ntreg
c=(float)(a+b)/2;
cout<<c; // 5.5
c=(a+b)/2.0;
cout<<c; // 5.5

Operatorul , (virgul)
Sintaxa: expresie
1
, expresie
2
,, expresie
n

Rezultatul aplicrii operatorului const n evaluarea expresiilor de la stnga la dreapta,
valoarea final a expresiei fiind valoarea ultimei expresii evaluate.
Exemplu:
int i, a, b;
i=0, b=i+2, a=b*2 // valoarea expresiei este 4

Evaluarea oricrei expresii se realizeaz astfel: dac exist paranteze rotunde
se vor evalua ncepnd cu cea mai din interior (spre exterior). Dac nu exist
paranteze rotunde evaluarea se va face n funcie de prioritatea operatorilor iar la
prioritate egal n funcie de asociativitate.

Prioritate Operator Asociativitate
1 ! ~ + - (semne) ++ -- (typecast) sizeof & (referenial) dreapta -> stnga
2 */ % stnga -> dreapta
3 + - (op aditivi) stnga -> dreapta
4 << >> stnga -> dreapta
26

5 < > <= >= stnga -> dreapta
6 != == stnga -> dreapta
7 & (logic pe bii) stnga -> dreapta
8 | stnga -> dreapta
9 && (logic global) stnga -> dreapta
10 || stnga -> dreapta
11 ?: dreapta -> stnga
12 +=, -=,*=,/=,%=,&=,|=,!=,<<=,>>= dreapta -> stnga
13 , (virgul) stnga -> dreapta

Instruciunea de atribuire are sintaxa:
identificator_variabil = valoare
Unde identificator_variabil este numele variabilei iar valoare (care poate fi constant,
variabil sau expresie ) trebuie s aib tipul compatibil cu cel al variabilei pentru a
putea efectua atribuirea.
Efect: Variabilei identificator_variabil i se va atribui valoarea valoare.

Exemplu:
int a=3,b=5,c=7;
c=(a>=b); // c=0 i se numete atribuire cu sens logic
c=(a*b-c); // c= 15
n C/C++ se admit atribuiri multiple de forma:
identificator_variabil
1
= identificator_variabil
2
==valoare
ntr-o astfel de atribuire, atribuirile se realizeaz de la dreapta la stnga.

Observaie:
Atribuirile nu se admit n declarare de variabile.

Exemplu:
int a=b=c=5; // greit deoarece b i c nu sunt declarate

Exemplu:
int a=2, x, y, z;
x=(y=a-1)=z=a;
Se va efectua datorit parantezelor atribuirea y=1 iar apoi se vor efectua atribuirile
multiple de la stnga la dreapta: x=y=z=2

Instruciunea de atribuire poate avea i formele:
identificator_variabil operator =expresie
identificator_variabil = identificator_variabil operator expresie
Unde operatorul poate fi: +, -, *, /, %, <<, >>

Exemplu:
int a=7;
a+=5 ; // a=a+5 a=12

2.9 Citirea i afiarea datelor (operaii de intrare/ieire)
27

Exist citire i scriere cu i fr format. n continuare ne vom referi la citirea i
scrierea fr format (din C++).
Fluxul de intrare a datelor este cin-console input (de la tastatur) iar operatorul de
extragere care preia datele de intrare i le salveaz n variabile este >>.
Sintaxa: cin>>id_variabil;
Fluxul de ieire a datelor este cout-console output (pe monitor) iar operatorul de
inserie de date n fluxul se ieire este <<.
Sintaxa: cout<<expresie;
Citirea i scrierea de date este gestionat din fiierul antet iostream.h
Observaie:
Citirea datelor de la tastatur se face cu caractere albe (spaiu, tab) pe care
operatorul >> le ignor.
Att citirea ct i scrierea datelor se poate face nlnuit dup cum se poate
observa n exemplul de mai jos:

Exemple:
// 3 numere ntregi citite/ afiate unul dup altul
int a,b,c;
cin>>a>>b>>c; // De ex: 7 12 34 \n
cout<<a<< <<b<< <<c; // se vor afia valorile 7 12 34 (cu spaiu ntre ele)
// 3 numere ntregi citite separat, cu spaiu ntre ele
int a,b,c;
cout<<a=;
cin>>a; // a= 7 \n
cout<<b=;
cin>>b; // b=12 \n
cout<<c=;
cin>>c; // c=34 \n
cout<<a<<b<<c; // se vor afia valorile 71234 (fr spaiu ntre ele)
// afiez valoarea din variabila b
cout<<Valoarea variabilei b este: <<b;
// Va afia pe ecran -> Valoarea variabilei b este: 12

2.10 Structuri de control (Structura liniar, Structura alternativ, Structura
repetitiv)

Conform teoremei de structur a lui Bohm-Jacoppini exist 3 structuri de control
Structura liniar se transcrie n C/C++ prin dou instruciuni:
1. Instruciunea de atribuire care are sintaxa:
identificator_variabil = valoare
Unde identificator_variabil este numele variabilei iar valoare (care poate fi
constant, variabil sau expresie ) trebuie s aib tipul compatibil cu cel al
variabilei pentru a putea efectua atribuirea.
Efect: Variabilei identificator_variabil i se va atribui valoarea valoare.
Exemplu:
28

int a=3,b=5,c=7;
c=(a>=b); // c=0 i se numete atribuire cu sens logic
c=(a*b-c); // c= 15

n C/C++ se admit atribuiri multiple de forma:
identificator_variabil
1
= identificator_variabil
2
==valoare
ntr-o astfel de atribuire, atribuirile se realizeaz de la dreapta la stnga.
Exemplu:
int a=2, x, y, z;
x=(y=a-1)=z=a;
Se va efectua datorit parantezelor atribuirea y=1 iar apoi se vor efectua atribuirile
multiple de la stnga la dreapta: x=y=z=2

Instruciunea de atribuire poate avea i formele:
identificator_variabil operator =expresie
identificator_variabil = identificator_variabil operator expresie
Unde operatorul poate fi: +, -, *, /, %, <<, >>
Exemplu:
int a=7;
a+=5 // a=a+5 a=12

2. Instruciunea compus care are sintaxa:
{
instr_1;

instr_n;
}
Observaie : instruciunea compus se utilizeaz atunci cnd ntr-o instruciune de
decizie sau repetitiv o ramur conine mai mult de o instruciune.

Exemplu:
.
int a,b,c;
if(a>b) // dac rezultatul evalurii expresiei logice este adevrat
{ // trebuie executate dou atribuiri (grupate ntr-o instruciune compus)
a=a+b;
c=a+b;
}
else
cout<<Nimic;
Structura alternativ se transcrie n C/C++ prin dou instruciuni:
1. Instruciunea de decizie simpl (transcrie din pseudocod instruciunea dac
atunci)
Sintaxa:
if (expresie)
29

instr1;
[ else opional
instr2;]
Instruciunea evalueaz expresia logic, dac este adevrat (1) execut intr1 iar dac
nu execut instr2 dac ramura de altfel este prezent iar n caz contrar nu execut
nimic.

Exemplu 1: Determinarea valorii maxime dintre 2 valori ntregi a i b citite (cu ramur
de else)

int a,b;
cin>>a>>b;
if (a>b)
cout<<a;
else
cout<<b;

Exemplul 2: Determinarea valorii maxime dintre 2 valori ntregi a i b citite (fr
ramur de else)

int a,b,max;
cin>>a>>b;
max=a;
if (max<b)
max=b;
cout<<max;

Observaie:
ntotdeauna ramura de else dac exist se va asocia celui mai din interior if.
Exemplu: Evitarea unei asocieri nedorite pentru ramura de else se poate realiza n
dou moduri:

cu ramur de else vid cu instruciune compus


int a,b,c;
cin>>a>>b>>c;
if(a>b)
if(b>c)
cout<<a;
else; //instr. vid nu execut nimic
else
cout<<a este mai mic dect b;



int a,b,c;
cin>>a>>b>>c;
if(a>b)
{
if(b>c)
cout<<a;
}
else
cout<<a este mai mic dect b;
2. Instruciunea de decizie multipl (switch)
30

Se utilizeaz atunci cnd decizia se ia n urma evalurii mai multor expresii (i este
unic)
Sintaxa
switch (expresie)
{
case constanta_1: instr_1;break;

case constanta_n : instr_n;break;
[default: instr;]
}
Observaii:
expresie nu poate avea alt tip dect ntreg sau character.
constantele pot s se gseasc n valoarea expresiei sau nu
caz n care se execut instruciunea de pe ramura default (dac exist , altfel
nu se execut nimic)
dac instruciunea break (ieire necondiionat) nu exist atunci se vor
executa toate instruciunile de la prima constant egal cu valoarea expresiei.
Structura repetitiv se transcrie n C/C++ prin 3 instruciuni:
Instruciuni repetitive
- cu numr necunoscut de pai
cu test iniial ( while)
cu test final (dowhile)
Instruciunea while
Sintaxa: while(condiie)
[ { ]
instruciuni;
[ } ]
Execuie: Se verific la fiecare pas condiia i dac dac rezultatul logic este 1
(TRUE) se vor executa n ordinea n care apar instruciunile iar n caz contrar se iese
din repetitiv.
Observaii:
- instruciunea while poate s nu se execute niciodat dac valoarea de adevr a
condiiei este 0.
- dac n corpul instruciunii while avem mai mult de o instruciune, aceste se
grupeaz ntr-o instruciune compus
Instruciunea dowhile
Sintax: do
{
31

instruciuni;
} while(condiie);
Execuie: Se vor executa n ordinea n care apar instruciunile apoi se verific
condiia i dac rezultatul logic este 1 (TRUE) se continu cu execuia instruciunilor
iar n caz contrar se iese din repetitiv.
Observaie: Diferena ntre repetitive cu test iniial i cea cu test final este aceea c
repetitiva cu test final se execut ntotdeauna cel puin o dat.


Instruciune repetitiv cu numr cunoscut de pai (for)
Sintaxa: for(expresie1;expresie2;expresie3)
[ { ]
instruciuni;
[ } ]
Efect:
- se va evalua o singur dat la intrarea n repetitiv expresie 1
- expresie2 constituie condiia de ieire din repetitiv (este o expresie logic)
- expresie3 modific valoarea contorului pentru a asigura ieirea din repetitiv (de
obicei)
Observaii: expresiile din for pot lipsi, n schimb caracterul ; e obligatoriu
Exemplu:
for(;;); // cicleaz la infinit
Exemplu:
for(i=1,j=2;;); // iniializeaz cu 1 pe i i cu 2 pe j i cicleaz la infinit
for(i=1,j=2;i<n;i=i+2);// i=7 , n=6 1,3,5,7 , j=2
// i=5 , n=5 1,3,5, j=2
Exemplu

s=0; s=0;
for(;x!=0;x=x/10) // realizeaz suma cifrelor lui x while(x!=0)
s=s+x%10; {
s=s+x%10;
x=x/10;
}
Exemplu
for(s=0;x!=0;s=s+x%10,x=x/10); // realizeaz suma cifrelor lui x
Aplicaii:
1) Se considera n numr natural. Calculai i afiai numrul de cifre.
32













Subprograme (Funcii)
2 tipuri:
- returneaz un rezultat
- calculeaz mai multe valori, nu returneaz nimic
Sintaxa:
tip identificator_fc( [lista de parametri formali] )
{
Return expresie; // expresie are tipul tip
}
Lista de p.f : tip id_var,, tip id_var
Apelul funciei:
- se face n interiorul unei expresii de forma:
variabil=id_fc([lista de parametri efectivi]);
sau cout<< id_fc([lista de parametri efectivi]);

lista de parametri efectivi: id_var1,,id_varn


33






Sintaxa:
Void identificator_fc( [lista de parametri formali] )
{

}
Lista de p.f : tip id_var,, tip id_var
Apelul funciei:
Id_fc([list de parametri efectivi]);




1) int suma(int n)
{
int s=0;
While(n!=0)
{
s=s+n%10;
n=n/10;
}
return s;
}



void suma(int n)
{
int s=0;
While(n!=0)
{
s=s+n%10;
n=n/10;
}
cout<<s;
}
apelul n main
suma(n);
34

apelul n main
int sum=suma(n);
sau
cout<<suma(n);







Transmiterea parametrilor:
- prin valoare(se poate modifica parametrul n interiorul funciei, la ieire se
revine la valoarea iniial)
- prin referin( se modific valoarea de la adresa stabilit a parametrului, la
ieire valoarea modificat rmne)
void suma(int n, int &s)
{
While(n!=0)
{
s=s+n%10;
n=n/10;
}
}
apelul n main
int s=0;
suma(n,s);

cout<<setw(4)<<a[i][j];
cout<<setprecision(2)<<a[i];
35

a[i] *(a+i) a&a[0]
Tipul pointer
Am nvat nc din clasa a IX-a, c o variabil este o dat caracterizat prin trei
atribute: tip, valoare i adres. Primele dou atribute au fost foarte ntlnite pn
acum. Atributul "adres" va face obiectul noiunilor din acest capitol. Pentru nceput,
considerm un exemplu foarte simplu, o variabil de tip ntreg care se declar astfel:
int x; // se rezerv n memorie 2 octei
Toate variabilele unui program sunt memorate n aa-numita memorie intern
RAM. Aceasta este mprit n nite "csue", numite locaii de memorie sau celule de
memorie. Fiecare locaie reprezint un octet i se caracterizeaz printr-o anumit
adres. Adresele locaiilor de memorie sunt numere exprimate n (baza 16).
n urma declarrii unei variabile, se rezerv pentru aceasta un numr de octei
succesivi n memoria intern RAM (locaii succesive), numr care depinde de tipul
variabilei i de implementare.
Spaiul de memorie alocat unei variabile rmne ocupat pe toat durata
programului sau subprogramului (funciei) n care a fost declarat variabila. O astfel de
variabil se numete "variabil alocat static", iar procesul de rezervare de memorie
este de ctre compilator i se numete "alocare static a memoriei".
De ce se aloc memorie pentru variabila x declarat mai sus?
Dup declarare, variabila x poate primi ca valori numere ntregi, prin atribuire sau
prin citire. n momentul n care variabila a primit o valoare, acea valoare va
memorat n zona de memorie alocat variabilei.
O alt posibil declarare a variabilei x este urmtoarea: declaram o variabil x
care va conine adresa de memorie a unui numr ntreg ( valoarea variabilei x va
adresa la care se va depozita numrul ntreg n memoria RAM
Variabila x se numete pointer ctre un ntreg sau referin ctre un ntreg.
Firete c tipul de date al variabilei x nu va mai int, ci un tip de date numit tipul
pointer ctre un ntreg sau tipul referin ctre un ntreg; acesta se declar astfel:
int *x; // x este un pointer ctre un ntreg

Caracterul * reprezint operatorul de adresare, este un operator unar, adic se
aplic unui singur operand.

Observaie:
Operatorul de adresare este identic ca i scriere cu cel de nmulire dar compilatorul nu
va face confuzie deoarece operatorul de nmulire este binar.

Sintaxa de declarare pointerilor este:
tip *identificator
1
,*identificator
2
,* identificator
n
;
unde tip este tipul de date pe care-I refer pointerii iar identificator
1
,identificator
2
,
identificator
n
sunt identicatorii variabilelor de tip pointer

Exemple:
float *a, *b; // a i b sunt pointeri ctre tipul float (pointeri ctre numere reale)
char *c ; // c este pointer ctre tipul caracter
36



Dac pointerul x conine adresa unui numr, numrul se va memora efectiv ntr-o
"variabil pereche" (*x) pe care o creeaz automat compilatorul cnd declarm
pointerul x. "Perechea" *x se numete variabil alocat dinamic.

adreseaz
x *x

adresa numrului ntreg numrul ntreg (variabila alocat dinamic)
(pointer ctre numr)

Caracteristicile fundamentale ale unei perechi "pointer - variabila alocat dinamic":
n seciunea de declaraii vom deni un pointer care ulterior va conine adresa
unei variabile alocat dinamic;
Pentru variabila alocat dinamic vom rezerva memorie prin program,n momentul
folosirii efective a variabilei, iar atunci cnd variabila nu mai este necesar vom
elibera zona de memorie ocupat (folosirea eficient a memoriei).
Observaie:
n timpul execuiei unui program, s-ar putea ca un pointer s memoreze adresa unei
locaii de memorie "goal", n care nu se gsete nicio valoare. n acest caz vom
spune c valoarea sa este NULL. Acest NULL reprezint de fapt valoarea "0 binar"
simbolizat printr-o constant predenit a limbajului, cu sensul de "nimic" (nul), i
poate atribuit numai variabilelor de un tip pointer.

Alocarea i eliberarea dinamic a memoriei

Alocarea memoriei pentru o variabila referit de un pointer, sau pe scurt alocarea
dinamic a memoriei, se realizeaz n program nainte de utilizarea efectiv a
variabilei, iar dup ce aceasta nu mai este necesar trebuie s eliberam memoria
ocupat.
n C++ alocarea i eliberarea memoriei se poate face n dou moduri:
1. Cu ajutorul funciilor malloc respectiv free (specice componentei C standard);
2. Cu operatorii identicai prin cuvintele cheie new respectiv delete (specici
extensiei "++" a limbajului).

1. Alocarea i eliberarea memoriei cu malloc i free

Sintaxa: identificator_pointer=(tip*)malloc(dimensiune);
Unde:
identificator_pointer este numele pointerului;
tip este tipul de date spre care trimite pointerul;
dimensiune este dimensiunea spaiului de memorie (exprimat n numr de octei)
necesar pentru memorarea variabilei pereche spre care trimite pointerul.

Exemplu:
Fie un pointer x ctre ntreg, declarat astfel:
37

int *x; // se declar dar nu i se rezerv automat spaiu n memorie pentru perechea *x
x=(int*) malloc(2); // se aloc 2 octei
Pentru a evita orice incertitudini cu privire la mrimea spaiului de memorie
necesar pentru memorarea valorilor de un anumit tip, este recomandabil s folosim
operatorul sizeof.
Astfel alocarea de memorie de mai sus devine:
x=(int*) malloc(sizeof(int));

Observaie:
Chiar dac n instruciunea de alocare apare pointerul x, se aloc memorie
pentru variabila ataat *x, i nu pentru pointerul x.

Eliberarea spaiului de memorie ocupat de variabila referit prin pointerul
identificator_pointer este:
free(identificator_pointer);

2. Alocarea i eliberarea memoriei cu new i delete

Alocarea de memorie se face astfel:
identificator_pointer= new tip;
Eliberarea spaiului de memorie se face astfel:
delete identificator_pointer;

Exemplu:
int *x; //se declar dar nu i se rezerv automat spaiu n memorie pentru perechea *x
x= new int; // se aloc 2 octei
delete x; // elibereaz spaiul de memorie alocat mai sus cu new

Observaie:
Variabilele referite prin pointeri pot folosite la fel ca i variabilele alocate static n
operaii de citire, afiare, expresii, etc.
Exemplu:
Calculul ariei unul triunghi folosind pointeri: se consider doi pointeri b i h referind
valorile bazei i nlimii unui triunghi. Calculai i afiai aria triunghiului.
#include<iostream.h>
void main()
{
int *b,*h;
float *A;
b=new int;
h=new int;
A=new float;
cout << "Dati baza si inaltimea triunghiului: ;
cin >> *b >> *h;
*A=(*b**h) /2.0;
cout << \nAria triunghiului este: " << *A;
delete b;
delete h;
delete A;
38

return 0;
}
Adresa unei variabile alocat static. Operatorul &
O variabil alocat static x, de tipul int, va putea primi ca valoare un numr
ntreg. n felul acesta accesm direct valoarea i nu adresa variabilei.
Un pointer x ctre ntreg (de tipul int *) va conine adresa unui ntreg (iar ntregul
se va memora n *x). Astfel, avem acces direct la adresa ntregului.
Pentru o variabil alocat static putem determina adresa sa folosind operatorul
&. Astfel, adresa unei variabile x alocat static (adresa de memorie la care se va
depozita valoarea variabilei este &x).
Exemplu:
int a;
int *x;
a=5;
x=&a;
cout<<*x; // se va afia valoarea 5
Observaie:
Nu s-a alocat i nici eliberat memoria pentru pointerul x pentru c este exact
zona de memorie ocupat de variabila a care se elibereaz la sfritul execuiei
programului.

You might also like