Sunteți pe pagina 1din 71

Fundamentele programării

Curs 3

Funcţii în limbajul C

Elena BAUTU & Dorin-Mircea POPOVICI


{ebautu,dmpopovici}@univ-ovidius.ro
Cuprins
• Ce este o functie?
• Declararea, implementarea si apelul unei
functii
• Durata de viata v.s. domeniul de accesibilitate
• Transferul parametrilor
• Redefinirea functiilor
• Functii matematice si alte functii
• Functii recursive

28.02.2013 http://www.disciplinele.ml 2
Ce este o functie?

28.02.2013 http://www.disciplinele.ml 3
Ce este o funcţie în limbajul C
• O funcţie este o secvenţă de instrucţiuni care au fost
grupate sub un singur nume.
– poate să folosească parametri pentru a primi date de intrare
– poate să producă un rezultat (denumit valoare de retur)
– poate produce rezultate multiple, recuperabile prin intermediul
parametrilor
• Avantaje:
– încapsularea şi
– reutilizarea secvenţelor de program
• Funcţiile pot fi:
– definite de utilizator(i.e. programator) sau
– standard (de biblioteca)

28.02.2013 http://www.disciplinele.ml 4
Exemplu
• Scrieti o functie putere care primeste doi parametri de
tip int ce reprezinta baza si exponentul si calculeaza si
returneaza valoarea baza la puterea exponent. Scrieti
apoi un program C care foloseste aceasta functie.
long int putere(int,int);

int main() {
printf("5 la puterea 2 este %li\n", putere(5,2));
}

long int putere(int x, int p) { // x, p sunt parametri formali


long int putere=1;
for (int i=0; i<p; i++) putere *= x;
return putere;
}

28.02.2013 http://www.disciplinele.ml 5
Declararea unei functii

28.02.2013 http://www.disciplinele.ml 6
Declararea unei functii = prototip

• unde lista tipurilor parametrilor este:

• Exemplu:
• void afiseazaEroare();
• int factorial(int); B – declaratii, ct, fctii, tipuri

• float diferenta(float a, float);


28.02.2013 http://www.disciplinele.ml 7
Funcţii definite de utilizator
• funcţia principală, main(), apelată la începutul execuţiei
oricărui program C
• funcţia trebuie declarata înainte de utilizare
– Declaraţia inseamna precizarea antetului
• Antet (prototip): precizeaza care sunt numele, tipul
parametrilor şi tipul valorii de retur a funcţie
tipreturnat nume_functie(lista tipuri parametri formali)

• Exemplu: int suma(int, int);


• Apelul unei funcţii: nume_functie(lista parametri actuali)
• Exemplu: int s = suma(2, 3);

28.02.2013 http://www.disciplinele.ml 8
Implementarea unei functii

28.02.2013 http://www.disciplinele.ml 9
Implementarea unei functii

• Exemple:
• void afiseazaEroare(); B – declaratii, ct, fctii, tipuri

• …
• void afiseazaEroare() {
• printf(“Eroare!\n”);
• } D – implementarea functiilor declarate in zona B

28.02.2013 http://www.disciplinele.ml 10
Implementarea unei functii (cont)
• int factorial(int); B – declaratii, ct, fctii, tipuri

• …
• int factorial(int n) {
• int f=1;
• for (int i=1;i<=n;i++)
• f*=i;
• return f;
• } D – implementarea functiilor declarate in zona B

28.02.2013 http://www.disciplinele.ml 11
Implementarea unei functii (cont)
• float diferenta(float a, float b); B – declaratii, ct, fctii, tipuri
• …
• float diferenta(float a,float b) {
• return a-b;
• } D – implementarea functiilor declarate in zona B

28.02.2013 http://www.disciplinele.ml 12
Restrictii

• O functie NU poate fi declarata in alta functie!

• O functie NU poate fi implementata in alta functie!

28.02.2013 http://www.disciplinele.ml 13
Utilizarea unei functii

28.02.2013 http://www.disciplinele.ml 14
Apelul unei functii
• Apelul funcţiei se face prin scrierea numelui său şi valorile
(actuale ale) parametrilor între paranteze rotunde şi
separaţi prin virgule.
– dacă funcţia nu are parametri, între paranteze nu se scrie nimic.

• Are loc in formarea unei expresii care permite in formarea


sa operanzi de tipul valorii returnate de functie

• Exemple:
• printf("Salut!\n");
• x=sin(30);
• d=sqrt(dx*dx+dy*dy);

28.02.2013 http://www.disciplinele.ml 15
Apelul unei functii (cont)
• void afiseazaEroare();
B – declaratii, ct, fctii, tipuri
• int n;
• int main() {
• printf("Introduceti un numar pozitiv:");
• scanf("%d",&n); Apelul functiei
• if (n<0) { afiseazaEroare(); return -1; }
• //…
• return 1;
• } C – functia main()
• void afiseazaEroare() {
• printf(“Eroare!\n”);
• } D – implementarea functiilor declarate in zona B

28.02.2013 http://www.disciplinele.ml 16
Apelul unei functii (cont)
• int factorial(int);
B – declaratii, ct, fctii, tipuri
• int a,f;
• int main() {
• printf("Introduceti un numar pozitiv:");
• scanf("%d”,&a); Parametru efectiv
• f=factorial(a);
• printf("%d!=%d",a,f); Apelul functiei
• return 1;
• } C – functia main()
• int factorial(int n) {
• int f=1;
• for (int i=1;i<=n;i++) Parametru formal
• f*=i;
• return f;
• } D – implementarea functiilor declarate in zona B

28.02.2013 http://www.disciplinele.ml 17
Apelul unei functii (cont)
• float diferenta(float a, float);
B – declaratii, ct, fctii, tipuri
• float x,y;
• int main() {
• float dif;
• scanf("%f %f",&x,&y); Parametrii efectivi
• dif=diferenta(x,y);
• printf("%f-%f=%f",x,y,dif);
• return 1; Parametrii formali
• } C – functia main()
• float diferenta(float a,float b) {
• return a-b;
• } D – implementarea functiilor declarate in zona B

28.02.2013 http://www.disciplinele.ml 18
Exercitiul 3.1
• Scrieti o functie care afiseaza paritatea
argumentului sau intreg.

28.02.2013 http://www.disciplinele.ml 19
Exercitiul 3.1 – Pasul 1
• Scriu un program care afiseaza paritatea unui
numar intreg:

int a;
int p;
void main() {
printf("Dati un numar intreg:");
scanf("%d",&a);
p=(a%2)?1:0; // determin paritatea lui a, in p
printf(“Numarul %d este %s", a, (p)?“impar":"par");
}

28.02.2013 http://www.disciplinele.ml 20
Exercitiul 3.1 – Pasul 2
• Identific secventa de program care imi rezolva
problema …
Parametrul
int a; viitoarei functii
Rezultatul viitoarei
int p;
functii
void main() {
printf("Dati un numar intreg:");
scanf("%d",&a);
p=(a%2)?1:0; // determin paritatea lui a, in p
printf(“Numarul %d este %s", a, (p)?“impar":"par");
}

• elementele de care depinde acesta secventa …


• si valoarea furnizata de aceasta!
28.02.2013 http://www.disciplinele.ml 21
Exercitiul 3.1 – Pasul 3
• Declar functia tinand cont de elementele identificate…
int paritate (int); Declaratia functiei
int a;
Apelul functiei int p;
void main() {
printf("Dati un numar intreg:");
scanf("%d",&a);
p=(a%2)?1:0;
p=paritate(a);
printf(“Numarul %d este %s", a, (p)?“impar":"par");
}
int paritate(int n) { Implementarea
return (n%2)?1:0; functiei
}
• inlocuiesc secventa identificata cu apelul functiei …
• iar secventa o reutilizez in implementarea functiei!
28.02.2013 http://www.disciplinele.ml 22
Durata de viata
v.s.
Domeniul de accesibilitate

28.02.2013 http://www.disciplinele.ml 23
Durata de viata
• O variabila “traieste” atata vreme cat blocul
de memorie in care ea a fost declarata este
activ.
– Blocul de memorie poate fi delimitat de o pereche
de acolade (variabile locale)
– Blocul de memorie poate fi considerat fisierul in
care variabila este declarata (variabile globale)
• Variabilele globale sunt accesibile in cadrul
oricarei functii din program.
– Ele sunt inaccesibile daca exista in functie
variabile locale cu acelasi nume.
28.02.2013 http://www.disciplinele.ml 24
Exemplu
Variabile globale
• int a,b; fisier.cpp

• void main() { a b

• int s; main

• -> a; // citim a s

• -> b; // citim b Variabila locala

• s=a+b;
• <- s; // afisam s
• }

28.02.2013 http://www.disciplinele.ml 25
Exemplu (cont)
• int a,b; fisier.cpp
• int suma(); a b
• void main() { Variabile globale

• int s; main

• -> a; // citim a s Variabile locale

• -> b; // citim b
s=suma();
• s=suma(); suma

• <- s; // afisam s c
• }
• int suma() {
• int c=a+b;
• return c;
• }28.02.2013 http://www.disciplinele.ml 26
Exemplu (cont)
• Durata de viata fisier.cpp

(DV) a b
Variabile globale
• DV(a)=DV(b)=fisi main
er.exe (i.e. s Variabile locale
durata executiei
aplicatiei) s=suma(); suma

• DV(s)=DV(main) c

=fisier.exe
• DV(c)=DV(suma)
(i.e. durata
apelului functiei)
28.02.2013 http://www.disciplinele.ml 27
Tipul de date void
• Funcţiile care nu returnează nici un rezultat, precizează
ca tip returnat void.
• Definiţia unei astfel de funcţii va fi
void nume_functie(lista parametri formali)
{
Declaratii de variabile locale
instructiuni
}
• Daca o functie nu primeste parametri, ea se defineste
tip_returnat nume_functie(void) { …}
• sau
tip_returnat nume_functie () { … }

28.02.2013 http://www.disciplinele.ml 28
Exercitiul 3.2
1. Sa se scrie o functie care returneaza void si
este fara parametri, si care calculeaza si
afiseaza la iesirea standard valoarea expresiei
x*n+y*m, unde x, y, n, m sunt variabile
globale.
2. Sa se scrie o functie care citeste valorile
acestor variabile de la tastatura.
3. Scrieti apoi un program C care foloseste cele
doua functii de mai sus.

28.02.2013 http://www.disciplinele.ml 29
Exercitiul 3.2 - solutie
int x, y, n, m;
void calculeaza (); // prototip
void citeste (); // prototip
int main (){
citeste(); //apel de functie
calculeaza(); // apel de functie
}
// definitia functiei
void citeste(){ //antetul functiei
printf(“Introduceti x, y, n, m numere intregi \n); //corpul functiei
scanf(“%d%d%d%d”, &x,&y,&n,&m);
}
void calculeaza(){
int rezultat = x*n+y*m;
printf(“rezultatul calclului este %d.\n”, rezultat);
}

28.02.2013 http://www.disciplinele.ml 30
Domeniu de accesibilitate
• O variabila a carei durata de viata nu s-a
incheiat este accesibila daca poate fi unic
identificata.

28.02.2013 http://www.disciplinele.ml 31
Exemplu
• Domeniul de fisier.cpp

accesibilitate(DA) a b
Variabile globale

• DA(a)=DB(b)=fisi main
Variabile locale
er.cpp (i.e. orice s

bloc, s=suma(); suma


main+suma)
c
• DA(s)=main
• DA(c)=suma

28.02.2013 http://www.disciplinele.ml 32
Exemplu (cont)
• DV(a)=DV(b) fisier.cpp

• DA(a)=fisier a b
Variabile globale

• DA(b)=fisier-main main

s b Variabile locale

• DA(s)=DA(b)=main s=suma(); suma

c s

• DA(c)=DA(s)=suma

28.02.2013 http://www.disciplinele.ml 33
Ce este in neregula aici?
• int a,b; fisier.cpp
• int suma(); a b
• void main() { Variabile globale

• int s; main

• -> a; // citim a s Variabile locale

• -> b; // citim b
s=suma();
• s=suma(); suma

• <- s; // afisam s c
• }
• int suma() {
• int c=a+b;
• return c;
• }28.02.2013 http://www.disciplinele.ml 34
Solutia corecta este …
• int a,b; fisier.cpp
• int suma(int,int);
a b
• void main() { Variabile globale
• int s; main
• -> a; // citim a s Variabile locale
• -> b; // citim b
• s=suma(a,b); s=suma(a,b); suma x,y
• <- s; // afisam s
c
• }
c=x+y;
• int suma(int x,int y) { return c;
• int c=x+y;
• return c;
• }
28.02.2013 http://www.disciplinele.ml 35
… independenta de context!
• int suma(int,int); fisier.cpp
• void main() {
• int a,b,s;
• -> a; // citim a main

• -> b; // citim b a b s Variabile locale

• s=suma(a,b);
s=suma(a,b);
• <- s; // afisam s suma x,y

• } c
• int suma(int x,int y) c=x+y;
{ return c;

• int c=x+y;
• return c;
• }
28.02.2013 http://www.disciplinele.ml 36
Exercitiul 3.3
1. Scrieti o functie care returneaza void si are parametru
void, care lucreaza cu o variabila globala de tip sir de
caractere s de dimensiune N (N constanta simbolica)
si care face urmatoarele operatii:
a) citeşte un caracter x (declarat ca variabila locala in functie)
b) citeşte un caracter y (declarat ca variabila locala in functie)
c) înlocuieşte în s apariţiile lui x cu y.
d) Exemplu:pentru s = Limbajul C are functii, x = C şi y = B
e) se afişează: Limbajul B are functii.
2. Scrieti un program C care foloseste aceasta functie.
Afisati sirul s inainte si dupa utilizarea functiei.

28.02.2013 http://www.disciplinele.ml 37
Exercitiul 3.3 - solutie
#define N 100
char s[N]="Limbaj";
void prelucrare();
int main(){
printf(“Sirul este este %s\n", s);
prelucrare();
printf("Rezultatul este %s\n", s);
system("pause");
}
void prelucrare(){
char x, y;
int i;
printf("Introduceti doua caractere:\n");
scanf("%c %c", &x, &y);
for(i = 0; s[i] != 0; i++) {
if(s[i] == x) s[i] = y;
}
}

28.02.2013 http://www.disciplinele.ml 38
Transferul parametrilor

28.02.2013 http://www.disciplinele.ml 39
Transferul parametrilor
• În limbajul C, parametrii funcţiilor se transmit
prin valoare.
– funcţia apelată lucrează cu copii ale datelor de intrare
şi nu poate să modifice variabilele din funcţia apelantă
void test(int n) {
n = 0;
}
...
n = 5; printf("n este %i", n);
test(n); printf("n este %i", n);

28.02.2013 http://www.disciplinele.ml 40
Exemplu
int suma (int, int);

int main(){
int x = 5, y = 6;
printf("x este %d, y este %d\n", x,y);
int s = suma(x,y);
printf("x este %d, y este %d\n", x,y);
printf("Suma lor este %d\n.", s);
}

int suma (int a, int b) {


b = a+b;
a = 0;
return b;
}
28.02.2013 http://www.disciplinele.ml 41
Transferul parametrilor = VALOARE
• int suma(int,int); fisier.cpp
• void main() {
• int a,b,s;
• -> a; // citim a main

• -> b; // citim b a b s
• s=suma(a,b); -> a;
-> b;
• <- s; // afisam s s=suma(a,b);
suma x,y

• } <- s; c
• int suma(int x,int y) c=x+y;
{ return c;

• int c=x+y;
• return c;
• }
28.02.2013 http://www.disciplinele.ml 42
Exercitiile 3.4
• Scrieti o functie care determina maximul dintre 2
numere intregi: max(a,b).
• Scrieti o functie care determina maximul dintre 3
numere intregi: max(a,b,c).
• Scrieti o functie care determina suma primelor n
numere naturale: suma(n).
• Scrieti o functie care determina produsul primelor n
numere naturale: produs(n).

28.02.2013 http://www.disciplinele.ml 43
Exercitiile 3.5
• Scrieti o functie care determina suma numerelor
naturale cuprinse intre n si m: sumadintre(n,m).
• Scrieti o functie care afiseaza coordonatele a n puncte
echidistante situate pe un cerc de centru (x,y) si raza r.
• Fiind dat un numar t din [0,1], gasiti-i corespondentul u
dintr-un interval [a,b], cu a si b numere reale.
• Aplicati apoi intervalul [a,b] in intervalul [c,d]. Si apoi in
[d,c].

28.02.2013 http://www.disciplinele.ml 44
Redefinirea functiilor

28.02.2013 http://www.disciplinele.ml 45
Prototipul v.s. semnatura functiei
• Prototipul functiei

• Semnatura functiei

• Doua functii situate in acelasi domeniu de


accesibilitate nu pot avea aceeasi semnatura!

28.02.2013 http://www.disciplinele.ml 46
Exemple
• int suma(int,int); • Prototipuri diferite
• float suma(int,int); • Aceeasi semnatura

• int suma(int,int); • Prototipuri diferite


• float suma(float,float); • Semnaturi diferite

28.02.2013 http://www.disciplinele.ml 47
Redefinirea functiilor
• Utilizarea unui acelasi identificator in
semnaturi diferite ale functiilor

• int suma(int,int);
• float suma(float,float);
• float s;
• s=suma(2,3);
• s=suma(2.3,3.0);

28.02.2013 http://www.disciplinele.ml 48
Parametrii impliciti – in prototip
• Parametrii impliciti se organizeaza in grupuri compacte, situate la
sfarsitul listei parametrilor formali in cadrul prototipului functiei

• int suma(int,int,int c=0); // prototip

• int s;
• s=suma(2,3);
• s=suma(2,3,4);

• int suma(int a,int b,int c) { // implementare


• return a+b+c;
• }

28.02.2013 http://www.disciplinele.ml 49
Exercitiile 3.6
• Indicati prototipurile corecte:
– int suma(int,int, int c=0);
– int suma(int,int,int c=0,int);
– int suma(int, int b=0,int,int d=0);
– int suma(int, int, int c=0,int d=0);
• Specificati functia apelata:
– S=suma(1,2);
– S=suma(1,2,3);
– S=suma(1,2,3,4);
• Implementati o functie care determina maximul a
cel mult 5 numere intregi.
28.02.2013 http://www.disciplinele.ml 50
Functii matematice si alte functii

28.02.2013 http://www.disciplinele.ml 51
Biblioteca matematică
• fişierul antet math.h
• conţine
– constante
• diverse valori remarcabile în matematică
– funcţii standard
• aritmetice
• trigonometrice

28.02.2013 http://www.disciplinele.ml 52
Constante
Nume Descriere Nume Descriere
M_E e M_LOG2E log 2 e
M_LOG10E lg e M_LN2 ln 2
M_LN10 ln10 M_PI 
M_PI_2  M_PI_4 
2 4
M_1_PI 1 M_2_PI 2
 
M_2_SQRTPI 2 M_SQRT1_2 1
 2
M_SQRT2 2

28.02.2013 http://www.disciplinele.ml 53
Funcţii trigonometrice
• lucreaza cu radiani
• double sin (double x)
• double cos (double x)
• double asin (double x)
• double acos (double x)
• double tan (double x)
• double atan (double x)
• double atan2 (double x, double y)
• double cosh (double x)
• double sinh (double x)
• double tanh (double x)

28.02.2013 http://www.disciplinele.ml 54
Funcţii putere şi logaritmice
• double pow (double x, double y)
• double sqrt (double x)
• double exp (double x)
• double log (double x)
• double log10 (double x)
• double log2 (double x)

28.02.2013 http://www.disciplinele.ml 55
Alte funcţii
• rotunjire
– double floor (double x)
– double ceil (double x)
– double round (double x)
– double trunc (double x)
• valoare absolută
– int abs (int x)
– double fabs (double x)
• numere aleatoare
– int rand ()

28.02.2013 http://www.disciplinele.ml 56
Exercitiile 3.7
• un program C care implementează funcţia
 x   , 1
2
xe1 x ,

3
f  x    x  1ln 1  x 2  x   1,1

 sin  x  * sh  x 
 x  1,  

• un program C care calculează


n
1
en  
i 0 i !
28.02.2013 http://www.disciplinele.ml 57
Functii recursive

28.02.2013 http://www.disciplinele.ml 58
Functii recursive
• Apelul unei functii se poate produce in orice functie,
inclusiv functia in curs de implementare (recursivitate)
• Funcţie recursivă = funcţie care se foloseste pe ea
insasi in definitia ei
– Directă
• în definiţia funcţiei f se apeleaza direct funcţia f
– Indirectă
• în definiţia funcţiei f se foloseşte o altă funcţie care foloseşte
direct sau indirect funcţia f

• In order to understand recursion, one must first


understand recursion. Search for it on google.com!

28.02.2013 http://www.disciplinele.ml 59
Exemplu
• factorial(n):
– daca n = 0, factorial(n) este 1
– daca n > 0, factorial(n) este n * factorial(n-1)

int factorial (int n)


{
if (n == 0)
return 1;
return n * factorial (n-1);
}
28.02.2013 http://www.disciplinele.ml 60
Exemplu (cont)
• int factorial(int); fisier.cpp

factorial n
• void main() { return n*factorial(n-1);
• int n,f; main
factorial n-1
• -> n; n return (n-1)*factorial(n-2);
f
• f=factorial(n);
factorial
• <- f; f=factorial(n);
n-2
return (n-2)*factorial(n-3);
• }

factorial 1
• int factorial(int n) { return (1)*(1);
(1)*factorial(0);
• if (n==0) return 1;
factorial 0
• return n*factorial(n-1);
return 1;
• }
28.02.2013 http://www.disciplinele.ml 61
Funcţii recursive
• Unul sau mai multe cazuri de baza
– valori de intrare pentru functie pentru care functia produce rezultat
fara recurenta
• Unul sau mai multe cazuri de recurenta
– valori de intrare pentru care programul intra in recursivitate (se
autoapeleaza)
• Recursivitatea presupune executia repetata a unui modul
– in cursul executiei lui (si nu la sfirsit, ca in cazul iteratiei), se verifica o
conditie a carei nesatisfacere implica reluarea executiei modulului de
la inceput, fara ca executia curenta sa se fi terminat.
– In momentul satisfacerii conditiei se revine in ordine inversa din lantul
de apeluri, reluandu-se si incheindu-se apelurile suspendate.
• La fiecare apel recursiv al unei functii se creaza copii locale ale
parametrilor actuali si ale variabilelor locale, ceea ce poate duce la
risipa de memorie.

28.02.2013 http://www.disciplinele.ml 62
Exemplu
int cmmdc (int x, int y)
{
if (y == 0)
return x;
if (x == 0)
return y;
if (x < y)
return cmmdc(x,y%x);
else
return cmmdc(y,x%y);
}

28.02.2013 http://www.disciplinele.ml 63
Exercitiile 3.8
1. Scrieti o functie care calculeaza al n-lea
termen din sirul lui Fibonacci.
– fib(0) = 0 si fib (1) = 1;
– fib(n) = fib(n-1)+ fib(n-2), daca n>1
2. Folositi aceasta functie intr-un program C si
aflati valorile ei pentru n de la 1 la 20.

28.02.2013 http://www.disciplinele.ml 64
Exercitiile 3.9
1. Scrieţi o funcţie care calculează funcţia lui
Ackerman

2. Folosiţi această funcţie într-un program C şi


aflaţi valorile lui A(1,1), A(1,2), A(2,1), A(2,2),
A(4,2). Atenţie. Lucraţi cu numere long integer!

28.02.2013 http://www.disciplinele.ml 65
Exercitiul 3.10
• Scrieti o functie care are ca parametru un
numar intreg si afiseaza in ordine, de la stanga
la dreapta, cifrele acestuia.
• Daca ati reusit, incercati sa obtineti o varianta
recursiva!

• Implementati o functie recursiva care


calculeaza suma primelor n numere naturale.

28.02.2013 http://www.disciplinele.ml 66
Argumentele liniei de comanda

28.02.2013 http://www.disciplinele.ml 68
Argumente in linia de comanda
• La lansarea unui program C, este posibil sa
transmitem acestuia niste parametri, sub
forma de argumente transmise in linia de
comanda
– Acestea pot permite, de exemplu, controlul
programului din afara acestuia (alternativa ar fi
utilizarea acestor argumente ca parametri ‘hard-
coded’ in program)s

28.02.2013 http://www.disciplinele.ml 69
Argumente in linia de comanda
• Functia main admite ca prototipuri, conform ANSI C:
– int main();
– int main(int argc, char *argv[]);
– int main(int argc, char **argv);
• Cele doua argumente reprezinta:
– Argc = numarul de argumente trimise programului
– Argv = lista de argumente propriu-zise trimise programului
– Argv[0] = este rezervat pentru numele programului
• Parametrii din linia de comanda sunt primiti in program ca siruri de
caractere (char [], char *)!
– Daca se doreste transformarea lor in numere, se folosesc functii de
conversie specifice, e.g.
• atoi – care transforma un sir de caractere in intregul pe care il contine, e.g.
atoi(“12”) -> 12
• atol – converteste sir de caractere in long integer
• atof – converteste sir de caractere in double

28.02.2013 http://www.disciplinele.ml 70
Argumentele liniei de comanda
• Sa se calculeze suma numerelor intregi date ca argumente
in linia de comanda.
//suma.cpp
#include <stdio.h>
#include <stdlib.h>
void main(int argc,char *argv[]) {
if (argc<2) { printf("lipsesc parametri!"); return;}
s=0;
for(int i=1;i<argc;i++)
s+=atoi(argv[i]);
printf("Suma este %d",s);
}
28.02.2013 http://www.disciplinele.ml 71
Exercitiile 3.11
#include <stdio.h> else
int main ( int argc, char *argv[] ) {
{ int x;
if ( argc != 2 ) /* argc should be 2 for correct execution /* read one character at a time from file, stopping
*/ at EOF, which
{ indicates the end of the file. Note that the
/* We print argv[0] assuming it is the program name */ idiom of "assign
printf( "usage: %s filename", argv[0] ); to a variable, check the value" used below works
} because
else the assignment statement evaluates to the value
assigned. */
{ while ( ( x = fgetc( file ) ) != EOF )
// We assume argv[1] is a filename to open {
FILE *file = fopen( argv[1], "r" ); printf( "%c", x );
}
/* fopen returns 0, the NULL pointer, on failure */ fclose( file );
if ( file == 0 ) //NULL }
{ }
printf( "Could not open file\n" ); }
}

28.02.2013 http://www.disciplinele.ml 72