Autor
|
Tema: como hacer un generador?? (Leído 25,204 veces)
|
xiruko
Desconectado
Mensajes: 438
|
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). #include <stdio.h> #define NUM 5 //numero de letras void cambiar_letras(char* letras, int* pos); int main(int argc, char** argv) { FILE *fd; char letras[]="AAAAA"; int posLet=0, i; fd =fopen("diccionario.txt", "w"); while (posLet < NUM) { for (i=0; i<100000; i++) fprintf(fd , "%s%.5d\n", letras , i ); cambiar_letras(letras, &posLet); } return 0; } void cambiar_letras(char* letras, int* pos) { int i; for (i=0; i<=*pos && *pos<=NUM; i++) { if (letras[i] < 'Z') { (letras[i])++; break; } else { letras[i]='A'; if ( i==*pos && (letras[i+1]=='A' || letras[i+1]=='\0') ) (*pos)++; } } }
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
Mensajes: 3.158
I'Love...!¡.
|
.
|
|
« Última modificación: 13 Julio 2012, 15:55 pm por BlackZeroX (Astaroth) »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
DickGumshoe
|
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
Mensajes: 3.158
I'Love...!¡.
|
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
|
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
Mensajes: 3.158
I'Love...!¡.
|
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
|
He cambiado el código arreglando errores: #include <stdio.h> FILE *fp; void numeros(char *Letras, int n) { int i; for(i=0;i<100000;i++) { fprintf(fp , "%s%.5d\n", Letras , i ); } } void Generador(char *Letras, int n) { int count, resta=1, llamada; while(llamada != 5) { numeros(Letras, n); count = n; Letras[n]++; llamada = 0; while(count >= 0) { if(Letras[count] > 90) { Letras[count] = 65; Letras[count-1]++; llamada++; } count--; resta++; } } } int main() { char Letras[] = "AAAAA"; fp = fopen("combinacion.txt", "w"); Generador(Letras, 4); return 0; }
¿Te referías a ese error? Saludos.
|
|
« Última modificación: 13 Julio 2012, 16:14 pm por DickGumshoe »
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
. En efecto ese era el error... y como no me quiero quedar atras con los numeros aqui lo dejo ya completo: #include <iostream> #include <iomanip> #include <cmath> using namespace std; inline string &addWord(string &text) { string::reverse_iterator it = text.rbegin(); for (; it != text.rend(); it++) { ++(*it); if (tolower(*it) >= 'a' && tolower(*it) <= 'z') break; (*it) = (islower(*it))? 'a': 'A'; } return text; } size_t addAllWord(string text, void (*callback)(string&, bool&) = NULL) { bool cancel = false; register size_t i = 0, lim = pow(26, text.size()); if (!callback) return lim; for (;(i < lim) && (cancel ==false); i++) { callback(addWord(text), cancel); } return i; } void showWords(string& text, bool& cancel) { for (register int i = 0; i <= 9999; i++) { cout << text << setw(4) << setfill('0') << i << endl; } } int main() { string text = "ZZZx"; cout << addAllWord(text, showWords) << endl; cin.get(); return 0; }
Dulces Lunas!¡.
|
|
« Última modificación: 13 Julio 2012, 16:15 pm por BlackZeroX (Astaroth) »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
DickGumshoe
|
Bueno, entonces ya tenemos varios códigos que generan lo que se pedía en el tema 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
Mensajes: 3.034
|
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#include <stdio.h> FILE *fp; void numeros(char *Letras, int n) { int i; for(i=0;i<100000;i++) { fprintf(fp , "%s%.5d\n", Letras , i ); } } void Generador(char *Letras, int n) { int count, resta=1, llamada; while(llamada != 5) { numeros(Letras, n); count = n; Letras[n]++; llamada = 0; while(count >= 0) { if(Letras[count] > 90) { Letras[count] = 65; Letras[count-1]++; llamada++; } count--; resta++; } } } int main() { char Letras[] = "AAAAA"; fp = fopen("combinacion.txt", "w"); Generador(Letras, 4); return 0; }
Otra solución aportada por BlackZeroX #include <iostream> #include <iomanip> #include <cmath> using namespace std; inline string &addWord(string &text) { string::reverse_iterator it = text.rbegin(); for (; it != text.rend(); it++) { ++(*it); if (tolower(*it) >= 'a' && tolower(*it) <= 'z') break; (*it) = (islower(*it))? 'a': 'A'; } return text; } size_t addAllWord(string text, void (*callback)(string&, bool&) = NULL) { bool cancel = false; register size_t i = 0, lim = pow(26, text.size()); if (!callback) return lim; for (;(i < lim) && (cancel ==false); i++) { callback(addWord(text), cancel); } return i; } void showWords(string& text, bool& cancel) { for (register int i = 0; i <= 9999; i++) { cout << text << setw(4) << setfill('0') << i << endl; } } int main() { string text = "ZZZx"; cout << addAllWord(text, showWords) << endl; cin.get(); return 0; }
Y otra alternativa aportada por xiruko#include <stdio.h> #define NUM 5 //numero de letras void cambiar_letras(char* letras, int* pos); int main(int argc, char** argv) { FILE *fd; char letras[]="AAAAA"; int posLet=0, i; fd =fopen("diccionario.txt", "w"); while (posLet < NUM) { for (i=0; i<100000; i++) fprintf(fd , "%s%.5d\n", letras , i ); cambiar_letras(letras, &posLet); } return 0; } void cambiar_letras(char* letras, int* pos) { int i; for (i=0; i<=*pos && *pos<=NUM; i++) { if (letras[i] < 'Z') { (letras[i])++; break; } else { letras[i]='A'; if ( i==*pos && (letras[i+1]=='A' || letras[i+1]=='\0') ) (*pos)++; } } }
EXCELENTES SOLUCIONES, REALMENTE ESTAN A OTRO NIVEL.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
hacer un generador de id con muestras
Ingeniería Inversa
|
robertofd1995
|
4
|
5,167
|
31 Octubre 2013, 15:13 pm
por robertofd1995
|
|
|
Como conseguir un generador de digito de control
Ingeniería Inversa
|
wiredbob
|
3
|
3,170
|
22 Julio 2014, 12:02 pm
por wiredbob
|
|
|
***Como hacer un generador de licencias en python
« 1 2 »
Scripting
|
Arn_dj
|
10
|
10,414
|
22 Diciembre 2014, 16:19 pm
por Arn_dj
|
|
|
MOVIDO: ***Como hacer un generador de licencias en python
Programación General
|
Eleкtro
|
0
|
2,031
|
8 Diciembre 2014, 23:17 pm
por Eleкtro
|
|
|
como hacer un vbs generador de batch
Scripting
|
destructor000
|
4
|
10,249
|
15 Septiembre 2024, 14:22 pm
por Eleкtro
|
|