ejercicio de juego primitiva c++

Iniciado por eterno21, 7 Agosto 2013, 14:40 PM

0 Miembros y 2 Visitantes están viendo este tema.

eterno21

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.

Alien-Z

#1
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 (java) [Seleccionar]
V=1+rand()%(50-1);
Debes señalar a qué posición del array V quieres acceder.

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

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

Un saludo.

eferion

#2
Cita de: eterno21 en  7 Agosto 2013, 14:40 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.

Cita de: eterno21 en  7 Agosto 2013, 14:40 PM
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

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 ]

Cita de: 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.

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 (cpp) [Seleccionar]

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

void Primitiva()
{
 std::set< int > V;

 while ( V.size( ) < 6 )
 {
   V.insert( 1 + rand( ) % 49 );
 }

 // Al llegar a este punto tendrás en V seis numeros aleatorios diferentes sin repeticiones.
}


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.

amchacon

No conocía lo de set, me lo apunto  ;)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

do-while

¡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 ==:

while(rep == 1)


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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

rir3760

Cita de: eterno21 en  7 Agosto 2013, 14:40 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í:
#define SET_ELEM  49

void Primitiva(void)
{
   int set[SET_ELEM];
   int num_elem = SET_ELEM;
   
   int num[6];
   int i;
   int j;
   
   /* Valor inicial de los elementos del set */
   for (i = 0; i < SET_ELEM; i++)
      set[i] = i + 1;
   
   /* Seleccion aleatoria de seis elementos del set */
   for (i = 0; i < 6; i++){
      j = rand() % num_elem;
      num[i] = set[j];
      set[j] = set[--num_elem];
   }
   
   /* Algun proceso (por ejemplo imprimirlos) */
   for (i = 0; i < 6; i++)
      printf(" %d", num[i]);
   putchar('\n');
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

eterno21

Hola, muchas gracias a todos, leyendo vuestros mensaje lo he resuelto de la siguiente manera:

Código (cpp) [Seleccionar]
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void Primitiva(){
     
     int V[6], i, rep, j, n;
     
     for(i=0;i<=5;i++)  V[i]=-1;
     
     i=0;
                       
     do{
                       
        rep=0;
        n=1+rand()%(50-1);
           
        for(j=0;j<=5;j++){
                               
           if (V[j]==n) rep=1;
                          }                   
        if (rep==0){
        V[i]=n;
        i=i+1;
                   }
          }while(V[5]==-1);
         
     printf("%d,%d,%d,%d,%d,%d",V[0],V[1],V[2],V[3],V[4],V[5]);
                  }
                 
int main(void){
   
    Primitiva();
   
    system ("pause");
               }


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.