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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13
21  Programación / Programación C/C++ / Re: Obtener ruta más corta en: 15 Junio 2013, 17:27 pm
Vale la pena por que el algoritmo de dijkstra es muy eficiente.
Te he hecho un programita en c++ que calcula el camino más corto entre dos celdas de un array.
Tienes obstaculos que se representan con un 1.

La función "getShortestPath" es la que lo hace todo y en el main lo que se hace es probar un ejemplo.

Código
  1. #include<iostream>
  2. #include<vector>
  3. #include<queue>
  4.  
  5. using namespace std;
  6.  
  7. class Cell{
  8. int x;
  9. int y;
  10. public:
  11. int getx(){return x;}
  12. int gety(){return y;}
  13. void setx(int x){this->x=x;}
  14. void sety(int y){this->y=y;}
  15.  
  16. bool operator==(Cell o){return x==o.x && y==o.y;}
  17. Cell operator=(Cell o){x=o.x; y=o.y; return *this;}
  18.  
  19. Cell(int x,int y):x(x),y(y){}
  20. Cell():x(0),y(0){}
  21. };
  22. vector<Cell> getShortestPath(Cell ori, Cell dest, int array[], int width, int height);
  23.  
  24.  
  25.  
  26. int main(){
  27. int ejemplo[]={
  28. 0,1,0,1,0,0,0,0, //0: void
  29. 0,1,0,1,0,0,0,0, //1: obstacle
  30. 0,1,0,1,0,0,0,0,
  31. 0,1,0,1,0,0,0,0,
  32. 0,1,0,1,0,0,0,0,
  33. 0,1,0,1,0,0,0,0,
  34. 0,0,0,1,0,0,0,0,
  35. 0,0,0,0,0,0,0,0};
  36.  
  37. vector<Cell> camino= getShortestPath(Cell(0,0),Cell(7,0),ejemplo,8,8);
  38. for(int i=0;i<camino.size();i++){
  39. cout<<"("<<camino[i].getx()<<", "<<camino[i].gety()<<")"<<endl;
  40. }
  41.  
  42. }
  43.  
  44. vector<Cell> getShortestPath(Cell ori, Cell dest, int array[], int width, int height){
  45.  
  46. if(ori==dest) return vector<Cell>();
  47. unsigned int *sizes=new unsigned int[width*height];
  48. Cell *prev=new Cell[width*height];
  49. for(int i=0;i<width*height;i++){sizes[i]=-1; prev[i]=Cell(-1,-1);}
  50.  
  51. sizes[ori.getx()+ori.gety()*width]=0;
  52. prev[ori.getx()+ori.gety()*width]=ori;
  53.  
  54.  
  55. queue<Cell> porVisitar;
  56. porVisitar.push(ori);
  57.  
  58. while(!porVisitar.empty()){
  59. Cell cur=porVisitar.front();
  60. porVisitar.pop();
  61. cout<<porVisitar.size()<<endl;
  62. for(int i=-1;i<2;i++)
  63. for(int j=-1;j<2;j++)
  64. if( (cur.getx()+j)>=0 && (cur.getx()+j)<width && (cur.gety()+i)>=0 && (cur.gety()+i)<height && //is not out of bounds
  65. array[(cur.getx()+j)+(cur.gety()+i)*width]==0 && //is not an obstable
  66. sizes[cur.getx()+cur.gety()*width]+1 < sizes[(cur.getx()+j)+(cur.gety()+i)*width] //there is not a better path
  67. ){
  68. sizes[(cur.getx()+j)+(cur.gety()+i)*width]=sizes[cur.getx()+cur.gety()*width]+1;
  69. prev[(cur.getx()+j)+(cur.gety()+i)*width]=Cell(cur.getx(),cur.gety());
  70. porVisitar.push(Cell(cur.getx()+j,cur.gety()+i));
  71. }
  72.  
  73. }
  74.  
  75. if(prev[dest.getx()+dest.gety()*width]==Cell(-1,-1)) return vector<Cell>();
  76.  
  77. Cell pp=dest;
  78. vector<Cell> res(sizes[dest.getx()+dest.gety()*width]+1);
  79. for(int i=res.size()-1; !(pp==ori); i--){
  80. res[i]=pp;
  81. pp=prev[pp.getx()+pp.gety()*width];
  82. }
  83.  
  84. return res;
  85.  
  86. }
  87.  

Lo que se hace es considerar que:
1) Toda celda del array es un nodo.
2) Todas las celdas estan conectadas a sus vecinas.
3) Todas las aristas son bidireccionales.
4) Todas las aristas miden lo mismo: 1.

Y con esto lo que se hace es implementar dijkstra en un caso particular más sencillo.

Te pongo un pastebin para que puedas copiar y pegar:
http://pastebin.com/unRpQgK5
22  Programación / Programación C/C++ / Re: Obtener ruta más corta en: 15 Junio 2013, 01:47 am
El algoritmo de dijkstra te podria servir. O algo adaptado.
23  Programación / Programación General / Re: Algoritmo para procesar una circunferencia en: 12 Junio 2013, 15:30 pm
¿Entonces tu problema es como dibujar las rectas?¿Digamos que quieres obtener los diferentes puntos de destino(porque el origen es siempre el centro)?
Pues a ver, para dibujar las rectas lo primero que tienes que hacer es decidir en cuantas partes quieres dividir el circulo(llamémosle p).
La distancia entre una recta y la siguiente en ángulo será a=(360/p)º.
Supongamos que el centro del círculo esta en (0,0).
El punto que buscamos será (r*cos(k*a), r*cos(k*a)). r es el radio y k es una constante entera.
Vayamos al código. El código que voy a poner es un pseudocódigo parecido a C(lo siento no se python).
Código
  1. struct Punto{
  2. int x;
  3. int y;
  4. };
  5.  
  6.  
  7. Punto origen={0, 0};
  8. a=360/p;
  9. for(int i=0;i<p;i++){
  10. Punto destino={r*cos(a*i), r*sin(a*i)};
  11. dibujarRecta(origen, destino);
  12. }
  13.  

Eso es lo que entiendo de tu pregunta a)
La pregunta b) no la llego a entender porque no se a que puntos te refieres. ¿Quieres decir todos los puntos que estan dentro de un sector?
24  Programación / Programación General / Re: Qt o windows api? en: 30 Mayo 2013, 14:58 pm
Yo te recomendaría Qt.
Con respecto a la licencia es el LGPL. Según esta licencia los programas que hagas usando Qt pueden ser comerciales o no comerciales, libres o no libres.
Lo que no puedes hacer es comercializar una modificación de la librería.
Dependiendo del tipo de aplicación que quieras hacer también te recomendaría gtk.
Gtk es adecuado para gráficos(piensa en gimp).
Yo personalmente no aprendería windows API si no vas a aprender crackear.
25  Programación / Programación C/C++ / Re: Código fuente de Lynx en: 26 Mayo 2013, 21:13 pm
De nada hombre.  ;)
Se me había olvidado que querías programar para win32.
Tengo una mala noticia(tampoco es tan mala), los sockets no están estandarizados y por lo tanto no son multiplataforma.
El manual que te he pasado es estupendo pero tiene la pega de que se centra en entornos Unix(Posix standard).
No te desesperes. En la wiki de elhacker.net hay un tutorial que cubre los sockets Unix y windows.
http://wiki.elhacker.net/programacion/cc/articulos/introducion-a-los-sockets-en-ansi-c

Si quisieras hacer tu navegador multiplataforma tendrias que hacerlo mediante #ifdef's.
Otra alternativa sería usar otras librerías que si que son multiplataforma, como por ejemplo:

-boost -> la famosa boost! concretamente boost::asio
-NetLink Sockets C++ Library

A ver si acabo los exámenes y puedo ponerme a hacer código  >:(
26  Programación / Programación C/C++ / Re: Código fuente de Lynx en: 26 Mayo 2013, 20:25 pm
Pues mírate el manual que te he dicho. Lo bueno que tiene es que la primera parte va "al grano", sockets TCP sin opciones ni cosas que compliquen el objetivo. El resto explica todos los detalles de los socket incluso los que no son TCP.
27  Programación / Programación C/C++ / Re: Código fuente de Lynx en: 26 Mayo 2013, 18:54 pm
¿Cómo llevas la programación de sockets?
Si sabes programar sockets TCP más o menos bien no te costará mucho :)
28  Programación / Programación C/C++ / Re: Código fuente de Lynx en: 26 Mayo 2013, 18:09 pm
Es que lynx aunque parezca un navegador sincillo es muy completo.
No conozco ningún navegador tan pequeño.
Lo que te puedo decir es que para hacer un navegador sencillo sólo tienes que saber un protocolo que es http.
Y dentro de http tienes que saber hacer 2 cosas:

1) Enviar una petición
Las peticiones en http tienen esta estructura:
Código:
GET /index.html HTTP/1.1
 Host: www.example.com
 User-Agent: nombre-cliente
 [Línea en blanco]

En resumen lo que debes hacer es crear un socket TCP, conectarlo a el servidor web que especifique el usuario y por último enviar la petición http.

2) Interpretar una respuesta.

Interpretar la respuesta del servidor será un pelín mas difícil.
Tiene esta estructura:

Código:
HTTP/1.1 200 OK
Date: Fri, 31 Dec 2003 23:59:59 GMT
Content-Type: text/html
Content-Length: 1221

<html>
<body>
<h1>Página principal de tuHost</h1>
(Contenido)
  .
  .
  .
</body>
</html>

Si la primera linea te dice OK, entonces esta es la respuesta que queremos. Si no lo es, tenemos que enviar la petición usando otra version de http.
Ya ves que te envían cosas como la fecha(normalmente hay mas cosas). Para un navegador básico podemos ignorar todo esto y quedarnos con "Content-Length:".
A partir de eso sabes lo grande que es lo que viene a continuación.

Bien, para empezar puedes detectar con un bucle todas las tags <p> y </p> que indican que hay texto entre ellas.
Entonces imprimes por pantalla lo que hay entre todas las tags <p> y </p>.
Y con eso ya tendrias un navedor web tan simple que no puede existir algo más simple. xD

Más información en: http://es.wikipedia.org/wiki/Hypertext_Transfer_Protocol
Guia de programación sockets C: http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html

Y otra cosa, si pillas el wireshark y te pones a capturar tráfico http aprenderás cómo funciona http en un periquete.
29  Programación / Programación C/C++ / Re: Código fuente de Lynx en: 26 Mayo 2013, 17:12 pm
Si hombre, el código fuente está en zip.
http://lynx.isc.org/lynx2.8.7/lynx2.8.7.zip
El contenido que buscas debe de estar en el directorio WWW/Library/Implementation.

¿No es eso lo que estas buscando?
30  Programación / Programación C/C++ / Re: Código fuente de Lynx en: 26 Mayo 2013, 14:54 pm
Esta es la página oficial de lynx: http://lynx.isc.org/lynx2.8.7/index.html
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines