Ir ao conteúdo
  • Cadastre-se
Josesousa

C Vetor: deixar em branco as posições nulas e negativas.

Recommended Posts

Olá, com vão?

Gostaria de pedir ajuda de vcs para resolver este problema que deparei na questão.

Pois bem, o exercicio pede que eu retire os valores nulos e negativos do vetor, passando para o vetor B. 

Pensei em utilizar de if para fazer com que o vetor b recebe-se apenas os valores que fossem positivos, ate ai tudo bem, mas os numeros restantes do vetor acabam por se ocupados por lixo na memoria e a questa pede que seja deixado em branco essas posições. 

Se poderem me ajudar fico grato.

OBS: Fiz com o for para mostrar o vetor b fosse ate o ultimo numero positivo encontrado no vetor A, pelo cont;

 

/**Lista 2 22. Faça um algoritmo que leia um vetor (A) de 100 posições. Em seguida, compacte o vetor, retirando os
valores nulos e negativos, colocando o resultado em um vetor B de 100 posições (deixe em branco as
 posições não utilizadas).**/
#include <stdio.h>
#include <stdlib.h>
main(){
    const int tam=10;
    int veta[tam], vetb[tam];
    int i,j,cont=0;

    printf("Entre com os valores do vetor!\n");
    for(i=0;i<tam;i++){
        printf("Vetor [%d]: ", i);
        scanf("%d", &veta[i]);
    }
    for(i=0;i<tam;i++){
        if(veta[i]>0){
            vetb[cont]=veta[i];
            cont++;
        }

    }

    printf("\n\nVETOR FINAL!\n");
    for(i=0;i<cont;i++){
        printf("Vetor [%d]: %d\n", i, vetb[i]);

    }


return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

A sua lógica está próxima do correto, falta pensar um pouco. Primeiramente se você pretende trabalhar com 2 vetores de 100, é necessário que o seu código receba este tanto de posição para os 2 vetores

 

	
    int tamA = 0;
    int tamB = 0;
	printf("Entre com o tamanho do vetor A \n");
	scanf("%d", &tamA);
	printf("Entre com o tamanho do vetor B \n");
	scanf("%d", &tamB);

 

Entenda que o método de inserção é uma operação com uma taxa de custo alta. Mas de qualquer forma, o que você precisa fazer para alcançar o seu objetivo aqui é o seguinte, pergunte ao usuário onde ele deseja acessar por exemplo usando seu código eu fiz:

 

 

    for(i = 0; i<tamA; i++){
    printf("Qual pos da array você quer acessar amigo");
    scanf("%d", &tamA);    
    printf("voce acessou a posicao %d", i);
    }
                       
     /*tag code só me deixa usar HTML lol*/

Acima indicamos ao usuário o lugar que ele pretende acessar para excluir esta posição, mas antes você precisa fazer um if para jogar direto pro vetor B qualquer valor menor que 0 e igual a 0 desta forma

 

    printf("Entre com os valores do vetor!\n");
    for(i=0;i<tamA;i++){
        printf("Vetor [%d]: ", i);
        scanf("%d", &veta[i]);
        if(veta[i] == 0 || veta[i] < 0){
            vetb[i] = veta[i];
        printf("o valor %d foi passado para o vetor B", i);
        }

e por ultimo é o passo mais fácil, para que eu nao resolva o exercicio e faça com que a resposta seja deletada, observe que após você acessar a posição onde foi retirado do vetor a e passado para o vetor b, este ficara em 0, para que isso seja contornado é necessario a exclusão daquele espaço de memória. Para poder excluir, voce precisa acessar a proxima posição da array e colocar na posição anterior desta forma: "veta = veta[i + 1]; utilizando um for para percorrer o vetor. Após isso imediamente fora do loop você tem que obrigatóriamente reduzir o tamanho do vetor e pronto!

 

 

OBS: só tenha certeza de que quando você percorrer as posições do vetores e manipula-los tenha certeza de que o valor da posição a ser excluida nunca é igual a tam = tam+1 nem que seja menor que 0.
  

 

  • Confuso 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
for(i=0;i<tam;i++){
        if(vetb[i]1<=0){
            j=i;
            do{
                if(j<tam-1){
                    k=j+1;
                    aux=vet[j];
                    vebt[j]=vetb[k];
                    vetb[k]=aux;
                    j++;
                    k++;
                }
            }while (vetb[tam] < tam);
        }
    }

Era isso que voce estava falando?, para fazer no final...? (peguei de um outro exercicio que tinha feito, que e um pouco parecido)

Mas mesmo assim nao entendi o motivo de voce pergunta ao usuario o tamanho dos dois vetores no inicio do programa e o motivo de você passar para o vetor b os numeros menores ou igual a zero. Eu tinha entendido que era para passar para ele os numeros que nao fossem menor/igual a zero, ficando compactado em relação ao vetor A.

 

  • Confuso 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @Josesousa.

 

1#
A primeira coisa a se fazer é entender o que se quer ser feito... vamos lá:

 

Na sua postagem tem:

2 horas atrás, Josesousa disse:

[...] o exercicio pede que eu retire os valores nulos e negativos do vetor, passando para o vetor B.

Tá, o que vai ser passado para o vetor B? é "os valores nulos e negativos do vetor" ou vai passar o que sobra após serem removidos esses valores? Ficou confuso para mim.

 

Mas lá no código tem:

2 horas atrás, Josesousa disse:

/**Lista 2 22. Faça um algoritmo que leia um vetor (A) de 100 posições. Em seguida, compacte o vetor, retirando os valores nulos e negativos, colocando o resultado em um vetor B de 100 posições (deixe em branco as posições não utilizadas).**/

Tá! Agora entendi!

 

Beleza! Parece que o código está fazendo isso, apenas faltado o relatado:

2 horas atrás, Josesousa disse:

[...] mas os numeros restantes do vetor acabam por se ocupados por lixo na memoria e a questa pede que seja deixado em brando essas posições.


Uma forma de resolver é utilizando um novo for para ir de cont+1 até tam... e insere "0".

 

Na hora de imprimir o vetor B, vai de 0 a tam.

 

 

 

2#
@xxnikobellicxx, sobre:

1 hora atrás, xxnikobellicxx disse:

Primeiramente se você pretende trabalhar com 2 vetores de 100, é necessário que o seu código receba este tanto de posição para os 2 vetores

Muito provavelmente está usando um tamanho menor para efetuar testes... o resultado com 10 será o mesmo que o resultado com 100... bastaria mudar o tamanho após tiver tudo pronto para entregar...

 

Então, o tamanho do vetor é fixo... ou seja, não é necessário perguntar para o usuário... sempre será 100 (no caso não tem problema usar 10 ou menos enquanto está implementando...)

 

 

 

3#

@xxnikobellicxx, sobre:

1 hora atrás, xxnikobellicxx disse:

Entenda que o método de inserção é uma operação com uma taxa de custo alta. Mas de qualquer forma, o que você precisa fazer para alcançar o seu objetivo aqui é o seguinte, pergunte ao usuário onde ele deseja acessar por exemplo usando seu código eu fiz:


    for(i = 0; i<tamA; i++){
    printf("Qual pos da array você quer acessar amigo");
    scanf("%d", &tamA);    
    printf("voce acessou a posicao %d", i);
    }
                       
     /*tag code só me deixa usar HTML lol*/

e

1 hora atrás, xxnikobellicxx disse:

Acima indicamos ao usuário o lugar que ele pretende acessar para excluir esta posição,


Pelo que eu entendi, isso não faz parte do escopo. O objetivo é ler um vetor, gerar um segundo vetor quer será a compactação do primeiro (retirado os "nulos e negativos"). Só isso!

 

 

 

4#

@xxnikobellicxx, sobre:

1 hora atrás, xxnikobellicxx disse:

[...], mas antes você precisa fazer um if para jogar direto pro vetor B qualquer valor menor que 0 e igual a 0 desta forma


    printf("Entre com os valores do vetor!\n");
    for(i=0;i<tamA;i++){
        printf("Vetor [%d]: ", i);
        scanf("%d", &veta[i]);
        if(veta[i] == 0 || veta[i] < 0){
            vetb[i] = veta[i];
        printf("o valor %d foi passado para o vetor B", i);
        }

 

Creio que não seja assim... ai você está "correspondendo as posições entre os vetores"... ou seja, o vetor vetor seria o vetor inicial, sendo que os "nulos e negativos" não seriam copiados... mas veja, o que o enunciado pede é uma compactação... ou seja, creio que seria o que o @Josesousa fez mesmo...:

2 horas atrás, Josesousa disse:

    for(i=0;i<tam;i++){
        if(veta[i]>0){
            vetb[cont]=veta[i];
            cont++;
        }

 

 

***

 

No aguardo.

 

 

 

 

 

 

adicionado 1 minuto depois

UPDATE

 

5#

@Josesousa, sobre:

8 minutos atrás, Josesousa disse:

Eu tinha entendido que era para passar para ele os numeros que nao fossem menor/igual a zero, ficando compactado em relação ao vetor A.

 

Justamente! Só faltou inserir 0 no restante das posições...

 

Pelo menos eu entendi assim.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu @Simon Viegas  e @xxnikobellicxx  pela ajuda.

Eu no exercicio estava querendo eliminar os valores zero ou negativo, deixando em branco as suas posições que nao foram utilizadas depois da compactacao. Acabou que eu deixei esses numeros nas ultimas posições......

Nao sei se colocar zero no lugar surtira efeito vista que o exercicio pede para elimina-los. 

Acredito que nao tenha como exibir uma posicao se ela nao tem valor.

Brigadão!!!!!!!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Josesousa Seu código original já está correto ( tá faltando só colocar o tipo int no main() ), já faz o que o enunciado pede, compacta o vetor A no vetor B, retirando os valores negativos ou iguais a 0, e não preenche o restante das posições que sobram no vetor B com mais nada (também não diz para imprimir essas posições, então não importa que fica com lixo de memória).

adicionado 19 minutos depois

 

Obs: Também é possível inicializar todas as posições do vetor com valor 0 na sua declaração:

int vetb[100] = {0};

 

  • Curtir 2
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre:

1 hora atrás, Simon Viegas disse:

Uma forma de resolver é utilizando um novo for para ir de cont+1 até tam... e insere "0".

 

Seria algo assim:

    for(i=cont+1;i<tam;i++)
       vetb[i]=0;

 

Ai no caso, se usar o:

48 minutos atrás, isrnick disse:

int vetb[100] = {0};

 

O for acima não seria mais necessário...

 

 

 

Sobre:

1 hora atrás, Simon Viegas disse:

Na hora de imprimir o vetor B, vai de 0 a tam.

 

Seria algo assim:

    printf("\n\nVETOR FINAL!\n");
    for(i=0;i<tam;i++){
        printf("Vetor [%d]: %d\n", i, vetb[i]);

    }

 

 

RESUMINDO:

Precisa vera antes o que de fato precisa... a solução sempre deve depender de qual é o problema.

 

 

 

 

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu cheguei a implementar da sua forma @Simon Viegas . 

 

Ficando exatamente da forma que voce fez aí.

Citação
13 minutos atrás, Simon Viegas disse:


for(i=cont+1;i<tam;i++){
    if(veta[i]>0){
         vetb[i]=0;
    }
}

 

E dessa forma tambem.

13 minutos atrás, Simon Viegas disse:

printf("\n\nVETOR FINAL!\n");
for(i=0;i<tam;i++){
      printf("Vetor [%d]: %d\n", i, vetb[i]);
}

 

Muito obrigado pela ajuda..... Valeu...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Observação:

3 minutos atrás, Josesousa disse:

Eu cheguei a implementar da sua forma @Simon Viegas . 

 

Eu editei o código... mas acho que não deu tempo... seria assim:

    for(i=cont+1;i<tam;i++)
       vetb[i]=0;

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, sim.

Agora que fui reparar a existencia do if no codigo antes de voce editar.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
49 minutos atrás, Josesousa disse:

Sim, sim.

Agora que fui reparar a existencia do if no codigo antes de voce editar.

O que eu estava dizendo é que quando você disse sobre usar um if, em poucas palavras sim, use o if para quando o usuario digitar um valor que você nao deseja, ele armazena no vetor b, e você exclui uma posição do tamanho do A, entendeu?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@xxnikobellicxx, sobre:

Em 05/06/2018 às 17:09, xxnikobellicxx disse:

O que eu estava dizendo é que quando você disse sobre usar um if, em poucas palavras sim, use o if para quando o usuario digitar um valor que você nao deseja, ele armazena no vetor b, e você exclui uma posição do tamanho do A, entendeu?

 

Então, a implementação do algoritmo depende especificamente do enunciado, veja;
 

Em 05/06/2018 às 12:07, Josesousa disse:

/**Lista 2 22. Faça um algoritmo que leia um vetor (A) de 100 posições. Em seguida, compacte o vetor, retirando os valores nulos e negativos, colocando o resultado em um vetor B de 100 posições (deixe em branco as posições não utilizadas).**/

 

O vetor tem que ler os 100 números e  depois compactar o vetor... sendo que essa compactação é "jogar" no vetor B os números que não são nulos E não são negativos, ou seja, o mesmo que "maiores que 0".

 

O if  no programa pode ser usado para selecionar o que é "maior que 0"... ou seja, NÃO é para "armazenar o que não deseja", pelo contrário, o que não deseja deve ser ignorado... e o vetor inicial não é mexido.. fica intacto.

 

RESUMINDO:

Você estaria tentando fazer algo que não foi pedido... O vetor B vai ter todos os números do vetor inicial, com exceção dos números nulos (igual a 0) E dos números negativos (menores que 0)..  como dito, é o mesmo que "só ter os números positivos do primeiro vetor"). Nada mais que isso.

 

Creio que a única questão em aberto é em que significa "deixe em branco as posições não utilizadas'.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas A única dúvida que que fiquei realmente foi   "deixe em branco as posições não utilizadas".

No mais, é isso mesmo a resolução do exercicio.

At.te

Jovem Programador.

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

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

×