Sunteți pe pagina 1din 26

C++

1. Structura unui program în limbajul C. Moduri de scriere a comentariilor în limbajul C.


Includerea bibliotecilor. Funcţia main Alfabetul limbajului C. Litere. Cifre. Cuvinte cheie. Operatori
şi semne de punctuaţie.
Orice program c reprezinta o secventa formata din una sau mai multe directive ,declaratii de
variabile, instructiuni, definitii de functii si apeluri de functii. Programul este alcatuit din 2 parti
:antetul – cuprinde biblioteci si directivele(# include si #define); corpul programului-incepe cu
functia main, declararea variabilelor, si algoritmul de rezolvare.

Comentariile sunt niste siruri de caractere care sunt ignorate de compilator si sunt folosite pentru
a mari lizibilitataea programului. Un compilator in C e precedat de secventa de caractere “/* ” si
termina cu seventa “*/”. Ele pot aparea in orice loc al programului pot ocupa mai mult de o linie .
Pentru comentariile scurte se foloseste”//”.Bibliotecile ajuta la compilarea unui program iar
absenta lor duce la eroare si nu permite executia programelor . Functia main este un punct de
intrare si de la ea se incepe executia programului.

Multimea caracterelor (litere mari si mici ale alfabetului latin, cifre zecimale, semen de punctuatie
si alte simboluri speciale) formeaza alfabetul limbajului de programare C. C-ul are un sir de cuvinte
chee care nu pot fi utilizate ca nume de identificatori dar se utilizeaza pentru a manipula memoria
si registrele procesorului, Fiecare compilator are setul sau de cuvinte chee. Cuvintele cheie sunt
cuvinte ale limbajului, împrumutate din limba engleza, carora programatorul nu le poate da o alta
utilizare. Cuvintele cheie se scriu cu litere mici . Operatorii sunt combinatii de simboluri speciale
care specifica modul de prelucrare a datelor.Exista operatori unari(se asociaza de la dreapta spre
stinga,&!) binari(se asociaza de la stinga la dreapta,+,-,><) ternari(operator conditional ? :).

i j Conditia

Ce va afişa secvenţa de ? -3 i<4 A program:

void main(void) 0 0 0<4 A

{ int i, j=-3; 1 3 1<4 A


for (i=0; i<4; i++) 2 6 2<4 A
{ j+=3; } 3 9 3<4 A
printf(“\ni=%d j=%d”, i, j); 4 12 4<4 F
}

Rs: i=4 j=12

2.Tipuri de date simple.Variabila. Declararea variabilelor de tip numeric, caracter şi şir de caractere.
Exemple.
Tipul unei date consta într-o multime de valori pentru care s-a adoptat un anumit mod de
reprezentare în memoria calculatorului si o multime de operatori care pot fi aplicati acestor valori.
Tipul unei date determina lungimea zonei de memorie ocupata de acea data
Limbajul C permite utilizarea tipurilor de date cel mai des utilizate in calculatoare : int(interg), float
si double(real) ,char(caracter).Aceste tipuri se numesc tipuri de baza sau tipuri de date predefinite.
Variabila este un nume atribuit unei valori folosite in prelucrare. Declararea variabilelor
areurmatoarea forma: specificator _de_tip lista_variabilelor;

Unde specificator_de_tip este unul din tipurile de date predefinite iar lista variabileloreste formata
din una sau mai multe variabile separate prin virgule.Declaratia permite compilatorului sa reserve
memorie necesara pentru variabilele respective.Concomitent cu declararea unei variabile poate fi
facuta si initializarea ei.Prin initializarea unei variabile se intelege o operatie de atribuirea unei
valori initiale acestei variabile odata cu declararea ei. Ex: int a =1, b, c=3; float Aria=1; chr ch=”A”.
Un sir este o succesiune de caractere scrise între ghilimele, de exemplu "ABCD"

char un singur octet (1 byte=8 biti), capabil sa contina codul unui caracter din setul local de
caractere; int numar întreg, reflecta în mod tipic marimea naturala din calculatorul
utilizat; float numar real, în virgula mobila, simpla precizie; double numar real, în virgula
mobila, dubla precizie.

Ce va afişa secvenţa de i j Conditia program:

void main(void) ? -6 i<2 A

{ int i, j=-6; -1 -3 -1<2 A


for (i=-1; i<2; i++) 0 0 0<2 A
{ j+=3; } 1 3 1<2 A
printf(“\ni=%d j=%d”, i, j); 2 6 2<2 A
}

Rs: i=2 j=6

3.Declararea constantelor cu ajutorul instrucţiunii const. Constante de tip numeric, caracter şi şir de
caractere. Declararea constantelor cu ajutorul directivei define. Exemple.
O constanta este un literal (o forma externa de reprezentare) numeric, caracter sau sir de
caractere. Numele si valoarea unei constante sunt identice. În limbajul C exista urmatoarele
tipuri de constante: întreg (zecimal, octal, hexazecimal), întreg lung explicit, flotant, caracter,
simbolic. O constanta întreaga consta dintr-o succesiune de cifre.O constanta octala este o
constanta întreaga care începe cu 0 (cifra zero), si este formata cu cifre de la 0 la 7. O constanta
hexazecimala este o constanta întreaga precedata de 0x sau 0X (cifra 0 si litera x). Cifrele
hexazecimale includ literele de la A la F si de la a la f cu valori de la 10 la 15.În orice alt caz,
constanta întreaga este o constanta zecimala.
Daca o constanta numerica contine punctul zecimal, ea este de tipul double.
Exemplu: 3.1459 //tip double
Daca numarul este urmat de F sau f, constante este de tip float.Daca numarul este urmat de L sau l, este de
tip long double. Exemplu: 0.45f //tip float9.788L //tip long double

O constanta caracter consta dintr-un singur caracter scris între apostrofuri, de exemplu 'x'. Valoarea unei
constante caracter este valoarea numerica a caracterului, în setul de caractere al calculatorului. De
exemplu în setul de caractere ASCII caracterul zero sau '0' are valoarea 48 în zecimal, total diferita de
valoarea numerica zero. Constanta sir este o succesiune de zero sau mai multe caractere, încadrate de
ghilimele. În componenta unui sir de caractere, poate intra orice caracter. Ex : ”Acesta este un sir de
caractere” //constanta sir memorata pe 32 octeti. Calificatorul const asociat unei variabile, nu va
permite modificarea ulterioara a valorii acesteia, prin program (printr-o atribuire). const float b=8.8;

Directivele preprocesor sunt identificate prin simbolul #, care trebuie sa fie primul caracter, diferit de
spatiu, dintr-o linie. Directivele preprocesor sunt utilizate la includerea fisierelor header, la definirea
numelor constantelor simbolice, la definirea macro-urilor, sau la realizarea altor functii (de exemplu,
compilarea conditionata).Exemplu: #define MAX 1000 ; c = c - '0'; constanta zecimala 31 poate fi scrisa ca
037 în octal si 0x1f sau 0X1F în hexazecimal;

i j Conditia
Ce va afişa secvenţa de program:
? 2 i>0 A
void main(void)
4 4 4>0 A
{ int i, j=2;
3 6 3>0 A
for (i=4; i>0; i--)
2 8 2>0 A
{ j+=i - 2; }
1 10 1>0 A
printf(“\ni=%d j=%d”, i, j);
0 12 0>0 F
}

j=j+i-2; j=2+4-2=4; j=4+4-2=6


Rs: i=0 j=12

4.Iniţializarea variabilelor de diferite tipuri de date simple. Funcţiile de intrare/ieşire scanf şi printf.
Exemple.
Prin initializarea unei variabile se intelege o operatie de atribuirea unei valori initiale acestei
variabile odata cu declararea ei. Ex: int a =9; float Ma=0; chr ch=”A”

Functiile de intrare /iesire scanf() si printf() permit citirea datelor de la tastatura si afisarea datelor
pe ecran. Functia scanf() este o functie cu format controlat care introduce cimpurile de intrare character
dupa character , transformindule in conformitate cu formatul indicat.Formatul:
Scanf(“format”[,adresa_obiect_1, adresa _obiect_2, …]); Ex:scanf(“%d”,&n). Functia printf()poate fi
utilizata pentru operatiile de citire a datelor in diferite formate , care pot fi controlate de
utilizator.Adresarea la aceasta functie se face astfel: printf(“format”[,obiect_1,obiect_2,…]);Ex:printf(“\n
Ma=%f”,Ma). Deosebirea principal dintre printf() si scanf() consta din faptul ca in lista obiectelor de
iesire in functia scanf() e formata din adresele variabelelor dar functia printf() sunt indicate insasi
variabilele.
Ce va afişa secvenţa de i j k Conditia program:

void main(void) ? 2 0 i>2 A

{ int i, j=2, k=0; 4 4 -1 4>2 A

for (i=4; i>2; i--, k--) 3 5 -2 3>2 A

{ j+=i - 2; } 2 5 -3 2>2 F

printf(“\nk=%d j=%d”, k, j);

} j=j+i-2; j=2+4-2=4; j=4+3-2=5; j=5+2-2=5 Rs: k=-3 j=5

5. Operatorii unari Operatorii de incrementare, decrementare, negaţie logică, referinţă, sizeof.


Exemple.
Operatorii unari sunt alcatuiti dintrun singur operand si apar in fata operanzilor . Ei se asociaza de la
dreapta spre stinga .Ei sunt-,!,&,sizeof. Operatorii unari de incrementare (++) si decrementare (--) au ca
effect mãrirea si respectiv micsorarea cu 1 a valorii operandului numeric:

++x adunã 1 la x înainte de se folosi valoarea variabilei x

x++ adunã 1 la x dupã ce se foloseste valoarea variabilei x

Operatorii ++ si -- se pot aplica oricãrei expresii numerice (întregi sau reale). Operatorul sizeof()este un
operator unar, care are ca rezultat numarul de octeti pe care este memorata o data de un anumit tip.
Operandul este un tip sau o data (constanta sau variabila) de un anumit tip.

Ex :sizeof(int) // afiseaza numarul de octeti pe care este memorat un întreg (2).

Operatorul nul logic( !)produce valoarea zero ,daca operandul e adevarat (#0) ,daca operandul e
fals(=0)rezultatul va avea tipul intreg.Operandul poate fi tip intreg cu virgula flotanta sau pointer.

Ex :i+j !=n+1.

Operatorul de referinta (&)este folosit pentru a determina adresa operandului. In calitatae de operand
poate fi folosit orice identificator care poate aparea in partea stinga a unei instructiuni de asignare.
Rezultatul operatiei este un pointer la operand. Ex :daca x este o var de tip float, atunci &x este adresa
acestuia.

i j k Conditia

? 2 ? i>=0 A

2 3 1 2>=0 A

1 3 2 1>=0 A

0 3 3 0>=0 A
-1 3 4 -1>=0 F

Ce va afişa secvenţa de program:

void main(void)

{ int i, j=2, k;

for (i=2, k=1; i>=0; i--,k++)

{ j=i+k; }

printf(“\nk=%d j=%d”, k, j);

} Rs: k=4 j=36

6. Operatorii binari. Operatorii aritmetici, de atribuire, logici, condiţionali. Exemple.

Operatorii binari asociaza de la stinga spre dreapta,ei admit doi operanzi.

Operatorii aritmetici . Limbajul C++ dispune de operatori pentru cele patru operatii aritmetice de
baza si operatorii unari minus si plus(semnul), la care se adauga operatorul modulo si doi operatori
de incrementare, respectiv decrementare.

Se folosesc simbolurile urmatoare:

Operatori binari: + adunare, - scadere, *inmultire, / impartire, % restul impartirii, intregi (modulo)

Operatori de atribuireOperatia care apare cel mai frecvent in programe este inscrierea
(memorarea) unei valori intr-o variabila. Spre deosebire de alte limbaje(Pascal de exemplu), in care
aceasta operatie este executata de o instructiune, in C(sau C++) se foloseste o expresie cu
operatorul de atribuire =, de forma:

id_var=expresie

a=b=c=10

Sintaxa generala a unei expresii de atribuire este:

expr_atribuire: id_var=expresie

id_var=expr_atribuire

Operatorul de atribuire admite operanzi de orice tip scalar si tipuri definite de utilizatori.

Operatori logici .In limbajul C sunt 3 tipuri de operatori logici:

&& si logic (and)

|| sau logic (or)


! negare logica (not)

In calitatae de operanzi ai acestor operatori pot fi valoaraea de tip intreg inclusiv chiar rezultatul unei
operatii logice poate avea valoarea logica de adevar(1) sau fals(0)

X y x&& xIIy !x

0 0 0 0 1

0 1 0 1 1

1 1 1 1 0

1 0 1 1 0

Operatori conditionali:In limbajul C exista un singur operator ternar:operatorul conditional care are
forma : conditie_logica ? expr1: expr2

. Tipul operanzilor pot fi intreg, flotant sau pointer

Efect: daca conditie_logica este TRUE (adevarata) se executa expr1, daca conditie_logica este FALSE
(falsa) se executa expr2.

Ce va afişa secvenţa de program:


i j k Conditie

? 2 ? i<=3
void main(void)
0 0 0 0<=3
{ int i, j=2, k;
1 1 1 1<=3
for (i=0,k=0; i<=3; i++, k++)
2 3 2 2<=3
{ j=2*i-k; }
3 5 3 3<=3
printf(“\nk=%d j=%d”, k, j); }
4 7 4 4<=3

Rs: k=4 j=7


7. Instrucţiunea vidă. Instrucţiunea simplă (expresie). Instrucţiunea compusă (bloc). Exemple.

Instructiunea vidaCea mai simpla instructiune este cea vida.Ea nu provoaca nici o actiune si e utilizata
atunci cind dupa sintaxa e necesara prezenta unei instructiuni, insa utilizatorul nu are nevoie de ea.
Instructiunea vida se reduce la caracterul “;”.for(i = 0, s = 0; i < n; s = s + a[i], ++i);

Instructiunea simpla (expresie): Instructiunea expresie se obtine scriind punct si virgula dupa o
expresie, deci: expresie; ex:12547ac;

Ea se utilizeaza ca instructiune de atribuire sau ca instructiune de apel a unei functii.


INSTRUCŢIUNEA COMPUSĂ Instructiunea compusa este o succesiune de declaratii urmate de
instructiuni, succesiune inclusa între accolade. Pot lipsi declaratiile sau instructiunle dar nu în acelasi
timp. Daca delaratiile sunt prezente, atunci ele definesc variabile care sunt valabile numai în
instructiunea compusa respectiva. Ex: { a++; c=a+b-2; printf(“%d\n”,c);

Ce va afişa secvenţa de program:

void main(void)

{ int i, j, k;

for (i=2, k=1; i>=0; i--, k+=2)

{ j=i*k; }

printf(“\nk=%d j=%d”, k, j); }

8. Instrucţiunea condiţională if-else. Instrucţiuni multiple în corpul instrucţiunii if. Exemple.

if (expresie) instructiune_1;

else instructiune_2;

Valoarea expresiei din paranteze trebuie sa fie de tip interg si e interpretata ca o valoare booleana
si anume :orice valoare diferita de zero se va considera true, iar valoarea nula a expresiei
false.Modul de executie a instructiunii este urmatorul: se evaluiaza expresia si apoi daca rezultatul
este adevarat atunci se va executa instructiunea_1 din corpul if.Altfel daca expresia are valoarea
nula(false) se va executa instructiunea_2.

Forma scurta: if(expresie) instructiunea_1;daca expresia este falsa atunci se trece la instructiunea
care urmeaza nemijlocit dupa if,instructiunea_1 ne mai fiind executata.

Ce va afişa secvenţa de program:

void main(void)

{ int i, j=2, k;

for (i=0, k=0; i<=3; i+=2, k++)

{ j=2*i-k; }

printf(“\nk=%d j=%d”, k, j); }

9. Instrucţiunea ciclică for. Sintaxa. Instrucţiunea continue. Exemple.


Instructiunea for se utilizeaza pentru a realiza o structura repetitiva pretestata. Formatul
instructiunii este:

for(exp1; exp2; exp3) instructiune;

exp1: initializarea exp2: conditia pina unde trebuie sa ajungem exp3: incrementarea sau
decrementarea.

Ex: for(i=1; i<=4;i++)A

For(i=1; i<=4; i--)F for(i=4; i<=1; i--)A

Instructiunea continue

Formatul instructiunii este urmatorul: continue;

In ciclurile while si do-while instructiunea continue realizeaza saltul la evaluarea expresiei care
decide asupra continuarii ciclului. In ciclul for ea realizeaza saltul la pasul de reinitializare.
Instructiunea continue se utilizeaza numai în corpul unui ciclu, permitând, dupa caz, sa se treaca la
pasul urmator al ciclului sau sa se iasa din ciclu. Rezultatul executiei instructiunii continue consta in
ignorarea tuturor instructiunilor din corpul instructiunilor repetitive in care apare si care urmeaza
dupa ea. EX: while(i++<=25){z+=sin(x/(2*i))

Printf(”i=%d z=%f”,i,z);

If (i%5) continue;

Printf(”\n”);}

Ce va afişa secvenţa de program:

void main(void)

{ int i, j, k;

for (i=1, k=0; i<=4; i*=2, k++)

{ j=2*i-k; }

printf(“\nk=%d j=%d”, k, j); }

10. Instrucţiunea ciclică while. Sintaxa. Instrucţiunea break. Exemple.

Instructiunea while este o instructiune ciclica cu preconditie.sintaxa ei este:


while(expresie)instructiune;

initializare; i=4;

While(conditie) while(i>=1)
{instructiune de incrimentare ;} {i--;}

Decizia de a executa sau nu corpul ciclului se ia inaintea inceperii ciclului. Executia va avea loc pina
cind expresia din paranteza va deveni falsa insa,uneori instructiunea din care e format corpul
ciclului poara sa nu fie executata niciodata.Valoarea acestei expresii trebuie sa fie modificata pe
parcursul executiei corpului ciclului.

INSTRUCŢIUNEA break

Formatul instructiunii este urmatorul: break

Instructiunea break se foloseste pentru a iesi dintr-un ciclu.ea termina executia instructiunilor de
ciclare do, for, switch sau while in care ea este inclusa,inaintea sfirsitului acestora. Aparitia
instructiunii break in situatii diferite de acele mentionate provoaca eroare. Daca sunt citeva
instructiuni imbricate in ciclare ,atunci instructiunea break termina numai acea instructiune in care
ea este inclusa. EX: for(i==1 ) S=exp(x); if (s>3||s<3) break; printf(”\n s=”,s);

Ce va afişa secvenţa de program:

void main(void)

{ int i, j, k=0;

for (i=1, k=5; i<=4; i*=2, k--)

{ j=2*i+1; }

printf(“\nk=%d j=%d”, k, j); }

11. Instrucţiunea ciclică do-while. Sintaxa. Instricţiunea break. Exemple.

Instructiunea repetitiva do-while este o instructiune de creare a ciclurilor cu


postconditie.Sintaxa ei este: do instructiune; while (exp); Corpul ciclului se executa cel putin o
data . El se executa atit timp cit conditia este adevarata . In caliatae de conditie se poate utiliza o
expresie . De asemenea ,in corpul ciclului pot fi incluse instructiunile care permit iesirea fortata din
ciclu. Corpul ciclului poate fi incadrat in acolade si in cazul in care contine o singura instructiune. EX:
do {x=1/n; n+=2;}while(n <15);

INSTRUCŢIUNEA break

Formatul instructiunii este urmatorul: break

Instructiunea break se foloseste pentru a iesi dintr-un ciclu.ea termina executia instructiunilor de
ciclare do, for, switch sau while in care ea este inclusa,inaintea sfirsitului acestora. Aparitia
instructiunii break in situatii diferite de acele mentionate provoaca eroare. Daca sunt citeva
instructiuni imbricate in ciclare ,atunci instructiunea break termina numai acea instructiune in care
ea este inclusa. EX: for(i==1 ) S=(x*x); if (s>3||s<3) break; printf(”\n s=”,s)

Ce va afişa secvenţa de program:


void main(void)

{ int i, j, k;

for (i=1, k=0; i<2; i*=2, k++)

{ j=2*i-k; }

printf(“\nk=%d j=%d”, k, j); }

12. Structura instrucţiunii switch. Sintaxa switch-break-default. Instrucţiunea break. Exemple.

Instructiunea switch este o instructiune de selestie multipla. Sintaxa instructiunii este:


switch(expresie_intreaga) {[declaratie;]

case expresie_const_1:instructiuni;

case expresie_const_n:instructiuni;

[default:instructiuni;]}

Instructiunea switch transfera controlul programului unei instructiuni din corpul sau. Se va executa
in continuare instructiunea a carei expresie_const va fi egala cu valoarea expresiei din parantezele
lui switch. Executia continua cu celelalte instructiuni pina cind se intilneste o instructiune de
transfer al controlului in afara instructiunii switch. Daca e necesar de declarat in corpul lui switch
unele variabile, acestea nu pot fi concomitent initializate. Ramura default nu este obligatorie. În
lipsa ei, daca valoarea expresiei nu coincide cu nici una din constantele expresie_const1,. . .
,expresie_ constn, instructiunea switch respectiva nu are nici un efect. Constructia break reprezinta
o instructiune. Ea termina fiecare ramura de instructiuni sir1, . . . , sirn, provocând saltul la
instructiunea urmatoare instructiunii switch sau, cum se mai spune, realizeaza iesirea din
instructiunea switch. Instructiunea break nu este obligatorie. În cazul în care este absenta, se
executa secvential urmatoarea ramura.

Switch (k)

{case1: {f=(A*pow(x,2));printf(“\nf=%f”,f);break;}

case2: {f=(A*exp(x)); printf(”\nf=%f”,f); break}

INSTRUCŢIUNEA break

Formatul instructiunii este urmatorul: break

Instructiunea break se foloseste pentru a iesi dintr-un ciclu.ea termina executia instructiunilor de
ciclare do, for, switch sau while in care ea este inclusa,inaintea sfirsitului acestora. Aparitia
instructiunii break in situatii diferite de acele mentionate provoaca eroare. Daca sunt citeva
instructiuni imbricate in ciclare ,atunci instructiunea break termina numai acea instructiune in care
ea este inclusa. EX: for(i==1 ) S=(x*x); if (s>3||s<3) break; printf(”\n s=”,s);
Ce va afişa secvenţa de program:

void main(void)

{ int i, j=1, k;

for (k=-1; k<=2; k++)

{ j*=k+1; }

printf(“\nk=%d j=%d”, k, j); }

13. Sintaxa funcţiei. Apelul funcţiei. Transferul parametrilor, returnarea datelor din funcţie.
Exemple.

O functie este o unitate de sine statatoare de instructiuni proiectata pentru a rezolva o anumita
problema. Formatul general pentru definirea unei functii este :

tip_returnat nume_functie(tip1 param1, tip2 param2,...) {declaratii_var_locale}

/*corpul functiei: prelucrarile efectuate de acestea */ ...

return (expresie);} Ex:

Daca functia nu returneaza o valoare, tip_returnat nu este specificat sau este void. O functie care
returneaza o valoare poate fi utilizata in expresii, in timp ce o functie de tip void nu are o valoare si nu
poate fi utilixata intr-o expresie.

O functie poate fi apelata printr-o constructie urmata de punct si virgula, numita instructiune de apel, de
forma: nume_functie (lista_parametrilor_efectivi);

Parametrii declarati în antetul unei functii sunt numiti formali, pentru a sublinia faptul ca ei nu reprezinta
valori concrete, ci numai tin locul acestora pentru a putea exprima procesul de calcul realizat prin functie.
Ei se concretizeaza la executie prin apelurile functiei.

Functiile comunica între ele prin argumente (parametrii). Exista urmatoarele moduri de transfer
(transmitere) a parametrilor catre functiile apelate: transfer prin valoare; transfer prin pointeri; transfer
prin referinta.

Comparând cele trei moduri de transmitere a parametrilor catre o functie, se poate observa:

1. La apelul prin valoare transferul datelor este unidirectional, adica valorile se transfera numai de
la functia apelanta catre cea apelata. La apelul prin referinta transferul datelor este bidirectional,
deoarece o modificare a parametrilor formali determina modificarea parametrilor efectivi, care sunt
sinonime (au nume diferite, dar refera aceleasi locatii de memorie).

2. La transmiterea parametrilor prin valoare, ca parametrii efectivi pot apare expresii sau nume de
variabile. La transmiterea parametrilor prin referinta, ca parametri efectivi nu pot apare expresii,
ci doar nume de variabile. La transmiterea parametrilor prin pointeri, ca parametri efectivi pot apare
expresii de pointeri.
4. Limbajul C este numit limbajul apelului prin valoare. Apelul poate deveni, însa, apel prin
referinta în cazul variabilelor simple, folosind pointeri, în cazul în care parametru efectiv este un
tablou.

Ex : int main() {int x ; x=suma(5,3) ;- apelul functiei care va returna valoarea 8, deci x=8 }

Ce va afişa secvenţa de program:

void main(void)

{ int a=5, b=8;

while (a<b)

{ b--; a++;

printf(“\na=%d b=%d”,a, b); }

14. Variabile locale ale funcţiei. Variabile globale. Utilizarea parametrilor şi a variabilelor globale
într-o funcţie. Exemple.

Variabilele declarate în afara oricarei functii sunt variabilele globale. Variabilele declarate în interiorul
unui bloc sunt variabilele locale. Parametrii formali ai unei functii sunt variabile locale ale functiei
respective. În situatia în care numele unei variabile globale coincide cu numele unei variabile
locale, variabila locala o "mascheaza" pe cea globala. Timpul de viata a unei variabile locale este durata
de executie a blocului (sau a functiei) în care aceasta este definita. Timpul de viata a unei variabile
globale este durata de executie a programului. Domeniul de aplicare al variabileleor declarant intro
functie sau in interiorul altu bloc nu poate fi utilizat in afara functiei sau a blocului respective.

Ce va afişa secvenţa de program:

void main(void)

{ int a=2, b=8;

while (a<=b)

{ a++; b--; }

printf(“\na=%d b=%d”,a, b); }

15. Funcţii recursive. Autoapelarea funcţiei. Condiţia de stopare a autoapelării funcţiei. Exemple.

O functie este numita functie recursiva daca ea se autoapeleaza, fie direct (în definitia ei se face apel
la ea însasi), fieindirect (prin apelul altor functii). Limbajele C/C++ dispun de mecanisme speciale care
permit suspendarea executiei unei functii, salvarea datelor si reactivarea executiei la momentul
potrivit.

Recursivitatea este posibilã în C datoritã faptului cã, la fiecare apel al functiei, adresa de revenire,
variabilele locale si parametri formali sunt memorate într-o stivã (gestionatã de compilator), iar la
iesirea din functie (prin return) se scot din stivã toate datele puse la intrarea în functie (se
"descarcã" stiva).

N!

Int factorial (int n) { if( n==1 return n) else n=f(n-1);}

Revenirea dintro functie se face cu ajutorul functiei return.O functie poate contine una sau mai
multe instructiuni return.

Ce va afişa secvenţa de program:

void main(void)

{ int a=2, b=8;

while (a<=b)

{ a++; b-=3; }

printf(“\na=%d b=%d”,a, b); }

16. Tablourile unidimensionale.Sintaxa. Declararea unui tablou unidimensional. Accesarea


elementelor tabloului. Exemple.
Tabloul unidimensional este o serie de elemente de acelasi tip plasate in locatii de memorie care pot fi
mentionate in mod individual prin adaugarea unui numar la unidentificator unic.Sintaxa :

Tip nume[nr max de elemente]. Declararea este de doua feluri: cu initializare(Ex: int A[3]={3,2,5}) si fara
initializare(Ex: int A[5].)

O altã particularitate a vectorilor în C este numerotarea elementelor de lazero, deci primul element din
orice vector are indicele zero, iar ultimul element dintr-un vector are un indice mai mic cu 1 decât
numãrul elementelor din vector.

Accesul la elementele unui vector se face folosind indici scriind numele vectorului si intre paranteze
drepte[ ] indicele(pozitia elementului) din tablou care o dorim. Ex: v=A[2](accesul la elementul a treilea
al tabloului ).

Ce va afişa secvenţa de program:

void main(void)

{ int i=2, j=8;

while (i<=j)

{ i++; j--;
}

printf(“\ni=%d j=%d”, i, j);

17. Tablourile bidimensionale. Sintaxa. Declararea unui tablou bidimensional Accesarea


elementelor tabloului. Exemple.
Un tablou bidimensional reprezinta o matrice alcatuita din elementele din acelasi tip de date,
alcatuite din linii si coloane. Sintaxa este: tip nume[m][n], unde :tip este tipul de data folosit poate
fi unul dintre tipurile de baza (int, char) sua un tip definit de utilizator(articol), nume reprezinta
numele prin care va fi definite matricea , m- numarul de linii din matrice, n=numarul de coloane din
matrice. Declararea: int b[3][5]. La declararea matricei poate fi facuta si initializarea ei. Ex: int
b[2][3]= {{1, 0 ,2},{0 ,3 ,4}}-initializare complete cu precizarea nr de linii si coloane. Accesul la
elemental de pe o anumita pozitie necesita 2 indecsi care reprezinta pozitia elementului in linii si in
coloane.Ex: int a = m2[1][1]-citeste al doilea element de pe a doua linie din matrice.

Ce va afişa secvenţa de program:

void main(void)

{ int i=2, j=8;

while (i<=j)

i=j+3; j-=3;

printf(“\ni=%d j=%d”, i, j); }

18. Şiruri de caractere. Declararea unui sir de caractere. Structura unui şir de caractere.
Simbolul “\0”. Accesul şi modificarea caracterelor şirului. Exemple.

sirurile de caractere sunt secvente de caractere, care pot fi reprezentate ca matrice simple de
elemente de tip char si care au ca ultim element un terminator de sir, caracterul null (acest
character are rolul de a marca sfirsitul constantei sir de caractere si are valoarea 0 binar),’\0’. Ex:
char mat[20]- este o matrice care poate stoca pina la 20 de elemente de tip char.

Initializarea unei matrice de tip sir de caractere : char mat[20]= “salut”.Nr de caractere ale sirului
reprezinta lungimea sirului. Putem accesa orice character al sirului scriind numele variabilei vector
in care memoram sirul urmat de pozitia caracterului intre 2 paranteze patrate. Ex: mat[0] = “@”. O
variabila de tipul sir de caractere poate fi initializata la declarare cu o constanta sir de caractere(un
sir de caractere cuprins intre ghilimele). Un character al unui sir deja definit poate fi modificat prin
atribuire. Ex: char c[15]=”foarte usor!”; c[3]=’$’.
Ce va afişa secvenţa de program:

void main(void)

{ int a=2, b=8;

while (a<=b)

{ a=b+3; b-=3; }

printf(“\na=%d b=%d”, a, b);

}
19.

20. Tipul de date structurat STRUCT. Sintaxa. Crearea unei variabile de tip structura.
Accesul la datele din structură şi modificarea valorilor datelor din structură.

 Structurile reprezinta colectii de date neomogene grupate sub acelasi nume, intr-o zona de
memorie compacta. Declaratia unei structuri are forma generala:

struct nume_structura

tip nume_camp1;

tip nume_camp2;

tip nume_camp3;

tip nume_campn;

Ilista_variabile_structura;

unde:

· nume_camp1,nume_camp2,…,nume_campn sunt nume de campuri, membre ale structurii;

· tip reprezinta tipul campului si poate fi orice tip simplu sau derivat admis in C;

· nume_structura reprezinta numele structurii;

· lista_variabile_structura este o lista de variabile al carei tip este struct nume_structura.

Nume_structura si lista variabile_structura sunt optionale dar nu pot lipsi simultan: declaratia
unei structuri anonime, care in plus are si lista_variabile_structura vida este absolut inutila.
 variabila de tip structura poate fi initializata pe linia de declarare in maniera obisnuita:

Declaratie structurasAlista_valori_initialeI;

EX Struct rand_tel pers1sA”Dan”,”Ion”,”Ploiesti,str.Tei”,165239I;

 Pentru a accesa un cimp al unei structure, trebuie specificate atit numele variabelor de tip
structura cit sii numele cimpului, separate pintr-un punct. Forma generala de acces la un membru
Nume_variabil.nume_membru
Unde, nume_variabil este numele variabilei de tip structura, iar nume_membru este numele
cimpului ce se doreste a fi accesat

Ce va afişa secvenţa de program:

void main(void)

{ int j, i; i=j=1;

do

{ i=2*j; j*=2; }

while (i<=3);

printf(“\ni=%d j=%d”, i, j);

21. Tipul de date structurat UNION. Sintaxa. Crearea variabilei de tip uniune. Accesul la datele din
uniune şi modificarea valorilor datelor din uniune.
Uniune este o structura de date care permite folosirea in comun a aceleiasi zone de memorie de
doua sau mai multe variabile diferite, la momente de timp diferite. Forma generala de declarare a
unei uniuni este:union nume_uniune

tip nume_camp1;

tip nume_camp2;

tip nume_camp3;

.......

tip nume_campn;

Ilista variabile_uniune;

Dupa cum se poate constata forma generala de declarare a unei uniuni este asemanatoare cu
cea a unei structuri. Precizarile facute la uniuni referitoare la relatiile dintre numele uniunii, numele
campurilor, numele variabilelor_uniune si numele oricarei variabile raman valabile si aici. Pentru
selectarea campurilor putem folosi, de asemenea, operatorii . si ->.
La declararea unei variabile de tip union , automat compilatorul aloca memorie suficienta pentru
a pastra cel mai mare membru al acesteia. Ex union{

Char ch [3];

Int x; Double y;

} gama, *p; ||gama variabila de tip union iar p pointer la union

Accesul la membrii unei uniuni foloseste aceeasi metoda pe care o folosesc structurile, adica
numele variabile urmat de punct si de nume membru:

Gama.y= 765.862;

Gama.ch[1] =’a’;

i j Conditia
Ce va afişa secvenţa de program:
2 8 2<=8 A
void main(void)
3 7 3<=7 A
{ int i=2, j=8;
4 6 4<=6 A
while (i<=j)
5 5 5<=5 A
{ i++; j--;
6 4 6<=4 F
}

printf(“\ni=%d j=%d”, i, j); Rs : i=6 j=4

22. Variabile pointer. Sintaxa. Declararea diferitor tipuri de variabile pointer. Iniţializarea variabileelor
de tip pointer cu ajutorul operatorului de adresare şi indirectare. Exemple.

Un pointer este o variabila ce contine adresa unei alte variabile. O variabila de tip pointer se defineste
cu instructiunea tip * nume;

Variabilele tip pointer pot fi initializate doar cu adrese.

Pentru a calcula adresa unei variabile se utilizeaza operatorul &. Daca x este o variabi 535c22f la
oarecare, expresia &x este adresa lui x. De exemplu putem scrie

int n;

int * pn; // pn este o variabila de tipul pointer la int

pn = &n; // initializeazǎ pn cu adresa lui n

Variabilele de tip pointer pot fi initializate la declararea lor. Putem scrie de exemplu : int n, *pn = &n;
 Un pointer este asociat unui tip de variabile: exista pointeri catre char, int, float ettc…. Daca T este un tip
de date standart sau definit de utilizator, un pointer catre tipul T se declara prin:

T*p;

Iata citeva exemple de declaratii de pointeri:

Int *pi; float*pf;

Char*pc;

Ceea ce inseamna ca pi este un pointer catre intreg, pf este un pointer catre float(real), iar pc unul catre
character. Se pot declara mai multi pointeri pe acelasi rind, impreuna cu variabile de acelasi tip, fiecare
variabila de tip pointer trebuind sa fie precedata de simbolul “*”:

Char*pc,c, *pa,a;

In aceasta situatie pc sii pa sunt pointeri la char, iar a si c sunt variabile de tip char.

 Operatorul de adresare & se aplica unei variabile, furnizind adresa variabilei. Daca variabila este de tip
T, atunci operatorul & intoarce tipul de date T*, adica pointer catre T. Astfel, operatorul & este un prim
mod sic el mai important de a obtine adrese de variabile sau obiecte.

Accesul la o variabila (obiect) prin intermediul pointerilor se face cu operatorul de indirictare*. Daca p
este un pointer de tip T*,unci *p este prin difinitie obiectul de tip T, aflati la adressa p.

Ex: un pointer indica obiecte diferite pe parcursul executiei programului:

Main()

Int i=1, j=5, *p=&I;

*p=2;

(*(p=&j))++;

Printf(“i=%d j=%d/n”,I,j);

Ce va afişa secvenţa de program:

void main(void)
i j Conditia
{ int i=2, j=8;
2 8 2<=8 A
while (i<=j)
11 5 11<=5 F
{

i=j+3; j-=3; i=8+3=11

} j=8-3=5 Rs : i=11 j=5


printf(“\ni=%d j=%d”, i, j); }

23. Operaţii cu pointeri. Atribuirea, compararea, adunarea şi scăderea pointerilor. Exemple.


Operatiile ++,-- Mareste/ micsoreaza adresa cu r (nr. De octeti egal cu dimensiunea tipului date spre
care pointeaza). EX: int*p

Double*q

++p;//p=p+2

--q;//q=p-8

Operatiile +,- un intreg Fie p pointer p+n ; //p+n*r

P-n ;//p-n*r

Compararea a 2 pointeri Doi pointeri care pointeaza spre eleementtul acestui tablou pot fi comparati
folosind operatorii de relatii si de egalitate. Fie: p=&tab[i];

Q=&tab[j].

Atunci expresiile: p<q, p<=q, p>q, p>=q, p==q, p!=q

[i<j] sunt legale.

Operatorii ==,!= pot fi folositi pentru a compara pointeri cu constanta speciala NULL, definite in stdio.h

#define NULL 0(pointer nul)

Diferenta a 2 pointeri Fie p=&tab[i];

Q=&tab[i+n];

Atunci diferenta q-p are valoarea n.

Ce va afişa secvenţa de program:


a b Conditia
void main(void)
2 8 2<=8 A
{ int a=2, b=8;
11 5 11<=5 F
while (a<=b)

{ a=b+3; b-=3; } a=8+3=11 Rs: a=11 b=5

printf(“\na=%d b=%d”, a, b); b=8-3=5

24. Pointer şi tablouri. Aritmetica adreselor. Incrementarea şi decrementarea adresei unui pointer.
Acesarea elementelor unui tablou prin intermediul unui pointer către tablou.
Daca p este un pointer, atunci p++ incrementeaza pe p in asa fel incit t acesta sa pointeze pe
elementul urmator indiferent de tipul obiectelor pointate, iar
p+=i incrementeaza pe p pentru a pointa peste i elemente din locul unde p pointeaza curent.
C este consistent si constant cu aritmetica pointerilor; pointerii,tablourile si aritmetica adresarii
constitue punctul forte al limbajului. Sa ilustram citeva dintre proprietatile lui scriind un program
pentru alocare de memorie rudimentar (dar este util in ciuda simplitatii sale exista doua
rutine:alloc(n) returneaza un pointer p pe n pozitii caracter consecu-tive care poate fi utilizat de catre
apelantul lui alloc pentru alocarea de caractere; free(p) elibereaza memoria facind-o
astfel refolosibila mai tirziu. Rutinele sint "rudimentare" deoarece apelurile la free trebuie facute in
ordine inversa apelurilor la alloc. Aceasta inseamna ca memoria gestionata de alloc si free este o stiva
sau o lista prelucrabila in regim LIFP. Biblio-teca standard C este
prevazuta in functii analoage care nu au atit de multe restrictii iar in capitolul 8 vom da, pentru
demonstratie si alte versiuni. Intre timp se vor ivi multe aplica-tii care au realmente nevoie de canalul
alloc pentru a dispensa mici portiuni de memorie, de lungimi neprevazute la momente nepre-vazute.

Limbajul C ofera doi operatori neuzuali pentru incrementarea si


decrementarea variabilelor. Operatorul de incrementare ++ aduna 1 la operandul sau; operatorul
de decrementare -- scade 1. Am folosit frecvent ++ pentru a incrementa variabi-lele, de exemplu:

if (c == '\n')

++nl;

Aspectul neobisnuit al lui ++ si al lui -- este acela ca ei pot fi folositi atit ca operatori prefix
(inaintea variabilei, ca in ++n) cit si ca operatori sufix (dupa variabila, ca in n++). In ambele cazuri,
efectul este incrementarea lui n. Dar expresia ++n il incrementeaza pe n inainte de a-i folosi valoarea,
in timp

ce expresia n++, il incrementeaza pe n dupa ce a fost folo-sita valoarea lui.

25. Pointer către funcţie. Transferul si returnarea datelor din funcţie cu ajutorul pointerilor.
Numele unei functii reprezinta adresa de memorie la care începe functia. Numele functiei este, de fapt,
un pointer la functie.
Se poate stabili o corespondenta între variabile si functii prin intermediul pointerilor la functii. Ca si
variabilele, acesti pointeri:
• pot primi ca valori functii;
• pot fi transmisi ca parametrii altor functii
• pot fi intorsi ca rezultate de catre functii
La declararea unui pointer catre o functie trebuiesc precizate toate informatiile despre functie, adica:
• tipul functiei
• numarul de parametri
• tipul parametrilor
care ne vor permite sa apelam indirect functia prin intermediul pointerului.
Declararea unui pointer la o functie se face prin:
tip (*pf)(lista_parametri_formali);
Daca nu s-ar folosi paranteze, ar fi vorba de o functie care întoarce un pointer.
Apelul unei functii prin intermediul unui pointer are forma:
(*pf)(lista_parametri_actuali);

i j Conditia

1 1 1<=3 A
Ce va afişa secvenţa de 2 2 2<=3 A program:

void main(void) 4 4 4<=3 F

{ int j, i; i=j=1;

do

{ i=2*j; j*=2; }

while (i<=3); Rs: i=4 j=4

printf(“\ni=%d j=%d”, i, j);

Ce va afişa secvenţa de program:


i j Conditia
void main(void)
2 8 2>=0 A
{ int i=2, j=8;
-4 6 -4>=6 F
do

{ i-=j+2; j-=2; } i=i-j+2=2-8+4=-4

while (i>=0); j=j-2=8-2=6 Rs: i=-4 j=6

printf(“\ni=%d j=%d”, i, j); }

26. Alocarea dinamică a memoriei cu ajutorul operatorului new. Eliberarea memoriei cu ajutrul
operatorului delete.

Alocarea memoriei unei variabile se face astfel

de catre compilator, la declararea unei variabile de un tip oarecare

cu functia malloc()

cu operatorul new

Alocarea memoriei cu functia malloc

Alocarea memoriei unei variabile cu functia malloc sau operatorul new se face la executia
programului.

Alocarea de memorie se poate face cu functia

void * malloc(int size);


unde size este numarul de octeti de alocat. Tipul functiei este void* si el trebuie convertit in pointer
la tipul alocat. Eliberarea memoriei alocate cu functia malloc() se face cu functia

void free(p);

unde p este o variabila tip pointer ce contine adresa zonei de memorie ce va fi eliberate. Prototipul
acestor functii se afla in biblioteca <stdlib.h>.

Alocarea memoriei cu operatorul new

Alocarea de memorie pentru o variabila sau pentru un vector se poate face cu operatorul new. Fie T
tipul unei variabile. Operatorul new cu forma

new T

aloca memorie pentru o variabila de tipul T, iar operatorul new cu forma

new T[n]

aloca memorie pentru un vector de tipul T cu n componente, unde n este un numar


intreg. Operatorul new are ca rezultat un pointer la memoria alocata. Fie instructiunea

double *x, *y ;

Instructiunea

x = new double;

aloca memorie pentru o variabila scalara de tip double, in timp ce instructiunea

y = new double[17] ;

aloca memorie pentru un vector cu 17 componente. Eliberarea memoriei alocate cu operatorul new
se face cu operatorul delete. Instructiunea

delete x;

elibereaza memoria alocata cu new double, in timp ce instructiunea

delete [] y;

elibereaza memoria alocata vectorului cu new double[17].

Probleme rezolvate

Problema 1. Se va aloca un vector de 5 componente tip double folosind operatorul new. Se vor citi
componentele vectorului de la tastatura si se va calcula suma componentelor. Slutia problemei este
urmatoarea.
# include <iostream.h>

int main()

In captura de ecran este reprodus un exemplu de executie.

Ce va afişa secvenţa de
i j k Conditia

1 1 2 1<=4 A

3 2 3 3<=4 A

5 2 4 5<=4 F

program:

void main(void)

{ int i, j, k=2; i=j=1;

do

{ i=j+k; j=2; k+=1; }

while (i<=4); i=1+2=3; j=2; k=2+1=3

printf(“\ni=%d j=%d”, i, j); } i=2+3=5 ; j=2; k=3+1=4 Rs : i=5 j=2

27.

27. Definirea unui fişier. Crearea, distrugerea şi redenumirea unui fişier. Deschiderea şi închiderea
unui fişier.Moduri de deschidere a fişierelor (“w”,”r”,”a”).

Limbajul C++ defineste clasele istream si ostream pentru operatii de intrare si iesire cu fisierele standard,
tastatura si ecranul. Obiectul cin este o instanta a clasei istream, iar cout o instanta a clasei ostream.
Pentru lucrul cu fisiere de date limbajul C++ defineste urmatoarele clase

 ofstream pentru operatii de scriere de fisiere


 ifstream pentru operatii de citire din fisiere
 fstream pentru operatii de citire si scriere a fisierelor

Aceste clase mostenesc din clasele istream si ostream. Definitiile acestor clase se gasesc in biblioteca
<fstream>. O serie de constante utilizate de aceste clase sunt definite in clasa ios. Pentru prelucrarea unui
fisier se creaza un obiect instanta a uneia din clasele de mai sus care este denumit stream.

Clasele definesc un constructor fara parametri.

Functiile membre importante ale claselor sunt

 functia membra open() cu prototipul


open(char * filename, int mode);

asociaza obiectul cu fisierul. Parametrul filename este un sir de caractere cu numele fisierului. Al doilea
parametru este optional si da modul de deschidere. El poate avea valorile

ios::in - deschidere in citire

ios::out – deschidere in scriere

ios::binary – fisier binary

i j k Conditia
Ce va afişa secvenţa de program:
0 0 1 0<=2 A
void main(void)
1 2 2 1<=2 A

0 2 3 0<=2 A
{ int i, j, k=1; i=j=0;
1 2 4 1<=2 A
do
3 2 5 3<=2 F
{ i=k-j; j=2; k+=1; }

while (i<=2);

printf(“\ni=%d k=%d”, i, k); Rs:i=3 k=5

28. Înscrierea şi citirea datelor din/în fişier cu ajutorul funcţiilor fputc, fgetc, fputs, fgets
Fputc()- se foloseste in cazul inscrierii unui character in fisier sau scoateri la imprimanta

Fgetc()- se foloseste pentru citirea unui character din fisier

Fputs()- se foloseste pentru a inscribe un sir de caractere in fisier sau al imprima la imprimanta

Fgets()- este folosit pentru a citi un sir de caractere din fisier.

Ce va afişa secvenţa de program:

void main(void) i J k Conditia

{ int i, j, k=2; i=j=0; 0 0 2 0>2 A

do 2 2 3 2>2 F

{ i=k-j; j+=2; k+=1; }

while (i>2); i=2-0=2; j=0+2=2; k=2+1=3


printf(“\ni=%d k=%d”, i, k); Rs: i=2 k=3

29. Înscrierea şi citirea formatată a datelor din/în fişiere cu ajuto rul funcţiilor fprintf şi fscanf
Fprintf()- este folosita in cazul iesirii cu format a caracterilor, sirurilor de caractere si cifrelor pe disc sau
la imprimanta

Fscanaf()- se foloseste pentru citirea cu format a caracterilor, sirurilor de caractere sau cifrelor din fisier

Ce va afişa secvenţa de program:

void main(void) i K Conditia

{ int i=2, k=6; 2 6 2<6 A

do 3 5 3<5 A

{ printf(“\ni=%d k=%d”, i, 4 4 4<4 F j);

i=++; k--; }

while (i<k); } Rs: i=4 k=4

30. Înscrierea şi citirea structurilor de date în/din fişier cu ajutorul instrucţiunilor fwrite şi
fread.
Fwrite()- inscrierea unei structuri in i j Conditia fisier

Fread()- citirea unei structure din fisier


1 0 1<4 A

0 2 0<4 A
Ce va afişa secvenţa de program:
1 4 1<4 A
void main(void)
2 6 2<4 A
{ int i, j=0;
3 8 3<4 A
for (i=0; i<4; i++)
4 10 4<4 F
{ j+=2; }

printf(“\ni=%d j=%d”, i, j);

} Rs : i=4 j=10

1. Înscrierea şi citirea structurilor de date în/din fişier cu ajutorul instrucţiunilor fwrite şi


fread.
i j Conditia

1 0 1<4 A
Fwrite()- inscrierea unei structuri in 0 2 0<4 A fisier

Fread()- citirea unei structure din 1 4 1<4 A fisier

2 6 2<4 A
Ce va afişa secvenţa de 3 8 3<4 A program:

void main(void) 4 10 4<4 F


{ int i, j=0;

for (i=0; i<4; i++)

{ j+=2; }

printf(“\ni=%d j=%d”, i, j);

} Rs : i=4 j=10

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