Jump to content
Fórum Script Brasil
  • 0

Como remover elemento de um vetor em C ?


Binder

Question

Olá pessoal, gostaria de saber como remover um elemento inteiro de um vetor[100]. Após o elemento ser apagado não posso deixar espaço em branco no vetor.

Obs: Não posso utilizar função e nem ponteiros... Como devo fazer isso na linguagem C?

Exemplo : 10 20 30 40 50. (preenchi apenas as primeiras 5 posições do meu vetor)

Apaguei: 30

Vetor atual : 10 20 40 50.

Obrigado.

Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

Tecnicamente é impossível não deixar espaço em branco... Mesmo que você mova as posições seguintes para frente, vai ficar um espaço em branco na última posição.

Mas a solução é mais ou menos essa: Pegue a posição do elemento que quer tirar, sobrescreva-o com seu elemento seguinte, e vá fazendo este processo até chegar ao final do vetor.

Link to comment
Share on other sites

  • 0

Olá mJi,obrigado pela força... Fiz meu codigo, porem acho que tem erro. Pois eu digito os seguintes numeros (1,5,20,50,100), e peço para excluir o numero 5.

Era para ficar assim (1,20,50,100)

Mas está ficando assim (1,20,20,50,0)

Obs: "Ultimo", variavel para controle do vetor, percorre somente aonde está preenchido o vetor. Meu vetor é de 100 posições.

printf("Remover codigo igual a: \n");
scanf("%d",&removecodigo);

for(i=0;i<ultimo;i++)
{

    if(vet[i].codigo == removecodigo) 
    {
       vet[i].codigo = vet[i+1].codigo;
       vet[ultimo-1].codigo = 0;
    }
    printf("codigo = %d\n",vet[i].codigo);
}

Link to comment
Share on other sites

  • 0

Você está atribuindo ao código que quer remover, o seu sucessor, e isto está correto. Mas você tem de sobreescrever também este sucessor pelo seu sucessor, e fazer isto até chegar ao fim. Ou seja, você tem de mover todos os elementos do vetor que vêm depois do código que você quer remover, uma casa para a esquerda.

Um segundo 'for' dentro do 'if' pode fazer isto.

Link to comment
Share on other sites

  • 0

Com esse seu código você sempre perderá o valor do <ultimo-1> elemento. A cada passada do loop você atribui 0 nessa posição.

Eu não entendi se você tem o tamanho do vetor (qtd de valores preenchidos) ou se você usa um valor de controle no fim do vetor, para marcar onde ele acaba.

Também não entendi se você quer remover todas as ocorrências de um certo "código" do vetor, ou se todas.

Eu fiz esse código rapidinho, ele utiliza um sentinela no fim e remove apenas a primeira incidência do valor.

Espero que ajude:

#include <stdio.h>

int main (int argc, char* argv[])
{
    int vetor[100] = {0,5,10,20,30, -42}; // preeencher vetor com scanf

    int remove, sentinela, i;

    remove = 5;                     // preeencher depois com scanf
    sentinela = -42;                // você disse que usa um controle, ele
                                    // deve estar sempre presente no fim do vetor   
    i = 0;
    while (vetor[i] != sentinela)
    {
        if (vetor[i] == remove)
        {
            vetor[i] = vetor[i + 1];
            if (vetor[i] != sentinela)
               vetor[i + 1] = remove;
        }

        i++;
    }

    for (i = 0; vetor[i] != sentinela; i++)
        printf("%d\n", vetor[i]);
return 0;
}

Link to comment
Share on other sites

  • 0

Estou usando structs, e tenho um vetor de 100 posições vet[100]. Insiro manualmente os valores no vetor(não preciso preencher ele

até o final) Ex: preencho apenas 5 valores nele o resto fica em branco. Utilizo uma variavel chamada "ultimo", e faço um for

para percorrer de 0 até ultimo(ultima posição preenchida no meu vetor).

Preciso remover um numero que exista no vetor, e alocar todos seus posteriores para esquerda até o final do vetor.

Ex: Digitei isso no vetor: (1,5,20,50,100)

Removi o numero: 5

Ficaria assim: (1,20,50,100).

Obs: não aprendi ainda a utilizar "sentinela", e não posso utilizar funções,ponteiros... tenho que fazer no "for",mesmo.

mas desde já agradeço pela sua atenção.

Link to comment
Share on other sites

  • 0

Olá!

O código que você criou está quase certo. Como dito pelo mJi, faltou apenas o for que faria a cópia de todos os elementos a seguir, não apenas o seguinte.

Assim o código correto seria:

printf("Remover codigo igual a: \n");
scanf("%d",&removecodigo);

for(i=0;i<ultimo;i++)
{

    if(vet[i].codigo == removecodigo)
    {
       for(j=i; j<ultimo-1; j++)
          vet[j].codigo = vet[j+1].codigo;
       ultimo--;
    }
    printf("codigo = %d\n",vet[i].codigo);
}

Não precisamos "apagar" o valor do último elemento pois ele não será exibido. E devemos subtrair 1 da variável último pois removemos 1 elemento.

O loop do j percorre até último-1 pois dentro do loop acessamos o elemento seguinte ao contador.

Não esqueça de declarar a variável j!

Link to comment
Share on other sites

  • 0

Fiz um parecido:

#include <stdio.h>

main()

{

int v[12]={3,6,4,7,11,5,78,90,23,90,51,0};

int i, remove;

printf("O vetor atual contem os seguinte numeros: 3,6,4,7,11,5,78,90,23,90,51,0.\n");

printf("Informe o numero que deseja excluir:\n");

scanf("%d", &remove);

for(i=0;i<=11;i++)

{

if (remove==v)

{

v = v[i + 1];

v[i + 1] = remove;

}

}

printf("O novo vetor é:");

for (i = 0; i<=10; i++)

{

printf("%d, ", v);

}

system("pause");

}

Link to comment
Share on other sites

  • 0
Em 01/11/2011 at 16:28, Marcelo Utikawa da Fonseca disse:

Olá!

 

O código que você criou está quase certo. Como dito pelo mJi, faltou apenas o for que faria a cópia de todos os elementos a seguir, não apenas o seguinte.

Assim o código correto seria:

 

Alguém pode me enviar esse código completo?

 

printf("Remover codigo igual a: \n");
scanf("%d",&removecodigo);

for(i=0;i<ultimo;i++)
{

    if(vet[i].codigo == removecodigo)
    {
       for(j=i; j<ultimo-1; j++)
          vet[j].codigo = vet[j+1].codigo;
       ultimo--;
    }
    printf("codigo = %d\n",vet[i].codigo);
}

 

 

Não precisamos "apagar" o valor do último elemento pois ele não será exibido. E devemos subtrair 1 da variável último pois removemos 1 elemento.

O loop do j percorre até último-1 pois dentro do loop acessamos o elemento seguinte ao contador.

Não esqueça de declarar a variável j!

 

Link to comment
Share on other sites

  • 0
Em 01/11/2011 at 16:28, Marcelo Utikawa da Fonseca disse:

Olá!

 

O código que você criou está quase certo. Como dito pelo mJi, faltou apenas o for que faria a cópia de todos os elementos a seguir, não apenas o seguinte.

Assim o código correto seria:

 

 

 

printf("Remover codigo igual a: \n");
scanf("%d",&removecodigo);

for(i=0;i<ultimo;i++)
{

    if(vet[i].codigo == removecodigo)
    {
       for(j=i; j<ultimo-1; j++)
          vet[j].codigo = vet[j+1].codigo;
       ultimo--;
    }
    printf("codigo = %d\n",vet[i].codigo);
}

 

 

Não precisamos "apagar" o valor do último elemento pois ele não será exibido. E devemos subtrair 1 da variável último pois removemos 1 elemento.

O loop do j percorre até último-1 pois dentro do loop acessamos o elemento seguinte ao contador.

Não esqueça de declarar a variável j!

 

De qualquer forma, quando o programa encontrar o mesmo valor (dado pelo usuário e guardado na variável removecodigo) na posição subsequente do vetor, ele irá simplesmente ignorá-lo.

Link to comment
Share on other sites

  • 0
Em 31/10/2011 at 23:51, Binder disse:

Olá pessoal, gostaria de saber como remover um elemento inteiro de um vetor[100]. Após o elemento ser apagado não posso deixar espaço em branco no vetor.

 

Obs: Não posso utilizar função e nem ponteiros... Como devo fazer isso na linguagem C?

 

 

 

 

Exemplo : 10 20 30 40 50. (preenchi apenas as primeiras 5 posições do meu vetor)

Apaguei: 30

Vetor atual : 10 20 40 50.

 

 

 

Obrigado.

Amigo, você pode usar ponteiros para essa ação

Um exemplo bem tosco de como você pode fazer essa operação e obter o resultado que você deseja

    int vetor[5]; // Vetor que contém os valores
    int* vetorNovo=(int *)malloc(sizeof(int)); // Ponteiro para o novo vetor
    int* InicioDoVetorNovo=vetorNovo; // Posição inicial do 'vetorNovo'

    vetor[0]=10; // Simulando entrada de valores
    vetor[1]=20;
    vetor[2]=30;
    vetor[3]=40;
    vetor[4]=50;

	// Aqui vem a 'manha' você pode substituir os valores 'apagados' por algum caractere especial
    vetor[2]='\#'; // No caso usei '#', aqui não ocorre problema de definição de tipo porque o '\#' é o um 'número', por isso esse exemplo não é muito eficiênte. Mas funciona
    vetor[4]='\#';
	
	// Ira mostrar os dados
    printf("%i, %i, %c, %i, %c",vetor[0],vetor[1],vetor[2],vetor[3],vetor[4]); 

    for(int i=0;i<5;i++) // 5 é o tamnho do vetor que pode ser obtido com à função 'strlen'
    {
      	// Caso o valor contido em 'vetor' seja diferente do caractere especial que você usou
        if(vetor[i] != '\#' && vetor[i] != NULL) // 
        {
            *vetorNovo=vetor[i]; // Adiciona esse valor no seu vetor
            vetorNovo++; // Soma '''''+1 int'''''' no vetorNovo
          	/*
            	Caso você desconheça o uso de ponteiros, o melhor é começar a estuda-los quando você estiver um pouco mais afiado na linguagem  
           */
        }
    }
    vetorNovo=InicioDoVetorNovo; // Recupera o ind de mémoria do 'vetorNovo'					   /-----> VETORNOVO ESTÁ REPETIDO
     printf("\n%i, %i, %i, %i, %i",vetorNovo[0],vetorNovo[1],vetorNovo[2],vetorNovo[3],vetorNovo[3]); // Mostra todos os valores do vetor que não foram '''apagados'''

//Você também pode remover o vetor antigo, mas como esse código é básico, não tem a nescessidade de performace

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...