Ir ao conteúdo
  • Cadastre-se

C Problema com código para separar vetor inteiro em pares e ímpares


nhgarcia

Posts recomendados

    Bom dia a todos do fórum!!!

    Sou novo em programação e estou tendo um probleminha com um código simples para separar um vetor em outros dois (pares e ímpares).

    Sei que há no fórum outros tópicos sobre o mesmo assunto, mas, com códigos diferentes. Sinceramente eu gostaria de saber o que há de errado no código abaixo que ele, ao invés de mostrar os vetores só com os pares e ímpares, ele mostra números malucos, como se fosse do endereço de memória. Eu simplesmente não sei resolver. Desde já agradeço :

 

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

int main(){
    setlocale(LC_ALL, "portuguese");

int vpr[8]; // vetor principal
int vpar[8]; // vetor par
int vimp[8]; // vetor ímpar
int i;

for(i=0;i<8;i++){
    printf("Digite o valor da posição %d do vetor: ",i);
    scanf("%d",&vpr[i]);
}
for(i=0;i<8;i++){
    printf("%d - ",vpr[i]); // testando se os números digitados estão sendo armazenados no vetor
}
printf("\n");
for(i=0;i<8;i++){
    if(vpr[i] % 2 == 0){
        vpar[i] = vpr[i];

    }else{
         vimp[i] = vpr[i];
    }
}

printf("O vetor par tem os seguintes números: {");
for(i=0;i<8;i++){
    printf("%d",vpar[i]);
}
printf("} \n");
printf("O vetor ímpar tem os seguintes números: {");

for(i=0;i<8;i++){
    printf("%d,",vimp[i]);
}
printf("} \n");
return 0;
}

 

Link para o comentário
Compartilhar em outros sites

@herbertbahia Boa tarde Herbert! Obrigado por sua atenção....fiz como disse. criei um contador para pares e ímpares e apliquei no código como você disse (ver abaixo). Porém, agora,  se eu digitar só par ok, dá certo, e da mesma forma se eu digitar só impar tb dá certo. O problema agora é se eu digitar par e ímpar no vetor...aí, continua aparecendo os números malucos...veja abaixo. 

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

int main(){
    setlocale(LC_ALL, "portuguese");

int vpr[8];
int vpar[8];
int vimp[8];
int i,contpar,contimpar;

contpar = 0; // contador para pares
contimpar = 0; // contador para ímpares

for(i=0;i<8;i++){
    printf("Digite o valor da posição %d do vetor: ",i);
    scanf("%d",&vpr[i]);
}
for(i=0;i<8;i++){
    printf("%d - ",vpr[i]); // testando se os números digitados estão sendo armazenados no vetor
}
printf("\n");
for(i=0;i<8;i++){
    if(vpr[i] % 2 == 0){
        vpar[i] = vpr[i];
        contpar += 1; // incrementa contador par se par
    }else{
         vimp[i] = vpr[i];
         contimpar+=1; //incrementa contador ímpar se ímpar
    }
}

printf("O vetor par tem os seguintes números: {");
for(i=0;i<contpar;i++){ //imprime os pares
    printf("%d,",vpar[i]);
}
printf("} \n");
printf("O vetor ímpar tem os seguintes números: {");

for(i=0;i<contimpar;i++){ // imprime os ímpares
      printf("%d,",vimp[i]);

}
printf("} \n");
return 0;
}

Veja abaixo o resultado da execução do código acima: 

Digite o valor da posição 0 do vetor: 1
Digite o valor da posição 1 do vetor: 2
Digite o valor da posição 2 do vetor: 3
Digite o valor da posição 3 do vetor: 4
Digite o valor da posição 4 do vetor: 5
Digite o valor da posição 5 do vetor: 6
Digite o valor da posição 6 do vetor: 7
Digite o valor da posição 7 do vetor: 8
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 -
O vetor par tem os seguintes números: {4199040,2,0,4,6356656,}
O vetor ímpar tem os seguintes números: {1,1963938880,3,1963619953,5,}

Process returned 0 (0x0)   execution time : 6.225 s
Press any key to continue.

 

Link para o comentário
Compartilhar em outros sites

for(i=0;i<8;i++)
{
    printf("%d - ",vpr[i]); // testando se os números digitados estão sendo armazenados no vetor
}
printf("\n");
for(i=0;i<8;i++)
{
    if(vpr[i] % 2 == 0)
    {
        vpar[i] = vpr[i];

    }
    else
    {
         vimp[i] = vpr[i];
    }
}

Sua ideia de se assegurar de que tem algo lá foi boa e por incrível que pareça não é comum. Muitos programas de estudantes não mostram as variáveis lidas para dar uma segurança... Mesmo o cara sabendo que pode apagar depois quando estiver funcionando. E o outro caminho, que seria acompanhar os valores no debugger, não é comum entre estudantes, outro erro. eu acho, mas aí dos instrutores

 

Agora o segundo loop, que faz o serviço de separar, não partiu de uma boa ideia: você está até separando os caras em dois vetores, mas colocando na mesma posição em que eles estavam no vetor original. E claro que não tem controle sobre o que está nas outras posições. Se os primeiros forem pares e os 4 últimos ímpares você vai ter os pares nas posições de 0 a 3 do vetor par e os ímpares nas posições de 4 a 7 do vetor de ímpares. Mas e o resto dos vetores? Você tem que usar um índie para cada vetor e ir contando os caras...

 

@herbertbahia tem razão no diagnóstico e na solução :) falta só entender que não pode usar o mesmo índice para os 3 vetores porque vai deixar buracos nos vetores de saída

 

 

Link para o comentário
Compartilhar em outros sites

esqueça os contadores achei outros problemas mas resolvi assim

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

int main(){
    setlocale(LC_ALL, "portuguese");

int vpr[8]={};//ELES ESTÃO RECEBENDO VALOR NA HORA QUE ESTÃO SENDO DECLARADOS
int vpar[8]={};//ADICIONE ISSO PARA FICAREM VAZIOS NA DECLARAÇÃO
int vimp[8]={};
int i;
for(i=0;i<8;i++){
    printf("Digite o valor da posição %d do vetor: ",i);
    scanf("%d",&vpr[i]);
    if(vpr[i] % 2 == 0){
        vpar[i] = vpr[i];
    }else{
         vimp[i] = vpr[i];
    }
}
for(i=0;i<8;i++){
    printf("%d - ",vpr[i]); // testando se os números digitados estão sendo armazenados no vetor
}
printf("\n");

printf("O vetor par tem os seguintes números: {");
for(i=0;i<8;i++){ //imprime os pares
if(vpar[i]!=0)//evita imprimir posicao vazia
    printf("%d,",vpar[i]);
}
printf("} \n");
printf("O vetor ímpar tem os seguintes números: {");

for(i=0;i<8;i++){ // imprime os ímpares
if(vimp[i]!=0)//evita imprimir posicao vazia
      printf("%d,",vimp[i]);

}
printf("} \n");
}

 

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

Como o @arfneto disse, precisa de índices de inserção separados para cada vetor:

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

int main() {
    setlocale(LC_ALL, "portuguese");

    int vpr[8];     // vetor principal
    int vpar[8];    // vetor par
    int vimp[8];    // vetor ímpar

    int insercaoPar = 0;    // Onde vai inserir no vetor par
    int insercaoImpar = 0;  // Onde vai inserir no vetor impar

    for (int i = 0; i < 8; i++) {
        printf("Digite o valor da posição %d do vetor: ", i);
        scanf("%d", &vpr[i]);
        
        // Limpa o lixo de memória dos vetores
        vpar[i] = 0;
        vimp[i] = 0;
    }

    for (int i = 0; i < 8; i++) {
        printf("%d - ", vpr[i]); // testando se os números digitados estão sendo armazenados no vetor
    }
    
    printf("\n");

    for (int i = 0; i < 8; i++) {
        if (vpr[i] % 2 == 0) {
            vpar[insercaoPar] = vpr[i];
            insercaoPar += 1;
        } else {
            vimp[insercaoImpar] = vpr[i];
            insercaoImpar += 1;
        }
    }

    printf("O vetor par tem os seguintes números: {");

    for (int i = 0; i < insercaoPar; i++) {
        printf("%d ", vpar[i]);
    }
    
    printf("} \n");
    printf("O vetor ímpar tem os seguintes números: {");

    for (int i = 0; i < insercaoImpar; i++) {
        printf("%d ", vimp[i]);
    }

    printf("} \n");
    return 0;
}

 

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

@arfneto obrigado por sua atenção...eu imaginei que por serem vetores diferentes (vpar, vimpar) e limitando o tamanho, conforme me orientou o Herbert, a posição dos índices poderiam ser de 0 a 3, por exemplo; porque são vetores diferentes. Agora, deixa ver se entendi....os índices diferentes aos quais você se refere, seria eu usar variáveis diferentes no loop? tipo, i,j,k ? 

Link para o comentário
Compartilhar em outros sites

Segue outro exemplo com funcionamento automático:

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

void imprimeVetor(int *vetor, int tamanho);

int main() {
    int quantidade = 10;    // Quantidade maxima de elementos
    int insercaoPar = 0;    // Onde inserir no vetor par
    int insercaoImpar = 0;  // Onde inserir no vetor impar

    int valores[quantidade];    // Contem todos os elementos
    int pares[quantidade];      // Contem apenas os pares
    int impares[quantidade];    // Contem apenas os impares

    // Preenche os vetores
    srandom(time(NULL));
    for (int i = 0; i < quantidade; ++i) {
        valores[i] = (int) random() % 10 + 1;
        pares[i] = 0;
        impares[i] = 0;
    }

    // Separa os valores
    for (int i = 0; i < quantidade; ++i) {
        if (valores[i] % 2 == 0) {
            pares[insercaoPar] = valores[i];
            insercaoPar += 1;
        } else {
            impares[insercaoImpar] = valores[i];
            insercaoImpar += 1;
        }
    }

    // Exibe o relatorio
    printf("-------------------------------------------------- \n");
    printf("Valores: ");
    imprimeVetor(valores, quantidade);
    printf("  Pares: ");
    imprimeVetor(pares, insercaoPar);
    printf("Impares: ");
    imprimeVetor(impares, insercaoImpar);
    printf("-------------------------------------------------- \n");

    return EXIT_SUCCESS;
}

/**
 * Imprime o vetor de maneira organizada.
 *
 * @param vetor   Vetor que sera impresso.
 * @param tamanho Tamanho do vetor.
 */
void imprimeVetor(int *vetor, int tamanho) {
    printf("{");

    for (int i = 0; i < tamanho; ++i) {
        printf("%i", vetor[i]);

        if ((i + 1) < tamanho) {
            printf(", ");
        }
    }

    printf("} \n");
}

 

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!