of 7 /7
Programarea Calculatoarelor (limbajul C) Curs 7 Fun cŃ ii şi R ecur sivitate Univer sitate a Politehnicadin Bucu reşti Facultatea de Electronică, Te lecomunicaŃii şi Tehnologia InformaŃiei Ş.l. B ogdan IONESCU Prof. Dr agoş BURILEANU Prof. Claudius DAN 2010-2011 2 Cuprins 7.1. FuncŃii 7.2. Recursivitate Curs Programarea C alculatoarelor, Ş.l. Bogdan I ONESCU, 2010-2011 1/36 Curs ProgramareaCa lculatoarelor, Ş.l. Bogdan I ONESCU, 2010-2011 2/36 7.1. FuncŃii Curs Programarea C alculatoarelor, Ş.l. Bogdan I ONESCU, 2010-2011 3/36 Definirea funcŃiilor > Pentru rezolvarea uno r probleme complexe de calcul, acestea tr ebuie descompuse în sub-probleme mai simple. > Descompunerea fizică a codului în porŃiuni, ce realizează anumite sub-pro bleme de calcul, se face cu ajutorul funcŃiilor . “divide et imper a” ar spune romanii. modulareprogram (fiecaremodul se ocup ă de anumi te ope raŃii ). > Pe lângă structurarea programului, funcŃia are avantajul de a fi scrisă o singură dată, dar folosită de câte ori este nevoie, evitând astfel rescrierea codului aferent de fiecare dată. 5 Curs ProgramareaCa lculatoarelor, Ş.l. Bogdan I ONESCU, 2010-2011 4/36 Subprograme – funcŃii (continuare ) > Ce înseamnă o funcŃie ? > Din punct de vedere matematic: f(x,y) = sin(x*y) numele funcŃiei argumente funcŃie (variabile) corpul funcŃiei (calculul realizat) valoarea returnată > Din punct de vedere al programării  în C, funcŃia îşi păstrează sensul matematic (programare funcŃională) . 6 Curs Programarea C alculatoarelor, Ş.l. Bogdan I ONESCU, 2010-2011 5/36 Definirea funcŃiilor (continuare ) > Astfel, în limbajul C, funcŃiile îşi păstrează sensul matematic: Formă generală: <tip_dată> <nume>(<var1>,...,<varN> ) { <secvenŃă instrucŃiuni 1>; <secvenŃă instrucŃiuni 2>; ... <secvenŃă instrucŃiuni M>; [return <expresie>;] } [ ] = o pŃional <tip_dată>: reprezintă tipul datelor returnate de funcŃie, AtenŃie: o funcŃie nu poate returna decât o singură valoare .

Programarea Calculatoarelor M7

  • Author
    adriana

  • View
    239

  • Download
    0

Embed Size (px)

Text of Programarea Calculatoarelor M7

  • 8/8/2019 Programarea Calculatoarelor M7

    1/7

    Programarea Calculatoarelor(limbajul C)

    Curs 7 Funcii i Recursivitate

    Universitatea Politehnica din BucuretiFacultatea de Electronic, Telecomunicaii i

    Tehnologia Informaiei

    .l. Bogdan IONESCUProf. Drago BURILEANUProf. Claudius DAN

    2010-20112

    Cuprins

    7.1. Funcii

    7.2. Recursivitate

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 1/36

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 2/36

    7.1. Funcii

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 3/36

    Definirea funciilor

    > Pentru rezolvarea unor probleme complexe de calcul,acestea trebuie descompuse n sub-probleme mai simple.

    > Descompunerea fizic a codului n poriuni, ce realizeazanumite sub-probleme de calcul, se face cu ajutorul funciilor.

    divide et impera ar spune romanii.

    modulare program (fiecare modul se ocup deanumite operaii).

    > Pe lng structurarea programului, funcia are avantajul de afi scris o singur dat, dar folosit de cte ori este nevoie,evitnd astfel rescrierea codului aferent de fiecare dat.

    5Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 4/36

    Subprograme funcii (continuare)

    > Ce nseamn o funcie ?

    > Din punct de vedere matematic:

    f(x,y) = sin(x*y)

    numelefunciei

    argumentefuncie (variabile)

    corpul funciei(calculul realizat)valoarea

    returnat

    > Din punct de vedere al programriin C, funcia ipstreaz sensul matematic (programare funcional).

    6Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 5/36

    Definirea funciilor (continuare)

    > Astfel, n limbajul C, funciile i pstreaz sensulmatematic:

    Form general:

    (,...,){;;...;[return ;]

    } [ ] = opional

    : reprezint tipul datelor returnate de funcie,Atenie: o funcie nu poate returna dect o singur valoare.

  • 8/8/2019 Programarea Calculatoarelor M7

    2/7

    7Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 6/36

    Definirea funciilor

    (continuare)

    (,...,){;;...;[return ;]

    }

    : reprezint identificatorul funciei pe baza cruiaaceasta va fi apelat pe parcursul rulrii programului.

    (var1,...,varN): reprezint variabilele de intrare, pe care leprimete funcia din programul, sau sub-programul n care esteapelat. Este posibil ca funcia s nu primeasc date de intrare,caz n care lista este vid: (), sau se poate folositipul void: (void).

    : dac funcianu returneaz nici o valoare

    atunci se specific tipulvoid procedur.

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 7/36

    > Observaie: o funcie chiardac nu primete variabile,

    aceasta poate interacionacu programul pe bazavariabilelor globale din program (vizibile pentru orice funcie)

    Definirea funciilor

    (continuare)

    (,...,){;;...;[return ;]

    }

    de evitat, deoarece funcia nu mai este independentde program, portabilitatea ntr-un alt program fiind redus.

    { secvene instruciuni }: corpul funciei (ceea ce se execut)este specificat ntre { i }. Acesta poate fi vzut, el nsui caun program.

    9Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 8/36

    return :funcia return este folositpentru a returna valoareadorit.

    Definirea funciilor

    (continuare)

    (,...,){;;...;[return ;]

    }

    > Efect: funcia se ncheie n momentul n care se executcomanda return, iar specificat este returnat cadat de ieire a funciei.

    dac aceasta nu corespunde tipului specificat (),conversie la acesta, dac nu este posibil, atunci eroare.

    > Observaie: folosirea funciei return este opional chiar dacs-a specificat c funcia trebuie s returneze ceva (warning).

    10Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 9/36

    Definirea funciilor (continuare)

    Exemplu de funcie:

    int adunare((((int a,a,a,a, int b)b)b)b){{{{

    int r;r=a+b;

    return r;}}}}

    -am definit funcia adunare careprimete dou numere ntregi ireturneaz un numr ntreg,

    -calculeaz suma n variabila ri returneaz valoarea lui r.

    Optimizare:int adunare((((int a,a,a,a, int b)b)b)b){{{{

    return a+b;}}}}

    -funcia return poate primi oexpresie i nu neaprat o singurvariabil.

    > Cum se poate rescrie funcia mai eficient ???

    11Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 10/36

    Definirea funciilor (continuare)

    > Unde se definesc funciile.

    Form general program:

    #include...

    int main(){

    }

    comenzi depreprocesare

    programulprincipal (main)

    int adunare((((int a,a,a,a, int b)b)b)b){{{{

    return a+b;}}}}

    Varianta 1: funciile pot fi definitenaintea funciei main, acesteafiind scrise integral.

    12Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 11/36

    Definirea funciilor (continuare)

    > Unde se definesc funciile (continuare).

    Form general program:

    #include...

    int main(){

    }

    comenzi depreprocesare

    programulprincipal (main)

    Varianta 2: funciile pot fianunate naintea funciei main,(prototip), acestea fiind descriseintegral dup funcia main.

    int adunare((((int a,a,a,a, int b)b)b)b){{{{

    return a+b;}}}}

    int adunare((((int a,a,a,a, int b)b)b)b);

  • 8/8/2019 Programarea Calculatoarelor M7

    3/7

    13Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 12/36

    Definirea funciilor (continuare)> Unde se definesc funciile (continuare).

    Exemplu:

    #include#include

    double factorial(int n){int i; double fact=n;for(i=n-1; i>0; i--)fact=fact*i;

    return fact;}

    int main(){

    printf(20!=%lf, factorial(20) );}

    -am definit funcia factorial carecalculeaz factorialul unui numrntreg n i returneaz aceast

    valoare sub forma unui double ?

    -funciile se apeleaz n modidentic cu modul de apelare alfunciilor disponibile n C.

    factorial(20)-n=20,-se efectueaz calculele,-factorial(20) devine val.specificat de return.

    14Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 13/36

    Definirea funciilor (continuare)> Unde se definesc funciile (continuare).

    Alt variant:

    #include#include

    double factorial(int n);int main(){

    printf(20!=%lf, factorial(20) );}

    double factorial(int n){int i; double fact=n;for(i=n-1; i>0; i--)fact=fact*i;

    return fact;}

    -am anunat funcia i amspecificat prototipul acesteia.

    -corpul funciei este detaliat dupprogramul principal.

    -n cazul n care funciile nu suntevidente (complexe), iarconceperea lor necesit un timpsemnificativ, putem scrie mainti programul principal, ca icum funciile exist deja.

    15Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 14/36

    Definirea funciilor (continuare)

    > Vizibilitatea variabilelor n cadrul funciilor

    double factorial(int n){int i; double fact=n;for(i=n-1; i>0; i--)fact=fact*i;

    return fact;}

    int main(){

    printf(%d, %lf, i, factorial(20) );}

    Exemplu:

    variabilele declarate n corpul unei funcii sunt valabile doarn acesta, i doar pe parcursul execuiei funciei respective.

    -variabila i este o variabil locala funciei factorial ce va fialocat n memorie doar cndfuncia este apelat.

    - variabila i i fact nu exist ncadrul celorlalte funcii, inclusivmain().

    eroare!

    16Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 15/36

    Definirea funciilor (continuare)

    > Vizibilitatea variabilelor n cadrul funciilor

    variabilele declarate n afara programului principal main(),n seciunea de variabile globale, sunt vizibile peste tot nprogram: n funcia main(), n toate funciile definite, etc.

    #include

    int offset=3;

    float produs(float a, float b){

    return a*b+offset;}

    int main(){

    printf(%d, %f, offset, produs(5,6) );}

    Exemplu: -variabila offset este definitdup comenzile de preprocesare,dar naintea definirii funciilorprogramului,

    -aceasta este astfel vizibil attn procedura produs ct i nmain.

    >3, 5*6+3=33

    17Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 16/36

    Definirea funciilor (continuare)

    > Vizibilitatea variabilelor n cadrul funciilor

    #include

    float produs(float a, float b){return a*b+offset;

    }int offset=3;

    int main(){

    printf(%d, %f, offset, produs(5,6) );}

    Exemplu: -variabila offset este definitdup definirea proceduriiprodus, ce se ntmpl ???

    eroare!

    > Principiu: o declaraie de variabile sau de funcii este vizibilpentru toate funciile ce sunt definite dup aceasta.

    variabila offset este vizibil deaici n jos.

    18Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 17/36

    Definirea funciilor (continuare)

    > Vizibilitatea variabilelor n cadrul funciilor

    #includefloat produs(float a, float b){int offset=4;return a*b+offset;

    }int offset=3;

    int main(){

    printf(%d, %f, offset, produs(5,6) );}

    Exemplu:-ce valoare va returna funciaprodus ???

    >3, 30+4=34.00

    -n funcie, variabila offset estedefinit local i are valoarea 4.

    -n main(), variabila offset estecea definit global, cea dinfuncie neexistnd dect ninteriorul fc. produs (execuie).

    offsetoffset

    offset

    offset

  • 8/8/2019 Programarea Calculatoarelor M7

    4/7

    19Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 18/36

    Definirea funciilor (continuare)

    > Vizibilitatea variabilelor n cadrul funciilor

    #include

    int offset=3;float produs(float a, float b){int offset=4;return a*b+offset;

    }

    int main(){

    printf(%d, %f, %d, offset, produs(2,3), offset );}

    Exemplu: -ce valoare va returna funciaprodus ???

    >3, 2*3+4=10.00, 3

    -cu toate c variabila offseteste definit global i estevizibil i n funcia produs,redefinirea ei local, duce laignorarea variabilei globale .

    offsetoffset

    offset

    offset offset

    20Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 19/36

    Definirea funciilor (continuare)

    PEnun: s se realizeze o funcie care permiteafiarea pe ecran a unei matrice ptratice de numerentregi. Matricea se va afia pe linii i coloane.

    Variabile de intrare/lucru:

    int M[100][100];

    Variabile de ieire:

    nu

    int dim;int i, j;voidAfisareM(int dim, int M[100][100]);

    program principalmain()

    definiie funcieAfisareM()

    21Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 20/36

    Definirea funciilor (continuare)

    #include#include/* procedura este definita inaintea funciei main */void AfisareM(int dim, int M[100][100]){int i,j;

    printf("\n");for(i=0; i

  • 8/8/2019 Programarea Calculatoarelor M7

    5/7

    25Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 24/36

    Funcii recursive (continuare)

    > Astfel, un obiect sau un fenomen se definete n modrecursiv dac n definiia sa exist o referire la el nsui.

    Exemple:

    definirea numerelor ntregi:0Ndac iN atunci i+1N

    definirea funciei factorial:

    >

    ==

    0)!1(

    01!

    ndacnn

    ndacn

    definirea irului Fibonacci:

    >+

    =

    =

    =

    1)2()1(

    11

    00

    )(

    ndacnfibnfib

    ndac

    ndac

    nfib

    0, 1, 1, 2, 3, 5, 8, 13, 21, ...

    26Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 25/36

    Funcii recursive (continuare)

    > O funcie recursiv trebuie s fie bine format:

    - o funcie nu se poate defini doar n funcie de sinensi,

    - o funcie recursiv se poate folosi numai de noiuni deja

    definite anterior,

    - orice ir de apeluri de funcii recursive trebuie s seopreasc (nu va genera un calcul infinit).

    exemplu: f(n) =2+f(n) greit, se execut la

    exemplu: f(n)=f(n+1)-2 greit (valoare inexistent f(n+1)),

    exemplu: f(0)=1, f(n)=f(n-1)+3,f(3)=f(2)+3=f(1)+3+3=f(0)+3+3+3=1+3+3+3=10

    27Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 26/36

    Funcii recursive (continuare)

    > n general distingem:

    - un caz de baz: pentru care funcia este definit direct,de exemplu: f(0)=1

    - un pas inductiv (recursivitatea propriu-zis): funciaeste definit folosind aceeai funcie, dar pe un caz maisimplu, de exemplu: f(n+1)=f(n)*PI

    > n limbajul C crearea de funcii recursive nu necesit oanumit sintax sau folosirea unui anumit cuvnt cheie,aceasta reiese automat din modul de definire al funciei.

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 27/36

    Funcii recursive (continuare)

    int Factorial(int n){if(n==0)

    return 1;else

    return n*Factorial(n-1);}

    - funcia primete valoarea n ireturneaz valoarea calculat afactorialului.

    Exemplu: funcia factorial

    - condiia de oprire a recursivitii:dac n a ajuns la valoarea 0, sereturneaz 1 (0!)

    - pasul inductiv: relaia de calculrecursiv ce depinde de valorilede rang inferior ale funciei:Factorial(n-1), Factorial(n-2)

    n=11==0 Falsreturn 1*Factorial(1-1)

    iteraia 2

    Factorial(1)

    int main(){

    printf(%d, Factorial(2) );}

    iteraia 1

    n=22==0 Falsreturn 2*Factorial(2-1)

    Factorial(2)

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 28/36

    Funcii recursive (continuare)

    Modul de execuie

    int Factorial(int n)

    { if(n==0)return 1;

    elsereturn n*Factorial(n-1);

    }

    > Funcia returneaz valoarea: 1*1*2

    n=00==0 Adevratreturn 1

    iteraia 3

    Factorial(0)

    30Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 29/36

    Funcii recursive (continuare)

    Exemplu: o funcie recursiv care numr de la a la b n senscresctor, i invers.

    void printnum(int a, int b){printf("%d ",a);if(a

  • 8/8/2019 Programarea Calculatoarelor M7

    6/7

    31Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 30/36

    Funcii recursive (continuare)

    Mod de execuie:

    void printnum(int a, int b){printf("%d ",a);if(a

  • 8/8/2019 Programarea Calculatoarelor M7

    7/7

    37Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 36/36

    Sfritul Cursului 7