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)
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++ :
Programul este corect, dei nu execut nimic.
void main() Pornind de la el, scriem orice program,
{ adugnd instruciuni ntre cele dou acolade
(corpul funciei). Cele dou paranteze rotunde
} () se ataeaz oricrei funcii. ntre ele se scriu
opional anumii parametrii.
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 ( ) {
}
2
2. Identificatori i cuvinte cheie (rezervate) o succesiune de litere, cifre sau caracterul
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 Contraexemplu: a#b, 1ab, xy&, -plus
3. Separatori i comentarii
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
4
Tipuri de date
Orice variabil, nainte de a fi utilizat, trebuie declarat prin precizarea tipului ei.
tip de date o mulime de valori pe care sunt definite anumite operaii.
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
5
2) n urma execuiei urmtorului program:
#include <iostream.h>
void main()
{
int a; char b;
a = 20; b = n;
cout<<b<<a+b ;
}
se va afia n i numrul 130 deoarece se adun codul caracterului n, care este 110, cu numrul.
3) n C++ nu exist tipul logic. n C++, o variabil care reine o valoare diferit de 0 este TRUE
(adevarat), iar una care reine valoarea 0 este FALSE (fals).
4) n C++ este admis tipul void, cu semnificaia de nimic sau orice tip,n funcie de context.
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 ;
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:
2. Constante caracter:
Acestea se trec ntre dou caractere apostrof: a, A, 3 .O constant caracter are ca valoare codul
ASCII al caracterului pe care-l reprezint. Ea are tipul int.
De exemplu pentru a se memoreaz 97, iar pentru A se memoreaz 65.
O alt modalitate de declarare a constantelor caracter este sub form de secvene escape. O secven
escape ncepe cu caracterul backslash (\).
Fie, de exemplu, constanta caracter c care are codul 99(10) = 143(8) = 63(16) .
Aceasta poate fi scris echivalent : \143 sau \x63 . n cazul reprezentrii n baza 16 se folosete
precedat de caracterul x.
Ex:
Programul urmtor va tipri de 4 ori caracterul c :
#include <iostream.h>
void main()
{
char x1 = 99 , x2 = \143 , x3 = \x63, x4 = c ;
cout<<x1<<x2<<x3<<x4 ;
}
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 .
7
Obs: Dat fiind un numr ntreg (scris ntr-o baz oarecare b 1), 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.
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 se memoreaz sub form double
-144.5f se memoreaz sub form float
-144.5L se memoreaz sub form long double
8
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
Aceste constante rmn valabile pn la sfritul programului, pn la redefinirea lor sau pn la
ntlnirea directivei #undef.
Ex:
1) #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 ;
}
9
Expresii
expresie - format dintr-un operand sau mai muli, legai prin operatori.
La scrierea unei expresii se pot folosi operatori din aceeai clas sau din clase diferite. La evaluarea
expresiilor trebuie s se in seama de prioritile operatorilor care aparin diferitelor clase de
operatori, de asociativitatea operatorilor de aceeai prioritate (ordinea aplicarii operatorilor
consecutivi de aceeai prioritate) i de regula conversiilor implicite.
10
15 , virgula s d
Operatori aritmetici: (sunt n ordinea descresctoare a prioritii):
a. Unari: + , - (asociativitate dreapta -stnga);
b. Binari multiplicativi: *, /, % (asociativitate stnga - dreapta);
c. Binari aditivi: + , - (asociativitate stnga dreapta).
Obs:
1) Operatorul / acioneaz n mod diferit n funcie de operanzi:
a) dac ambii sunt de tip ntreg, rezultatul este ntreg i are semnificaia de mprire ntreag
b) dac cel puin unul din operanzi este de unul din tipurile reale, rezultatul este real, deci se
efectueaz mprirea obinuit.
2) Operatorul % (restul mpririi ntregi) acioneaz numai asupra operanzilor de tip ntreg.
Ex: Expresia 7%3 are ca valoare 1.
Expresia -7%3 are ca valoare -1. deoarece -7 = (-2)*3 + (-1)
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
2) Programul urmtor va tipri 97:
#include <iostream.h>
void main()
{
int a = 0; char b = a ;
cout << a+b;
}
Exerciii:
Realizai rularea urmtoarelor programe:
#include <iostream.h>
void main()
{
char c1, c2;
c1=a; c2 = c1 + 1;
cout<<c2;
}
#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
Operanzii pot fi constante, variabile, funcii.
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 dup aceasta a = ((1) + ((1))*2 = 4
a = (2<3) = = (2!=8) dup aceasta a = (1) = = (1) deci a = 1
a = 5= =6 dup aceasta a = 0 deoarece 5 este diferit de 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) rezultatul este 1 pentru c ambii operanzi sunt 0
(2-2) (0) rezultatul este 0 pentru c nici un operand nu este 0
!(1+3*3) rezultatul este 0 pentru c operandul este 0
!!3 rezultatul este 1
!(3>4) rezultatul este 1 pentru c operandul este 0
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
~ 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 =0
1 1 =1
Ex:
7 & 3 = 3 deoarece: 7 00000111 &
3 00000011
00000011 3
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 1
Operatorul de atribuire
- atriburi simple - sintaxa v = expresie
compuse - sintaxa: v = v1 = v2 = ..... = vn = expresie
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: declaraiile: expresia c = a = b + 3 , a = c + 2, b = b + 3 se evalueaz astfel:
int a = 5, b = 7; b + 3 = 10; a = 10 ; c = 10.0 ;
float c; a = 10 + 2 = 12;
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.
16
}
Operatori de incrementare i decrementare
incrementeaz (adun 1) i respectiv decrementeaz (scad 1) coninutul unei variabile. Operatorii
sunt: ++ pentru incrementare prefixat (n faa operandului): ++a
postfixat (dup operand): a++
-- pentru decrementare prefixat (n faa operandului): --a
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)
17
Operatorul de conversie explicit (cast) sau de forare a tipului
folosit, atunci cnd e nevoie, n cadrul unor expresii, pentru ca anumii operanzi s intre n calcul
convertii aa cum dorim i nu implicit.
Forma: (tip_conversie) operand
astfel, valoarea operandului se convertete spre tip_conversie .
Ex: float a; a = (float) 5; a = 5.000000
int b; b = (int) 5.35; b=5
int c; c = (int) (3.78 + 7); 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;
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:
{ Obs: dup execuia ultimei
int aux; instruciuni a instruciunii
compuse, variabila aux nu
aux = a; a = b; b = aux; mai este definit!
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).
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; // se poate scrie i if (!z)
else e = x-y;
19
cout<<e;
}
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];
}
Funcionare: se evalueaz expresia. Dac aceasta produce o valoare egal cu c i, se execut secven
instruciunii i se trece la instruciunea urmtoare instruciunii switch, altfel se execut secven
instruciunin+1.
n absena alternativei default, dac valoarea expresiei nu coincide cu valoarea nici uneia dintre
constantele c1, c2, , cn , instruciunea switch nu are nici un efect i se trece la execuia
instruciunii urmtoare.
k=2; k=2;
switch ((k-1)*3)) switch(3<4)
{ {
case 4-1 : k=k+1; case 1 : k++;
case (5-3)%2 : k=k+2; case (3<=5)&&(2>3) : k=k+2;
default: : cout<<sfarsit; case a : k--;
} default: : cout<<10;
}
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 :;
} }
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;
nc de la nceput condiia este
while(a>=2) fals i deci expresia avnd
valoarea 0, instruciunea nu se
{
execut niciodat.
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;
Condiia nu devine fals
while(a<=2)
niciodat i deci instruciunea
{ se execut de o infinitate de ori.
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;
ciclu infinit
while(a<=2);
{
a--;
b++;
22
}
Forma: do
instruciune
while(expresie);
Instruciunea FOR
instruciune ciclic ce definete structura repetitiv condiionat anterior, cu numr cunoscut de pai.
unde exp1, exp2, exp3 sunt expresii: exp1 iniializare, exp2 testare, exp3 reiniializare (incrementare)
for(int i=1;i<=10;i++); /* deoarece dupa for am pus ; in ciclu nu se va executa nici o*/
cout<<i<< ; /* instructiune, iar valoarea tiparita pentru i va fi 11 */
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=0, i=1; int m, i;
while (!m) for (i=1; ; i++)
{ if (i%11= =0) {
if (i%11= =0) { m=i;
m=i; break;
break; }
} cout<<m;
i++; }
25
}
cout<<m;
}
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++)
{ /* descompune n in factori primi */
if (n % d != 0) continue; /* nu se imparte, se trece la urmatorul posibil factor */
exp = 0;
do /* repeta de cate ori d este factor */
exp++;
while ((n /= d) % d = = 0);
cout<< d<< << exp; /* scrie factorul curent si exponentul respectiv*/
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;
26
cout<<i<< ;
}
}
Instruciunea GOTO
produce saltul la instruciunea prefixat de eticheta al crei nume se afl dup cuvntul cheie go to.
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.
27
Funcii matematice
n matematic definirea unei funcii presupune definirea domeniului de definiie, al
codomeniului i a legii de coresponden pentru funcia respectiv. n C++ o astfel de definiie se
realizeaz prin definirea prototipului funciei respective.
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 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);
Obs: aceast funcie este util n scrierea unui numr complex z = x+iy cu x, y R, sub form
trigonometric: z = (cos+isin), unde = x2 y 2 , tg = y/x = arctg(y/x).
e x ex
Funcia sinh calculeaz funcia sinus hiperbolic sh(x): R R, sh(x)=
2
e x e x
Funcia cosh calculeaz funcia cosinus hiperbolic ch(x): R R, ch(x)=
2
e x ex
Funcia tanh calculeaz funcia tangent hiperbolic tanh(x): R R, th(x)=
e x e x
Setarea generatorului de numere aleatoare ntr-un anumit punct se face cu funcia srand:
forma: void srand (unsigned n);
Apelul funciei srand cu valoarea 1 duce la reiniializarea generatorului.
Ex 1): Programul urmtor tiprete 10 numere aleatoare ntregi cuprinse ntre 0 i 99:
#include <iostream.h>
#include <stdlib.h>
main( )
{
int i;
randomize( );
for (i=0;i<10;i++) cout<<rand( ) % 100<< ;
}
Obs: Dac n program nlocuim randomize() cu srand(n), pentru valoarea fixat a lui n, la rulri
succesive ale programului, seria celor 10 numere va fi ntotdeauna aceeai.
Ex 2): Programul urmtor tiprete 10 numere aleatoare cuprinse ntre dou valori ntregi citite:
#include <iostream.h>
#include <stdlib.h>
main( )
{
int a,b,i;
cout<<a=; cin>>a; cout<<b=; cin>>b;
randomize( );
30
for (i=0;i<10;i++) cout<<rand( ) % (b-a)+a<< ;
}
Tablouri
Tabloul reprezint o colecie de variabile de acelai tip referite prin acelai nume.
pot fi unidimensionale
multidimensionale
la declarare trebuie precizate tipul datelor din tablou
numele tabloului
numrul de componente ale tabloului declarat
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: Selectarea unui element de tablou:
tip_baza nume_tablou[dimensiune]; nume_tablou[indice],
31
for(i=0;i<10;i++)
cout<<v[i]<< ;
}
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:
Obs: 1) Indicele din dreapta este cel care variaz primul iar cel din stnga ultimul pentru ca
elementele din list s ocupe, unul cte unul, poziiile componentelor din tablou.
2) Tablourile cu mai muli indici nu sunt eficiente la utilizare din cauza memoriei pe care o
necesit (i care se aloc odat cu declararea lor). Memoria ocupat de tablou este:
dimensiune1* dimensiune2*.... dimensiunen*sizeof(tip_baza).
3) Logica n care este memorat un tablou t cu n dimensiuni este urmtoarea:
32
tabloul n-dimensional se memoreaz ca un vector alctuit din dimensiune1
componente, fiecare dintre acestea fiind un tablou cu n-1 dimensiuni;
fiecare tablou (n-1)-dimensional se memoreaz ca un vector alctuit din dimensiune2
componente, fiecare dintre acestea fiind un tablou cu n-2 dimensiuni, etc.
Ex: fie tabloul: int t[2][3][4]. Acest tablou tridimensional se memoreaz ca un vector cu dou
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 2
1 2 3 1 2 3
1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
2) #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;
}
}
Obs: Un tablou poate fi definit ca o constant astfel:
const tip_baza nume_const[dimensiune1] [dimensiune2 ]....[dimensiunen]={c1,cn};
unde c1,cn constante de tipul tip_baza , cel mult attea cte elemente are tabloul, adic
dimensiune1*.... *dimensiunen
Ex: const int a[2][3]={1,2,3,4,5,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;
33
Dar dup aceast instruciune nu pot exista instruciuni de forma:
a[2][2]=10 (deci componentele nu-i pot modifica valoarea)
Tablouri bidimensionale(matrice)
Limbajul C++ conine tipuri standard (predefinite): ntregi, reale
definite de utilizator prin utilizarea declaraiei typedef:
typedef tip nume;
34
diagonala principal a matricei a diagonala secundar a matricei a
cu n linii i n coloane: a[i][i], i=1,...,n cu n linii i n coloane: a[i][n+1-i], i=1,...,n
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.
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).
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.
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.
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:
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
ntr-o expresie (apelul funciei intervine ntr-o expresie)
2) ntre parametrii formali i cei efectivi(actuali) trebuie s existe o bijecie care s pstreze
ordinea i tipul.
3) parametrii actuali trebuie s fie variabile declarate sau constante.
4) lista parametrilor formali este vid atunci cnd nu se face schimb de informaie cu restul
programului sau cnd acest schimb se face cu ajutorul variabilelor globale.
37
segmentul corespunztor codului executabil - conine biii corespunztori instruciunilor
programului i funciile de bibliotec ce sunt adugate programului.
1) Tipul variabilei
4)Durata de via static - are alocat spaiu n tot timpul execuiei programului
timpul n care variabila local - are alocat spaiu n timpul n care se execut instruciunile
respectiv are alocat
spaiu n memoria blocului respectiv
intern dinamic - alocarea i dezalocarea spaiului necesar variabilei respective
se face de ctre programator (prin operatori sau funcii speciale)
38
Variabile
globale locale
- Se declar n afara corpului oricrei funcii - Se declar n corpul funciilor: n orice
- Atribute: bloc (instruciune compus) a acestora
1) clasa de memorare: segmentul de date - Atribute:
2) vizibilitatea: pot fi utilizate de toate funciile 1) clasa de memorare: segmentul de stiv
care urmeaz n textul surs declaraiei 2) vizibilitatea: la nivelul blocului la care au
variabilei respective fost declarate
3) durata de via: static 3) durata de via: atta timp ct dureaz
execuia blocului respectiv
Exemplul urmtor folosete variabila cu numele Exemplul urmtor ilustreaz faptul c dup
nr. Fiind accesibil din oricare din 2 funcii fiecare apel, variabilele locale sunt dezactivate:
prezente n program, valoarea variabilei globale
nr este schimbat pe rnd din ambele funcii:
#include<iostream.h>
void f ( )
{
# include<iostream.h> int a=3,b=a;
int nr =10; cout<<a<< <<b<<endl;
void f1 (void) a++;b++;
{ }
cout<<nr=<<nr; main ( )
nr*=2; f( ); //3 3
} f( ); //3 3
void f2 (void) }
{
cout<<nr=<<nr;
nr+=2; Exemplul urmtor ilustreaz faptul c dome-
} niul de vizibilitate al unei variabile locale
void main (void) este blocul n care se gsete declaraia sa:
{
cout<<nr=<<nr; //10 # include<iostream.h>
nr ++; void f ( )
f1(); //11 {
f2 ( ); //22 int a=1,b=a;
cout<<nr=<<nr; //24 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;
}
main( ) se va afia: 1 1
{ f( ); } 2 2
3 3
2 2
39 1 1
Obs: 1) n blocuri diferite se pot declara variabile cu acelai nume.
2) Dac o variabil local are acelai nume cu o variabil global, atunci se va lua n
considerare declararea cea mai apropiat de locul utilizrii.
Transmiterea parametrilor
#include<iostream.h> #include<iostream.h>
int a, b; int a, b;
void interschimb(int x, int y) void interschimb(int& x, int& y)
{ {
int aux = x; int aux = x;
x=y; x=y;
y=aux; y=aux;
} }
void main( ) void main( )
{ {
cin>>a>>b; cin>>a>>b;
interschimb (a,b); interschimb (a,b);
cout<<a<<b; //a si b nu vor fi permutati 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]<< ;
}
41
Exemplu: Se citete un vector cu n componente numere ntregi. Se cere s se tipreasc c.m.m.d.c.
al valorilor reinute de vector.
Algoritmul de calcul:
1) Calculm c.m.m.d.c. pentru primele dou componente ale vctorului valoare ce va fi reinut
de variabila cm.
2) Apoi, pentru fiecare component i, cu i =2, ..., n-1 se va calcula c.m.m.d.c. ntre valoarea
reinut de cm i cea reinut de componenta i. c.m.m.d.c. va fi reinut din nou de cm.
43
Funcii de intrare/ieire standard
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: - pentru intrare: getch, getche, gets, scanf, sscanf ;
- pentru ieire: putch, puts, printf, sprintf.
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.
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:
- citirea caracterului \n (newline), caracter care este transformat n caracterul \0 (null). n
acest caz funcia returneaz adresa de nceput a zonei de memorie n care se pstreaz
caracterele;
- citirea sfritului de fiier (CTRL/Z), funcia returnnd valoarea zero.
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.
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
Literele care definesc tipul conversiei sunt:
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);
- opional un numr zecimal, care definete dimensiunea minim a cmpului n care se
afieaz data;
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;
una sau dou litere, care definesc tipul conversiei.
Litera d se folosete pentru afiarea valorilor variabilelor de tip ntreg, n sistemul de numeraie
zecimal.
Ex 6:
...
48
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); 6
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:
. 5910 = 738 i 17510 = 2578
int a = 59; 59
.. 73
printf("%d",a); 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:
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();
}
RECURSIVITATE
50
Un obiect este recursiv dac este definit prin el nsui.
O funcie este recursiv dac ea se autoapeleaz.
Recursivitatea poate fi:
- direct - cnd funcia conine un apel direct la ea nsi;
- 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;
- variabilele automatice locale funciei;
- adresa de return (revenire n punctul de apel).
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);
else return fact(n-1)*n; }
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);
}
3. Sirul lui Fibonacci : 1,1,2,3,5,8,13,21, .
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);
}
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);
}
4. Sa se afle c.m.m.d.c. a doua numere a si b:
54
a) cmmdc(a,b) = cmmdc(a-b,b) , daca a> b
cmmdc(a,b-a) , daca a< b
a, daca a =b
6. Sa se afle:
a) suma cifrelor unui numar natural n:
55
definim functia: suma(n) = 0, daca n = 0
n%10 + suma(n/10), altfel
int n;
int suma(int n)
{
if ( n= =0)return 0;
else return n%10 + suma(n/10);
};
void main()
{
cin>>n;
cout<<suma(n);
}
int n;
int nr(int n)
{
if ( n= =0)return 0;
else return 1+nr(n/10);
};
void main()
{
cin>>n;
cout<<nr(n);
}
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
f(f(x+2)), x < 12
int x;
int f(int x)
{
if ( x>=12) return x-1;
else return f(f(x+2));
};
void main()
{
cin>>x; cout<<f(x);
}
a) S = 1 +2 + 3 + . +n
58
fie S(n) = 1 +2 + 3 + . +(n-1) + n
S(n -1)
int n;
int S(int n)
{
if ( n= =0)return 0;
else return S(n -1) + n;
};
void main()
{
cin>>n;
cout<<S(n);
}
int n;
59
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