Como o curso C Progressivo vai mostrar, para programar em
C é bem comum passar vetores, e outras estruturas de dados, para funções.
Como você viu nos exemplos passados de nossa apostila de C, dá um certo
trabalhinho lidar com vetores.
E para o código não ficar
confuso e grande na main(),
costumamos colocar os códigos que operam vetores em funções.
- Como se tornar um programador C e ter certificado
- Baixe este conteúdo: Apostila C Progressivo
Como passar um vetor parar uma função em C
Embora tenhamos batido na tecla sobre o fato de vetores
serem um conjunto de variáveis, como outras quaisquer, existem alguns detalhes
que precisamos saber na hora de passar os vetores para as funções,
principalmente no cabeçalho de declaração da função.
Mas não precisa entrar em desespero, pois os detalhes são
para facilitar nossa vida.
No caso de um vetor unidimensional (vetor comum, de uma
dimensão), precisamos colocar apenas o par de colchetes – [ ] -após o nome da
variável, e vazio.
Isso mesmo, vazio. Não importa se seu vetor tem 1, 10 ou
1 milhão de elementos.
As funções em C apenas precisam saber qual o tipo da
variável e se é um vetor.
Então, a sintaxe de uma função que recebe um vetor é:
retorno nomeDaFuncao( tipo vetor[] , ...)
Por exemplo, uma função que recebe um vetor de inteiros e
retorna um inteiro:
int funcao( int numeros[] )
Uma função sem retorno que recebe um vetor/array de
floats:
void funcao2( float decimais[] )
O outro detalhe vem na hora de invocar a função e passar
o vetor como argumento.
Para fazer isso basta colocar o nome do vetor, não
precisa dos pares de colchetes [] nem da dimensão do vetor.
Por exemplo, para passar vetores as funções que demos
como exemplo:
funcao(numeros);
funcao2(numeros):
Exemplo: Programa que calcula média aritmética, com vetor
e função
Crie um programa em C que peça 5 números ao usuário,
armazene esses dados em um vetor, passe esse vetor para uma função que retorna
o valor da média dos números desse vetor.
#include <stdio.h> // Curso C Progressivo: www.cprogessivo.net // O melhor curso de C! Online e gratuito ! // Artigos, apostilas, tutoriais e vídeo-aulas sobre // a linguagem de programação C ! float media(float numeros[], int n) { int count; float media=0.0; for(count=0 ; count<n ; count++) media += numeros[count]; return (media/n); }int main(void){ float numeros[5]; int count; for(count=0 ; count < 5 ; count++) { printf("Entre com o numero %d: ", count+1); scanf("%f", &numeros[count]); } printf("A media desses numeros e: %.2f\n", media(numeros, 5));
return 0;
}
Como passar matrizes (vetores multidimensionais) para funções
Este tópico está separado do anterior, pois aqui temos
mais um detalhe que precisamos aprender sobre a passagem de matrizes para
funções.
Sabemos que matrizes multidimensionais são aqueles que
possuem duas ou mais dimensões.
Vimos também em nosso tutorial sobre matrizes (ou vetoresmultidimensionais) em C, que cada dimensão da matriz exige um paz de colchetes
[ ].
Pois bem, o detalhe para passar matriz para as funções é
que o primeiro par de colchetes pode sempre ir vazio, e os demais preenchidos.
Por exemplo, vamos supor que você criou um jogo da velha,
que é uma matriz 3x3, e uma função que checa se algum jogador ganhou o jogo
completando alguma linha.
Essa função teria o seguinte cabeçalho:
int checaLinha( int matriz[][3] )
Ou seja, não precisamos especificar o número de linhas
que a matriz tem, mas somente o número de colunas.
Exemplo de código: Como preencher, exibir uma matriz e seu traço, passando a matriz para uma função em C
Crie um programa em C que peça para o usuário preencher
uma matriz 3x3, que exiba ela e o valor de seu traço em seguida. Use funções
para preencher a matriz, exibir e calcular o traço.
Esse aplicativo em C já foi totalmente resolvido como
exemplos, no artigo passado de nossa apostila de C.
O que vamos fazer aqui é criar três funções: uma para
preencher a matriz, outra pra exibir e uma que calcula o traço.
Note como a nossa função main() ficou bem limpa.
Esse é o ideal, é padrão C Progressivo!
include <stdio.h> #define DIM 3 // Curso C Progressivo: www.cprogessivo.net // O melhor curso de C, Online e gratuito ! // Artigos, apostilas, tutoriais e vídeo-aulas sobre // a linguagem de programação C ! void preencher(int matriz[][DIM]) { int linha, coluna; for(linha=0 ; linha < DIM ; linha++) for(coluna=0 ; coluna < DIM ; coluna++) { printf("Entre com o elemento matriz[%d][%d]: ", linha+1, coluna+1); scanf("%d", &matriz[linha][coluna]); } } void exibir(int matriz[][DIM]) { int linha, coluna; for(linha=0 ; linha < DIM ; linha++) { for(coluna=0 ; coluna < DIM ; coluna++) printf("%3d ", matriz[linha][coluna]); printf("\n"); } } int traco(int matriz[][DIM]) { int count, traco=0; for(count=0 ; count < DIM ; count++) traco += matriz[count][count]; return traco; }int main(void){ int matriz[DIM][DIM]; preencher(matriz); exibir(matriz); printf("\nTraco da matriz: %d\n", traco(matriz));
return 0;
}
15 comentários:
Legal, foi muito útil. Ótimo site, sempre uso para consultas.
Legal o blog, estou aprendendo muito.
Tem algum jeito de eu passar uma matriz para uma função permitindo que o usuário determine as linhas e colunas da matriz?
Eu criei uma estrturada onde vc define a qde de linhas e colunas
#include
int main(){
int DIM;
printf("Digite o tamanho da matriz que deseja criar: "); scanf("%d",&DIM);
int matriz[DIM][DIM];
int linha, coluna;
for(linha = 0 ; linha < DIM ; linha++)
for(coluna = 0 ; coluna < DIM ; coluna++)
{
printf("Elemento [%d][%d]: ", linha+1, coluna+1);
scanf("%d", &matriz[linha][coluna]);
}
for(linha = 0 ; linha < DIM ; linha++)
{
for(coluna = 0 ; coluna < DIM ; coluna++)
printf("%4d", matriz[linha][coluna]);
printf("\n");
}
system("pause");
return 0;
}
Bom dia C progressivo.
Minha dúvida é o seguinte: é regra ter que por colchetes vazio [] para linha e por um tamanho para a coluna?
Porque caso eu tenha que fazer um algoritmo que o usuário determine a dimensão da matriz, logo, a dimensão que essa matriz recebeu é local (não sei nem se estou me expressando corretamente.), no seu caso, você criou uma constante, caso eu não venha criar uma constante, comoi eu posso resolver esse problema? Att.
como eu faço para retornar um vetor de uma função para a função main
O que eu acho:
Se um vetor é passado para uma função e alterado dentro dela
e essas alterações são mantidas, para que retornar ele de uma
função ?
Se for para atribuir o conteúdo dele à outro vetor basta após
o uso da função e copiar com strcpy().
Muito bem explicado como sempre, parabéns mais uma vez ao site!!
Agora, só um pequeno detalhe:
No lugar de "matriz exige um paz de colchetes" não seria "matriz exige um PAR de colchetes"?
Mais uma vez, muito obrigado pelo ótimo curso :)
Cara, se vc tiver passado o vetor por ponteiro e tiver usando sua funçao no vetor, so usar ele normalmente, pq vc so passo o endereço da memoria nao os valores do vetor, ent e so usar normal na linha de baixo.
thiaguinhopier@yahoo.com.br , o que vc procura ira encontrar em alocaçao dinamica, ja dependendo do seu problema e do dizer pra funçao vai usar uma matriz muito grande e usar so parte dele ;D
#so nao deixando o povo na vacuo. ashushu
Estou achando ótimas todas as suas postagens no blog sobre c, muito boas mesmo!
Vocês estão me ajudando muito.
muito obrigado
Nicolas
ps. uma na página onde estou postando este comentário, no link http://www.cprogressivo.net/2013/03/Como-passar-vetores-arrays-e-Matrizes-vetores-multidimensionais-para-funcoes-emC.html
abaixo do título Como passar matrizes (vetores multidimensionais) para funções, segundo parágrafo, segunda linha desse parágrafo, tem uma letrinha trocada, diz: "paz de colchetes[]", deveria dizer "par de colchetes[]". Esta é toda a contribuição que posso dar por hora... um pequeno detalhe, que ajude neste grandioso empreendimento de ensino.
Cara, eu tava indo muito bem, mas essa parte de vetores e matrizes em funções me bugou completamente. Se possível, explica detalhado os códigos, pra ficar mais fácil de entender. Eu paralisei nesse código:
for(count=0 ; count<n ; count++)
media += numeros[count];
Me deu a tela azul do da morte eu to travado nela.
Muito bom!
Gostaria que as dimensões da matriz fossem definidas pelo usuário no inicio do programa. Somente consegui fazer o programa rodar definindo o numero de linhas e fixando o numero de coluna através do #define.
Alguém sabe me explicar como fazer isto?
#include
#include
#define ROW 3
#define WIDTH 3
int createMatrix (int matrixImput [][WIDTH], int rowsInput, int widthInput );
int main()
{
setlocale(LC_ALL, "Portuguese");
int row, width;
// printf("\t Entre com as dimensões da matrix: [ ][ ]");
// printf("\n\t Quantidade de linhas: ");
// scanf("%d", &row);
row = ROW;
width = WIDTH;
// printf("\t Quantidade de colunas: ");
// scanf("%d", &width);
int matrix[row][width];
createMatrix (matrix, row, width );
printMatrix (matrix, row, width );
}
int createMatrix (int matrix [][WIDTH], int rowsInput, int widthInput )
{
int counter_row, counter_width;
for(counter_row = 0; counter_row < rowsInput; counter_row++)
{
printf("\n");
for (counter_width = 0; counter_width < widthInput; counter_width++)
{
printf("Entre com o elemento [%d][%d]: ", counter_row + 1, counter_width + 1 );
scanf("%d", &matrix[counter_row][counter_width]);
}
}
}
int printMatrix (int matrix [][WIDTH], int rowsInput, int widthInput)
{
int counter_row, counter_width, traco = 0;
for(counter_row = 0; counter_row < rowsInput; counter_row++)
{
printf("\n\t");
traco += matrix[counter_row][counter_row];
for (counter_width = 0; counter_width < widthInput; counter_width++)
printf("%4d ", matrix[counter_row][counter_width]);
}
printf("\n");
printf("\n \tO traço da Matrix é: %4d \n", traco);
}
Boa tarde, como passo de uma função struct para uma matriz de inteiros no programa Scilab?
O exemplo funcionou. MAS quando eu tento passar um array do tipo de uma classe que eu criei, por exemplo classe "Produto" o compilador não deixa enviar o objeto declarado como parametro. Ele diz que não é possível converter Produto* para Produto(*)[100], por exemplo. Não entendi essa "conversão" necessária. Procurei por tudo, dei até passos para trás no estudo pra tentar entender, mas eu estou quase desistindo. Todos os tutoriais falam a mesma coisa, mas pra mim simplesmente NÃO FUNCIONA.
Postar um comentário