Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Varredura de array durante a inserção

Preciso fazer um programa em C no qual é necessário comparar valores dentro de um único vetor. Nesse programa eu peço para o usuário digitar os valores a serem armazenados dentro do vetor, porém, se o valor digitado for repetido, ou seja, já foi digitado anteriormente o programa deve pedir para o usuário digitar outro valor e não aceitar o valor repetido, além disso os valores devem ser armazenados na ordem em que são digitados .

Enfim, eu não sei como fazer essa varredura do array para verificar se o número que estou inserindo já foi inserido e já se encontra dentro do array. Realmente é um exercídio do qual não faço idéia de pra onde funciona.

4 respostas

Pessoal, quabrando um pouco a cabeça eu acabei fazendo o algoritmo abaixo, mas não sei se é exatamente a solução mais elegante (simples) para o caso. Se puderem me digam se está certo ou se eu deveria mudar algo (Eu realmente sou meio perdido, porque não sou da área de tecnologia e sou iniciante mesmo, minha formação é Direito)



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



int main(int argc, char **argv)

{
    int i=0, j=0, vet[5],x;

    for (i=0;i<5;i++){
    puts ("Digite um número");
    scanf ("%d", &x);
        for (j=0;j<i;j++){
            if(x==vet[j]){
                puts ("Esse você já digitou");
                i--;

            }
            else 
            vet[i]=x;    

            }


    }


    return 0;
}

Não é muito legal ficar alterando o índice do loop dentro do corpo do loop. O ideal seria algo como:

for (i=0; i<5; i++) {
    int ja_existe = 0; // flag para indicar que o valor já existe no array
    do {
        // ler o valor
        // crie um loop aqui para checar se o valor já existe no array e alterar a flag  ja_existe
    } while (ja_existe);

    // insere o novo valor no array
}

Fazer 3 loops não complica mais? Não entendi bem seu algoritmo.

solução!

Olá Lucas, sim, fica complicado colocar vários loops aninhados assim. O legal é você identificar esses loops que fazem uma função específica no seu algoritmo e separá-lo em uma nova função. Quanto a manipular os índices, normalmente quando alguém lê um loop, espera-se que o valor do índice vá sempre pra frente (ou sempre diminua, o importante é ir sempre numa direção). Quando o valor do índice é alterado dentro do loop fica mais difícil alterar o código, e mais difícil identificar bugs.

for (i=0; i<5; i++) {
    int ja_existe = 0; // flag para indicar que o valor já existe no array
    do {
        // ler o valor
        // testar se o valor já existe. criamos uma nova função para evitar diversos loops aninhados
        ja_existe = busca_valor_no_vetor(vet, i, x);
    } while (ja_existe);

    // insere o novo valor no array
}

// (...)

int busca_valor_no_vetor(int[] vetor, int tamanho, int valor) {
    // crie um loop aqui para checar se o valor já existe no array
}