capitolul6.doc

Upload: stinga-octavian

Post on 07-Jul-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/18/2019 capitolul6.doc

    1/33

    CAPITOLUL 6Funcţii

    FUNCŢII

    6.1. Structura unei funcţii 6.4. Tablouri ca parametri

    6.2. Apelul şi prototipul unei funcţii 6.. Funcţii cu parametri impliciţi6.!. Tran"ferul parametrilor unei funcţii 6.6. Funcţii cu num#r $ariabil %e parametri

    6.!.1.Tran"ferul parametrilor prin $aloare 6.&. Funcţii pre%efinite6.!.2.Tran"ferul prin pointeri 6.'. Cla"e %e memorare6.!.!.Tran"ferul prin referinţ# 6.(. )o%uri %e alocare a memoriei6.!.4.Tran"ferul parametrilor c#tre funcţiamain

    6.1*.Funcţii recur"i$e6.11.+ointeri c#tre funcţii

    6.1. ST,UCTU,A UN-I FUNCŢII

    Un program scris în limbajul C/C++ este un ansamblu de funcţii, fiecare intre acestea efectu!n o acti"itate bine efinit#$ %in punct e "eere conceptual,  funcţia  repre&int# o aplicaţie definită pe o mulţime D(D=mulţimea, domeniul de definiţie), cu valori în mulţimea C (C=mulţimea de valori, codomeniul), careîndeplineşte condiţia că oricărui element din D îi corespunde un unic element din C.

    'unc(iile comunică prin argumennte) ele primesc ca parametri *argumente atele e intrare, efectuea prelucr#rile escrise în corpul func(iei asupra acestora i pot returna o "aloare *re&ultatul, atele e ieire$-.ecu(ia programului începe cu func(ia principal#, numit# main$ 'unc(iile pot fi escrise în carul aceluiaifiier, sau în fiiere iferite, care sunt testate i compilate separat, asamblarea lor reali&!nuse cu ajutorullin0eitorului e leg#turi$

    O func(ie este formata in antet si corp)

    antet_funcţie{

    corpul_funcţiei}

    1au)tip_val_return nume_func (lista_declaraţiilor_param_ formali){

    declaraţii_variabile_localeinstrucţiunireturn valoare

    }Prima linie repre&int# antetul  func(iei, în care se inic#) tipul func(iei, numele acesteia i lista eclara(iilor 

     parametrilor formali$ La fel ca un operan sau o e.presie, o func(ie are un tip, care este at e tipul "aloriireturnate e func(ie în func(ia apelant#$ %ac# func(ia nu întoarce nici o "aloare, în locul tip_vali_return sespecific# void $ %ac# tip_val_return lipsete, se consier#, implicit, c# acesta este int$ ume_funcţie este unientificator$

     !ista_declaraţiilor_param_formali *încarat# între parante&e rotune const# întro list# *enumerare carecon(ine tipul i ientificatorul fiec#rui parametru e intrare, esp#r(ite prin "irgul#$ Tipul unui parametru poatefi oricare, c2iar i tipul pointer$ %ac# lista parametrilor formali este "i#, în antet, up# numele func(iei, apar oar parante&ele ( ), sau (void)$

    Corpul funcţiei este un bloc, care implementea algoritmul e calcul folosit e c#tre func(ie$ 3n corpulfunc(iei apar *în orice orine eclara(ii pentru "ariabilele locale i instruc(iuni$ %ac# func(ia întoarce o"aloare, se folosete instruc(iunea return valoare$ La e.ecu(ie, la înt!lnirea acestei instruc(iuni, se

    re"ine în func(ia apelant#$3n limbajul C/C++ se utili&ea declaraţii şi definiţii e func(ii$

    45

    6

  • 8/18/2019 capitolul6.doc

    2/33

    CAPITOLUL 6Funcţii

     Declaraţia  con(ine antetul func(iei i informea compilatorul asupra tipului, numelui func(iei i a listei parametrilor formali *în care se poate inica oar tipul parametrilor formali, nu i numele acestora$%eclara(iile e func(ii se numesc prototipuri , i sunt constituite in antetul func(iei, in care pot lipsi numele

     parametrilor formali$ Definiţia  con(ine antetul func(iei i corpul acesteia$ u este amis# efinirea unei func(ii în corpul alteifunc(ii$

    O form# în"ec2it# a antetului unei func(ii este aceea e a specifica în lista parametrilor formali oar numeleacestora, nu i tipul$ Aceast# libertate în omiterea tipului parametrilor constituie o surs# e erori$tipul_valorii_returnate nume_funcţie (lista_parametrilor_ formali)declararea_parametrilor_formali{declaraţii_variabile_localeinstrucţiunireturn valoare}

    6.2. A+-U /I +,0T0TI+U FUNCŢII0, O func(ie poate fi apelată printro construc(ie urmat# e punct i "irgul#, numit# instrucţiune de apel , eforma)

    nume_funcţie (lista_parametrilor_efectivi);Parametrii efecti"i trebuie s# corespun# cu cei formali ca orine i tip$ La apel, se atribuie parametrilor formali "alorile parametrilor efecti"i, up# care se e.ecut# instruc(iunile in corpul func(iei$ La re"enirea infunc(ie, controlul este reat func(iei apelante, i e.ecu(ia continu# cu instruc(iunea urm#toare instruc(iunii eapel, in func(ia apelant#$ O alt# posibilitate e a apela o func(ie este aceea în care apelul func(iei constituieoperanul unei e.presii$ Acest lucru este posibil oar în ca&ul în care func(ia returnea o "aloare, folosit# încalculul e.presiei$

    Parametrii eclara(i în antetul unei func(ii sunt numi(i formali , pentru a sublinia faptul c# ei nu repre&int#"alori concrete, ci numai (in locul acestora pentru a putea e.prima procesul e calcul reali&at prin func(ie$ -ise concreti&ea la e.ecu(ie prin apelurile func(iei$Parametrii folosi(i la apelul unei func(ii sunt parametri reali, efectivi, concreţi , iar "alorile lor "or fi atribuite

     parametrilor formali, la e.ecu(ie$ Utili&area parametrilor formali la implementarea func(iilor i atribuirea e"alori concrete pentru ei, la e.ecu(ie, repre&int# un prim ni"el e abstracti&are în programare$ Acest mo e

     programare se numete programare procedurală i reali&ea un proces e abstractizare prin parametri $

    7ariabilele eclarate în interiorul unei func(ii, c!t i parametrii formali ai acesteia nu pot fi accesa(i ec!t îninteriorul acesteia$ Aceste "ariabile sunt numite variabile locale i nu pot fi accesate in alte func(ii$ %omeniule "i&ibilitate a unei "ariabile este por(iunea e co la a c#rei e.ecu(ie "ariabila respecti"# este accesibil#$%eci, omeniul e "i&ibilitate a unei "ariabile locale este func(ia în care ea a fost efinit# *"e&i i paragraful

    6$8$$ Exemplu:int f1(void){ double a,b; int c;. . .return c; // a, b, c "ariabile locale, "i&ibile oar în corpul func(iei}void main(){ . . . . . .  // "ariabile a i b nu sunt accesibile în main*9

    %ac# în interiorul unei func(ii e.ist# instruc(iuni compuse *blocuri care con(in eclara(ii e "ariabile, aceste"ariabile nu sunt "i&ibile în afara blocului$

     Exemplu:void main(){ int a=1, b=2;

    4:

  • 8/18/2019 capitolul6.doc

    3/33

    CAPITOLUL 6Funcţii

     cout

    include

     Exerciţiu:  1# se scrie un program care citete ou# numere i afiea cele mai mare i"i&or comun alacestora, folosin o func(ie care îl calculea$

    include cout

     Exerciţiu:  1# se calcule&e "aloarea lui ?, u i m fiin citite e la tastatur#)>=2ω   ( 2 ϕ (u) B 1, m) B ω   (2 u : , m B 1), une)

    ω  (,n) = sin* + cos* +i" i"i

    n

    :5=

    ∑ , ϕ () = :5   "e−+ , ω  A C 8 → C,   ϕ A C → C

    include

  • 8/18/2019 capitolul6.doc

    4/33

    CAPITOLUL 6Funcţii

    { double s=:; int i;for (i=1; i; int m; cout=!

    1imilar cu eclara(ia e "ariabil#, omeniul e "alabilitate *"i&ibilitate a unei func(ii este) fiierul surs#, ac# eclara(ia func(iei apare în afara oric#rei func(ii *la ni"el global func(ia sau blocul în care apare eclara(ia$

    6.!. T,ANSF-,U +A,A)-T,I0, UN-I FUNCŢII

    'unc(iile comunic# între ele prin argumente *parametrii$

    -.ist# urm#toarele mouri e transfer *transmitere a parametrilor c#tre func(iile apelate) Transfer prin "aloare Transfer prin pointeri Transfer prin referin(#$

    4B

  • 8/18/2019 capitolul6.doc

    5/33

    CAPITOLUL 6Funcţii

    6.!.1. T,ANF-,U +A,A)-T,I0, +,IN A0A,-

    3n e.emplele anterioare, parametrii e la func(ia apelant# la func(ia apelat# au fost transmii prin valoare$ %ela programul apelant c#tre func(ia apelat#, prin apel, se transmit "alorile partametrilor efecti"i, reali$ Aceste"alori "or fi atribuite, la apel, parametrilor formali$ %eci proceeul e transmitere a parametrilor prin "aloareconst# în încărcarea valorii parametrilor efectivi în #ona de memorie a parametrilor formali (în stivă) $ La

    apelul unei func(ii, parametrii reali trebuie s# corespun# ca orine i tip cu cei formali$

     Exerciţiu:  1# se scrie urm#torul program *care ilustrea leg#tura intre pointeri i "ectori i s# seurm#reasc# re&ultatele e.ecu(iei acestuia$

    void f1(float intr,int nr)// intr, nr parametri formali{for (int i=:; i

  • 8/18/2019 capitolul6.doc

    6/33

    CAPITOLUL 6Funcţii

    6.!.2. T,ANSF-,U +A,A)-T,I0, +,IN +0INT-,I

    3n unele ca&uri, parametrii transmii unei func(ii pot fi pointeri *"ariabile care con(in arese$ 3n aceste ca&uri, parametrii formali ai func(iei apelate "or fi ini(iali&a(i cu "alorile parametrilor efecti"i, eci cu "alorile unor arese$ Astfel,  funcţia apelată  poate modifica  conţinutul locaţiilor spre care pointea#ă argumentele(pointerii)$

     Exerciţiu: 1# se citeasc# : "alori întregi i s# se intersc2imbe cele ou# "alori$ 1e "a folosi o func(ie eintersc2imbare$

    include cout

  • 8/18/2019 capitolul6.doc

    7/33

    CAPITOLUL 6Funcţii

     Exerciţiu: 1# se scrie urm#torul program i s# se urm#reasc# re&ultatele e.ecu(iei acestuia$include

    6.!.2.1. Funcţii care returnea# pointeri

    7aloarea returnat# e o func(ie poate fi pointer, aa cum se obser"# în e.emplul urm#tor) Exemplu:

    include

  • 8/18/2019 capitolul6.doc

    8/33

    CAPITOLUL 6Funcţii3n e.emplul urm#tor efinim "ariabila br , variabilă referinţă c#tre "ariabila b$ 7ariabilele b i br  se g#sesc,în memorie, la aceeaşi ares# i sunt "ariabile sinonime$

     Exemplu:include

  • 8/18/2019 capitolul6.doc

    9/33

    CAPITOLUL 6Funcţii

    3n limbajul C++ acceai func(ie e permutare se poate efini cu parametri formali e tip referinţă$

    void rscimb(double I, double I9)

    { int t=; =9; 9=t; }void main(){ double a=/.L, b=&.L;. . . . . . . . . . . . . . .rscimb(a, b); // apel func(ie. . . . . . . . . . . . . . . }

    3n acest ca&, . i ? sunt sinonime cu a i b *nume iferite pentru aceleai grupuri e loca(ii e memorie$Intersc2imbarea "alorilor "ariabilelor e . i ? înseamn# intersc2imbarea "alorilor "ariabilelor a i b *fig$6$6$$

    Compar!n func(iile pscimb i rscimb, se obser"# c# iferen(a intre ele const# în moul e eclarare a

     parametrilor formali$ 3n ca&ul func(iei pscimb parametrii formali sunt pointeri *e tip >ouble, în ca&ulfunc(iei rscimb, parametrii formali sunt referinţe  c#tre ate e tip ouble$ 3n ca&ul transferului parametrilor prin referin(#, parametrii formali ai func(iei refer# aceleai loca(ii e memorie *sunt sinonime pentru parametrii efecti"i$

    Compar!n cele trei mouri e transmitere a parametrilor c#tre o func(ie, se poate obser"a)5$ La apelul prin valoare transferul atelor este unidirecţional , aic# "alorile se transfer# numai e la func(ia

    apelant# c#tre cea apelat#$ La apelul  prin referinţă  transferul atelor este bidirecţional , eoarece omoificare a parametrilor formali etermin# moificarea parametrilor efecti"i, care sunt sinonime *au numeiferite, ar refer# aceleai loca(ii e memorie$

    :$ La transmiterea parametrilor prin valoare, ca parametrii efecti"i pot apare e"presii sau nume de variabile$La transmiterea parametrilor prin referinţă, ca parametri efecti"i nu pot apare e.presii, ci doar nume de

    variabile$ La transmiterea parametrilor prin pointeri, ca parametri efecti"i pot apare e.presii e pointeri$@$ Transmiterea parametrilor unei func(ii prin referin(# este specific# limbajului C++$B$ Limbajul C este numit limbajul apelului prin "aloare$ Apelul poate e"eni, îns#, apel prin referinţă în ca&ul

    "ariabilelor simple, folosin pointeri, sau aa cum "om "eea în paragraful 6$B$, în ca&ul în care parametruefecti" este un tablou$

  • 8/18/2019 capitolul6.doc

    10/33

    CAPITOLUL 6Funcţii

    {cout

  • 8/18/2019 capitolul6.doc

    11/33

    CAPITOLUL 6Funcţii

    cout

  • 8/18/2019 capitolul6.doc

    12/33

    CAPITOLUL 6Funcţii

    for (int ind=:; ind

  • 8/18/2019 capitolul6.doc

    13/33

    CAPITOLUL 6Funcţii

    //GHj;:5$56 GHj+5;=:$:tMSN=1::; 0(tBSB1)=2::; MSN=::; 0(BSB1)=/::;cout

  • 8/18/2019 capitolul6.doc

    14/33

    CAPITOLUL 6Funcţii

    int min_tab(int aMNM1:N, int nr_lin, int nr_col){int elm=aM:NM:N;for (int il=:; il

  • 8/18/2019 capitolul6.doc

    15/33

    CAPITOLUL 6Funcţii"aloarea acestuia, negij!nuse astfel "aloarea implicit# a parametrului formal$ 3n e.emplul anterior, la apelul)

    int div=cmmdc(&); "a lua "aloarea =, iar 9 "a lua "aloarea 5 *implicit#$

    %ac# în lista e parametri formali ai unei func(ii e.ist# i parametri implici(i i parametri neiniţiali#aţi, parametrii implici(i trebuie s# ocupe ultimele po&i(ii în list#, nefiin permis# intercalarea acestora printre

     parametrii neini(iali&a(i$

    6.6. FUNCŢII CU NU)5, A,IAI 7- +A,A)-T,I

    3n limbajele C i C++ se pot efini func(ii cu un num#r "ariabil e parametri$ Parametrii care trebuie s# fie pre&en(i la orice apel al func(iei se numesc parametri ficşi , ceilal(i se numesc parametri variabili $ Parametriifici prece parametrii "ariabili$ Pre&en(a parametrilor "ariabili se inic# în antetul func(iei prin trei punctecare se scriu up# ultimul parametru fi. al func(iei$

    %e e.emplu, fie antetul func(iei numite vVrf)void vVrf (int n, double a, . . . )

    'unc(ia vVrf  are doi parametri ficşi  *n  i a  i  parametri variabili , pentru care nu se preci&ea în prealabil num#rul i tipul num#rul i tipul parametrilor "ariabili ifer# e la un apel la altul$

    'unc(iile cu un num#r "ariabil e parametri sunt, e obicei, func(ii e bibliotec# *e.) printf, scanf i seefinesc folosin nite macrouri speciale care permit accesul la parametrii "ariabili i se g#sesc în 2eaerulstdarD.$

    6.&. FUNCŢII +,-7-FINIT-

    Orice meiu e programare este pre"#&ut cu una sau mai multe biblioteci e func(ii preefinite$ Orice bibliotec# este format# in) fiierele 2eaer *con(ine prototipurile func(iilor, eclara(iile e "ariabile  biblioteca *ar2i"a propriu&is# *con(ine efini(ii e func(ii$

    Pentru ca func(iile preefinite s# poat# fi utili&ate, fiierele 2eaer în care se g#sesc prototipurile acestoratrebuie inclus în func(ia *programul apelant printro irecti"# preprocesor *e.emplu include

  • 8/18/2019 capitolul6.doc

    16/33

    CAPITOLUL 6Funcţii

    Seturnea un real care repre&int# cel mai apropiat num#r, f#r# &ecimale, mai mic sau egal cu. *rotunjire prin lips#$

    double ceil(double x);

    Seturnea un real care repre&int# cel mai apropiat num#r, f#r# &ecimale, mai mare sau egalcu . *rotunjire prin aaos$

     Funcţii tri9onometricedouble sin(double x);Seturnea "aloarea lui sin*., une . este at în raiani$ um#rul real returnat se afl# îninter"alul H5, 5$

    double cos(double x);

    Seturnea "aloarea lui cos*., une . este at în raiani$ um#rul real returnat se afl# îninter"alul H5, 5$

    double tan(double x);

    Seturnea "aloarea lui tg*., une . este at în raiani$

    Funcţii tri9onometrice in$er"edouble asin(double x);

    Seturnea "aloarea lui arcsin*., une . se afl# în inter"alul H5, 5$ um#rul real returnat*în raiani se afl# în inter"alul Hpi/:, pi/:$double acos(double x);

    Seturnea "aloarea lui arccos*., une . se afl# în inter"alul H5, 5$ um#rul real returnatse afl# în inter"alul HF, pi$

    double atan(double x);

    Seturnea "aloarea lui arctg*., une . este at în raiani$ um#rul real returnat se afl# îninter"alul HF, pi$

    double atan(double y, double x);

    Seturnea "aloarea lui tg*?/., cu e.cep(ia faptului ca semnele argumentelor . i ? permitstabilirea caranului i . poate fi &ero$ 7aloarea returnat# se afl# în inter"alul Hpi,pi$ %ac# .i ? sunt cooronatele unui punct în plan, func(ia returnea "aloarea ung2iului format e

    reapta care unete originea a.elor carte&iene cu punctul, fa(# e a.a absciselor$ 'unc(iafolosete, easemenea, la transformarea cooronatelor carte&ine în cooronate polare$

    Funcţii e3ponenţiale şi lo9aritmicedouble exp(double x);long double exp(long double x);

    Seturnea "aloarea e  " $double log(double x);

    Seturnea logaritmul natural al argumentului * ln*. $double log-(double x);

    Seturnea logaritmul &ecimal al argumentului *lg *. $double pow(double baa, double exponent);

    Seturnea un real care repre&int# re&ultatul riic#rii ba&ei la e.ponent * ba#a onent e.p $double s/rt(double x);

    Seturnea r##cina p#trat# a argumentului   " $double hypot(double x, double y);

    'unc(ia istan(ei eucliiene returnea ::  ) "   + , eci lungimea ipotenu&ei unui triung2ireptung2ic, sau istan(a punctului P*., ? fa(# e origine$

    Funcţii %e 9enerare a numerelor aleatoareint rand(void) stdlib.h+  

    enerea un num#r aleator în inter"alul HF, SA%QEA$

    6.&.2. Funcţii %e cla"ificare :te"tare; a caracterelor

    86

  • 8/18/2019 capitolul6.doc

    17/33

    CAPITOLUL 6FuncţiiAu prototipul în 2eaerul  ctype.h+ . Toate aceste func(ii primesc ca argument un caracter i returnea

    un num#r întreg care este po&iti" ac# argumentul îneplinete o anumit# coni(ie, sau "aloarea &eroac# argumentul nu îneplinete coni(ia$

    int isalnum(int c);

    Seturnea "aloare întreag# po&iti"# aca argumentul este liter# sau cifr#$ -c2i"alent# cu)

    isalpa(c)isdiDit(c)int isalpha(int c);Testea ac# argumentul este liter# mare sau mic#$ -c2i"alent# cu isupper(c)isloer(c).

    int iscntrl(int c);

    Testea ac# argumentul este caracter e control *neimprimabil$int isdigit(int c);

    Testea ac# argumentul este cifr#$int isxdigit(int c)<

    Testea ac# argumentul este cifr# 2e.agesimal# *F=, af, A'$int islower(int c);

    Testea ac# argumentul este liter# mic#$

    int isupper(int c);Testea ac# argumentul este liter# mare$

    int ispunct(int c);Testea ac# argumentul este caracter e punctua(ie *caracter imprimabil, ar nu liter# sauspa(iu$

    int isspace(int c);

    Testea ac# argumentul este spa(iu alb *M M, MNnM, MNtM, MN"M, MNrMint isprint(int c);

    Testea ac# argumentul este caracter imprimabil, inclusi" blancul$

    6.&.!. Funcţii %e con$er"ie a caracterelor *prototip în ctype.h+ int tolower(int c);

    'unc(ia sc2imb# caracterul primit ca argument in liter# mare, în liter# mic# i returneacoul A1CII al literei mici$ %ac# argumentul nu este liter# mare, coul returnat este c2iar coul argumentului$

    int toupper(int c);

    'unc(ia sc2imb# caracterul primit ca argument in liter# mic#, în liter# mare i returneacoul acesteia$ %ac# argumentul nu este liter# mic#, coul returnat este c2iar coulargumentului$

    6.&.4. Funcţii %e con$er"ie %in şir =n num#r :%e citire a unui num#r %intr>un şir; *prototip în stdlib.h+)

    long int atol(const char *npr );'unc(ia con"ertete irul transmis ca argument *spre care pointea npr întrun num#r cu

    semn, care este returnat ca o "aloare e tipul long int$ Virul poate con(ine caracterele JBJ sauJJ$ 1e consier# c# num#rul este în ba&a 5F i func(ia nu semnali&ea e"entualele erori eep#ire care pot apare la con"ersia in ir în num#r$

    int atoi(const char *sir);

    Con"erteste irul spre care pointea&a sir întrun num#r întreg$double ato(const char *sir );

    'unc(ia con"erteste irul transmis ca argument întrun num#r real cu semn *returnea "aloaree tipul ouble$ 3n sec"en(a e cifre in ir poate apare litera JeJ  sau JRJ  *e.ponentul,urmat# e caracterul JBJ  sau JJ  i o alt# sec"en(# e cifre$ 'unc(ia nu semnaleae"entualele erori e ep#ire care pot apare$

    6.&.. Funcţii %e terminare a unui proce" :pro9ram; *prototip în process.h+ void exit(int status);

    84

  • 8/18/2019 capitolul6.doc

    18/33

    CAPITOLUL 6Funcţii

    Termin# e.ecu(ia unui program$ Coul returnat e terminarea corect# este memorat înconstanta simbolic# RW5_+Z@@R+, iar coul e eroare în RW5_[7QZCR.

    void abort();

    Termin# for(at e.ecu(ia unui program$int system(const char *comanda); prototip în iua3#n#n!);

    // afiare) +una #iua  -pecificatori de format care efinesc con"ersiile care "or fi reali&ate asupra atelor e ieire,

    in formatul intern, în cel e.tren *e afiare$:$  *arametrii variabili ai func(iei sunt e.presii$ 7alorile ob(inute în urma e"alu#rii acestora sunt

    afiate corespuntor specificatorilor e format care apar în parametrul fi.$ %e obicei, parametrulfi. con(ine at!t specificatori e format, c!t i alte caractere$ um#rul i tipul parametrilor "ariabili trebuie s# corespun# specificatorului e format$

    Un specificator de format  care apare în parametrul fi. poate a"ea urm#toarea form#)0 12c2!sir#cire#eventual#punct#ecimal! una#sau#doua#litere- Implicit, atele se carea *alinia la reapta c!mpului în care se scriu$ Pre&en(a caracterului ]etermin# cararea la st!nga$

     #irul de cifre efinete imensiunea c!mpului în care se scrie ata$ %ac# scrierea atei necesit# unc!mp e lungime mai mare, lungimea inicat# în specificator este ignorat#$ %ac# scrierea ateinecesit# un c!mp e lungime mai mic#, ata se "a scrie în c!mp, carat# la reapta sau la st!nga*ac# apare semnul , complet!nuse restul c!mpului cu caracterele nesemnificati"e implicite, aicaspa(ii$ Virul e cifre aflate upa punct efinesc preci&ia *numarul e &ecimale cu care este afiat unnumar real implicit sunt afiate 6 &ecimale$

     $iterele efinesc tipul con"ersiei aplicat atei afiate)c X Afiea un caracter s X Afiea un ir e caractered  X Afiea ate întregi cele negati"e sunt preceate e semnul $o X Afiea ate e tip int sau unsigne int în octal$x sau 3  Afiea ate e tip int sau unsigne int în 2e.agesimal$

     XAfiea ate e tip float sau ouble în forma) parte_întreagă.parte_fracte sau 4Afiea ate e tip float sau ouble în forma)

    88

  • 8/18/2019 capitolul6.doc

    19/33

    CAPITOLUL 6Funcţii

    parte_4ntreaD-.parte_fractionar- eponent-.ponentul începe cu e sau - i efinete o putere a lui &ece care înmul(it# cu restul num#rului #"aloarea real# a acestuia$g  sau 5 XAfiea o at# real# fie ca în ca&ul specificatorului terminat cu f, fie ca în ca&ulspecificatorului terminat cu e$ Criteriul e afisare se alege automat, astfel înc!t afiarea s# ocupe unnum#r minim e po&i(ii în c!mpul e afiare$

    l  X Precee una in literele , o, ., , u$ La afiare se fac con"ersii in tipul long  sau unsigned long $6 X Precee una in literele f, e, -, g, $ La afiare se fac con"ersii in tipul long double$

    int scan(const char *ormat, ... );

    'unc(ia citete in fiierul stanar e intrare "alorile unor "ariabile i le epune în memorie, laaresele specificate$ 'unc(ia returnea num#rul c!mpurilor citite corect$%. *arametrul fi" al func(iei con(ine)

    1pecificatorii e format care efinesc con"ersiile aplicate atelor e intrare, in formatul e.tern,în cel intren *în care sunt memorate$ 1pecificatorii e format sunt aseman#tori celor folosi(i efunc(ia printf ) c , s , d  , o , x sau 3 , u ,  , l , 6$

    &. *arametrii varaibili repre&int# o list# e arese ale "ariabilelor care "or fi citite, eci în aceast#list#, numele unei "araibile simple "a fi preceat# e operatorul ares# &$

    int sprint(char *sir#cu#ormat, const char *ormat, ... );'unc(ia permite scrierea unor ate în irul transmis ca prim argument, întrun anumit format$ 7aloareareturnat# repre&int# num#rul e octe(i *caractere scrise în ir, sau X5 în ca&ul unei erori$

    int sscan(char *sir#cu#ormat, const char *ormat, ... );

    'unc(ia citete "alorile unor "ariabile in irul transmis ca prim argument i le epune în memorie, laaresele specificate$ Seturnea num#rul c!mpurilor citite corect$

     Exemplu: 1# se scrie urm#torul program *care ilustrea moalit#(ile e folosire a func(iilor preefinite i s#se urm#reasc# re&ultatele e.ecu(iei acestuia$

    include

  • 8/18/2019 capitolul6.doc

    20/33

    CAPITOLUL 6Funcţii

    int c;cout

  • 8/18/2019 capitolul6.doc

    21/33

    CAPITOLUL 6Funcţii3n e.emplul urm#tor, "ariabila întreag#  este "i&ibil# at!t în func(ia main, c!t i în func(ia func1  *. este"ariabila global#, fiin efinit# în e.teriorul oric#rei func(ii$ 7ariabilele a i b sunt "ariabile locale în func(iamain *"i&ibile oar în main$ 7ariabilele c i d sunt "ariabile locale în func(ia func1 *"i&ibile oar în func1$7arabila 9 este "ariabil# e.tern# i este "i&ibil# in punctul în care a fost efinit#, p!n# la sf!ritul fiieruluisurs# *în acest ca&, în func(ia func1$

     Exemplu:int ;void main(){int a,b;// }int 9;void func1(void){int c,d;// }

    Cla"e %e memorare

    O "ariabil# se caracteri&ea prin) nume, tip, "aloare i clas# e memorare$Clasa de memorare se specific# la eclararea "ariabilei, prin unul in urm#toarele cu"inte c2eie)

    auto< register< extern< static.

    Clasa e memorare etermin# timpul e "ia(# i omeniul e "i&ibilitate *scopul unei "ariabile *tabelul 6$5$ Exemplu:

    auto int a;

    static int ;etern double 9;reDister car c;

    Cla"a %e memorare auto%ac# o variabilă locală este eclarat# f#r# a se inica în mo e.plicit o clas# e memorare, clasa ememorare consierat# implicit este auto$ Pentru acea "ariabil# se aloc# memorie automat, la intrarea în

     blocul sau în func(ia în care ea este eclarat#$ %eci omeniul e "i&ibilitate al "ariabilei este blocul saufunc(ia în care aceasta a fost efinit#$ Timpul e "ia(# este urata e e.ecu(ie a blocului sau a func(iei$

    Cla"a %e memorare re9i"ter7ariabilele in clasa register au acelai omeniu e "i&ibilitate i timp e "ia(# ca i cele in clasa auto$%eosebirea fa(# e "ariabilele in clasa auto const# în faptul c# pentru memorarea "ariabilelor register,compilatorul utili&ea regitrii interni *ceea ce conuce la creterea eficien(ei$ Unei "ariabile pentru carese specific# rept clas# e memorare register, nu i se poate aplica operatorul de referenţiere$

    Cla"a %e memorare e3ternO variabilă globală eclarat# f#r# specificarea unei clase e memorare, este consierat# ca a"!n clasae memorare etern$ %omeniul e "i&ibilitate este in momentul eclar#rii p!n# la sf!ritul fiieruluisurs#$ Timpul e "ia(# este urata e.ecu(iei fiierului$ O "ariabil# in clasa e.tern este ini(iali&at# automatcu "aloarea F$

    Cla"a %e memorare "taticClasa e memorare static are ou# utiliri istincte) 7ariabilele locale statice au ca omeniu e "i&ibilitate blocul sau func(ia în care sunt efinite, iar ca

    timp e "ia(# urata e e.ecu(ie a programului$ 1e ini(iali&ea automat cu F$

    =5

  • 8/18/2019 capitolul6.doc

    22/33

    CAPITOLUL 6Funcţii

    7ariabilele  globale statice  au ca omeniu e "i&ibilitate punctul în care au fost efinite p!n# lasf!ritul fiierului surs#, iar ca timp e "ia(# urata e.ecu(iei programului$

    Tabelul 6$5$Cla"a %e

    memorare

    ariabila 7omeniu $iibilitate Timp %e $iaţ#

    auto*reDister

    local# *intern# locul sau func(ia %urara e e.ecu(ie a bloculuisau a func(iei

    etern global#   %in punctul efinirii, p!n# lasf!ritul fiierului *SO'

    Alte fiiere

    %urara e e.ecu(ie a bloculuisau a programului

    static global# SO' local# loc sau func(ie

    nespecificat global# 7e&i e.tern 7e&i e.ternlocal# 7e&i auto 7e&i auto

    6.(. )07U,I 7- A0CA,- A )-)0,I-I

    Alocarea memoriei se poate reali&a în urm#toarele mouri) alocare statică& alocare dinamică& alocare pe stivă' -e alocă static memorie în urm#toarele ca&uri)

     pentru instruc(iunile e control propriu&ise  pentru "ariabilele globale i "ariabilele locale eclarate în mo e.plicit static$

    -e alocă memorie pe stivă pentru "ariabilele locale$ -e aloca dinamic memorie  în mo e.plicit, cu ajutorul func(iilor e alocare inamica, aflate în

    2eaerul alloc.h+ $

     Exemplu:int a,b; double ;double f1(int c, double v){int b;static double >;}double ;int f1(int ){double a;}void main(){double b, c; int K;b=f1(K,c);}

    6.(.1. Alocarea memoriei =n mo% %inamic

    Pentru toate tipurile e ate *simple sau structurate, la eclararea acestora, compilatorul aloc# automat unnum#r e loca(ii e memorie *corespuntor tipului atei$ %imensiunea &onei e memorie necesar# pentru

     p#strarea "alorilor atelor este fi.at# înaintea lans#rii în e.ecu(ie a programului$ 3n ca&ul eclar#rii unuitablou e întregi cu ma.imum 5FF e elemente "or fi aloca(i 1::0si>eof(int)  loca(ii e memoriesuccesi"e$ 3n situa(ia în care la un moment at tabloul are oar :F e elemente, pentru a aloca oar at!tamemorie c!t este necesar# în momentul respecti", se "a aloca memorie în mo inamic$

    -ste e orit ca în ca&ul atelor a c#ror imensiune nu este cunoscut# a priori sau "aria în limite largi, s# seutili&e&e o alt# aborare) alocarea memoriei în mo inamic$ 3n mo inamic, memoria nu mai este alocat# în

    =:

  • 8/18/2019 capitolul6.doc

    23/33

    CAPITOLUL 6Funcţiimomentul compil#rii, ci n momentul execuţiei $ Alocarea inamic# elimin# necesitatea efinirii complete atuturor cerin(elor e memorie în momentul compil#rii$ 3n limba!ul C , alocarea memoriei în mo inamic seface cu ajutorul func(iilor malloc , calloc , realloc  eliberarea &onei e memorie se face cu ajutorulfunc(iei free$ 'unc(iile e alocare/e&alocare a memoriei au prototipurile în 2eaerele stdlib.h+   i alloc.h+ )

    void *malloc(sie#t nr#octei#de#alocat);'unc(ia malloc necesit# un singur argument *num#rul e octe(i care "or fi aloca(i i returnea un pointer generic c#tre &ona e memorie alocat# *pointerul con(ine aresa primului octet al &onei e memorie re&er"ate$void *calloc(sie#t nr#elemente, sie#t mărimea#7n#octe8i# a#unui#elem);

    'unc(ia calloc lucrea în mo similar cu malloc aloc# memorie pentru un tablou e nrQelemente, num#rule octe(i pe care este memorat un element este m#rimeaQînQocte(iQaQunuiQelem i returnea un pointer c#tre&ona e memorie alocat#$void *realloc(void *ptr, sie#t mărime);

    'unc(ia realloc permite moificarea &onei e memorie alocat# inamic cu ajutorul func(iilor malloc saucalloc$bservaţie:

    3n ca&ul în care nu se reuete alocarea inamic# a memoriei *memorie insuficient#, func(iile malloc, calloc irealloc returnea un pointer null$ %eoarece func(iile malloc, calloc, realloc returnea un pointer generic,re&ultatul poate fi atribuit oric#rui tip e pointer$ La atribuire, este inicat s# se utili&e&e operatorul econ"ersie e.plicit# *"e&i e.emplu$

    -liberarea memoriei *alocate inamic cu una intre func(iile malloc, calloc sau realloc se reali&ea cuajutorul func(iei free$void free(void *ptr);

     Exemplu: 1# se aloce inamic memorie pentru :F e "alori întregi$int 0p;p=(int0)malloc(2:0si>eof(int));

    OOp=(int0)calloc(2:, si>eof(int));

     Exerciţiu:  1# se scrie un program care implementea func(ia numit# introd_val$ 'unc(ia trebuie s# permit# introucerea unui num#r e "alori reale, pentru care se aloc# memorie inamic$ 7alorile citite cuajutorul func(iei introd_val sunt prelucrate în func(ia main, apoi memoria este eliberat#$

    include

  • 8/18/2019 capitolul6.doc

    24/33

    CAPITOLUL 6Funcţii

    include

  • 8/18/2019 capitolul6.doc

    25/33

    CAPITOLUL 6Funcţii

    double 0p;p=ne double(L.2);//1au)double Ip=0 ne double(L.2);

     Exerciţiu: 1# se aloce inamic memorie pentru un "ector e m elemente reale$

    double 0vector; vector=ne doubleMmN; Exemplu: 1# se urm#reasc# re&ultatele e.ecu(iei urm#torului program, care utili&ea func(ia coreleft$include

  • 8/18/2019 capitolul6.doc

    26/33

    CAPITOLUL 6Funcţii

    void main(){int nr, f; cout

  • 8/18/2019 capitolul6.doc

    27/33

    CAPITOLUL 6Funcţii

    }

    long int recursiv#ib(long int n) //"arianta e implementare recursi"#{if (n==:) return :;if (n==1) return 1;lonD int i1=rfib(n1);lonD int i2=rfib(n2);return i1Bi2;}

    void main(){int n; clrscr();cout

  • 8/18/2019 capitolul6.doc

    28/33

    CAPITOLUL 6FuncţiiAlgoritmul este reluat prin recursie pentru parti(ia st!ng# *cu limitele între F i j , apoi pentru parti(ia reapt#*cu limitele între i i n5 $ Secursia pentru partea st!ng# se oprete atunci c!n j atinge limita st!ng# *e"ineF, iar recursia pentru parti(ia reapt# se oprete c!n i atinge limita reapt# *e"ine n5$

    +Z\7QYXC56 `uicK+ort (vectM N, stD, drt)  //la primul apel stg ; F si rt ; n 5T8@RGZ5 +Z\7QYXC56

    i←stD

    S←drtU7@ i < S 75Z8@T8@RGZ5

    pivot=vectM(stDBdrt)O2N@5 56G i

  • 8/18/2019 capitolul6.doc

    29/33

    CAPITOLUL 6FuncţiiEo e implementare *1e "a completa programul cu instruc(iunile care ob(in i afiea timpului necesar oron#rii prin fiecare meto#$ 1e "or compara re&ultatele pentru un "ector e 5F, @F,

  • 8/18/2019 capitolul6.doc

    30/33

    CAPITOLUL 6Funcţii

    ile (i

  • 8/18/2019 capitolul6.doc

    31/33

  • 8/18/2019 capitolul6.doc

    32/33

    CAPITOLUL 6Funcţii4$ Care sunt mourile e transfer a parametrilor

    unei func(ii]8$ Care sunt operatorii in C++ care permit

    alocarea/e&alocarea inamic# a memoriei]=$ Ce clase e memorare cunoaste(i]5F$ Ce este omeniul e "i&ibilitate a unei

    "ariabile]55$ Ce este prototipul unei func(ii]5:$ Ce este timpul e "ia(# a unei "ariabile]5@$ Ce loc ocup# eclara(iile "ariabilelor locale în

    corpul unei func(ii]5B$ Ce repre&int# antetul unei func(ii]5 .

    55$ Implementa(i func(ii iterati"e i recursi"e pentru calculul "alorilor polinoamelor ermite   n *?, tiin c#)

      F (9)=1, 5 (9)=29,  n ()=29   5−n (9)2   :−n (9)  ac# nD5$ Compara(i timpul ee.ecu(ie al celor ou# func(ii$

    5:$ 1# se scrie un program care generea toate numerele palinrom, mai mici ec!t o "aloare at#, LIE$ Unnum#r palinrom are cifrele simetrice egale *prima cu ultima, a oua cu penultima, etc$ 1e "a folosi ofunc(ie care testea ac# un num#r este palinrom$

    5F:

  • 8/18/2019 capitolul6.doc

    33/33

    CAPITOLUL 6Funcţii5@$ 'ie matricea C * , K;5F, ale c#rei elemente sunt ate e rela(ia)

    S3 B∑=

      1

    0"F

    +sin* , dac- i