Documente Academic
Documente Profesional
Documente Cultură
Limbajul C creat n 1972 la Bell Laboratories , avnd ca obiectiv principal dezvoltarea unui
limbaj care s fie utilizat pentru implementarea sistemului de operare UNIX.
Caracteristici:
- produce programe eficiente
- portabil
- set puternic de operatori
- flexibilitate n programare
- ofer faciliti specifice limbajelor de asamblare
- limbaj de programare structurat
Limbajul C++ - extensie a limbajului C -permite programarea orientat spre obiecte (obiectual)
datele
procedurile ce opereaz cu ele
declaraii de variabile
instruciuni de prelucrare
tip void
main( )funcia rdcin, este prezent n orice program C i execuia programului ncepe
automat cu ea. Ea poate ntoarce un rezultat ntreg (int) sau nici un rezultat (void).
Cel mai simplu program C++
void main()
{
}
1
Obs:
1) Este permis ca tipul funciei s lipseasc:
main( )
{
}
n acest caz se presupune c funcia ntoarce un rezultat ntreg i la compilare, deoarece ea nu
ntoarce nici un rezultat, se va primi un avertisment.
2) n exemplul urmtor:
Main( )
{
}
programul va da eroare de sintax deoarece limbajul face distincie ntre litere mari i mici.
3) Urmtoarele exemple sunt corecte i identice (nu are importan nici plasarea cuvintelor pe linie,
nici spaiile dintre ele):
main(
{}
main ( )
{
main ( )
{
}
1.
2.
underscore ( _ ) cu restricia ca primul caracter s nu fie cifr. Cu ajutorul lor se asociaz nume
constantelor, variabilelor, funciilor, etc.
Exemplu: i, j1, un_numar, _id
3.
Separatori i comentarii
delimiteaz unitile lexicale
dintr-un program:
()
Ex:
{}
/* comentariu scris
[]
pe doua linii*/
""
''
provine de la:
i - input
o - output
Obs:
Dup editarea fiierului surs, pentru a obine un program executabil trebuie parcurse etapele:
editare fiier surs ----------------------> fiier obiect ------------------------> fiier executabil
.CPP
compilare
.OBJ
linkeditare
.EXE
Obs: cin
cout
console input
console output.
Ex nr.1:
#include<iostream.h>
/* functia main este functia principala, cu care
incepe executarea programului */
void main( )
{
/* Urmeaza instructiunea prin care se
afiseaza un text */
cout<<"Prima aplicatie!";
} // sfarsitul functiei main
Tipuri de date
Orice variabil, nainte de a fi utilizat, trebuie declarat prin precizarea tipului ei.
tip de date
Limbajul C++ conine urmtoarele tipuri standard (cunoscute de ctre limbaj fr a fi definite n
cadrul programului):
Tipuri ntregi:
1. unsigned char caracter fr semn - ocup 8 bii i ia valori ntre 0 i 28 - 1
2. char caracter - ocup 8 bii i ia valori ntre -27 i 27 - 1
3. unsigned int ntreg fr semn - ocup 16 bii i ia valori ntre 0 i 216 - 1
4. int ntreg scurt - ocup 16 bii i ia valori ntre -215 i 215 - 1
5. unsigned long ntreg lung fr semn - ocup 32 de bii i ia valori ntre 0 i 232 - 1
6. long - ntreg lung cu semn - ocup 32 de bii i ia valori ntre - 231 i 231 - 1
Tipuri reale:
Variabilele de tip real rein numere cu zecimale. n locul virgulei, n C++ se folosete punctul.
1. float - ocup 32 de bii i ia valori ntre 3.4 x 10-38 i 3.4 x 1038
2. double - ocup 64 de bii i ia valori ntre 1.7 x 10-308 i 1.7 x 10308
3. long double - ocup 80 de bii i ia valori ntre 3.4 x 10-4932 i 1.1 x 104932
Exemple de declaraii de variabile:
char a, b=25, c=x;
int d=21, e;
float f ;
Obs:
1) la tiprirea unei variabile de tip caracter se tiprete caracterul i nu codul su, dei la
atribuire se poate ataa fie codul caracterului, fie caracterul.
Ex: n urma execuiei secvenei de mai jos, se va tipri de dou ori caracterul d:
char a = 100, b = d ;
cout << a << << b ;
5
Constante
Constant: entitate a crei valoare rmne neschimbat pe durata existenei sale. Ea are un tip i o
valoare.
Pentru a defini o constant se folosete declaraia const care are forma:
const [tip] nume = valoare ;
tipul constantei
numele constantei
valoarea constantei
1. Constante ntregi:
- zecimale (n baza 10). Exemple: 5, 345, 32, -12
- octale (n baza 8). O succesiune de cifre octale 0 7 precedat de un 0 nesemnificativ.
Exemple: 0345 reine numrul 345(8) .
- hexazecimale (n baza 16). O succesiune de cifre hexazecimale precedat de 0x sau 0X.
Exemple: 0x2B3 reine numrul 2B3(16) .
6
Cifrele hexazecimale se obin extinznd cifrele zecimale cu literele mici sau mari de la A la F:
Valoare
10
11
12
13
14
15
n care se folosete semnul - , de exemplu -45,
Rolul secvenelor escape este acela de a da posibilitatea declarrii caracterelor care nu se pot tasta.
De exemplu, caracterul backspace (codul 8(10)) poate fi declarat \10 sau \x8 , iar caracterul
newline (codul 10(10)) poate fi declarat \12 sau \xa .
Obs: Dat fiind un numr ntreg (scris ntr-o baz oarecare b1), pentru scrierea lui ntr-o alt baz (b2)
se mparte succesiv numrul scris n baza b1 la noua baz pn cnd se obine ctul 0; Reprezentarea
n noua baz se obine prin scrierea resturilor (reprezentate n noua baz) n ordinea invers obinerii
lor i multiplicarea cu puterea corespunztoare a bazei care este egal cu rangul operaiei.
n mulimea caracterelor cu rol special pentru citire/scriere se situeaz caracterele albe
(whitespaces): blank ( ), tab orizontal (\t), tab vertical (\v), newline (\n), cr (\r).
Ex:
#include <iostream.h>
void main()
{
char a = \t, b=\i ;
cout<<a<<b;
}
Programul tiprete bbbbbbbbi
tab
3. Constante reale:
- au o parte ntreag (ce poate fi vid); n acest caz devine o constant zecimal.
- au o parte fracionar (ce poate fi vid numai dac partea ntreag este prezent); aceasta este
format din: caracterul "." (punct) urmat de o succesiune de cifre zecimale.
- au un exponent (poate lipsi); ncepe cu E sau e, apoi + sau - (opional) urmat de un ir de cifre
zecimale; E sau e exprim o putere a lui 10.
Ex:
Constant real
Valoare
Constant real
Valoare
12.
12
25e4
25x10^4
123.4
123.4
.1E-5
0.1x10^(-5)
.67
0.67
-123.456e2
-123.456x10^2=-12345.6
Obs: Implicit acestea sunt memorate utiliznd tipul double. Se poate fora ca acestea s fie
memorate sub tipul float adugnd sufixele f sau F sau sub long double adugnd l sau L.
Ex:
-144.5
double
-144.5f
float
-144.5L
long double
4. Constante ir de caractere:
Se declar ntre dou caractere . Funciile de prelucrare sunt n biblioteca string.h.
Ex: acesta este un text
Obs: Pe lng mecanismul cunoscut de declarare a constantelor (cu ajutorul lui const) n C++ mai
avem posibilitatea de declarare cu ajutorul directivei preprocesorului, #define:
#define
nume
expresie
#include <iostream.h>
#define pi 3.14
#define text valoarea aproximativa a lui pi este
main()
{
cout<<text<<pi;
}
2) Se poate defini o constant cu ajutorul uneia deja definit (programul urmtor va tipri 3.14):
#include <iostream.h>
#define pi 3.14
#define alt_pi pi
main()
{
cout<<alt_pi ;
}
Expresii
expresie - format dintr-un operand sau mai muli, legai prin operatori.
operatori semnificaie
()
[]
->
::
!
~
+++ -&
*
sizeof
(tip)
*
/
%
+, <<
>>
<, <=
>, >=
= =, ! =
&
^
&&
?:
=
*=, /=
%=
+ =, - =
&=
^=
!=
<<=, >>=
,
4
5
6
7
8
9
10
11
12
13
14
15
asociativitate
apel de funcie
expresie cu indici
selector de membrii la structuri
negare logic
negare bit cu bit
plus unar sau minus unar
incrementare i decrementare
obinerea adresei
indirectare
dimensiune operand (n octei)
conversie explicit de tip
nmulire
mprire
restul mpririi ntregi
plus binar (adunare), minus binar (scdere)
deplasare la stnga
deplasare la dreapta
mai mic i mai mic egal
mai mare i mai mare egal
egal, diferit
i logic pe bii
Sau exclusiv pe bii
Sau logic pe bii
i logic
Sau logic
operatorul condiional
atribuire simpl
atribuire produs, atribuire mprire
atribuire rest
atribuire sum, atribuire diferen
atribuire i (bit)
atribuire Sau exclusiv (bit)
atribuire Sau (bit)
atribuire cu deplasare stnga, respectiv dreapta
virgula
s
s
d
d
s
s
s
s
s
s
d
d
d
d
d
d
d
d
s
s
10
2) Operatorul % (restul mpririi ntregi) acioneaz numai asupra operanzilor de tip ntreg.
Ex:
3) La evaluarea expresiilor, n cazul n care un operator se aplic la doi operanzi de tipuri diferite, se
aplic urmtoarea regul (a conversiilor implicite):
- orice operand de tipul char i unsigned char este convertit ctre tipul int.
- dac un operand este de tipul unsigned long, atunci i cellalt se convertete ctre tipul unsigned
long.
- dac un operand este de tipul long, atunci i cellalt se convertete ctre tipul long.
- dac un operand este de tipul float, atunci i cellalt se convertete ctre tipul float.
- dac un operand este de tipul double, atunci i cellalt se convertete ctre tipul double.
- dac un operand este de tipul long double, atunci i cellalt se convertete ctre tipul long double
Ex:
1) Fie declaraiile:
int a = 5; char b = 6; float c = 9;
Atunci expresia a + b + c are rezultatul 20.0
11
#include <iostream.h>
void main()
{
int i;
char a,b;
a = x; i=a; b=i;
cout<<b;
}
#include <iostream.h>
void main()
{
char c ;
int i1, i2;
i1=300; c=i1; i2=c;
cout<<i2 ;
}
12
Operatori relaionali
<, >, <=, >=
Deoarece n C++ nu exist valorile logice TRUE i FALSE, rezultatul unei operaii logice este 1 n
cazul n care inegalitatea e respectat i 0 n caz contrar.
Ex:
3 > 5 rezultatul este 0
3<5
rezultatul este 1
Operatori de egalitate
= =, ! =
Ca i n cazul operatorilor relaionali, se returneaz 0 sau 1 n funcie de modul n care este
respectat sau nu egalitatea .
Operanzii pot fi constante, variabile, funcii.
Obs: Deoarece rezultatul operaiilor logice este 1 sau 0, se pot gsi ca operanzi n cadrul unor
expresii aritmetice.
Ex:
a = ((1<2)+(3!=5))*2
a = (2<3) = = (2!=8)
a = 5= =6
Operatori logici
! negare logic : dac operandul este o valoare 0, rezultatul este 0, altfel este 1
&& i logic: dac ambii operanzi sunt 0, rezultatul este 1, altfel este 0
sau logic: dac cel puin unul din operanzi este o valoare 0, rezultatul este 1, altfel este 0
Ex:
(2+3*3)&&(!0)
(2-2) (0)
!(1+3*3)
!!3
rezultatul este 1
!(3>4)
13
Obs: Deoarece operatorii logici aplicai unor operanzi produc valorile 0 sau 1, apelul lor poate apare
ca operanzi n cadrul unor operaii aritmetice:
Ex:
a = (!(3 < 4) + (3 && 4 ) * ( !0 )+( 3 4))
= (!(1) + (1)*(1) + (1))
=(0+1+1)
=2
Operatorul unar ~
Operatorul binar
Operatorul binar ^
~ 0 =1
0 & 0 =0
0 0 =0
0 ^ 0 =0
~ 1 =0
0 & 1 =0
0 1
=1
0 ^ 1 =1
1 & 0 =0
1 0
=1
1 ^ 0 =1
1 & 1 =1
1 1
=1
1 ^ 1 =0
Ex:
7&3=3
deoarece: 7
00000111
00000011
&
00000011
7 3 = 7
deoarece: 7
00000111
00000011
00000111
7^3=4
deoarece: 7
00000111
00000011
00000100
14
Operatorul << deplaseaz ctre stnga coninutul tuturor biilor operandului din stnga sa, cu un
numr de poziii egal cu valoarea reinut de al doilea operand. Poziiile rmase libere n dreapta,
vor reine valoarea 0.
Obs: a << n este echivalent cu a * 2n
Ex:
8 << 3 = 64 deoarece: 8
00001000
deplasare cu 3 poziii la stnga
01000000
64
Operatorul >> deplaseaz ctre dreapta coninutul tuturor biilor operandului din stnga sa, cu un
numr de poziii egal cu valoarea reinut de al doilea operand. Poziiile rmase libere n stnga, vor
reine valoarea 0.
Obs: a >> n este echivalent cu a / 2n
Ex:
7 >> 2 = 1 deoarece: 7
00000111
deplasare cu 2 poziii la dreapta
00000001
Operatorul de atribuire
- atriburi
Ex:
declaraiile:
atribuirile:
int a, b;
char c;
double f;
c cu a(conversie) */
c = f ; // c devine egal cu f
Obs : Pentru atribuiri se pot folosi i operatorii *=, /=, %=, +=, -=, <<=, >>=, &=, ^=,
n expresii de forma:
Ex:
declaraia:
atribuirile:
int a;
a *= 2 este echivalent cu a = a * 2
a %= 4 este echivalent cu a = a % 4
15
Operatorul , virgul
se utilizeaz n situaii n care ntr-un anumit punct al unui program este necesar s se realizeze un
calcul complex exprimat prin mai multe expresii.
formatul: exp1 , exp2 , ....., expn;
Expresiile se evalueaz pe rnd, de la stnga la dreapta. ntreaga expresie (care cuprinde cele n
expresii separate prin virgul ) va avea ca rezultat i tip valoarea i respectiv tipul, obinute n urma
evalurii ultimei expresii.
Ex:
expresia c = a = b + 3 , a = c + 2, b = b + 3
declaraiile:
int a = 5, b = 7;
b + 3 = 10; a = 10 ; c = 10.0 ;
float c;
a = 10 + 2 = 12;
se evalueaz astfel:
b = 7 + 3 = 10 ;
expresia n ansamblu este de tipul int i produce valoarea 10
Operatorul condiional
se utilizeaz n situaia n care exist dou variante de obinere a rezultatului n funcie de
ndeplinirea unei condiii.
formatul: exp1 ? exp2 : exp3;
- Se determin valoarea expresiei exp1.
- Dac aceasta este diferit de 0, se evalueaz exp2, iar exp3 este ignorat.
- Altfel, se evalueaz exp3 i exp2 este ignorat.
n ansamblu, expresia este de tipul lui exp2 sau exp3 i produce valoarea exp2 sau exp3.
Ex:
1)
int a, b, max;
max = (a>b) ? a : b;
2)
++ pentru incrementare
-- pentru decrementare
postfixat (dup operand): a-Obs: Dac operatorul este prefixat, variabila este incrementat / decrementat nainte ca valoarea
reinut de ea s intre n calcul.
Dac operatorul este postfixat, variabila este incrementat / decrementat dup ce valoarea
reinut de ea intr n calcul.
Operatorii de incrementare/ decrementare prefixai i postfixai se aplic numai variabilelor.
Exemple de expresii incorecte: ++4; 4--; (5+a)++; (5+a)--; ++(10+b); --(10+b)
b=5+(++a);
c=++b*++a;
b=5+(a++);
c=b++*a++;
b=5+(--a);
c=--b*--a;
b=5+(a--);
c=b--*a--;
sizeof (expresie)
sizeof (tip)
Ex:
int a, b, c, d;
a = sizeof(float);
a=4
float e;
b = sizeof(e);
b=4
c = sizeof(int);
d = sizeof(3 + 2*4);
17
float a;
a = (float) 5;
a = 5.000000
int b;
b = (int) 5.35;
b=5
int c;
c = 10
float d;
d = (float) (1/2)
d = 0.000000
float d;
d = 1/(float) 2
d = 0.500000
float d;
d = 5+((float)3+4)
d = 12.000000
Instruciuni
Instruciunea expresie
Forma:
expresie;
expresie
atribuire
apel de funcie
instruciune expresie
instruciune de atribuire
Ex: randomize( );
Instruciunea compus
succesiune de instruciuni incluse ntre acolade, precedate eventual de declaraii de variabile locale.
Forma: {
declaraii i definiii locale blocului
instruciuni
}
Ex: presupunem c ntr-un punct al programului trebuie permutate valorile variabilelor a i b:
{
int aux;
aux = a; a = b; b = aux;
}
18
Instruciunea IF
Forme:
if (expresie) instruciune;
if (expresie) instruciune1;
else instruciune2;
Funcionare: se evalueaz expresia din paranteze. Apoi, n primul caz, dac expresia are valoarea
diferit de 0 (adevrat) se execut instruciune. Altfel, se trece la instruciunea urmtoare
instruciunii if. n al doilea caz, dac expresia are valoarea diferit de 0 (adevrat) se execut
instruciune1 i apoi se trece la instruciunea urmtoare instruciunii if; altfel, se execut
instruciune2 i apoi se trece la instruciunea urmtoare instruciunii if.
Obs:
1) nainte de cuvntul cheie else nu se pune ; dac instruciune1 este o instruciune compus,
altfel se pune obligatoriu.
2) Ramurile instruciunii if pot conine la rndul lor alte instruciuni if (se numesc if-uri imbricate).
Exemple de secvene scrise corect d.p.d.v. sintactic:
k=3;
if (1) cout<<da
k=3;
if (0);
if (!0) k++;
else cout<<nu;
if (!k);
else cout<<nu;
else k--;
else;
Exemplu de program ce exemplific folosirea unei instruciuni if n corpul altei instruciuni if.
Se citesc trei variabile reale x, y , z. S se calculeze:
x+y, z>0
e=
x*y, z=0
x-y, z<0
#include <iostream.h>
void main()
{
double x,y,z,e;
cout<<x=;cin>>x; cout<<y=;cin>>y; cout<<z=;cin>>z;
if (z>0) e=x+y;
else if (z= =0) e= x*y;
else e = x-y;
cout<<e;
}
19
Instruciunea SWITCH
permite selecia unei variante din mai multe posibile.
Forma:
switch (expresie)
{
case c1: secven instruciuni1; break;
case c2: secven instruciuni2; break;
............................................................
case cn: secven instruciunin; break;
[default: secven instruciunin+1];
}
k=2;
k=2;
switch ((k-1)*3))
switch(3<4)
{
case 4-1
: k=k+1;
case 1 : k++;
default:
case a
: k--;
default:
: cout<<10;
: cout<<sfarsit;
20
k=a;
k=a;
switch (k+1)
switch(k<4)
{
{
case d
: k=k+1;
case d<=9
: k++;
case 1
: k=k+2;
case 1>=4
: k=k+2;
default:
: cout<<1;
default
:;
k=2;
switch ((k/2.1))
switch((k<4)+3.5)
{
case sqrt(k)
: k=k+1;
: k++;
case 2
: k=k+2;
: k=k+2;
default:
: k=k+3;
default: k=k+3;
Exemplu de program care citete un numr natural i precizeaz dac el reprezint codul ASCII al
unui caracter alfanumeric (liter mic, liter mare, cifr), n acest caz afindu-se i caracterul:
#include <iostream.h>
void main()
{
int n, a=0;
cin>>n;
if ((n>=97)&&(n<=122)) a=1;
else if ((n>=65)&&(n<=90)) a=2;
else if ((n>=48)&&(n<=57)) a=3;
swich(a)
{
case 1 : cout<<n<<e codul ASCII al literei mici<< (char) n;
case 2 : cout<<n<<e codul ASCII al literei mari<< (char) n;
case 3 : cout<<n<<e codul ASCII al cifrei<< (char) n;
default : cout<<n<< nu e codul ASCII al unui caracter alfanumeric;
}
}
21
Instruciunea WHILE
instruciune ciclic ce definete o structur repetitiv condiionat anterior.
Forma: while(expresie)
instruciune;
Funcionare: se evalueaz expresie; Dac valoarea obinut este diferit de 0, se execut instruciune
i se revine la pasul anterior, iar dac se obine o valoare egal cu 0, se trece la urmtoarea
instruciune din cadrul programului.
Obs: 1) Instruciunea care depinde de expresia de la while poate s nu se execute niciodat. Aceasta
se ntmpl atunci cnd dup evaluarea expresiei se obine valoarea 0.
Ex:
a=1; b=a+1;
while(a>=2)
{
a+=b;
b++;
}
2) Instruciunea care depinde de expresia de la while poate s se execute de o infinitate de ori.
Aceasta se ntmpl atunci cnd expresia are valoarea diferit de 0 ntotdeauna.
Ex:
a=1; b=b+1;
while(a<=2)
{
b+=a;
b++;
}
3) Dac dup expresie se pune ;, avem dou situaii :
- dac condiia este adevrat, se intr n ciclu infinit
- dac condiia este fals se execut urmtoarea instruciune din program
Ex:
a=1; b=b+1;
while(a<=2);
ciclu infinit
{
a--;
b++;
}
22
Ex:
a=1; b=b+1;
se execut urmtoarea
instruciune din program
while(a>=2);
{
a--;
b++;
}
#include <iostream.h>
#include <iostream.h>
#include <iostream.h>
main()
main()
main()
int n, i, s;
int n, i, s;
int n, i, s;
cout<<n=; cin>>n;
cout<<n=; cin>>n;
cout<<n=; cin>>n;
s=0; i=1;
s=i=0;
s=0; i=1;
while(i<=n)
while(i<=n)
while(s+=i++,i<=n);
s+=++i;
s+=i;
i++;
}
Obs: datorit multiplelor posibiliti
de lucru cu expresii, s-au folosit mai
multe expresii separate prin virgul.
Valoarea produs de expresie este
dat de ultima din irul lor.
}
cout<<varianta 1<< <<s;
}
2) secvenele urmtoare calculeaz nr. obinut prin inversarea cifrelor unui nr. n citit de la tastatur.
#include <iostream.h>
#include <iostream.h>
main()
main()
while(n)
cout<<numarul inversat<<ninv;
ninv=ninv*10 + n%10; n= n/10;
}
Obs: datorit multiplelor posibiliti
de lucru cu expresii, s-au folosit mai
multe expresii separate prin virgul.
Valoarea produs de expresie este
dat de ultima din irul lor.
}
cout<<numarul inversat<<ninv;
}
23
Instruciunea DO WHILE
instruciune ciclic ce definete o structur repetitiv condiionat posterior.
Forma: do
instruciune
while(expresie);
Funcionare: Se execut instruciunea subordonat. Apoi se evalueaz expresie; Dac valoarea
obinut este diferit de 0, se revine la pasul anterior i se execut instruciune, iar dac se obine o
valoare egal cu 0, se trece la urmtoarea instruciune din cadrul programului.
Exemplu de secvene echivalente scrise corect:
1) secvenele urmtoare calculeaz suma primelor n numere naturale, n se citete de la tastatur.
#include <iostream.h>
#include <iostream.h>
main()
main()
cout<<n=; cin>>n;
cout<<n=; cin>>n;
do
do
{
s+=i++;
s=s+i; i=i+1;
while(i<=n);
cout<<varianta 2<< <<s;
while(i<=n);
Obs:
j=5;
cout<<i<< ;
for(int i=5,j++;i<=10;i++,j++)
cout<<i<< <<j;
for(int i=1;i<=10;i++);
cout<<i<< ;
Instruciunea BREAK
produce ieirea forat din cel mai interior ciclu while, do-while, for, care o conine sau din
instruciunea switch.
Forma: break;
Ex: Programele urmtoare determin, folosind instruciunile for, respectiv while, primul numr
divizibil cu 11:
#include <iostream.h>
#include <iostream.h>
main()
main()
int m, i;
while (!m)
if (i%11= =0) {
if (i%11= =0) {
m=i;
m=i;
break;
break;
}
i++;
}
cout<<m;
}
}
cout<<m;
}
25
Instruciunea CONTINUE
produce saltul la testul de continuare n cazul instruciunilor while i do-while sau saltul la expresia
de incrementare, n cazul instruciunii for.
Forma: continue;
Ex: 1) Programul urmtor realizeaz descompunerea n factori primi ai unui numr natural n citit de
la tastatur, sub forma factor
exponent:
#include <iostream.h>
main()
{
int n, d, exp;
cout<<n=; cin>>n;
for (d = 2; ; d++)
{
if (n % d != 0) continue;
exp = 0;
do
if (n = = 1) break;
/* am terminat */
}
}
2) Programul urmtor afieaz, folosind instruciunea for, elementele impare dintre 1 i 100:
#include <iostream.h>
main()
{
int i;
for(i=1;i<=100;i++)
{
if (i%2= =0) continue;
cout<<i<< ;
}
}
26
Instruciunea GOTO
produce saltul la instruciunea prefixat de eticheta al crei nume se afl dup cuvntul cheie go to.
Forma: goto eticheta;
unde eticheta este un identificator al instruciunii cu care se continu execuia programului. Ea are
forma:
eticheta: instruciune;
Obs: 1) instruciunea goto se utilizeaz rar deoarece ncalc principiile programrii structurate.
2) etichetele sunt locale n corpul funciei n care sunt definite i astfel o instruciune goto
poate realiza un salt numai la o instruciune din corpul aceleiai funcii n care ea este utilizat. Deci
o instruciune goto nu poate face salt din corpul unei funcii la o instruciune din corpul altei funcii.
3) n absena instruciunii goto, se poate realiza acelai lucru folosind un indicator (semnal) i
efectund o serie de teste asupra lui.
Ex: 1)
...
for (...){
la 100:
for (...) {
.....
for (...){
a=1;
...
eticheta: a++;
...
......
}
...
}
...
}
...
stop: /* codul special pentru tratarea situatiei*/
...
Funcii matematice
27
(codomeniul) rezultatul
ntors
numele
funciei
Funciile sunt apelate cu un numr de parametrii efectivi. Parametrii de apel ai unei funcii i
tipul ei (natura rezultatului ntors) sunt coninui de prototipul funciei respective.
Prototipurile funciilor din acelai domeniu se gsesc grupate ntr-un fiier header. Astfel,
pentru folosirea funciilor matematice, trebuie inclus n fiierul surs al programului fiierul math.h.
Funcia abs - ntoarce |x| (modulul lui x).
forma: int abs(int x);
Funcia fabs - ntoarce |x| (modulul lui x), unde x este un numr real.
forma: double fabs(double x);
Funcia labs - ntoarce |x| (modulul lui x), unde x este un ntreg lung
forma: long int labs(long int x);
Funcia sin calculeaz valoarea funciei sin(x): R
[-1,1]
[-1,1]
[0, ]
[0, ]
[- /2, /2 ]
[-, ]
= arctg(y/x).
R, sh(x)=
e x e x
2
R, ch(x)=
ex ex
2
R, th(x)=
R* +
e x e x
e x ex
Tabloul
pot fi
unidimensionale
multidimensionale
ocup o zon contigu de memorie, primul element se afl la adresa mai mic
Obs: Deoarece n limbajul C nu exist un tip predefinit string (ir de caractere) ca n alte limbaje de
programare, eventuale variabile de acest tip vor fi tablouri de caractere.
Tablouri unidimensionale
Se declar dup structura:
tip_baza nume_tablou[dimensiune];
nume_tablou[indice],
tipul datelor
numele
din tablou
expresie ntreag cu
valori [0, dimensiune -1]
for(i=0;i<10;i++)
cout<<v[i]<< ;
}
31
Obs: la declarare vectorii pot fi iniializai. Valorile cu care se iniializeaz sunt valori ale tipului de
baz tip_baza i sunt trecute ntre acolade i separate prin virgule.
Ex:1)
int v[4]={1,2,3,4};
float u[3]={4e-3, 3.1, -5};
2)
#include <iostream.h>
main( )
{
int i, v[4]={2,4,6,8};
for(i=0;i<=3;i++)
cout<<v[i]<< ;
}
Tablouri multidimensionale
Tablourile cele mai des utilizate sunt tablourile cu un indice i cele cu doi indici. Se pot defini ns
i tablouri cu mai mult de doi indici.
Forma general de declarare a unui tablou cu n indici este:
tip_baza nume_tablou[dimensiune1] [dimensiune2 ]....[dimensiunen];
tipul datelor
din tablou
numele
tabloului
fie tabloul: int t[2][3][4]. Acest tablou tridimensional se memoreaz ca un vector cu dou
Ex:
componente, fiecare dintre acestea fiind un tablou cu dou dimensiuni. Fiecare astfel de tablou e
memorat ca un vector cu 3 componente, fiecare dintre ele fiind un vector cu 4 componente de tip int.
1
1
1
2
3
3
3
1
3
2
3
3
3
int a[2][3]={1,2,3,4,5,6};
int a[2][3]={{1,2,3},{4,5,6}};
2)
a[0][0]=1;
a[0][1]=2;
a[0][2]=3;
a[1][0]=4;
a[1][1]=5;
a[1][2]=6;
a[0][0]=1;
a[0][1]=2;
a[0][2]=3;
a[1][0]=4;
a[1][1]=5;
a[1][2]=6;
#include <iostream.h>
main( )
{
int a[4][2]={{1,2},{3,4},{5,6},{7,8}};
for(int i=0;i<=3;i++)
{
for(int j=0;j<=1;j++)
cout<<a[i][j]<< ;
cout<<endl;
}
}
a[0][0]=1;
a[0][1]=2;
a[0][2]=3;
a[1][0]=4;
a[1][1]=5;
a[1][2]=6;
Tablouri bidimensionale(matrice)
Limbajul C++ conine
Ex:
cu m linii i n coloane:
cu m linii i n coloane:
for(i=1;i<=m;i++)
for(i=1;i<=m;i++)
for( j=1;j<=n;j++)
for( j=1;j<=n;j++)
cout<<a[i][j]<< ;
cout<<a[<<i<<,<<j<<]= ;
cout<<endl;
cin>>a[i][j];
};
};
Secvena de parcurgere deasupra diagonalei
for(i=1;i<=n-1;i++)
for(i=2;i<=n;i++)
for(j=i+1;j<=n;j++)
for(j=1;j<=i-1;j++)
(a[i][j]..)...
(a[i][j]..)...
for(i=1;i<=n-1;i++)
for(i=2;i<=n;i++)
for(j=1;j<=n-i;j++)
for(j=n+2-i;j<=n;j++)
(a[i][j]..)...
(a[i][j]..)...
Subprograme
Definiie: Un subprogram este o secven de instruciuni care rezolv o anumit sarcin i care
poate fi descris separat. Ea poate fi repetat n cadrul unui program de un numr de ori i executat
numai n funcie de anumite condiii.
Subprogramele n limbajul C++ se numesc funcii.
Un program scris n limbajul C/C++ este un ansamblu de funcii, fiecare dintre acestea efectund o
activitate bine definit.
Obs: funcia main( ) este tot un subprogram i se execut prima.
Avantaje:
Clasificare:
create de utilizator
predefinite(Ex: pow, log, abs, etc)
Funciile comunic prin argumente: ele primesc ca parametri (argumente) datele de intrare,
efectueaz prelucrrile descrise n corpul funciei asupra acestora i pot returna o valoare (rezultatul,
datele de ieire).
n limbajul C/C++ se utilizeaz definiii i declaraii de funcii.
Definiia funciei (cuprinde antetul i corpul funciei):
antetul funciei
corpul funciei
instruciuni
seciune declarativ
seciune executabil
[return[expresie];]
}
35
tip este tipul funciei. Dac funcia nu ntoarce nici o valoare, n locul su se specific void.
Dac tip void, deci funcia ntoarce o valoare prin numele su, corpul funciei trebuie s
conin obligatoriu instruciunea return expresie; expresia de la return este chiar valoarea
returnat de funcie i trebuie s aib acelai tip cu tipul returnat de funcie.
nume este un identificator (numele funciei).
lista parametrii formali enumerare ce conine tipul i numele fiecrui parametru cu care funcia
lucreaz formal; ei nu reprezint valori concrete; se concretizeaz la execuie, prin apelurile funciei.
declaraii
variabile locale
instruciuni
Obs: 1) n C++ nu se pot defini funcii imbricate, adic definirea unei funcii n corpul altei funcii.
2) De obicei, orice funcie se apeleaz dup ce a fost definit. Dac definirea se face dup
apel, naintea apelului trebuie s existe declaraia funciei (prototipul funciei).
Declaraia funciei (cuprinde antetul funciei) i informeaz compilatorul asupra tipului, numelui
funciei i a listei parametrilor formali. Declaraiile funciilor se numesc prototipuri i sunt
constituite din antetul funciei:
tip identificator (lista parametrii formali);
Apelul funciei: se realizeaz printr-o instruciune de apel de forma:
identificator (lista parametrii efectivi);
La apel, se atribuie parametrilor formali valorile parametrilor efectivi, dup care se execut
instruciunile din corpul funciei. La revenirea din funcie, controlul este redat funciei apelante, i
execuia continu cu instruciunea urmtoare instruciunii de apel, din funcia apelant.
36
Parametrii declarai n antetul unei funcii sunt numii formali, pentru a sublinia faptul c ei
nu reprezint valori concrete, ci numai in locul acestora pentru a putea exprima procesul de calcul
realizat prin funcie. Ei se concretizeaz la execuie prin apelurile funciei.
Parametrii folosii la apelul unei funcii sunt parametri reali, efectivi, concrei, iar valorile
lor vor fi atribuite parametrilor formali, la execuie.
Utilizarea parametrilor formali la implementarea funciilor i atribuirea de valori concrete
pentru ei, la execuie, reprezint un prim nivel de abstractizare n programare - abstractizare prin
parametrii. Acest mod de programare se numete programare procedural .
Obs:
1) n cazul n care funcia returneaz o valoare, apelul funciei poate constitui un operand
segmentul corespunztor
variabilelor globale
37
3) Vizibilitatea
liniile textului surs
din care variabila
poate fi accesat
4) Durata de via
timpul
n
care
variabila respectiv
are alocat spaiu n
memoria intern
38
Variabile
globale
locale
# include<iostream.h>
int nr =10;
void f1 (void)
{
cout<<nr=<<nr;
nr*=2;
}
void f2 (void)
{
cout<<nr=<<nr;
nr+=2;
}
void main (void)
{
cout<<nr=<<nr;
nr ++;
f1();
f2 ( );
cout<<nr=<<nr;
}
#include<iostream.h>
void f ( )
{
int a=3,b=a;
cout<<a<< <<b<<endl;
a++;b++;
}
main ( )
f( );
//3 3
f( );
//3 3
}
39
# include<iostream.h>
void f ( )
{
int a=1,b=a;
cout<<a<< <<b<<endl;
{
int a=2,b=a;
cout<<a<< <<b<<endl;
{
int a=3,b=a;
cout<<a<< <<b<<endl;
}
cout<<a<< <<b<<endl;
}
cout<<a<< <<b<<endl;
}
se va afia:
1 1
main( )
2 2
{ f( ); }
3 3
2 2
1 1
Transmiterea parametrilor
prin valoare:
se pot modifica n corpul funciei, dar dup
terminarea apelului funciei au aceeai
valoare pe care au avut-o nainte de apel.
prin referin:
sunt precedai de &;
se pot modifica n corpul funciei, dar dup
terminarea apelului funciei au valoarea pe
care au primit-o n timpul apelului funciei
#include<iostream.h>
int a, b;
void interschimb(int x, int y)
{
int aux = x;
x=y;
y=aux;
}
void main( )
{
cin>>a>>b;
interschimb (a,b);
cout<<a<<b; //a si b nu vor fi permutati
}
#include<iostream.h>
int a, b;
void interschimb(int& x, int& y)
{
int aux = x;
x=y;
y=aux;
}
void main( )
{
cin>>a>>b;
interschimb (a,b);
cout<<a<<b; //a si b vor fi permutati
}
Obs: La transmiterea parametrilor prin valoare, ca parametrii efectivi pot apare expresii sau nume
de variabile.
La transmiterea parametrilor prin referin, ca parametri efectivi nu pot apare expresii, ci
doar nume de variabile.
Transmiterea prin valoare a tablourilor permite ca funciile s ntoarc noile valori ale
acestora (care au fost atribuite n funcii) deoarece numele tabloului este un pointer ctre
componentele lui. Prin valoare se transmite acest nume i cu ajutorul acestuia accesm
componentele tabloului.
40
Exemplu: n programul urmtor, funcia vector iniializeaz vectorul transmis ca parametru, iar n
funcia main( ) se va afia rezultatul.
#include<iostream.h>
void vector(int a[10])
{
for (int i=0;i<10;i++) a[i]=i;
}
main( )
{
int x[10];
vector(x);
for (int i=0;i<10;i++)cout<<x[i]<< ;
}
Exemplu: Ce apare afiat pe ecran n urma execuiei programului urmtor?
#include<iostream.h>
int a; float b;
int f(float & x)
{
if(x<0) x=-x;
x*=10;
return (int)x%10;
}
void main()
{
a=12; b=3.4567;
a=a+f(b);
cout<<a+f(b)+f(b);
void main( )
{
clrscr( );
int x,y,cm;
cout<<"x="; cin>>x;
cout<<"y="; cin>>y;
cmmdc(x,y,cm);
cout<<"cmmdc="<<cm;
getch( );
}
41
#include <iostream.h>
#include <conio.h>
int v[10], n;
int cmmdc (int a,int b)
{
while (a!=b)
{
if (a>b) a=a-b;
else b=b-a;
return a;
}
void main( )
{
clrscr( );
int i, cm;
cout<<"n="; cin>>n;
for (i=0;i<n;i++)cin>>v[i];
cm = cmmdc(v[0],v[1]);
for (i=2;i<n;i++) cm = cmmdc(cm,v[i]);
cout<<cm;
getch( );
}
main( )
{
clrscr( );
int v[10], n;
cout<<"n="; cin>>n;
citire (v,n);
sortare (v,n);
scriere(v,n);
getch( );
}
Obs:
Cele trei funcii ( citire, sortare,
scriere) au tipul void, adic nu au
valoare de retur.
Ele
returneaz
rezultatul prin
intermediul parametrilor.
42
Aplicaii propuse:
1) Sa se scrie o funcie care simplific o fracie i o alta care calculeaz suma a dou fracii. S
se calculeze suma a n fracii, afind rezultatul sub form de fracie ireductibil.
2) Dat fiind un numr natural n, sa se afieze:
a.
cel mai apropiat numr care este ptrat perfect. (Ex: pentru n=13 se va afia 16)
b.
cel mai apropiat numr care este cub perfect. (Ex: pentru n=25, se va afia 27)
c.
cel mai apropiat numr care este numr prim. Dac exist dou astfel de numere, se
vor afia amndou. (Ex: pentru n=27, se va afia 29, pentru n=15 se vor afia 13 si 17)
3) Operaii cu numere complexe (suma, produsul, inversul).
4) Fie o matrice avnd mxn componente ntregi. S se afieze acele elemente ale matricii
(valoarea i coordonatele) pentru care suma elementelor pe linia pe care se gsesc este egal
cu suma elementelor pe coloana pe care se gsesc.
5) Fie irul 1,2,3,4. O permutare circular la dreapta este:2,3,4,1. S se permute circular un ir
de k ori i s se afiseze de fiecare dat.
6) S se afieze elementele a dintr-o matrice (minime pe linie i maxime pe coloana pe care se
gsesc) i poziia lor.
43
Operaiile de intrare/ieire sunt operaii care permit schimbul de date ntre un program i un
dispozitiv periferic.
Funciile din biblioteca compilatorului C/C++ utilizate mai frecvent pentru operaiile de I/E
sunt: -
la care se mai adaug macrourile getchar pentru intrare i putchar pentru ieire.
Funciile getch i getche au prototipuri n <conio.h> i sunt folosite pentru preluarea unui
singur caracter din codul ASCII, de la tastatur. Ambele sunt funcii fr parametri, iar getch() preia
caracterul fr ecou (fr tiprirea lui pe ecran), n timp ce getche() preia caracterul cu ecou; ambele
funcii returneaz caracterul citit de la tastatur. Caracterele citite cu aceste funcii sunt preluate
imediat dup apsarea tastei corespunztoare caracterului respectiv.
Apelul funciilor getch i getche conduce la ateptarea apsrii unei taste. Apelul acestor
funcii se face sub forma:
getch( ); sau getche( );
Obs: Funcia getch() este frecvent folosit n programele C pentru a bloca fereastra utilizator pn la
apsarea unei taste.
Funcia putch afieaz pe ecranul terminalului un caracter corespunztor codului ASCII
transmis ca parametru. Caracterele imprimabile au codul ASCII n intervalul [32,126]. Pentru coduri
n afara acestui interval se afieaz diferite imagini. Funcia returneaz valoarea parametrului de la
apel.
Prototipurile acestor trei funcii se gsesc n fiierul conio.h i sunt:
int getch(void);
int getche(void);
Ex 1:
#include <conio.h>
main() /* citete fr ecou un caracter imprimabil ASCII, l afieaz i ateapt acionarea unei taste;
programul se termin dup acionarea unei taste*/
{
putch(getch());
getch();
}
44
Ex 2:
#include <conio.h>
main() /* citete fr ecou un caracter imprimabil ASCII, l afieaz, trece cursorul pe linia
urmtoare i ateapt acionarea unei taste; programul se termin dup acionarea unei taste*/
{
putch(getch());
putch(\n); /* se apeleaz funcia putch cu codul caracterului newline */
getch();
}
Funcia gets are prototip n stdio.h i are ca efect citirea cu ecou de la terminalul standard a
unui ir de caractere ale codului ASCII, la adresa specificat drept parametru al funciei. Din funcie
se revine la:
-
Funcia puts are prototip n stdio.h i are ca efect afiarea la terminalul standard a unui ir de
caractere corespunznd codului ASCII de la adresa transmis ca parametru. Caracterul \0 este
interpretat ca \n. Funcia returneaz codul ultimului caracter afiat sau 1 n caz de eroare.
Ex 3:
#include <stdio.h>
void main() /* se tipresc la ieirea standard iruri de caractere preluate de la tastatur. Terminarea
introducerii datelor se face tastnd caracterul EOF prin apsarea simultan a tastelor
Ctrl i Z. */
{
char rand[100];
while(gets(rand)!=NULL)
puts(rand);
printf("\n");
}
45
Obs: n programul de mai sus, NULL este un nume penru o constant simbolic folosit adesea n
locul ntregului zero. n acest exemplu, constanta NULL poate fi nlocuit cu '\0'.
Funcia scanf are rolul de a introduce date tastate de la terminalul standard sub controlul unor
formate. Datele introduse sunt convertite din formatele lor externe n formate interne i sunt pstrate
la adresele specificate la apel. Datele introduse se termin cu apsarea tastei ENTER.
caracterul %;
opional caracterul *, care indic faptul c data prezent la intrare nu se atribuie nici unei
variabile;
Cmpul controlat de format ncepe cu primul caracter curent care nu este alb i se termin, dup caz:
a) la caracterul dup care urmeaz un caracter alb;
b) la caracterul care nu corespunde tipului de conversie;
c) la caracterul la care se ajunge la lungimea maxim a cmpului.
Datele se citesc efectiv dup apsarea tastei ENTER. Adresa unei variabile se specific prin
&nume_variabil.
46
Litera
char
ir de caractere
ntreg zecimal
ntreg octal
x, X
ntreg hexazecimal
unsigned
float
long
lu
unsigned long
lf/ Lf
double/long double
Funcia printf are prototip n stdio.h i este folosit pentru afiarea unor date pe ecranul
terminalului standard sub controlul unor formate. Datele sunt convertite din format intern n
formatul extern specificat.
Apelul funciei printf se face printr-o construcie de forma:
printf("control",arg1,arg2,.....,argn);
unde arg1, arg2,...,argn sunt variabile sau expresii ale cror valori se tipresc n conformitate cu
specificatorii de format prezeni n parametrul "control" al funciei.
Parametrul control este un ir de caractere care definete textele i formatele datelor care se
scriu. n mod concret, acest ir precizeaz transformrile (conversiile) datelor care se afieaz pe
monitor i se reprezint o succesiune de caractere, inclusiv secvene escape i specificatori de
format.
Numrul specificatorilor din parametrul control trebuie s fie egal cu numrul argumentelor
funciei, adic cu numrul variabilelor i/sau expresiilor ale cror valori se tipresc i trebuie de
asemenea s corespund tipului acestora.
Un specificator de format conine:
-
caracterul %;
opional caracterul minus -, care specific ncadrarea datei n stnga cmpului (datele
tiprite se ncadreaz ntr-un cmp - un anumit numr de caractere ; implicit ncadrarea se
face n dreapta);
47
opional un punct urmat de un numr zecimal, care specific precizia de afiare a datei,
adic numrul de cifre zecimale sau numrul de caractere care se scriu dac data este un
ir de caractere;
...
char c;
c ='a';
...
a
se tiprete valoarea lui c (caracterul a)
ntr-un cmp de 4 caractere, alinierea
fcndu-se la dreapta cmpului
printf("%c",c);
printf("\n%4c",c);
...
char nume [20]="Ionescu";
Ionescu
...
Georg
printf("\n%15.5", "Georgescu");
Litera d se folosete pentru afiarea valorilor variabilelor de tip ntreg, n sistemul de numeraie
zecimal.
48
Ex 6:
...
int a;
a = 46;
...
printf("%d",a);
46
printf("\n%8d",a);
46
printf("\n%-8d",a);
46
printf("\n%05d",a);
00046
printf("\n*%-6d*",a);
*46
printf("\n%d",a/7);
printf("\n%10.3f",a/7.0);
6.571
Litera o se folosete pentru afiarea valorilor variabilelor de tip ntreg, n sistemul de numeraie
octal.
Ex 7:
.
59 = 73 i 175 = 257
10
int a = 59;
59
..
73
printf("%d",a);
10
257
printf("\n%o",a);
printf("\n%9o",175);
Literele x i X se folosesc pentru convertirea i afiarea valorilor unor variabile de tip ntreg n
sistemul de numeraie hexazecimal. Dac se folosete litera x n specificatorul de format, atunci
pentru afiarea numrului hexazecimal vor fi folosite cifrele 0,1,...,9,a,b,c,d,e,f, iar dac se folosete
litera X, atunci pentru afiarea numrului hexazecimal se vor folosi cifrele 0,1,...,9,A,B,C,D,E,F, cu
observaia c n zecimal, A=10, B=11, C=12, D=13, E=14 i F=15.
Ex 8:
printf("%x",33);
21
printf("\n%X",33);
21
printf("\n%x",74);
4a
printf("\n%X",74);
4A
33 = 21 i 74 = 4a
10
printf("%6x",74);
4a
49
16
10
16
Ex 8:
..
int a = 1234, b = 345;
printf("\nzecimal: %-10d%10Xhexa",a,a);
1234
4D2hexa
printf("\n%-6x",2345);
929
printf("\n%-9s%-9s%-9s\n","zecimal","octal","hexa");
printf("%-9d%-9o%-9X",b,b,b);
345
531
159
Litera f este folosit pentru conversia la tipul float i afiarea valorilor cu 6 cifre zecimale.
Ex 9:
..
float a = 1.234
1.234000
1.234
printf("%f",a);
printf("\n%-10.3f",a);
Ex 10:
#include <stdio.h>
#include <conio.h>
main( )
{
int a;
float b,c;
printf(\nIntroducei o valoare ntreag a=);
scanf(%5d,&a);
printf(\nIntroducei o valoare real b=);
scanf(%5f,&b);
c=a+b;
printf(\nValoarea c=a+b este: %6.3f\n,c);
getch();
}
50
RECURSIVITATE
Un obiect este recursiv dac este definit prin el nsui.
O funcie este recursiv dac ea se autoapeleaz.
Recursivitatea poate fi:
-
direct
indirect
- cnd funcia conine un apel al altei funcii, care la rndul su o apeleaz pe prima.
La fiecare apel al unei funcii, parametrii i variabilele sale se aloc pe stiv ntr-o zon
independent. Acest lucru se ntmpl la fiecare apel sau autoapel al funciei. Revenirea dintr-o
funcie se face n punctul urmtor celui din care s-a fcut apelul. Adresa de revenire se pstreaz
tot n stiv. La revenire, stiva se reface la starea ei dinaintea apelului, deci variabilele automatice i
parametrii vor reveni la valorile lor dinaintea reapelului respectiv.
O problem important este stoparea autoapelului. De aceea trebuie s existe o condiie de
terminare, fr de care un apel recursiv ar conduce la o bucl infinit. n aplicaiile practice este
necesar nu numai ca adncimea recursivitii sa fie finit, ci s fie relativ mic, deoarece fiecare apel
recursiv necesit alocarea pe stiv a zonei de memorie pentru:
-
parametrii funciei;
Ca urmare, stiva poate crete foarte mult i repede se ajunge la ocuparea ntregului spaiu de
memorie alocat ei.
Un exemplu clasic de proces recursiv este calculul factorialului definit astfel:
1.Factorial
n! = 1*2*3*.*n => n! = (n-1)!*n
int n;
int fact(int n)
void main()
{cin>>n;
if(n= =0)return 1;
cout<<fact(n);
}
51
pa(n-1)+r, n>=1
a0 ,n=0
int n, a0, r;
int pa(int n)
{if(n= =0)return a0;
else return pa(n-1)+r;
}
void main()
{
cin>>n>>a0>>r;
cout<<pa(n);
}
int n,b0,q;
int pg(int n)
{
if(n= =0)return b0;
else retunr pg(n-1)*q;
}
void main()
{
cin>>n>>b0>>q;
cout<<pg(n);
}
52
iterativ:
a=1;b=1;i=3;
cin>>n;
while(i<=n){c=a+b;
a=b;
b=c;
i++;
}
cout<<c;
recursiv:
definim functia: fib(n) =
1, n=1
1, n=2
fib(n-1) +fib(n-2), n>=3
int n;
int fib(int n)
{
if ( n= =1)return 1;
else if ( n= =2)return 1;
else return fib(n-1) + fib(n-2);
};
void main()
{
cin>>n;
cout<<fib(n);
}
53
Cnk =
n!
k !( n- k )!
int n,k,c;
int fact(int n)
{
if(n= =0)return 1;
else return fact(n-1)*n;
}
void main()
{
cin>>n>>k;
c = fact(n)/(fact(k)*fact(n-k));
cout<<c;
}
b)
int n,k;
int cmb(int n,int k)
{
if(k= =0)return 1;
else if(k= =n)return 1;
else return (cmb(n-1,k-1)+cmb(n-1,k));
}
void main()
{cin>>n>>k;
cout<<cmb(n,k);
}
54
a) cmmdc(a,b) =
b) cmmdc(a,b) =
6. Sa se afle:
55
1, daca n = 0
n%10 * prod(n/10), altfel
int n;
int prod(int n)
{
if ( n= =0)return 1;
else return n%10 *prod(n/10);
};
void main()
{
cin>>n;
cout<<prod(n);
}
0, daca n = 0
1+nr(n/10), altfel
int n;
int nr(int n)
{
if ( n= =0)return 0;
else return 1+nr(n/10);
};
void main()
{
cin>>n;
cout<<nr(n);
}
n+1, m=0
ack(m-1,1) , n=0
ack(m-1, ack(m,n-1)) , altfel
int m, n;
int ack(int m, int n)
{
if ( m= =0) return n+1;
else if (n = =0) return ack(m-1,1);
else return ack(m-1, ack(m,n-1));
};
void main()
{
cin>>m>>n;
cout<<ack(m,n);
}
8. Sa se calculeze functia lui Manna-Pruelli ( cu x citit):
57
ls=6
n=6
a) S = 1 +2 + 3 + . +n
definim S(n) =
0, daca n = 0
S(n -1) + n, daca n > 0
int n;
int S(int n)
{
if ( n= =0)return 0;
else return S(n -1) + n;
};
void main()
{
cin>>n;
cout<<S(n);
}
0, daca n = 0
S(n -1) + 1/n, daca n > 0
int n;
void main()
float S(int n)
cin>>n;
if ( n= =0)return 0;
cout<<S(n);
};
int n;
int S(int n)
{
if ( n= =1)return 0;
else return S(n -1) + (n-1)*n;
};
void main()
{
cin>>n;
cout<<S(n);
}
int n;
int S(int n)
{
if ( n= =0)return 0;
else return S(n -1) + (float) n/((n+1)*(n+2));
};
void main()
{
cin>>n;
cout<<S(n);
}
60