Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: eterno21 en 7 Agosto 2013, 14:40 pm



Título: ejercicio de juego primitiva c++
Publicado por: eterno21 en 7 Agosto 2013, 14:40 pm
Hola, tengo que hacer el siguiente ejercicio:"Escribir una función que genere 6 números aleatorios entre 1 y 49, de la misma forma que en la primitiva. Obviamente, los números no pueden ser repetidos."

La manera que he pensado es rellenando un vector con estos 6 numeros y lo he hecho de la siguiente manera:

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

void Primitiva(){
     
     int V[6], i, rep, j;
     
     V[0]=1+rand()%(50-1);
     
     for(i=1;i<=5;i++){
                       
        do{
           V=1+rand()%(50-1);
           rep=0;
           
           for(j=i-1;j>=0;j--){
                               
              if (V==V[j]) rep=1;
                              }
          }while(rep=1)
                       }
     }

El caso es que me señala en rojo la linea que esta justo debajo del while y la verdad es que no entiendo que error puede haber.¿Alguien ve este posible error?, muchas gracias y un saludo.


Título: Re: ejercicio de juego primitiva c++
Publicado por: Alien-Z en 7 Agosto 2013, 15:22 pm
Se puede hacer más sencillo y eficiente.

1- Inicializa las posiciones del array a -1.
2- Crea un bucle que vaya generando números aleatorios y tenga como condición de continuación "while(V[5] == -1)", es decir, mientras no hayamos conseguido el último número aleatorio.
3- Dentro debe haber otro bucle anidado que, después de generar un número aleatorio, recorra el array comprobando que no lo tengas ya, si no lo tienes lo guarda en la siguiente posición y comienza una nueva iteración del bucle principal.

Tu código tiene 3 errores sintácticos:

Código
  1. V=1+rand()%(50-1);
Debes señalar a qué posición del array V quieres acceder.

Código
  1. if (V==V[j]) rep=1;
Aqui lo mismo.

Código
  1. }while(rep=1)
Los bucles do-while llevan un punto y coma ";" al final.

Un saludo.


Título: Re: ejercicio de juego primitiva c++
Publicado por: eferion en 7 Agosto 2013, 15:26 pm
La manera que he pensado es rellenando un vector con estos 6 numeros y lo he hecho de la siguiente manera:

Entre los controles para escribir los mensajes en el foro hay un combobox que dice "GeSHi"... si lo despliegas y eliges 'c' o 'c++' ( en función de tu código ) y metes después tu código dentro de la etiqueta que te va a generar conseguirás que tu código sea más legible y fácil de leer.

El caso es que me señala en rojo la linea que esta justo debajo del while y la verdad es que no entiendo que error puede haber.¿Alguien ve este posible error?, muchas gracias y un saludo.

Te falta un punto y coma. Cuando es un bucle while normal no necesita punto y coma... cuando es un bucle do-while sí.

Además, en la línea

Código
  1. V=1+rand()%(50-1);

Tienes otro error... V tendría que ser V[ i ] * Imagino que es porque no has metido el código entre las etiquetas [ code ]

Hola, tengo que hacer el siguiente ejercicio:"Escribir una función que genere 6 números aleatorios entre 1 y 49, de la misma forma que en la primitiva.

El caso es que si lo estás haciendo en c++ puedes aprovechar también las bondades de este lenguaje para que haga por ti parte del trabajo sucio.

Me explico. Hay una clase en c++ que es 'set'. Es una lista o vector que tiene la peculiaridad de que no puede tener elementos repetidos... si adaptas un poco tu código te puedes olvidar de chequear si el número generado aleatoriamente se encuentra ya en la lista o no.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. #include <set>
  5.  
  6. void Primitiva()
  7. {
  8.  std::set< int > V;
  9.  
  10.  while ( V.size( ) < 6 )
  11.  {
  12.    V.insert( 1 + rand( ) % 49 );
  13.  }
  14.  
  15.  // Al llegar a este punto tendrás en V seis numeros aleatorios diferentes sin repeticiones.
  16. }

Obviamente si estás programando en c esta no es una solución viable... pero en el asunto del mensaje has puesto 'c++'

Un saludo.


Título: Re: ejercicio de juego primitiva c++
Publicado por: amchacon en 7 Agosto 2013, 16:08 pm
No conocía lo de set, me lo apunto  ;)


Título: Re: ejercicio de juego primitiva c++
Publicado por: do-while en 7 Agosto 2013, 16:22 pm
¡Buenas!

(rep=1) siempre es cierto, ya que estás asignando a rep el valor 1, y luego utilizas el valor de rep (1) para evaluar la condición. Para compararlo utiliza el doble igual ==:
Código
  1. while(rep == 1)
  2.  

Y por supuesto, como ya te han dicho, en un do-while, después del paréntesis que cierra la condición del while, hay que poner un punto y coma.

¡Saludos!


Título: Re: ejercicio de juego primitiva c++
Publicado por: rir3760 en 7 Agosto 2013, 18:14 pm
tengo que hacer el siguiente ejercicio:"Escribir una función que genere 6 números aleatorios entre 1 y 49, de la misma forma que en la primitiva. Obviamente, los números no pueden ser repetidos."
¿Estas aprendiendo C o C++?

Una forma fácil de generar números aleatorios no repetidos cuando el rango de estos es pequeño es simplemente seleccionar de forma aleatoria los elementos del set.

En C++ un ejemplo ya lo tienes cortesía de eferion. En C se puede implementar así:
Código
  1. #define SET_ELEM  49
  2.  
  3. void Primitiva(void)
  4. {
  5.   int set[SET_ELEM];
  6.   int num_elem = SET_ELEM;
  7.  
  8.   int num[6];
  9.   int i;
  10.   int j;
  11.  
  12.   /* Valor inicial de los elementos del set */
  13.   for (i = 0; i < SET_ELEM; i++)
  14.      set[i] = i + 1;
  15.  
  16.   /* Seleccion aleatoria de seis elementos del set */
  17.   for (i = 0; i < 6; i++){
  18.      j = rand() % num_elem;
  19.      num[i] = set[j];
  20.      set[j] = set[--num_elem];
  21.   }
  22.  
  23.   /* Algun proceso (por ejemplo imprimirlos) */
  24.   for (i = 0; i < 6; i++)
  25.      printf(" %d", num[i]);
  26.   putchar('\n');
  27. }

Un saludo


Título: Re: ejercicio de juego primitiva c++
Publicado por: eterno21 en 7 Agosto 2013, 18:41 pm
Hola, muchas gracias a todos, leyendo vuestros mensaje lo he resuelto de la siguiente manera:

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4.  
  5. void Primitiva(){
  6.  
  7.     int V[6], i, rep, j, n;
  8.  
  9.     for(i=0;i<=5;i++)  V[i]=-1;
  10.  
  11.     i=0;
  12.  
  13.     do{
  14.  
  15.        rep=0;
  16.        n=1+rand()%(50-1);
  17.  
  18.        for(j=0;j<=5;j++){
  19.  
  20.           if (V[j]==n) rep=1;
  21.                          }                  
  22.        if (rep==0){
  23.        V[i]=n;
  24.        i=i+1;
  25.                   }
  26.          }while(V[5]==-1);
  27.  
  28.     printf("%d,%d,%d,%d,%d,%d",V[0],V[1],V[2],V[3],V[4],V[5]);
  29.                  }
  30.  
  31. int main(void){
  32.  
  33.    Primitiva();
  34.  
  35.    system ("pause");
  36.               }
  37.  

No se como se me pudo olvidar poner los [] en algunos de los vectores(un despiste increible), pero bueno, he puesto con el printf la comprobacion y da bien todo con numeros distintos, lo que pasa es que son muy parejos, no se si tendria que usar "srand (time(NULL))" para que no salieran tan parejos. La verdad es que lo del set es muy bueno ya que estoy estudiando c++, pero no se si me dejaran usarlo, aunque yo creo que si y es una muy buena solucion, muchas gracias a todos de nuevo y un saludo.