Ir ao conteúdo
  • Cadastre-se

C# Função que retorna o maior elemento de um vetor


Maria_epbn
Ir à solução Resolvido por Simon Viegas,

Posts recomendados

Meu programa esta dando falha de segmentação nessa função. 

 

Uma função que recebe dois vetores, o seu tamanho e uma variável ponteiro. A função deve achar o maior elemento do vetor v1 e o menor elemento do vetor v2. A função deve retornar o valor do maior elemento de v1.

void *MaiorMenor (float *vet1, float *vet2, int tam, float *maior)
{   float *menor;
    int i;

  maior = (float*)malloc(tam * sizeof(float));
   
    for(maior=0; maior<tam; maior++)
    { for(i=0; i<tam; i++)
      {  if(*(vet1+(tam-i-1)) > *maior) 
         {  *maior = *(vet1+(tam-i-1));
         }
      }
    }
  menor = (float*)malloc(tam * sizeof(float));
    for(menor=0; menor<tam; menor++)
    { for(i=0; i<tam; i++)
      {  if(*(vet2+(tam-i-1)) < *menor) 
         {  *menor = *(vet1+(tam-i-1));
         }
      }
    }
  return (maior);
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
  • Solução

Olá.

 

Sobre:

8 horas atrás, Maria_epbn disse:

    for(maior=0; maior<tam; maior++)
    { for(i=0; i<tam; i++)
      {  if(*(vet1+(tam-i-1)) > *maior) 
         {  *maior = *(vet1+(tam-i-1));
         }
      }
    }

 

 

Para que seria esse primeiro for?

 

Mas em fim... você está utilizando a variável maior tanto para controlar esse for, tanto para receber o "maior valor". Não me faz sentido... além do mais, como é um quantidade fixa de loops, assim como foi feito no segundo for, poderia utilizar um int comum.

 

RESUMINDO:
Apague o primeiro for e deixe apenas o segundo. Não precisa de "um for dentro do outro". Simplesmente irá "comparar o maior com a primeira até a última posição".

 

 

Obs.: como existe um if que compara o valor de maior, se faz necessário garantir que esta variável tenha algum valor logo na primeira comparação. Perceba que você apenas alocou a memória para o maior, mas não definiu valor para ele. Uma solução boa para inicializar os "maiores" e "menores" costumam ser atribuindo o primeiro valor a eles, ou seja, após as variáveis estarem prontas para o uso, defini o maior e menor como sendo o primeiro, daí, o for já começará da segunda posição em diante (posição 1).

 

 

No aguardo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Você tinha razão aquele primeiro for estava errado.

Agora ficou assim a função e não está mais dando erro.

Muito obrigada pela ajuda!

void *MaiorMenor (float *vet1, float *vet2, int tam, float *maior)
{   float *menor;
    int i;

  maior = (float*)malloc(tam * sizeof(float));
  maior = (vet1+0);

      for(i=0; i<tam; i++)
      {  if(*(vet1+(tam-i-1)) > *maior) 
         {  *maior = *(vet1+(tam-i-1));
         }
      }
    
  menor = (float*)malloc(tam * sizeof(float));
  menor = (vet2+0);

      for(i=0; i<tam; i++)
      {  if(*(vet2+(tam-i-1)) < *menor) 
         {  *menor = *(vet1+(tam-i-1));
         }
      }
    
  return (maior);
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@Maria_epbn, são dois vetores? um verificará o maior do primeiro e o outro verificar o menor do segundo?

 

Outra coisa: o i deve começar a partir da posição 1 (segunda posição), pois maior e menor já estão com o valor da posição 0 (primeira posição), ou seja, estará comparando um valor com ele mesmo desnecessariamente (vejo como erro de lógica).

 

Mais outra coisa:

Eu não manjo de C#, mas se o método é void, provavelmente ele não tem retorno, logo aquele return estaria errado. Pelo que suponho, o retorno dos valores vem pelo próprio parâmetro... inclusive provavelmente esse deve ser o motivo de usar ponteiros... além do mais, o método trás duas resposta!!! porque daria "privilégio" para o maior? no caso, em vez de retornar na próprio função, os valores serão retornados pelo parâmetro.

 

 

RESUMINDO:

- comece os for a partir da segunda posição (1);

- remova esse return "solto" ai, pois o método é void.

 

No aguardo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...