Vectores y funciones en C

(Este artículo forma parte del Curso de Programación en C)

Para pasar un vector como argumento a una función, en la llamada a la función se escribe simplemente el nombre del vector, sin índices. Esto sirve para pasar a la función la dirección de memoria donde se almacena el primer elemento del vector. Como C guarda todos los elementos de los vectores en posiciones de memoria consecutivas, conociendo la dirección del primer elemento es posible acceder a todas las demás.

El hecho de que a la función se le pase la dirección del vector y no sus valores provoca un efecto importante: que los arrays siempre se pasan por referencia, nunca por valor (si no sabe de lo que estamos hablando, puede repasar este post). Esto incluye a los vectores, que son arrays unidimensionales. Por lo tanto, si algún elemento del vector se modifica en una función, también será modificado en la función desde la que fue pasado.

Como siempre se pasan por referencia, no es necesario utilizar el símbolo & delante del parámetro. Por ejemplo, supongamos que serie es un vector de 15 números enteros. Para pasarlo como parámetro a una función llamada funcion1 escribiríamos simplemente esto:

int serie[15];
funcion1(serie);

En cuanto a la definición de la función, la declaración de un parámetro que en realidad es un vector se puede hacer de tres maneras diferentes:

void funcion1 (int sere[15]);  /* Array delimitado */
void funcion1 (int serie[]);   /* Array no delimitado */
void funcion1 (int *serie);    /* Puntero */

El resultado de las tres declaraciones es, en principio, idéntico, porque todas indican al compilador que se va a recibir la dirección de un vector de números enteros. En la práctica, sin embargo, las dos últimas pueden darnos problemas en algunos compiladores, así que preferiremos la primera declaración (la que utiliza un array delimitado)

Dentro de la función, el vector puede usarse del mismo modo que en el programa que la llama, es decir, no es preciso utilizar el operador asterisco.

Por ejemplo: Un programa que sirve para leer 50 números por teclado, y calcular la suma, la media y la desviación típica de todos los valores. La desviación es una magnitud estadística que se calcula restando cada valor del valor medio, y calculando la media de todas esas diferencias.

Observe el siguiente programa de ejemplo detenidamente, prestando sobre todo atención al uso de los vectores y a cómo se pasan como parámetros.

Los números de la serie se almacenarán en un vector float de 50 posiciones llamado valores. La introducción de datos en el vector se hace en la función introducir_valores(). No es necesario usar el símbolo & al llamar a la función, porque los vectores siempre se pasan por variable. Por lo tanto, al modificar el vector dentro de la función, también se modificará en el algoritmo principal.

Después, se invoca a tres funciones que calculan las tres magnitudes. El vector también se pasa por variable a estas funciones, ya que en C no hay modo de pasar un vector por valor.

#include <stdio.h>
#include <math.h>
int main(void)
{
    float valores[50];
    float suma, media, desviacion;
    introducir_valores(valores);
    suma = calcular_suma(valores);
    media = calcular_media(valores, suma);
    desviacion = calcular_desviacion(valores, media);
    printf("La suma es %f, la media es %f y la desviación es %f", suma, media, desviacion);
    return 0;
}
/* Lee 50 números y los almacena en el vector N pasado por variable */
void introducir_valores(float N[50])
{
    int i;
    for (i=1; i<=49; i++)
    {
        printf("Introduzca el valor nº %d: ", i);
        scanf("%f", &N[i]);
    }
}
/* Devuelve la suma todos los elementos del vector N */
float calcular_suma(float N[50])
{
    int i;
    float suma;
    suma = 0;
    for (i=1; i<=49; i++)
        suma = suma + N[i];
    return suma;
}
/* Devuelve el valor medio de los elementos del vector N. Necesita conocer la suma de los elementos para calcular la media */
float calcular_media(float N[50], float suma)
{
    int i;
    float media;
    media = suma / 50;
    return media;
}
/* Calcula la desviación típica de los elementos del vector N. Necesita conocer la media para hacer los cálculos */
float calcular_desviacion(float N[50], float media)
{
    int i;
    float diferencias;
    diferencias = 0;
    for (i=1; i<=49; i++)
        diferencias = diferencias + abs(N[i] – media) ;
    diferencias = diferencias / 50;
    return diferencias;
}

Categorías

Licencia

ClustrMaps