Como o objetivo do blog é tornar o C mais fácil, sempre que receber alguma dúvida, responderei, no próprio comentário, quando for simples, ou num novo post, quando esta resposta necessitar de uma atenção maior (como é o caso hoje). Claro que observando a sequência dos assuntos (não venha me perguntar sobre árvores balenceadas ainda, na hora certa vou falar sobre elas).
A pergunta é esta: "Como faço para criar uma função que preencha e some vetores?
Ou não tem como fazer isso com função?"
A resposta é SIM. Antes de mostrar como, vamos ver (e rever) um simples detalhe.
No post em que falamos sobre ponteiros, aqui, vimos que o nome de um vetor corresponde ao seu endereço. Isto significa que um vetor sempre estará acessível a qualquer parte do programa (se conheço o endereço, posso acessar), bastando saber o seu nome. Assim, um vetor SEMPRE é passado às funções por referência, não tendo, nem ao menos, a necessidade de usar o & antes do nome do vetor.
Visto isto, vamos ao como.
//SOMANDO VETORES USANDO FUNÇÕES
#include "stdio.h"
#include "stdlib.h"
const int TAM=5;
int ler_int(){
int digitado;
printf("Digite um valor inteiro: ");
scanf("%d",&digitado);
return digitado;
}
void mostra_int(int num){
printf("%d ",num);
}
void preenche_vetor(int vet[]){
int i;
for(i = 0; i < TAM; i++)
vet[i] = ler_int();
}
void soma_vetores(int vet1[], int vet2[], int vet3[]){
int i;
for(i = 0; i < TAM; i++)
vet3[i] = vet1[i] + vet2[i];
}
void exibe_vetor(int vet[]){
int i;
printf("\n");
for(i = 0; i < TAM; i++)
mostra_int(vet[i]);
printf("\n\n");
}
int main(){
int vetor_A[TAM], vetor_B[TAM], vetor_C[TAM];
printf("Preenchendo o 1o vetor\n");
preenche_vetor(vetor_A);
exibe_vetor(vetor_A);
printf("Preenchendo o 2o vetor\n");
preenche_vetor(vetor_B);
exibe_vetor(vetor_B);
printf("Somando os vetores...\n");
soma_vetores(vetor_A, vetor_B, vetor_C);
printf("\n\n");
printf("Exibindo o vetor resultante da soma\n");
exibe_vetor(vetor_C);
system("pause");
}
O código acima soma o conteúdo de 2 vetores (vetor_A e vetor_B) num 3o vetor (vetor_C).
Na linha 5 definimos e inicializamos uma constante inteira TAM que armazena o tamanho dos nossos vetores. Não é obrigatório, mas é uma excelente prática de programação. Por quê?
Neste exemplo trabalhamos com vetores de 5 elementos. Se decidirmos aumentar o tamanho desses vetores para 10 elementos, só precisaremos alterar uma única linha de código. Se não tivéssemos usado a constante precisaríamos alterar 4.
Uma novidade está na linha 19, é a forma de especificar um vetor como um parâmetro de uma função. A sintaxe formal é esta:
<tipo de retorno> nome da função (<tipo de dados do vetor> nome do vetor [])
Note que não é necessário informar o tamanho do vetor.
Poderíamos inclusive usar a seguinte sintaxe (que é muito comum em programas profissionais):
<tipo de retorno> nome da função (<tipo de dados do vetor>* nome do vetor)
O nome de um vetor corresponde ao seu endereço na memória, portanto, podemos tratá-lo como um ponteiro. Pode fazer um teste se quiser.
Já quando chamamos a função, linha 46, não é necessário o uso dos [].
Um erro muito comum é colocar os [] com o tamanho do vetor dentro deles. Ao fazer isto, ao invés de se passar o vetor inteiro, está sendo passada à função um único elemento do vetor, e pior ainda, um elemento que nem faz parte do vetor, já que por iniciar em 0(zero), o último elemento de um vetor é igual a tamanho do vetor - 1.
O restante de código já é (acredito ;)conhecido.
Mais alguma dúvida?
(Para pensar: Uma função pode retornar um vetor?)
OBRIGADÍSSIMA!!! Ajudou MUITO MESMNO!!!
ResponderExcluirParabéns mano! Excelente raciocínio.
ResponderExcluirTem um tópico mostrando como retornar um vetor na função?
ResponderExcluirnão por referencia e sim o no lugar de
return "variavel", eu retornar um vetor.
tem como?