ATP - Curs 2-Pointeri La Functii

download ATP - Curs 2-Pointeri La Functii

of 21

Transcript of ATP - Curs 2-Pointeri La Functii

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    1/21

    Algoritmi si tehnici

    de programare- curs 2-

    1

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    2/21

    Pointeri la funcții 1. Introducere

    2. Declararea unui pointer la o functie

    3. Pointeri la functii

    4. Vectori de pointeri la funcţii 

    5. Parametru tip pointer la funcţie

    2

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    3/21

    1. Introducere

    3

    Se pot declara pointeri către: orice tip de date (standard in C si pe care le definite de utilizator) f uncţii – pointerii pot fi folositi pentru a transmite functii ca parametri

    pentru alte functii

    Numele unei funcţii poate fi folosit ca pointer constant (asemănător masivelor) 

    Semnificaţia: adresa din memorie unde se află codul executabil al subprogramului

    respectiv

    Tipul:

    Pointer către un subprogram care primeşte o anumită listă de parametri şi întoarce un anumit tip de rezultat

    Utilizare: Transmiterea subprogramelor ca parametri pentru alte subprograme 

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    4/21

    2. Declararea unui pointer la o functie

    4

    Declarare:tip_functie (*nume_pointer_la_functie) (tip_parametru1,

    tip_parametru2, ...);

    Exemplu:

    float (*pointerFct) (int a, int b);

    Parantezele din jurul lui *pointerFct - sunt necesare,compilatorul va intelege declaratia ca o declaratie defunctie care returneaza un pointer la float.

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    5/21

    Etape

    5

    Pas: 1 Scrierea functiei spre care sa se pointeze

    Pas: 2 Declararea unei variabile de tip procedural

    (pointer spre funcţie) 

    Pas 3: Descrierea funcţiei care utilizează parametrii

    procedurali

    Pas 4: Apelul funcţiei cu parametri procedurali 

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    6/21

    Rol nume functie

    6

    void Afisare(int nrAfisat){…} 

    Afisare   pointer către  o funcţie  care primeşte  ca parametr u  un

     întreg şi are rezultat de tip void 

    float  Maxim (float v[], int n, int poz[], int* nr);

    {…}Maxim   pointer către  o funcţie  care primeşte  ca parametri unvector cu elemente de tip float, un întreg, un vector cu elemente întregi şi un pointer către întreg şi are rezultat de tip float

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    7/21

    3.Pointeri la functii

    7

    Exemplu 1 –  Hello world ! siNr.

    void HelloWorld1 (char *mesaj){ printf("Hello %s !\n", mesaj); }

    void HelloWorld2 (int nrAfisat)

    { printf("Afisare numar functie: %d\n", nrAfisat); }

    void main(){ int t=10;

    char *sir= "world";

    //declararea pointer-ului   void (*functionPointer1)(char *m);   //atribuirea adresei functiei spre care pointeaza;   functionPointer1= &HelloWorld1; //sau fara &

     //apelul functiei prin intermediul pointer-ului

    functionPointer1(sir); //variabila citita in main

    functionPointer1("world"); // valoare data in apelul

    functiei

    //declararea pointer-uluivoid (*functionPointer2)(int m);

    //atribuirea adresei functiei spre care pointeaza;functionPointer2= &HelloWorld2; //sau fara &

    //apelul functiei prin intermediul pointer-ului

    functionPointer2(23); //variabila citita in main

    functionPointer2(t); // valoare data in apelul functiei

    }

    Ce va afisa programul

    dupa rulare ?

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    8/21

    8

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    9/21

    Exemplu 2 –  functie cu mai multi parametrii

    9

    //definim o functie cu doi parametri de tip int si care returneaza void.

    void functieUnu(int a, int b)

    { printf ("Functia unu cu doi parametri de tip int: %d si %d.\n", a, b); }

    void main(void)

    {void (*fctPointer1) (int y, int z);

     // adresa primei functii este atribuita pointerului.fctPointer1 = &functieUnu;

     // se apeleaza prima functie

    functieUnu(5, 10);

     // se apeleaza prima functie prin intermediul pointerului(*fctPointer1).

     // parantezele se pun pentru a se asigura ordinea

    operatiilor.

    (*fctPointer1) (15, 20);

    }

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    10/21

    Rezultat

    10

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    11/21

    Exemplu 3 –  functie care returneaza un intreg

    11

    float functie (float a, float b)

    {

    int r=0; //instructiuni;

    return r;

    }

    void main(){

    int x;

    float (*pf)(float, float);

    pf=functie;

    x=(*pf)(1,2);

    printf(“Rezultatul este %d”, x);}

    Este corect ?

    Tipul pt. r si x trebuie sa fie float !

    float functie (float a, float b)

    {

    float r=0; //instructiuni;

    return r;

    }

    int main(){

    float x;

    float (*pf)(float, float);

    pf=functie;

    x=(*pf)(1,2);printf("Rezultatul este %f", x);

    getch();

    }

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    12/21

    4.Vectori de pointeri la funcţii 

    12

    Exemplu 4 –  Sortare vector utilizand un pointer la functia desortare

    Sa se sorteze elementele unui vector in ordine crescatoare.

    Operatia se va realiza intr-un subprogam. Rezultatul va fiobtinut in functia main:

    - prin apelul direct al functiei care sorteaza vectorul

    - prin crearea unui pointer la funcţia care sorteaza

    elementele vectorului.

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    13/21

    Exemplu 4 - Rezolvare

    13

    #include

    #include

    void sortareV (float v[], int n)

    { int i,j; float aux;

      for(i=0;i

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    14/21

    Vector de pointeri la funcţii 

    14

    Exemplu 1Să se creeze un vector de pointeri la funcţii care sorteaza

    crescator si descrescator elementele unui vector şi

    afişează rezultatul operaţiilor .

    Se va scrie şi un exemplu de utilizare a vectorului de

    pointeri la funcţii. 

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    15/21

    Rezolvare (1)

    15

    #include

    #include

    void sortareCresc (float v[], int n)

    { int i,j; float aux;

      for(i=0;i

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    16/21

    Rezolvare (2)

    16

     void main()

      { void (*pointerSort[2])(float x[], int m);//nu conteaza x si m

      int n,i;

      float z[10];

     

      printf("Dati dimensiunea vectorului =");   scanf("%d", &n);

     

      citireV (z,n);

      afisareV (z,n);

      printf("\n");

      printf("\n");

     

     

     

    •  pointerSort[0]=sortareCresc;

    •  

    pointerSort[1]=sortareDescr;

    •  

    •   for(i=0;i

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    17/21

    Exemplu 2

    17

    Să se creeze un vector de pointeri la funcţii carecalculează şi afişează rezultatul operaţiilor de: 

    - adunare;

    - scădere;

    -  înmulţire; 

    -  împărţire 

    a două numere reale.

    Se va scrie şi un exemplu de utilizare a vectorului

    de pointeri la funcţii. 

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    18/21

    5. Parametru tip pointer la funcţie şi utilizare

    18

    Funcţie cu parametru procedural void f(…, tip_rezultat (*nume)(lista_parametri_formali), …) 

    {tip_rezultat x; //…. x=(*nume)(lista_parametri_actuali); //… } 

    Apel funcţie cu parametru procedural tip _rezultat nume_functie(lista_parametri_formali) {…} 

    void main()

    {… f(…,nume_functie,…); …} 

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    19/21

    Exemplu –  metoda bisectiei

    19

    x1 x2x 

    n, eps

    x1

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    20/21

    Antet functie

    20

    float ecuatie(float x)

    { return x*x*x-3*x+14;}

    int bisectie( float x1, float x2,

      float eps, int n,

      float (*f)(float),   float *x)

      {…} 

  • 8/15/2019 ATP - Curs 2-Pointeri La Functii

    21/21

     Tema

    21

    Tema –  Metoda Tangentei