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

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  como hacer un generador??
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 3 4 [5] 6 Ir Abajo Respuesta Imprimir
Autor Tema: como hacer un generador??  (Leído 24,884 veces)
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: como hacer un generador??
« Respuesta #40 en: 13 Julio 2012, 15:46 pm »

me gustaria a mi tambien compartir el codigo que he hecho, seguramente para nada sea el mas eficiente pero me gustaria saber como podria optimizarlo. genera la combinacion de AAAAA00000 a ZZZZZ99999 (no en el orden tipico).

Código
  1. #include <stdio.h>
  2.  
  3. #define NUM 5 //numero de letras
  4.  
  5. void cambiar_letras(char* letras, int* pos);
  6.  
  7. int main(int argc, char** argv)
  8. {
  9. FILE *fd;
  10. char letras[]="AAAAA";
  11. int posLet=0, i;
  12.  
  13. fd=fopen("diccionario.txt", "w");
  14.  
  15. while (posLet < NUM)
  16. {
  17. for (i=0; i<100000; i++)
  18. fprintf(fd, "%s%.5d\n", letras, i);
  19.  
  20. cambiar_letras(letras, &posLet);
  21. }
  22.  
  23. fclose(fd);
  24. return 0;
  25. }
  26.  
  27. void cambiar_letras(char* letras, int* pos)
  28. {
  29. int i;
  30.  
  31. for (i=0; i<=*pos && *pos<=NUM; i++)
  32. {
  33. if (letras[i] < 'Z') {
  34. (letras[i])++;
  35. break;
  36. } else {
  37. letras[i]='A';
  38. if ( i==*pos && (letras[i+1]=='A' || letras[i+1]=='\0') )
  39. (*pos)++;
  40. }
  41. }
  42. }

pd. gracias DickGumshoe por el especificador de formato %.5d en los enteros, no tenia ni idea de que podia representarse el 1 como 00001.


« Última modificación: 13 Julio 2012, 16:10 pm por xiruko » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #41 en: 13 Julio 2012, 15:49 pm »

.


« Última modificación: 13 Julio 2012, 15:55 pm por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #42 en: 13 Julio 2012, 15:50 pm »

La problemática de almacenamiento es despreciable... lee bien lo que se quiere.

Dulces Lunas!¡.

Pero después nos pide cómo almacenarlo en un .txt... y por tanto es imposible (o eso creo xD).

Por cierto, estoy volviendo a hacer una modificación de mi código que he encontrado un error...

Saludos!
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #43 en: 13 Julio 2012, 15:54 pm »

si tienes un error cambia tu limite del for y veras...

* No es imposible, solo se tendrían que usar varios HDD y a su vez varios archivos...

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #44 en: 13 Julio 2012, 15:56 pm »

si tienes un error cambia tu limite del for y veras...

Dulces Lunas!¡.

No me refería a eso... El límite del for lo tengo puesto así porque el programa es para generar hasta 99999. Claro que si cambio el límite y pongo más saldrá mal, pero porque pongo %.5d, no por otra cosa...

Sí, eso de usar varios archivos es una buena idea!

Saludos!
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #45 en: 13 Julio 2012, 16:01 pm »

Yo te decía que cambiaras el limite para que vieras tu error...

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #46 en: 13 Julio 2012, 16:04 pm »

He cambiado el código arreglando errores:

Código
  1. #include <stdio.h>
  2.  
  3. FILE *fp;
  4.  
  5. void numeros(char *Letras, int n)
  6. {
  7. int i;
  8. for(i=0;i<100000;i++)
  9. {
  10.     printf("%s%.5d\n",Letras, i);
  11.     fprintf(fp, "%s%.5d\n", Letras, i);
  12. }
  13. }
  14.  
  15. void Generador(char *Letras, int n)
  16. {
  17.    int count, resta=1, llamada;
  18.    while(llamada != 5)
  19.    {
  20.        numeros(Letras, n);
  21.        count = n;
  22.        Letras[n]++;
  23.        llamada = 0;
  24.        while(count >= 0)
  25.        {
  26.            if(Letras[count] > 90)
  27.            {
  28.                Letras[count] = 65;
  29.                Letras[count-1]++;
  30.                llamada++;
  31.            }
  32.            count--;
  33.            resta++;
  34.        }
  35.    }
  36. }
  37. int main()
  38. {
  39.    char Letras[] = "AAAAA";
  40.    fp = fopen("combinacion.txt", "w");
  41.    Generador(Letras, 4);
  42.    fclose(fp);
  43.    return 0;
  44. }
  45.  

¿Te referías a ese error?

Saludos.

« Última modificación: 13 Julio 2012, 16:14 pm por DickGumshoe » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #47 en: 13 Julio 2012, 16:13 pm »

.
En efecto ese era el error... y como no me quiero quedar atras con los numeros aqui lo dejo ya completo:

Código
  1.  
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. inline string &addWord(string &text) {
  9.    string::reverse_iterator it = text.rbegin();
  10.    for (; it != text.rend(); it++) {
  11.        ++(*it);
  12.        if (tolower(*it) >= 'a' && tolower(*it) <= 'z') break;
  13.        (*it) = (islower(*it))? 'a': 'A';
  14.    }
  15.    return text;
  16. }
  17.  
  18. size_t addAllWord(string text, void (*callback)(string&, bool&) = NULL) {
  19.    bool cancel = false;
  20.    register size_t i = 0, lim = pow(26, text.size());
  21.    if (!callback) return lim;
  22.    for (;(i < lim) && (cancel ==false); i++) {
  23.        callback(addWord(text), cancel);
  24.    }
  25.    return i;
  26. }
  27.  
  28. void showWords(string& text, bool& cancel) {
  29.    for (register int i = 0; i <= 9999; i++) {
  30.        cout << text << setw(4) << setfill('0') << i << endl;
  31.    }
  32. }
  33.  
  34. int main() {
  35.    string text = "ZZZx";
  36.    cout << addAllWord(text, showWords) << endl;
  37.    cin.get();
  38.    return 0;
  39. }
  40.  
  41.  

Dulces Lunas!¡.
« Última modificación: 13 Julio 2012, 16:15 pm por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #48 en: 13 Julio 2012, 16:16 pm »

Bueno, entonces ya tenemos varios códigos que generan lo que se pedía en el tema  :D

BlackZeroX (Astaroth), con lo de imposible en un ordenador normal me refería a uno cualquiera, sin discos duros extras ni nada...

Saludos y gracias por avisar del error!

EDITO:

Bueno, creo que ya, a no ser que el autor del tema diga lo contrario, su duda ya está solucionada.
« Última modificación: 13 Julio 2012, 16:37 pm por DickGumshoe » En línea

dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: como hacer un generador??
« Respuesta #49 en: 13 Julio 2012, 18:19 pm »

Voy a dejar un post resumen de este tema, muy interesante, queria dejar el mio pero no es tan bueno jaajaj sigo mirando varias cosas. Es practicamente uno que DickGumshoe deja pero trate de corregir la recursividad pero no me funciono muy bien, en fin, dejo las soluciones publicadas.

muy buen post realmente muy bueno


Aqui el primero de DickGumshoe

Código
  1. #include <stdio.h>
  2.  
  3. FILE *fp;
  4.  
  5. void numeros(char *Letras, int n)
  6. {
  7. int i;
  8. for(i=0;i<100000;i++)
  9. {
  10.     printf("%s%.5d\n",Letras, i);
  11.     fprintf(fp, "%s%.5d\n", Letras, i);
  12. }
  13. }
  14.  
  15. void Generador(char *Letras, int n)
  16. {
  17.    int count, resta=1, llamada;
  18.    while(llamada != 5)
  19.    {
  20.        numeros(Letras, n);
  21.        count = n;
  22.        Letras[n]++;
  23.        llamada = 0;
  24.        while(count >= 0)
  25.        {
  26.            if(Letras[count] > 90)
  27.            {
  28.                Letras[count] = 65;
  29.                Letras[count-1]++;
  30.                llamada++;
  31.            }
  32.            count--;
  33.            resta++;
  34.        }
  35.    }
  36. }
  37. int main()
  38. {
  39.    char Letras[] = "AAAAA";
  40.    fp = fopen("combinacion.txt", "w");
  41.    Generador(Letras, 4);
  42.    fclose(fp);
  43.    return 0;
  44. }
  45.  


Otra solución aportada por BlackZeroX

Código
  1.  
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. inline string &addWord(string &text) {
  9.    string::reverse_iterator it = text.rbegin();
  10.    for (; it != text.rend(); it++) {
  11.        ++(*it);
  12.        if (tolower(*it) >= 'a' && tolower(*it) <= 'z') break;
  13.        (*it) = (islower(*it))? 'a': 'A';
  14.    }
  15.    return text;
  16. }
  17.  
  18. size_t addAllWord(string text, void (*callback)(string&, bool&) = NULL) {
  19.    bool cancel = false;
  20.    register size_t i = 0, lim = pow(26, text.size());
  21.    if (!callback) return lim;
  22.    for (;(i < lim) && (cancel ==false); i++) {
  23.        callback(addWord(text), cancel);
  24.    }
  25.    return i;
  26. }
  27.  
  28. void showWords(string& text, bool& cancel) {
  29.    for (register int i = 0; i <= 9999; i++) {
  30.        cout << text << setw(4) << setfill('0') << i << endl;
  31.    }
  32. }
  33.  
  34. int main() {
  35.    string text = "ZZZx";
  36.    cout << addAllWord(text, showWords) << endl;
  37.    cin.get();
  38.    return 0;
  39. }
  40.  
  41.  




Y otra alternativa aportada por xiruko

Código
  1. #include <stdio.h>
  2.  
  3. #define NUM 5 //numero de letras
  4.  
  5. void cambiar_letras(char* letras, int* pos);
  6.  
  7. int main(int argc, char** argv)
  8. {
  9. FILE *fd;
  10. char letras[]="AAAAA";
  11. int posLet=0, i;
  12.  
  13. fd=fopen("diccionario.txt", "w");
  14.  
  15. while (posLet < NUM)
  16. {
  17. for (i=0; i<100000; i++)
  18. fprintf(fd, "%s%.5d\n", letras, i);
  19.  
  20. cambiar_letras(letras, &posLet);
  21. }
  22.  
  23. fclose(fd);
  24. return 0;
  25. }
  26.  
  27. void cambiar_letras(char* letras, int* pos)
  28. {
  29. int i;
  30.  
  31. for (i=0; i<=*pos && *pos<=NUM; i++)
  32. {
  33. if (letras[i] < 'Z') {
  34. (letras[i])++;
  35. break;
  36. } else {
  37. letras[i]='A';
  38. if ( i==*pos && (letras[i+1]=='A' || letras[i+1]=='\0') )
  39. (*pos)++;
  40. }
  41. }
  42. }

EXCELENTES SOLUCIONES, REALMENTE ESTAN A OTRO NIVEL.
En línea


Páginas: 1 2 3 4 [5] 6 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
hacer un generador de id con muestras
Ingeniería Inversa
robertofd1995 4 5,139 Último mensaje 31 Octubre 2013, 15:13 pm
por robertofd1995
Como conseguir un generador de digito de control
Ingeniería Inversa
wiredbob 3 3,139 Último mensaje 22 Julio 2014, 12:02 pm
por wiredbob
***Como hacer un generador de licencias en python « 1 2 »
Scripting
Arn_dj 10 10,318 Último mensaje 22 Diciembre 2014, 16:19 pm
por Arn_dj
MOVIDO: ***Como hacer un generador de licencias en python
Programación General
Eleкtro 0 1,990 Último mensaje 8 Diciembre 2014, 23:17 pm
por Eleкtro
como hacer un vbs generador de batch
Scripting
destructor000 4 9,573 Último mensaje 15 Septiembre 2024, 14:22 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines