Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ideas para realizar Diccionario

Estas en el tema de Ideas para realizar Diccionario en el foro de C/C++ en Foros del Web. Buen día, tarde o noche Pidiendo su ayuda, esta ves con ideas para realizar un diccionario con los caracteres que ingrese el usuario. Es decir ...
  #1 (permalink)  
Antiguo 10/02/2013, 19:53
 
Fecha de Ingreso: julio-2008
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 1
Ideas para realizar Diccionario

Buen día, tarde o noche

Pidiendo su ayuda, esta ves con ideas para realizar un diccionario con los caracteres que ingrese el usuario. Es decir si quiero un diccionario de longitud 13 y con caracteres de 0 a 9 y de A a F. Les comento lo que he realizado:

he intentado con arrays, donde en el array se almacena los primeros caracteres.
intento hacer copiar nuevamente los caracteres, con la función de strcpy, para formar las primeras combinaciones.
Hecho lo anterior con un puntero al primer array, lamentablemente no he conseguido algo favorable.

Espero que ma aporten sus ideas, comentarios, etc.

Gracias de antemano a toda la comunidad.
Saludos
  #2 (permalink)  
Antiguo 11/02/2013, 01:49
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 5 meses
Puntos: 28
Respuesta: Ideas para realizar Diccionario

Una pregunta, ¿Usas C o C++?

Si usas C++ puedes usar la clase string que sea ajusta automaticamente al tamanyo del texto:

Código:
string Texto = "Hola mundo";
cout<<Texto<<endl<<Texto.size()<<endl;

Texto = "Reducido"; // Los strings se ajustan automaticamente
cout<<Texto<<end<<Texto.size()<<endl;

string Texto2 = Texto; // Copia de un string a otro
cout<<Texto2<<endl;
También hay muchas funciones internas para jugar con ellos:
http://www.cplusplus.com/reference/string/string/
  #3 (permalink)  
Antiguo 11/02/2013, 14:41
 
Fecha de Ingreso: julio-2008
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Ideas para realizar Diccionario

En C++.

Existen algunas funciones para concatenar cadenas, pero no he podido realizar mi diccionario.

Supongamos que tengo una cadena con los digitos de los números (0-9)
y otra cadena con las literales (A-F), aquí el problema es para hacer lo siguiente:

0000000000001
0000000000002
0000000000003
......
FFFFFFFFFFFFF

la idea es tener todas las posibles combinaciones, que se muestren en pantalla y después se puedan guardar en un txt.

O se podrá hacer directamente sin cadenas??. Es decir, incrementando únicamnte una variable y condicionar su ejecución hasta FFFFF.....
  #4 (permalink)  
Antiguo 12/02/2013, 10:44
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años, 7 meses
Puntos: 8
Respuesta: Ideas para realizar Diccionario

Yo lo que haría es:

char x[13];

y hacer for's anidados de manera que el for exterior representa el primer dígito, el quele sigue el segundo, etc... así:

Código C++:
Ver original
  1. for(int i = 0; i < 13; i++)
  2.    switch(i)
  3.    {
  4.       case 0:
  5.          x[0] = '0';
  6.          break;
  7.       case 1:
  8.          x[0] = '1';
  9.          break;
  10.       // ...
  11.    }

En cada pasada (o sea, en el for del último anidamiento), haría que se imprimiera x y se guardara en un txt.

Puedes resumir los switch con una función inline.

Saludos.
  #5 (permalink)  
Antiguo 13/02/2013, 14:06
 
Fecha de Ingreso: julio-2008
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Ideas para realizar Diccionario

Creqo que no me quedó clara tu idea ó no me resultó en una prueba. coloqué el código como me indicaste, eun un sólo for para capturar los primeros caracteres, pero al momento de imprimir en pantalla, iimprime "basura".
  #6 (permalink)  
Antiguo 13/02/2013, 15:38
Avatar de cronopiomx  
Fecha de Ingreso: mayo-2012
Ubicación: Programing Cloud
Mensajes: 282
Antigüedad: 12 años, 7 meses
Puntos: 28
Respuesta: Ideas para realizar Diccionario

Hola jask, piensa y vuelve a elaborar bien tu pregunta, pues me parece que ambos no te entendemos de lo que quieres en verdad.

saludos
cronos
  #7 (permalink)  
Antiguo 14/02/2013, 13:35
 
Fecha de Ingreso: julio-2008
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Ideas para realizar Diccionario

ok, bueno la idea es crear un diccionario.

¿Cómo funciona?. Generando palabras, pero sin repetirse, en esta caso son todas las posibles combinaciones con los digitos del sistema hexadecimal(0-9 y A-F). por lo tanto las combinaciones empiezan con

0000000000001
0000000000002
hasta llegar a
FFFFFFFFFFFFF

es ir incrementando el valor hasta llegar a FFFFFFFF, generando así todas las posibles combinaciones con los caracteres del sistema hexadecimal.

estas combinaciones se deben de almacenar en un txt.

Ha quedado más claro??
  #8 (permalink)  
Antiguo 15/02/2013, 14:53
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 10 meses
Puntos: 22
Respuesta: Ideas para realizar Diccionario

Hola, lo grave no me parece que quieras generar las combinaciones, sino que creo no has dimensionado la cantidad de bytes que necesitas para almacenar todo en un archivo de texto.

En total para esas 13 posiciones tienes:

16^13 = 4503599627370496 diferentes combinaciones.

Que si tratas de almacenarlas en un archivo de texto necesitas 13 bytes por cada una, es decir:

4503599627370496 * 13 = 58546795155816448 bytes.

Equivalentes a: 54525952 GB. Algo que luce poco amigable.

Te dejo un ejemplo utilizando sólo 3 posiciones, la idea es ir aumentando cada valor de derecha a izquierda similar a como lo hace un reloj digital. Entendiendo el procedimiento puedes hacerlo fácilmente para el número de posiciones que quieras, sólo toma en cuenta las cantidades de almacenamiento.

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main(){
  5.  
  6.     const int TOTALDIG = 16;
  7.     const int TOTALPOS = 3;
  8.     char digits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
  9.     int counter[TOTALPOS] = {0};
  10.     int total = 0;
  11.  
  12.     for(;;){
  13.         for(int i = 0; i < TOTALPOS; ++i)cout << digits[counter[i]];
  14.         cout << endl;
  15.  
  16.         counter[TOTALPOS-1]++;
  17.         if(counter[TOTALPOS-1] == TOTALDIG){
  18.             counter[TOTALPOS-1] = 0;
  19.             counter[TOTALPOS-2]++;
  20.         }
  21.         if(counter[TOTALPOS-2] == TOTALDIG){
  22.             counter[TOTALPOS-2] = 0;
  23.             counter[TOTALPOS-3]++;
  24.         }
  25.         total++;
  26.         if(counter[TOTALPOS-3] == TOTALDIG)break;
  27.     }
  28.     cout << "Total numbers: " << total << endl;
  29.     return 0;
  30. }

Saludos.
  #9 (permalink)  
Antiguo 16/02/2013, 10:19
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Ideas para realizar Diccionario

"...Equivalentes a: 54525952 GB. Algo que luce poco amigable...."

Peor que poco amigable :)


A ver un momento, no se si soy yo que no lo veo claro o es que habeis comenzado a correr sin tener claro donde estaba la meta :)

Una lista de posibles combinaciones entre 0-9 a-f es lo mismo que una lista entre 0x000000 y 0xffffff, de donde sale que tiene que tener 13, 16 o 8 de largo?? (Tal vez soy yo que me estoy confundiendo, si es asi no tengas en cuenta este post)

Cita:
Iniciado por jask2007 Ver Mensaje
ok, bueno la idea es crear un diccionario.

¿Cómo funciona?. Generando palabras, pero sin repetirse, en esta caso son todas las posibles combinaciones con los digitos del sistema hexadecimal(0-9 y A-F). por lo tanto las combinaciones empiezan con

0000000000001
0000000000002
hasta llegar a
FFFFFFFFFFFFF

es ir incrementando el valor hasta llegar a FFFFFFFF, generando así todas las posibles combinaciones con los caracteres del sistema hexadecimal.

estas combinaciones se deben de almacenar en un txt.

Ha quedado más claro??
Tal como comentas, la lista de posibles combinaciones del sistema hexadecimal (la permutacion) se consigue con un simple for entre 0 y 0xffffffh, y genera 16777216 resultados:

Código:
int q;
for(q = 0; q <= 0xffffff; q++) {
    printf("%d\t%06x\n", q, q);
}
Ahora viene el truco: si lo guardas como texto de 6 caracteres (%06x) ocupara 100ypico megas, pero si lo guardas como enteros solo 60yalgo.

No?

Saludos
vosk

Última edición por vosk; 16/02/2013 a las 10:24
  #10 (permalink)  
Antiguo 16/02/2013, 15:10
 
Fecha de Ingreso: julio-2008
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Ideas para realizar Diccionario

Tal como menciona fightmx, haciendo las posibles combinaciones de los digitos hexadecimales da ese resultado 4503599627370496. Algo grande.

Quisá, no lo he probado, con tu código vosk, intentas hacer algo que también lo pensé en su momento, pero el resultado sería 1, 2, 3, 4 ,5 ,6, etc. hasta FFFFFFFF, aunque repito que no lo he probado.

El código de fightmx es exactamente la solución al problema, desde la primer combinación se tiene 0000000000001.

Cómo ya se solucionó mi problemas Gracias a todos por sus ideas y aportes. En especial al compañero fightmx. Y cómo ultima petición, me gustaría que nos ilustre con la forma en analizó el problema y planteó la solución a la mismo. Esto como manera de aprendizaje.

Saludos
  #11 (permalink)  
Antiguo 19/02/2013, 17:06
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 10 meses
Puntos: 22
Respuesta: Ideas para realizar Diccionario

Hola jask2007, no hay nada especial es simplemente contar como lo hacemos de manera tradicional, la diferencia es que no lo estás haciendo en sistema decimal.

Cuando tienes 10 dígitos(sistema decimal) y digamos tres posiciones, entonces el número de combinaciones es en si la cantidad de números que puedes representar, esto es: 10^3 = 1000 números diferentes (0-999). Para representarlos lo que hacemos es ir incrementando el valor de la posición a la izquierda cada que se cumpla un ciclo (0-9) en la posición actual, por ejemplo:

| 0 | 0 | 0 |
| 0 | 0 | 1 |
| 0 | 0 | 2 |
| 0 | 0 | 3 |
| 0 | 0 | 4 |
| 0 | 0 | 5 |
| 0 | 0 | 6 |
| 0 | 0 | 7 |
| 0 | 0 | 8 |
| 0 | 0 | 9 |
| 0 | 1 | 0 |
| 0 | 1 | 1 |
| 0 | 1 | 2 |
| 0 | 1 | 3 |
| 0 | 1 | 4 |
| 0 | 1 | 5 |
| 0 | 1 | 6 |
| 0 | 1 | 7 |
| 0 | 1 | 8 |
| 0 | 1 | 9 |
| 0 | 2 | 0 |
.
.
.
| 0 | 9 | 0 |
| 0 | 9 | 1 |
| 0 | 9 | 2 |
| 0 | 9 | 3 |
| 0 | 9 | 4 |
| 0 | 9 | 5 |
| 0 | 9 | 6 |
| 0 | 9 | 7 |
| 0 | 9 | 8 |
| 0 | 9 | 9 |
| 1 | 0 | 0 |
.
.
.
| 9 | 9 | 9 |

Lo mismo puedes hacer con el sistema hexadecimal y con cualquier otra base, el número de combinaciones que obtienes está dado por: base^numpos. La manera de representarlos es análoga al sistema decimal, únicamente cambia la cantidad de elementos (16 en hexadecimal) para representar el ciclo, entonces puedes utilizar un arreglo con el número de posiciones e ir cambiando los valores con un contador en cada uno de ellos (como en el ejemplo). A veces la forma más simple puede resultar la menos obvia.

Como comentó vosk, aún más simple es utilizar un loop e imprimir los valores desde 1 hasta FFFFFFFF, pero no más, ya que la limitante equivale a 32 posiciones (32 bits o 64 en el caso de un sistema de 64 bits) de un sistema binario, esto es 2^32 combinaciones diferentes (16^8 en hexadecimal).

Saludos.

Etiquetas: arrays, diccionario, ideas, int
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:06.