Documente Academic
Documente Profesional
Documente Cultură
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”;
}
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
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 ;
Clasificarea operatorilor:
Operatorii se impart in clase de precedenta, fiecare clasa avand o regula de asociativitate, care
indica ordinea aplicarii operatorilor consecutivi de aceeasi precedenta ( prioritate ).
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
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
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:
Operatorii aritmetici
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
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.
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
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 :
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 &, ^, |.
Exemplu:
char a,b;
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:
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;