elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ejercicio de juego primitiva c++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ejercicio de juego primitiva c++  (Leído 3,522 veces)
eterno21

Desconectado Desconectado

Mensajes: 10


Ver Perfil
ejercicio de juego primitiva c++
« 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.


En línea

Alien-Z

Desconectado Desconectado

Mensajes: 177


C++ Programmer


Ver Perfil
Re: ejercicio de juego primitiva c++
« Respuesta #1 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.


« Última modificación: 7 Agosto 2013, 15:27 pm por Alien-Z » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: ejercicio de juego primitiva c++
« Respuesta #2 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.
« Última modificación: 7 Agosto 2013, 15:29 pm por eferion » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: ejercicio de juego primitiva c++
« Respuesta #3 en: 7 Agosto 2013, 16:08 pm »

No conocía lo de set, me lo apunto  ;)
En línea

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


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: ejercicio de juego primitiva c++
« Respuesta #4 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!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ejercicio de juego primitiva c++
« Respuesta #5 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
En línea

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

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: ejercicio de juego primitiva c++
« Respuesta #6 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[EJERCICIO] El juego de "Que ves?"
Ejercicios
DarkItachi 8 10,220 Último mensaje 16 Mayo 2009, 23:25 pm
por DarkItachi
[Ejercicio] Aca tienen un ejercicio para practicar « 1 2 3 »
Programación Visual Basic
Dreamaker 20 15,810 Último mensaje 5 Septiembre 2010, 02:57 am
por TGa.
[Juego] Juego muy adictivo que arme, les juro que es divertido.
Programación Visual Basic
79137913 5 4,273 Último mensaje 1 Octubre 2010, 15:30 pm
por 7omer
ejercicio conclase pag 70 ejercicio 1
Programación C/C++
flony 2 4,321 Último mensaje 17 Octubre 2010, 12:16 pm
por Akai
Conoces este juego? A que nivel has llegado? El Juego mas dificil del mundo « 1 2 »
Juegos y Consolas
jdc 12 16,667 Último mensaje 28 Septiembre 2012, 22:46 pm
por Bomb-P
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines