Sunteți pe pagina 1din 12

Limbajul de programare c++

Pentru a executa (rula) pe calculator un algoritm descris in pseudocod el trebuie implementat


intr-un limbaj de programare . Reprezentarea algoritmului intr-un limbaj de programare se face cu
ajutorul unui editor de texte rezultand un fisier sub numele de program sursa . In cadrul limbajului c++
programele sursa vor avea extensia .cpp .

Limbajul de programare se caracterizeaza prin :


1. sintaxa : reprezinta totalitatea regulilor de scriere corecta astfel incat compilatorul sa le poata
traduce in cod masina .
2. semantica : reprezinta constructia corecta a algoritmului din punc de vedere sintactic
3. vocabularul : reprezinta totalitatea cuvintelor care pot fi utilizate in program
Pentru constructia cuvintelor setul de caractere utilizat este format din :
1. litere mari si mici(a..z, A..Z)
2. cifrele zecimale(0..9)
3. caractere speciale (+,-,*,/,spatiu,#,@, !, ?, etc )

Cuvintele se pot clasifica in :


1. identificatori : nume date de catre utilizator pentu variabile, constante, nume de functii, nume
de structuri , etc . Identificatorii sunt o succesiune de litere, cifre sau caracterul de subliniere(_)
cu observatia ca primul caracter sa fie obligatoriu o litera .
obs : in limbajul c++ se face diferenta intre literele mici si mari
2. separatori : utilizati pentu a separa unitatile lexicale . Separatori pot fi :
a) spatiul si TAB
b) enter (CR+LF)
c) virgula (,)
3. cuvinte cheie : sunt cuvinte cu o semnificatie bine definita care nu pot fi utilizate intr-un alt
scop . Exemple de cuvinte cheie : if,for,include,main,void,while,do, else,int,float,sqrt,abs, etc .
OBS : Orice program poate sa contina si comentarii pentru a face mai usor intelegerea . Comentariile
pot fi de doua feluri :
a) comentariul pentru o singura linie : // comentariul respectiv
b) comentariul pentu mai multe linii:incepe cu /* se scrie comentariul si se termina cu * /

I. Structura programului in limbajul C++

Zona 1 : directive prepocesor ( sunt indicate de simbolul #) : determină includerea în fişierul
sursă a fişierelor header cu nume specificat ( se mai numesc si biblioteci )
Exemple :
a)
#include<iostream> : pentru instructiunile de citire scriere
b)
#include<iomanip.h> : pentru specificati de afisare
c)
#include<conio.h> : pentru curatarea ecranului (clrscr()), citire de caracter (getch()), etc
d)
#include<math.h> : pentru functii matematice
e)
#include<fstream> : pentru lucru cu fisiere text
f)
#include<string.h> : pentru lucru cu siruri de caractere
Zona 2 : zona declarativa globala : se pot declara variabile, constante, noi tipuri de date
Zona 3 : definiri de subprograme ( se numesc functii )
Zona 4 : functia principala
Structura functiei principale :
a) Antetul functiei : int main()
b) Corpul functiei avand urmatoarea structura :
1. zona declarative locala : se pot declara variabile,constante, tipuri noi de date
2. set de instructiuni
Obs : Corpul functiei incepe cu { si se termina cu }

Exeplu de program :
#include<iostream>
void main()
{
cout<< ” am scris primul program”;
}

II. Instructiuni declarative


Clasificare :
a) tipuri de date
b) constatnte
c) variabile
Tipuri de date :
a) tipuri predefinite(standard): caracter(char), intreg, real, neprecizat (void)
b) tipuri definite de utilizator ( cu ajutorul typedef )
obs : pentru tipul logic valoarea 0=fals, iar orice valoare diferita de 0 reprezinta valoare de adevar
Tipul de date intreg
Tipul de date Dimensiunea valorile observatii
char 8 biti  2 ..2  1
7 7
Folosit in special pentu caractere respectiv
siruri de caractere. Variabila de tip char retine
codul ASCII al caracterului
unsigned char 8 biti 0..2  1
8
Retine doar valorile pozitive
int 16 biti  2 ..2  1
15 15
Numerele intregi cu semn
unsigned int sau 16 biti 0..2  1
16
Numere intrgi fara semn adica valori pozitive
unsigned
short int este 8 biti  2 7 ..2 7  1 Utilizat pentu numere intregi cu valori
echivalent cu char minime
long sau long int 32 biti  2 31..2 31  1 Numere intregi cu semn care ajung la maxim
9 cifre
unsigned long 32 biti 0..2 32  1 Numere intregi pozitive retinand valori mai
mari

Tipul de date real


Tipul de date Dimensiunea Observatii
Float 4 octeti=8 biti Precizie de 6 cifre(primele 6 cifre dupa virgula sunt
semnificative
Double 8 octeti=64biti Precizie de 10 cifre (primele 10 cifre dupa virgula
sunt semnificative )
Long double 10 octeti=80 biti Precizie de 15 cifre ( primele 15 cifre dupa virgula
sunt semnificative )

Tipuri de date definite de utilizator


Definirea acestor tipuri se face astfel : typedef definitia_tipului nume_tip_utilizator ;
Exemplu :
a) typedef unsigned int natural;
b) typedef float real;
c) typedef enum {false,true} logic;
Obs : Aceste noi tipuri de date natual si real se pot utilize in program .

Constante
Constantele utilizate in limbajul c++ se pot clasifica in :
a) constante literale : valorile efective pe care le utilizam in program
b) constante simbolice : sunt identificatorii utilizati in program

Constantele literale se clasifica in :


a) constante literale numere intregi ( se pot defini constante doar pentru valori positive ) .
Aceste constante se pot exprima in baza 10, in baza 8 sau in baza 16, Exemple :
1) in baza 10 : 3, 6, 123, 34501
2) in baza 8 ( valoarea constantei trebuie sa fie precedata de 0 ) : 0124 84
3) in baza 16( valoarea constantei trebuie sa fie precedata de 0x sau 0X) : 0x1a 26
b) constante literale numere reale
1) constanta reala pentu care se specifica partea reala urmata de caracterul punct (pentu
virgula ) si de partea zecimala : -42.134, 0.12541, -0.32
2) constanta reala sub forma stiintifica care este specificata de mantinsa si exponent. Cele
doua expresi mantinsa=numar real si exponent=numar intreg sunt separate de caracterul
e sau E( pe post de valoarea 10 ) .
Exemple : i) -6.4e3 corespunde numarului real  6.4  10 3
c) constante literale caracter – pot fi exprimate astfel :
1) printr-un caracter delimitat de o pereche de apostrofuri : ‘d’, ‘g’, ‘9’, etc .
2) prin codul ascii al caracterului : 65 (A), 97 (a), 90 (Z), etc.
3) prin secvente escape- in acest caz constanta este precizata prin codul ascii dar valoarea
se exprima in baza 8 sau 16, fiind delimitata printr-o pereche de apostrofuri si incepe
obligatoriu cu \ . Exemle : ‘\n’—pentu linie noua, ‘\t’ – pentu tabulator orizontal, ‘\v’ –
pentu tabulator vertical , etc.
d) constante literale sir de caractere – reprezinta un sir de caractere delimitat printr-o pereche de
ghilimele . Exemplu : ” aasada”, ”12312312”, ”ewqefdsfw342134124”, etc.
Constantele simbolice  :
Declararea lor se poate face astfel :
a) const nume_constanta=valoarea ;
b) const tip_data_constanta nume_constanta=valoare ;
 nume_constanta= nume dat de utilizator constantei respective .
Exemplu : const pi=3.14 ; const lit=’a’ ; etc .
 valoarea= reprezinta valoarea data de utilizator pentu constanta respectiva
 tip_data_constanta= reprezinta tipul constantei definite de utilizator
Exemplu : const int a=6,b=9,c=0; const float x=8.98,y=-98.56;
c) enum {lista constante} ;
Exemplu : enum {a=8,b=5,c=10,d} ;
d) enum nume_enumerare {lista constante } ;
Exemplu ; enum logic {false,true} ; in acest caz false este codificat de valoarea o, iar true de
valoarea 1 .

III. Variabile
Declarea variabilor se face astfel :
1. tip_data variabila;
exemple :
a) int a;
b) float b;
c) char c;
d) int a=7; ( o variabila se poate initialize direct din declarare )
obs : la declarare fiecarei variabile I se va aloca o zona de memorie a carei dimensiune este data de
tipul de data .

2. tip_data lista de variabile ; (variabilele din lista se vor separa prin virgula )
exemple :
a) int a,b,c ;
b) float x,y,z,t ;
c) char c1,c2=’d’ ;
d) long f=2323123412,h,k=-323412342 ;

IV. Operatorii limbajului c++

Limbajul C++ se caracterizeaza printr-un set foarte larg de operatori.


Operatorii sunt simboluri utilizate pentru precizarea oparatiilor care trebuie executate asupra
operanzilor.
Operanzii pot fi constante, variabile, nume de functii, expresii.
Expresiile sunt entitati construite cu ajutorul operanzilor si operatorilor, respectand sintaxa si
semantica limbajului. Cea mai simpla expresie este cea formata dintr-un singur operand .

Clasificarea operatorilor:

 dupa numarul operanzilor prelucrati:


o unari
o binari
o ternari - cel conditional; alte limbaje de nivel inalt nu definesc astfel de operatori 
 dupa ordinea de succedare a operatorilor si operanzilor:
o prefixati
o infixati
o postfixati
 dupa tipul operanzilor si al prelucrarii:
o aritmetici
o relationali
o logici
o la nivel de bit.

Operatorii se impart in clase de precedenta, fiecare clasa avand o regula de asociativitate, care
indica ordinea aplicarii operatorilor consecutivi de aceeasi precedenta ( prioritate ).

Operator Utilizare Semnificatie Asociativitate Observatii


( )  f(e)  apel functie  ----------->
[ ]  t[i]  indexare 
.  s.c  selectie 
->  p->c  selectie indirecta 
--  a--  postdecrementare 
++ a++ postincrementare
-  -v  schimbare semn  <-----------
+  +v  plus unar ( fara efect) 
--  --a  predecrementare 
++  ++a  preincrementare 
!  !i negatie logica 
~  ~i  complementare
( negare bit cu bit ) 
*  *p  adresare indirecta 
&  &a  preluare adresa 
sizeof  sizeof(x)  determinare
() dimensiune (in octeti ) 
(d) e
conversie de tip ( cast )
*  v1*v2  inmultire  ----------->
/  v1/v2  impartire 
%  v1%v2  rest impartire(modulo )
+  v1+v2  adunare  ----------->
-  v1-v2  scadere
<<  i1<<i2  deplasare stanga  ----------->
>>  i1>>i2 deplasare dreapta
<  v1<v2  mai mic  ----------->
<=  v1<=v2  mai mic sau egal 
>  v1>v2  mai mare 
>=  v1>=v2  mai mare sau egal 
==  v1==v2  egal  ----------->
!=  v1!=v2  diferit
& i1&i2  si pe biti  ----------->
^  i1^i2  sau exclusiv pe biti  ----------->
| i1|i2  sau pe biti  ----------->
&&  i1&&i2  si logic ( conjunctie )  ----------->
|| i1||i2 sau logic ( disjunctie ) ----------->
? :  i?v1:v2  operator <-----------
conditional(ternar ) 
=  a=v  atribuire  <-----------
*=  /=  a*=v 
%=  variante ale 
+=  -=  operatorului de
&=  ^=  | atribuire 

<<=  >>=
, e1,e2 secventiere ----------->

Legenda:
a-variabila intreaga sau reala    i-intreg
c-camp                                   v-valoare intreaga  sau reala
d-nume tip                              p-pointer
e-expresie                              s-structura sau uniune
f-nume de functie                    t-tablou
x-nume tip sau expresie

Conversii de tip. Operatorul de conversie explicita (cast)

La evaluarea expresiilor pot apare conversii implicite:

 in expresia variabila=expresie se evalueaza prima data expresia, fara a tine cont de tipul
variabilei; daca tipul rezultatului obtinut este diferit de cel al variabilei, se realizeaza conversia
implicita la tipul variabilei
 daca o expresie are doar operanzi intregi, ei se convertesc la int
 daca o expresie are doar operanzi reali sau intregi, ei se convertesc la double.

Operatorul de conversie explicita -- ( cast ) se utilizeaza cand se doreste ca tipul unui operand
( expresie ) sa fie altul decat cel implicit. Operatorul este unar, are prioritate ridicata si are sintaxa:
      ( tip ) expresie ;

Exemple:

 conversii implicite

int i; char c='c';long l; float f;


i=2.9; // 2.9 e convertit implicit la int, deci i va fi 2
f='A'; // f va fi 65.0 ( codul ASCII )
i=30000+c; // expresia se calculeaza in domeniul int, i va fi 30099
i=30000+10000; // calcul expresie in domeniul int, apare depasire, nesemnalata, i va fi -25536
l=30000+10000; // -25536 va fi convertit la long
conversii explicite

float r;
r=5/2; // impartirea se face in domeniul int, deci r va fi 2.0
r=(float)5/2; // r va fi 2.5, pentru ca primul operand este de tip float, deci calculul se face in domeniul
real

Operatorul sizeof

Rezultatul aplicarii acestui operator unar este un intreg reprezentand numarul de octeti necesari
pentru stocarea unei valori de tipul operand sau pentru stocarea rezultatului expresiei ( care nu se
evalueaza ), daca operandul este o expresie. Operatorul are efect la compilare, pentru ca atunci se
stabileste tipul operanzilor. 
Sintaxa:
  sizeof (tip)
 sizeof (expresie)

Exemple:

In fereastra de evaluare ( deschisa cu CTRL/F4 ) se pot tasta expresiile:


 sizeof('a')
 sizeof(int)
 sizeof(2.5 + 3)
si vor apare rezultatele 2, 2, 8 - ultima expresie e de tip double ( constanta 2.5 e de tip double ).

Operatorii aritmetici

Operatorii aritmetici sunt in ordinea descrescatoare a prioritatii:

 operatorii unari de pastrare/schimbare a semnului:   +  -


 operatorii binari multiplicativi - de inmultire, impartire, modulo:  * / %
 operatorii binari aditivi - de adunare si scadere:  + -

Depasirile la calculele cu reali sunt semnalate, cele la calculele cu intregi, nu. Se semnaleaza de
asemenea eroarea de impartire cu 0.

Operatorii de adresare

Operatorii de adresare sunt utilizati pentru a obtine adresa unei entitati:

 indexare []
 selectie directa .
 selectie indirecta ->
 determinare adresa &
 adresare indirecta *

Operatorul de determinare a adresei & este unar, operandul fiind o variabila. Pana in prezent, s-a
vazut utilizarea lui in determinarea adreselor variabilelor care se transmit ca parametri functiei scanf. 

Ceilalti operatori din aceasta categorie vor fi discutati la  capitolele referitoare la tablouri, pointeri,
structuri.
Operatorii de atribuire

Spre deosebire de alte limbaje in care atribuirea este o instructie, in limbajul C++ se defineste
operatorul de atribuire =.

Aceste este binar si are o prioritate scazuta, mai mare doar decat a operatorului secvential , ;regula de
asociativitate este de la dreapta spre stanga, iar sintaxa este:
    variabila=expresie ;

Expresia este evaluata, apoi rezultatul ei este memorat in variabila si este furnizat si ca efect lateral,
astfel incat poate fi utilizat.

Exemple:

int i,j,k;
i=j=k=0;  // efectul lateral este folosit, variabilele sunt initializate cu aceeasi valoare, 0

Limbajul C++ defineste operatorii de atribuire compusi, care permit o scriere mai compacta a
atribuirilor de forma:
    variabila=variabila op expresie ;
prin
    variabila op= expresie
Se definesc astfel operatorii  +=   -=   *=   /=   %=   &=   |=   ^=   <<=   >>=  ( ultimii cinci sunt
operatori pe biti )

Exemple:

int i=3,j=9,k=11;
i+=j;  // atribuirea este echivalenta cu i=i+j;
k%=j-=4; // asocierea fiind de la dreapta la stanga, prima data se calculeaza j-=4, 
        // deci j va fi 5, valoare care este folosita prin efect lateral pentru k%=5, deci k va fi 1

Din aceasta categorie mai fac parte si operatorii unari de incrementare si decrementare ++,
respectiv --. Pot fi utilizati ca operatori prefixati sau postfixati:
     ++variabila
    variabila++
    --variabila
    variabila--
Expresiile ++variabila, variabila++ sunt echivalente cu variabila+=1, dar efectul lateral la
preincrementare este de a furniza valoarea variabilei dupa incrementare, iar la postincrementare
valoarea furnizata este cea dinaintea incrementarii.

Exemple:

// scrise ca instructiuni, deci efectul lateral nefolosindu-se, expresiile urmatoare sunt echivalente:
i++;  ++i;  i=i+1;  i+=1;

int i=3,j=9,k;
k=++i+j--; // i va fi 4, j va fi 8, iar k va fi 13, in adunare intrand valoarea lui j inainte de decrementare
Operatorii relationali

Operatorii relationali sunt binari si expresiile in care apar sunt 0, daca relatia e falsa, 1 daca e
adevarata.

C-ul nu defineste tipul boolean, asa incat: 0 este interpretat ca valoarea logica fals, iar orice valoare
diferita de 0 este interpretata ca adevarat.

Operatorii relationali sunt:


<   <=   >   >=
==   !=               ( egal, diferit )

A nu se confunda conditia a==b cu expresia a=b, ultima avand valoarea adevarat pentru orice valoare a
lui b diferita de 0.

Operatorii logici

Conditiile mai complexe se obtin aplicand conditiilor simple operatorii logici:


!         negatie logica
&&    si logic
||        sau logic

Operanzii sunt intregi, interpretati ca valori logice. Prioritatea operatorilor && si || este mai scazuta
decat a celor conditionali, a celui de negare, fiind unar, este cea mai ridicata. 

Operatorii trateaza operanzii ca valori logice, deci orice valoarea diferita de 0 este interpretata ca
adevarat, iar 0 ca fals. Aplicand unui intreg operatorul de negatie logica, se obtine 1 daca operandul e
fals, respectiv 0 daca operandul este adevarat.
 

x y !x x&&y x||y
0 0 1 0 0
0 !=0 1 0 1
!=0 0 0 0 1
!=0 !=0 0 1 1

Se observa din tabela de mai sus ca daca primul operand al expresiei in care apare operatorul
&& este 0, sigur rezultatul final este 0, indiferent de valoarea celui de-al doilea. Similar, daca primul
operand al expresiei in care apare operatorul  || este !=0, sigur rezultatul final este 1, indiferent de
valoarea celui de-al doilea. 
Operatorul conditional

Operatorul conditional ? : este singurul operator ternar. Are prioritatea mai ridicata doar decat
a operatorilor de atribuire si a celui secvential, iar asociativitatea este de la dreapta spre stanga. El se
foloseste in situatiile in care exista doua variante de obtinere a unui rezultat, dintre care se alege una
singura, functie de indeplinirea sau neindeplinirea unei conditii. Cei trei operanzi sunt expresii, prima
reprezentand conditia testata.
    expr0 ? expr1 : expr2
Daca valoarea expr0 este adevarata ( !=0 ), se evalueaza expr1, altfel expr2, rezultatul expresiei
evaluate fiind rezultatul final al expresiei conditionale.

Exemple:

Expresia de mai jos determina valoarea maxima dintre a si b, pe care o memoreaza in max:
    max=a>b?a:b;
Acelasi rezultat se obtine daca se foloseste instructiunea if:
    if(a>b)max=a;
    else max=b;

Operatorul conditional

Operatorul secvential , ( virgula ) este cel cu prioritatea cea mai scazuta. Se foloseste atunci cand
sintaxa limbajului impune prezenta unei singure expresii, iar prelucrarea presupune evaluarea a doua
sau mai multor expresii; acestea se evalueaza de la stanga la dreapta, iar rezultatul iintregii expresii este
cel al ultimei expresii ( exprn ):
    expr1,expr2,...,exprn

Exemple:

Expresia de mai jos memoreaza in max valoarea maxima dintre a si b, realizand si ordonarea
descrescatoare a acestora (
deci le interschimba daca a<b -- a se observa ca interschimbarea presupune utilizarea unei variabile
auxiliare  ):
    int a,b,aux,max;
    max=a>=b?a:(aux=b,b=a,a=aux); //operatorul secvential e necesar pentru a avea o singura expresie
dupa :

Folosind instructiunea if, prelucrarea de mai sus se poate scrie:


    if(a<b)aux=b,b=a,a=aux;  //interschimbare daca a<b, deci in a va fi valoarea maxima max=a;

Operatorii pe biti

Operatorii la nivel de bit se aplica fiecarui bit din reprezentarea operanzilor intregi, spre
deosebire de restul operatorilor care se aplica valorilor operanzilor.

Din aceasta categorie fac parte operatorii urmatori, care apar in ordinea descrescatoare a prioritatii:
    ~        complementare
    >>      deplasare la dreapta
    <<      deplasare la stanga
    &        si
    ^         sau exclusiv
    |          sau

Operatorul ~ transforma fiecare bit din reprezentarea operandului in complementarul sau -- bitii 1 in 0
si cei 0 in 1.
Operatorii &, ^, | realizeaza operatiile si, sau exclusiv, respectiv sau intre toate perechile de biti
corespunzatori ai operanzilor. Daca b1 si b2 reprezinta o astfel de pereche, tabelul urmator prezinta
valorile obtinute prin aplicarea operatorilor &, ^, |.
 

b1 b2 b1&b2 b1^b2 b1|b2


0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 0 1

Din tabela de mai sus se observa ca aplicand unui bit:

 operatorul & cu 0, bitul este sters


 operatorul & cu 1, bitul este neschimbat
 operatorul | cu 1, bitul este setat
 operatorul ^ cu 1, bitul este complementat.

Exemplu:

char a,b;

a b ~a ! ~b ! a&b a^b a|b


a b
0000000 0000000 1111111 1 1111111 0 0000000 0000000 0000000
0 1 1 0 0 1 1
1111111 1010101 0000000 0 0101010 0 1010101 0101010 1111111
1 0 0 1 0 1 1

In cazul operatorilor de deplasare, care sunt binari, primul operand este cel al carui biti sunt
deplasati, iar al doilea indica numarul de biti cu care se face deplasarea -- deci numai primul operand
este prelucrat la nivel de bit:
    a<<n
    a>>n

La deplasarea la stanga cu o pozitie, bitul cel mai semnificativ se pierde, iar in dreapta se completeaza
cu bitul 0.
La deplasarea la dreapta cu o pozitie, bitul cel mai putin semnificativ se pierde, iar in stanga se
completeaza cu un bit identic cu cel de semn.
Cu exceptia cazurilor cand se produce depasire, deplasarea la stanga cu n biti echivaleaza cu inmultirea
cu 2 la puterea n.
Analog, deplasarea la dreapta cu n biti echivaleaza cu impartirea cu 2 la puterea n. Este indicat a se
realiza inmultirile si impartirile cu puteri ale lui 2 prin deplasari, ultimele realizandu-se intr-un timp
mult mai scurt.

Exemple:

 Cele doua secvente din tabela conduc la aceleasi rezultate:

    int i;

i*=8; i<<=3;
i/=4; i>>=2;
i*=10; i=i<<3+i<<1;

In tabela urmatoare apar valorile obtinute ( in binar si zecimal ) prin aplicarea operatorilor de
deplasare:

    char a;

a a<<1 a<<2 a>>1 a<<2


00000001
00000010 00000100 00000000 00000000
2 4 0 0
1
00001110
00011100 00111000 00000111 00000011
28 56 7 3
14
11111111
11111110 11111100 11111111 11111111
-2 -4 -1 -1
-1
11011101
10111010 01110100 11101110 11110111
-70 116(depasire) -18 -9
-35

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