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

 

 


Tema destacado: Curso de javascript por TickTack


  Mostrar Mensajes
Páginas: 1 2 3 4 5 [6]
51  Programación / Programación C/C++ / Funcion genera numeros aleatorios de x cifras ayuda en: 24 Abril 2015, 16:33 pm
Hola a tod@s, resulta que para el motor de cifrado que estoy escribiendo acabo de hacer una función que debería generar numeros aleatorios muy grandes, para ello uso el truco de ir generando numero por numero e ir guardandolo uno a uno en una cadena y después pasarlo a double con atof, pero no funciona como debería, dejo el código:

Código
  1. double aleatorio_cifras(int cifras) {
  2.  
  3. int x;
  4. int random;
  5. char aux[2];
  6. char num[cifras];
  7.  
  8. for(x=0; x<cifras; x++){
  9.  
  10. random=rand () % 10;
  11. sprintf(aux, "%d", random);
  12. strcat(num, aux);
  13.  
  14. }
  15. printf("%s", num);
  16. return atof(num);
  17.  
  18. }
  19.  

Esto genera de salida algo así:

"�@2282"

Es decir, genera el numero aleatorio de 4 cifras que le pido, pero antes genera esos caracteres que no se de donde salen, y por culpa de eso la función atof no convierte bien el string a double.

Gracias de antemano saludos.
52  Programación / Programación C/C++ / Re: Perdido y desesperado con este código en: 23 Abril 2015, 16:34 pm
voy avanzando, dejo el codigo que llevo ahora:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #include <math.h>
  6.  
  7. // constantes
  8.  
  9. #define numero_de_letras 27
  10.  
  11. // variables globales
  12.  
  13. double claves[numero_de_letras][1000];
  14. int clave[numero_de_letras];
  15.  
  16.  
  17. // arrays globales
  18. char letras[]="abcdefghijklmnopqrstuvwxyz ";
  19. char cifrado[999999999];
  20. char descifrado[999999999];
  21.  
  22. // prototipos de funciones
  23. void generar_clave(int);
  24. void ingresar_clave(int []);
  25. int comprobar_repetir_vector(int, int, int []);
  26. int comprobar_repetir_matriz(int, double, double [][1000]);
  27. void arrancar_motor(int, int);
  28. int suma(double);
  29. double aleatorio(double, double);
  30. void cifrar(int, int, char []);
  31. void descifrar(int, char []);
  32.  
  33. int main() {
  34.  
  35.  
  36. generar_clave(10);
  37. arrancar_motor(10, 1);
  38.  
  39.  
  40.  
  41.  
  42. }
  43.  
  44. // comprueba si un numero esta repetido en una matriz, si esta repetido devuelve 1, en caso contrario 0.
  45. int comprobar_repetir_matriz(int n, double numero, double matriz[][1000]) {
  46.  
  47. int x;
  48. int y;
  49. for(x=0; x<n-1; x++) {
  50.  
  51. for(y=0;y<1000;y++) {
  52.  
  53. if (numero==matriz[x][y]) {
  54. return 1;
  55. }
  56. }
  57.  
  58. }
  59. return 0;
  60.  
  61. }
  62.  
  63. // comprueba si un numero esta repetido en un vector, si esta repetido devuelve 1, en caso contrario 0.
  64. int comprobar_repetir_vector(int n, int numero, int vector[]){
  65.  
  66. int x;
  67. for(x=0; x<n-1;x++) {
  68.  
  69. if(numero==vector[x]) {
  70.  
  71. return 1;
  72.  
  73. }
  74. }
  75. return 0;
  76. }
  77.  
  78. // Devuelve la suma de las cifras de un numero
  79. int suma(double numero) {
  80.  
  81. int resultado=0;
  82. while (numero>0) {
  83.  
  84. resultado+=fmod(numero, 10);
  85. numero/=10;
  86. }
  87. return resultado;
  88. }
  89.  
  90. //Genera un numero aleatorio sin decimales dentro de un rango entre max y min.
  91. double aleatorio(double max, double min) {
  92.  
  93.  
  94. return fmod(rand (), (max-min+1) + min);
  95.  
  96.  
  97. }
  98.  
  99. //Genera una clave optimidada y la guarda en la variable global clave.
  100. void generar_clave(int numero_suma) {
  101.  
  102.  
  103. int maximo, minimo, x, y, num_random;
  104.  
  105. int max=120;
  106. int min=60;
  107.  
  108. maximo=numero_suma*max/20;
  109. minimo=numero_suma*min/20;
  110.  
  111.  
  112. for(x=0;x<numero_de_letras;) {
  113. num_random=aleatorio(maximo, minimo);
  114. if (comprobar_repetir_vector(x, num_random, &clave[0])==1) {
  115. continue;
  116. }
  117. clave[x]=num_random;
  118. x++;
  119. }
  120.  
  121. printf("se ha generado la clave: \n");
  122. for(y=0;y<numero_de_letras;y++) {
  123.  
  124. printf("(%d)", clave[y]);
  125.  
  126. }
  127. printf("\n");
  128. }
  129.  
  130. // Permite ingresar el valor de cualquier array en la variable global clave.
  131. void ingresar_clave(int array[]) {
  132.  
  133. int x;
  134.  
  135. for(x=0;x<numero_de_letras;x++) {
  136.  
  137. clave[x]=array[x];
  138. }
  139.  
  140. }
  141. // Genera los numeros aleatorios correspondientes a cada letra y los guarda según corresponda en la matriz claves.
  142. void arrancar_motor(int numero_cifras, int cantidad_numeros){
  143.  
  144.    srand(getpid());
  145.  
  146. int y, z, h;
  147. double num_random;
  148.  
  149. double min=(double)pow(10.0, numero_cifras-1);
  150. double max=(double)pow(10.0, numero_cifras)-1;
  151.  
  152. for(z=0; z<numero_de_letras; z++) {
  153. printf("Inicializando letra %c\n", letras[z]);
  154. for(h=0; h<cantidad_numeros;) {
  155. num_random=aleatorio(max, min);
  156.                        printf("%lf\n", num_random);
  157. if (((fabs(suma(num_random)-clave[z])) < 0.001) && (comprobar_repetir_matriz(z, num_random, claves))==0) {
  158.  
  159. claves[z][h]=num_random;
  160. printf("%.0lf\n", num_random);
  161. h++;
  162.  
  163.  
  164.  
  165. } else { continue;  }
  166.  
  167.  
  168. }
  169. }
  170. printf("se ha generado la clave: \n");
  171. for(y=0;y<numero_de_letras;y++) {
  172.  
  173. printf("(%d)", clave[y]);
  174.  
  175. }
  176. printf("\ncon un numero de cifras de %d\n", numero_cifras);
  177.            printf("%lf, %lf", max, min);
  178. }
  179.  
  180. // Cifra un texto usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global cifrado.
  181. void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {
  182.  
  183.  
  184. int letra, letrass, x;
  185. char cifrado_inside[strlen(texto)*numero_cifras];
  186. char string_auxiliar[numero_cifras-1];
  187. for(letra=0; strlen(texto)>letra; letra++) {
  188.  
  189.  
  190. for(letrass=0; letrass<numero_de_letras; letrass++) {
  191.  
  192. if (texto[letra]==letras[letrass]) {
  193. sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
  194. strcat(cifrado_inside, string_auxiliar);
  195. break;
  196. }
  197.  
  198. }
  199.  
  200. }
  201. strcpy(cifrado, cifrado_inside);
  202.  
  203. }
  204.  
  205. // Descifra un texto cifrado anteriormente usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global descifrado.
  206. void descifrar(int numero_cifras, char cifrado[]) {
  207.  
  208.  
  209. char auxiliar[numero_cifras];
  210. int x, y=0, z;
  211.  
  212. for(x=0; x<strlen(cifrado); x++) {
  213.  
  214. auxiliar[y]=cifrado[x];
  215. y++;
  216.  
  217.  
  218. if(y==numero_cifras) {
  219.  
  220. for(z=0; z<numero_de_letras; z++) {
  221.  
  222. if(suma(atof(auxiliar))==clave[z]) {
  223.  
  224. descifrado[strlen(descifrado)]=letras[z];
  225. y=0;
  226. break;
  227.  
  228. }
  229.  
  230. }
  231.  
  232. }
  233.  
  234. }
  235.  
  236. }
  237.  
  238.  

Pero ahora el problema es que se generan numeros aleatorios con cifras incorrectas, es decir que si tienen que generarse de 10 cifras, se generan de 10 cifras y alguno que otro de 8 y 9. ¿Podeis echarle un vistazo?.

Saludos
53  Programación / Programación C/C++ / Re: Perdido y desesperado con este código en: 22 Abril 2015, 17:34 pm
Código
  1. gcc pruebas.c -o pruebas -lm

Ostras, que despiste, perdonad, ya lo he compilado y lo he probado, el caso es que si arranco el motor con una clave de 10 cifras arranca perfecto, pero cuando le meto ya 15 o 20 genera un único número aleatorio, este: "-2147483648".

Saludos.
54  Programación / Programación C/C++ / Re: Perdido y desesperado con este código en: 22 Abril 2015, 16:35 pm
Hola otra vez, he corregido los fallos que me has comentado y los he corregido, os dejo el código corregido:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #include <math.h>
  6.  
  7. // constantes
  8.  
  9. #define numero_de_letras 27
  10.  
  11. // variables globales
  12.  
  13. double claves[numero_de_letras][1000];
  14. int clave[numero_de_letras];
  15.  
  16.  
  17. // arrays globales
  18. char letras[]="abcdefghijklmnopqrstuvwxyz ";
  19. char cifrado[999999999];
  20. char descifrado[999999999];
  21.  
  22. // prototipos de funciones
  23. void generar_clave(int);
  24. void ingresar_clave(int []);
  25. int comprobar_repetir_vector(int, int, int []);
  26. int comprobar_repetir_matriz(int, double, double [][1000]);
  27. void arrancar_motor(int, int);
  28. int suma(double);
  29. double aleatorio(int, int);
  30. void cifrar(int, int, char []);
  31. void descifrar(int, char []);
  32.  
  33. int main() {
  34.  
  35. generar_clave(15);
  36. arrancar_motor(15, 1);
  37.  
  38.  
  39.  
  40. }
  41.  
  42. // comprueba si un numero esta repetido en una matriz, si esta repetido devuelve 1, en caso contrario 0.
  43. int comprobar_repetir_matriz(int n, double numero, double matriz[][1000]) {
  44.  
  45. int x;
  46. int y;
  47. for(x=0; x<n-1; x++) {
  48.  
  49. for(y=0;y<1000;y++) {
  50.  
  51. if (numero==matriz[x][y]) {
  52. return 1;
  53. }
  54. }
  55.  
  56. }
  57. return 0;
  58.  
  59. }
  60.  
  61. // comprueba si un numero esta repetido en un vector, si esta repetido devuelve 1, en caso contrario 0.
  62. int comprobar_repetir_vector(int n, int numero, int vector[]){
  63.  
  64. int x;
  65. for(x=0; x<n-1;x++) {
  66.  
  67. if(numero==vector[x]) {
  68.  
  69. return 1;
  70.  
  71. }
  72. }
  73. return 0;
  74. }
  75.  
  76. // Devuelve la suma de las cifras de un numero
  77. int suma(double numero) {
  78.  
  79. int resultado=0;
  80. while (numero>0) {
  81.  
  82. resultado+=fmod(numero, 10);
  83. numero/=10;
  84. }
  85. return resultado;
  86. }
  87.  
  88. //Genera un numero aleatorio sin decimales dentro de un rango entre max y min.
  89. double aleatorio(int max, int min) {
  90.  
  91.  
  92. return rand () % (max-min+1) + min;
  93.  
  94.  
  95. }
  96. //Genera una clave optimidada y la guarda en la variable global clave.
  97. void generar_clave(int numero_suma) {
  98.  
  99.  
  100. int maximo, minimo, x, y, num_random;
  101.  
  102. int max=120;
  103. int min=60;
  104.  
  105. maximo=numero_suma*max/20;
  106. minimo=numero_suma*min/20;
  107.  
  108.  
  109. for(x=0;x<numero_de_letras;) {
  110. num_random=aleatorio(maximo, minimo);
  111. if (comprobar_repetir_vector(x, num_random, &clave[0])==1) {
  112. continue;
  113. }
  114. clave[x]=num_random;
  115. x++;
  116. }
  117.  
  118. printf("se ha generado la clave: \n");
  119. for(y=0;y<numero_de_letras;y++) {
  120.  
  121. printf("(%d)", clave[y]);
  122.  
  123. }
  124. printf("\n");
  125. }
  126.  
  127. // Permite ingresar el valor de cualquier array en la variable global clave.
  128. void ingresar_clave(int array[]) {
  129.  
  130. int x;
  131.  
  132. for(x=0;x<numero_de_letras;x++) {
  133.  
  134. clave[x]=array[x];
  135. }
  136.  
  137. }
  138. // Genera los numeros aleatorios correspondientes a cada letra y los guarda según corresponda en la matriz claves.
  139. void arrancar_motor(int numero_cifras, int cantidad_numeros){
  140.  
  141. srand(time(NULL));
  142.  
  143. int y, z, h;
  144. double num_random;
  145.  
  146. double min=(double)pow(10.0, numero_cifras-1);
  147. double max=(double)pow(10.0, numero_cifras)-1;
  148.  
  149. for(z=0; z<numero_de_letras; z++) {
  150. printf("Inicializando letra %c\n", letras[z]);
  151. for(h=0; h<cantidad_numeros;) {
  152. num_random=aleatorio(max, min);
  153. printf("%lf", num_random);
  154. if (((fabs(suma(num_random)-clave[z])) < 0.001) && (comprobar_repetir_matriz(z, num_random, claves))==0) {
  155.  
  156. claves[z][h]=num_random;
  157. printf("%.0lf\n", num_random);
  158. h++;
  159.  
  160.  
  161.  
  162. } else { continue;  }
  163.  
  164.  
  165. }
  166. }
  167. printf("se ha generado la clave: \n");
  168. for(y=0;y<numero_de_letras;y++) {
  169.  
  170. printf("(%d)", clave[y]);
  171.  
  172. }
  173. printf("\ncon un numero de cifras de %d\n", numero_cifras);
  174. }
  175.  
  176. // Cifra un texto usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global cifrado.
  177. void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {
  178.  
  179.  
  180. int letra, letrass, x;
  181. char cifrado_inside[strlen(texto)*numero_cifras];
  182. char string_auxiliar[numero_cifras-1];
  183. for(letra=0; strlen(texto)>letra; letra++) {
  184.  
  185.  
  186. for(letrass=0; letrass<numero_de_letras; letrass++) {
  187.  
  188. if (texto[letra]==letras[letrass]) {
  189. sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
  190. strcat(cifrado_inside, string_auxiliar);
  191. break;
  192. }
  193.  
  194. }
  195.  
  196. }
  197. strcpy(cifrado, cifrado_inside);
  198.  
  199. }
  200.  
  201. // Descifra un texto cifrado anteriormente usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global descifrado.
  202. void descifrar(int numero_cifras, char cifrado[]) {
  203.  
  204.  
  205. char auxiliar[numero_cifras];
  206. int x, y=0, z;
  207.  
  208. for(x=0; x<strlen(cifrado); x++) {
  209.  
  210. auxiliar[y]=cifrado[x];
  211. y++;
  212.  
  213.  
  214. if(y==numero_cifras) {
  215.  
  216. for(z=0; z<numero_de_letras; z++) {
  217.  
  218. if(suma(atof(auxiliar))==clave[z]) {
  219.  
  220. descifrado[strlen(descifrado)]=letras[z];
  221. y=0;
  222. break;
  223.  
  224. }
  225.  
  226. }
  227.  
  228. }
  229.  
  230. }
  231.  
  232. }
  233.  
  234.  

Pero ahora está en que el código no compila, el gcc me da el siguiente error:

Código:
pruebas: En la función `_fini':
(.fini+0x0): definiciones múltiples de `_fini'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib/crti.o:(.fini+0x0): primero se definió aquí
pruebas: En la función `data_start':
(.data+0x0): definiciones múltiples de `__data_start'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib/crt1.o:(.data+0x0): primero se definió aquí
pruebas: En la función `data_start':
(.data+0x8): definiciones múltiples de `__dso_handle'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/crtbegin.o:(.data+0x0): primero se definió aquí
pruebas:(.rodata+0x0): definiciones múltiples de `_IO_stdin_used'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib/crt1.o:(.rodata.cst4+0x0): primero se definió aquí
pruebas: En la función `_start':
(.text+0x0): definiciones múltiples de `_start'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib/crt1.o:(.text+0x0): primero se definió aquí
pruebas: En la función `_init':
(.init+0x0): definiciones múltiples de `_init'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib/crti.o:(.init+0x0): primero se definió aquí
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/crtend.o:(.tm_clone_table+0x0): definiciones múltiples de `__TMC_END__'
pruebas:(.data+0x30): primero se definió aquí
/usr/bin/ld: error en pruebas(.eh_frame); no se creará la tabla .eh_frame_hdr.
collect2: error: ld devolvió el estado de salida 1


No se que estoy haciendo mal la verdad, uso gcc en gnu/linux, exactamente en antergos, y para compilarlo hago un "gcc pruebas -o pruebas.c -lm". He probado a compilarlo con compiladores online para ver si es que era mi pc y no el código, y me da el error:

Código:
In function `arrancar_motor':
undefined reference to `pow'
undefined reference to `pow'

En cambio como puedes ver está incluida la librería math.h

¿ Me puedes echar un cable con este error ?, ¿ he implementado bien las corecciones que has descrito en el anterior comentario ?.

Saludos.
55  Programación / Programación C/C++ / Re: Perdido y desesperado con este código en: 22 Abril 2015, 10:56 am
1. Variables no inicializadas

Código
  1. if (comprobar_repetir_vector(num_random, clave)==1)

Código
  1. int comprobar_repetir_vector(int numero, int *vector )
  2. {
  3. int x;
  4. for(x=0; x<27;x++)
  5.  {
  6. if(numero==vector[x])
  7. return 1;
  8. }
  9. return 0;
  10. }
  11.  

Si te das cuenta, no estás dando a "clave" unos valores iniciales... simplemente le asignas un valor y después verificas que dicho valor no esté repetido. ¿Problemas? Varios:

  • "clave" tendrá inicialmente valores aleatorios. Si uno de estos valores coincide con el que intentas ingresar el algoritmo dará este nuevo valor como no válido.
  • No tiene sentido que para cada valor que intentas añadir a "clave" compruebes sus 27 posiciones... lo suyo sería comprobar desde 0 hasta N-1, siendo N el índice del número actual. De esta forma únicamente comparas el número actual con los ya insertados en el arreglo. Corrigiendo este punto podrías olvidarte del problema del punto anterior
  • No es buena idea tener el "27" a pelo en el código. ¿Qué sucede si luego tienes que crear una clave de 40 elementos? Te toca editar ese número en varias partes del código... es bastante recomendable tener estos valores en un #define para evitar errores

2. Cuidado con los decimales

Cuando trabajes con números decimales (float, double, ... ) tienes que tener muy en cuenta que NUNCA debes hacer una comparación directa, tipo "if( float == float )". ¿Por qué? Bueno, pues porque un número en coma flotante nunca va a ser 100% preciso. Los números en coma flotante tienen una serie de dígitos significativos, mientras que el resto pueden ser considerados "basura". Si tu fuerzas a una comparación exacta, esa basura va a hacer que la comparación sea bastante inestable. La forma de comparar si un número decimal es igual a otro pasa por asumir que dos números son iguales si el resto entre ellos es menor a X. Ejemplo:

Código
  1. int main( )
  2. {
  3.  // Un float nunca es preciso 100%.
  4.  // Esta inicialización intenta reflejar esta situación
  5.  float a = 5.0001, b;
  6.  for( b=1.0; b < 10.0; b+=1.0 )
  7.  {
  8.    if( a == b )
  9.    {
  10.      printf( "Bucle 1 OK!!!\n" );
  11.      break;
  12.    }
  13.  }
  14.  
  15.  for( b=1.0; b < 10.0; b+=1.0 )
  16.  {
  17.    if( fabs( a - b ) < 0.001 )
  18.    {
  19.      printf( "Bucle 2 OK!!!\n" );
  20.      break;
  21.    }
  22.  }
  23. }

¿Dónde realizas este tipo de comprobaciones? Por ejemplo en la función "suma", que se llama desde "arrancar_motor"... esa es, a
l menos, una de las razones por las que el có
digo "tarda mucho".

Un saludo

Gracias, muy buena explicación, en cuanto llegue a casa (estoy en el trabajo) lo implemento y os cuento que tal va.

Saludos.
56  Programación / Programación C/C++ / Perdido y desesperado con este código en: 21 Abril 2015, 22:34 pm
Hola de nuevo, como sabeis estoy escribiendo un motor de cifrado en C, pero no hay forma de hacerlo funcionar correctamente, os dejo el código:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #include <math.h>
  6.  
  7. // variables globales
  8.  
  9. double claves[27][1000];
  10. int clave[27];
  11.  
  12.  
  13. // arrays globales
  14. char letras[]="abcdefghijklmnopqrstuvwxyz ";
  15. char cifrado[999999999];
  16. char descifrado[999999999];
  17.  
  18. // prototipos de funciones
  19. void generar_clave(int);
  20. void ingresar_clave(int []);
  21. int comprobar_repetir_vector(int, int []);
  22. int comprobar_repetir_matriz(double, double [][1000]);
  23. void arrancar_motor(int, int);
  24. int suma(double);
  25. double aleatorio(int, int);
  26. void cifrar(int, int, char []);
  27. void descifrar(int, char []);
  28.  
  29. int main() {
  30.  
  31. srand(getpid());
  32. generar_clave(15);
  33. arrancar_motor(15, 1);
  34.  
  35.  
  36.  
  37. }
  38.  
  39.  
  40. // comprueba si un numero esta repetido en una matriz, si esta repetido devuelve 1, en caso contrario 0.
  41. int comprobar_repetir_matriz(double numero, double matriz[][1000]) {
  42.  
  43. int x;
  44. int y;
  45. for(x=0; x<27; x++) {
  46.  
  47. for(y=0;y<1000;y++) {
  48.  
  49. if (numero==matriz[x][y]) {
  50. return 1;
  51. }
  52. }
  53.  
  54. }
  55. return 0;
  56.  
  57. }
  58.  
  59. // comprueba si un numero esta repetido en un vector, si esta repetido devuelve 1, en caso contrario 0.
  60. int comprobar_repetir_vector(int numero, int vector[]){
  61.  
  62. int x;
  63. for(x=0; x<27;x++) {
  64.  
  65. if(numero==vector[x]) {
  66.  
  67. return 1;
  68.  
  69. }
  70. }
  71. return 0;
  72. }
  73.  
  74. // Devuelve la suma de las cifras de un numero
  75. int suma(double numero) {
  76.  
  77. int resultado=0;
  78. while (numero>0) {
  79.  
  80. resultado+=fmod(numero, 10);
  81. numero/=10;
  82. }
  83. return resultado;
  84. }
  85.  
  86. //Genera un numero aleatorio sin decimales dentro de un rango entre max y min.
  87. double aleatorio(int max, int min) {
  88.  
  89.  
  90. return rand() % max + min;
  91.  
  92.  
  93. }
  94. //Genera una clave optimidada y la guarda en la variable global clave.
  95. void generar_clave(int numero_suma) {
  96.  
  97.  
  98. int maximo, minimo, x, y, num_random;
  99.  
  100. int max=120;
  101. int min=60;
  102.  
  103. maximo=numero_suma*max/20;
  104. minimo=numero_suma*min/20;
  105.  
  106.  
  107. for(x=0;x<27;) {
  108. num_random=aleatorio(maximo, minimo);
  109. if (comprobar_repetir_vector(num_random, &clave[0])==1) {
  110. continue;
  111. }
  112. clave[x]=num_random;
  113. x++;
  114. }
  115.  
  116. printf("se ha generado la clave: \n");
  117. for(y=0;y<27;y++) {
  118.  
  119. printf("(%d)", clave[y]);
  120.  
  121. }
  122. printf("\n");
  123. }
  124.  
  125. // Permite ingresar el valor de cualquier array en la variable global clave.
  126. void ingresar_clave(int array[]) {
  127.  
  128. int x;
  129.  
  130. for(x=0;x<27;x++) {
  131.  
  132. clave[x]=array[x];
  133. }
  134.  
  135. }
  136. // Genera los numeros aleatorios correspondientes a cada letra y los guarda según corresponda en la matriz claves.
  137. void arrancar_motor(int numero_cifras, int cantidad_numeros){
  138.  
  139. srand(time(NULL));
  140. int y, z, h;
  141. double num_random;
  142.  
  143. double min=(double)pow(10, numero_cifras-1);
  144. double max=(double)pow(10, numero_cifras)-1;
  145.  
  146.  
  147.  
  148. for(z=0; z<27; z++) {
  149. printf("Inicializando letra %c\n", letras[z]);
  150. for(h=0; h<cantidad_numeros;) {
  151. num_random=aleatorio(max, min);
  152. if ((suma(num_random)==clave[z]) && (comprobar_repetir_matriz(num_random, claves))==0) {
  153.  
  154. claves[z][h]=num_random;
  155. printf("%.0lf\n", num_random);
  156. h++;
  157.  
  158.  
  159.  
  160. } else { continue;  }
  161.  
  162.  
  163. }
  164. }
  165. printf("se ha generado la clave: \n");
  166. for(y=0;y<27;y++) {
  167.  
  168. printf("(%d)", clave[y]);
  169.  
  170. }
  171. printf("\ncon un numero de cifras de %d\n", numero_cifras);
  172.  
  173. printf("minimo: %lf:", min);
  174. printf("maximo: %lf:", max);
  175. }
  176.  
  177. // Cifra un texto usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global cifrado.
  178. void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {
  179.  
  180.  
  181. int letra, letrass, x;
  182. char cifrado_inside[strlen(texto)*numero_cifras];
  183. char string_auxiliar[numero_cifras-1];
  184. for(letra=0; strlen(texto)>letra; letra++) {
  185.  
  186.  
  187. for(letrass=0; letrass<27; letrass++) {
  188.  
  189. if (texto[letra]==letras[letrass]) {
  190. sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
  191. strcat(cifrado_inside, string_auxiliar);
  192. break;
  193. }
  194.  
  195. }
  196.  
  197. }
  198. strcpy(cifrado, cifrado_inside);
  199.  
  200. }
  201.  
  202. // Descifra un texto cifrado anteriormente usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global descifrado.
  203. void descifrar(int numero_cifras, char cifrado[]) {
  204.  
  205.  
  206. char auxiliar[numero_cifras];
  207. int x, y=0, z;
  208.  
  209. for(x=0; x<strlen(cifrado); x++) {
  210.  
  211. auxiliar[y]=cifrado[x];
  212. y++;
  213.  
  214.  
  215. if(y==numero_cifras) {
  216.  
  217. for(z=0; z<27; z++) {
  218.  
  219. if(suma(atof(auxiliar))==clave[z]) {
  220.  
  221. descifrado[strlen(descifrado)]=letras[z];
  222. y=0;
  223. break;
  224.  
  225.  
  226. }
  227.  
  228.  
  229. }
  230.  
  231.  
  232. }
  233.  
  234.  
  235.  
  236.  
  237.  
  238. }
  239.  
  240.  
  241.  
  242. }
  243.  
  244.  

La funcion aleatorio devuelve un numero aleatorio dentro de un rango, la función generar_clave genera una clave optimizada y la función arrancar_motor genera x numeros de x cifras cuyas cifras sumen x numero y lo guarda en un array para posteriormente cifrar o descifrar con esos numeros, pero se me ha atascado la funcion arrancar_motor, no funciona lo rapido que esperaba, ahora hasta se queda en "inicializando letra a" y de ahí no sale.

Gracias de antemano.

Saludos.
57  Programación / Programación C/C++ / Re: Problema con rand y srand en este codigo en: 21 Abril 2015, 22:02 pm
Gracias por vuestras respuestas, me han servido de mucho.

Saludos.
58  Programación / Programación C/C++ / Re: Problema con rand y srand en este codigo en: 21 Abril 2015, 21:16 pm
Ponlo sólo una vez y en el main.

Código
  1.  
  2. int main(){
  3.  
  4. srand(time(NULL));
  5.  
  6. return 0;
  7. }
  8.  
  9.  

Cuando lo tenía así funcionaba perfectamente el problema es que como es un .h, una librería (o biblioteca), no tiene funcion main... ¿ Donde lo pongo entonces ?

Saludos.
59  Programación / Programación C/C++ / Problema con rand y srand en este codigo en: 21 Abril 2015, 17:55 pm
Estoy haciendo un pequeño motor de cifrado y tengo un problema con la función rand, y es que genera siempre el mismo numero, un numero negativo además, dejo aqui el código:

Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <math.h>

// variables globales

double claves[27][1000];
int clave[27];


// arrays globales
char letras[]="abcdefghijklmnopqrstuvwxyz ";
char cifrado[999999999];
char descifrado[999999999];

// prototipos de funciones
void generar_clave(int);
void ingresar_clave(int []);
int comprobar_repetir_vector(int, int []);
int comprobar_repetir_matriz(double, double [][1000]);
void arrancar_motor(int, int);
int suma(double);
double aleatorio(int, int);
void cifrar(int, int, char []);
void descifrar(int, char []);


// comprueba si un numero esta repetido en una matriz, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_matriz(double numero, double matriz[][1000]) {

int x;
int y;
for(x=0; x<27; x++) {

for(y=0;y<1000;y++) {

if (numero==matriz[x][y]) {
return 1;
}
}

}
return 0;

}

// comprueba si un numero esta repetido en un vector, si esta repetido devuelve 1, en caso contrario 0.
int comprobar_repetir_vector(int numero, int vector[]){

int x;
for(x=0; x<27;x++) {

if(numero==vector[x]) {

return 1;

}
}
return 0;
}

// Devuelve la suma de las cifras de un numero
int suma(double numero) {

int resultado=0;
while (numero>0) {

resultado+=fmod(numero, 10);
numero/=10;
}
return resultado;
}

//Genera un numero aleatorio sin decimales dentro de un rango entre max y min.
double aleatorio(int max, int min) {


return rand () % (max-min+1) + min;


}
//Genera una clave optimidada y la guarda en la variable global clave.
void generar_clave(int numero_suma) {


int maximo, minimo, x, y, num_random;

int max=120;
int min=60;

maximo=numero_suma*max/20;
minimo=numero_suma*min/20;


for(x=0;x<27;) {
num_random=aleatorio(maximo, minimo);
if (comprobar_repetir_vector(num_random, &clave[0])==1) {
continue;
}
clave[x]=num_random;
x++;
}

printf("se ha generado la clave: \n");
for(y=0;y<27;y++) {

printf("(%d)", clave[y]);

}
printf("\n");
}

// Permite ingresar el valor de cualquier array en la variable global clave.
void ingresar_clave(int array[]) {

int x;

for(x=0;x<27;x++) {

clave[x]=array[x];
}

}
// Genera los numeros aleatorios correspondientes a cada letra y los guarda según corresponda en la matriz claves.
void arrancar_motor(int numero_cifras, int cantidad_numeros){

srand(time(NULL));

int y, z, h;
double num_random;

double min=(double)pow(10.0, numero_cifras-1);
double max=(double)pow(10.0, numero_cifras)-1;

for(z=0; z<27; z++) {
printf("Inicializando letra %c\n", letras[z]);
for(h=0; h<cantidad_numeros;) {
num_random=aleatorio(max, min);
printf("%lf", num_random);
if ((suma(num_random)==clave[z]) && (comprobar_repetir_matriz(num_random, claves))==0) {

claves[z][h]=num_random;
printf("%.0lf\n", num_random);
h++;



} else { continue;  }


}
}
printf("se ha generado la clave: \n");
for(y=0;y<27;y++) {

printf("(%d)", clave[y]);

}
printf("\ncon un numero de cifras de %d\n", numero_cifras);
}

// Cifra un texto usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global cifrado.
void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {


int letra, letrass, x;
char cifrado_inside[strlen(texto)*numero_cifras];
char string_auxiliar[numero_cifras-1];
for(letra=0; strlen(texto)>letra; letra++) {


for(letrass=0; letrass<27; letrass++) {

if (texto[letra]==letras[letrass]) {
sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
strcat(cifrado_inside, string_auxiliar);
break;
}

}

}
strcpy(cifrado, cifrado_inside);

}

// Descifra un texto cifrado anteriormente usando la clave almancenada en la variable global clave, el resultado lo guarda en la variable global descifrado.
void descifrar(int numero_cifras, char cifrado[]) {


char auxiliar[numero_cifras];
int x, y=0, z;

for(x=0; x<strlen(cifrado); x++) {

auxiliar[y]=cifrado[x];
y++;


if(y==numero_cifras) {

for(z=0; z<27; z++) {

if(suma(atof(auxiliar))==clave[z]) {

descifrado[strlen(descifrado)]=letras[z];
y=0;
break;


}


}


}





}



}



En la función arrancar_motor hago un srand(time(NULL)) es decir inicializo rand pero no se por que me genera siempre el mismo numero, pero no en ejecuciones distintas, si no cada vez que en el for de arrancar motor llamo a la funcion aleatorio que usa rand para obtener un numero aleatorio me da el mismo numero, por ende la función arrancar motor se queda congelada desde el primer intento de generar un número bajo las condiciones que quiero.

Gracias de antemano.

Saludos.
Páginas: 1 2 3 4 5 [6]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines