Sunteți pe pagina 1din 60

Limbajul de programare C / C++

Limbajul C creat n 1972 la Bell Laboratories , avnd ca obiectiv principal dezvoltarea unui
limbaj care s fie utilizat pentru implementarea sistemului de operare UNIX.
Caracteristici:
- produce programe eficiente
- portabil
- set puternic de operatori
- flexibilitate n programare
- ofer faciliti specifice limbajelor de asamblare
- limbaj de programare structurat
Limbajul C++ - extensie a limbajului C -permite programarea orientat spre obiecte (obiectual)

Obiect - entitate ce cuprinde

datele
procedurile ce opereaz cu ele

programele sunt create ca o colecie de obiecte ce


interacioneaz, n loc de liste de instruciuni sau apeluri de proceduri.

Structura programelor C++


Program C++ conine una sau mai multe funcii.
Funcie - seciune de program construit folosind:

declaraii de variabile
instruciuni de prelucrare

poate ntoarce un rezultat sau nu.

de tip ntreg, real, etc

tip void

main( )funcia rdcin, este prezent n orice program C i execuia programului ncepe
automat cu ea. Ea poate ntoarce un rezultat ntreg (int) sau nici un rezultat (void).
Cel mai simplu program C++

Programul este corect, dei nu execut nimic.


Pornind de la el, scriem orice program,
adugnd instruciuni ntre cele dou acolade
(corpul funciei). Cele dou paranteze rotunde
() se ataeaz oricrei funcii. ntre ele se scriu
opional anumii parametrii.

void main()
{
}
1

Obs:
1) Este permis ca tipul funciei s lipseasc:
main( )
{
}
n acest caz se presupune c funcia ntoarce un rezultat ntreg i la compilare, deoarece ea nu
ntoarce nici un rezultat, se va primi un avertisment.
2) n exemplul urmtor:
Main( )
{
}
programul va da eroare de sintax deoarece limbajul face distincie ntre litere mari i mici.
3) Urmtoarele exemple sunt corecte i identice (nu are importan nici plasarea cuvintelor pe linie,
nici spaiile dintre ele):
main(

{}

main ( )
{

main ( )

{
}

Vocabularul limbajului C++

1.

Setul de caractere - ansamblul de caractere cu ajutorul crora se poate realiza un program

C++. Acestea sunt:


litere mici i mari ale alfabetului englez (A - Z, a z )
cifrele sistemului de numeraie n baza 10 ( 0 9)
caractere speciale ! " # % & ' ( ) * + , - . / : ; _ < = > ? [ ] \ ^ { } | ~ @
blank (spaiu)

2.

Identificatori i cuvinte cheie (rezervate) o succesiune de litere, cifre sau caracterul

underscore ( _ ) cu restricia ca primul caracter s nu fie cifr. Cu ajutorul lor se asociaz nume
constantelor, variabilelor, funciilor, etc.
Exemplu: i, j1, un_numar, _id

3.

Contraexemplu: a#b, 1ab, xy&, -plus

Separatori i comentarii
delimiteaz unitile lexicale
dintr-un program:

sunt ncadrate de caracterele /* i */


sau ncep dup dou caractere /.

()

Ex:

{}

/* comentariu scris

[]

pe doua linii*/

""

// comentariu scris pe o singura linie

''

Citirea datelor de la tastatur i afiarea lor pe ecran


n C++, pentru a efectua afiri pe ecran i citiri de la tastatur, naintea funciei main, trebuie
inclus fiierul antet <iostream.h> prin directiva:
#include<iostream.h>

se solicit ca programul s includ

provine de la:

i - input

un fiier antet (header) numit iostream,

o - output

cu informaii referitoare la scrieri/citiri.

stream - flux de date


.h - fiierele antet au prin
convenie extensia .h

Obs:
Dup editarea fiierului surs, pentru a obine un program executabil trebuie parcurse etapele:
editare fiier surs ----------------------> fiier obiect ------------------------> fiier executabil
.CPP
compilare
.OBJ
linkeditare
.EXE

transform un program scris ntr-un limbaj


de programare compilabil (ex. C, C++) n
cod obiect. n procesul de compilare se
verific corectitudinea lexical i sintactic
a programului (dac exist erori de sintax,
acestea se semnaleaz).

realizeaz legtura fiierului


obiect cu alte fiiere sau cu
bibliotecile de funcii.

Pentru a realiza citirile folosim cin>> . Forma general este:


cin>>a1>>a2>>...>>an;
unde a1, a2, ., an sunt variabile de un tip oarecare.

Pentru realizarea scrierii se utilizeaz: cout<< . Forma general este:


cout<<a1<<a2<<...<<an;
unde a1, a2, ., an sunt variabile sau constante

Obs: cin
cout

console input
console output.

Ex nr.1:
#include<iostream.h>
/* functia main este functia principala, cu care
incepe executarea programului */
void main( )
{
/* Urmeaza instructiunea prin care se
afiseaza un text */
cout<<"Prima aplicatie!";
} // sfarsitul functiei main

Ex nr.2 (Program care citete un numr ntreg i-l tiprete) :


#include <iostream.h>
void main()
{
int a;
cout<<citeste numarul; cin>>a;
cout<<numarul citit este<<a;
}

Tipuri de date
Orice variabil, nainte de a fi utilizat, trebuie declarat prin precizarea tipului ei.
tip de date

o mulime de valori pe care sunt definite anumite operaii.

O declaraie de variabile are formatul:


tip lista_de_nume ;
unde lista_de_nume se compune din unul sau mai multe nume de variabile separate prin virgul.

Limbajul C++ conine urmtoarele tipuri standard (cunoscute de ctre limbaj fr a fi definite n
cadrul programului):
Tipuri ntregi:
1. unsigned char caracter fr semn - ocup 8 bii i ia valori ntre 0 i 28 - 1
2. char caracter - ocup 8 bii i ia valori ntre -27 i 27 - 1
3. unsigned int ntreg fr semn - ocup 16 bii i ia valori ntre 0 i 216 - 1
4. int ntreg scurt - ocup 16 bii i ia valori ntre -215 i 215 - 1
5. unsigned long ntreg lung fr semn - ocup 32 de bii i ia valori ntre 0 i 232 - 1
6. long - ntreg lung cu semn - ocup 32 de bii i ia valori ntre - 231 i 231 - 1
Tipuri reale:
Variabilele de tip real rein numere cu zecimale. n locul virgulei, n C++ se folosete punctul.
1. float - ocup 32 de bii i ia valori ntre 3.4 x 10-38 i 3.4 x 1038
2. double - ocup 64 de bii i ia valori ntre 1.7 x 10-308 i 1.7 x 10308
3. long double - ocup 80 de bii i ia valori ntre 3.4 x 10-4932 i 1.1 x 104932
Exemple de declaraii de variabile:
char a, b=25, c=x;
int d=21, e;
float f ;
Obs:
1) la tiprirea unei variabile de tip caracter se tiprete caracterul i nu codul su, dei la
atribuire se poate ataa fie codul caracterului, fie caracterul.
Ex: n urma execuiei secvenei de mai jos, se va tipri de dou ori caracterul d:
char a = 100, b = d ;
cout << a << << b ;
5

2) n urma execuiei urmtorului program:


#include <iostream.h>
void main()
{
int a; char b;
a = 20; b = n;
cout<<b<<a+b ;
}
se va afia n i numrul 130 deoarece se adun codul caracterului n, care este 110, cu numrul.
3) n C++ nu exist tipul logic. n C++, o variabil care reine o valoare diferit de 0 este TRUE
(adevarat), iar una care reine valoarea 0 este FALSE (fals).
4) n C++ este admis tipul void, cu semnificaia de nimic sau orice tip,n funcie de context.

Constante
Constant: entitate a crei valoare rmne neschimbat pe durata existenei sale. Ea are un tip i o
valoare.
Pentru a defini o constant se folosete declaraia const care are forma:
const [tip] nume = valoare ;

tipul constantei

numele constantei

valoarea constantei

(dac e absent, tipul e int);


Ex:

const int v1= 8;


const float v2 = 8.8;
const v3 = 12;

Obs: Att variabilele ct i constantele pot primi ca valori expresii constante:


Ex:

const int a = 3*2+1;


int b = (3+2*4)-1;

1. Constante ntregi:
- zecimale (n baza 10). Exemple: 5, 345, 32, -12
- octale (n baza 8). O succesiune de cifre octale 0 7 precedat de un 0 nesemnificativ.
Exemple: 0345 reine numrul 345(8) .
- hexazecimale (n baza 16). O succesiune de cifre hexazecimale precedat de 0x sau 0X.
Exemple: 0x2B3 reine numrul 2B3(16) .
6

Cifrele hexazecimale se obin extinznd cifrele zecimale cu literele mici sau mari de la A la F:

Litera care reprezint


o cifr hexazecimal
a sau A
b sau B
c sau C
d sau D
e sau E
f sau F
Obs: o constant ntreag este pozitiv. n cazul

Valoare
10
11
12
13
14
15
n care se folosete semnul - , de exemplu -45,

avem o expresie constant ( - este operator ) care se evalueaz.


2. Constante caracter:
Acestea se trec ntre dou caractere apostrof: a, A, 3 .O constant caracter are ca valoare codul
ASCII al caracterului pe care-l reprezint. Ea are tipul int.
De exemplu pentru a se memoreaz 97, iar pentru A se memoreaz 65.
O alt modalitate de declarare a constantelor caracter este sub form de secvene escape. O secven
escape ncepe cu caracterul backslash (\).
Fie, de exemplu, constanta caracter c care are codul 99(10) = 143(8) = 63(16) .
Aceasta poate fi scris echivalent : \143 sau \x63 . n cazul reprezentrii n baza 16 se folosete
precedat de caracterul x.
Ex:
Programul urmtor va tipri de 4 ori caracterul c :
#include <iostream.h>
void main()
{
char x1 = 99 , x2 = \143 , x3 = \x63, x4 = c ;
cout<<x1<<x2<<x3<<x4 ;
}

Rolul secvenelor escape este acela de a da posibilitatea declarrii caracterelor care nu se pot tasta.
De exemplu, caracterul backspace (codul 8(10)) poate fi declarat \10 sau \x8 , iar caracterul
newline (codul 10(10)) poate fi declarat \12 sau \xa .

Obs: Dat fiind un numr ntreg (scris ntr-o baz oarecare b1), pentru scrierea lui ntr-o alt baz (b2)
se mparte succesiv numrul scris n baza b1 la noua baz pn cnd se obine ctul 0; Reprezentarea
n noua baz se obine prin scrierea resturilor (reprezentate n noua baz) n ordinea invers obinerii
lor i multiplicarea cu puterea corespunztoare a bazei care este egal cu rangul operaiei.
n mulimea caracterelor cu rol special pentru citire/scriere se situeaz caracterele albe
(whitespaces): blank ( ), tab orizontal (\t), tab vertical (\v), newline (\n), cr (\r).
Ex:
#include <iostream.h>
void main()
{
char a = \t, b=\i ;
cout<<a<<b;
}
Programul tiprete bbbbbbbbi
tab
3. Constante reale:
- au o parte ntreag (ce poate fi vid); n acest caz devine o constant zecimal.
- au o parte fracionar (ce poate fi vid numai dac partea ntreag este prezent); aceasta este
format din: caracterul "." (punct) urmat de o succesiune de cifre zecimale.
- au un exponent (poate lipsi); ncepe cu E sau e, apoi + sau - (opional) urmat de un ir de cifre
zecimale; E sau e exprim o putere a lui 10.
Ex:
Constant real

Valoare

Constant real

Valoare

12.

12

25e4

25x10^4

123.4

123.4

.1E-5

0.1x10^(-5)

.67

0.67

-123.456e2

-123.456x10^2=-12345.6

Obs: Implicit acestea sunt memorate utiliznd tipul double. Se poate fora ca acestea s fie
memorate sub tipul float adugnd sufixele f sau F sau sub long double adugnd l sau L.
Ex:

-144.5

se memoreaz sub form

double

-144.5f

se memoreaz sub form

float

-144.5L

se memoreaz sub form

long double

4. Constante ir de caractere:
Se declar ntre dou caractere . Funciile de prelucrare sunt n biblioteca string.h.
Ex: acesta este un text
Obs: Pe lng mecanismul cunoscut de declarare a constantelor (cu ajutorul lui const) n C++ mai
avem posibilitatea de declarare cu ajutorul directivei preprocesorului, #define:
#define

nume

expresie

Aceste constante rmn valabile pn la sfritul programului, pn la redefinirea lor sau pn la


ntlnirea directivei #undef.
Ex:
1)

#include <iostream.h>
#define pi 3.14
#define text valoarea aproximativa a lui pi este
main()
{
cout<<text<<pi;
}

Rolul preprocesorului este de a nlocui fiecare apariie a numelui constantelor cu constantele


respective. Astfel, dup preprocesare, vom avea:
cout<<valoarea aproximativa a lui pi este<<3.14;

2) Se poate defini o constant cu ajutorul uneia deja definit (programul urmtor va tipri 3.14):
#include <iostream.h>
#define pi 3.14
#define alt_pi pi
main()
{
cout<<alt_pi ;
}

Expresii
expresie - format dintr-un operand sau mai muli, legai prin operatori.

constante, variabile sau funcii. unari, binari, ternari - cel conditional


Pot fi grupai n mai multe clase: aritmetici,
relaionali, de egalitate, de incrementare i
decrementare, logici, logici pe bii, de atribuire, etc.
La scrierea unei expresii se pot folosi operatori din aceeai clas sau din clase diferite. La evaluarea
expresiilor trebuie s se in seama de prioritile operatorilor care aparin diferitelor clase de
operatori, de asociativitatea operatorilor de aceeai prioritate (ordinea aplicarii operatorilor
consecutivi de aceeai prioritate) i de regula conversiilor implicite.
n funcie de prioritate ,de la maxim la minim, operatorii se clasific astfel:
prioritate

operatori semnificaie

()
[]
->
::
!
~
+++ -&
*
sizeof
(tip)
*
/
%
+, <<
>>
<, <=
>, >=
= =, ! =
&
^

&&

?:
=
*=, /=
%=
+ =, - =
&=
^=
!=
<<=, >>=
,

4
5
6
7
8
9
10
11
12
13
14

15

asociativitate

apel de funcie
expresie cu indici
selector de membrii la structuri

negare logic
negare bit cu bit
plus unar sau minus unar
incrementare i decrementare
obinerea adresei
indirectare
dimensiune operand (n octei)
conversie explicit de tip
nmulire
mprire
restul mpririi ntregi
plus binar (adunare), minus binar (scdere)
deplasare la stnga
deplasare la dreapta
mai mic i mai mic egal
mai mare i mai mare egal
egal, diferit
i logic pe bii
Sau exclusiv pe bii
Sau logic pe bii
i logic
Sau logic
operatorul condiional
atribuire simpl
atribuire produs, atribuire mprire
atribuire rest
atribuire sum, atribuire diferen
atribuire i (bit)
atribuire Sau exclusiv (bit)
atribuire Sau (bit)
atribuire cu deplasare stnga, respectiv dreapta
virgula

s
s

d
d

s
s
s
s
s
s
d
d

d
d
d
d
d
d
s
s

10

Operatori aritmetici: (sunt n ordinea descresctoare a prioritii):


a. Unari: + , - (asociativitate dreapta -stnga);
b. Binari multiplicativi: *, /, % (asociativitate stnga - dreapta);
c. Binari aditivi: + , - (asociativitate stnga dreapta).
Obs:
1) Operatorul / acioneaz n mod diferit n funcie de operanzi:
a) dac ambii sunt de tip ntreg, rezultatul este ntreg i are semnificaia de mprire ntreag
b) dac cel puin unul din operanzi este de unul din tipurile reale, rezultatul este real, deci se
efectueaz mprirea obinuit.
Ex:

Fie declaraia int a = 14 ;


Expresia 2*a/5 este de tip int i la evaluare se obine 5.
Expresia 2*(a/5) este de tip int i la evaluare se obine 4.
Fie declaraia float a = 14 ;
Expresia 2*a/5 are ca rezultat 5.6
Expresia 2*(a/5) are ca rezultat tot 5.6

2) Operatorul % (restul mpririi ntregi) acioneaz numai asupra operanzilor de tip ntreg.
Ex:

Expresia 7%3 are ca valoare 1.


Expresia -7%3 are ca valoare -1. deoarece -7 = (-2)*3 + (-1)

3) La evaluarea expresiilor, n cazul n care un operator se aplic la doi operanzi de tipuri diferite, se
aplic urmtoarea regul (a conversiilor implicite):
- orice operand de tipul char i unsigned char este convertit ctre tipul int.
- dac un operand este de tipul unsigned long, atunci i cellalt se convertete ctre tipul unsigned
long.
- dac un operand este de tipul long, atunci i cellalt se convertete ctre tipul long.
- dac un operand este de tipul float, atunci i cellalt se convertete ctre tipul float.
- dac un operand este de tipul double, atunci i cellalt se convertete ctre tipul double.
- dac un operand este de tipul long double, atunci i cellalt se convertete ctre tipul long double
Ex:
1) Fie declaraiile:
int a = 5; char b = 6; float c = 9;
Atunci expresia a + b + c are rezultatul 20.0
11

2) Programul urmtor va tipri 97:


#include <iostream.h>
void main()
{
int a = 0; char b = a ;
cout << a+b;
}
Exerciii:
Realizai rularea urmtoarelor programe:
#include <iostream.h>
void main()
{
char c1, c2;
c1=a; c2 = c1 + 1;
cout<<c2;
}

#include <iostream.h>
void main()
{
int i;
char a,b;
a = x; i=a; b=i;
cout<<b;
}
#include <iostream.h>
void main()
{
char c ;
int i1, i2;
i1=300; c=i1; i2=c;
cout<<i2 ;
}
12

Operatori relaionali
<, >, <=, >=
Deoarece n C++ nu exist valorile logice TRUE i FALSE, rezultatul unei operaii logice este 1 n
cazul n care inegalitatea e respectat i 0 n caz contrar.
Ex:
3 > 5 rezultatul este 0
3<5

rezultatul este 1

Operanzii pot fi constante, variabile, funcii.

Operatori de egalitate
= =, ! =
Ca i n cazul operatorilor relaionali, se returneaz 0 sau 1 n funcie de modul n care este
respectat sau nu egalitatea .
Operanzii pot fi constante, variabile, funcii.

Obs: Deoarece rezultatul operaiilor logice este 1 sau 0, se pot gsi ca operanzi n cadrul unor
expresii aritmetice.
Ex:
a = ((1<2)+(3!=5))*2

dup aceasta a = ((1) + ((1))*2 = 4

a = (2<3) = = (2!=8)

dup aceasta a = (1) = = (1) deci a = 1

a = 5= =6

dup aceasta a = 0 deoarece 5 este diferit de 6

Operatori logici
! negare logic : dac operandul este o valoare 0, rezultatul este 0, altfel este 1
&& i logic: dac ambii operanzi sunt 0, rezultatul este 1, altfel este 0
sau logic: dac cel puin unul din operanzi este o valoare 0, rezultatul este 1, altfel este 0
Ex:
(2+3*3)&&(!0)

rezultatul este 1 pentru c ambii operanzi sunt 0

(2-2) (0)

rezultatul este 0 pentru c nici un operand nu este 0

!(1+3*3)

rezultatul este 0 pentru c operandul este 0

!!3

rezultatul este 1

!(3>4)

rezultatul este 1 pentru c operandul este 0

13

Obs: Deoarece operatorii logici aplicai unor operanzi produc valorile 0 sau 1, apelul lor poate apare
ca operanzi n cadrul unor operaii aritmetice:
Ex:
a = (!(3 < 4) + (3 && 4 ) * ( !0 )+( 3 4))
= (!(1) + (1)*(1) + (1))
=(0+1+1)
=2

Operatori logici pe bii acioneaz numai asupra operanzilor de tip ntreg


~

negare pe bii (unar)

& i pe bii (binar)

sau pe bii (binar)

<< deplasare stnga (binar)

Operatorul unar ~

sau exclusiv pe bii (binar)

>> deplasare dreapta (binar)

Operatorul binar &

Operatorul binar

Operatorul binar ^

~ 0 =1

0 & 0 =0

0 0 =0

0 ^ 0 =0

~ 1 =0

0 & 1 =0

0 1

=1

0 ^ 1 =1

1 & 0 =0

1 0

=1

1 ^ 0 =1

1 & 1 =1

1 1

=1

1 ^ 1 =0

Ex:
7&3=3

deoarece: 7

00000111

00000011

&

00000011

7 3 = 7

deoarece: 7

00000111

00000011

00000111

7^3=4

deoarece: 7

00000111

00000011

00000100

14

Operatorul << deplaseaz ctre stnga coninutul tuturor biilor operandului din stnga sa, cu un
numr de poziii egal cu valoarea reinut de al doilea operand. Poziiile rmase libere n dreapta,
vor reine valoarea 0.
Obs: a << n este echivalent cu a * 2n
Ex:
8 << 3 = 64 deoarece: 8

00001000
deplasare cu 3 poziii la stnga
01000000

64

Operatorul >> deplaseaz ctre dreapta coninutul tuturor biilor operandului din stnga sa, cu un
numr de poziii egal cu valoarea reinut de al doilea operand. Poziiile rmase libere n stnga, vor
reine valoarea 0.
Obs: a >> n este echivalent cu a / 2n
Ex:
7 >> 2 = 1 deoarece: 7

00000111
deplasare cu 2 poziii la dreapta
00000001

Operatorul de atribuire
- atriburi

simple - sintaxa v = expresie


compuse - sintaxa: v = v1 = v2 = ..... = vn = expresie
vn = expresie; vn-1 = vn; vn-2 = vn-1;..... v1 = v2; v = v1

Ex:

declaraiile:

atribuirile:

int a, b;

a = c = b = (11 + 8) * 2; // b va fi egal cu 38, c cu &, a cu 38

char c;

c = a = f = 37.67; /* f va fi egal cu 37.67, a cu 37(conversie),

double f;

c cu a(conversie) */
c = f ; // c devine egal cu f

Obs : Pentru atribuiri se pot folosi i operatorii *=, /=, %=, +=, -=, <<=, >>=, &=, ^=,
n expresii de forma:

v op expresie echivalent cu v = v op expresie

Ex:
declaraia:

atribuirile:

int a;

a *= 2 este echivalent cu a = a * 2
a %= 4 este echivalent cu a = a % 4
15

Operatorul , virgul
se utilizeaz n situaii n care ntr-un anumit punct al unui program este necesar s se realizeze un
calcul complex exprimat prin mai multe expresii.
formatul: exp1 , exp2 , ....., expn;
Expresiile se evalueaz pe rnd, de la stnga la dreapta. ntreaga expresie (care cuprinde cele n
expresii separate prin virgul ) va avea ca rezultat i tip valoarea i respectiv tipul, obinute n urma
evalurii ultimei expresii.
Ex:

expresia c = a = b + 3 , a = c + 2, b = b + 3

declaraiile:
int a = 5, b = 7;

b + 3 = 10; a = 10 ; c = 10.0 ;

float c;

a = 10 + 2 = 12;

se evalueaz astfel:

b = 7 + 3 = 10 ;
expresia n ansamblu este de tipul int i produce valoarea 10

Operatorul condiional
se utilizeaz n situaia n care exist dou variante de obinere a rezultatului n funcie de
ndeplinirea unei condiii.
formatul: exp1 ? exp2 : exp3;
- Se determin valoarea expresiei exp1.
- Dac aceasta este diferit de 0, se evalueaz exp2, iar exp3 este ignorat.
- Altfel, se evalueaz exp3 i exp2 este ignorat.
n ansamblu, expresia este de tipul lui exp2 sau exp3 i produce valoarea exp2 sau exp3.
Ex:
1)

int a, b, max;
max = (a>b) ? a : b;

2)

max primete ca valoare maximul dintre a i b

Programul urmtor citete a de tip float i tiprete a :


#include <iostream.h>
void main()
{
float a;
cout << a=; cin>>a;
cout<<(a>= 0?a:-a);
}
16

Operatori de incrementare i decrementare


incrementeaz (adun 1) i respectiv decrementeaz (scad 1) coninutul unei variabile. Operatorii
sunt:

prefixat (n faa operandului): ++a

++ pentru incrementare

postfixat (dup operand): a++


prefixat (n faa operandului): --a

-- pentru decrementare

postfixat (dup operand): a-Obs: Dac operatorul este prefixat, variabila este incrementat / decrementat nainte ca valoarea
reinut de ea s intre n calcul.
Dac operatorul este postfixat, variabila este incrementat / decrementat dup ce valoarea
reinut de ea intr n calcul.
Operatorii de incrementare/ decrementare prefixai i postfixai se aplic numai variabilelor.
Exemple de expresii incorecte: ++4; 4--; (5+a)++; (5+a)--; ++(10+b); --(10+b)

Ex: int a=5, b, c;

b=5+(++a);

// b=5+(6)=11 i dup aceast atribuire a devine 6

c=++b*++a;

// c=12*7=84 i dup aceast atribuire a devine 7 i b 12

b=5+(a++);

// b=5+(5)=10 i dup aceast atribuire a devine 6

c=b++*a++;

// c=10*6=60 i dup aceast atribuire a devine 7 i b 11

b=5+(--a);

// b=5+(4)=9 i dup aceast atribuire a devine 4

c=--b*--a;

// c=8*3=24 i dup aceast atribuire a devine 3 i b 8

b=5+(a--);

// b=5+(5)=10 i dup aceast atribuire a devine 4

c=b--*a--;

// c=10*4=40 i dup aceast atribuire a devine 3 i b 9

Operatorul sizeof (dimensiune)


folosit pentru a determina dimensiunea n octei a unui tip de date sau a rezultatului unei expresii.
Forme:

sizeof (expresie)
sizeof (tip)

Ex:

// float ocup 4 octei

int a, b, c, d;

a = sizeof(float);

a=4

float e;

b = sizeof(e);

b=4

c = sizeof(int);

c = 2 // int ocup 2 octei

d = sizeof(3 + 2*4);

d = 2 // rezultatul e de tip int

17

Operatorul de conversie explicit (cast) sau de forare a tipului


folosit, atunci cnd e nevoie, n cadrul unor expresii, pentru ca anumii operanzi s intre n calcul
convertii aa cum dorim i nu implicit.
Forma: (tip_conversie) operand
astfel, valoarea operandului se convertete spre tip_conversie .
Ex:

float a;

a = (float) 5;

a = 5.000000

int b;

b = (int) 5.35;

b=5

int c;

c = (int) (3.78 + 7);

c = 10

float d;

d = (float) (1/2)

d = 0.000000

float d;

d = 1/(float) 2

d = 0.500000

float d;

d = 5+((float)3+4)

d = 12.000000

Instruciuni

Instruciunea expresie
Forma:

expresie;

expresie

atribuire

apel de funcie

instruciune expresie

instruciune de atribuire

instruciune de apel a funciei respective

Ex: a+3; a++;

Ex: x=4; a=a-5;

Ex: randomize( );

Instruciunea compus
succesiune de instruciuni incluse ntre acolade, precedate eventual de declaraii de variabile locale.
Forma: {
declaraii i definiii locale blocului
instruciuni
}
Ex: presupunem c ntr-un punct al programului trebuie permutate valorile variabilelor a i b:
{
int aux;
aux = a; a = b; b = aux;

Obs: dup execuia ultimei


instruciuni a instruciunii
compuse, variabila aux nu
mai este definit!

}
18

Instruciunea IF
Forme:

if (expresie) instruciune;
if (expresie) instruciune1;
else instruciune2;

Funcionare: se evalueaz expresia din paranteze. Apoi, n primul caz, dac expresia are valoarea
diferit de 0 (adevrat) se execut instruciune. Altfel, se trece la instruciunea urmtoare
instruciunii if. n al doilea caz, dac expresia are valoarea diferit de 0 (adevrat) se execut
instruciune1 i apoi se trece la instruciunea urmtoare instruciunii if; altfel, se execut
instruciune2 i apoi se trece la instruciunea urmtoare instruciunii if.
Obs:
1) nainte de cuvntul cheie else nu se pune ; dac instruciune1 este o instruciune compus,
altfel se pune obligatoriu.
2) Ramurile instruciunii if pot conine la rndul lor alte instruciuni if (se numesc if-uri imbricate).
Exemple de secvene scrise corect d.p.d.v. sintactic:
k=3;

if (1) cout<<da

k=3;

if (0);

if (!0) k++;

else cout<<nu;

if (!k);

else cout<<nu;

else k--;

else;

Exemplu de program ce exemplific folosirea unei instruciuni if n corpul altei instruciuni if.
Se citesc trei variabile reale x, y , z. S se calculeze:
x+y, z>0
e=

x*y, z=0
x-y, z<0

#include <iostream.h>
void main()
{
double x,y,z,e;
cout<<x=;cin>>x; cout<<y=;cin>>y; cout<<z=;cin>>z;
if (z>0) e=x+y;
else if (z= =0) e= x*y;

// se poate scrie i if (!z)

else e = x-y;
cout<<e;
}
19

Instruciunea SWITCH
permite selecia unei variante din mai multe posibile.
Forma:

switch (expresie)
{
case c1: secven instruciuni1; break;
case c2: secven instruciuni2; break;
............................................................
case cn: secven instruciunin; break;
[default: secven instruciunin+1];
}

unde: expresie este o expresie de tip ntreg


c1, c2, , cn sunt constante de tip ntreg
instruciuni1, instruciuni2,......, instruciunin sunt secvene oarecare de instruciuni
Funcionare: se evalueaz expresia. Dac aceasta produce o valoare egal cu c i, se execut secven
instruciunii i se trece la instruciunea urmtoare instruciunii switch, altfel se execut secven
instruciunin+1.
n absena alternativei default, dac valoarea expresiei nu coincide cu valoarea nici uneia dintre
constantele c1, c2, , cn , instruciunea switch nu are nici un efect i se trece la execuia
instruciunii urmtoare.
Exemple de secvene scrise corect d.p.d.v. sintactic:

k=2;

k=2;

switch ((k-1)*3))

switch(3<4)

{
case 4-1

: k=k+1;

case 1 : k++;

case (5-3)%2 : k=k+2;

case (3<=5)&&(2>3) : k=k+2;

default:

case a

: k--;

default:

: cout<<10;

: cout<<sfarsit;

20

k=a;

k=a;

switch (k+1)

switch(k<4)
{

{
case d

: k=k+1;

case d<=9

: k++;

case 1

: k=k+2;

case 1>=4

: k=k+2;

default:

: cout<<1;

default

:;

Exemple de secvene scrise incorect d.p.d.v. sintactic:


k=2;

k=2;

switch ((k/2.1))

switch((k<4)+3.5)

{
case sqrt(k)

: k=k+1;

: k++;

case 2

: k=k+2;

: k=k+2;

default:

: k=k+3;

default: k=k+3;

Exemplu de program care citete un numr natural i precizeaz dac el reprezint codul ASCII al
unui caracter alfanumeric (liter mic, liter mare, cifr), n acest caz afindu-se i caracterul:
#include <iostream.h>
void main()
{
int n, a=0;
cin>>n;
if ((n>=97)&&(n<=122)) a=1;
else if ((n>=65)&&(n<=90)) a=2;
else if ((n>=48)&&(n<=57)) a=3;
swich(a)
{
case 1 : cout<<n<<e codul ASCII al literei mici<< (char) n;
case 2 : cout<<n<<e codul ASCII al literei mari<< (char) n;
case 3 : cout<<n<<e codul ASCII al cifrei<< (char) n;
default : cout<<n<< nu e codul ASCII al unui caracter alfanumeric;
}
}
21

Instruciunea WHILE
instruciune ciclic ce definete o structur repetitiv condiionat anterior.
Forma: while(expresie)
instruciune;
Funcionare: se evalueaz expresie; Dac valoarea obinut este diferit de 0, se execut instruciune
i se revine la pasul anterior, iar dac se obine o valoare egal cu 0, se trece la urmtoarea
instruciune din cadrul programului.
Obs: 1) Instruciunea care depinde de expresia de la while poate s nu se execute niciodat. Aceasta
se ntmpl atunci cnd dup evaluarea expresiei se obine valoarea 0.
Ex:

a=1; b=a+1;
while(a>=2)
{

nc de la nceput condiia este


fals i deci expresia avnd
valoarea 0, instruciunea nu se
execut niciodat.

a+=b;
b++;
}
2) Instruciunea care depinde de expresia de la while poate s se execute de o infinitate de ori.
Aceasta se ntmpl atunci cnd expresia are valoarea diferit de 0 ntotdeauna.
Ex:

a=1; b=b+1;
while(a<=2)
{

Condiia nu devine fals


niciodat i deci instruciunea
se execut de o infinitate de ori.

b+=a;
b++;
}
3) Dac dup expresie se pune ;, avem dou situaii :
- dac condiia este adevrat, se intr n ciclu infinit
- dac condiia este fals se execut urmtoarea instruciune din program
Ex:

a=1; b=b+1;
while(a<=2);

ciclu infinit

{
a--;
b++;
}
22

Ex:

a=1; b=b+1;
se execut urmtoarea
instruciune din program

while(a>=2);
{
a--;
b++;
}

Exemplu de secvene echivalente scrise corect:


1) secvenele urmtoare calculeaz suma primelor n numere naturale, n se citete de la tastatur.

#include <iostream.h>

#include <iostream.h>

#include <iostream.h>

main()

main()

main()

int n, i, s;

int n, i, s;

int n, i, s;

cout<<n=; cin>>n;

cout<<n=; cin>>n;

cout<<n=; cin>>n;

s=0; i=1;

s=i=0;

s=0; i=1;

while(i<=n)

while(i<=n)

while(s+=i++,i<=n);

s+=++i;

cout<<varianta 3<< <<s;

s+=i;

cout<<varianta 2<< <<s;

i++;

}
Obs: datorit multiplelor posibiliti
de lucru cu expresii, s-au folosit mai
multe expresii separate prin virgul.
Valoarea produs de expresie este
dat de ultima din irul lor.

}
cout<<varianta 1<< <<s;
}

2) secvenele urmtoare calculeaz nr. obinut prin inversarea cifrelor unui nr. n citit de la tastatur.
#include <iostream.h>

#include <iostream.h>

main()

main()

int n, ninv=0; cout<<n=; cin>>n;

int n, ninv=0; cout<<n=; cin>>n;

while(n)

while(ninv=ninv*10 + n%10, n/=10);

cout<<numarul inversat<<ninv;
ninv=ninv*10 + n%10; n= n/10;

}
Obs: datorit multiplelor posibiliti
de lucru cu expresii, s-au folosit mai
multe expresii separate prin virgul.
Valoarea produs de expresie este
dat de ultima din irul lor.

}
cout<<numarul inversat<<ninv;
}
23

Instruciunea DO WHILE
instruciune ciclic ce definete o structur repetitiv condiionat posterior.
Forma: do
instruciune
while(expresie);
Funcionare: Se execut instruciunea subordonat. Apoi se evalueaz expresie; Dac valoarea
obinut este diferit de 0, se revine la pasul anterior i se execut instruciune, iar dac se obine o
valoare egal cu 0, se trece la urmtoarea instruciune din cadrul programului.
Exemplu de secvene echivalente scrise corect:
1) secvenele urmtoare calculeaz suma primelor n numere naturale, n se citete de la tastatur.
#include <iostream.h>

#include <iostream.h>

main()

main()

int n, i=1, s=0;

int n, i=1, s=0;

cout<<n=; cin>>n;

cout<<n=; cin>>n;

do

do
{

s+=i++;
s=s+i; i=i+1;

while(i<=n);
cout<<varianta 2<< <<s;

while(i<=n);

cout<<varianta 1<< <<s;


}
Instruciunea FOR
instruciune ciclic ce definete structura repetitiv condiionat anterior, cu numr cunoscut de pai.
Forma: for (exp1;exp2;exp3)
instruciune;
unde exp1, exp2, exp3 sunt expresii: exp1 iniializare, exp2 testare, exp3 reiniializare (incrementare)
Funcionare: - se execut secvena de iniializare definit de exp1.
- se evalueaz exp2. Dac e adevrat se execut instruciune, altfel se termin
execuia instruciunii for i se trece la execuia instruciunii urmtoare instruciunii for.
- se execut secvena de reiniializare definit de exp3 i se trece la pasul anterior.
24

Obs:

1) n seciunea de iniializare, exp1, se pot declara i iniializa variabile.


2) n cadrul instruciunii for, variabila de ciclare poate fi i de un tip real.
3) dac trebuie folosite mai multe instruciuni n cadrul celor trei seciuni, exp1, exp2, exp3,
n cadrul fiecrei seciuni, acestea se separ prin virgul.
4) instruciunea poate fi instruciune compus sau repetitiv sau de decizie.

Exemple de instruciuni definite corect d.p.d.v. sintactic:


for (float i=1;i<=10.5;i=i+0.5)

j=5;

cout<<i<< ;

for(int i=5,j++;i<=10;i++,j++)
cout<<i<< <<j;

for(int i=1;i<=10;i++);

/* deoarece dupa for am pus ; in ciclu nu se va executa nici o*/

cout<<i<< ;

/* instructiune, iar valoarea tiparita pentru i va fi 11 */

Instruciunea BREAK
produce ieirea forat din cel mai interior ciclu while, do-while, for, care o conine sau din
instruciunea switch.
Forma: break;
Ex: Programele urmtoare determin, folosind instruciunile for, respectiv while, primul numr
divizibil cu 11:
#include <iostream.h>

#include <iostream.h>

main()

main()

int m=0, i=1;

int m, i;

while (!m)

for (i=1; ; i++)

if (i%11= =0) {
if (i%11= =0) {

m=i;

m=i;

break;

break;
}
i++;

}
cout<<m;
}

}
cout<<m;
}
25

Instruciunea CONTINUE
produce saltul la testul de continuare n cazul instruciunilor while i do-while sau saltul la expresia
de incrementare, n cazul instruciunii for.
Forma: continue;
Ex: 1) Programul urmtor realizeaz descompunerea n factori primi ai unui numr natural n citit de
la tastatur, sub forma factor

exponent:

#include <iostream.h>
main()
{
int n, d, exp;
cout<<n=; cin>>n;
for (d = 2; ; d++)
{

/* descompune n in factori primi */

if (n % d != 0) continue;

/* nu se imparte, se trece la urmatorul posibil factor */

exp = 0;
do

/* repeta de cate ori d este factor */


exp++;

while ((n /= d) % d = = 0);


cout<< d<< << exp;

/* scrie factorul curent si exponentul respectiv*/

if (n = = 1) break;

/* am terminat */

}
}
2) Programul urmtor afieaz, folosind instruciunea for, elementele impare dintre 1 i 100:
#include <iostream.h>
main()
{
int i;
for(i=1;i<=100;i++)
{
if (i%2= =0) continue;
cout<<i<< ;
}
}
26

Instruciunea GOTO
produce saltul la instruciunea prefixat de eticheta al crei nume se afl dup cuvntul cheie go to.
Forma: goto eticheta;
unde eticheta este un identificator al instruciunii cu care se continu execuia programului. Ea are
forma:
eticheta: instruciune;
Obs: 1) instruciunea goto se utilizeaz rar deoarece ncalc principiile programrii structurate.
2) etichetele sunt locale n corpul funciei n care sunt definite i astfel o instruciune goto
poate realiza un salt numai la o instruciune din corpul aceleiai funcii n care ea este utilizat. Deci
o instruciune goto nu poate face salt din corpul unei funcii la o instruciune din corpul altei funcii.
3) n absena instruciunii goto, se poate realiza acelai lucru folosind un indicator (semnal) i
efectund o serie de teste asupra lui.

Ex 2) Exemplul de mai jos modeleaz un ciclu

Ex: 1)
...

de incrementare a unei variabile de la 1

for (...){

la 100:

for (...) {

.....

for (...){

a=1;
...

eticheta: a++;

if(.....) goto stop;

if(a<100) goto eticheta;

...

......

}
...
}
...
}
...
stop: /* codul special pentru tratarea situatiei*/
...

Funcii matematice

27

n matematic definirea unei funcii presupune definirea domeniului de definiie, al


codomeniului i a legii de coresponden pentru funcia respectiv. n C++ o astfel de definiie se
realizeaz prin definirea prototipului funciei respective.
Exemplu de prototip:

int f (int, float);

(codomeniul) rezultatul
ntors

numele
funciei

parametrii (domeniul de definiie)


funciei

Funciile sunt apelate cu un numr de parametrii efectivi. Parametrii de apel ai unei funcii i
tipul ei (natura rezultatului ntors) sunt coninui de prototipul funciei respective.
Prototipurile funciilor din acelai domeniu se gsesc grupate ntr-un fiier header. Astfel,
pentru folosirea funciilor matematice, trebuie inclus n fiierul surs al programului fiierul math.h.
Funcia abs - ntoarce |x| (modulul lui x).
forma: int abs(int x);
Funcia fabs - ntoarce |x| (modulul lui x), unde x este un numr real.
forma: double fabs(double x);
Funcia labs - ntoarce |x| (modulul lui x), unde x este un ntreg lung
forma: long int labs(long int x);
Funcia sin calculeaz valoarea funciei sin(x): R

[-1,1]

forma: double sin(double x);


Funcia cos calculeaz valoarea funciei cos(x): R

[-1,1]

forma: double cos(double x);


Funcia tan calculeaz valoarea funciei tg(x): R \ { k*+ /2 | k Z ]
forma: double tan(double x);
Funcia acos calculeaz valoarea funciei arccos(x): [-1,1]

[0, ]

forma: double acos(double x);


Funcia asin calculeaz valoarea funciei arcsin(x): [-1,1]

[0, ]

forma: double asin(double x);


Funcia atan calculeaz valoarea funciei arctg(x): R
28

[- /2, /2 ]

forma: double atan(double x);


Funcia atan2 calculeaz valoarea funciei arctg(y/x): R

[-, ]

forma: double atan2(double y, double x);


Obs: aceast funcie este util n scrierea unui numr complex z = x+iy cu x, y R, sub form
trigonometric: z = (cos+isin), unde = x 2 y 2 , tg = y/x

Funcia sinh calculeaz funcia sinus hiperbolic sh(x): R

= arctg(y/x).

R, sh(x)=

e x e x
2

forma: double sinh(double x);

Funcia cosh calculeaz funcia cosinus hiperbolic ch(x): R

R, ch(x)=

ex ex
2

forma: double cosh(double x);

Funcia tanh calculeaz funcia tangent hiperbolic tanh(x): R

R, th(x)=

forma: double tanh(double x);


Funcia floor calculeaz valoarea rotunjit (n minus) a lui x
forma: double floor(double x);
Funcia ceil calculeaz valoarea rotunjit (n plus) a lui x
forma: double ceil(double x);
Funcia exp calculeaz funcia ex : R

R* +

forma: double exp(double x);


Funcia log calculeaz funcia ln(x): R*+

R, unde ln(x)= loge(x)

forma: double log(double x);


Funcia log 10 calculeaz funcia lg(x): R*+

R, unde lg(x)= log10(x)

forma: double log10(double x);


Funcia pow calculeaz xy
forma: double pow(double x, double y);

Generarea numerelor aleatoare


29

e x e x
e x ex

Aceste funcii au prototipurile n stdlib.h.


Funcia rand genereaz un numr aleator ntreg cuprins ntre 0 i 32767
forma: int rand(void);
Setarea generatorului de numere aleatoare cu un numr aleator se face cu funcia randomize:
forma: void randomize(void);
Setarea generatorului de numere aleatoare ntr-un anumit punct se face cu funcia srand:
forma: void srand (unsigned n);
Apelul funciei srand cu valoarea 1 duce la reiniializarea generatorului.
Ex 1): Programul urmtor tiprete 10 numere aleatoare ntregi cuprinse ntre 0 i 99:
#include <iostream.h>
#include <stdlib.h>
main( )
{
int i;
randomize( );
for (i=0;i<10;i++) cout<<rand( ) % 100<< ;
}
Obs: Dac n program nlocuim randomize() cu srand(n), pentru valoarea fixat a lui n, la rulri
succesive ale programului, seria celor 10 numere va fi ntotdeauna aceeai.
Ex 2): Programul urmtor tiprete 10 numere aleatoare cuprinse ntre dou valori ntregi citite:
#include <iostream.h>
#include <stdlib.h>
main( )
{
int a,b,i;
cout<<a=; cin>>a; cout<<b=; cin>>b;
randomize( );
for (i=0;i<10;i++) cout<<rand( ) % (b-a)+a<< ;
}
Tablouri
30

reprezint o colecie de variabile de acelai tip referite prin acelai nume.

Tabloul

pot fi

unidimensionale
multidimensionale

la declarare trebuie precizate

tipul datelor din tablou


numele tabloului
numrul de componente ale tabloului declarat

ocup o zon contigu de memorie, primul element se afl la adresa mai mic
Obs: Deoarece n limbajul C nu exist un tip predefinit string (ir de caractere) ca n alte limbaje de
programare, eventuale variabile de acest tip vor fi tablouri de caractere.
Tablouri unidimensionale
Se declar dup structura:

Selectarea unui element de tablou:

tip_baza nume_tablou[dimensiune];

nume_tablou[indice],

tipul datelor

numele

dimensiunea (nr. de componente)

din tablou

tabloului expresie ntreag constant

expresie ntreag cu
valori [0, dimensiune -1]

Obs : - Un element de tablou poate fi prelucrat ca orice variabil.


- Memoria ocupat de tablou este: dimensiune*sizeof(tip_baza)
- Dac la iniializarea tablourilor de tip numeric, dimensiunea declarat este mai mic dect
numrul valorilor folosite, calculatorul d eroare, iar dac e mai mare, restul componentelor
vor fi iniializate cu 0
- Pentru a realiza o prelucrare asupra tuturor elementelor tabloului se folosete instruciunea
for cu o variabil contor care s ia toate valorile indicilor ( ntre 0 i dimensiune -1 )
Ex :
#include <iostream.h>
main( )
{
int i, v[10];
for(i=0;i<10;i++)
v[i]=2*i;

- am declarat un tablou unidimensional cu numele v


- datele din tablou vor fi de tipul int
- tabloul are 10 de componente : v[0], v[1], .v[9]
- tabloul ocup 20 de octei
- efectul rulrii programului este apariia liniei:
0 2 4 6 8 10 12 14 16 18

for(i=0;i<10;i++)
cout<<v[i]<< ;
}
31

Obs: la declarare vectorii pot fi iniializai. Valorile cu care se iniializeaz sunt valori ale tipului de
baz tip_baza i sunt trecute ntre acolade i separate prin virgule.
Ex:1)

int v[4]={1,2,3,4};
float u[3]={4e-3, 3.1, -5};

2)

#include <iostream.h>
main( )
{
int i, v[4]={2,4,6,8};
for(i=0;i<=3;i++)
cout<<v[i]<< ;
}
Tablouri multidimensionale

Tablourile cele mai des utilizate sunt tablourile cu un indice i cele cu doi indici. Se pot defini ns
i tablouri cu mai mult de doi indici.
Forma general de declarare a unui tablou cu n indici este:
tip_baza nume_tablou[dimensiune1] [dimensiune2 ]....[dimensiunen];
tipul datelor
din tablou

numele
tabloului

dimensiunile (nr. de componente)


expresii ntregi constante

Selectarea unui element de tablou:


nume_tablou[indice1] [indice2] ... [indicen] ,
unde indicei - expresie ntreag cu valori [0, dimensiunei -1]
Obs: 1) Indicele din dreapta este cel care variaz primul iar cel din stnga ultimul pentru ca
elementele din list s ocupe, unul cte unul, poziiile componentelor din tablou.
2) Tablourile cu mai muli indici nu sunt eficiente la utilizare din cauza memoriei pe care o
necesit (i care se aloc odat cu declararea lor). Memoria ocupat de tablou este:
dimensiune1* dimensiune2*.... dimensiunen*sizeof(tip_baza).
3) Logica n care este memorat un tablou t cu n dimensiuni este urmtoarea:
tabloul n-dimensional se memoreaz ca un vector alctuit din dimensiune1
componente, fiecare dintre acestea fiind un tablou cu n-1 dimensiuni;
fiecare tablou (n-1)-dimensional se memoreaz ca un vector alctuit din dimensiune2
componente, fiecare dintre acestea fiind un tablou cu n-2 dimensiuni, etc.
32

fie tabloul: int t[2][3][4]. Acest tablou tridimensional se memoreaz ca un vector cu dou

Ex:

componente, fiecare dintre acestea fiind un tablou cu dou dimensiuni. Fiecare astfel de tablou e
memorat ca un vector cu 3 componente, fiecare dintre ele fiind un vector cu 4 componente de tip int.
1
1
1

2
3

3
3

1
3

2
3

3
3

Obs: la declarare tablourile multidimensionale pot fi iniializate. Valorile cu care se iniializeaz


sunt valori ale tipului de baz tip_baza i sunt trecute ntre acolade i separate prin virgule.
Ex:1)

int a[2][3]={1,2,3,4,5,6};

int a[2][3]={{1,2,3},{4,5,6}};

2)

a[0][0]=1;

a[0][1]=2;

a[0][2]=3;

a[1][0]=4;

a[1][1]=5;

a[1][2]=6;

a[0][0]=1;

a[0][1]=2;

a[0][2]=3;

a[1][0]=4;

a[1][1]=5;

a[1][2]=6;

#include <iostream.h>
main( )
{
int a[4][2]={{1,2},{3,4},{5,6},{7,8}};
for(int i=0;i<=3;i++)
{
for(int j=0;j<=1;j++)
cout<<a[i][j]<< ;
cout<<endl;
}
}

Obs: Un tablou poate fi definit ca o constant astfel:


const tip_baza nume_const[dimensiune1] [dimensiune2 ]....[dimensiunen]={c1,cn};
unde c1,cn constante de tipul tip_baza , cel mult attea cte elemente are tabloul, adic
dimensiune1*.... *dimensiunen
Ex:

const int a[2][3]={1,2,3,4,5,6};

a[0][0]=1;

a[0][1]=2;

a[0][2]=3;

a[1][0]=4;

a[1][1]=5;

a[1][2]=6;

Dar dup aceast instruciune nu pot exista instruciuni de forma:


a[2][2]=10 (deci componentele nu-i pot modifica valoarea)
33

Tablouri bidimensionale(matrice)
Limbajul C++ conine

tipuri standard (predefinite): ntregi, reale


definite de utilizator prin utilizarea declaraiei typedef:
typedef tip nume;

Ex:

typedef int mat [20][20];


mat a;

Obs: typedef int mat [20][20];


int i,j,n,m;
mat a;

a este o matrice cu maxim 20 linii i 20


coloane de elemente ntregi

secven de declaraii ce apare n orice


problem ce utilizeaz matricea a cu
m linii i n coloane, cu elemente ntregi

Secvena de citire a unei matrice a

Secvena de afiare a unei matrice a

cu m linii i n coloane:

cu m linii i n coloane:

cout<<m=; cin>>m; cout<<n=; cin>>n;

for(i=1;i<=m;i++)

for(i=1;i<=m;i++)

for( j=1;j<=n;j++)

for( j=1;j<=n;j++)

cout<<a[i][j]<< ;
cout<<a[<<i<<,<<j<<]= ;

cout<<endl;

cin>>a[i][j];

};

};
Secvena de parcurgere deasupra diagonalei

Secvena de parcurgere sub diagonala

principale a matricei a cu n linii i n coloane:

principal a matricei a cu n linii i n coloane:

for(i=1;i<=n-1;i++)

for(i=2;i<=n;i++)

for(j=i+1;j<=n;j++)

for(j=1;j<=i-1;j++)

(a[i][j]..)...

(a[i][j]..)...

Secvena de parcurgere deasupra diagonalei

Secvena de parcurgere sub diagonala

secundare a matricei a cu n linii i n coloane:

secundar a matricei a cu n linii i n coloane:

for(i=1;i<=n-1;i++)

for(i=2;i<=n;i++)

for(j=1;j<=n-i;j++)

for(j=n+2-i;j<=n;j++)

(a[i][j]..)...

(a[i][j]..)...

diagonala principal a matricei a

diagonala secundar a matricei a

cu n linii i n coloane: a[i][i], i=1,...,n

cu n linii i n coloane: a[i][n+1-i], i=1,...,n


34

Subprograme
Definiie: Un subprogram este o secven de instruciuni care rezolv o anumit sarcin i care
poate fi descris separat. Ea poate fi repetat n cadrul unui program de un numr de ori i executat
numai n funcie de anumite condiii.
Subprogramele n limbajul C++ se numesc funcii.
Un program scris n limbajul C/C++ este un ansamblu de funcii, fiecare dintre acestea efectund o
activitate bine definit.
Obs: funcia main( ) este tot un subprogram i se execut prima.
Avantaje:

modularizarea problemei (descompunerea n subprobleme)


reutilizarea unei sevene de instruciuni de mai multe ori n diferite contexte
economie de memorie
depanarea i actualizarea programului se face mai uor

Clasificare:

n funcie de modul de definire

create de utilizator
predefinite(Ex: pow, log, abs, etc)

n funcie de valoarea returnat

returneaz o valoare n punctul de apel la


revenirea din ele
nu returneaz o valoare n punctul de apel la
revenirea din ele, deci nu au valoare de retur;
ele returneaz rezultatul prin intermediul parametrilor

Funciile comunic prin argumente: ele primesc ca parametri (argumente) datele de intrare,
efectueaz prelucrrile descrise n corpul funciei asupra acestora i pot returna o valoare (rezultatul,
datele de ieire).
n limbajul C/C++ se utilizeaz definiii i declaraii de funcii.
Definiia funciei (cuprinde antetul i corpul funciei):
antetul funciei

tip nume (lista parametrii formali)


{ declaraii variabile locale

corpul funciei

instruciuni

seciune declarativ
seciune executabil

[return[expresie];]
}
35

tip este tipul funciei. Dac funcia nu ntoarce nici o valoare, n locul su se specific void.
Dac tip void, deci funcia ntoarce o valoare prin numele su, corpul funciei trebuie s
conin obligatoriu instruciunea return expresie; expresia de la return este chiar valoarea
returnat de funcie i trebuie s aib acelai tip cu tipul returnat de funcie.
nume este un identificator (numele funciei).
lista parametrii formali enumerare ce conine tipul i numele fiecrui parametru cu care funcia
lucreaz formal; ei nu reprezint valori concrete; se concretizeaz la execuie, prin apelurile funciei.
declaraii

variabile locale

instruciuni

implementeaz algoritmul de calcul al funciei

return[expresie] se folosete dac funcia ntoarce o valoare. La execuie, la ntlnirea acestei


instruciuni, se revine n funcia apelant.

Obs: 1) n C++ nu se pot defini funcii imbricate, adic definirea unei funcii n corpul altei funcii.
2) De obicei, orice funcie se apeleaz dup ce a fost definit. Dac definirea se face dup
apel, naintea apelului trebuie s existe declaraia funciei (prototipul funciei).
Declaraia funciei (cuprinde antetul funciei) i informeaz compilatorul asupra tipului, numelui
funciei i a listei parametrilor formali. Declaraiile funciilor se numesc prototipuri i sunt
constituite din antetul funciei:
tip identificator (lista parametrii formali);
Apelul funciei: se realizeaz printr-o instruciune de apel de forma:
identificator (lista parametrii efectivi);
La apel, se atribuie parametrilor formali valorile parametrilor efectivi, dup care se execut
instruciunile din corpul funciei. La revenirea din funcie, controlul este redat funciei apelante, i
execuia continu cu instruciunea urmtoare instruciunii de apel, din funcia apelant.

36

Parametrii declarai n antetul unei funcii sunt numii formali, pentru a sublinia faptul c ei
nu reprezint valori concrete, ci numai in locul acestora pentru a putea exprima procesul de calcul
realizat prin funcie. Ei se concretizeaz la execuie prin apelurile funciei.
Parametrii folosii la apelul unei funcii sunt parametri reali, efectivi, concrei, iar valorile
lor vor fi atribuite parametrilor formali, la execuie.
Utilizarea parametrilor formali la implementarea funciilor i atribuirea de valori concrete
pentru ei, la execuie, reprezint un prim nivel de abstractizare n programare - abstractizare prin
parametrii. Acest mod de programare se numete programare procedural .
Obs:

1) n cazul n care funcia returneaz o valoare, apelul funciei poate constitui un operand

ntr-o expresie (apelul funciei intervine ntr-o expresie)


2) ntre parametrii formali i cei efectivi(actuali) trebuie s existe o bijecie care s pstreze
ordinea i tipul.
3) parametrii actuali trebuie s fie variabile declarate sau constante.
4) lista parametrilor formali este vid atunci cnd nu se face schimb de informaie cu restul
programului sau cnd acest schimb se face cu ajutorul variabilelor globale.
Vriabile globale i variabile locale

segmentul memoriei heap

segmentul de memorie stiv

segmentul corespunztor
variabilelor globale

segmentul corespunztor codului


executabil

Conceptual, memoria alocat unui program este mprit n patru segmente:

De asemenea, variabilele pot fi memorate ntr-un anumit registru al microprocesorului caz


n care timpul de acces la aceste variabile este foarte mic.

37

segmentul corespunztor codului executabil - conine biii corespunztori instruciunilor


programului i funciile de bibliotec ce sunt adugate programului.
segmentul corespunztor variabilelor globale - segment de date statice, folosit pentru
stocarea variabilelor globale.
segmentul de memorie stiv - pstreaz variabilele locale i parametrii unei funcii.
La fiecare apel al unei funcii, variabilele sale locale i parametrii si sunt depuse n memoria
stiv.
La ieirea din funcie, aceste variabile i parametri sunt eliminai din stiv.
segmentul memoriei heap - disponibil programelor de aplicaii n timpul execuiei
acestora folosind anumitefuncii ce permit ca unui program s i se aloce memorie exact atunci cnd
este nevoie n timpul execuiei programului.

n general, o variabil se caracterizeaz prin 4 atribute:


1) Tipul variabilei

2) Clasa de memorare locul unde este memorat variabila respectiv

3) Vizibilitatea
liniile textului surs
din care variabila
poate fi accesat

4) Durata de via
timpul
n
care
variabila respectiv
are alocat spaiu n
memoria intern

la nivel de bloc (instruciune compus)


la nivelul ntregului program
la nivel de clas (n programarea orientat obiect)

static - are alocat spaiu n tot timpul execuiei programului


local - are alocat spaiu n timpul n care se execut instruciunile
blocului respectiv
dinamic - alocarea i dezalocarea spaiului necesar variabilei respective
se face de ctre programator (prin operatori sau funcii speciale)

Astfel, n C++ , n funcie de atributele pe care le au, variabilele pot fi mprite n:


- locale
- globale
- dinamice

38

Variabile
globale

locale

- Se declar n afara corpului oricrei funcii


- Atribute:
1) clasa de memorare: segmentul de date
2) vizibilitatea: pot fi utilizate de toate funciile
care urmeaz n textul surs declaraiei
variabilei respective
3) durata de via: static

- Se declar n corpul funciilor: n orice


bloc (instruciune compus) a acestora
- Atribute:
1) clasa de memorare: segmentul de stiv
2) vizibilitatea: la nivelul blocului la care au
fost declarate
3) durata de via: atta timp ct dureaz
execuia blocului respectiv

Exemplul urmtor ilustreaz faptul c dup


fiecare apel, variabilele locale sunt dezactivate:

Exemplul urmtor folosete variabila cu numele


nr. Fiind accesibil din oricare din 2 funcii
prezente n program, valoarea variabilei globale
nr este schimbat pe rnd din ambele funcii:

# include<iostream.h>
int nr =10;
void f1 (void)
{
cout<<nr=<<nr;
nr*=2;
}
void f2 (void)
{
cout<<nr=<<nr;
nr+=2;
}
void main (void)
{
cout<<nr=<<nr;
nr ++;
f1();
f2 ( );
cout<<nr=<<nr;
}

#include<iostream.h>
void f ( )
{
int a=3,b=a;
cout<<a<< <<b<<endl;
a++;b++;
}
main ( )
f( );
//3 3
f( );
//3 3
}

Exemplul urmtor ilustreaz faptul c domeniul de vizibilitate al unei variabile locale


este blocul n care se gsete declaraia sa:
//10
//11
//22
//24

39

# include<iostream.h>
void f ( )
{
int a=1,b=a;
cout<<a<< <<b<<endl;
{
int a=2,b=a;
cout<<a<< <<b<<endl;
{
int a=3,b=a;
cout<<a<< <<b<<endl;
}
cout<<a<< <<b<<endl;
}
cout<<a<< <<b<<endl;
}
se va afia:
1 1
main( )
2 2
{ f( ); }
3 3
2 2
1 1

Obs: 1) n blocuri diferite se pot declara variabile cu acelai nume.


2) Dac o variabil local are acelai nume cu o variabil global, atunci se va lua n
considerare declararea cea mai apropiat de locul utilizrii.

Transmiterea parametrilor

Transmiterea parametrilor este o modalitate prin care un subprogram comunic cu exteriorul.


Transmiterea parametrilor efectivi se face :

prin valoare:
se pot modifica n corpul funciei, dar dup
terminarea apelului funciei au aceeai
valoare pe care au avut-o nainte de apel.

prin referin:
sunt precedai de &;
se pot modifica n corpul funciei, dar dup
terminarea apelului funciei au valoarea pe
care au primit-o n timpul apelului funciei

#include<iostream.h>
int a, b;
void interschimb(int x, int y)
{
int aux = x;
x=y;
y=aux;
}
void main( )
{
cin>>a>>b;
interschimb (a,b);
cout<<a<<b; //a si b nu vor fi permutati
}

#include<iostream.h>
int a, b;
void interschimb(int& x, int& y)
{
int aux = x;
x=y;
y=aux;
}
void main( )
{
cin>>a>>b;
interschimb (a,b);
cout<<a<<b; //a si b vor fi permutati
}

Obs: La transmiterea parametrilor prin valoare, ca parametrii efectivi pot apare expresii sau nume
de variabile.
La transmiterea parametrilor prin referin, ca parametri efectivi nu pot apare expresii, ci
doar nume de variabile.
Transmiterea prin valoare a tablourilor permite ca funciile s ntoarc noile valori ale
acestora (care au fost atribuite n funcii) deoarece numele tabloului este un pointer ctre
componentele lui. Prin valoare se transmite acest nume i cu ajutorul acestuia accesm
componentele tabloului.
40

Exemplu: n programul urmtor, funcia vector iniializeaz vectorul transmis ca parametru, iar n
funcia main( ) se va afia rezultatul.
#include<iostream.h>
void vector(int a[10])
{
for (int i=0;i<10;i++) a[i]=i;
}
main( )
{
int x[10];
vector(x);
for (int i=0;i<10;i++)cout<<x[i]<< ;
}
Exemplu: Ce apare afiat pe ecran n urma execuiei programului urmtor?
#include<iostream.h>
int a; float b;
int f(float & x)
{
if(x<0) x=-x;
x*=10;
return (int)x%10;
}
void main()
{
a=12; b=3.4567;
a=a+f(b);
cout<<a+f(b)+f(b);

Se declaneaz apelul funciei f care returneaz


valoarea 4 i modific b la valoarea 34.567.
Valoarea variabilei a devine 12+4=16;
Se declaneaz dou apeluri ale funciei f.
La primul apel din aceast expresie este returnat
valoarea 5 iar b rmne cu valoarea 345.67.
La al doilea apel din aceast expresie este returnat
valoarea 6 iar b rmne cu valoarea 3456.7.
Valoarea expresiei este deci 16+5+6=27.

Exemplu: calculul c.m.m.d.c. a dou numere:


#include <iostream.h>
#include <conio.h>
void cmmdc (int a,int b,int &c)
{
while (b)
{
c=a%b; a=b; b=c;
}
c=a;
}

void main( )
{
clrscr( );
int x,y,cm;
cout<<"x="; cin>>x;
cout<<"y="; cin>>y;
cmmdc(x,y,cm);
cout<<"cmmdc="<<cm;
getch( );
}

41

Exemplu: Se citete un vector cu n componente numere ntregi. Se cere s se tipreasc c.m.m.d.c.


al valorilor reinute de vector.
Algoritmul de calcul:
1) Calculm c.m.m.d.c. pentru primele dou componente ale vctorului valoare ce va fi reinut
de variabila cm.
2) Apoi, pentru fiecare component i, cu i =2, ..., n-1 se va calcula c.m.m.d.c. ntre valoarea
reinut de cm i cea reinut de componenta i. c.m.m.d.c. va fi reinut din nou de cm.

#include <iostream.h>
#include <conio.h>
int v[10], n;
int cmmdc (int a,int b)
{
while (a!=b)
{
if (a>b) a=a-b;
else b=b-a;
return a;
}

void main( )
{
clrscr( );
int i, cm;
cout<<"n="; cin>>n;
for (i=0;i<n;i++)cin>>v[i];
cm = cmmdc(v[0],v[1]);
for (i=2;i<n;i++) cm = cmmdc(cm,v[i]);
cout<<cm;
getch( );
}

Exemplu: Se citete un vector cu n componente numere ntregi. Se cere s se tipreasc vectorul


sortat.
#include <iostream.h>
#include <conio.h>
void citire (int x[10], int n)
{
int i;
for (i=0;i<n;i++) { cout<<v[<<i+1<<]=;
cin>>x[i];
}
}
void sortare (int x[10], int n)
{
int i, aux;
for (i=0;i<n-1;i++)
for (j=i+1;j<n;i++)
if (x[i]>x[j]) { aux = x[i];
x[i] = x[j];
x[j] = aux;}
}
void scriere (int x[10], int n)
{
int i;
for (i=0;i<n-1;i++) cout<<x[i]<<endl;
}

main( )
{
clrscr( );
int v[10], n;
cout<<"n="; cin>>n;
citire (v,n);
sortare (v,n);
scriere(v,n);
getch( );
}

Obs:
Cele trei funcii ( citire, sortare,
scriere) au tipul void, adic nu au
valoare de retur.
Ele

returneaz

rezultatul prin

intermediul parametrilor.

42

Aplicaii propuse:
1) Sa se scrie o funcie care simplific o fracie i o alta care calculeaz suma a dou fracii. S
se calculeze suma a n fracii, afind rezultatul sub form de fracie ireductibil.
2) Dat fiind un numr natural n, sa se afieze:
a.

cel mai apropiat numr care este ptrat perfect. (Ex: pentru n=13 se va afia 16)

b.

cel mai apropiat numr care este cub perfect. (Ex: pentru n=25, se va afia 27)

c.

cel mai apropiat numr care este numr prim. Dac exist dou astfel de numere, se

vor afia amndou. (Ex: pentru n=27, se va afia 29, pentru n=15 se vor afia 13 si 17)
3) Operaii cu numere complexe (suma, produsul, inversul).
4) Fie o matrice avnd mxn componente ntregi. S se afieze acele elemente ale matricii
(valoarea i coordonatele) pentru care suma elementelor pe linia pe care se gsesc este egal
cu suma elementelor pe coloana pe care se gsesc.
5) Fie irul 1,2,3,4. O permutare circular la dreapta este:2,3,4,1. S se permute circular un ir
de k ori i s se afiseze de fiecare dat.
6) S se afieze elementele a dintr-o matrice (minime pe linie i maxime pe coloana pe care se
gsesc) i poziia lor.

43

Funcii de intrare/ieire standard

Operaiile de intrare/ieire sunt operaii care permit schimbul de date ntre un program i un
dispozitiv periferic.
Funciile din biblioteca compilatorului C/C++ utilizate mai frecvent pentru operaiile de I/E
sunt: -

pentru intrare: getch, getche, gets, scanf, sscanf ;


pentru ieire: putch, puts, printf, sprintf.

la care se mai adaug macrourile getchar pentru intrare i putchar pentru ieire.
Funciile getch i getche au prototipuri n <conio.h> i sunt folosite pentru preluarea unui
singur caracter din codul ASCII, de la tastatur. Ambele sunt funcii fr parametri, iar getch() preia
caracterul fr ecou (fr tiprirea lui pe ecran), n timp ce getche() preia caracterul cu ecou; ambele
funcii returneaz caracterul citit de la tastatur. Caracterele citite cu aceste funcii sunt preluate
imediat dup apsarea tastei corespunztoare caracterului respectiv.
Apelul funciilor getch i getche conduce la ateptarea apsrii unei taste. Apelul acestor
funcii se face sub forma:
getch( ); sau getche( );
Obs: Funcia getch() este frecvent folosit n programele C pentru a bloca fereastra utilizator pn la
apsarea unei taste.
Funcia putch afieaz pe ecranul terminalului un caracter corespunztor codului ASCII
transmis ca parametru. Caracterele imprimabile au codul ASCII n intervalul [32,126]. Pentru coduri
n afara acestui interval se afieaz diferite imagini. Funcia returneaz valoarea parametrului de la
apel.
Prototipurile acestor trei funcii se gsesc n fiierul conio.h i sunt:
int getch(void);

int getche(void);

int putch(int ch);

Ex 1:
#include <conio.h>
main() /* citete fr ecou un caracter imprimabil ASCII, l afieaz i ateapt acionarea unei taste;
programul se termin dup acionarea unei taste*/
{
putch(getch());
getch();
}
44

Ex 2:
#include <conio.h>
main() /* citete fr ecou un caracter imprimabil ASCII, l afieaz, trece cursorul pe linia
urmtoare i ateapt acionarea unei taste; programul se termin dup acionarea unei taste*/
{
putch(getch());
putch(\n); /* se apeleaz funcia putch cu codul caracterului newline */
getch();
}

Funcia gets are prototip n stdio.h i are ca efect citirea cu ecou de la terminalul standard a
unui ir de caractere ale codului ASCII, la adresa specificat drept parametru al funciei. Din funcie
se revine la:
-

citirea caracterului \n (newline), caracter care este transformat n caracterul \0 (null).


n acest caz funcia returneaz adresa de nceput a zonei de memorie n care se pstreaz
caracterele;

citirea sfritului de fiier (CTRL/Z), funcia returnnd valoarea zero.

Funcia puts are prototip n stdio.h i are ca efect afiarea la terminalul standard a unui ir de
caractere corespunznd codului ASCII de la adresa transmis ca parametru. Caracterul \0 este
interpretat ca \n. Funcia returneaz codul ultimului caracter afiat sau 1 n caz de eroare.

Ex 3:
#include <stdio.h>
void main() /* se tipresc la ieirea standard iruri de caractere preluate de la tastatur. Terminarea
introducerii datelor se face tastnd caracterul EOF prin apsarea simultan a tastelor
Ctrl i Z. */
{
char rand[100];
while(gets(rand)!=NULL)
puts(rand);
printf("\n");
}
45

Obs: n programul de mai sus, NULL este un nume penru o constant simbolic folosit adesea n
locul ntregului zero. n acest exemplu, constanta NULL poate fi nlocuit cu '\0'.
Funcia scanf are rolul de a introduce date tastate de la terminalul standard sub controlul unor
formate. Datele introduse sunt convertite din formatele lor externe n formate interne i sunt pstrate
la adresele specificate la apel. Datele introduse se termin cu apsarea tastei ENTER.

Prototipul funciei scanf se gsete n fiierul stdio.h i este:

int scanf(const char *format [,adresa,..]);

Ea returneaz numrul de cmpuri de la intrare introduse corect sau valoarea EOF(-1) n


cazul ntlnirii sfritului de fiier (CTRL/Z).
Formatul este specificat ca un ir de caractere. El conine specificatorii de format, care
definesc conversiile din formate externe n formate interne. Un specificator de format este alctuit
din:
-

caracterul %;

opional caracterul *, care indic faptul c data prezent la intrare nu se atribuie nici unei
variabile;

opional un numr zecimal, care definete lungimea maxim a cmpului controlat de


format;

1 sau 2 litere, care definesc tipul conversiei.

Cmpul controlat de format ncepe cu primul caracter curent care nu este alb i se termin, dup caz:
a) la caracterul dup care urmeaz un caracter alb;
b) la caracterul care nu corespunde tipului de conversie;
c) la caracterul la care se ajunge la lungimea maxim a cmpului.

Datele se citesc efectiv dup apsarea tastei ENTER. Adresa unei variabile se specific prin
&nume_variabil.

46

Literele care definesc tipul conversiei sunt:

Litera

Tipul datei citite

char

ir de caractere

ntreg zecimal

ntreg octal

x, X

ntreg hexazecimal

unsigned

float

ld, lo, lx, lX

long

lu

unsigned long

lf/ Lf

double/long double

Funcia printf are prototip n stdio.h i este folosit pentru afiarea unor date pe ecranul
terminalului standard sub controlul unor formate. Datele sunt convertite din format intern n
formatul extern specificat.
Apelul funciei printf se face printr-o construcie de forma:
printf("control",arg1,arg2,.....,argn);
unde arg1, arg2,...,argn sunt variabile sau expresii ale cror valori se tipresc n conformitate cu
specificatorii de format prezeni n parametrul "control" al funciei.
Parametrul control este un ir de caractere care definete textele i formatele datelor care se
scriu. n mod concret, acest ir precizeaz transformrile (conversiile) datelor care se afieaz pe
monitor i se reprezint o succesiune de caractere, inclusiv secvene escape i specificatori de
format.
Numrul specificatorilor din parametrul control trebuie s fie egal cu numrul argumentelor
funciei, adic cu numrul variabilelor i/sau expresiilor ale cror valori se tipresc i trebuie de
asemenea s corespund tipului acestora.
Un specificator de format conine:
-

caracterul %;

opional caracterul minus -, care specific ncadrarea datei n stnga cmpului (datele
tiprite se ncadreaz ntr-un cmp - un anumit numr de caractere ; implicit ncadrarea se
face n dreapta);
47

opional un numr zecimal, care definete dimensiunea minim a cmpului n care se


afieaz data;

opional un punct urmat de un numr zecimal, care specific precizia de afiare a datei,
adic numrul de cifre zecimale sau numrul de caractere care se scriu dac data este un
ir de caractere;

una sau dou litere, care definesc tipul conversiei.

Litera c este folosit pentru afiarea unui caracter.


Ex 4:
se afieaz valoarea lui c (caracterul a)
fr nici un fel de formatare

...
char c;
c ='a';

...

a
se tiprete valoarea lui c (caracterul a)
ntr-un cmp de 4 caractere, alinierea
fcndu-se la dreapta cmpului

printf("%c",c);
printf("\n%4c",c);

Litera s este folosit pentru afiarea unui ir de caractere.


Ex 5:

se afieaz irul "Ionescu"


fr nici un fel de formatare

...
char nume [20]="Ionescu";

Ionescu

...

Georg

printf(" %s", nume);


se afieaz primele 5 caractere ale irului
"Popescu" ntr-un cmp de 15 caractere,
alinierea fcndu-se la dreapta cmpului

printf("\n%15.5", "Georgescu");

Litera d se folosete pentru afiarea valorilor variabilelor de tip ntreg, n sistemul de numeraie
zecimal.

48

Ex 6:
...
int a;
a = 46;
...
printf("%d",a);

46

printf("\n%8d",a);

46

printf("\n%-8d",a);

46

printf("\n%05d",a);

00046

printf("\n*%-6d*",a);

*46

printf("\n%d",a/7);

printf("\n%10.3f",a/7.0);

6.571

Litera o se folosete pentru afiarea valorilor variabilelor de tip ntreg, n sistemul de numeraie
octal.
Ex 7:
.

59 = 73 i 175 = 257
10

int a = 59;

59

..

73

printf("%d",a);

10

257

printf("\n%o",a);
printf("\n%9o",175);
Literele x i X se folosesc pentru convertirea i afiarea valorilor unor variabile de tip ntreg n
sistemul de numeraie hexazecimal. Dac se folosete litera x n specificatorul de format, atunci
pentru afiarea numrului hexazecimal vor fi folosite cifrele 0,1,...,9,a,b,c,d,e,f, iar dac se folosete
litera X, atunci pentru afiarea numrului hexazecimal se vor folosi cifrele 0,1,...,9,A,B,C,D,E,F, cu
observaia c n zecimal, A=10, B=11, C=12, D=13, E=14 i F=15.
Ex 8:

printf("%x",33);

21

printf("\n%X",33);

21

printf("\n%x",74);

4a

printf("\n%X",74);

4A

33 = 21 i 74 = 4a
10

printf("%6x",74);

4a
49

16

10

16

Ex 8:
..
int a = 1234, b = 345;

printf("\nzecimal: %-10d%10Xhexa",a,a);

1234

4D2hexa

printf("\n%-6x",2345);

929

printf("\n%-9s%-9s%-9s\n","zecimal","octal","hexa");

zecimal octal hexa

printf("%-9d%-9o%-9X",b,b,b);

345

531

159

Litera f este folosit pentru conversia la tipul float i afiarea valorilor cu 6 cifre zecimale.
Ex 9:
..
float a = 1.234

1.234000

1.234

printf("%f",a);
printf("\n%-10.3f",a);

Ex 10:

#include <stdio.h>
#include <conio.h>
main( )
{
int a;
float b,c;
printf(\nIntroducei o valoare ntreag a=);
scanf(%5d,&a);
printf(\nIntroducei o valoare real b=);
scanf(%5f,&b);
c=a+b;
printf(\nValoarea c=a+b este: %6.3f\n,c);
getch();
}
50

RECURSIVITATE
Un obiect este recursiv dac este definit prin el nsui.
O funcie este recursiv dac ea se autoapeleaz.
Recursivitatea poate fi:
-

direct

- cnd funcia conine un apel direct la ea nsi;

indirect

- cnd funcia conine un apel al altei funcii, care la rndul su o apeleaz pe prima.

La fiecare apel al unei funcii, parametrii i variabilele sale se aloc pe stiv ntr-o zon
independent. Acest lucru se ntmpl la fiecare apel sau autoapel al funciei. Revenirea dintr-o
funcie se face n punctul urmtor celui din care s-a fcut apelul. Adresa de revenire se pstreaz
tot n stiv. La revenire, stiva se reface la starea ei dinaintea apelului, deci variabilele automatice i
parametrii vor reveni la valorile lor dinaintea reapelului respectiv.
O problem important este stoparea autoapelului. De aceea trebuie s existe o condiie de
terminare, fr de care un apel recursiv ar conduce la o bucl infinit. n aplicaiile practice este
necesar nu numai ca adncimea recursivitii sa fie finit, ci s fie relativ mic, deoarece fiecare apel
recursiv necesit alocarea pe stiv a zonei de memorie pentru:
-

parametrii funciei;

variabilele automatice locale funciei;

adresa de return (revenire n punctul de apel).

Ca urmare, stiva poate crete foarte mult i repede se ajunge la ocuparea ntregului spaiu de
memorie alocat ei.
Un exemplu clasic de proces recursiv este calculul factorialului definit astfel:

1.Factorial
n! = 1*2*3*.*n => n! = (n-1)!*n

definim functia fact(n)= fact(n-1)*n, n>=1


1, n=0

int n;

int fact(int n)

void main()

{cin>>n;

if(n= =0)return 1;

cout<<fact(n);

else return fact(n-1)*n;

}
51

2. Sa se implementeze urmatoarele relatii de recurenta:


a) progresia aritmetica: an = an-1 + r
definim functia: pa(n) =

pa(n-1)+r, n>=1
a0 ,n=0

int n, a0, r;
int pa(int n)
{if(n= =0)return a0;
else return pa(n-1)+r;
}
void main()
{
cin>>n>>a0>>r;
cout<<pa(n);
}

b)progresie geometrica: bn = bn-1 *q


definim functia pg(n) =

pg(n-1) *q, n>=1


b0 ,n=0

int n,b0,q;
int pg(int n)
{
if(n= =0)return b0;
else retunr pg(n-1)*q;
}
void main()
{
cin>>n>>b0>>q;
cout<<pg(n);
}
52

3. Sirul lui Fibonacci : 1,1,2,3,5,8,13,21, .

iterativ:
a=1;b=1;i=3;
cin>>n;
while(i<=n){c=a+b;
a=b;
b=c;
i++;
}
cout<<c;

recursiv:
definim functia: fib(n) =

1, n=1
1, n=2
fib(n-1) +fib(n-2), n>=3

int n;
int fib(int n)
{
if ( n= =1)return 1;
else if ( n= =2)return 1;
else return fib(n-1) + fib(n-2);
};
void main()
{
cin>>n;
cout<<fib(n);
}

53

4.Sa se calculeze Ckn in 2 moduri:


a)

Cnk =

n!
k !( n- k )!

int n,k,c;
int fact(int n)
{
if(n= =0)return 1;
else return fact(n-1)*n;
}
void main()
{
cin>>n>>k;
c = fact(n)/(fact(k)*fact(n-k));
cout<<c;
}
b)

Cnk = Cnk-- 11 + Cnk- 1

int n,k;
int cmb(int n,int k)
{
if(k= =0)return 1;
else if(k= =n)return 1;
else return (cmb(n-1,k-1)+cmb(n-1,k));
}
void main()
{cin>>n>>k;
cout<<cmb(n,k);
}
54

4. Sa se afle c.m.m.d.c. a doua numere a si b:

a) cmmdc(a,b) =

cmmdc(a-b,b) , daca a> b


cmmdc(a,b-a) , daca a< b
a, daca a =b

int cmmdc(int a, int b)


{
if (a= =b) return a;
else if (a>b) return cmmdc(a-b,b);
else return cmmdc(a, b-a);
}
void main()
{
cin>>a>>b;
cout<<cmmdc(a,b);
}

b) cmmdc(a,b) =

cmmdc(b, a %b) , daca b 0


a, b =0

int cmmdc(int a, int b)


{
if (b= =0) return a;
else return cmmdc(b, a%b);
}
void main()
{
cin>>a>>b;
cout<<cmmdc(a,b);
}

6. Sa se afle:
55

a) suma cifrelor unui numar natural n:

definim functia: suma(n) = 0, daca n = 0


n%10 + suma(n/10), altfel
int n;
int suma(int n)
{
if ( n= =0)return 0;
else return n%10 + suma(n/10);
};
void main()
{
cin>>n;
cout<<suma(n);
}

b) produsul cifrelor unui numar natural n:

definim functia: prod(n) =

1, daca n = 0
n%10 * prod(n/10), altfel

int n;
int prod(int n)
{
if ( n= =0)return 1;
else return n%10 *prod(n/10);
};
void main()
{
cin>>n;
cout<<prod(n);
}

c) numarul de cifre al unui numar natural n:


56

definim functia: nr(n) =

0, daca n = 0
1+nr(n/10), altfel

int n;
int nr(int n)
{
if ( n= =0)return 0;
else return 1+nr(n/10);
};
void main()
{
cin>>n;
cout<<nr(n);
}

7. Sa se calculeze functia lui Ackermann ( cu m si n citite) :


ack(m,n) =

n+1, m=0
ack(m-1,1) , n=0
ack(m-1, ack(m,n-1)) , altfel

int m, n;
int ack(int m, int n)
{
if ( m= =0) return n+1;
else if (n = =0) return ack(m-1,1);
else return ack(m-1, ack(m,n-1));
};
void main()
{
cin>>m>>n;
cout<<ack(m,n);
}
8. Sa se calculeze functia lui Manna-Pruelli ( cu x citit):
57

f(x) = x -1, x >= 12


f(f(x+2)), x < 12
int x;
int f(int x)
{
if ( x>=12) return x-1;
else return f(f(x+2));
};
void main()
{
cin>>x; cout<<f(x);
}
9. Cautarea binara: se cauta un element x intr-un vector v ordonat crescator:
Fie v (2, 3, 5, 8, 9, 12)
li=1

ls=6

n=6

limita superioara, ls=6

limita inferioara, li=1

m = mijlocul = (li + ls) /2

void cb(int li, int ls)


{
if (li <=ls) {
int m = (li + ls) /2;
if ( x = = v[m]) cout<<m;
else if ( x< v[m]) cb(li, m-1);
else cb(m+1,ls);
};
};
void main()
{
cin>>x>>n;
for(i=1;i<=n;i++) cin>>v[i];
cb(1,n);}
10. Sa se afle sumele:
58

a) S = 1 +2 + 3 + . +n

fie S(n) = 1 +2 + 3 + . +(n-1) + n


S(n -1)

definim S(n) =

0, daca n = 0
S(n -1) + n, daca n > 0

int n;
int S(int n)
{
if ( n= =0)return 0;
else return S(n -1) + n;
};
void main()
{
cin>>n;
cout<<S(n);
}

b) S = 1 + 1/2 + 1/3 + .. + 1/n


definim S(n) =

0, daca n = 0
S(n -1) + 1/n, daca n > 0

int n;

void main()

float S(int n)

cin>>n;

if ( n= =0)return 0;

cout<<S(n);

else return S(n -1) + (float) 1/n;

};

c) S = 1*2 + 2*3 + .. +(n-1)*n


59

int n;
int S(int n)
{
if ( n= =1)return 0;
else return S(n -1) + (n-1)*n;
};
void main()
{
cin>>n;
cout<<S(n);
}

d) S= 1/ (2*3) + 2/(3*4) + + n/ ((n+1)*(n+2))

int n;
int S(int n)
{
if ( n= =0)return 0;
else return S(n -1) + (float) n/((n+1)*(n+2));
};
void main()
{
cin>>n;
cout<<S(n);
}

60

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