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] 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ... 122
121  Programación / Programación C/C++ / Re: Ayuda recursividad en: 6 Agosto 2016, 01:57 am
¿Y no es más fácil hacer lo siguiente?

Código
  1. char funcion(char *s)
  2. {
  3.    if(!(*s))
  4.        return *s;
  5.  
  6.    if(*s != funcion(s + 1))
  7.        printf("%c",*s);
  8.  
  9.    return *s;
  10. }
  11.  

O si lo preferís con subindices...
Código
  1. char funcion(char *s)
  2. {
  3.    if(!(s[0]))
  4.        return s[0];
  5.  
  6.    if(s[0] != funcion(&s[1]))
  7.        printf("%c",s[0]);
  8.  
  9.    return s[0];
  10. }
  11.  

A fin de cuentas lo que le piden es una función recursiva que muestre la cadena invertida y sin repeticiones. Que la muestre. No que la almacene en ningún lado.
122  Programación / Programación C/C++ / Re: Necesito ayuda con una función de listas en: 1 Agosto 2016, 09:30 am
¡Buenas!

No se si se refiere a imprimir el valor del nodo que ocupa el punto medio en la lista (mediana) o a imprimir la media de los valores.

En ambos casos deberías de saber cuántos elementos hay en la lista.

Una vez sabiendo lo anterior, si lo que tienes que imprimir es la media también deberás saber cual es la suma de todos los elementos que has insertado, y si lo que te hace falta es imprimir el valor del nodo que está en el punto medio tendrás que hacer una función que sabiendo la cantidad de elementos introducidos te muestre el nodo que ocupa dicha posición.
123  Programación / Programación C/C++ / Re: ¿Mejor algoritmo? Problema con aproximaciones de Grafos en: 29 Julio 2016, 21:38 pm
Bueno... hoy estoy muy tonto. Pensaba que en los códigos anteriores discutíais sobre opciones para resolver el problema. Veo que ya hay alguna solución, así que dejo la mía también. main está al final y justo antes están las funciones problema_interactivo y problema_aleatorio. La primera solicita los datos desde el teclado, la segunda genera 100.000 casos aleatorios y los procesa.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. #define DIM 100000
  7.  
  8. struct Persona
  9. {
  10. int valor;
  11. int clase;
  12. };
  13. typedef struct Persona Persona;
  14.  
  15. struct NodoArbolPersona
  16. {
  17. Persona *persona;
  18.  
  19. struct NodoArbolPersona *menores, *mayores;
  20. };
  21. typedef struct NodoArbolPersona NodoArbolPersona;
  22.  
  23. void insertar(NodoArbolPersona **arbol, Persona *persona)
  24. {
  25. if(!(*arbol))
  26. {
  27. (*arbol) = malloc(sizeof(NodoArbolPersona));
  28. (*arbol)->persona = persona;
  29. (*arbol)->menores = NULL;
  30. (*arbol)->mayores = NULL;
  31.  
  32. return;
  33. }
  34.  
  35. if(persona->valor < (*arbol)->persona->valor)
  36. insertar(&((*arbol)->menores), persona);
  37. else
  38. insertar(&((*arbol)->mayores), persona);
  39. }
  40.  
  41. Persona* buscar(NodoArbolPersona *arbol, int valor)
  42. {
  43. if(!arbol)
  44. return NULL;
  45.  
  46. if(arbol->persona->valor == valor)
  47. return arbol->persona;
  48.  
  49. if(valor < arbol->persona->valor)
  50. return buscar(arbol->menores, valor);
  51.  
  52. return buscar(arbol->mayores,valor);
  53. }
  54.  
  55. void cambiar_clase(NodoArbolPersona *amigos, int nueva_clase)
  56. {
  57. if(!amigos)
  58. return;
  59.  
  60. amigos->persona->clase = nueva_clase;
  61.  
  62. cambiar_clase(amigos->menores, nueva_clase);
  63. cambiar_clase(amigos->mayores, nueva_clase);
  64. }
  65.  
  66. void fusionar_arboles(NodoArbolPersona **destino, NodoArbolPersona *origen)
  67. {
  68. if(!(*destino))
  69. *destino = origen;
  70.  
  71. if((*destino)->persona->valor == origen->persona->valor)
  72. return;
  73.  
  74. if(origen->persona->valor < (*destino)->persona->valor)
  75. fusionar_arboles(&((*destino)->menores),origen);
  76. else
  77. fusionar_arboles(&((*destino)->mayores),origen);
  78.  
  79. }
  80.  
  81. void insertar_amigos(NodoArbolPersona *amigos[DIM/2], NodoArbolPersona **personas, int a, int b)
  82. {
  83. Persona *persona1,*persona2, *aux;
  84. int i,clase_aux;
  85.  
  86. if((persona1 = buscar(*personas,a)))
  87. {
  88. if((persona2 = buscar(*personas,b))) //ambas personas existen
  89. {
  90. if(persona1->clase != persona2->clase)
  91. {
  92. //pertenecen a distintas clases y hay que fusionarlas
  93. if(persona1->clase > persona2->clase)
  94. {
  95. aux = persona2;
  96. persona2 = persona1;
  97. persona1 = aux;
  98. }
  99.  
  100. clase_aux = persona2->clase;
  101. cambiar_clase(amigos[persona2->clase],persona1->clase); //cambiamos toda la clase b para que apunte a a.
  102. fusionar_arboles(&(amigos[persona1->clase]),amigos[clase_aux]); //añadimos toda el arbol b a a.
  103. amigos[clase_aux] = NULL;
  104. }
  105. }
  106. else //existe p1, pero no p2
  107. {
  108. persona2 = malloc(sizeof(Persona));
  109.  
  110. persona2->valor = b;
  111. persona2->clase = persona1->clase;
  112.  
  113. insertar(personas, persona2);
  114. insertar(&(amigos[persona1->clase]), persona2);
  115. }
  116. }
  117. else //persona1 no existe
  118. {
  119. if((persona2 = buscar(*personas,b)))
  120. {
  121. //existe p2 pero no p1
  122. persona1 = malloc(sizeof(Persona));
  123.  
  124. persona1->valor = a;
  125. persona1->clase = persona2->clase;
  126.  
  127. insertar(personas, persona1);
  128. insertar(&(amigos[persona2->clase]), persona1);
  129. }
  130. else //no existen ninguna de las dos personas
  131. {
  132. //buscamos la primera clase que este vacia
  133. for(i = 0 ; amigos[i] ; i++);
  134.  
  135. //creamos las personas:
  136. persona1 = malloc(sizeof(Persona));
  137. persona2 = malloc(sizeof(Persona));
  138.  
  139. persona1->valor = a;
  140. persona2->valor = b;
  141. persona1->clase = persona2->clase = i;
  142.  
  143. insertar(personas,persona1);
  144. insertar(personas,persona2);
  145.  
  146. insertar(&(amigos[i]),persona1);
  147. insertar(&(amigos[i]),persona2);
  148.  
  149. }
  150. }
  151.  
  152. return;
  153. }
  154.  
  155. //tenemos dos funciones para liberar la memoria de los arboles
  156. //la unica diferencia es que la primera libera el dato "persona"
  157. //y la segunda no.
  158. void destruir_personas(NodoArbolPersona **personas)
  159. {
  160. if(!(*personas))
  161. return;
  162.  
  163. destruir_personas(&((*personas)->menores));
  164. destruir_personas(&((*personas)->mayores));
  165.  
  166. free((*personas)->persona);
  167. free(*personas);
  168.  
  169. *personas = NULL;
  170. }
  171.  
  172. void destruir_clase(NodoArbolPersona **amigos)
  173. {
  174. if(!(*amigos))
  175. return;
  176.  
  177. destruir_personas(&((*amigos)->menores));
  178. destruir_personas(&((*amigos)->mayores));
  179.  
  180. free(*amigos);
  181.  
  182. *amigos = NULL;
  183. }
  184.  
  185. void problema_interactivo()
  186. {
  187. //cada componente del vector es un arbol que relaciona los amigos que forman una "clase"
  188. NodoArbolPersona *clases[DIM / 2], *personas = NULL; //personas: arbol de elementos valor-clase
  189. Persona *persona1, *persona2;
  190. int num_personas, num_casos, amigo1, amigo2;
  191. char operador;
  192.  
  193. for(num_personas = 0 ; num_personas < DIM / 2 ; num_personas++)
  194. clases[num_personas] = NULL;
  195.  
  196. scanf("%d", &num_personas);
  197. scanf("%d", &num_casos);
  198. while(getchar() != '\n');
  199.  
  200. while(num_casos--)
  201. {
  202. scanf("%c%d%d", &operador, &amigo1, &amigo2);
  203. while(getchar() != '\n');
  204.  
  205. switch(operador)
  206. {
  207. case 'S':
  208. insertar_amigos(clases, &personas,amigo1, amigo2);
  209. break;
  210.  
  211. case 'P':
  212. if((persona1 = buscar(personas,amigo1)) && (persona2 = buscar(personas,amigo2)))
  213. {
  214. if(persona1->clase == persona2->clase)
  215. printf("1\n");
  216. else
  217. printf("0\n");
  218. }
  219. else
  220. printf("0\n");
  221. }
  222. }
  223.  
  224. destruir_personas(&personas);
  225.  
  226. for(num_personas = 0 ; num_personas < DIM / 2 ; num_personas++)
  227. destruir_clase(&(clases[num_personas]));
  228. }
  229.  
  230. void problema_aleatorio()
  231. {
  232. //cada componente del vector es un arbol que relaciona los amigos que forman una "clase"
  233. NodoArbolPersona *clases[DIM / 2], *personas = NULL; //personas: arbol de elementos valor-clase
  234. Persona *persona1, *persona2;
  235. int num_personas, num_casos = DIM, amigo1, amigo2;
  236. char operador;
  237. char entrada[20];
  238.  
  239. srand(time(NULL));
  240.  
  241. for(num_personas = 0 ; num_personas < DIM / 2 ; num_personas++)
  242. clases[num_personas] = NULL;
  243.  
  244. while(num_casos--)
  245. {
  246. //vamos a forzar a que, aproximadamente, el 60% de los casos sean saludos
  247. sprintf(entrada,"%c %d %d",rand() % 10 < 6 ? 'S' : 'P', rand() % (DIM + 1), rand() % (DIM + 1));
  248. sscanf(entrada,"%c%d%d", &operador, &amigo1, &amigo2);
  249.  
  250. switch(operador)
  251. {
  252. case 'S':
  253. insertar_amigos(clases, &personas,amigo1, amigo2);
  254. break;
  255.  
  256. case 'P':
  257. if((persona1 = buscar(personas,amigo1)) && (persona2 = buscar(personas,amigo2)))
  258. {
  259. if(persona1->clase == persona2->clase)
  260. printf("1\n");
  261. else
  262. printf("0\n");
  263. }
  264. else
  265. printf("0\n");
  266. }
  267. }
  268.  
  269. destruir_personas(&personas);
  270.  
  271. for(num_personas = 0 ; num_personas < DIM / 2 ; num_personas++)
  272. destruir_clase(&(clases[num_personas]));
  273. }
  274.  
  275. int main(int argc, char *argv[])
  276. {
  277. //problema_interactivo();
  278. problema_aleatorio();
  279.  
  280. return 0;
  281. }
  282.  
124  Foros Generales / Noticias / Re: El streaming sustituye a los torrents para ver contenido con derechos de autor en: 29 Julio 2016, 17:48 pm
A mi lo que me da cien patadas en los huevos es que ni dios comparte lo que descarga. Los usuarios son una panda de egoístas que solo quieren descargar contenido y cuando no encuentran lo que buscan, no hay fuentes completas o la descarga es lenta porque la única fuente que hay no tiene ancho de banda suficiente, lo único que hacen es quejarse, y no se dan cuenta de que si no hay fuentes es porque todo cristo hace lo mismo que hacen ellos, descargar el archivo y cambiarlo de directorio sin crear un torrent para seguir compartiéndolo.

Como ejemplo, dejé de compartir  mis archivos el día que me di cuenta de que un archivo que compartía en aMule lo había compartido más de 15 veces y solo estábamos compartiéndolo dos usuarios... Es vergonzoso el nivel de educación de la inmensa mayoría de los usuarios... Ahora ya se me ha pasado el cabreo y vuelvo a compartir archivos, pero sigue sorprendiéndome ver cuanto sinvergüenza hay en esta vida...

Dios, que a gusto me he quedado ;-)
125  Programación / Programación C/C++ / Re: (Consulta) Pasando a las funciones fscanf argumentos nulos en: 29 Julio 2016, 17:34 pm
¡Buenas!

Me has dejado con la mosca detrás de la oreja, así que lo he probado y lo habré ejecutado unas 10-15 veces en Debian Stretch sin ningún problema. Por lo que comentan en stackoverflow el estándar exige que si se lee una cadena entonces hay que proporcionar un argumento con la capacidad de leer hasta el primer espacio y almacenar el caracter nulo. Pero gcc debe de tener una implementación no estándar de scanf, así que los puntero a NULL (al menos en el caso de cadenas) se ignoran.

A ver si encuentro algo más de información.

¡Saludos!
126  Programación / Programación C/C++ / Re: Error en funcion que retorna vectores en C. en: 29 Julio 2016, 16:17 pm
Y a fscanf le estás pasando un doble puntero a caracteres en lugar de utilizar simplemente el identificador de la cadena...
127  Sistemas Operativos / GNU/Linux / Re: Problema en la instalación tanto de Ubuntu 12.04 como 14.04 (y también en Mint) en: 29 Julio 2016, 16:12 pm
Parece un problema con la gráfica.

¿Has probado a instalar los drivers privativos? (panel de control->controladores adicionales->selecciona el privativo)

Si no es eso, ni idea de lo que puede ser.
128  Programación / Programación C/C++ / Re: ¿Mejor algoritmo? Problema con aproximaciones de Grafos en: 29 Julio 2016, 09:58 am
Interesante ejercicio.

Se trata de crear particiones sobre el conjunto de personas (tenemos una relación de equivalencia en un conjunto->la equivalencia crea una partición del conjunto (un conjunto de subconjuntos disjuntos)).

Se me ocurre que se puede tener un vector (mejor árbol, que así no hay que estar desplazando valores para mantener el orden después de una inserción) con pares del tipo numero_persona-clase. Así la cuestión de decidir si dos personas son amigos se reduce a realizar la búsqueda de las dos personas y ver si pertenecen a la misma clase, y la inserción se podría hacer en un vector (sabemos que el máximo numero de parejas es 100.000 / 2) en el que cada componente sea un vector de punteros a los nodos del árbol que formen parte de la misma clase. Así, a través de los punteros de la tabla, si hubiese que fusionar dos clases sería muy fácil corregir directamente en cada nodo del árbol la clase a la que pertenece el par persona-clase. La tabla mantiene una lista de todas las personas relacionadas entre sí y soluciona el problema de buscar en el árbol todas las personas que pertenecen a la misma clase.

A ver que sale de esta idea.

¡Saludos!


Con el planteamiento anterior, cambiando la idea de un vector de vectores por la de un vector de árboles, en mi ordenador, el tiempo de ejecución en el caso de la entrada de mayor dimensión se pasa del segundo por poco. Entre 1'2 y 1'3 segundos.

Alberto, te mando el código por MP, como los planteamientos son distintos me gustaría ver tu código.

¡Saludos!
129  Programación / Programación C/C++ / Re: Problema programacion en C. en: 29 Julio 2016, 09:37 am
Solo voy a indicar el fallo, aunque veo algunas cosas que se podrían optimizar. El fallo es que al contar las líneas, ya has leído el archivo, por lo que cuando vas a tomar los datos enteros, no lees nada porque ya has leído el archivo. Para reiniciar la lectura del archivo, usa la siguiente función: fseek(apuntador_archivo, 0, SEEK_SET);

O directamente puede utilizar la función rewind(Fichero).  :xD
130  Sistemas Operativos / GNU/Linux / Re: razones por las cuales cambiarme a linux en: 27 Julio 2016, 16:19 pm
Si te cambias que sea porque tu quieres.

Yo por ejemplo me cambié porque cuando acabó el soporte de Windows XP los gobiernos se vieron obligados a pagar un pastón de las arcas públicas en licencias para renovar Windows, porque Microsoft dejaba que todo el mundo lo piratease en sus casas para que luego en sus puestos de trabajo nadie supiese utilizar otra cosa y así poder cobrar por las licencias. Ahora el descaro es mayor,  directamente te lo regala para tu casa para tener los contratos bien atados y sangrar sistemas sanitarios, judiciales, educativos...

Así que decidí probar Debian y XUbuntu (infórmate sobre los escritorios y las distintas versiones de Ubuntu según el escritorio que utilicen), y si solo navegas, ves vídeos, escuchas música... vamos lo que hace el 80 por ciento de los usuarios, con cualquier versión de Ubuntu o con Mint (tiro para la rama Debian porque creo que es la que más documentación y paquetes tiene) no vas a tener ningún problema, y tienes una suite ofimática que funciona de lujo, LibreOffice.

Desde que me cambié se lo he puesto a varias personas que me lo han pedido para probarlo y ahí se han quedado, así que tan malo como te lo venden en muchos sitios no será. Y para solucionar cualquier problema ahí tienes Google que, como todos cuando nos ha tocado, no serás el primero al que le toque sufrir algún fallo y seguro que en alguna web, blog o foro encuentras la solución más temprano que tarde.
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 [13] 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ... 122
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines