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)


  Mostrar Mensajes
Páginas: 1 2 3 4 [5] 6
41  Programación / Programación C/C++ / Re: Duda con "DO WHILE" y "WHILE" en: 2 Junio 2015, 18:29 pm
Creo que estás usando el while como si fuese un condicional y no como un bucle, me parece muy mala práctica.
42  Programación / Programación C/C++ / problema con funcion que ordena array de tipo int en: 2 Junio 2015, 17:16 pm
Hola a tod@s, me propuse escribir un programa que ordenara un array en otro array, he intentado ya de todo pero me sigue dando el mismo fallo, en vez de ordenar el array correctamente me genera un "222222222".

El código fuente es este:

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. void ordenar_array(int [], int []);
  5. int comprobar_repetir_vector(int, int []);
  6.  
  7. int main() {
  8.  
  9.  int num_array[]={5, 8, 7, 3, 1, 6, 2, 4, 9};
  10.  int num_result[9];
  11.  ordenar_array(num_array, num_result);
  12.  
  13.  for(int x=0; x<9; x++) {
  14.  
  15.    printf("%d", num_result[x]);
  16.  
  17.  }
  18.  
  19. }
  20.  
  21. void ordenar_array(int num_array[], int num_result[]) {
  22.  
  23. int aux=num_array[0];
  24. int len=sizeof(num_array);
  25.  
  26.  for(int x=0;len+1>x;x++) {
  27.  
  28.    for(int y=0;len+1>y;y++) {
  29.  
  30.      if (num_array[y]<aux && comprobar_repetir_vector(num_array[y], num_result)==0) {
  31.  
  32.  
  33.        aux=num_array[y];
  34.  
  35.      }
  36.  
  37.    }
  38.  
  39.  num_result[x]=aux;
  40.  
  41.  }
  42.  
  43. }
  44.  
  45. int comprobar_repetir_vector(int numero, int vector[]){
  46.  
  47. int x;
  48. int len=sizeof(vector);
  49. for(x=0; x<len+1;x++) {
  50.  
  51. if(numero==vector[x]) {
  52.  
  53. return 1;
  54.  
  55. }
  56. }
  57. return 0;
  58. }
  59.  

Gracias de antemano.

Saludos.
43  Programación / Programación C/C++ / Re: Error en programa generar clave aleatoria en: 22 Mayo 2015, 10:05 am
Si, que ya estaba solucionado, pero sin darme cuenta he generado una cita en blanco.

Saludos.
44  Programación / Programación C/C++ / Re: Error en programa generar clave aleatoria en: 20 Mayo 2015, 23:10 pm
el codigo tiene una lista de errores...

1-
Código
  1. char aleatorio[cifras+1];

debe ser 1 más de largo para que puedas colocarle el caracter de terminación

2-
aquí es raro que no te diera error... estás accediendo a una posición invalida
Código
  1. aleatorio[cifras+1]='\0';


debe ser
Código
  1. aleatorio[cifras]='\0';

Gracias, solucionado.

ya que el ciclo es x menor que cifras (nunca llega a cifras)

3-
lo tipico  con la linea 21 y el switch es que
Código
  1. int eleccion=(int)(rand() % 3)

y que el switch empieze en 0... sin embargo el metodo funciona, ya que se evalua primero el "%" y luego "+"

pero en 25, 28 y 31 tienes un error...
los array son de 26 y 10 de largo..

cuando haces
Código
  1. aleatorio[x]=num[rand() % 9+1];

se toma un numero entre 0 y 8, luego le sumas 1... así que "a", "A" y "0" nunca se darán


45  Programación / Programación C/C++ / Re: Error en programa generar clave aleatoria en: 20 Mayo 2015, 22:48 pm
Gracias por tu respuesta, pero ya lo he corregido y sigue dando el mismo fallo.
46  Programación / Programación C/C++ / Error en programa generar clave aleatoria en: 20 Mayo 2015, 22:04 pm
Hola a tod@s, acabo de escribir un simple código en C que te pregunta con un scanf de cuantos caracteres quieres la clave y te genera una clave aleatoria con mayusculas minusculas y números aleatorios, cuando uso un numero de caracteres alto como 25 todo va bien, pero cuando uso uno pequeño, como 5, obtengo lo siguiente:

x81Zw@

Es decir, esa arroba de más no se por que me aparece, dejo aquí el código:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. void main() {
  6.  
  7. srand(time(NULL));
  8.  
  9. int cifras, x;
  10. char min[]="abcdefghijklmnopqrstuvwxyz";
  11. char may[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  12. char num[]="0123456789";
  13.  
  14. printf("Escribe el número de cifras del string a crear...");
  15. scanf("%d", &cifras);
  16. printf("\n");
  17.  
  18. char aleatorio[cifras];
  19.  
  20. for(x; x<cifras; x++) {
  21. int eleccion=(int)(rand() % 3+1);
  22.  
  23. switch ( eleccion ) {
  24. case 1:
  25. aleatorio[x]=min[rand() % 25+1];
  26. break;
  27. case 2:
  28. aleatorio[x]=may[rand() % 25+1];
  29. break;
  30. case 3:
  31. aleatorio[x]=num[rand() % 9+1];
  32. break;
  33. default:
  34. continue;
  35. }
  36.  
  37. aleatorio[cifras+1]='\0';
  38. }
  39. printf("%s\n", aleatorio);
  40. }
  41.  

Saludos.
47  Programación / Programación C/C++ / Re: ¿Donde está el error? en: 27 Abril 2015, 21:00 pm
Te faltan las llaves que engloba lo que está  dentro de los condicionales, no me explico como compila, te dejo el código corregido:

Código
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int user=1024;
  5. int pass=4567;
  6. int useru,passu;
  7.  
  8. printf("Introduce tu nombre de usuario. \n");
  9. scanf("%d",&useru);
  10. do
  11. {
  12. if (useru!=user)
  13.                        {
  14. printf("Prueba de nuevo. \n");
  15. scanf("%d",&useru);
  16.                        }
  17. }
  18. while (useru!=user);
  19.  
  20. printf("Escribe tu contraseña. \n");
  21. scanf("%d",&passu);
  22. do
  23. {
  24. if (passu!=pass)
  25.                      {
  26. printf("Vuelve a intentarlo. \n");
  27. scanf("%d",&passu);
  28.                      }
  29. }
  30. while (passu!=pass);
  31.  
  32. printf("Accediendo al sistema... \n");
  33. return 0;
  34. }
  35.  

PD: Estas llaves SOLO no son necesarias cuando el contenido del if es únicamente UNA instrucción, en el resto de casos como este si son obligatorias.
48  Programación / Programación C/C++ / Vuelta a la desesperación con este código. en: 27 Abril 2015, 19:25 pm
Hola a tod@s, llevo toda la tarde dandole vueltas a por que no descifra mi código y es que ahora ni siquiera arranca por que genera los mismos numeros aleatorios para "generar_clave" por lo que se queda atascado en la función "comprobar_repetir_vector", por favor ayudadme llevo toda la tarde con este código y cada vez que toco algo arreglo una cosa y destrozo tres, estoy empezando en C, estaba acostumbrado a python y muchas cosas que antes no conocía ahora tengo que tenerlas en cuenta y me lio en mi propio código, bueno os dejo el codigo de lo que llevo:

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

Gracias de antemano.

Saludos.
49  Programación / Programación C/C++ / Ultima duda de snakecode (violación de segmento) en: 24 Abril 2015, 19:35 pm
Hola a todos, ya casi he conseguido crear snakecode (aunque arranca bastante lenta la funcion arrancar_motor), solo me falta conseguir que cifre y descifre, he creado las funciones pero algo estoy haciendo mal por que no funcionan bien, dejo el código que llevo:

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

Me da violación de segmento la función cifrar.

Para que veais mas o menos lo que debe de hacer os dejo el mismo algoritmo en python, lo escribí hace tiempo y funciona perfecto, es mas hasta arranca más rapido, lo estoy portando a C por cuestiones didácticas mas que nada:

Código
  1. # -*- encoding: utf-8 -*-
  2.  
  3. #snakecode is free software: you can redistribute it and/or modify
  4.   # it under the terms of the GNU General Public License as published by
  5.    #the Free Software Foundation, either version 3 of the License, or
  6.    #(at your option) any later version.
  7.  
  8.    #SnakeCode is distributed in the hope that it will be useful,
  9.    #but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    #GNU General Public License for more details.
  12.    #
  13.    #You should have received a copy of the GNU General Public License
  14.   # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  15.  
  16.  
  17. #constantes
  18.  
  19. maxr=120
  20. minr=60
  21.  
  22. import random
  23.  
  24. #Devuelve la suma de las cifras de un numero
  25.  
  26. def suma(numero):
  27.  
  28. resultado=0
  29. while numero>0:
  30. resultado+=numero%10
  31. numero/=10
  32. return resultado
  33.  
  34. #Genera una lista con Z numeros aleatorios de X cifras, cuyas cifras sumen Y cantidad
  35.  
  36. def generador_aleatorio(numero_de_suma, numero_de_cifras, cantidad_de_numeros):
  37. max=""
  38. min="1"
  39. lista_numeros=[]
  40.  
  41. for x in range(0, numero_de_cifras):
  42. max+="9"
  43. for x in range(1, numero_de_cifras):
  44. min+="0"
  45.  
  46. while cantidad_de_numeros>0:
  47. var=random.randint(int(min), int(max))
  48. if suma(var)==numero_de_suma and lista_numeros.count(var)==0:
  49. cantidad_de_numeros-=1
  50. lista_numeros.append(var)
  51. print var
  52. return lista_numeros
  53.  
  54. # Genera una clave optimizada automáticamente devolviendo una lista, esa lista puede ser utilizada posteriormente al inicializar el motor con init
  55.  
  56. def generar_clave(nc):
  57.  
  58. maximo=nc*maxr/20
  59. minimo=nc*minr/20
  60.  
  61. pass_random=[]
  62.  
  63. while len(pass_random)<28:
  64.  
  65. var=random.randrange(minimo, maximo)
  66. if pass_random.count(var)==0:
  67. pass_random.append(var)
  68.  
  69. return pass_random
  70.  
  71. # Inicializa el motor, el primer parámetro es el numero de cifras y el segundo es la lista que contiene la clave, ambos parametros imprescindibles para cifrar y descifrar con exito, el tercer parámetro, que es opcional, es la cantidad de numeros por letra generados.
  72.  
  73. def init(nc, lista, nn=20):
  74.  
  75. global claves
  76. global letras
  77. global numero_cifras
  78. numero_cifras=nc
  79.  
  80. claves={}
  81. letras=( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "ñ", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", " ")
  82. for y in range(0, 28):
  83. print "inicializando letra ", letras[y]
  84. claves[letras[y]]=generador_aleatorio(int(lista[y]), nc, nn)
  85.  
  86. print "se ha generado la clave", lista, "con un numero de cifras de", nc
  87.  
  88.  
  89. #Devuelve un texto cifrado pasandole un texto en claro
  90.  
  91. def cifrar(texto):
  92.  
  93. cifrado=""
  94. for x in texto:
  95.  
  96. cifrado+=str(random.choice(claves[x]))
  97.  
  98. return cifrado
  99.  
  100. #Devuelve un texto en claro pasandole un texto cifrado
  101.  
  102. def descifrar(cifrado):
  103.  
  104. separado=[]
  105. for x in range(0, len(cifrado), numero_cifras):
  106.  
  107. separado.append(cifrado[x:x+numero_cifras])
  108.  
  109. texto=""
  110.  
  111. for x in separado:
  112. for y in claves:
  113.  
  114. if suma(int(x))==suma(int(claves[y][0])):
  115.  
  116. texto+=y
  117.  
  118. return texto
  119.  
  120.  
  121.  

Gracias de antemano.

Saludos.



Seré mas específico, la función que da violación de segmento esta:

Código
  1. void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {
  2.  
  3.  
  4. int letra, letrass, x;
  5. char cifrado_inside[strlen(texto)*numero_cifras];
  6. char string_auxiliar[numero_cifras-1];
  7. for(letra=0; strlen(texto)>letra; letra++) {
  8.  
  9.  
  10. for(letrass=0; letrass<numero_de_letras; letrass++) {
  11.  
  12. if (texto[letra]==letras[letrass]) {
  13.  
  14. sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
  15. strcat(cifrado_inside, string_auxiliar);
  16. break;
  17. }
  18.  
  19. }
  20.  
  21. }
  22. strcpy(cifrado, cifrado_inside);
  23.  
  24. }
  25.  



He logrado solucionarlo, pero ahora no cifra bien por que sale un caracter raro al principio de lo que está cifrado, es decir algo así:

Código:
 @5206852228998504

El código que llevo ahora es este:

Código
  1. void cifrar(int numero_cifras, int cantidad_numeros, char texto[]) {
  2.  
  3.  
  4. int letra, letrass, x;
  5. char cifrado_inside[strlen(texto)*numero_cifras];
  6. char string_auxiliar[numero_cifras+1];
  7. for(letra=0; strlen(texto)>letra; letra++) {
  8.  
  9.  
  10. for(letrass=0; letrass<numero_de_letras; letrass++) {
  11.  
  12. if (texto[letra]==letras[letrass]) {
  13.  
  14. sprintf(string_auxiliar, "%.0lf", claves[letrass][(int)(aleatorio(cantidad_numeros-1, 0))]);
  15. strcat(cifrado_inside, string_auxiliar);
  16. break;
  17. }
  18.  
  19. }
  20.  
  21. }
  22. strcpy(cifrado, cifrado_inside);
  23.  
  24. }

Ayudadme por favor.

Saludos.



Ya lo he resuelto, gracias de todas formas.
50  Programación / Programación C/C++ / Re: Funcion genera numeros aleatorios de x cifras ayuda en: 24 Abril 2015, 19:00 pm
strcat

char * strcat ( char * destination, const char * source );

Concatenate strings
Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.

Puedes poner esto antes del for:
Código
  1. num[0] = 0;

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