Enrere Mòdul 7
Fonaments de programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 
Funció mitjana

En aquesta pràctica implementarem una funció amb un nombre indefinit de paràmetres.

 

Desenvolupament de la pràctica

Veurem en aquest programa una funció on el nombre d'arguments pot ser un nombre variable. Es tracta de la funció mitjana() que calcularà la mitjana d'un nombre no determinat de nombres del tipus double.

Definiu un projecte nou anomenat m7p08 i afegiu-li un arxiu de font C/C++ anomenat m7p08.cpp. Escriviu el següent codi:

//m7p08.cpp: Funció mitjana

#include <stdio.h>
#include <stdarg.h>

double mitjana(int n, ...);


void main(){


    printf("mitjana(1) =%f\n",mitjana(1,1.));
    printf("mitjana(1,2) =%f\n",mitjana(2,1.,2.));
    printf("mitjana(1,2,3) =%f\n",mitjana(3,1.,2.,3.));
}




double mitjana(int n, ...){

    int ct;
    double mitja=0.;
    va_list p;

    va_start(p,n);

    for(ct=0;ct<n;ct++){
        mitja=mitja+va_arg(p, double);
    }

    va_end(p);
    return mitja/n;
}

Per declarar una funció amb un nombre indefinit d'arguments es fan servir els tres punts (...).

La funció: double mitjana(int n, ...) tindrà un paràmetre obligatori del tipus int  i després un nombre no definit de paràmetres (en aquest cas, el primer dels paràmetres s'interpreta com el nombre de paràmetres que li segueixen).

Per tractar les funcions amb un nombre indefinit de paràmetres és convenient fer servir el tipus va_list i les  macros va_start, va_arg i va_end. Aquests tipus i macros tenen la seva definició a l'arxiu de capçalera stdarg.h .

Al començament de la funció es declara una variable del tipus va_list (aquest tipus és, de fet, un punter)

  va_list p;

A continuació es crida la macro va_start per inicialitzar la variable p

  va_start(p,n);

El segon argument d'aquesta variable és el nom de l'últim paràmetre obligatori abans de la llista dels altres paràmetres.

Cadascú dels valors de la resta d'arguments es referencia amb la macro va_arg():

   mitja=mitja+va_arg(p, double);

Aquesta macro té dos arguments, el punter p (variable del tipus va_list inicialitzada amb va_star()) i el tipus d'argument que ha de llegir. Aquesta macro torna el valor del següent paràmetre i actualitza el punter p.

Abans de sortir de la funció es crida a va_end() per restituir la pila.