Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Abenthy en 28 Diciembre 2016, 17:56 pm



Título: Congruencias DNI
Publicado por: Abenthy en 28 Diciembre 2016, 17:56 pm
Buenas tardes
Estoy haciendo un programa para calcular la letra del DNI y el NIF utilizando las congruencias módulo 23. He intentado hacerlo de esta forma:
Código
  1. #include<stdio.h>
  2.  
  3. int main(){
  4.  
  5. int N,i,j,cont,R;
  6. char matrix[200],letras[200];
  7. printf("Bienvenido a este programa, que calcula la letra correspondiente a un NIE o DNI determinado\n");
  8. printf("Cuantos documentos quieres comprobar?\n");
  9. scanf("%d",&N);
  10.  
  11. if(N>200) {
  12. printf("\nExceso de documentos permitidos");
  13. return 0;}
  14. cont=1;
  15. for(i=0;(i<N);i++){
  16.  
  17. printf("\nIntroduce el documento numero %d\n",cont);
  18. cont++;
  19. scanf("%s",&matrix[i]);
  20.  
  21. }
  22.  
  23. printf("Estos son los documentos que has introducido:\n");
  24.  
  25. for(i=0;(i<N);i++){
  26. printf("%s \n",&matrix[i]);
  27. }
  28.  
  29.  
  30. for(j=0;(j<N);j++){
  31.  
  32. R=matrix[j]%23;
  33.  
  34. switch (R){
  35.  
  36. case 0:
  37. letras[j]='T';
  38.  
  39. case 1:
  40. letras[j]='R';
  41. break;
  42. case 2:
  43. letras[j]='W';
  44. break;
  45. case 3:
  46. letras[j]='A';
  47. break;
  48. case 4:
  49. letras[j]='G';
  50. break;
  51. case 5:
  52. letras[j]='M';
  53. break;
  54. case 6:
  55. letras[j]='Y';
  56. break;
  57. case 7:
  58. letras[j]='F';
  59. break;
  60. case 8:
  61. letras[j]='P';
  62. break;
  63. case 9:
  64. letras[j]='D';
  65. break;
  66. case 10:
  67. letras[j]='X';
  68. break;
  69. case 11:
  70. letras[j]='B';
  71. break;
  72. case 12:
  73. letras[j]='N';
  74. break;
  75. case 13:
  76. letras[j]='J';
  77. break;
  78. case 14:
  79. letras[j]='Z';
  80. break;
  81. case 15:
  82. letras[j]='S';
  83. break;
  84. case 16:
  85. letras[j]='Q';
  86. break;
  87. case 17:
  88. letras[j]='V';
  89. break;
  90. case 18:
  91. letras[j]='H';
  92. break;
  93. case 19:
  94. letras[j]='L';
  95. break;
  96. case 20:
  97. letras[j]='C';
  98. break;
  99. case 21:
  100. letras[j]='K';
  101. break;
  102. case 22:
  103. letras[j]='E';
  104. break;
  105. }
  106.  
  107.  
  108. }
  109. printf("\n Las letras correspondientes a los documentos introducidos son:\n");
  110. for(i=0;(i<N);i++){
  111. printf("%s",&letras[i]);
  112. }
  113.  
  114.  
  115. return 0;
  116.  
  117. }

Compila correctamente pero a la hora de realizar la operación del resto módulo 23 no se porque no lo realiza correctamente. ¿Alguna idea de que falla?



Mod: Los códigos deben ir en etiquetas GeSHi


Título: Re: Congruencias DNI
Publicado por: engel lex en 28 Diciembre 2016, 18:00 pm
no se como se calcula ni que trata de hacer el codigo... pero sospecho que crees que el char de  '0' representa el numero 0, cosa que no es así al igual que el resto de los numeros...


Código
  1. printf("\nIntroduce el documento numero %d\n",cont);
  2. cont++;
  3. scanf("%s",&matrix[i]);

sospecho que haciendolo como int debería hacer lo que quieres

por otro lado, case 0 no tiene break, por lo que continuará hasta case 1


Título: Re: Congruencias DNI
Publicado por: Abenthy en 28 Diciembre 2016, 23:20 pm
Muchas gracias Engel por tu respuesta. Ya he añadido el break que faltaba, sin embargo no acabo de entender que debería de cambiar a tipo int


Título: Re: Congruencias DNI
Publicado por: engel lex en 28 Diciembre 2016, 23:36 pm
matrix es tipo char * en char '1' es representado por el numero 49

(http://lacomputadora.org/wp-content/uploads/2015/03/codigo-ascii.jpg)

así que cuando tu rograma llega a un '1' en lugar de ser R=1, será R=3

Código:
1 % 23 = 1
49 % 23 = 3



Título: Re: Congruencias DNI
Publicado por: MAFUS en 28 Diciembre 2016, 23:44 pm
No solo ese, tienes muchos fallos.
Usas
Código:
char matrix[200]
para guardar cadenas de texto de los DNIs introducidos y esa declaración permite guardar una única cadena.

Usas
Código:
R=matrix[j]%23
para sacar el resto de la división pero matrix es una cadena, no un array de números.

Usas
Código:
printf("%s", &letras[i]);
para listar las letras introducidas, pero %s es para cadenas, no caracteres. Deberías usar en su lugar %c que imprime caracteres. A parte de que printf no necesita del operador & para acceder a las cadenas.

En vez de un switch/case tan largo podrías usar una notación de array sobre una cadena, tal que así:
Código:
letras[i] = "TRWAGMYFPDXBNJZSQVHLCKE"[matrix[i]%23];
si usaras matrix como un array de números.