Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: MessageBoxA en 25 Junio 2014, 21:39 pm



Título: comprobar numero repetido en un vector
Publicado por: MessageBoxA en 25 Junio 2014, 21:39 pm
buenas estoy haciendo un juego de rol donde una de las condiciones es que no se pueda utilizar 2 poderes iguales por el mismo jugador, y no logro dar con el code adecuado

aqui una muetra de lo que hice pero esta mal debido a que el valor que ingrese lo almacena pero despues en el for caigo en decir que esta repetido aunque en realidad solo esta en una sola posicion

ayudenme gracias

Código
  1. scanf("%d",&res2);
  2.                           poderj1[indice]=res2;
  3.  
  4.                 for(int cc=0;cc<=res2;cc++)
  5.                 {
  6.                 if(poderj1[cc]==res2)
  7.                 {
  8.                 printf("\n no puedes utilizar dos poderes iguales!!!\n");
  9.                 getch();
  10.  
  11.                 }
  12.                 }
  13.                   indice=indice+1;    


Título: Re: comprobar numero repetido en un vector
Publicado por: daryo en 25 Junio 2014, 21:45 pm
has un contador que inicie en 0 que se incremente  uno cuando entra al if.

luego con otro if compruebas el contador y si es mayor a uno si entro al if mas de una vez
entonces esta repetido


Título: Re: comprobar numero repetido en un vector
Publicado por: Risketo en 25 Junio 2014, 21:54 pm
Una solución posible seria hacer un vector de igual tamaño que el vector de los poderes y ir guardando ahí los poderes usados, cada vez que el usuario elige un poder puedes comprobar si está repetido recorriendo el vector de poderes usados.
Algo así:

Código
  1. #include <stdio.h>
  2.  
  3. int main(void) {
  4.    int poderes[100];
  5.    int usados[100];
  6.    int i,poderElegido,x;
  7.  
  8.    for(i=0; i<100;i++) //Lleno el array de poderes del 0 al 99
  9.        poderes[i] = i;
  10.  
  11.    for(i=0;i<100;i++) //lleno el array de usados de '-1'
  12.        usados[i] = -1;
  13.  
  14.    i = 0;
  15.    while(i<5) { //Pido un poder y lo voy guardando en el array 'usados'
  16.        printf("Elige un poder: ");
  17.        scanf("%d",&poderElegido);
  18.        for(x=0;x<100;x++) {
  19.            if(usados[x] == poderElegido) {
  20.                printf("Ya has elegido este poder");
  21.                i = 5; //salimos del bucle si ya hemos usado ese poder
  22.            }
  23.        }
  24.        usados[i] = poderElegido;
  25.        i++;
  26.    }
  27.  
  28.    return 0;
  29. }
  30.  
  31.  


Título: Re: comprobar numero repetido en un vector
Publicado por: eferion en 25 Junio 2014, 22:06 pm
Intuyo que estás usando C++... comprobar valores duplicados es tan sencillo como:

opción 1:

Código
  1. std::vector< int > poderesUsados;
  2. int poder;
  3.  
  4. // Comprobar si ya está usado el poder
  5. // std::find esta en el include "algorithm"
  6. auto it = std::find( poderesUsados.begin( ), poderesUsados.end( ), poder );
  7. if ( it == poderesUsados.end( ) )
  8. {
  9.  // No se ha usado el poder todavía
  10.  
  11.  // marcamos el poder como usado
  12.  poderesUsados.push_back( poder );
  13. }

opción 2:

Código
  1. std::set< int > poderesUsados;
  2.  
  3. // da igual que usemos el mismo poder 20 veces... al final solo quedará un solo uso por cada poder:
  4. poderesUsados.insert( 1 );
  5. poderesUsados.insert( 2 );
  6. poderesUsados.insert( 1 );
  7. poderesUsados.insert( 1 );
  8.  
  9. // Imprimira: 1 2
  10. for( auto it = poderesUsados.begin( ); it != poderesUsados.end( ); ++it )
  11.  cout << *it << " ";
  12.  

Opción 3:

Hay infinitas formas, yo te he mostrado dos diferentes.


Título: Re: comprobar numero repetido en un vector
Publicado por: MeCraniDOS en 26 Junio 2014, 02:05 am

Código
  1. #include <stdio.h>
  2.  
  3. int main(void) {
  4.    int poderes[100];
  5.    int usados[100];
  6.    int i,poderElegido,x;
  7.  
  8.    for(i=0; i<100;i++) //Lleno el array de poderes del 0 al 99
  9.        poderes[i] = i;
  10.  
  11.    for(i=0;i<100;i++) //lleno el array de usados de '-1'
  12.        usados[i] = -1;
  13.  
  14.    i = 0;
  15.    while(i<5) { //Pido un poder y lo voy guardando en el array 'usados'
  16.        printf("Elige un poder: ");
  17.        scanf("%d",&poderElegido);
  18.        for(x=0;x<100;x++) {
  19.            if(usados[x] == poderElegido) {
  20.                printf("Ya has elegido este poder");
  21.                i = 5; //salimos del bucle si ya hemos usado ese poder
  22.            }
  23.        }
  24.        usados[i] = poderElegido;
  25.        i++;
  26.    }
  27.  
  28.    return 0;
  29. }
  30.  
  31.  

Puedes quitar todos los bucles for que has puesto, y si te fijas, poderes[100], no lo utilizas para nada, asi que malgastas memoria, este codigo es mas simple

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int usados[100] = {0};
  6.    int i=0, poderElegido=0;
  7.  
  8.    while(i<5)
  9.    {
  10.        //Pido un poder y lo voy guardando en el array 'usados'
  11.        printf("Elige un poder: ");
  12.        scanf("%d",&poderElegido);
  13.  
  14.        if(poderElegido>=0 && poderElegido<100)
  15.        {
  16.            if(usados[poderElegido] != 0)
  17.            {
  18.                printf("Ya has elegido este poder");
  19.                i = 5; //salimos del bucle si ya hemos usado ese poder
  20.            }
  21.            else
  22.            {
  23.                usados[poderElegido] = 1;
  24.            }
  25.  
  26.            i++;
  27.        }
  28.        else
  29.        {
  30.            printf("Poder invalido\n");
  31.        }
  32.    }
  33.  
  34.    return 0;
  35. }
  36.  


Saludos