Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Josesousa

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

olá, o vetor contém somente uma dimensão e a matriz possui 2 ou mais. Nesse seu exemplo a matriz só tem uma dimensão.

  • 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)

Editado por giu_d
  • 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".

 

 

Editado por AnsiC
Ps.
  • 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.

Editado por AnsiC
Ps.

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

Editado por giu_d
Correção no código
  • 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.

Editado por Josesousa
  • 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






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

×