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

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Mensajes
Páginas: 1 ... 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 [119] 120 121 122 123 124 125
1181  Programación / Programación C/C++ / Re: Problema con el par mas cercano. en: 9 Julio 2013, 11:29 am
Ten en cuenta que el código no he podido probarlo y que intenta ser una guía.

Así, por ejemplo, si analizas el código ves que la inicialización de rectangulo es un poco rara:

Código
  1. class DatoDistancias
  2.  {
  3.    public:
  4.      double distancia;
  5.      Punto punto;
  6.  
  7.      DatoDistancias( const Punto& pt )
  8.        : distancia( 1e9 ), punto( pt )
  9.      { }
  10.  };
  11.  
  12.  // ...
  13.  
  14.  std::vector< DatoDistancias > rectangulo;
  15.  
  16.  rectangulo.push_back( Punto( -6.7071067, 0.7071067 ) );

Básicamente es un vector de elementos de tipo DatoDistancias pero yo le paso un punto. Quizás sería más conveniente escribir

Código
  1. rectangulo.push_back( DatoDistancias( Punto( -6.7071067, 0.7071067 ) ) );

Pero debería funcionar porque el constructor de DatoDistancias no se ha definido como "explicit", aún así lo dicho, donde estoy ahora mismo no puedo probar códigos y lo he hecho de cabeza.
1182  Programación / Programación C/C++ / Re: Problema con el par mas cercano. en: 9 Julio 2013, 10:51 am
Primera optimización: Si estás manejando coordenadas, lo suyo sería tener una estructura para manejarlos como tal.

Código
  1. class Punto
  2. {
  3.  public:
  4.    double x;
  5.    double y;
  6.  
  7.    Punto( double px, double py )
  8.    : x( px ), y( py )
  9.    {  }
  10. };
  11.  
  12. struct Vpeaton
  13. {
  14.    int ad_peaton;     //numero del punto
  15.    Punto punto;       // punto  
  16. };
  17. typedef std::vector<Vpeaton> V_peaton;

Segunda optimización: Si quieres calcular distancias... saca una función que la calcule en vez de repetir 8 veces el mismo cálculo. Reduces puntos de fallo y mejoras el mantenimiento y la legibilidad del código.

Código
  1.  V_peaton Areas;
  2.  
  3.  //buscar peston cercano a cada esquina.
  4.  distminXsYs = distancia( punto_ supizq, Areas[0] );
  5.  distminXiYs = distancia( punto_infizq, Areas[0] );
  6.  distminXsYi = distancia( punto_supder, Areas[0] );
  7.  distminXiYi = distancia( punto_infder, Areas[0] );
  8.  
  9.  for(int i=1; i<Areas.size(); i++)  
  10.  {                  
  11.    dist1 = distancia( punto_supizq, Areas[i] );
  12.    dist2 = distancia( punto_infizq, Areas[i] );
  13.    dist3 = distancia( punto_supder, Areas[i] );
  14.    dist4 = distancia( punto_infder, Areas[i] );
  15.  
  16.    if (dist1<distminXsYs)
  17.    {
  18.      distminXsYs=dist1;
  19.      peaton_1=Areas[i].ad_peaton;
  20.    }
  21.  
  22.    if (dist2<distminXiYs)
  23.    {
  24.      distminXiYs=dist2;
  25.      peaton_2=Areas[i].ad_peaton;
  26.    }                              
  27.  
  28.    if(dist3<distminXsYi);
  29.    {
  30.      distminXsYi=dist3;
  31.      peaton_3=Areas[i].ad_peaton;
  32.    }
  33.  
  34.    if(dist4<distminXiYi);
  35.    {
  36.      distminXiYi=dist4;
  37.      peaton_4=Areas[i].ad_peaton;
  38.    }
  39.  }

Tercera optimización: si asignas un valor inicial a las distancias lo suficientemente alto como para que cualquier punto posea una distancia inferior te puedes ahorrar las 4 primeras distancias y aglutinar todo en el for.

Código
  1.  V_peaton Areas;
  2.  
  3.  double distminXsYs = 1e9; // por ejemplo
  4.  double distminXiYs = 1e9;
  5.  double distminXsYi = 1e9;
  6.  double distminXiYi = 1e9;
  7.  
  8.  for(int i=0; i<Areas.size(); i++)  
  9.  {                  
  10.    dist1 = distancia( punto_supizq, Areas[i] );
  11.    dist2 = distancia( punto_infizq, Areas[i] );
  12.    dist3 = distancia( punto_supder, Areas[i] );
  13.    dist4 = distancia( punto_infder, Areas[i] );
  14.  
  15.    if (dist1<distminXsYs)
  16.    {
  17.      distminXsYs=dist1;
  18.      peaton_1=Areas[i].ad_peaton;
  19.    }
  20.  
  21.    if (dist2<distminXiYs)
  22.    {
  23.      distminXiYs=dist2;
  24.      peaton_2=Areas[i].ad_peaton;
  25.    }                              
  26.  
  27.    if(dist3<distminXsYi);
  28.    {
  29.      distminXsYi=dist3;
  30.      peaton_3=Areas[i].ad_peaton;
  31.    }
  32.  
  33.    if(dist4<distminXiYi);
  34.    {
  35.      distminXiYi=dist4;
  36.      peaton_4=Areas[i].ad_peaton;
  37.    }
  38.  }

Con esto además corriges uno de tus problemas, y era que no asociabas valores a los peatones si la distancia mínima se encuentra en el punto 0.

Cuarta optimización: Podrías usar un vector de puntos para definir el rectángulo, con eso podrías evitar tener que comprobar la distancia con cada esquina de forma explícita.

Código
  1.  class DatoDistancias
  2.  {
  3.    public:
  4.      double distancia;
  5.      Punto punto;
  6.  
  7.      DatoDistancias( const Punto& pt )
  8.        : distancia( 1e9 ), punto( pt )
  9.      { }
  10.  };
  11.  
  12.  V_peaton Areas;
  13.  V_peaton peatones; // En vez de peaton_1, peaton_2, peaton_3, peaton_4; Hay que inicializarlo
  14.  
  15.  std::vector< DatoDistancias > rectangulo;
  16.  
  17.  // presupongo que los límites del cuadrado son conocidos. Si no es así esto se sustituiría por la inicialización correspondiente.
  18.  rectangulo.push_back( Punto( -6.7071067, 0.7071067 ) );
  19.  rectangulo.push_back( Punto( -6.7071067, -0.7071067 ) );
  20.  rectangulo.push_back( Punto( 6.7071067, 0.7071067 ) );
  21.  rectangulo.push_back( Punto( 6.7071067, -0.7071067 ) );
  22.  
  23.  for( int i=0; i<Areas.size(); i++)  
  24.  {
  25.    for ( int j=0; j<rectangulo.size( ); ++j )
  26.    {
  27.      double dist = distancia( rectangulo[j].punto, Areas[i] );
  28.      if ( dist < rectangulo[j].distancia )
  29.      {
  30.        peatones[j] = Areas[i].ad_peaton;
  31.        rectangulo[j].distancia = dist;
  32.      }
  33.    }
  34.  }

Creo que el código final tiene bastante mejor pinta, no crees?

Y ya te digo yo que es muuucho más fácil corregir errores de esta forma.

La implementación de la función distancia no es que se me haya olvidado ponerla, con lo que tienes no te debería costar mucho implementarla.
1183  Programación / Programación C/C++ / Re: Camino minimo en floyd! en: 9 Julio 2013, 08:45 am
Es complicado que alguien pruebe tu código porque usas la clase ListaSE que es particular tuya...si fuese un contenedor de la stl la cosa cambiaría... pero el comportamiento de ListaSE no se puede predecir viendo tu código.

Cualquier detalle tontos puede hacer que la ejecución del programa sea radicalmente distinta.

Tu piensa siempre que hacer un programa es como montar un reloj... todos los engranajes tienen que funcionar en perfecta armonía porque en caso contrario el invento no funciona.

Y tocando ahora tu código... me he mirado un poco la especificación de lo que tiene que hacer tu algoritmo y... yo creo que vas mal encaminado.

Para empezar, se supone que tiene que haber una función CaminoMinimo(i,j,k) o, en su defecto, tres bucles para iterar sobre el grafo... y tu estás usando únicamente 2 variables... lo mismo se me pasa algo, ya te digo, no puedo probarlo, pero lo veo raro.

También te digo que el diseño del algoritmo se puede resumir en una decena de líneas ( al menos las implementaciones que he visto )
1184  Programación / Programación C/C++ / Re: problema con parametros en: 8 Julio 2013, 19:48 pm
Cuando tu defines una matriz de la forma en la que tú lo has hecho el equipo reserva la memoria de la siguiente manera:

matriz [ 3 ][ 2 ] = [ 0,0 ] [ 0,1 ] [ 1,0 ] [ 1,1 ] [ 2,0 ] [ 2,1 ]

Es decir, la matriz realmente está serializada en memoria y está ordenada por filas.

Si tu defines un argumento en una función tal que char matriz[][], no estás indicando el número de filas ni el número de columnas, por lo que la definición de dicha matriz está, técnicamente, incompleta.

Si quieres que no te de problemas puedes aplicar la solución más fácil, esta es poner en el parámetro el número de filas y de columnas.
Código
  1. void burbuja_descendente(char matriz[MAX][MAX],int n,int m);

Hay otras posibilidades, pero tendrías que modificar más código.
1185  Programación / Programación C/C++ / Re: [pregunta] memoria dinamica , estandar vs api de windows en: 8 Julio 2013, 18:42 pm
Todo uso de memoria dinámica implica el uso del heap.

Aunque existen funciones para crear varios heap ( que creo recordar que no son ni tan siquiera parte del estándar ), lo normal es no preocuparse demasiado por ello.

como normal general, salvo que explícitamente requieras el uso de heap específicos, para reservar memoria dinámicamente en c tienes:

* malloc: simplemente te reserva la memoria, no hace ninguna inicialización.
* calloc: reserva la memoria y la inicializa escribiendo ceros en todos los bytes.
* realloc: para cambiar la cantidad de memoria reservada.

y para liberarla, simplemente tienes free.

Los heaps pueden dar problema por ejemplo al mezclar librerías en debug y release... por ejemplo Qt 4 tenía un problema de este tipo al liberar listas... pero es bastante raro encontrarse un problema de estos... de hecho en mi caso el de Qt ha sido el primero con el que me he topado.
1186  Programación / Programación C/C++ / Re: Camino minimo en floyd! en: 8 Julio 2013, 11:43 am
Ya , y disculpa se me fueron todos esos errorcitos bobos, hechemosle la culpa al sueño.
XDDDD

Te lo digo sin maldad, son detalles a pulir.

Tu piensa que cuanto mejor sea tu presentación y más facilites la vida a los que te van a ayudar, más productivo será para todos, en especial para ti.
1187  Programación / Programación C/C++ / Re: Camino minimo en floyd! en: 8 Julio 2013, 11:19 am
Para que el texto sea legible, edita tu mensaje, selecciona todo el código y en el combobox donde pone GeSHi selecciona c++.

Y tampoco estaría mal que indicases qué tipo de clase es ListaSE... es un alias de vector, de set o de list... es una clase tuya propia que te has currado de cero... no sabes que hace eso ahi ( XDDD ) ???

Luego, entiendo que la función esa es un template, no?? si es template, para evitar dudas estaría bien que pusieses la declaración del template... en caso contrario ( espero que no ) tienes una clase llamada T... cambia el nombre de esa clase porque es usada para templates y puede dar lugar a confusiones.

Más cositas... CaminoMinimoFloyd es una función, por lo que para llamarla hay que encerrar los parámetros entre paréntesis y tu estás usando corchetes... esto directamente no compila, deberías corregir esos errores antes de reportar código... queda feo.

Y bueno, corrige esas tonterías y luego seguimos.
1188  Programación / Programación C/C++ / Re: Camino minimo en floyd! en: 8 Julio 2013, 10:01 am
Te has trabado... donde exactamente??

Si quieres ayuda es un buen paso poner el código que tienes, comentar qué problemas tienes, cosas así...
1189  Programación / Programación C/C++ / Re: Como puedo determinar el tamaño de un diccionario creado en C++?? en: 8 Julio 2013, 08:52 am
Hombre, generar ese rango lo puedes hacer con un for

Código
  1. unsigned long long numero;
  2. for ( numero=1000000000; numero<=9999999999; ++numero )
  3. {
  4. ...
  5. }

Lo que no se yo es la viabilidad de probar por fuerza bruta ese rango de claves...

suponiendo que pudieses probar 1000 claves por segundo probar todo el rango te llevaría: 2450 horas... 104 días
1190  Programación / Programación C/C++ / Re: Duda Pregunta Instanciación Vector STL en: 5 Julio 2013, 12:48 pm
Eres capaz, para tener al menos la seguridad de que sabes qué estás haciendo, de decirme que intenta hacer la instrucción que tienes que completar??
Páginas: 1 ... 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 [119] 120 121 122 123 124 125
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines