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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  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 17,230 veces)
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #10 en: 12 Julio 2012, 02:28 am »

Mi código no se salta ninguna combinación (aunque, como ya he dicho, se para en un momento determinado por la ineficiencia) y además lo imprime bien  :huh:

EDITO: Además, genera el .txt... Sigo comprobando pero no encuentro errores...


« Última modificación: 12 Julio 2012, 07:55 am por DickGumshoe » En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: como hacer un generador??
« Respuesta #11 en: 12 Julio 2012, 02:31 am »

https://foro.elhacker.net/programacion_cc/brute_force_by_n0body-t278082.0.html
No se muy bien como va eso de recursividad e iteracion, pero tengo entendido por el post que eso es un generador recursivo. En el recopilatorio de sources interesantes hay otro iterativo, creo.

Saludos.


En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #12 en: 12 Julio 2012, 07:50 am »

https://foro.elhacker.net/programacion_cc/brute_force_by_n0body-t278082.0.html
No se muy bien como va eso de recursividad e iteracion, pero tengo entendido por el post que eso es un generador recursivo. En el recopilatorio de sources interesantes hay otro iterativo, creo.

Saludos.

Gracias por el link! Es algo parecido, pero no exactamente igual.

Por cierto, ¡he editado el programa y ya va bien y es más eficiente! Lo que he modificado es la función numeros(). Ya no tiene mil y una condiciones, y el programa va perfecto (al menos por ahora no se me ha calado como otras veces, va escribiendo todo en el fichero correctamente, imprimiendo todo bien por pantalla... Aquí lo dejo:

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.  
  16. void PrimeraLetra(char *Letras, int n)
  17. {
  18.  
  19.    numeros(Letras, n);
  20.    Letras[n]++; //Pasamos al siguiente carácter [al siguiente valor ASCII]
  21.    if(Letras[n] <= 90) PrimeraLetra(Letras, n); /*90 es el valor ASCII de  'Z'. Si no se ha superado
  22.                                                                                   ese valor, significa que el nuevo carácter está
  23.                                                                                   comprendido entre la 'A' y la 'Z', y, por tanto, es
  24.                                                                                   un carácter de los que queremos generar. Así, llamamos
  25.                                                                                   a la función de nuevo.*/
  26.    else Letras[n] = 65;
  27. }
  28.  
  29. void SegundaLetra(char *Letras, int n) //Algo similar a la función anterior.
  30. {
  31.    PrimeraLetra(Letras, n);
  32.    Letras[n-1]++;
  33.    if(Letras[n-1] <= 90) SegundaLetra(Letras, n);
  34.    else Letras[n-1] = 65;
  35. }
  36.  
  37. void TerceraLetra(char *Letras, int n)
  38. {
  39.    SegundaLetra(Letras, n);
  40.    Letras[n-2]++;
  41.    if(Letras[n-2] <= 90) TerceraLetra(Letras, n);
  42.    else Letras[n-2] = 65;
  43. }
  44.  
  45. void CuartaLetra(char *Letras, int n)
  46. {
  47.    TerceraLetra(Letras, n);
  48.    Letras[n-3]++;
  49.    if(Letras[n-3] <= 90) CuartaLetra(Letras, n);
  50.    else  Letras[n-3] = 65;
  51. }
  52.  
  53. void QuintaLetra(char *Letras, int n)
  54. {
  55.    CuartaLetra(Letras, n);
  56.    Letras[n-4]++;
  57.    if(Letras[n-4] <= 90) QuintaLetra(Letras, n);
  58.    else Letras[n-4] = 65;
  59. }
  60.  
  61. int main()
  62. {
  63.    char Letras[] = "AAAAA";
  64.    fp = fopen("combinacion.txt", "w");
  65.    QuintaLetra(Letras, 4);
  66.  
  67.    fclose(fp);
  68.    return 0;
  69. }
  70.  

¡A ver si me animo y sigo editándolo para hacerlo aún mejor!

Saludos!
En línea

dato000


Desconectado Desconectado

Mensajes: 3.033



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

Código
  1. FILE *fp;
  2.  
  3. void numeros(char *Letras, int n)
  4. {
  5. int i;
  6. for(i=0;i<100000;i++)
  7. {
  8.     printf("%s%.5d\n",Letras, i);
  9.     fprintf(fp, "%s%.5d\n", Letras, i);
  10. }
  11.  
  12. }
  13.  

No termino de entender porque debe haber printf y fprint??? no es suficiente imprimir el valor en el archivo?? (fprint)? o eso solo imprime el valor en el archivo más no proporciona una salida en consola??

y sobre el archivo combinacion.txt, en donde se crea?????? al cerrarse el archivo se elimina???

Es increible el tiempo que tomo para imprimir todos los caracteres desde "AAAAA" hasta "ZZZZZ", el primer intento tuyo hizo que se bloqueara la terminal, con el fp (hey esa es otra, porque debe referenciarse *fp??) funciono mejor, aunque pues viendo el código, pues todas las funciones de quinta hasta primera letra se parecen bastante.  No soy un experto, pero intentare aligerar tanta linea.


---------------------------------------------------------------------------------------------------

Editado: Viejo me salieron nuevas dudas modificando un poco el código, viejo, quise imprimir desde "AAAAA" hasta "FFFFF", y me surgio una duda pues me salian valores númericos cuando salia en terminal, mirando la funcion numeros(char *Letras, int n) me encontre que imprimes el caracter junto con ".5%d" que es el valor numerico que representa el caracter, porque haces eso??? es por referencia?? pero si solo lo estas imprimiendo?? y porque no salia ese caracter en el codigo original??


por ende lo deje así:

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<1;i++)
  9. {
  10.     printf("%s\n",Letras, i);
  11.     fprintf(fp, "%s%.5d\n", Letras, i);
  12. }
  13.  
  14. }
  15.  
  16. void PrimeraLetra(char *Letras, int n)
  17. {
  18.  
  19.    numeros(Letras, n);
  20.    Letras[n]++;
  21.    if(Letras[n] <= 70) PrimeraLetra(Letras, n);
  22.    else Letras[n] = 65;
  23. }
  24.  
  25. void SegundaLetra(char *Letras, int n)
  26. {
  27.    PrimeraLetra(Letras, n);
  28.    Letras[n-1]++;
  29.    if(Letras[n-1] <= 70) SegundaLetra(Letras, n);
  30.    else Letras[n-1] = 65;
  31. }
  32.  
  33. void TerceraLetra(char *Letras, int n)
  34. {
  35.    SegundaLetra(Letras, n);
  36.    Letras[n-2]++;
  37.    if(Letras[n-2] <= 70) TerceraLetra(Letras, n);
  38.    else Letras[n-2] = 65;
  39. }
  40.  
  41. void CuartaLetra(char *Letras, int n)
  42. {
  43.    TerceraLetra(Letras, n);
  44.    Letras[n-3]++;
  45.    if(Letras[n-3] <= 70) CuartaLetra(Letras, n);
  46.    else  Letras[n-3] = 65;
  47. }
  48.  
  49. void QuintaLetra(char *Letras, int n)
  50. {
  51.    CuartaLetra(Letras, n);
  52.    Letras[n-4]++;
  53.    if(Letras[n-4] <= 70) QuintaLetra(Letras, n);
  54.    else Letras[n-4] = 65;
  55. }
  56.  
  57. int main()
  58. {
  59.    char Letras[] = "AAAAA";
  60.    fp = fopen("combinacion.txt", "w");
  61.    QuintaLetra(Letras, 4);
  62.  
  63.    fclose(fp);
  64.    return 0;
  65. }
  66.  
  67.  

Aun estoy mirando las formas de reducir el codigo...

Imprimir hasta "ZZZZZ" toma demasiado tiempo XD
« Última modificación: 12 Julio 2012, 17:21 pm por dato000 » En línea


DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #14 en: 12 Julio 2012, 17:24 pm »

Pongo printf y fprintf porque fprintf no imprime en consola, y es bueno ir viendo por dónde va.

El archivo se crea en la misma carpeta donde ejecutas el .exe, y no se borra (a no ser que lo hagas tú manualmente).

Al nombre de la variable le he puesto fp, pero puedes ponerle cualquier otro nombre. A mí se me ocurre cómo poder simplificar un poco el código, pero para ello necesitaré poner en una función muchos condicionales. Lo intentaré, a ver qué pasa...

Saludos!

En línea

dato000


Desconectado Desconectado

Mensajes: 3.033



Ver Perfil
Re: como hacer un generador??
« Respuesta #15 en: 12 Julio 2012, 17:59 pm »

Pongo printf y fprintf porque fprintf no imprime en consola, y es bueno ir viendo por dónde va.

ah! como pensaba imprime en el archivo verdad???

El archivo se crea en la misma carpeta donde ejecutas el .exe, y no se borra (a no ser que lo hagas tú manualmente).
pues jajaj yo lo compilo desde emacs en linux mint asi que pues...
pero es verdad se crea contiguo al compilado, antes no lo veia, pero ya todo va bien, aunque mira como imprime:

Citar
Recuerda que imprimo desde 'A' hasta 'F'

AAAAA00000
AAAAB00000
...
...
...
FFFFE00000
FFFFF00000

no entiendo esos numeros... de verdad que no me queda claro, es un dword o algo??


Al nombre de la variable le he puesto fp, pero puedes ponerle cualquier otro nombre. A mí se me ocurre cómo poder simplificar un poco el código, pero para ello necesitaré poner en una función muchos condicionales. Lo intentaré, a ver qué pasa...

Saludos!

no si yo se que es un nombre, pero mi pregunta es porque se define como un tipo FILE *tp, porque se usa como una referencia?? es un archivo apuntando a algo, o que significa??

muchos condicionales...muchos condicionales???? ummmmmmmmm yo estaba pensando en recursividad, aun no me funciona, pero sigo viendo.

Cuando imprimia TODO, la cpu llego a un 60% de uso (quede o.O cuando vi esto!) y me pregunto porque llego a ese punto?? parece que en memoria no consumio tanto.
En línea


DickGumshoe


Desconectado Desconectado

Mensajes: 480



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

Sí, imprime en el archivo.

File *fp es un puntero porque el programa necesita un puntero a un archivo para leer de este mismo o escribir en él.

¿Eso te imprime? A mí me imprime:

AAAAA00000
AAAAA00001
...
ZZZZZ99999

Y mientras el programa está en ejecución, llega al 100% de la CPU (y eso que tengo 6GB de RAM...), y sin embargo, ahora que estoy usando bastantes programas a la vez, estoy usando un 9%...

A ver si conseguimos hacer más eficiente el programa! Es un reto bastante divertido  :D
En línea

SXF

Desconectado Desconectado

Mensajes: 189



Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #17 en: 12 Julio 2012, 18:54 pm »

Por cierto y como que 14348907000000 ?¿ si solo se ha generado 7777 combinaciones con el programa.
En línea

SXF

Desconectado Desconectado

Mensajes: 189



Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #18 en: 12 Julio 2012, 18:57 pm »

Ese es el problema de usar tanta recursividad  el programa hace demasiado llamadas en foma de arbol, si se hiciera iterativo en ves de recursivo....
En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: como hacer un generador??
« Respuesta #19 en: 12 Julio 2012, 19:03 pm »

Ese es el problema de usar tanta recursividad  el programa hace demasiado llamadas en foma de arbol, si se hiciera iterativo en ves de recursivo....

¿7777 combinaciones? Son demasiado pocas. A mí me hace todas (comprobado desde el fichero que genera) y son muchísimas más...

Edito:

Hay 2,75854735 × 1015 combinaciones, creo.

Saludos!
« Última modificación: 13 Julio 2012, 01:09 am por DickGumshoe » 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
como hago para crear un generador de claves
Programación Visual Basic
trueno74 2 1,264 Último mensaje 27 Abril 2006, 00:06 am
por Hendrix
hacer un generador de id con muestras
Ingeniería Inversa
robertofd1995 4 3,990 Último mensaje 31 Octubre 2013, 15:13 pm
por robertofd1995
Como conseguir un generador de digito de control
Ingeniería Inversa
wiredbob 3 2,008 Último mensaje 22 Julio 2014, 12:02 pm
por wiredbob
***Como hacer un generador de licencias en python « 1 2 »
Scripting
Arn_dj 10 6,701 Ú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,006 Último mensaje 8 Diciembre 2014, 23:17 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines