Ir ao conteúdo
  • Cadastre-se
UmPrograma

C Qual a diferenca de Vetor e Matriz como parametro de função

Recommended Posts

Boa noite, como passam?

 

Estava a resolver um exercicio de ponteiro, mas precisamente de matriz. Nele pedia que passasse para uma funcao a matriz como parametro.

Pois bem, quando resolvo exercicios de vetor é simples (nem tanto ahaha). Fica da seguinte forma.


int main(){
  int funcao(int *vet);
  funcao(vet);
}
    
int funcao (int *vet){
  ....}

Mas matriz fica da seguinte forma. ( nao sei se esta certo, mas esta rodando)

int main(){
	int mat[4][4]; /// declaracao normal
  int funcao(int mat[][4]);  ///chamando a funcao, so que sem o uso de '*' como no vetor, porque?
  funcao(mat);

}
int funcao(int mat[][4]{
  ....}

Acredito que nao esteja sendo passado o parametro da matriz. Estou certo? Podem me ajudar.

 

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uai, como faco para passar ela inteira?

Tem que usar o    '*'   ?

 

adicionado 14 minutos depois

Pois dessa forma que está, qualquer mudanca que eu fizer dentro da funcão ficará restrista na função. E ponteiro nao funciona dessa forma.

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Josesousa Olá. Só corrigindo o q foi falado pelo @rodrygo costa1001 . No exemplo acima da matriz q você passou e deu o nome de mat ela é bidimensional (Duas dimensões - linha/coluna)

  • Curtir 2
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu achei um artigo que talvez possa lhe ajudar da uma olhada segue dois links abaixo:

https://www.inf.pucrs.br/~pinho/LaproI/Vetores/Vetores.htm

 

https://www.ime.usp.br/~mms/mac1222s2013/3 - funcoes vetores matrizes.pdf

 

espero ter ajudado.

adicionado 1 minuto depois
4 minutos atrás, giu_d disse:

@Josesousa Olá. Só corrigindo o q foi falado pelo @rodrygo costa1001 . No exemplo da matriz q você passou e deu o nome de mat acima ela é bidimensional (Duas dimensões - linha/coluna)

obrigado por corrigir 

  • Curtir 2
  • Obrigado 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 horas atrás, Josesousa disse:

Uai, como faco para passar ela inteira?

Não tem como passarmos ela inteira; o que nós passamos é o valor do endereço dela na memória; Mais precisamente, o endereço do primeiro elemento na matriz; como nas matrizes os elementos são estaticamente e automaticamente criados em sequência, por meio do primeiro acessamos o todo, usando os seus índices.

 

 

6 horas atrás, Josesousa disse:

Tem que usar o    '*'   ?

Tem no sentido de obrigação: Não;

 

Basicamente existem dois tipos de nomenclaturas, e podemos optar por quaisquer uma delas; as de vetores: que é introdutória a estrutura de dados, e de ponteiros: que é persistente durante o resto dos estudo.

Por exemplo: os 3 protótipos abaixo são, funcionalmente falando, iguaizinhos:

 int funcao(int  mat[][4]);  // 1- caso: nomeclatura de vetores
 int funcao(int     **mat);  // 2- caso: nomeclatura de ponteiros
 int funcao(int (*mat)[4]);  // 3- caso: nomeclatura de vetores + ponteiros

Ps.: claro que o 2- caso é muito mais complicado que os outros.

 

 

Dúvidas, críticas ou sugestões?

 

 

 

adicionado 9 minutos depois
6 horas atrás, Josesousa disse:

Pois dessa forma que está, qualquer mudanca que eu fizer dentro da funcão ficará restrista na função. E ponteiro nao funciona dessa forma.

Negativo! Essa nomenclatura, é como dizem por ai, "uma passagem por referência".

 

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz esse poste pois estava a resolver o seguinte exercicio.

 

/**42. Faça uma função que receba, por parâmetro, uma matriz A(8,8) e retorne o menor valor dos
 elementos acima da diagonal secundária.*/
#include <stdio.h>
#include <locale.h>
#include <time.h>
main (){
    int mat[4][4], i,j;
    setlocale(LC_ALL,"Portuguese");
    srand(time(NULL));
    printf("Os valores da matriz serão preenchidos automaticamente.");
    for(i=0;i<4;i++){
        for(j=0;j<4;j++){
            mat[i][j]=rand()%50;
        }
    }
    printf("\n\n");
    int menor(int *mat[][4]);
    menor(&mat);
    for(i=0;i<4;i++){
        for(j=0;j<4;j++){
            printf("Matriz [%d][%d]: %d.\n",i,j,mat[i][j]);
        }
    }
    printf("O menor numero acima da coluna secundaria e o %d.\n", menor(mat));

}
int menor(int *mat[][4]){
    int i, j, pequeno;
    pequeno=mat[0][0];
    for(i=0;i<4;i++){
        for(j=0;j<4;j++){
            if(j<=4-i-2){
                if(pequeno > mat[i][j]){
                    pequeno=mat[i][j];
                }
            }
        }
    }
    return pequeno;
}

Ele esta funcionando, mas acredito que haja algo de errado nele.

adicionado 2 minutos depois
6 horas atrás, AnsiC disse:

int funcao(int mat[][4]); // 1- caso: nomeclatura de vetores

int funcao(int **mat); // 2- caso: nomeclatura de ponteiros

int funcao(int (*mat)[4]); // 3- caso: nomeclatura de vetores + ponteiros

Pesquisei na internet antes de resolver esse exercicio, nao achei nenhuma dessas forma de fazer. Alias, apenas a primeira que tinha exemplo na internet.

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Josesousa disse:

Alias, apenas a primeira que tinha exemplo na internet.

Se você se refere ao 1- caso, são coisas diferentes, e a função menor nem devia está funcionado, por conta do (*) asterisco. Observe:

 

int menor(int *mat[][4]);
int menor(int  mat[][4])

Os dois protótipos acima são diferentes quanto a tipo de dados na estrutura:

o primeiro  caso é um ponteiro para matriz de ponteiros (tipo int), com 4 de largura de coluna;

o segundo caso é um ponteiro para matriz de inteiro (tipo int), com 4 de largura de coluna.

 

Como disse a função menor tem erros lógicos que, com a retirado do (*) e mudanças no algoritmo, concertamos.

1 hora atrás, Josesousa disse:

Pesquisei na internet antes de resolver esse exercicio, nao achei nenhuma dessas forma de fazer.

"Você optou por resolver usando nomenclatura de vetores", então:

int menor (int mat[][4]){
    int i, j, pequeno;
  
    pequeno = mat[0][0];
    for (i = 0; i < 4; i++){
        for (j = 0; j < 4; j++){
                if(pequeno > mat[i][j]){
                    	pequeno = mat[i][j];
                }
        }
    }
    return pequeno;
}

Essa é a forma, ou talvez a melhor forma de resolver!

 
 
Ps.:
1 hora atrás, Josesousa disse:

Ele esta funcionando, mas acredito que haja algo de errado nele.

 

Há sim! E não deveria funcionar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC  Valeu amigo.

Ai no caso so colocar esse "if" dentro de outro, já que quero o menor numero acima da diagonal secundaria.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 minutos atrás, Josesousa disse:

Ai no caso so colocar esse "if" dentro de outro, já que quero o menor numero acima da diagonal secundaria.

Ha desculpa, sim claro!

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

So para finalizar, nao hora de eu passar a matriz para funcao eu acabei colocando o '&', sendo que nem faço isso com vetor. então depois das mudancas que voce mostrou ai acima, ainda modifiquei o seguinte trecho:

1 hora atrás, Josesousa disse:

menor(&mat);/// ERRADO

menor(mat); /// AGORA SIM

Agora esta tudo beleza. :D

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Josesousa Olá. Apenas um ponto q gostaria de frisar com relação ao cálculo do menor valor da diagonal secundária:

Você está inicializando a sua variável pequeno dessa forma:

pequeno = mat[0][0];

Mas perceba q o elemento dessa posição não faz parte da diagonal secundária. Logo, o problema q isso pode gerar é q esse elemento pode ser o menor

O ideal seria isso:

pequeno = mat[0][3];

que é a primeira posição válida para a comparação.

Outro ponto: No if para definir a diagonal secundária experimenta isso:

if (j + i == 3)

Logo, sua função ficaria assim (fiz uma soma apenas p teste aqui):

int menor(int mat[4][4]){

    int i, j, menor;
    int soma = 0;

    menor = mat[0][3];

    for (i = 0; i < 4; i++){
        for (j = 0; j < 4; j++){
            if (j + i == 3) {
                soma += mat[i][j];
                if (menor > mat[i][j]) {
                    menor = mat[i][j];
                }
            }
        }
    }
    printf("\nSoma dos valores da diagonal secundária: %d\n", soma);

    return menor;
}

Testa aí para ver se dá certo, ok?

Sei q foge do assunto do tópico mas gostaria de passar esse ajuste q vejo ser necessário

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d Opa, valeu amigo.

Nessa parte :

20 minutos atrás, giu_d disse:

if (j + i == 4 - 1)

voce faz para achar a diagonal secundaria.

Eu no caso faco da seguinte forma para achar a diagonal secundaria.

if(i==4-1-j)
 // ou
if(j==4-1-i)

Mas no caso, o exercicio pede que ache o menor numero ACIMA da diagonal secundaria. Ai achei eu formula ai.

3 horas atrás, Josesousa disse:

if(j<=4-i-2)

 

OBS: Eu cheguei ate a diminuir o o tamanho da matriz para ficar mais fácil confirir os numeros acima.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
45 minutos atrás, Josesousa disse:

OBS: Eu cheguei ate a diminuir o o tamanho da matriz para ficar mais fácil confirir os numeros acima

Neste caso podemos escrever um código-fonte +global;

int menor(int lado, int quadrado[][lado]){
    int i, j, pequeno;
    
        pequeno = quadrado[0][0];
        for(i = 0; i < lado; i++){
            for(j = 0; j < lado; j++){
                if(j <= (lado-i-2)){
                    if(pequeno > quadrado[i][j]){
                        pequeno = quadrado[i][j];
                    }
                }
            }
        }
    return pequeno;
}

 

adicionado 1 minuto depois

Agora está além de 4x4!

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

:oops:É o menor número ACIMA da diagonal secundária e não o menor número da diagonal secundária...  

Me enganei um pouco.. rs

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×