Funções com vetores


Resumo:

O nome de um vetor pode também ser utilizado como sendo um ponteiro para o primeiro elemento do vetor (ou seja, ele contem o endereço de seu 1o elemento). Vetores são sempre passados por referência para funções.

Exemplo de declaração de funções com ponteiros:

float f (float V1[MAX]);

Exemplo de chamada:

#define MAX 100
int main () {
float a, A[MAX]; /* declaração da variável a e vetor A */
... /* outras coisas do programa */
a = f (A); /* observe que o vetor é passado apenas pelo nome
... pois ele contem o endereco do 1o elemento */
}

Descrição:

Vimos na aula sobre vetores que o nome_do_vetor utilizado na sua declaração pode ser utilizado também como um ponteiro que aponta para o endereço da primeira posição do vetor, ou seja, o nome do vetor é também um ponteiro que contém o endereço de seu primeiro elemento.

Na linguagem C, como vetores podem ser estruturas muito grandes, o vetor é sempre passado para uma função por referência, ou seja, apenas o nome (ponteiro) do vetor é passado na chamada de uma função.

Vamos definir uma função que recebe dois vetores de tamanho e retorna o seu produto escalar.

O protótipo dessa função seria:

float produtoEscalar (float V1[MAX], float V2[MAX], int N);

A função recebe os vetores V1 e V2, e um inteiro N. Veja que cada vetor possui MAX elementos cada, e desde que , o resultado final deve ser correto. Um possível corpo para essa função seria:

float produtoEscalar (float V1[MAX], float V2[MAX], int N) {
int i;
float res = 0;
for (i=0; i<N; i++)
res = res + V1[i] * V2[i];
return res;
}

Acreditamos que esse seja o protótipo mais "claro", pois ele define que V1 e V2 são vetores de tamanho máximo . Porém, há outros protótipos possíveis, como os abaixo:

float produtoEscalar (float V1![], float V2![], int N);
float produtoEscalar (float *V1, float *V2, int N);

Note que o tamanho do vetor é facultativo na definição da função, e como o nome do vetor é um ponteiro, podemos até mesmo definir esses parâmetros como ponteiros no protótipo da função. Embora essas alternativas sejam válidas, acreditamos que essas duas últimas notações sejam muito confusas para os iniciantes em computação, e serão portanto evitadas no restante desse curso.

Veja a seguir um exemplo de programa que utiliza a função produtoEscalar:

#include <stdio.h>
#define MAX 100
#define EPS 0.001

float produtoEscalar (float V1[MAX], float V2[MAX], int N);

int main () {
int n, i;
float A[MAX], B[MAX];
float prod;
printf("Este programa le dois vetores de tamanho arbitrario e\n");
printf("determina se sao ortogonais.\n\n");
/* leitura dos vetores */
printf("Digite o tamanho dos vetores: ");
scanf("%d", &n);

printf("Entre com os valores do 1o vetor\n");
for (i=0; i<n; i++) scanf("%f",&A[i]);

printf("Entre com os valores do 2o vetor\n");
for (i=0; i<n; i++) scanf("%f",&B[i]);

prod = produtoEscalar(A, B, n);
/* cuidado com a comparação com zero usando reais!!! */
if (prod < EPS && prod > -EPS)
printf("Os vetores sao ortogonais.\n");
else
printf("Os vetores nao sao ortogonais.\n");
return 0;
}

Vamos agora desenvolver uma função que calcule o produto vetorial entre 2 vetores trimensionais. O produto vetorial de dois vetores e é dado por

Primeiro como deve ser o protótipo dessa função? Nós sabemos que a função deve receber 2 vetores de entrada e devolver 1 vetor como resultado. Sendo assim, temos o seguinte protótipo:

void produtoVetorial( float A[MAX], float B[MAX], float C[MAX]);

onde os vetores A e B são entradas e C é o vetor de saída.

Um corpo de função possível seria:

void produtoVetorial( float A[MAX], float B[MAX], float C[MAX]) {
/* variáveis para acessar os vetores */
/* não precisa, mas deixa tudo mais bonitinho e organizado */
int x = 0, y = 1, z = 2;
C[x] = A[y]*B[z] - A[z]*B[y];
C[y] = A[z]*B[x] - A[x]*B[z];
C[z] = A[x]*B[y] - A[y]*B[x];
}

Vamos ver o seguinte programa que utiliza as duas funções que definimos:

#include <stdio.h>
#define MAX 3
#define EPS 0.001

float produtoEscalar (float V1[MAX], float V2[MAX], int N);
void produtoVetorial( float A[MAX], float B[MAX], float C[MAX] );

int main () {
int n=3, i;
float A[MAX], B[MAX], C[MAX];
float prod;
printf("Este programa le dois vetores de 3 dimensoes e\n");
printf("calcula o seu produto vetorial, e mostra que o produto\n");
printf("vetorial eh ortogonal aos dois vetores de entrada\n");
/* leitura dos vetores */
printf("Entre com os valores do 1o vetor\n");
for (i=0; i<n; i++) scanf("%f",&A[i]);

printf("Entre com os valores do 2o vetor\n");
for (i=0; i<n; i++) scanf("%f",&B[i]);

/* observe a chamada da função produtoVetorial */
/* C recebe o resultado do produto vetorial de A x B */
produtoVetorial(A, B, C);

printf ("Produto vetorial (A x B) = (%.2f, %.2f, %.2f)\n",C[0],C[1],C[2]);
prod = produtoEscalar (A, B, n);
printf("Produto escalar de A e B: %.2f \n", prod);
prod = produtoEscalar (A, C, n);
printf("Produto escalar de A e C: %.2f \n", prod);
prod = produtoEscalar (B, C, n);
printf("Produto escalar de B e C: %.2f \n", prod);
return 0;
}

Uma última observação. Os "vetores" em C e os "vetores" de algebra linear são conceitos distintos (que até podem ser relacionados, como mostra nossos exemplos, mas distintos). Procure não se confundir.


Eloiza Sonoda