Sunteți pe pagina 1din 41

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
1

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)

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 ntrun 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

ALGORITM

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

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:
4

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

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
6

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

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.
I.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 opera iile
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.
8

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 variabila1, variabila2, ..., variabilan;
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 expresie1, expresie2, ..., expresien;
Efect: Operaia de scriere (denumit i opera ie de ie ire) 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.
9

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 timp
execut;
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.

10

- 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

11

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 contorexpresie1, expresie2 ,[pas] execut
Instruciune
Sf. pentru
Efect:
Pas 1: Se evalueaz expresie1.
Pas 2: Se atribuie variabilei contor valoarea expresiei expresie1.
Pas 3. Se evalueaz expresie2.
Pas 4: Dac valoarea variabilei contor este mai mare/mic (n funcie de valoarea
pas, adic pozitiv sau negativ) dect valoarea expresiei expresie2, atunci se
iese din instruciunea repetitiv. Dac valoarea variabilei contor este mai
mic/mare sau egal cu valoarea expresiei expresie2, 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 pa i poate simulat cu
ajutorul celorlalte dou instruciuni repetitive.
Executarea repetat a unei instruciuni, controlat de valoarea unei expresii,
reprezint o structur repetitiv.

13

II.
2.1

Elemente de baz ale limbajului C/C++

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 tehnicotiinifice 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.2

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

Exemple:
a=097
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 //
15

Sunt utilizate pentru a crete gradul de lizibilitate a programului i ajut


utilizatorii multiplii la nelegerea programului.

2.3

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)

16

\\

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

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

O dat este orice entitate cu care poate opera calculatorul.


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 : +, -, *, /, %
17

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 (&&, ||, !)

&&
0
!0=1

0
0
0

!0=1
0
1

!
0
!0=1
||
Operatorii 0
orice tip !0=1

Observaie:
datelor de
ntotdeauna logic.
Exemplul 1:

Exemplul 2:

int a=5,b=3;
int a=5,b=3;
if(a>0)
if (a)// a!=0
cout<<a; //5
cout<<a; //5
else
else
cout<<b;
cout<<b;

!0=1

1
0
0
1

1
1

logici globali se pot aplica


standard, rezultatul fiind

Exemplul 3:

Exemplul 4:

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

Exemplul 5:
int a=5,b=3;
if(a>0 || b<0)

Exemplul 6:
//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
&
0
1

0
0
0
|
0
1

sau pe bii

0
1
0
1

0
1

1
1

^
0
1

0
0
1

1
1~
00
1

negaia pe bii
1
0

18

sau exclusiv sau XOR

Exemplul &
int a=10,b=5;
//a=10102 b=1012
cout<<a&b; // 0
int a=10,b=6;
//a=10102 b =1102
cout<<a&b; //2

Exemplul |

Exemplul ~

int a=10,b=5;
// a=10102 b=01012
// a|b= 11112=15
cout<<a|b; // 15
int a=10,b=6;
// a=10102 b=01102
// a|b= 11102= 14
cout<<a|b; // 14

int a=10;
cout<<~a;
// 32757

Exemplul ^
int a=10,b=5;
//a=10102
b=01012
//a^b= 11112=15
cout<<a^b; // 15
int a=10,b=6;
//a=10102
b=01102
//a^b= 11002= 12
cout<<a^b; // 12

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

Tipuri standard de date. Conversii implicite i explicite

1 Tipul ntreg
Denumirea
int

Nr. octei
2 octei cu semn

Valori
-32768..32767

Obs.
00000000000000002 =010
11111111111111112=3276710

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
19

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
2 Tipul real
Denumirea

Nr. octei - n
Valori
virgul mobil
4 octei
[3.4*10-38,3.4*1038]U [-3.4*10+38,-3.4*10-38]
8 octei
[1.7*10-308,1.7*10308]U [-1.7*10+308,-1.7*10-308]
10 octei
[3.4*10-4932,1.1*104932]U [-3.4*10+4932,-1.1*10-4932]

float
double
long double

3) Tipul caracter
Denumirea
char
unsigned char

Nr. octei
1 octet cu semn
1 octet fr semn

Valori
-128127
0255

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
char

Tip la care se convertete implicit


int, short int, long int

short int

char
(cu trunchiere)
short int (cu trunchiere)
long int (cu extensia semnului)
ca i int

long int

ca i int

float

double, int, short int, long int

double

float, int, short int, long int

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

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

2.6

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_var1 [=expresie1] [, nume_var2 [=expresie2]...];
Observaii
1. Prin tip specicm tipul variabilelor care se declar.
2. Prin nume_var1, nume_var2, 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 ntro 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

Corect
int a, b, c;
a=b=c=5;

(deoarece variabilele b i c nu sunt nc

declarate)

int a=b=c=5;
2.6. Definirea constantelor
22

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

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 : +,-,*,/,%
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 (&&, ||, !)

&&
0
!0=1

0
0
0

!0=1
0
1

!
0
!0=1
||
0
!0=1
logici

!0=1

1
0

0
1
Observaie:
1
1
Operatorii
globali se
datelor de orice tip standard, rezultatul fiind ntotdeauna logic.
Exemplul 1:

Exemplul 2:

int a=5,b=3;
int a=5,b=3;
if(a>0)
if (a)// a!=0
cout<<a; //5
cout<<a; //5
else
else
cout<<b;
cout<<b;

Exemplul 3:

Exemplul 4:

int a=5,b=3;
if(a&&b)
cout<<a+b; //
8
else

int a=5,b=3;
if(a>0 && b<0) //1&&0==0
cout<<a+b;
else
cout<<a-b; //2
24

pot

Exemplul 5:
int a=5,b=3;
if(a>0 || b<0)

aplica
Exemplul 6:

//1||

0==1

cout<<a+b; //
8
else

int a=4;
cout<<(a<0)<<
<<!a<< <<
(a==4); // 0 0 1

cout<<a-b;

cout<<a-b;

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


i pe bii
&
0
1

0|
00
01

sau pe bii
10
00
11

1
1
1

Exemplul &
int a=10,b=5;
//a=10102 b=1012
cout<<a&b; // 0
int a=10,b=6;
//a=10102 b =1102
cout<<a&b; //2

^
0
1

negaia pe bii
0
0
1

1
~1
00
1

sau exclusiv sau XOR

1
0

Exemplul |

Exemplul ~

int a=10,b=5;
// a=10102 b=01012
// a|b= 11112=15
cout<<a|b; // 15
int a=10,b=6;
// a=10102 b=01102
// a|b= 11102= 14
cout<<a|b; // 14

int a=10;
cout<<~a;
// 32758

Exemplul ^
int a=10,b=5;
//a=10102
b=01012
//a^b= 11112=15
cout<<a^b; // 15
int a=10,b=6;
//a=10102
b=01102
//a^b= 11002= 12
cout<<a^b; // 12

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
25

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;
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:
1210<<2=00000000 000011002 <<2=00000000 001100002=1*24+1*25=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*2b
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 000011002 >>3=00000000 000000012=1*20=1
26

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/2b]
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

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
27

Operatorul , (virgul)
Sintaxa: expresie1, expresie2,, expresien
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 func ie de prioritatea
operatorilor iar la prioritate egal n func ie de asociativitate.
Prioritat
e
1
2
3
4
5
6
7
8
9
10
11
12
13

Operator

Asociativitate

! ~ + - (semne) ++ -- (typecast) sizeof & (referenial)


*/ %
+ - (op aditivi)
<< >>
< > <= >=
!= ==
& (logic pe bii)
|
&& (logic global)
||
?:
+=, -=,*=,/=,%=,&=,|=,!=,<<=,>>=
, (virgul)

dreapta -> stnga


stnga -> dreapta
stnga -> dreapta
stnga -> dreapta
stnga -> dreapta
stnga -> dreapta
stnga -> dreapta
stnga -> dreapta
stnga -> dreapta
stnga -> dreapta
dreapta -> stnga
dreapta -> stnga
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_variabil1 = identificator_variabil2 ==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:
28

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)

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
29

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:
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_variabil1 = identificator_variabil2 ==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:
.
30

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)
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:
31

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)


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;
[}]
32

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
{
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
33

Exemplu

s=0;
for(;x!=0;x=x/10)
s=s+x%10;

// realizeaz suma cifrelor lui x

s=0;
while(x!=0)
{
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.

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
34

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

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)

n=n/10;

int s=0;

return s;

While(n!=0)

{
s=s+n%10;
35

n=n/10;
void suma(int n)

cout<<s;

int s=0;

While(n!=0)

apelul n main

suma(n);

s=s+n%10;

36

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];
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 *identificator1,*identificator2,* identificatorn;
unde tip este tipul de date pe care-I refer pointerii iar identificator 1,identificator2,
identificatorn 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

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
adresa numrului ntreg
(pointer ctre numr)

*x
numrul ntreg (variabila alocat dinamic)

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:
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;
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.

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