Ir ao conteúdo

Posts recomendados

Postado

    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;
}

 

Postado

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

 

Postado
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

 

 

Postado

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
Postado

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
Postado

@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 ? 

Postado

não. precisa de uma variável para marcar quantos pares já gravou e outra para os ímpares, ou vai zoar os dois vetores...
 

    int pos_par = 0;
    int pos_impar = 0;

E quando for gravar no vetor use o índice certo e incremente

  • Curtir 1
Postado

Sempre há. É como o Adriano escreveu. Mas o seu deu errado porque gravou nos dois na mesma posição que o original e sempre vão ficar buracos de um lado ou de outro. Não se esqueça de testar com todos pares e todos ímpares....

Postado

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

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