Sunteți pe pagina 1din 11

Valeriu Iorga Programare n C / C++

6. Funcii.(1)
6.1. Apelarea funciilor.
In C noiunea de funcie este esenial, deoarece asigur un mecanism de abstractizare a controlului:
rezolvarea unei pri a problemei poate fi ncredinat unei funcii, moment n care suntem preocupai de ce
face funcia, fr a intra n detalii privind cum face funcia anumite operaii. nsi programul principal este o
funcie cu numele main(), iar programul C este reprezentat de o mulime de definiri de variabile i de funcii.
Funciile pot fi clasificate n:
funcii care ntorc un rezultat
funcii care nu ntorc nici un rezultat (similare procedurilor din Pascal).
Apelul (referirea sau utilizarea) unei funcii se face prin:
nume_funcie (list_parametri_efectivi)
Acesta poate apare ca o instruciune, n cazul funciilor care nu ntorc un rezultat:
nume_funcie (list_parametri_efectivi);
De exemplu:
printf(x=%5.2lf\n,x);
mesaj();
Pentru funciile care ntorc un rezultat apelul de funcie poate apare ca operand ntr-o expresie.
De exemplu:
y=sin(x);
nr_zile=bisect(an)+365;
Se remarc faptul c lista de argumente (sau de parametri efectivi) poate fi vid.
Funciile comunic ntre ele prin lista de argumente i prin valorile ntoarse de funcii. Comunicarea
poate fi realizat i prin variabilele externe, definite n afara tuturor funciilor.
Exemplul 11: O fracie este cunoscut prin numrtorul x i numitorul y, valori ntregi fr semn. S
se simplifice aceast fracie.
Simplificarea se va face prin cel mai mare divizor comun al numerelor x i y. Vom utiliza o funcie
avnd ca parametri cele dou numere, care ntoarce ca rezultat , cel mai mare divizor comun a lor. Funcia
main() apeleaz funcia cmmdc() transmindu-i ca argumente pe x i y. Funcia cmmdc() ntoarce ca
rezultat funciei main(), valoarea celui mai mare divizor comun. Programul, n care vom ignora deocamdat
definirea funciei cmmdc(), este:
#include <stdio.h>
void main(void)
{ unsigned long x, y, z;
scanf(%lu%lu, &x, &y);
printf(%lu / %lu =, x, y);
z=cmmdc(x,y);
x/=z;
y/=z;
printf(%lu / %lu\n, x, y);
}
6.2. Definiii de funcii.
n utilizarea curent, o funcie trebuie s fie definit nainte de a fi apelat. Aceasta impune o definire
a funciilor programului n ordinea sortrii topologice a acestora: astfel mai nti se vor defini funciile care nu
apeleaz alte funcii, apoi funciile care apeleaz funcii deja definite. Este posibil s eliminm aceast
restricie, lucru pe care l vom trata ulterior.
O funcie se definete prin antetul i corpul funciei.
35
Valeriu Iorga Programare n C / C++
Funciile nu pot fi incluse unele n altele; toate funciile se declar pe acelai nivel cu funcia main.
In versiunile mai vechi ale limbajului, n antetul funciei parametrii sunt numai enumerai, urmnd a fi
declarai ulterior. Lista de parametri, n acest caz, este o enumerare de identificatori separai prin virgule.
tip_rezultat nume_functie( lista_de_parametri_formali )
{ declarare_parametri_formali;
alte_declaratii;
instructiuni;
}
In mod uzual parametrii funciei se declar n antetul acesteia. Declararea parametrilor se face printr-o
list de declaraii de parametri, cu elementele separate prin virgule.
tip_rezultat nume_functie( tip nume, tip nume,... )
{ declaratii;
instructiuni;
}
O funcie este vizibil din locul n care a fost declarat spre sfritul fiierului surs (adic definiia
funciei precede apelul).
Definirea funciei cmmdc() se face folosind algoritmul lui Euclid.
unsigned long cmmdc(unsigned long u, unsigned long v)
{ unsigned long r;
do {r=u%v;
u=v;
v=r;
} while (r);
return u;
}
In cazul n care apelul funciei precede definiia, trebuie dat, la nceputul textului surs, un prototip al
funciei, care s anune c definiia funciei va urma i s furnizeze tipul rezultatului returnat de funcie i tipul
parametrilor, pentru a permite compilatorului s fac verificrile necesare.
Prototipul unei funcii are un format asemntor antetului funciei i servete pentru a informa
compilatorul asupra:
tipului valorii furnizate de funcie;
existena i tipurile parametrilor funciei
Spre deosebire de un antet de funcie, un prototip se termin prin ;
tip nume( lista tipurilor parametrilor formali);
Din prototip intereseaz numai tipurile parametrilor, nu i numele acestora, motiv pentru care aceste
nume pot fi omise.
void f(void); /*functie fara parametri care nu intoarce nici un rezultat*/
int g(int x, long y[], double z);
int g(int, long[], double); /*aici s-au omis numele parametrilor*/
Dintre toate funciile prezente ntr-un program C prima funcie lansat n execuie este main(),
independent de poziia pe care o ocup n program.
Apelul unei funcii g(), lansat din alt funcie f() reprezint un transfer al controlului din funcia
f(), din punctul n care a fost lansat apelul, n funcia g(). Dup terminarea funciei g() sau la ntlnirea
instruciunii return se revine n funcia f() n punctul care urmeaz apelului g(). Pentru continuarea
calculelor n f(), la revenirea din g() este necesar salvarea strii variabilelor (contextului) din f() n
momentul transferului controlului. La revenire n f(), contextul memorat a lui f() va fi refcut.
O funcie apelat poate, la rndul ei, s apeleze alt funcie; nu exist nici o limitare privind numrul
de apeluri nlnuite.
6.3. Comunicarea ntre funcii prin variabile externe.
Efecte laterale ale funciilor.
36
Valeriu Iorga Programare n C / C++
Comunicarea ntre funcii se poate face prin variabile externe tuturor funciilor; acestea i pot prelua
date i pot depune rezultate n variabile externe. n exemplul cu simplificarea fraciei vom folosi variabilele
externe a, b i c . Funcia cmmdc() calculeaz divizorul comun maxim dintre a i b i depune rezultatul
n c. ntruct nu transmite date prin lista de parametri i nu ntoarce vreun rezultat, funcia va avea prototipul
void cmmdc():
#include <stdio.h>
unsigned long a, b, c; // variabile externe
// definirea functiei cmmdc()
void main(void)
{ scanf(%lu%lu, &a, &b);
printf(%lu / %lu = , a, b);
cmmdc();
a/=c;
b/=c;
printf(%lu / %lu\n, a, b);
}
Definiia funciei cmmdc()din Exemplul 11, este:
void cmmdc()
{ unsigned long r;
do {
r=a%b;
a=b;
b=r;
} while (r);
c=a;
}
Dac se execut acest program, se constat un rezultat ciudat, i anume, orice fracie, prin simplificare
ar fi adus la forma 1/0 ! Explicaia const n faptul c funcia cmmdc() prezint efecte laterale, i anume
modific valorile variabilelor externe a, b i c; la ieirea din funcie a==c i b==0, ceeace explic rezultatul.
Aadar, un efect lateral (sau secundar),reprezint modificarea de ctre funcie a unor variabile externe.
n multe situaii aceste efecte sunt nedorite, duc la apariia unor erori greu de localizat, fcnd
programele neclare, greu de urmrit, cu rezultate dependente de ordinea n care se aplic funciile care prezint
efecte secundare. Astfel ntr-o expresie n care termenii sunt apeluri de funcii, comutarea a doi termeni ar
putea conduce la rezultate diferite!
Vom corecta rezultatul, limitnd efectele laterale prin interzicerea modificrii variabilelor externe a i
b, ceea ce presupune modificarea unor copii ale lor n funcia cmmdc()sau din programul de apelare
void cmmdc(void)
{ unsigned long r, ca, cb;
ca=a;
cb=b;
do{
r=ca%cb;
ca=cb;
cb=r;
} while (r);
c=ca;
Singurul efect lateral permis n acest caz modificarea lui c asigur transmiterea rezultatului ctre
funcia apelant.
Soluia mai natural i mai puin expus erorilor se obine realiznd comunicaia ntre funcia
cmmdc() i funcia main() nu prin variabile externe, ci prin parametri, folosind o funcie care ntoarce ca
rezultat cmmdc.
37
Valeriu Iorga Programare n C / C++
Transmiterea parametrilor prin valoare, mecanism specific limbajului C, asigur pstrarea intact a
parametrilor actuali x i y, dei parametrii formali corespunztori: u i v se modific! Parametrii actuali x i y
sunt copiai n variabilele u i v, astfel nct se modific copiile lor nu i x i y.
In fiierul surs funciile pot fi definite n orice ordine.Mai mult, programul se poate ntinde n mai
multe fiiere surs. Definirea unei funcii nu poate fi totui partajat n mai multe fiiere.
O funcie poate fi apelat ntr-un punct al fiierului surs, dac n prealabil a fost definit n acelai
fiier surs, sau a fost anunat.
Exemplul 12:
#include <stdio.h>
#include <conio.h>
unsigned long fact(unsigned char); // prototipul anunta functia
void main()
{ printf("5!=%ld\n", fact(5)); // apel functie
printf("10!=%ld\n", fact(10));
getch();
}
long fact(unsigned char n) // antet functie
{ long f=1; // corp functie
short i;
for (i=2; i<=n; i++)
f*=i;
return(f);
}
Tipurile funciilor pot fi:
tipuri predefinite
tipuri pointer
tipul structur (nregistrare)
6.4. Funcii care apeleaz alte funcii.
Programul principal (funcia main()) apeleaz alte funcii, care la rndul lor pot apela alte funcii.
Ordinea definiiilor funciilor poate fi arbitrar, dac se declar la nceputul programului prototipurile
funciilor. In caz contrar definiiile se dau ntr-o ordine n care nu sunt precedate de apeluri ale funciilor.
Exemplul 13: Pentru o valoare ntreag i pozitiv n dat, s se genereze triunghiul lui Pascal, adic
combinrile:
C
0
0
C
1
0
C
1
1
. . .
C
n
0
C
n
1
. . . C
n
n
Combinrile vor fi calculate utiliznd formula cu factoriale: C
n
p
=n!/p!/(n-p)!
#include <stdio.h>
unsigned long fact(int); /*prototip functie factorial*/
unsigned long comb(int,int); /*prototip functie combinari*/
void main(void) /*antet functie main*/
{ int k,j,n;
unsigned long C;
scanf(%d,&n);
for (k=0;k<=n;k++)
{ for (j=0;j<=k;j++)
printf(%6lu , comb(k,j));
printf(\n);
}
}
38
Valeriu Iorga Programare n C / C++
unsigned long comb(int n, int p) /*antet functie comb*/
{ return (fact(n)/fact(p)/fact(n-p));
}
/* functia fact a mai fost definita */
6.5. Programe cu mai multe fiiere surs.
Pentru programele mari este mai comod ca acestea s fie constituite din mai multe fiiere surs,
ntruct programul este conceput de mai muli programatori (echip) i fiecare funcie poate constitui un fiier
surs, uurndu-se n acest mod testarea. Reamintim c o funcie nu poate fi mprit ntre mai multe fiiere.
Un exemplu de program constituit din 2 fiiere surs este:
/* primul fisier Fis1.c */
void F(); /* prototipul functiei definite in fisierul 2*/
#include <stdio.h>
void main(){
F(); /* apelul functiei F */
...
}
/* al doilea fisier Fis2.c */
#include <stdio.h>
void F(){
...
}
Pentru execuia unui program rezident n mai multe fiiere se creaz un proiect.
se selecteaz opiunea PROJECT
se selecteaz OPEN PROJECT
se introduce numele proiectului (creindu-se fiierul nume.prj)
se adaug pe rnd numele fiierelor care compun proiectul cu ADD ITEM
se execut proiectul din meniul RUN
6.6. Fiiere antet.
In C se pot utiliza o serie de funcii aflate n bibliotecile standard. Apelul unei funcii de bibliotec
impune prezena prototipului funciei n textul surs. Pentru a simplifica inserarea n textul surs a
prototipurilor funciilor de bibliotec, s-au construit fiiere de prototipuri. Acestea au extensia .h (header sau
antet).
De exemplu fiierul stdio.h conine prototipuri pentru funciile de bibliotec utilizate n operaiile de intrare /
ieire; fiierul string.h conine prototipuri pentru funciile utilizate n prelucrarea irurilor de caractere.
Includerea n textul surs a unui fiier antet se face folosind directiva #include
Fiier antet Funcii coninute
stdio.h printf, scanf, gets, puts,...
conio.h putch, getch, getche, ...
math.h sqrt, sin, cos, ...
6.7. Funcii matematice uzuale.
Fiierul antet <math.h> conine semnturile (prototipurile) unor funcii matematice des folosite.
Dintre acestea amintim:
Notaie Semntur (prototip) Operaie realizat
sin(x) double sin(double);
funcii trigonometrice directe cos(x) double cos(double);
tg(x) double tan(double);
arcsin(x) double asin(double);
39
Valeriu Iorga Programare n C / C++
funcii trigonometrice inverse arcos(x) double acos(double);
arctg(x) double atan(double);
arctg(y/x) double atan2(double, double);
sinh(x) double sinh(double);
funcii hiperbolice cosh(x) double cosh(double);
th(x) double tanh(double);
exp(x) double exp(double); exponenial natural
10
n
double pow10(int); exponenial zecimal
a
b
double pow(double, double); exponenial general
ln(x) double log(double); logaritm natural
lg(x) double log10(double); logaritm zecimal
| x |
double fabs(double);
valoare absolut int abs(int);
long labs(long);
x double sqrt(double); rdcin ptrat
long double sqrtl(long double);
x1 double ceil(double); ntregul minim >= x
x] double floor(double); ntregul maxim <= x
conversii
double atof(const char *); conversie ir de caractere n float
long double atold (const char *); conversie ir de caractere n long double
40
Valeriu Iorga Programare n C / C++
7. Variabile.
7. 1. Variabile externe (globale) i variabile interne (locale).
Un program C este un ansamblu de obiecte externe: variabile i funcii.
O variabil extern este o variabil definit n afara oricrei funcii, fiind astfel accesibil din orice
funcie. Am vzut c funciile pot comunica ntre ele prin variabile externe sau globale.Orice funcie poate
accesa o variabil extern, referindu-se la aceasta prin numele ei, dac acest nume a fost declarat.
Prin urmare, variabilele externe au ca domeniu (sunt vzute i pot fi accesate din) ntregul fiier surs
n care sunt definite.
Durata de via a unei variabile externe (adic intervalul n care memoria este alocat) coincide cu
durata n care programul C este activ. Variabilele externe sunt permanente: ele rein valori ntre apelurile
diferitelor funcii.
Spre deosebire de variabilele externe, variabilele interne (numite i automatice sau locale) au un
domeniu mult mai restrns - ele sunt cunoscute numai n interiorul funciei n care sunt definite.
Durata de via a variabilelor interne este mult mai scurt ca a variabilelor externe alocarea de
memorie se face la intrarea n funcie, pentru ca la prsirea funciei, memoria ocupat de variabil s fie
eliberat.
ntre ele, funciile sunt ntotdeauna externe, pentru c nu pot fi definite n interiorul altor funcii (ca n
Pascal!).
7.2. Domenii de vizibilitate ale variabilelor.
Funciile i variabilele externe din care este alctuit programul nu trebuie s fie compilate n acelai
timp; textul programului surs poate fi separat n mai multe fiiere.
Domeniul unui nume reprezint partea din program n care numele poate fi folosit.
Astfel pentru o variabil local, definit la nceputul unei funcii, domeniul l reprezint acea funcie.
Variabilele locale cu acelai nume din funcii diferite sunt entiti diferite. Acelai lucru este valabil i pentru
parametrii formali ai funciilor, care sunt de fapt variabile locale.
Domeniul unei variabile externe, ca i a unei funcii se ntinde din punctul n care a fost declarat i
pn la sfritul fiierului surs.
O variabil extern poate fi referit i dintr-un alt fiier surs al programului, dac este declarat n
acest fiier cu atributul extern.
O asemenea declaraie anun proprietile variabilei (tipul), fr a aloca memorie pentru variabil.
De exemplu: extern int x;
Alocarea de memorie se face o singur dat i anume n fiierul surs n care variabila extern este
definit. Tot n acel loc se face i iniializarea variabilei externe.
Intr-o funcie sunt vizibili:
parametrii formali
variabilele locale
variabilele globale locale modulului care declar funcia ( variabilele declarate n afara
funciei n aceeai unitate de compilare;
variabilele globale exportate de alte module i importate de modulul care declar funcia.
Orice definiie este i o declaraie, dar reciproca nu este adevrat. Astfel prototipul unei funcii este o
declaraie.
7.3. Clase de memorare.
Orice variabil are 4 atribute:
1. Clasa de memorare - reprezint locul n care este memorat variabila:
ntr-un segment de date
ntr-un registru
n stiv
n heap
2. Vizibilitatea - reprezinta liniile textului surs din care variabila poate fi accesat
la nivel de bloc - variabila este cunoscuta ntr-un bloc, din momentul declarrii pn la
sfritul blocului
la nivel de fisier - variabila este cunoscuta ntr-un fisier.
3. Durata de via - reprezinta timpul n care variabila are alocat spaiu n memoria intern.
41
Valeriu Iorga Programare n C / C++
durat static - variabila are alocat spaiu pe tot timpul execuiei programului. Variabilele
statice sunt memorate ntr-un segment de date si sunt n mod automat iniializate cu 0.
durat local - variabila are alocat spaiu cat timp se execut instruciunile unui bloc.
Alocarea de spaiu se face n stiv sau ntr-un registru.
durat dinamic - variabila este alocat i dezalocat n timpul execuiei programului prin
funcii speciale. Alocarea de spaiu se face n heap.
4. Tipul variabilei - determina numrul de octei rezervai pentru variabil.
Atributele unei variabile se stabilesc:
implicit - n locul unde se face declaraia
explicit - prin anumii calificatori.
Variabilele pot clasificate n:
variabile globale
variabile locale.
Variabilele globale:
se definesc n afara corpurilor funciilor
li se rezerva spaiu ntr-un segment de date, nainte de execuia programului
au durata de viata statica
sunt iniializate implicit
au vizibilitate la nivel de fisier
vizibilitatea lor poate fi extinsa la nivel de program
O variabila globala poate fi accesata dintr-un fisier care nu conine definiia variabilei, dar trebuie sa
conina o declaraie a variabilei, care conine numele variabilei precedat de specificatorul extern.
/* FISIER1.C */
int x=5; /* aici se defineste variabila x */
void F(); /* prototipul functiei F, definita in FISIER2.C */
void main(){
F(); /* apelul functiei F */
}
/* FISIER2.C */
#include <stdio.h>
extern a; /* declararea variabilei definite in alt fisier */
void F() /* aici se defineste functia F */
{
...
}
Dac declaraia unei variabile este facut nafara corpului funciei, ea este vizibil din punctul
declaraiei pn la sfritul fiierului.
Dac declaraia variabilei se face n corpul unei funcii, ea este vizibil din locul declarrii, pn la
sfritul blocului.
7.3.1. Variabile i funcii statice.
Declararea unei variabile externe sau funcii cu atributul static limiteaz domeniul obiectului la
fiierul surs compilat. Folosirea cuvntului extern nu asigur, n acest caz accesul din alt fiier la obiectul
declarat static.
Variabilele interne pot fi i ele declarate statice. Prin aceasta ele vor rmne alocate i dup ieirea din
funcie, asigurnd memorarea de valori ntre apeluri ale funciei. Variabilele interne statice :
au durata de via din momentul definiiei pn la sfritul execuiei programului
sunt memorate ntr-un segment de date
sunt iniializate automat
definiia lor ncepe cu cuvntul static
#include <stdio.h>
static double a;
void main(){
++a;
42
Valeriu Iorga Programare n C / C++
printf(a=%.2lf, a);
}
Variabila a este local (fr specificatorul static ar fi fost globala). a este iniializata la 0, astfel c
n primul apel se va afia 1; urmtorul apel preia valoarea existent (1), pe care o incrementeaz, deci afieaz
2, .a.m.d. Vizibilitatea este la nivelul fiierului (modulului) i nu se poate extinde la nivelul programului.
#include <stdio.h>
void increm(void){
static int a;
printf(%d\n, ++a);
}
void main(void){
int k;
for (k=0; k<5; k++)
increm();
}
Exemplul 14: Definii o funcie pentru generarea de numere ntregi aleatoare.
Un generator congruenial de numere aleatoare este definit printr-o relaie de forma:
x
n+1
= (a*x
n
+ b) % c,
n care x
0
poart numele de smna (seed) generatorului. a, b i x
0
sunt numere prime, care asigur o
distribuie aleatoare a numerelor n secvena {x
n
}. c d domeniul n care se genereaz numerele aleatoare i
se alege, de obicei, tot un numr prim. Funcia generator de numere aleatoare calculeaz cu relaia de mai sus
pe x
n+1
i-l ntoarce ca rezultat. Valoarea x
n
trebuie s provin din apelul precedent al funciei, aa c va fi
declarat ca variabil static, iniializat cu valoarea smnei x
0
. Iniializarea va fi fcut numai la primul apel
al funciei, la fiecare din apelurile urmtoare se preia valoarea rmas din apelul precedent. Se remarc faptul
c se genereaz ntotdeauna aceeai secven de numere aleatoare! Pentru a genera de fiecare dat o alt
secven aleatoare, smna ar trebui generat aleator.
Exist dou funcii de bibliotec:
int rand(void); - care ntoarce (dac este folosit singur), o aceeai secven de numere pseudoaleatoare
n domeniul 0 : RAND_MAX
void srand(unsigned s); - care stabilete valoarea smnei (x
0
)
unsigned aleator(unsigned long c) {
static unsigned long x = 113;
unsigned long a = 121369, b = 179953;
x = (a*x + b) % c;
return x;
}
7.3.2. Variabile regitri.
Pentru variabilele folosite n mod frecvent, pentru creterea eficienei programului, se dorete ca
alocarea s se fac n regitrii mainii. n acest scop variabilele se declar cu atributul register.
De exemplu:
register int a;
register char c;
Pot fi declarate ca variabile regitri numai variabilele automatice. Numai puine tipuri de variabile
(care ocup puin memorie) permit declararea ca variabile regitri (de exemplu tipurile char i int dar nu
double!).
ntruct numrul de regitri main este limitat, declararea prea multor variabile de acest tip determin
ca, de la un anumit moment s se ignore aceast declaraie, i anume, dup alocarea regitrilor disponibili,.
Variabilelor alocate n regitri nu poate s le fie aplicat operatorul de adresare.
Variabile definite n interiorul blocurilor.
43
Valeriu Iorga Programare n C / C++
O variabil definit n interiorul unei instruciuni compuse ascunde o variabil cu acelai nume
definit ntr-un bloc exterior i dureaz pn la terminarea blocului.
O variabil definit i iniializat ntr-un bloc, va fi reiniializat la fiecare intrare n acel bloc.
O variabil static, definit i iniializat ntr-un bloc, va fi iniializat o singur dat, la prima intrare
n acel bloc.
7.3.3. Iniializri.
n absena unei iniializri explicite, variabilele externe i cele statice sunt iniializate la 0, n timp ce
variabilele interne i regitri rmn neiniializate.
n cazul unei iniializri explicite, iniializatorul unei variabile externe sau statice poate fi o expresie
constant, n timp ce pentru variabile interne sau regitri putem avea orice expresie, coninnd chiar apeluri de
funcii.
7.4. Probleme propuse.
1. Numerele naturale pot fi clasificate n: deficiente, perfecte sau abundente, dup cum suma
divizorilor este mai mic, egal sau mai mare dect valoarea numrului. Astfel: n=12 este abundent deoarece
are suma divizorilor: sd = 1+2+3+4+6 = 16 > 12, n=6 este perfect: sd = 1+2+3 = 6, iar n=14
este deficient deoarece sd = 1+2+7 < 14.
Definii o funcie avnd ca parametru un numr ntreg n, funcie care ntoarce ca rezultat 1, 0 sau 1
dup cum numrul este deficient, perfect sau abundent.
Scriei o funcie main care citete dou valori ntregi x i y i clasific toate numerele naturale cuprinse
ntre x i y afind dup fiecare numr tipul acestuia, adic deficient, perfect sau abundent.
2. O pereche de numere naturale a i b se numesc numere prietene, dac suma divizorilor unuia dintre
numere este egal cu cellalt numr. De exemplu 220 i 284 sunt numere prietene deoarece:
sd(220) = 1+2+4+5+10+11+20+22+44+55+110 = 284
sd(284) = 1+2+4+71+142 = 220
a) Scriei o funcie avnd ca parametri un numr natural, care ntoarce suma divizorilor numrului.
b) Scriei o funcie avnd ca parametri dou numere naturale, care ntoarce 1 sau 0, dup cum cele
dou numere sunt sau nu prietene.
c) Scriei o funcie main(), care n intervalul x, y dat gsete toate perechile de numere prietene i
le afieaz.

3. S se rezolve ecuaia f(x)=0, prin metoda tangentei, pornind cu un x
(0)
dat, i calculnd
x
(k+1)
=x
(k)
-f(x
(k)
)/f'(x(
(k)
) cu o precizie dat eps, care se atinge cnd |x
(k+1)
- x
(k)
| < eps).
Funciile f(x) i f(x) sunt date de programator.
4. Se consider funcia f(x) = ln (1 + x
2
). S se scrie un program care tabeleaz funcia pe n
intervale, fiecare interval fiind precizat prin capetele a i b i pasul de afiare h.
5. S se scrie toate descompunerile unui numr par ca o sum de dou numere prime. Se va utiliza o
funcie care stabilete daca un numr este sau nu prim.
6.S se scrie n C:
a) Un subprogram funcie pentru calculul valorii unei funcii f(x) pentru o valoare dat x, definit
astfel:
b) O funcie pentru calculul integralei definite:
44

'

> +

<

1 x x x 1
1 x 1 x 1
1 x x x 1
) x ( f
2
pentru
pentru
pentru
Valeriu Iorga Programare n C / C++
prin metoda trapezelor, cu n pai egali, pe intervalul [a,b], dup formula
unde h=(b-a)/n
c) Un program care calculeaz integrala unei funcii definite la punctul a), folosind funcia b), pe un
interval dat [p,q], cu precizia epsilon (se repet calculul integralei pentru n=10, 20,... pai, pn
cnd diferena dintre dou integrale succesive devine mai mic dect epsilon
7.Pentru un numr dat N s se afieze toi factorii primi ai acestuia i ordinul lor de multiplicitate.Se
va utiliza o funcie care extrage dintr-un numr un factor prim.
8. Utiliznd o funcie pentru calculul celui mai mare divizor comun a dou numere, s se
calculeze c.m.m.d.c. a n elemente ntregi ale unei liste date.
9. Pentru fiecare element al unei liste de numere ntregi date, s se afieze numrul prim cel mai
apropiat de el ca valoare. Dac dou numere prime sunt la distant egal de un element din list se vor
afia ambele numere prime.
45

b
a
dx ) x ( f I
1
]
1

+ + +

1 n
1 i
) ih a ( f ) b ( f ) a ( f
2
h
I