ELEMENTE DE BAZ LIMBAJULUI DE PROGRAMARE C / C++
1. Vocabularul limbajului
1.1. Setul de caractere
Setul de caractere al limbajului C / C++ conine:
litere ( mari i mici ale alfabetului englez; C / C++ este case-sensitive )
cifre arabe ( de la 0 la 9 )
caractere speciale ( + * / = ^ < > ( ) { } [ ] . , : ; # $ @ _ i spaiu )
simboluri negrafice ( /n newline, /t tab, /b backspace, /r carriage return )
1.2. Separatori i comentarii
ntre oricare dou uniti lexicale admise de limbaj pot exista unul sau mai muli separatori:
spaiul, caracterul ; i caracterul de sfrit de linie. Nu este permis prezena separatorilor n
interiorul identificatorilor, numerelor sau simbolurilor speciale.
Pentru o mai uoar nelegere a unui program este permis folosirea comentariilor. Ele pot
apare oriunde n program ( nu n identificatori i numere ), ncadrate de caracterele /* */. Textul
comentat este ignorat n faza de compilare a programului. Pot apare comentarii care ncep cu //, cu
condiia s se termine pe rndul pe care au nceput.
2. Constante. Identificatori
Constantele sunt o categorie de date cu care lucreaz un program, care nu i pot modifica
valoarea n timpul execuiei programului. Se folosesc n calculul unor expresii sau n interiorul unor
mesaje de afiat.
2.1. Constante ntregi
Corespund mulimii numerelor ntregi ce pot fi reprezentate n memoria calculatorului. Pot
fi scrise n baza 10, 8 sau n baza 16.
Exemplu:
22
constant n baza 10
022
constant n baza 8 ( se preced de caracterul 0 )
0x24 constant n baza 16 ( se preced de caracterele 0x )
2.2. Constante reale
Corespund unei submulimi a mulimii numerelor reale. Pot apare n notaie zecimal
( 2.75, 8.5 ) sau exponenial ( 2.4e5, 5,75E3 ).
2.3. Constante ir de caractere
Reprezint o succesiune de caractere, inclus ntre ghilimele ( "alfa" ). Caracterele irului se
pstreaz ntr-o zon contigu de memorie, prin codurile lor ASCII. Dup ultimul caracter se
pstreaz caracterul NULL ( cu valoarea 0 ), care reprezint marcajul de sfrit de ir.
2.4. Constante simbolice
Sunt constante care au asociat un nume n program. Pot fi orice ir de caractere, introdus
prin construcia #define.
Exemplu:
#define max 7
#define min 100
Un identificator este o succesiune de litere, cifre sau caracterul _ ( primul caracter al
identificatorului trebuie s fie o liter sau caracterul _ ), prin care se asociaz nume constantelor,
tipurilor, variabilelor i funciilor. Lungimea unui identificator nu este limitat, varianta de
implementare a limbajului impunnd numrul de caractere semnificative.
Exemplu:
a1, n, _alfa, a23
( corecte )
a&b, 2a, a+b ( incorecte )
O categorie special de identificatori o constituie cuvintele cheie ale limbajului ( case,
const, else, if, for, while etc ), care nu pot fi redefinite de utilizator, fiind utilizate doar n scopul n
care au fost definite n limbaj.
3. Noiunea de tip de dat. Operatori aritmetici, logici, relaionali
Prin tip de dat se nelege mulimea valorilor pe care le poate avea o dat ( constant sau
variabil ). Tipul restricioneaz funciile i operatorii ce se pot aplica datelor de tipul respectiv.
Limbajul C lucreaz cu tipuri de date standard i utilizator ( clasificare d.p.d.v. al modului de
definire ) i cu tipuri de date simple i structurate ( clasificare d.p.d.v. al compunerii datelor ).
3.1. Tipuri de date standard
Tipurile ntregi de date permit reprezentarea, memorarea i prelucrarea numerelor ntregi.
Numerele ntregi se scriu ca o secven de cifre zecimale, precedat eventual de semnul ( ex: 126,
6382 ). n limbajul C este predefinit tipul ntreg int ( reprezint ntregi cu semn pe 2 octei,
valoarea maxim admis 215 1 = 32767 ).
Tipul int poate fi modificat folosind "modificatori de tip" signed, unsigned, short i long,
rezultnd tipurile :
short int ( ntregi cu semn, se reprezint pe 2 octei )
signed short int ( ntregi cu semn, se reprezint pe 2 octei )
unsigned int ( ntregi fr semn, se reprezint pe 2 octei, valoarea maxim admis este 2 16 1 =
65535 )
unsigned short int ( ntregi fr semn, se reprezint pe 2 octei )
long int ( ntregi cu semn, se reprezint pe 4 octei, valoarea maxim admis este 2 31 1 )
signed long int ( ntregi cu semn, se reprezint pe 4 octei )
unsigned long int ( ntregi fr semn, se reprezint pe 4 octei, valoarea maxim admis este
2 32 1 ).
Operatorii ce pot fi folosii mpreun cu date de tip ntreg sunt:
1. aritmetici:
+ , , * , / , % ( restul mpririi a dou numere ntregi )
2. relaionali:
< , > , != ( diferit ) , = = ( egal ) , <= , >=
3. de atribuire:
=
4. de incrementare / decrementare:
++ , ( i = i + 1 i ++ i + = 1 )
5. logici:
! ( not ) , || ( or ) , && ( and )
6. logici pe bii:
~ ( complement fa de 1 ), << ( deplasare la stnga; o1 << o2 = o1 * 2 o2 ),
>> ( deplasare la dreapta; o1 >> o2 = o1 div 2 o2 ), & ( and ), | ( or ), ^ ( xor )
Cu excepia operatorului !, ceilali operatori logici sunt binari. Se aplic n forma o1
operator o2.
Operatorii |, & i ^ funcioneaz conform urmtoarelor regului:
|
0
1
& 0
1
^
0
1
0
0
1
0
0
0
0
0
1
1
1
1
1
0
1
1
1
0
Tipurile reale de date se folosesc pentru reprezentarea unei submulimi a numerelor
raionale, ce sunt aproximaii ale numerelor reale. Reprezentarea numerelor reale este limitat n
calculator prin mrime i precizie. Numerele reale pot fi scrise n notaie zecimal ( 3.67 ) sau
tiinific ( exponenial 3e05 ).
Tipuri reale n C sunt:
1. float reprezentat pe 6 octei
2. double reprezentat pe 8 octei
Modificatorul long se poate aplica tipului double. Datele de tip long double se reprezint pe
10 octei.
Operatorii ce se pot aplica datelor de tip real sunt:
1. aritmetici:
,+,*,/
2. relaionali:
< , > , != ( diferit ) , = = ( egal ) , <= , >=
Tipul char permite reprezentarea mulimii caracterelor. Un caracter se reprezint pe 1 octet.
La un moment dat o dat de tip caracter conine codul ASCII al unui caracter sau un ntreg n sine.
Pentru atribuirea unei valori unei variabile de tip char se pot folosi constante ntregi sau constante
de tip caracter ( exemplu: c = 'A' sau c = 65 ).
Operatorii ce se pot aplica datelor de tip char sunt:
1. relaionali ( ordonarea e dat de codurile ASCII ale caracterelor 0<9<A<Z<a<z )
2. aritmetici + ,
Tipul void are n funcie de context semnificaia "nimic" sau "orice". El permite construcia
tipurilor generice ( liste cu orice tip de informaie, arbori etc ). De exemplu: int f ( void ) este antetul
unei funcii fr parametrii; void f ( ) este antetul unei funcii care nu returneaz nici un rezultat.
4. Definirea tipurilor de date
Definirea tipurilor se face n C++ printr-o declaraie de forma
typedef < descriere_tip > < nume > ;
O declaraie de tip definete de fapt mulimea valorilor pe care le poate lua o variabil de tipul
respectiv. Un tip de dat poate fi definit pe baza unui tip standard sau utilizator, definit nainte.
Exemplu :
#include<iostream>
using namespace std;
typedef unsigned int natural;
int main()
{ int x;
natural y;
cin>>x>>y;
cout<<x+y;
return 0; }
5. Variabile. Declararea variabilelor
Variabilele sunt o categorie de date a cror valoare se poate modifica pe parcursul execuiei
unui program.
Fiecare variabil are asociat un identificator, prin intermediul cruia i se poate modifica
valoarea. Asocierea identificatorului se face ntr-o declaraie, care are forma general
tip identificator;
La declarare, identificatorii variabilelor de acelai tip se separ prin virgul.
tip poate fi un identificator de tip definit anterior sau un identificator de tip standard.
Declaraia stabilete tipul variabilei. El nu poate fi modificat prin program i definete
mulimea valorilor pe care le poate lua variabila, operatorii ce i se pot aplica etc. De tipul variabilei
depinde dimensiunea zonei de memorie care se aloc variabilei la compilarea programului.
La un moment dat o variabil conine o singur valoare. Modificarea acestei valori se poate
face printr-o citire sau printr-o atribuire. Valoarea rmne nemodificat att timp ct programul nu
acioneaz asupra variabilei sau pn cnd variabila respectiv este desfiinat ( se ncheie execuia
blocului de program n care a fost declarat variabila ).
nainte de utilizare toate variabilele trebuie s fie declarate, pentru a le specifica tipul i
numele i pentru a le rezerva spaiul de memorie necesar memorrii valorilor lor. Abaterea de la
aceast regul produce erori la compilare.
Exemplu :
int i,j;
float x,y,z;
char a,b;
6. Definirea constantelor
Constantele sunt o categorie de date a cror valoare nu se poate modifica pe parcursul
execuiei unui program. Fiecare constant are asociat un identificator i o valoare.
Definirea unei constante se face respectnd sintaxa :
#define identificator valoare
Apariia n program a identificatorului unei constante este echivalent cu apariia valorii ei.
Reciproca nu este adevrat.
Exemplu :
#define a 7
7. Structura programelor
Un program C++ este alctuit din una sau mai multe funcii, din care una este principal.
Funcia principal nu poate lipsi i execuia programului ncepe automat cu ea. Aceasta se numete
main. Un program C++ poate conine :
seciune de declaraii ( opional ) ;
seciune de program ( obligatorie ).
Seciunea de declaraii este structurat astfel :
definiii de constante constante globale ;
definiii de tipuri tipuri globale ;
declaraii de variabile variabile globale ;
declaraii funcii ( subprograme ).
Seciunea de program funcia main cuprinde :
definiii de constante locale ;
definiii de tipuri locale ;
declaraii de variabile locale ;
instruciunile executabile ale programului.
8. Expresii
Conin operanzi ( variabile, constante, funcii ) i operatori, grupai dup aceleai
reguli ca n matematic.
O expresie se evalueaz de la stnga la dreapta, innd cont de prioritatea operatorilor.
Prioritile pot fi modificate prin folosirea parantezelor. Operatorii folosii n limbajul C / C++ au
urmtoarele prioriti:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
+ , , & , * , ++ , , ! , ~ ( operatori unari )
cel mai mare nivel de prioritate
* , / , % ( binari )
+ , ( binari )
<< , >>
< , <= , > , >=
= = , !=
& ( binar )
^
|
&&
||
?,:
= , <<= , >>= , += , = , *= , /= , %= , &= , ^= , |=
9. Citirea / scrierea datelor
n varianta C++, pentru citirea / afiarea datelor se folosesc obiectele cin, cout. Aceste
obiecte se iniializeaz prin includerea fiierului iostream.
Ieirea standard se poate face folosind operaturul <<.
Exemplu :
cout<<i ;
afieaz valoarea i
cout<<"\n";
afieaz newline
cout<<"i="<<i<<"\n";
[Link](5);
cout<<i; afieaz valoarea i pe un cmp de lungime 5;
[Link](3);
cout<<i; afieaz i cu 3 zecimale;
Intrarea standard se poate face folosind operaturul >>.
Exemplu :
cin>>i ;
citete valoarea i
cin>>a>>b;
citete dou valori a i b
char v[100];
cin>>t;
citete irul de caractere t;
10. STRUCTURI DE CONTROL
10.1. Structura liniar; instruciunea de atribuire; instruciunea compus
Structura liniar cuprinde operaii ce se execut secvenial, n ordinea n care apar. Aceast
structur este generat de instruciunile de atribuire sau compuse.
Instruciunea de atribuire permite depunerea unei valori ntr-o variabil. Are forma
v=expresie;
v este numele unei variabile. Operatorul = se numete operator de atribuire.
La execuia unei instruciuni de atribuire se evalueaz expresia i variabila v primete
valoarea calculat. Mrimile atribuite pot fi de orice tip, cu excepia tipului fiier.
Instruciunea compus este format dintr-o list de instruciuni, separate prin caracterul ;
i cuprins ntre caracterele { i }. Instruciunile se execut una dupa alta, n ordinea apariiei lor n
list. O instruciune compus poate face parte dintr-o alt instruciune compus, caz n care
perechile { } se grupeaz dup principiul parantezelor din matematic.
Caracterul ; separ instruciunile, nu le termin i nici nu face parte din ele.
Instruciunea vid se reprezint prin caracterul ;. Nu are nici un efect. Se utilizeaz n
construcii n care se cere prezena unei instruciuni, dar nu trebuie s se execute nimic n punctul
respectiv. ( de exemplu, instruciunea for(p=q=sqrt(n); p*q!=n; p++,q=n/p); determin p i q a..
p*q=n i p-q=minim ).
10.2 Structura alternativ; instruciunile IF i SWITCH
Luarea unei decizii privind grupul de instruciuni ce va fi executat n continuarea unui
program poate fi fcut prin instruciuni condiionale.
Instruciunea IF permite selectarea unei variante de continuare a execuiei unui program
din dou alternative posibile. Are sintaxa:
if(expresie) instr1;
else instr2;
Expresia trebuie s fie de tip logic. Combinarea mai multor expresii se poate face cu
operatorii logici &&, ||, !.
Instruciunea se execut astfel: se evalueaz expresia; dac valoarea ei este diferit de 0
(adevrat), se execut instr1, altfel se execut instr2; se continu execuia cu urmtoarea
instruciune din program. instr1 i instr2 se exclud reciproc, ambele nefiind executate niciodat.
instr1 i instr2 pot fi orice instruciuni C, inclusiv IF. Dac una din ramurile instruciunii IF
conine mai multe alte instruciuni, ele se grupeaz ntr-o instruciune compus. n cazul n care
exist instruciuni IF imbricate, ultimul ELSE corespunde celui mai apropiat IF care nu are ELSE.
Ambiguitile pot fi eliminate folosind perechi { }.
Poate apare i n forma
if(expresie) instr;
caz n care instruciunea are efect n program doar dac expresia are valoarea diferit de 0.
Exemplu:
determinarea maximului a 3 valori x, y, z.
if(x>=y)
if(x>=z) max=x;
else max=z;
else if(y>=z) max=y;
else max=z;
Pentru testarea a n condiii c1, c2,..,cn care provoac execuia instruciunilor i1, i2,..,in, i din
care la un moment dat poate fi adevrat numai una, pentru creterea vitezei de execuie a
programului, n loc de
if(c1) i1;
if(c2) i2;
................
if(cn) in;
este mai avantajoas varianta
if(c1) i1;
else if (c2) i2;
else............
else if (cn) in;
caz n care nu mai sunt testate toate cele n condiii.
Instruciunea SWITCH permite selectarea ( n vederea execuiei ) unei singure alternative
din mai multe posibile. Are sintaxa:
switch(expr)
{ case c1: instr1; break;
case c2: instr2; break;
...........
case cn: instrn; break;
[default: instrn+1]
}
expr se numete expresie selector. Trebuie s fie de tip ordinal ( standard sau utilizator ). c i
se numesc constante ( etichete ) CASE i ele trebuie s fie toate de acelai tip i acest tip s coincid
cu cel al expresiei selector. Valorile utilizate pentru etichete trebuie s fie distincte.
Instruciunea se execut astfel: se evalueaz expresia selector; se execut instruciunea care
este precedat de o constant egal cu valoarea expresiei selector ( dac exist ). Dup execuia
instruciunii selectate se va trece la instruciunea ce urmeaz n program. Dac toate constantele ci
sunt diferite de valoarea selectorului, se execut instruciunea din clauza DEFAULT. Dac
DEFAULT lipsete, instruciunea SWITCH nu are efect.
Prezena instruciunii break nu este obligatorie. Dac ea lipsete de la sfritul unei
alternative, dup execuia instruciunii corespunztoare alternativei respective se trece la executarea
instruciunii din alternativa urmtoare.
10.3. Structura repetitiv; instruciunile WHILE, DO WHILE, FOR; instruciunile
BREAK i CONTINUE
Structura repetitiv permite execuia repetat a uneia sau mai multor instruciuni.
Instruciunea WHILE ( ciclu cu test iniial ) se folosete n situaia n care numrul de
repetri nu este dinainte cunoscut. Permite repetarea de 0 sau mai multe ori a unei instruciuni ( ct
timp o condiie este adevrat ).
Forma general a instruciunii WHILE este:
while(expresie) instruciune;
Se evalueaz expresia i dac este diferit de 0 ( TRUE ) se execut instruciunea. Operaia
se repet pn cnd la evaluarea expresiei se obine o valoare 0 ( FALSE ). Dac se dorete
repetarea mai multor instruciuni, ele se grupeaz ntr-o instruciune compus.
Este posibil ca instruciunea s nu se execute niciodat dac de la nceput expresia are valoarea
FALSE.
Instruciunea interioar buclei WHILE trebuie scris astfel nct s modifice variabila ce
intrevine n expresie, astfel nct aceasta s poat deveni fals. Dac acest lucru nu se realizeaz se
ajunge la o bucl infinit.
Deoarece expresia se reevalueaz la fiecare execuie a buclei WHILE este necesar ca ea sa
aib o form ct mai simpl.
Exemplu:
calculul lui x n
p=1; i=1;
while(i<=n) { p=p*x; i=i+1; }
Instruciunea DO WHILE ( ciclu cu test final ) se folosete cnd nu se cunoate numrul
de repetri, dar exist certitudinea c bucla trebuie parcurs cel puin o dat.
Forma general a instruciunii este:
do instruciune while(expresie);
Se evalueaz expresia i dac are valoarea TRUE ( nenul ) se execut instruciunea.
Execuia se repet pn cnd la evaluarea expresiei se obine FALSE ( 0 ).
Instruciunea se execut cel puin o dat, chiar dac de la nceput expresia are valoarea TRUE.
Instruciunea interioar buclei trebuie scris astfel nct s modifice variabila ce intrevine n
expresie, astfel nct aceasta s poat deveni adevrat. Deoarece expresia se reevalueaz la fiecare
execuie a buclei este necesar ca ea s aib o form ct mai simpl.
Exemplu:
calculul lui x n
p=1; i=1;
do { p=p*x; i=i+1;
} while(i<=n);
Instruciunea FOR ( ciclu cu contor ) se folosete cnd numrul de repetri al unei
secvene este dinainte cunoscut. Are forma:
for(exp1;exp2;exp3) instruciune;
exp1 iniializarea ciclului FOR; se execut o singur dat; poate fi orice expresie aritmetic
exp2 test de control; se execut naintea fiecrei iteraii; dac este adevrat se execut corpul
ciclului; ciclul se execut pn cnd condiia exp2 devine fals;
exp3 reiniializarea ciclului;
Oricare din aceste expresii poate lipsi.
Exemplu:
calculul lui x n
p=1;
for(i=1;i<=n;i++) p=p*x;
Instruciunea BREAK determin ieirea forat din instruciunea repetitiv care o conine.
Programul se continu cu instruciunea ce urmeaz celei repetitive.
Instruciunea CONTINUE face un salt necondiionat la sfritul buclei ce o conine.
Instruciunile dintre CONTINUE i sfritul buclei sunt ignorate i se revine la nceputul buclei.