Ayuda - Generador de diccionarios

Iniciado por Miky Gonzalez, 30 Junio 2012, 15:53 PM

0 Miembros y 1 Visitante están viendo este tema.

Miky Gonzalez

Estoy haciendo un codigo que llevaba bien hasta que me estanque en esto:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void uso(char *);
int main(int argc, char **argv) {
unsigned short int tmp[5] = {0, 0, 0, 0, 0};
char caracteres[39] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
't', 'u', 'v', 'w', 'x', 'y', 'z'};
if (argc > 4 || argc < 3) uso(argv[0]);
if (argv[1] == NULL) { printf("ERR ARG:1: Se debe especificar nombre de archivo\n"); uso(argv[0]); }
if (atoi(argv[2]) == 0) { printf("ERR ARG:2: Debe especificarse un numero (longitud de cadena)\n"); uso(argv[0]); }
FILE *file;
    file = fopen(argv[1], "w");
    if (file == NULL) { printf("ERR ARG:1: Ocurrio un problema al abrir/crear el archivo\n"); uso(argv[0]); }
    // GENERADOR DEL DICCIONARIO
for (tmp[0] = 1; tmp[0] <= atoi(argv[2]); tmp[0]++) {
for (tmp[4] = tmp[0]; tmp[4] >= 0; tmp[4]--) {
for (tmp[1] = strlen(caracteres); tmp[1] >= 1; tmp[1]--) {
printf("%c", caracteres[tmp[1]-1]);
if (tmp[0] == 1) printf("\n");
fputc(caracteres[tmp[1]-1], file);
if (tmp[0] == 1) fputc('\n', file);
}
for (tmp[2] = tmp[4]; tmp[2] > 1; tmp[2]--) {
for (tmp[1] = strlen(caracteres); tmp[1] >= 1; tmp[1]--) {
printf("%c", caracteres[tmp[1]-1]);
fputc(caracteres[tmp[1]-1], file);
} printf("\n");
}
}
}
    fclose(file);
    return 0;
}
void uso(char *name) {
printf("Uso: %s archivo longitud [caracteres]\n", name); exit(0);
}


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.
Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:

EN CONSTRUCCIÓN

SXF

Escribe que es lo que quieres hacer?¿ No lo entiendo.

Miky Gonzalez

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
Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:

EN CONSTRUCCIÓN

SXF

#3
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.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {

char caracteres[3] = {'a', 'b', 'c'};

    // FILE *file;
    //file = fopen("d.txt", "w");
   
    for(int i=0;i<3;i++)
    {
      printf("%c\n", caracteres[i]);
         for(int j=0;j<3;j++)
         {
            printf("%c", caracteres[j]);
            printf("%c\n", caracteres[i]);   
         }
     }
    //fclose(file);
    scanf("%d");
    return 0;
}

do-while

¡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:


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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!