none
vector

    Pregunta

  • hola a todos estoy haciendso una pequeñ aplicacion con visual c++ 2005, uy bueno una de mis funciones es q me permitaordenar una serie de botones en forma desordenada dependiendo del valor q tenga una posicion de un arreglo llenado con numeros aleatorios (de 1 a 16) pero sin numeros repetidos...


    cuando ejecuto me ordena de forma aleratoria el problema está en la funcion para generar los numeros aleatorios, al parecer me genera numeros repetidos por q monta a los botones uno encima de otros

    bueno esta es mi modo de generar mi arreglo de numeros aleatorios y ordenar los botones de acuerdo a la posicion:

    private: System::Void Arreglo(){
     randomize();
     vector[0]=rand()%16+1;
     for(c=1;c<=15;c++){
      ale = rand()%16+1;
      for(int i=0;i<=c;i++)
      {
       if(vector[i]==ale)
       {   
        ale = rand()%16+1;
        i=0;
       }
      }
      vector[c]=ale;
     }
    }
      
    private: System::Void Ubica(){

    this->Arreglo();
    if(vector[0]==1){
      this->button1->Location=System::Drawing::Point(12,43);
      this->pb1->Location = System::Drawing::Point(12, 43);
      }else if(vector[0]==2)
      {
         this->button2->Location=System::Drawing::Point(12,43);
         this->pb2->Location = System::Drawing::Point(12, 43);
      }else if(vector[0]==3)
      {
         this->button3->Location=System::Drawing::Point(12,43);
         this->pb3->Location = System::Drawing::Point(12, 43);
      }else if(vector[0]==4)
      {
         this->button4->Location=System::Drawing::Point(12,43);
         this->pb4->Location = System::Drawing::Point(12, 43);
    }
    //este es solo un extracto


    espero me puedan ayudarcon este probleita, anticipadamente mil gracias...
    un abrazo a to2 salu2...

    sábado, 07 de noviembre de 2009 16:57

Respuestas

  • hola!!


    puedes hacer que cada vez que generes un numero aleatorio lo guardes en un arreglo

    pero antes comparar el numero obtenido con los que ya estan guardados en el arreglo

    y si el elemento ya existe que te lo genere nuevamente hasta que el numero generado por el random

    no este en ninguna posicion del arreglo.


    si no lo puedes hacer me dices y yo te explico como.

    aqui la idea es que al menos lo intentes

    suerte!!!


    DavidDDR david_fer1@hotmail.com
    miércoles, 11 de noviembre de 2009 16:36
  • mmm, no he entendido muy bien porque no se puede hacer, el problema es que el código que te puedo pasar en en C#, pero la lógica te sirve igual, de hecho esto lo resuelve :P

    (hay tres For pero son sólo a modo de ejemplo:
     -  el primero crea el vector con valores del 1 al 16
     -  después se desordena
     -  seguidamente hay otro for para ver el resultado
     -  el último es el que te interesa, dónde se calculan las posiciones de la cuadrícula y se extraen los valores, en tu caso "las claves" de los controles a insertar)

               int maxim = 16;
    
                v = new int[maxim];
                for (int i = 0; i < maxim; )
                {
                    v[i] = ++i;
                    Console.Write(" {0}", v[i - 1]);
                }
                Console.WriteLine();
    
                desordenaVector(v);
    
                Console.WriteLine("Vector desordenado: ");
                for (int i = 0; i < maxim; i++)
                {
                    Console.Write(" {0}", v[i]);
                }
                            
                int px = Console.CursorLeft, 
                    py = Console.CursorTop;
    
                for (int i = 0; i < 4; i++)
                    for (int j = 0; j < 4; j++)
                    {
                        Console.SetCursorPosition(px + j * 4, py + i);
                        Console.Write(v[i * 4 + j].ToString());
                    }
    
    
                Console.WriteLine();
    
    // hasta aquí la función principal; seguido, el método de desordenación
    
            static void desordenaVector(int[] v)
            {
                Random r = new Random();
                for (int i = 0; i < v.Length; i++)            
                {
                     int temp;
                     temp = v[i];
    
                     v[i] = v[r.Next(0, v.Length - 1)];
                     v[r.Next(0, v.Length - 1)] = temp;
    
    
                     Thread.Sleep(1);
                }
            }

    (donde "r.Next(int, int)" devuelve un valor random entre dos valores)

    aquí se está escribiendo sobre la consola, pero igualmente necesitas tener unas coordenadas sobre las que trabajar, así en vez de "Console.CursorLeft" y "Console.CursorTop", dale un 'left' y un 'top' que enmarquen la cuadrícula. Creo que en tu ejemplo la primera posición estaba en Point (12, 43), bien pues a partir de ahí con sacas el resto de coordenadas y, como decía Leandro, con un switch asignas un botón conforme al valor contenido,


    un saludo
    miércoles, 11 de noviembre de 2009 16:58

Todas las respuestas

  • hola

    una aclaración este foro es sobre c#, no c++.net, si quieres puedo mover el mensaje de foro


    ahora bien igual la sentencia entre los lenguajes no es tan distinta, asi que por ahi te hago algunas recomendaciones

    - puedo ver que los botones se enciman porque a todos les has puesto la misma posición:

    this->button1->Location=System::Drawing::Point(12,43);
    this->pb1->Location = System::Drawing::Point(12, 43);

    o sea todos tienen 12,43  creo que deberías poner valores diferentes, o calcularlo dinamicamente.


    - otro punto veo que usas un if.. else if para comparar cada valor posible de vector no te convendria hacer uso del switch


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 07 de noviembre de 2009 18:55
  • hola leandro, pucha disculpa, el codigo en si no lo quiero para c++ lo quiero pra c#, esta bien aca no mas, ademas si lo mueven pa c++, te aseguro q no obtendre muchas respuestas, ya que no hay muchas personas q reponden en ese foro....

    con respecto a las posiciones queria aclarar:

    button--> Boton

    pb-->picture box que se encuentra detras

    en total tengo 16 posiciones en mi winform cada posicion lo relaciono con una pocision del arreglo...

     [0]   [1]   [2]   [3]
     [4]   [5]   [6]   [7]
     [8]   [9] [10] [11]
    [12] [13] [14] [15]

    y bueno si en la posicion 0 esta el numero 1 q fue generado aleatoriamente, alli se colocara el button1 y el picturebox1(pb1) ; pero si esta otro numero por ejemplo el 2 entonces en la primera posicion se colocara el button2 y el picturebox(pb2).

    bueno es la mejor forma q encontre para hacer que mis botonces se coloraran de manera aleatoria, como les digo el problema esta en colocar los numeros aleatorios en el arreglo sin que estos se repitan...

    espero alguien me pueda ayudar.. gracias

    domingo, 08 de noviembre de 2009 0:57
  • hola a todos estoy haciendso una pequeñ aplicacion con visual c++ 2005, uy bueno una de mis funciones es q me permitaordenar una serie de botones en forma desordenada dependiendo del valor q tenga una posicion de un arreglo llenado con numeros aleatorios (de 1 a 16) pero sin numeros repetidos...


     Buenas,

    y si lo planteas al contrario? Quieres desordenar los números que van del 1 al 16, ya que no quieres tener repetidos y has de rellenar 16 posiciones. Pues bien, podrias tener un vector lleno con los valores del 1 al 16 y con el uso del random recolocar los valores. Es decir, recorres el vector y para cada posición le asignas otra aleatoria, entonces, aunque se repitan valores, estarás moviendolos, con lo que tendrias una lista de valores del tipo:

     1, 2, 3, ..., 15, 16

    que al reordenar, podria ser como:

    14, 5, 7, ..., 2, 9

    donde sabes que la 1a posición es 14, la 2a es 5, etc.


    puede ir por ahí?
    un saludo!
    miércoles, 11 de noviembre de 2009 15:22
  • bueno no creo q fuese posible, por q a cada posicion del arreglo le estoy asignando una posicion del formulario, se me complicriamucho la cosa, pero si por decir fuese asi, como se implementaria, tienes un codigo ejemplo??

    pucha se me hace raro q nadie ah intentado hacer un vector con numeros aleatorios no repetidos, jeje cualidades de la vida... ya paso la urgencia del caso , pero ahora es un caso pa aprender jeje...

    gracias...
    miércoles, 11 de noviembre de 2009 16:09
  • hola!!


    puedes hacer que cada vez que generes un numero aleatorio lo guardes en un arreglo

    pero antes comparar el numero obtenido con los que ya estan guardados en el arreglo

    y si el elemento ya existe que te lo genere nuevamente hasta que el numero generado por el random

    no este en ninguna posicion del arreglo.


    si no lo puedes hacer me dices y yo te explico como.

    aqui la idea es que al menos lo intentes

    suerte!!!


    DavidDDR david_fer1@hotmail.com
    miércoles, 11 de noviembre de 2009 16:36
  • mmm, no he entendido muy bien porque no se puede hacer, el problema es que el código que te puedo pasar en en C#, pero la lógica te sirve igual, de hecho esto lo resuelve :P

    (hay tres For pero son sólo a modo de ejemplo:
     -  el primero crea el vector con valores del 1 al 16
     -  después se desordena
     -  seguidamente hay otro for para ver el resultado
     -  el último es el que te interesa, dónde se calculan las posiciones de la cuadrícula y se extraen los valores, en tu caso "las claves" de los controles a insertar)

               int maxim = 16;
    
                v = new int[maxim];
                for (int i = 0; i < maxim; )
                {
                    v[i] = ++i;
                    Console.Write(" {0}", v[i - 1]);
                }
                Console.WriteLine();
    
                desordenaVector(v);
    
                Console.WriteLine("Vector desordenado: ");
                for (int i = 0; i < maxim; i++)
                {
                    Console.Write(" {0}", v[i]);
                }
                            
                int px = Console.CursorLeft, 
                    py = Console.CursorTop;
    
                for (int i = 0; i < 4; i++)
                    for (int j = 0; j < 4; j++)
                    {
                        Console.SetCursorPosition(px + j * 4, py + i);
                        Console.Write(v[i * 4 + j].ToString());
                    }
    
    
                Console.WriteLine();
    
    // hasta aquí la función principal; seguido, el método de desordenación
    
            static void desordenaVector(int[] v)
            {
                Random r = new Random();
                for (int i = 0; i < v.Length; i++)            
                {
                     int temp;
                     temp = v[i];
    
                     v[i] = v[r.Next(0, v.Length - 1)];
                     v[r.Next(0, v.Length - 1)] = temp;
    
    
                     Thread.Sleep(1);
                }
            }

    (donde "r.Next(int, int)" devuelve un valor random entre dos valores)

    aquí se está escribiendo sobre la consola, pero igualmente necesitas tener unas coordenadas sobre las que trabajar, así en vez de "Console.CursorLeft" y "Console.CursorTop", dale un 'left' y un 'top' que enmarquen la cuadrícula. Creo que en tu ejemplo la primera posición estaba en Point (12, 43), bien pues a partir de ahí con sacas el resto de coordenadas y, como decía Leandro, con un switch asignas un botón conforme al valor contenido,


    un saludo
    miércoles, 11 de noviembre de 2009 16:58
  • mmh bueno si lo eh intentado, el codigo de hecho est arriba, y bueno mi logica es igual a la q dice, se genera un aleatorio q lopone en la primera posicion solopa inicializar el vector, por cada posicion: se crea el un aleatorio, se compara con los elementos del vector q estan en las posiciones anteriores, si encuentra con uno igual se crea un aleatorio y se compara nuevamente y eso ya es recursivo, hasta q se encuentre q no es igual, y este se pone en la nueva posicion y se crera el aletorio para la siguiente posicion y asi asi asi... buen revisa el codigo de arriba

    haber si me puedes hechar una manita... en c++, visualbasic, c#, java, en lo q sea al final el procedimiento es igual y el codigo no tiene muchas diferencias...

    gracias...
    miércoles, 11 de noviembre de 2009 17:05