Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fael_magnata

Problema ao ordenar pares e impares usando um vetor

Recommended Posts

Pessoal estou com um problema ao criar um programa que leia 15 numeros inteiros e ordene eles em um vetor de 15 posiçoes, primeiros os numeros pares e depois o impares, tentei usar aritmetica de ponteiro e agora apenas usando 2 variaveis aux, mas o sempre ocorre o mesmo erro, os impares separam certinho mas o par, ele separa e depois de separar coloca os resto dos numeros depois deles denovo, segue meu codigo pra quem puder me ajudar.

#include <stdlib.h>
#include <stdio.h>

int main(){

int vetor[30];
int i;

  for(i=0;i<=29;i++)
  {
     vetor[i] = 0;
  }
    int auxpar = 0;
    int auximpar = 29;

  for(i=0;i<=14;i++)
  {
     printf("entre com um valor inteiro para a %d posicao do vetor: ",i+1);
     scanf("%i",&vetor[i]);

     if((vetor[i] % 2)==1){
       vetor[auximpar] = vetor[i];
       auximpar--;
     }else{

       vetor[auxpar] = vetor[i];
       auxpar++;
     }

  }

    printf("\n\n");

     for(i=0;i<=29;i++)
  {
     printf("%d - %p\n",vetor[i],&vetor[i]);
  }

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

for(i=0;i<=29;i++) {
   vetor[i] = 0;
}

 

A biblioteca padrão possui formas mais simples de efetuar uma inicialização em memória como essa: memset

http://www.lainoox.com/c-memset-examples/

 

Por que você está criando um array com 30 posições? Crie um com 15 posições, leia e depois execute um algoritmo de ordenação qualquer em cima dele mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
for(i=0;i<=29;i++) {
   vetor[i] = 0;
}

A biblioteca padrão possui formas mais simples de efetuar uma inicialização em memória como essa: memset

http://www.lainoox.com/c-memset-examples/

 

Por que você está criando um array com 30 posições? Crie um com 15 posições, leia e depois execute um algoritmo de ordenação qualquer em cima dele mesmo.

Criei um array maior para a visualizaçao dos pares de uma lado e os impares de outro com numeroes zeros entre eles, so pra efeito de visualizaçao, depois voltaria a deixa-lo no tamanho 15

Compartilhar este post


Link para o post
Compartilhar em outros sites
Criei um array maior para a visualizaçao dos pares de uma lado e os impares de outro com numeroes zeros entre eles, so pra efeito de visualizaçao, depois voltaria a deixa-lo no tamanho 15

 

Trabalho desnecessário.

Faça o que o exercício pede. Vai ter tempo suficiente no restante do curso p/ fazer coisas mais complicadas.

 

Você tem duas opções:

1- Ir separando os pares dos ímpares à medida que for lendo os inteiros e depois, ao final da leitura, utilizar um método de ordenação qualquer passando as posições iniciais e finais dos "sub-arrays".

2- Ir ordenando os "sub-arrays" à medida que for lendo (precisa de mais variáveis p/ dar conta do início e final de cada "sub-array")

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

#include <stdio.h>
#define MAX 10

void leitura(int *array, int *final_pares, int *inicio_impares) {
   int i;
   int tmp_leitura;

   for(i=0; i<MAX; i++) {
      printf("Informe o %dº inteiro:",i+1);
      scanf("%d", &tmp_leitura);

      if (!tmp_leitura) continue; // Evitando o zero.
      if ((tmp_leitura % 2) == 0) { // Armazenamento dos pares.
         array[(*final_pares)+1] = tmp_leitura;
         (*final_pares)++;
      } else {
         array[(*inicio_impares)-1] = tmp_leitura;
         (*inicio_impares)--;
      }
   }
}

void impressao(const int * array) {
   int i;
   for(i=0; i<MAX; i++) {
      printf("%d%c", array[i], (i==MAX-1)?'\n':' ');
   }
}
 
void ordenar(int * array, int inicio, int final) {
   int i,j;
   int tmp;

   for(i=inicio+1; i<final; i++) {
      tmp = array[i];
      j = i-1;
      while ((j>=inicio) && (tmp < array[j])) {
         array[j+1] = array[j];
         j--;
      }
      array[j+1] = tmp;
   }
}

int main(void) {
   int numeros[MAX];
   int final_pares, inicio_impares;

   final_pares = -1;
   inicio_impares = MAX;

   leitura(numeros, &final_pares, &inicio_impares);
   puts("Array lido:");
   impressao(numeros);

   ordenar(numeros, 0, inicio_impares);
   ordenar(numeros, inicio_impares, MAX);
   puts("Array ordenado:");
   impressao(numeros);
   return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#define MAX 10

void leitura(int *array, int *final_pares, int *inicio_impares) {
   int i;
   int tmp_leitura;

   for(i=0; i<MAX; i++) {
      printf("Informe o %dº inteiro:",i+1);
      scanf("%d", &tmp_leitura);

      if (!tmp_leitura) continue; // Evitando o zero.
      if ((tmp_leitura % 2) == 0) { // Armazenamento dos pares.
         array[(*final_pares)+1] = tmp_leitura;
         (*final_pares)++;
      } else {
         array[(*inicio_impares)-1] = tmp_leitura;
         (*inicio_impares)--;
      }
   }
}

void impressao(const int * array) {
   int i;
   for(i=0; i<MAX; i++) {
      printf("%d%c", array[i], (i==MAX-1)?'\n':' ');
   }
}
 
void ordenar(int * array, int inicio, int final) {
   int i,j;
   int tmp;

   for(i=inicio+1; i<final; i++) {
      tmp = array[i];
      j = i-1;
      while ((j>=inicio) && (tmp < array[j])) {
         array[j+1] = array[j];
         j--;
      }
      array[j+1] = tmp;
   }
}

int main(void) {
   int numeros[MAX];
   int final_pares, inicio_impares;

   final_pares = -1;
   inicio_impares = MAX;

   leitura(numeros, &final_pares, &inicio_impares);
   puts("Array lido:");
   impressao(numeros);

   ordenar(numeros, 0, inicio_impares);
   ordenar(numeros, inicio_impares, MAX);
   puts("Array ordenado:");
   impressao(numeros);
   return 0;
}

Nossa seu algoritmo ficou muito bem estruturado, vou levar um tempo analisando ele, muito obrigado pela ajuda!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

for(i=0;i<=29;i++) {
   vetor[i] = 0;
}

A biblioteca padrão possui formas mais simples de efetuar uma inicialização em memória como essa: memset

http://www.lainoox.com/c-memset-examples/

Pra inicializar tipos compostos, sugiro:

 

T a[i][j][k]... = { 0 };

Essa inicialização é bem-definida conforme 6.7.9 (n12570) ou 6.7.8 (n1256).

[/code]

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.