Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Miky Gonzalez en 30 Junio 2012, 15:53 pm



Título: Ayuda - Generador de diccionarios
Publicado por: Miky Gonzalez en 30 Junio 2012, 15:53 pm
Estoy haciendo un codigo que llevaba bien hasta que me estanque en esto:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void uso(char *);
  5. int main(int argc, char **argv) {
  6. unsigned short int tmp[5] = {0, 0, 0, 0, 0};
  7. char caracteres[39] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
  8. 't', 'u', 'v', 'w', 'x', 'y', 'z'};
  9. if (argc > 4 || argc < 3) uso(argv[0]);
  10. if (argv[1] == NULL) { printf("ERR ARG:1: Se debe especificar nombre de archivo\n"); uso(argv[0]); }
  11. if (atoi(argv[2]) == 0) { printf("ERR ARG:2: Debe especificarse un numero (longitud de cadena)\n"); uso(argv[0]); }
  12. FILE *file;
  13.    file = fopen(argv[1], "w");
  14.    if (file == NULL) { printf("ERR ARG:1: Ocurrio un problema al abrir/crear el archivo\n"); uso(argv[0]); }
  15.    // GENERADOR DEL DICCIONARIO
  16. for (tmp[0] = 1; tmp[0] <= atoi(argv[2]); tmp[0]++) {
  17. for (tmp[4] = tmp[0]; tmp[4] >= 0; tmp[4]--) {
  18. for (tmp[1] = strlen(caracteres); tmp[1] >= 1; tmp[1]--) {
  19. printf("%c", caracteres[tmp[1]-1]);
  20. if (tmp[0] == 1) printf("\n");
  21. fputc(caracteres[tmp[1]-1], file);
  22. if (tmp[0] == 1) fputc('\n', file);
  23. }
  24. for (tmp[2] = tmp[4]; tmp[2] > 1; tmp[2]--) {
  25. for (tmp[1] = strlen(caracteres); tmp[1] >= 1; tmp[1]--) {
  26. printf("%c", caracteres[tmp[1]-1]);
  27. fputc(caracteres[tmp[1]-1], file);
  28. } printf("\n");
  29. }
  30. }
  31. }
  32.    fclose(file);
  33.    return 0;
  34. }
  35. void uso(char *name) {
  36. printf("Uso: %s archivo longitud [caracteres]\n", name); exit(0);
  37. }
  38.  

En la sección generador del diccionario solo hace bien la primera parte, me he liado mucho porque llevo como 40 minutos y no logro una solucion lo que quiero que haga:
z
..
a
zz
..
aa
..
zzz
..
aaa

Todas las combinaciones posibles dadas desde los parametros. El codigo creo que todo esta bien menos el algoritmo de generacion del diccionario. ¿Alguna solucion?. Gracias por leer.


Título: Re: Ayuda - Generador de diccionarios
Publicado por: SXF en 1 Julio 2012, 01:15 am
Escribe que es lo que quieres hacer?¿ No lo entiendo.


Título: Re: Ayuda - Generador de diccionarios
Publicado por: Miky Gonzalez en 1 Julio 2012, 11:27 am
Un generador de todas la posibles combinaciones dadas desde los parametros (de momento no) de las letras que estan en la variable caracteres (a..z)
Ejemplo (suponiendo que son la a, b, c):
a     aa     ba     ca
b     ab     bb     cb
c     ac     bc      cc

Y asi hasta el numero de longitud definido (siempre empieza de 1: a, b, c): Entonces si defino el numero de longitud a 3 acabaria en ccc: a .... ccc


Título: Re: Ayuda - Generador de diccionarios
Publicado por: SXF en 1 Julio 2012, 16:37 pm
Te estas compilcando mucho la vida , mira es una combinacion con repeticion , primero plantea el problema y luego intenta resolverlo, creo que este algoritmo te servira.
Lo he hecho para que resuelva las combinaciones de letras que me pusiste en el ejemplo osea a,b,c.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main() {
  5.  
  6. char caracteres[3] = {'a', 'b', 'c'};
  7.  
  8.    // FILE *file;
  9.    //file = fopen("d.txt", "w");
  10.  
  11.    for(int i=0;i<3;i++)
  12.    {
  13.      printf("%c\n", caracteres[i]);
  14.         for(int j=0;j<3;j++)
  15.         {
  16.            printf("%c", caracteres[j]);
  17.            printf("%c\n", caracteres[i]);    
  18.         }
  19.     }
  20.    //fclose(file);
  21.    scanf("%d");
  22.    return 0;
  23. }


Título: Re: Ayuda - Generador de diccionarios
Publicado por: do-while en 1 Julio 2012, 17:06 pm
¡Buenas!

Si en principio no sabes cuantos elementos van a tener las variaciones, deberias de utilizar una funcion recursiva. El algorimo es muy sencillo si solo quieres mostrar los datos por pantalla o darles salida a un fichero. Si quieres almacenar los datos para utilizarlos posteriormente, tendras que usar listas de vectores dinamicos (un poco mas de codigo, pero no demasiado complicado). En el primero de los casos el algoritmo seria:

Código:
procedimiento variaciones_rep (lista conjunto, entero n_elementos_conjunto, entero n_elementos_variacion)

    si n_elementos_variacion = 0 retornar

    para i desde 1 hasta n_elementos_conjunto

        mostrar conjunto[i]
        variaciones_rep(conjunto, n_elementos_conjunto, n_elementos_variacion - 1)

    fin para

    nueva_linea

fin variaciones

¡Saludos!