Documente Academic
Documente Profesional
Documente Cultură
Teorie Informatica Pentru BAC
Teorie Informatica Pentru BAC
1. Algoritmi
1.1. Noiunea de algoritm, caracteristici
1.2. Date, variabile, expresii, operaii
1.3. Structuri de baz (liniar, alternativ i repetitiv)
1.4. Descrierea algoritmilor (programe pseudocod)
2. Elementele de baz ale unui limbaj de programare (Pascal sau C, la
alegere)
2.1. Vocabularul limbajului
2.2. Constante. Identificatori
2.3. Noiunea de tip de dat. Operatori aritmetici, logici, relaionali
2.4. Definirea tipurilor de date
2.5. Variabile. Declararea variabilelor
2.6. Definirea constantelor
2.7. Structura programelor. Comentarii
2.8. Expresii. Instruciunea de atribuire
2.9. Citirea/scrierea datelor
2.10. Structuri de control (instruciunea compus, structuri alternative i repetitive)
3. Subprograme predefinite
3.1. Subprograme. Mecanisme de transfer prin intermediul parametrilor
3.2. Proceduri i funcii predefinite
4. Tipuri structurate de date //(tipul pointer)
4.1. Tipul tablou
4.2. Tipul ir de caractere
operatori, proceduri i funcii predefinite pentru: citire, afiare, concatenare,
cutare, extragere, inserare, eliminare i conversii (ir valoare numeric)
4.3. Tipul nregistrare
5. Fiiere text
5.1. Fiiere text. Tipuri de acces
5.2. Proceduri i funcii predefinite pentru fiiere text
6. Algoritmi elementari
6.1. Probleme care opereaz asupra cifrelor unui numr
6.2. Divizibilitate. Numere prime. Algoritmul lui Euclid
6.3. irul lui Fibonacci. Calculul unor sume cu termenul general dat
6.4. Determinare minim/maxim
6.5. Metode de ordonare (metoda bulelor, inseriei, seleciei, numrrii)
6.6. Interclasare
6.7. Metode de cutare (secvenial, binar)
6.8. Analiza complexitii unui algoritm (considernd criteriile de eficien durata
de executare i spaiu de memorie utilizat)
7. Subprograme definite de utilizator
7.1. Proceduri i funcii
declarare i apel
parametri formali i parametri efectivi
parametri transmii prin valoare, parametri transmii prin referin
variabile globale i variabile locale, domeniu de vizibilitate
7.2. Proiectarea modular a rezolvrii unei probleme
8. Recursivitate
1
I. Algoritmi
1.1. Noiunea de algoritm, caracteristici
Ce este un algoritm?
Conceptul de algoritm nu este nou. Termenul algoritm deriv din numele
unui matematician persan, Abu Jafar Mohammed ibn Musa al Khowarizmil (cca.
825 e.n.), care a scris o carte cunoscut sub denumirea latin de Liber
algorithmi.
Matematicienii Evului Mediu nelegeau prin algoritm o regul pe baza
creia se efectuau calcule aritmetice. Ulterior, termenul de algoritm a circulat ntrun sens restrns, exclusiv n domeniul matematicii. O dat cu dezvoltarea
calculatoarelor cuvntul algoritm a dobndit o semnificaie aparte, astfel nct
astzi gndirea algoritmic s-a transformat, dintr-un instrument specific
matematicii, ntr-o modalitate fundamental de abordare a problemelor n diverse
domenii.
Un algoritm reprezint o metod de rezolvare a problemelor de un anumit
tip.
A rezolva o problem nseamn a obine, pentru anumite date de intrare,
rezultatul problemei (date de ieire):
Date de intrare
ALGORITM
Date de ieire
Operatorii relaionali descriu relaia de ordine sau de egalitate dintre cei doi
operanzi: < (mai mic), > (mai mare), (mai mic sau egal), (mai mare sau egal),
= (egal), (diferit).
Operatorii relaionali sunt operatori binari i se pot aplica numai operanzilor
numerici, logici ( fals < adevrat ) i de tip caracter ( ordinea caracterelor ind
determinat de codurile lor ASCII ).
Valoarea unei expresii relaionale este ntotdeauna de tip logic (deci poate
adevrat sau fals).
Operatori logici
Operatorii logici se pot aplica operanzilor logici. Valoarea unei expresii logice este
de tip logic.
Operatorii logici definesc o operaie logic: negaie logic - !; conjuncie Iogic i; disjuncie logic - sau. Operatorul ! este unar, operatorii i, sau sunt operatori
binari. Efectul acestor operatori este cel uzual. i reamintim n tabelul urmtor:
x
y
!x
x sau y
x i y
Fals (0)
Fals (0)
Adevrat (1)
Fals (0)
Fals (0)
Fals (0)
Adevrat (1)
Adevrat (1)
Adevrat (1)
Fals (0)
Adevrat (1)
Fals (0)
Fals (0)
Adevrat (1)
Fals (0)
Adevrat (1)
Adevrat (1)
Fals (0)
Adevrat (1)
Adevrat (1)
Evaluarea unei expresii
n procesul de evaluare a unei expresii se respect regulile de baz, nvate la
matematic ( n primul rnd se evalueaz expresiile dintre parantezele rotunde;
apoi se execut operaiile n ordinea prioritii lor; dac exist mai multe operaii
cu aceeai prioritate, se execut n ordine, n funcie de asociativitatea lor).
Prioritatea operatorilor este: (1 fiind considerat prioritatea maxim):
Prioritate
Operatori
Simbol
Asociativitate
1.
Negaia logic
!
de la dreapta la stnga
2.
Aritmetici multiplicativi
*, /, %
de la stnga la dreapta
3.
Aritmetici aditivi
+, de la stnga la dreapta
4.
Relaionali
<, >, , , =, de la stnga la dreapta
5.
Conjuncie logic
i
de la stnga la dreapta
6.
Disjuncie logic
sau
de la stnga la dreapta
1.3
10
repet
instruciune
pn cnd !(expresie);
11
12
II.
A=065
0=048
Pentru a scrie n limbaj de programare un caracter utiliznd codul ASCII :
Alt (din dreapta ) + codul ASCII al caracterului.
Exemplu: Alt+179 scrie caracterul grafic |
Identificatorii sunt ntlnii i sub denumirea de nume i au rolul de a desemna
nume de variabile, constante , funcii, etc.
Din punct de vedere sintactic identificatorii sunt o succesiune de litere, cifre i liniue
de subliniere dintre care prima trebuie s fie liter sau liniu de subliniere.
Ex: nume corect de variabil: a, a3, _56, nr_cuv
nume greit de variabil: 3aq, nr cuv
Observaii:
- un identificator poate s aib orice lungime, semnificative sunt primele 31
caractere.
- C/C++ este case-sensitive (face distincie ntre literele mari i mici; adic un
identificator a difer de identificatorul A)
- identificatorii ar trebui s aib denumirea n conformitate cu scopul utilizrii lor.
O categorie special de identificatori este reprezentat de cuvintele rezervate
sau cuvinte cheie ale limbajului.
Din punct de vedere sintactic cuvintele cheie sunt identificatori utilizai numai n scopul
pentru care au fost creai.
Exemplu:
if (cuvnt cheie care marcheaz nceputul instruciunii alternative n C)
while (cuvnt cheie care marcheaz nceputul instruciunii repetitive n C)
Observaie: este eroare de sintax utilizarea cuvintelor cheie n alt scop dect cel
pentru care au fost create
Separatorii
Sunt utilizai pentru a separe unitile sintactice ntre ele;
Exist mai multe tipuri de separatori:
- separatori standard: spaiul ( ), tab(\t), enter (new line \n)
- delimitatori: operatorul virgul (,)
- separatori speciali: ;(este utilizat la finalul unei instruciuni), (apostroafe) i
(utilizai pentru constantele de tip caracter i ir de caractere)
Comentariile
Reprezint o succesiune de caractere pe care compilatorul (cel care transcrie
codul surs n limbaj main) nu le ia n considerare.
Exist n C/C++ dou tipuri de comentarii:
- pe mai multe linii cu marcajul /**/
- pe o singur linie (de la marcaj pn la sf. de linie) cu marcajul //
Sunt utilizate pentru a crete gradul de lizibilitate a programului i ajut utilizatorii
multiplii la nelegerea programului.
14
2.2 Constante
Variabilele - sunt date a cror valoare poate fi modificat pe parcursul execuiei
programului.
Constantele - sunt date ce nu pot fi modificate n cadrul programului.
Constantele ntregi sunt numere ntregi exprimate in:
zecimal - succesiuni de cifre zecimale (ex: 100)
octal - succesiuni de cifre octale precedate de 0 (ex: 024)
hexazecimal - succesiuni de cifre hexazecimale precedate de 0x sau 0X
(ex: 0xFF1) ; baza 16 are cifre 0..9 i litere A..F unde A=10F=15
Constantele reale pot fi specificate n notaia uzual sau n format exponenial
(tiinific). n forma uzual cuprind partea ntreag i partea zecimal, separate de
caracterul .(punct). n format exponenial se specific n plus un exponent al lui 10,
precedat de e sau E. n acest caz valoarea numrului se obine nmulind numrul
(corespunztor construciei din faa literei e/E) cu 10 la puterea specificat de
exponent.
Constantele caracter sunt constituite din caractere ncadrate ntre apostroafe. Se
pot construi secvene escape (formate din caracterul backslash \ urmat de codul
ASCII al caracterului - n baza 8 sau x i codul ASCII n baza 16 )
Exemple:
\65 este 5 n baza 8
\x35 este 5 n baza 16
Unele caractere negrafice au asociate secvene escape speciale:
Secven escape
Caracter
\b
\t
\n
\a
\\
Caracterul backslash
Caracterul apostrof
Caracterul ghilimele
Operatorul
+, *, /, %
+,-
Observaii:
Operatorul % se poate aplica numai datelor de tip ntreg.
Dac operatorul / se aplic cel puin unui operand de tip real atunci rezultatul
este real (idem pentru operatorii +,-,*)
Exemplu:
int a=5,b=2;
cout<<a/b; // 2
cout<<(float)a/b; // 2.5
cout<<5/2.0; //2.5
Operatorii logici sunt de dou tipuri: logici globali i logici pe bii (sunt operatori binari
toi n afar de negaia logic i pe bii care sunt unari)
Operatori logici globali (&&, ||, !)
&&
0
!0=1
0
0
0
!0=1
0
1
||
0
!0=1
0
0
1
!0=1
1
1
!
0
!0=1
1
0
Observaie: Operatorii logici globali se pot aplica datelor de orice tip standard,
rezultatul fiind ntotdeauna logic.
Exemplul 1:
Exemplul 2:
int a=5,b=3;
int a=5,b=3;
if(a>0)
if (a)// a!=0
cout<<a; //5
cout<<a; //5
else
else
cout<<b;
cout<<b;
Exemplul 3:
int a=5,b=3;
if(a&&b)
cout<<a+b;
//8
else
cout<<a-b;
Exemplul 4:
int a=5,b=3;
if(a>0 && b<0) //1&&0==0
cout<<a+b;
else
cout<<a-b; //2
16
Exemplul 5:
Exemplul 6:
int a=5,b=3;
int a=4;
if(a>0 || b<0) cout<<(a<0)<<
//1||0==1
<<!a<< <<
cout<<a+b; //8 (a==4); // 0 0 1
else
cout<<a-b;
0
0
0
|
0
1
1
0
1
sau pe bii
XOR
0
1
0
1
1
1
Exemplul &
negaia pe bii
~
0
1
Exemplul |
int a=10,b=5;
//a=10102 b=1012
cout<<a&b; // 0
int a=10,b=6;
//a=10102 b =1102
cout<<a&b; //2
^
0
1
1
0
0
0
1
int a=10;
cout<<~a;
// 32757
1
1
0
Exemplul ^
Exemplul ~
int a=10,b=5;
// a=10102 b=01012
// a|b= 11112=15
cout<<a|b; // 15
int a=10,b=6;
// a=10102 b=01102
// a|b= 11102= 14
cout<<a|b; // 14
int a=10,b=5;
//a=10102
b=01012
//a^b= 11112=15
cout<<a^b; // 15
int a=10,b=6;
//a=10102
b=01102
//a^b= 11002= 12
cout<<a^b; // 12
Nr. octei
2 octei cu semn
Valori
-32768..32767
Obs.
00000000000000002 =010
11111111111111112=3276710
unsigned int
2 octei fr semn 065535
long int
4 ocei cu semn -21474836482147483647
unsigned long int 4 ocei fr semn 04294967295
Observaie: La oricare din tipurile ntregi n afar de int cuvntul rezervat int este
implicit
long int long; unsigned int unsigned
Exemple:
int a; // declar un numr ntreg a crui valoare nu depete n modul 32767
unsigned b,c; // declar dou numere naturale a cror valoare nu depete 65535
17
2) Tipul real
Denumirea Nr. octei - n
Valori
virgul mobil
float
4 octei
[3.4*10-38,3.4*1038]U [-3.4*10+38,-3.4*10-38]
double
8 octei
[1.7*10-308,1.7*10308]U [-1.7*10+308,-1.7*10-308]
long double 10 octei
[3.4*10-4932,1.1*104932]U [-3.4*10+4932,-1.1*10-4932]
3) Tipul caracter
Denumirea
char
unsigned char
Nr. octei
1 octet cu semn
1 octet fr semn
Valori
-128127
0255
char
(cu trunchiere)
short int (cu trunchiere)
long int (cu extensia semnului)
short int ca i int
int
long int
ca i int
float
double
Conversii aritmetice.
Cnd un operator binar se aplic ntre doi operanzi de tip diferit, are loc o
conversie implicit a tipului unuia dintre ei, i anume, operandul de tip mai restrns
este convertit la tipul mai larg al celuilalt operand. Astfel n expresia de mai jos:
int i;
float f;
f + i operandul int este convertit n float.
Operatorii aritmetici convertesc automat operanzii la un anumit tip, dac operanzii
sunt de tip diferit. Se aplic urmtoarele reguli:
operanzii char i short int se convertesc n int; operanzii float se convertesc n
double.
dac unul din operanzi este double restul operanzilor se convertesc n double
iar rezultatul este tot double.
dac unul din operanzi este long restul operanzilor se convertesc n long , iar
rezultatul este tot long.
18
double float
long
unsigned
Observaii
1. Prin tip specicm tipul variabilelor care se declar.
2. Prin nume_var1, nume_var2, specicm numele variabilelor care se declar
(acestea sunt identicatori).
3. Se pot declara simultan mai multe variabile de acelai tip, separnd numele lor
prin virgul.
4. La declarare, putem atribui variabilei o valoare iniial, specicnd dup numele
variabilei caracterul '=' i o expresie de iniializare. Expresia trebuie s e
evaluabil n momentul declarrii.
5. Parantezele [] utilizate n descrierea formatului general au semnicaia c
elementul ncadrat ntre paranteze este opional (poate s apar sau nu ntr-o
declaraie de variabile).
Exemple
int a, b=3, c=2+4;
char z;
float x=b*2.5, y;
Am declarat trei variabile a, b i c de tip int, o variabil z de tip char i dou
variabile x i y de tip float. Variabilei b i-am atribuit valoarea iniial 3, variabilei c i-am
atribuit valoarea 6, iar variabilei x i-am atribuit valoarea 7. 5;
Variabilelor a, y i z nu le-am atribuit nicio valoare iniial la declarare.
Declararea unei variabile trebuie s precead orice referire la variabila respectiv
i poate plasat n interiorul unei funcii (n cazul nostru, al funciei main ( ) ) sau n
exteriorul oricrei funcii (n cazul nostru, n exteriorul funciei main ( ) ). Dac
declaraia este plasat n interiorul unei funcii, variabila se numete local funciei,
altfel se numete global.
Variabilele globale sunt automat iniializate cu 0; cele locale nu sunt iniializate.
La declararea variabilelor nu se admit iniializri multiple (produc eroare de
sintax):
Greit
Corect
int a, b, c;
a=b=c=5;
declarate)
int a=b=c=5;
Tipul operaiei
Semne (operatori unari)
De multiplicitate (operatori binari)
Aditivi (operatori binari)
Operatorul
+, *, /,%
+,-
Observaii:
Operatorul % se poate aplica numai datelor de tip ntreg.
Dac operatorul / se aplic cel puin unui operand de tip real atunci rezultatul
este real (idem pentru operatorii +,-,*)
Exemplu:
int a=5, b=2;
cout<<-a;
// afieaz -5
cout<<a/b;
// 2
cout<<(float)a/b; // 2.5
cout<<5/2.0;
//2.5
Operatorii logici sunt de dou tipuri: logici globali i logici pe bii (sunt operatori binari
toi n afar de negaia logic i pe bii care sunt unari)
Operatori logici globali (&&, ||, !)
&&
0
!0=1
0
0
0
!0=1
0
1
||
0
!0=1
0
0
1
!0=1
1
1
!
0
!0=1
Observaie:
Operatorii logici globali se pot aplica datelor de
fiind ntotdeauna logic.
Exemplul 1:
Exemplul 2:
Exemplul 3:
int a=5,b=3;
int a=5,b=3;
if(a>0)
if (a)// a!=0
cout<<a; //5
cout<<a; //5
else
else
cout<<b;
cout<<b;
Exemplul 4:
int a=5,b=3;
if(a&&b)
cout<<a+b;
//8
else
cout<<a-b;
1
0
Exemplul 5:
int a=5,b=3;
if(a>0 && b<0) //1&&0==0
cout<<a+b;
else
cout<<a-b; //2
Exemplul 6:
int a=5,b=3;
int a=4;
if(a>0 || b<0) cout<<(a<0)<<
//1||0==1
<<!a<< <<
cout<<a+b; //8 (a==4); // 0 0 1
else
cout<<a-b;
0
0
0
sau pe bii
1
0
1
Exemplul &
int a=10,b=5;
//a=10102 b=1012
cout<<a&b; // 0
int a=10,b=6;
//a=10102 b =1102
|
0
1
0
0
1
negaia pe bii
1
1
1
~
0
1
1
0
Exemplul |
Exemplul ~
int a=10,b=5;
// a=10102 b=01012
// a|b= 11112=15
cout<<a|b; // 15
int a=10,b=6;
int a=10;
cout<<~a;
// 32758
22
0
0
1
1
1
0
Exemplul ^
int a=10,b=5;
//a=10102
b=01012
//a^b= 11112=15
cout<<a^b; // 15
int a=10,b=6;
cout<<a&b; //2
// a=10102 b=01102
// a|b= 11102= 14
cout<<a|b; // 14
//a=10102
b=01102
//a^b= 11002= 12
cout<<a^b; // 12
j=j+(++i); // j=5+7=12
cout<<j;
j=j+(i++); // j=12+7=19 i i=8
cout<<j;
Operatori de deplasare pe bii (<<, >>)
Sunt operatori binari care realizeaz deplasarea pe bii la stnga respective la dreapta
astfel:
a<<b (reprezint n baza 2 numrul a i l deplaseaz la stnga cu un numr de
poziii binare egal cu valoarea operandului din dreapta adic a lui b). Se va completa
irul n dreapta cu un numr de 0-uri egal cu valoarea lui b (b de 0).
Exemplu:
1210<<2=00000000 000011002 <<2=00000000 001100002=1*24+1*25=48
12%2=0
6%2=0
3%2=1
1%2=1
0
Observaie: Matematic operaia de deplasare la stnga pe bii se transcrie:
a<<b=a*2b
a>>b (reprezint n baza 2 numrul a i l deplaseaz la dreapta cu un numr de poziii
binare egal cu valoarea operandului din dreapta adic a lui b). Se va completa irul n
n stnga cu un numr de 0-uri egal cu valoarea lui b (b de 0).
Exemplu:
12>>3=00000000 000011002 >>3=00000000 000000012=1*20=1
12%2=0
6%2=0
3%2=1
1%2=1
0
Observaie: Matematic operaia de deplasare la dreapta pe bii se transcrie:
a>>b=[a/2b]
Operatorul condiional (?:)
expresie1 ? expresie2 : expresie3
Efect: se evalueaz expresie1, dac rezultatul logic este adevrat (1) se execut
expresie2 altfel se execut expresie3.
Exemplu:
int x=-4;
cout<<(x<0 ? -x : x);
Exemplu:
int a=4,b=2;
cout<<(a>b ? a : b); // afieaz maximul dintre valorile a i b
Operatorul referenial (&)
Efect: se utilizeaz pentru a obine adresa de memorie la care este salvat o variabil
Exemplu:
int a;
cout<<&a; // rezultatul este un numr n baza 16 reprezentnd adresa de memorie a lui a
Operatorul pentru determinarea spaiului de memorie ocupat (n octei)- are dou
forme: sizeof(tip) i respectiv sizeof(variabil)
Exemplu:
int a=20;
cout<<sizeof(int)<<endl;
// 2 (reprezentnd spaiul ocupat n memorie)
cout<<sizeof(a);
// 2 (reprezentnd spaiul ocupat n memorie)
Operatorul de conversie explicit (tip)
Efect: este utilizat pentru conversia forat a unei variabile sau expresii la un tip
standard tip
Exemplu:
float c;
int a=5,b=6;
c=(a+b)/2;
cout<<c;
// 5 rezultat de tip ntreg
c=(float)(a+b)/2;
cout<<c;
// 5.5
c=(a+b)/2.0;
cout<<c;
// 5.5
Operatorul , (virgul)
Sintaxa: expresie1, expresie2,, expresien
Rezultatul aplicrii operatorului const n evaluarea expresiilor de la stnga la dreapta,
valoarea final a expresiei fiind valoarea ultimei expresii evaluate.
Exemplu:
int i, a, b;
i=0, b=i+2, a=b*2 // valoarea expresiei este 4
Evaluarea oricrei expresii se realizeaz astfel: dac exist paranteze rotunde
se vor evalua ncepnd cu cea mai din interior (spre exterior). Dac nu exist
paranteze rotunde evaluarea se va face n funcie de prioritatea operatorilor iar la
prioritate egal n funcie de asociativitate.
Prioritate
1
2
3
4
Operator
! ~ + - (semne) ++ -- (typecast) sizeof & (referenial)
*/ %
+ - (op aditivi)
<< >>
25
Asociativitate
dreapta -> stnga
stnga -> dreapta
stnga -> dreapta
stnga -> dreapta
5
6
7
8
9
10
11
12
13
26
int a=3,b=5,c=7;
c=(a>=b); // c=0 i se numete atribuire cu sens logic
c=(a*b-c); // c= 15
n C/C++ se admit atribuiri multiple de forma:
identificator_variabil1 = identificator_variabil2 ==valoare
ntr-o astfel de atribuire, atribuirile se realizeaz de la dreapta la stnga.
Exemplu:
int a=2, x, y, z;
x=(y=a-1)=z=a;
Se va efectua datorit parantezelor atribuirea y=1 iar apoi se vor efectua atribuirile
multiple de la stnga la dreapta: x=y=z=2
Instruciunea de atribuire poate avea i formele:
identificator_variabil operator = expresie
identificator_variabil = identificator_variabil operator expresie
Unde operatorul poate fi: +, -, *, /, %, <<, >>
Exemplu:
int a=7;
a+=5 // a=a+5 a=12
2. Instruciunea compus care are sintaxa:
{
instr_1;
instr_n;
}
Observaie : instruciunea compus se utilizeaz atunci cnd ntr-o instruciune de
decizie sau repetitiv o ramur conine mai mult de o instruciune.
Exemplu:
.
int a,b,c;
if(a>b)
// dac rezultatul evalurii expresiei logice este adevrat
{
// trebuie executate dou atribuiri (grupate ntr-o instruciune compus)
a=a+b;
c=a+b;
}
else
cout<<Nimic;
Structura alternativ se transcrie n C/C++ prin dou instruciuni:
1. Instruciunea de decizie simpl (transcrie din pseudocod instruciunea dac
atunci)
Sintaxa:
if (expresie)
28
instr1;
[ else
opional
instr2;]
Instruciunea evalueaz expresia logic, dac este adevrat (1) execut intr1 iar dac
nu execut instr2 dac ramura de altfel este prezent iar n caz contrar nu execut
nimic.
Exemplu 1: Determinarea valorii maxime dintre 2 valori ntregi a i b citite (cu ramur
de else)
int a,b;
cin>>a>>b;
if (a>b)
cout<<a;
else
cout<<b;
Exemplul 2: Determinarea valorii maxime dintre 2 valori ntregi a i b citite (fr
ramur de else)
int a,b,max;
cin>>a>>b;
max=a;
if (max<b)
max=b;
cout<<max;
Observaie:
ntotdeauna ramura de else dac exist se va asocia celui mai din interior if.
Exemplu: Evitarea unei asocieri nedorite pentru ramura de else se poate realiza n
dou moduri:
cu ramur de else vid
cu instruciune compus
int a,b,c;
cin>>a>>b>>c;
if(a>b)
if(b>c)
cout<<a;
else; //instr. vid nu execut nimic
else
cout<<a este mai mic dect b;
int a,b,c;
cin>>a>>b>>c;
if(a>b)
{
if(b>c)
cout<<a;
}
else
cout<<a este mai mic dect b;
Se utilizeaz atunci cnd decizia se ia n urma evalurii mai multor expresii (i este
unic)
Sintaxa
switch (expresie)
{
case constanta_1: instr_1;break;
do
{
30
instruciuni;
} while(condiie);
Execuie: Se vor executa n ordinea n care apar instruciunile apoi se verific
condiia i dac rezultatul logic este 1 (TRUE) se continu cu execuia instruciunilor
iar n caz contrar se iese din repetitiv.
Observaie: Diferena ntre repetitive cu test iniial i cea cu test final este aceea c
repetitiva cu test final se execut ntotdeauna cel puin o dat.
1,3,5, j=2
Exemplu
s=0;
for(;x!=0;x=x/10)
s=s+x%10;
s=0;
while(x!=0)
{
s=s+x%10;
x=x/10;
}
Exemplu
for(s=0;x!=0;s=s+x%10,x=x/10); // realizeaz suma cifrelor lui x
Aplicaii:
1) Se considera n numr natural. Calculai i afiai numrul de cifre.
31
Subprograme (Funcii)
2 tipuri:
- returneaz un rezultat
- calculeaz mai multe valori, nu returneaz nimic
Sintaxa:
tip identificator_fc( [lista de parametri formali] )
{
Return expresie; // expresie are tipul tip
}
Lista de p.f : tip id_var,, tip id_var
Apelul funciei:
- se face n interiorul unei expresii de forma:
variabil=id_fc([lista de parametri efectivi]);
sau cout<< id_fc([lista de parametri efectivi]);
lista de parametri efectivi: id_var1,,id_varn
32
Sintaxa:
Void identificator_fc( [lista de parametri formali] )
{
}
Lista de p.f : tip id_var,, tip id_var
Apelul funciei:
Id_fc([list de parametri efectivi]);
1) int suma(int n)
void suma(int n)
int s=0;
int s=0;
While(n!=0)
While(n!=0)
s=s+n%10;
s=s+n%10;
n=n/10;
n=n/10;
return s;
cout<<s;
}
apelul n main
suma(n);
33
apelul n main
int sum=suma(n);
sau
cout<<suma(n);
Transmiterea parametrilor:
- prin valoare(se poate modifica parametrul n interiorul funciei, la ieire se
revine la valoarea iniial)
- prin referin( se modific valoarea de la adresa stabilit a parametrului, la
ieire valoarea modificat rmne)
void suma(int n, int &s)
{
While(n!=0)
{
s=s+n%10;
n=n/10;
}
}
apelul n main
int s=0;
suma(n,s);
cout<<setw(4)<<a[i][j];
cout<<setprecision(2)<<a[i];
34
a[i] *(a+i)
a&a[0]
Tipul pointer
Am nvat nc din clasa a IX-a, c o variabil este o dat caracterizat prin trei
atribute: tip, valoare i adres. Primele dou atribute au fost foarte ntlnite pn
acum. Atributul "adres" va face obiectul noiunilor din acest capitol. Pentru nceput,
considerm un exemplu foarte simplu, o variabil de tip ntreg care se declar astfel:
int x; // se rezerv n memorie 2 octei
Toate variabilele unui program sunt memorate n aa-numita memorie intern
RAM. Aceasta este mprit n nite "csue", numite locaii de memorie sau celule de
memorie. Fiecare locaie reprezint un octet i se caracterizeaz printr-o anumit
adres. Adresele locaiilor de memorie sunt numere exprimate n (baza 16).
n urma declarrii unei variabile, se rezerv pentru aceasta un numr de octei
succesivi n memoria intern RAM (locaii succesive), numr care depinde de tipul
variabilei i de implementare.
Spaiul de memorie alocat unei variabile rmne ocupat pe toat durata
programului sau subprogramului (funciei) n care a fost declarat variabila. O astfel de
variabil se numete "variabil alocat static", iar procesul de rezervare de memorie
este de ctre compilator i se numete "alocare static a memoriei".
De ce se aloc memorie pentru variabila x declarat mai sus?
Dup declarare, variabila x poate primi ca valori numere ntregi, prin atribuire sau
prin citire. n momentul n care variabila a primit o valoare, acea valoare va
memorat n zona de memorie alocat variabilei.
O alt posibil declarare a variabilei x este urmtoarea: declaram o variabil x
care va conine adresa de memorie a unui numr ntreg ( valoarea variabilei x va
adresa la care se va depozita numrul ntreg n memoria RAM
Variabila x se numete pointer ctre un ntreg sau referin ctre un ntreg.
Firete c tipul de date al variabilei x nu va mai int, ci un tip de date numit tipul
pointer ctre un ntreg sau tipul referin ctre un ntreg; acesta se declar astfel:
int *x; // x este un pointer ctre un ntreg
Caracterul * reprezint operatorul de adresare, este un operator unar, adic se
aplic unui singur operand.
Observaie:
Operatorul de adresare este identic ca i scriere cu cel de nmulire dar compilatorul nu
va face confuzie deoarece operatorul de nmulire este binar.
Sintaxa de declarare pointerilor este:
tip *identificator1,*identificator2,* identificatorn;
unde tip este tipul de date pe care-I refer pointerii iar identificator1,identificator2,
identificatorn sunt identicatorii variabilelor de tip pointer
Exemple:
float *a, *b; // a i b sunt pointeri ctre tipul float (pointeri ctre numere reale)
char *c ;
// c este pointer ctre tipul caracter
35
Dac pointerul x conine adresa unui numr, numrul se va memora efectiv ntr-o
"variabil pereche" (*x) pe care o creeaz automat compilatorul cnd declarm
pointerul x. "Perechea" *x se numete variabil alocat dinamic.
adreseaz
x
adresa numrului ntreg
(pointer ctre numr)
*x
numrul ntreg (variabila alocat dinamic)
int *x; // se declar dar nu i se rezerv automat spaiu n memorie pentru perechea *x
x=(int*) malloc(2); // se aloc 2 octei
Pentru a evita orice incertitudini cu privire la mrimea spaiului de memorie
necesar pentru memorarea valorilor de un anumit tip, este recomandabil s folosim
operatorul sizeof.
Astfel alocarea de memorie de mai sus devine:
x=(int*) malloc(sizeof(int));
Observaie:
Chiar dac n instruciunea de alocare apare pointerul x, se aloc memorie
pentru variabila ataat *x, i nu pentru pointerul x.
Eliberarea spaiului de memorie ocupat de variabila referit prin pointerul
identificator_pointer este:
free(identificator_pointer);
2. Alocarea i eliberarea memoriei cu new i delete
Alocarea de memorie se face astfel:
identificator_pointer= new tip;
Eliberarea spaiului de memorie se face astfel:
delete identificator_pointer;
Exemplu:
int *x; //se declar dar nu i se rezerv automat spaiu n memorie pentru perechea *x
x= new int; // se aloc 2 octei
delete x; // elibereaz spaiul de memorie alocat mai sus cu new
Observaie:
Variabilele referite prin pointeri pot folosite la fel ca i variabilele alocate static n
operaii de citire, afiare, expresii, etc.
Exemplu:
Calculul ariei unul triunghi folosind pointeri: se consider doi pointeri b i h referind
valorile bazei i nlimii unui triunghi. Calculai i afiai aria triunghiului.
#include<iostream.h>
void main()
{
int *b,*h;
float *A;
b=new int;
h=new int;
A=new float;
cout << "Dati baza si inaltimea triunghiului: ;
cin >> *b >> *h;
*A=(*b**h) /2.0;
cout << \nAria triunghiului este: " << *A;
delete b;
delete h;
delete A;
37
return 0;
}
Observaie:
Nu s-a alocat i nici eliberat memoria pentru pointerul x pentru c este exact
zona de memorie ocupat de variabila a care se elibereaz la sfritul execuiei
programului.
38