Sunteți pe pagina 1din 20

3

CURS
Sumar
Pointeri. Funcii
defnite de
utilizator
Declararea variabilelor pointer. Tipul
pointer (adres)
Tipul pointer
Aritmetica pointerilor
Alocare de memorie dinamic
Funcii defnite de utilizator
Prezentarea funciilor
Transmiterea parametrilor
Variabile locale i variabile !lobale
Probleme propuse spre rezolvare individual
Decararea varabeor ponter. Tpu ponter (adres)
Aa cum am mai spus, o varab este numele unei locaii de memorie, care este
apt de a pstra o valoare de un anumit tip (fiecare variabil are dou atribute importante:
valoarea sa curent i adresa de memorie). Programul descris, n urma compilrii, face
referin la fiecare locaie de memorie prin utilizarea unei adrese unice. Ponteru este o
variabil care conine o adres, adresa unic a unei locaii de memorie, cea la care am
fcut referire anterior.
u alte cuvinte, prin ponter se nelege o variabil care reine adrese ale altor
variabile de un anumit tip specificat. Ponteru este o adres la o locaie de memorie.
Dereferenerea unu ponter este este procesul de accesare a valorii la
o anumit locaie de memorie. Pentru a dereferenia valoarea unui pointer, se va utiliza
operatoru de redrectare (sau, dereferenere) ! asteriscul ( * ).
"
1. Tpu ponter
#ariabilele pointer intr n alctuirea tpuu ponter sau tpuu adres. Acesta
se scrie sub forma tip*, la care se ataeaz numele dorit al pointerilor.
$e e%emplu, declararea unei variabile pointer spre tipul ntreg se face prin
urmtoarea declaraie:
int a; //a este o varab ntreag
int * b ; /*nu are mportan pasarea caracteruu * nt*
b; nt *b; nt*b;*/
//se poate constru c:
b=&a;
&n acest caz transferul se face ntre adrese, adic cu alte cuvinte, adresa locaiei a devine adresa
b, fc'ndu!se i preluarea valorilor reinute la acestea.
$up caz, dac se dorete doar transfer ntre valori, se poate opta pentru declaraia de mai
(os:
a=*b; //respectv *b=a;(o exprese att L-vaue ct R-vaue)
&n acest caz, practic se lucreaz cu dou locaii de memorie, una cu numele a, iar alta ce are
adresa de memorie b, la ambele locaii fiind memorat aceeai valoare.
2. Artmetca ponteror
um spuneam, un pointer este o adres care indic spre o anumit valoare de un
anumit tip de memorie. )ai simplu, un pointer este o valoare care indic o anumit
locaie de memorie. $ac se adaug valoarea 1 unui pointer, pointerul va indica
urmtoarea locaie de memorie. $ac se adaug valoare 3 unui pointer, pointerul va
indica locaia de memorie care este cu trei locaii dup adresa curent.
&ns, aritmetica pointerilor nu este at't de simpl precum se crede. $e e%emplu, s
presupunem c un pointer conine adresa 12f0. $ac se adun valoare 1 la pointer,
ateptarea este ca rezultatul s fie 12f1. Adresa rezultat, ns, depinde de tipul
pointerului, i anume:
- dac se adaug 1 la o variabil pointer de tip char (care conine 12f0), adresa
rezultat este 12f1*
+
- dac se adun 1 la un pointer de tip int (care cere doi octei de memorie), adresa
rezultat este 12f2*
- dac se adaug 1 la un pointer de tip float (care cere patru octei), adresa rezultat
este 12f4.
Atunci c'nd se efectueaz operaii aritmetice cu pointeri, trebuie inut cont de tipul
pointerilor. &n plus, fa de adunarea de valori la pointeri, programele create pot scdea
valori sau pot scdea doi pointeri.
3. Aocare de memore dnamc
$ac spaiul de memorie este insuficient, adic dac la anumite adrese se incearc
memorarea unor date mai mari de doi octei (reprezent'nd ", bii pentru pointeri de tipul
far, cum se c-eam cei folosii p'n acum) se poate opta ptr. alocarea dinamic a
memoriei. Acest lucru se poate obine folosind funcia de bibliotec bibliotec malloc,
respectiv free pentru dealocare, ambele gsindu!se n stdlib.h i alloc.h.
.unciile de alocare, respectiv, dealocare, au antetele:
! funca de aocare dnamc:
#include<stdlib.h
!oid *malloc"si#e$t nr$octeti%;
unde, si#e$t este un tip determinat pentru alocare de memorie, iar, nr$octeti
specific numrul de octei care se doresc pentru alocare dinamic a respectivei variabile.
$ac funcia malloc reuete alocarea intervalului de octei, ea va returna un pointer la
nceputul intervalului, !oid*. $ac apare o eroare, funcia malloc va returna &'((.
! funca de deaocare dnamc:
#include<stdlib.h
!oid free"!oid* ptr%;
unde, ptr este un pointer la nceputul intervalului de memorie care se dorete a fi
eliberat.
/ variabil astfel declarat poart numele de varab dnamc, iar, zona de
declarare poart numele de zona Heap.
0
Exempu 1. 1%emplificare n declararea i folosirea variabilelor ponter.
a) 2ransferul se va face ntre adrese ale locaiilor de memorie, cu reinere simultan i a
valorilor reinute la acestea.
#ncude<stdo.h>
vod man()
{
nt a=1; /* a este o ocate de memore pentru eemente de tp nt pe
do octet, pe care am ntazat-o cu vaoarea 1 */
nt* b; /* b este o varaba ponter spre tpu nt, adca capaba
a retne adrese ae ator varabe de tpu speccat */
b=&a; /* n adresa b retnem adresa ocate de memore (adca, a
varabe) a, dec, cu ate cuvnte, b devne adresa ocate de
memore a */
prntf("Va a= %d\tVa b= %d\n",a,*b);
prntf("Adr a= %p\tAdr b= %p\n",&a,b);
}
Programul anterior va afia urmtoarele:
b) 2ransferul se va face doar ntre valori reinute la anumite locaii de memorie.
#ncude<stdo.h>
vod man()
{
nt a=1; /* a este o ocate de memore pentru eemente de tp nt pe
do octet, pe care am ntazat-o cu vaoarea 1 */
nt* b; /* b este o varaba ponter spre tpu nt, adca capaba
a retne adrese ae ator varabe de tpu speccat */
*b=a; /* trasnferu se face ntre vaor, s nu ntre adrese; cu
ate cuvnte, vaor retnute a adresa b atrbum vaoarea retnuta
n a */
prntf("Va a= %d\tVa b= %d\n",a,*b);
prntf("Adr a= %p\tAdr b= %p\n",&a,b);
}
Programul va afia:
3
Observae: $up cum se vede n primul caz vor coincide at't cele dou valori, c't i cele
dou adrese, pe c'nd n varianta a doua vor coincide doar valorile reinute.
Exempu 2. 2ransmiterea informaiilor prin intermediul adreselor.
4 se scrie rutine care intersc-imb dou valori ntregi, folosind n descrierea
programelor variabile pointer.
a) 5ntersc-imbarea se va face ntre adrese ale locaiilor de memorie, elementul au%iliar
intersc-imbrii fiind tot o adres.
#ncude<stdo.h>
vod man()
{
nt *a,*b,*c;
prntf("a= "); scanf("%d",a);
prntf("b= "); scanf("%d",b);
prntf("\nInante de nterschmbare:\n");
prntf("\tva a= %d\tva b= %d\n",*a,*b);
prntf("\tadr a= %p\tadr b= %p\n",a,b);
//nterschmbarea
c=a;
a=b;
b=c;
prntf("\nDupa nterschmbare:\n");
prntf("\tva a= %d\tva b= %d\n",*a,*b);
prntf("\tadr a= %p\tadr b= %p\n",a,b);
}
Pentru a fiind +, iar b fiind 0, programul va afia:
6
$in rezultatul de mai sus c prin intersc-imbare n e%emplul anterior, cele dou
variabile i vor intersc-imba at't adresele locaiilor, c't i valorile reinute la respectivele
locaii.
b) 5ntersc-imbarea se va face ntre adresee locaiilor de memorie, elementul au%iliar
intersc-imbrii nefiind o adres (un pointer).
#ncude<stdo.h>
vod man()
{
nt *a,*b,c;
prntf("a= "); scanf("%d",a);
prntf("b= "); scanf("%d",b);
prntf("\nInante de nterschmbare:\n");
prntf("\tva a= %d\tva b= %d\n",*a,*b);
prntf("\tadr a= %p\tadr b= %p\n",a,b);
c=*a; /* transfer ntre vaor, ptr ca expresa &c=a; nu ar fost
vada, nend o exprese L-vaue */
a=b;
b=&c;
prntf("\nDupa nterschmbare:\n");
prntf("\tva a= %d\tva b= %d\n",*a,*b);
prntf("\tadr a= %p\tadr b= %p\n",a,b);
}
Pentru a fiind +, iar b fiind 0, programul va afia:
unde, se poate observa ca doar valorile se intersc-imb, adresele nu, doar n sensul b spre
a.
c) 5ntersc-imbarea se va face ntre vaore reinute la locaiile de memorie ale
respectivelor adrese, elementul au%iliar intersc-imbrii fiind o adres (un pointer).
#ncude<stdo.h>
,
vod man()
{
nt *a,*b,*c;
prntf("a= "); scanf("%d",a);
prntf("b= "); scanf("%d",b);
prntf("\nInante de nterschmbare:\n");
prntf("\tva a= %d\tva b= %d\n",*a,*b);
prntf("\tadr a= %p\tadr b= %p\n",a,b);
*c=*a;
*a=*b;
*b=*c;
prntf("\nDupa nterschmbare:\n");
prntf("\tva a= %d\tva b= %d\n",*a,*b);
prntf("\tadr a= %p\tadr b= %p\n",a,b);
}
7ezultatul va fi:
unde, se poate observa c doar valorile se intersc-imb, adresele rm'n aceleai.
d) 5ntersc-imbarea se va face ntre vaore reinute la locaiile de memorie ale
respectivelor adrese, elementul au%iliar intersc-imbrii nefiind o adres (un pointer).
#ncude<stdo.h>
vod man()
{
nt *a,*b,c;
prntf("a= "); scanf("%d",a);
prntf("b= "); scanf("%d",b);
prntf("\nInante de nterschmbare:\n");
prntf("\tva a= %d\tva b= %d\n",*a,*b);
prntf("\tadr a= %p\tadr b= %p\n",a,b);
c=*a;
*a=*b;
*b=c;
8
prntf("\nDupa nterschmbare:\n");
prntf("\tva a= %d\tva b= %d\n",*a,*b);
prntf("\tadr a= %p\tadr b= %p\n",a,b);
}
Pentru a fiind dat +, iar b fiind dat 0, rezultatul va fi:
unde, se poate observa c doar valorile se intersc-imb, adresele rm'n aceleai.
Exempu 3. Aritmetica pointerilor.
a) 4 se scrie o rutin n pentru e%emplificarea aritmeticii n cazul pointerilor,
e%emplificare pe cazurile operaiilor de incrementare9decrementare, respectiv,
adunare9scdere de valori.
#ncude<stdo.h>
vod man()
{
nt a)*={10,20,30,40,50}; /* am decarat un sr de eemente de tp
nt pe care -am ntazat cu vaore aate n mutme */
nt* b; //b este ponter spre tpu nt
b=a; /* n adresa b retnem sru a; transferu se face asa,
deoarece a este o adresa prn numee sau, adresa prmuu eement dn
sr */
for(nt =1;<=5;++)
{
prntf("%d\n",*b); /* b-u prn transfer nd adresa prmuu
eement, rezutatu aceste expres va
prma vaoare dn sr, adca, 10 */
b++; //se face trecerea pe eementu urmator dn sr
}
//ne vom ntoarce cu ponteru de cursor a sruu n prma pozte b-=5; //se ma
putea scre s b=b-5;
prntf("prmu eement a sruu: %d\n",*b);
/* ne pastram pozta de pontare n sr, dar vrem sa asam eementu
:
a treea a sruu */
prntf("a treea eement a sruu: %d",*(b+2));
}
Programul va afia:
b) 4e va reface e%emplul anterior, astfel nc't prelucrarea s se fac asupra unui ir de
caractere prin prelucrare pe subiruri ale acestuia.
#ncude<stdo.h>
vod man()
{
char a||="ABCDE"; //sru a retne un sr de caractere, n numar de 5 char* b;
b=a;
for(nt =1;<=5;++)
{
prntf("%s\n",b); /* un r este o adres, ar, mesa|u acesta va
asa subsru ncepand cu prma pozte, adca "ABCDE" */
b++;
}
b-=5;
prntf("subsru ncepand cu prma pozte: %s\n",b);
prntf("subsru ncepand cu a trea pozte: %s",b+2);
}
Programul de mai sus va afia:
;
Exempu 4. )emoria ocupat de o variabil pointer de un anumit tip determinat.
4 vedem care este spaiul ocupat de o variabil a unui tip pointer spre un tip oarecare din cele
standard predefinite.
#ncude<stdo.h>
vod man()
{
prntf("Spatu ocupat n octet de catre:\n");
prntf("\tun ponter spre tpu <char>: %d\n",szeof(char*));
prntf("\tun ponter spre tpu <nt>: %d\n",szeof(nt*));
prntf("\tun ponter spre tpu <oat>: %d\n",szeof(oat*));
prntf("\tun ponter spre tpu <doube>: %d\n",szeof(doube*));
}
7ezultatul afiat va fi:
Exempu 5. Aocarea memore dnamce n ucru cu varabe ponter.
Aleg'nd una dintre cele 3 variante de program descrise mai sus n exempu 2 s se
realizeze un program care intersc-imb dou valori reae folosind variabile pointer.
#ncude<stdo.h>
#ncude<stdb.h> //sau, #ncude<aoc.h>
vod man()
{
doube *a,*b,*c;
/* vom crea varabe dnamce, adca varaba ce s vor pastra
memora extnsa ntr-o zona, numta zona HEAP */
a=(doube*)maoc(szeof(doube)); /* n zona HEAP am rezervat spatu
sucent pentru memorarea une varabe de tpu doube */ prntf("a= ");
scanf("%f",a);
b=(doube*)maoc(szeof(doube));
prntf("b= "); scanf("%f",b);
c=a; /* pentru c nu este nevoe sa aocam memore dnamca, pentru
ca c prmeste prn transfer de a a */
a=b;
b=c;
prntf("dupa nterschmbare: a= %.2f\tb= %.2f",*a,*b);
/* des n acest caz nu este necesar, pentru ca o varaba dnamca
"<
nu ma este vaba a sfarstu execute functe, totus no
putem opta pentru deaocare expcta pentru varabee create
dnamc */
free(a);
free(b);
}
Programul de mai sus va afia pentru dou valori arbitrar alese, urmtoarele:
Func dente de utzator
1. Prezentarea funcor
=tiam p'n acum c un program este o succesiune de funcii, din care una este cea
principal n rulare, i anume funcia main. Pe msur ce programele create vor deveni
mai mari i mai comple%e, munca programatorului se va putea simplifica i se va putea
mbuntii claritatea programelor, prin fragmentarea acestora n pri mai mici, numite
func. $eci, funciile pot fi cele principale n rulare (e%.: main), cele predefinite n limba(
(e%.: printf), sau cele dezvoltate de ctre programator.
$ac toate instruciunile ar fi plasate n cadrul funciei main, programul ar deveni foarte
lung i greu de neles. Pe msur ce dimensiunea programelor i comple%itatea lor crete,
crete i posibilitatea apariiei erorilor. $ac programul va fi fragmentat n pri mai mici,
mai uor de manevrat, erorile ar putea fi evitate. / funce este o colecie de instruciuni
care e%ecut o anumit sarcin.
.orma general a unei funcii este:
tip$re#ultat nume$functie "lista$parametri$formali%
+
//corpu functe cu decarate de varabe ocae )return
e,presie;*
-
- 2ipul rezultat poate s fie tipul !oid, unul din tipurile predefinite, un tip definit de
utilizator, un tip pointer sau un tip structur.
""
- >n parametru este o informaie pe care programul o transmite funciei. ?ista
parametrilor formali este de forma:
tip
1
param
1
. tip
2
param
2
. tip
3
param
3
. /. tip
n
param
n
1%ist posibilitatea ca lista parametrilor formali s fie vid.
- 5eirea dintr!o funcie se poate face cu return, care dac este nsoit de o e%presie
ntoarce o anumit valoare la funciile a cror tip rezultat este diferit de cel vid.
/rice funcie declarat are trei zone: zona declarativ sau antetul funciei sau
prototipul funciei, zona definitiv sau corpul funciei i zona de apel. &n multe din cazuri zona
declarativ se confund cu cea definitiv.
Antetul (prototipul) unei funcii are urmtorul format:
tip$re#ultat nume$functie "tip
1
. tip
2
. tip
3
. /. tip
n
%;
plas'ndu!se n program naintea etapei de descriere a funciei.
/ funcie se apeleaz prin numele su, care dup caz, dac ntoarce un rezultat se poate
atribui unei variabile de tipul specificat n rezultat. &n zona de apel linia de parametri se
c-eam linie de parametr actua, care trebuie s coincid n numr, tip i aezare cu cei
formali.
2. Transmterea parametror
2ransmiterea parametrilor prin intermediul funciilor se poate face prin valori sau prin
adrese.
&n cazul apeuu prn vaoare, compilatorul va da funciei o copie a valorii
parametrului. .olosind apelul prin valoare, orice modificare a parametrului va e%ista
numai n interiorul funciei apelate. ?a sf'ritul e%ecuiei funciei, valoarea variabilelor care i!
au fost transmise rm'ne nemodificat n funcia apelant.
$e e%emplu, programul de mai (os (exempu 6, varanta a) transmite trei
parametri (variabilele a, b i c) funciei modific, care va afia valorile, le va aduga 10 i apoi
va afia rezultatul. $up e%ecuia funciei, programul va afia valorile variabilelor. $eoarece
se folosete apelul prin valoare, funcia nu modific valorile variabilelor n cadrul funciei
apelante, dup cum se vede n rezultatul de mai (os.
'nd se transmit parametrii ctre o funcie, compilatorul de 9@@ plaseaz
valorile corespunztoare ntr!o stv. &n e%emplul nostru de mai (os, n cazul variabilelor
"+
a, b i c stiva conine valorile 1, 2 i 3. 'nd funcia sc-imb valoarea unui parametru,
modific valoarea din stiv asociat acestuia.
'nd se nc-eie e%ecuia funciei, compilatorul descarc valorile din stiv i nu mai
sunt luate n considerare modificrile pe care funcia le!a efectuat n locaiile stivei. .uncia nu
face niciodat referire la locaiile de memorie care conin valorile variabilelor, astfel c
modificrile parametrilor primii n urma unui apel prin valoare nu vor mai e%ista dup
nc-eierea e%ecuiei funciei.
Exempu 6.
2ransferul parametrilor prin valoare, respectiv, prin adres n cazul funciilor propriu
descrise.
a) 2ransferul parametrilor prin valoare.
#ncude<stdo.h>
vod modca(nt x, nt y, nt z)
{
prntf("Vaor ntae n functe: %d %d %d\n",x,y,z);
x+=10;
y+=10;
z+=10;
prntf("Vaor nae n functe: %d %d %d\n",x,y,z);
}
vod man()
{
nt a=1,b=2,c=3;
prntf("Vaor ntae n program: %d %d %d\n",a,b,c); modca(a,b,c);
prntf("Vaor nae n program: %d %d %d\n",a,b,c);
}
Programul de mai sus va afia:
&n multe din cazuri funciile create vor avea ca scop modificarea valorile
variabilelor transmise prin parametri. &n cazul funciilor care modific valorile
"0
parametrilor n program, la sf'ritul e%ecuiei lor, te-nica folosit va trebui s fie cea a
apeuu prn adres.
$iferena ntre apelul prin valoare i cel prin adres este c, folosind apelul prin
valoare, funcia primete o copie a valorii unui parametru, pe c'nd, n cazul apelului prin
adres, funcia primete adresa de memorie a variabilei. $e aceea, funciile ce transmit
parametri prin adres pot s modifice valoarea pstrat ntr!o locaie de memorie (adic,
valoarea variabilei), iar modificarea rm'ne i dup terminarea e%ecuiei funciei. Pentru
a utiliza apelul prin adres, programul creat trebuie s foloseasc ponter.
b) 2ransferul parametrilor prin adres.
#ncude<stdo.h>
vod modca(nt* x, nt* y, nt* z)
{
prntf("Vaor ntae n functe: %d %d %d\n",*x,*y,*z); *x+=10;
*y+=10;
*z+=10;
prntf("Vaor nae n functe: %d %d %d\n",*x,*y,*z);
}
vod man()
{
nt a=1,b=2,c=3;
prntf("Vaor ntae n program: %d %d %d\n",a,b,c);
modca(&a,&b,&c);
prntf("Vaor nae n program: %d %d %d\n",a,b,c);
}
Programul anterior va afia:
3. Decararea varabeor
$in punctul de vedere al declarrii variabilelor acestea se mpart n dou categorii:
- varabe ocae ! sunt variabilele primite ca parametru sau declarate n corpul unei
funcii, fiind viabile din momentul declarrii i p'n la sf'ritul e%ecuiei funciei.
Aona de memorie a acestora poart numele de segment stv*
"3
- varabe gobae ! sunt variabile cu vizibilitate ntr!un ntreg program, din momentul
declarrii i p'n la sf'ritul e%ecuiei acestuia. Aona de memorie a acestora poart
numele de segment de date.
Atunci c'nd situaia o cere se poate apela la zona e%tins de memorare, numit zona
Beap, prin folosirea varabeor dnamce.
&n sintetizarea celor de mai sus, propunem urmtorul tabel:
Tp varab Cas de memorare Vzbtate durat de va. Caracterstc
#ariabile globale segmentul de date ! n cazul declaraiilor naintea tuturor funciilor acestea
sunt vizibile n ntreg programul fiier
! static
! o variabil global este automat iniializat cu < la
declarare
#ariabile locale segmentul de stiv ! vizibilitate local, adic la nivel de subprogram
#ariabile dinamice zona Beap ! dinamic, determinat de utilizator
Exempu 7.
4e va scrie un program care va realiza intersc-imbarea coninutului a dou variabile ce pot
reine valori reale. Programul va defini funcii de citire i afiare pentru un numr real,
precum i o funcie proprie pentru intersc-imbarea coninutului variabilelor, cu rm'nerea
rezultatului i n afara e%ecuiei funciei.
#ncude<stdo.h>
//ctrea une varabe reae
vod ctre(oat* x, char c)
{
prntf("dat vaoarea %c: ",c);
scanf("%f",x);
}
//asarea contnutuu une varabe reae vod
asare(oat x, char c)
{
prntf("vaoarea dn %c este: %.2f\n",c,x);
}
//functe de nterschmbare a contnutuu unor doua varabe reae vod
nterschmba(oat* x, oat* y)
{
oat z;
//nterschmbarea se va face ntre vaor retnute a adrese
z=*x;
*x=*y;
*y=z;
}
"6
vod man()
{
oat a,b;
ctre(&a,'a');
ctre(&b,'b');
prntf("\nINITIAL:\n");
asare(a,'a');
asare(b,'b');
prntf("\nDUPA INTERSCHIMBARE:\n");
nterschmba(&a,&b);
asare(a,'a');
asare(b,'b');
}
Programul anterior va afia, pentru dou valori arbitrar alese, urmtoarele:
/bservaii:
". &n cazul intersc-imbrii se cere transferul parametrilor prin adres, dat fiind faptul
c doar aceast posibilitate permite programului modificarea valorilor transmise
din funcie prin intermediul parametrilor.
+. &n programul de mai sus nu am folosit alocare dinamic, precum ntr!un caz
anterior, deoarece prin declaraia oat a,b s!a rezervat spaiu suficient pe stiv
pentru cele dou variabile.
Exempu 8.
e se nt'mpl, n cazul aplicaiei anterioare, dac variabilele sunt declarate globalC
a) declarate de un tip standard definit.
#ncude<stdo.h>
",
oat a,b;
//functe de ctre a ceor doua varabe vod ctre()
{
prntf("dat a: ");
scanf("%f",&a);
prntf("dat b: ");
scanf("%f",&b);
}
//functe de asare
vod asare()
{
prntf("vaore sunt: a=%.2f, b=%.2f\n",a,b);
}
//functe de nterschmbare
vod nterschmba()
{
oat c;
c=a;
a=b;
b=c;
}
vod man()
{
ctre();
asare();
prntf("\n");
nterschmba();
asare();
}
//functe cu transfer a parametror prn adresa
Pentru dou valori arbitrar alese, programul va afia:
b) declarate de tip pointer spre un tip real.
#ncude<stdo.h>
#ncude<stdb.h>
oat*a,*b;
vod aocare()
{
a=(oat*)maoc(szeof(oat));
"8
b=(oat*)maoc(szeof(oat));
}
vod ctre()
{
aocare();
prntf("dat a: ");
scanf("%f",a);
prntf("dat b: ");
scanf("%f",b);
}
vod asare()
{
prntf("vaore sunt: a=%.2f, b=%.2f\n",*a,*b);
}
vod nterschmba()
{
oat c;
c=*a;
*a=*b;
*b=c;
}
vod man()
{
ctre();
asare();
prntf("\n");
nterschmba();
asare();
}
Exempu 9.
4 se urmreasc programul de mai (os:
#ncude<stdo.h>
nt a,b;
nt f(nt m,nt n)
{
m=n+b;
n+=1;
return n+b+m;
}
vod man()
{
a=6;
b=5;
prntf("%d %d ",a,b);
prntf("%d ",f(a,b));
":
prntf("%d %d ",a,b);
}
e valori afiseaza programulC R: 6 5 21 6 5
e valori s!ar afisa, daca antetul functiei ar fi: int f"int *m.int *n% C
R: 6 5 22 10 6
Exempu 10.
4e cere a se scrie funcii ce vor calcula suma cifrelor unui numar ntreg si inversul sau.
.unciile se vor scrie cu prototip (zona declarativ difereniat de cea definitiv).
#ncude<stdo.h>
//n acest caz rezutatu se va transmte prn tpu rezutat nt s_c(nt);
//suma cfreor unu nr. ntreg
//n acest caz rezutatu se va transmte prn na de parametr vod n_(nt, nt*);
//nversu unu nr. ntreg
vod man()
{
nt n, suma_cfreor=0, nr_nvers=0;
prntf("dat n: ");
scanf("%d",&n);
suma_cfreor=s_c(n);
prntf("\nSuma cfreor sae este: %d",suma_cfreor);
n_(n,&nr_nvers);
prntf("\nInversu sau este: %d",nr_nvers);
}
/* suma cfreor unu numar ntreg:
Presupunem nr. dort ca nd 523 ptr. care sa cacuam suma cfreor 523 : 10 = 52 rest
3
Suma cfreor ntermedara: 0+3=3
52 : 10 = 5 rest 2
Suma cfreor ntermedara: 3+2=5
5 : 10 = 0 rest 5
Suma cfreor naa: 5+5=10
*/
nt s_c(nt n)
{
nt sc;
whe (n)
{
sc=sc+n%10;
n/=10;
}
return sc;
}
";
/* nversu unu numar ntreg:
Presupunem nr. dort ca nd 523 ptr. care dorm sa- aam nversu 523 : 10 = 52 rest
3
Numaru nvers ntermedar: 0*10+3=3 52 :
10 = 5 rest 2
Numaru nvers ntermedar: 3*10+2=32 5 : 10
= 0 rest 5
Numaru nvers na: 32*10+5=325
*/
vod n_(nt n, nt* n)
{
whe (n)
{
*n=*n*10+n%10;
n/=10;
}
}
Probeme propuse
1. 4 se rescrie, cu eventuale modificri aplicaiile prezente n setul de aplicaii
rezolvate.
2. .olosind o funcie s se realizeze un program care calculeaz urmtoarea
e%presie:
("@ D @ "90@ E @F@"9n)
n
, unde n este un ntreg dat de la tastatur.
3. 4 se realizeze un program care calculeaGa prin intermediul a dou funcii
cmmdc!ul i cmmmc!ul a du numere date de la tastatur.
4. 4 se realizeze adunarea i nmulirea a dou numere reale folosind variabile de
tipul pointer.
5. 4criei o funcie care primete ca parametru lungimea laturii unui ptrat i
returneaz aria sa i o funcie care returneaz diagonala.
6. 4criei o funcie care primete 0 parametri de tip real, cu semnificaia de lungimi
pentru 0 segmente. .uncia va returna ", dac cele trei segmente pot forma un
triung-i i <, n caz contrar.
7. 4criei o funcie care returneaz ultima cifr a unui numr natural. $e e%emplu,
dac numrul este +03, funcia va returna 3.
+<