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

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Congruencias DNI
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Congruencias DNI  (Leído 1,696 veces)
Abenthy

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Congruencias DNI
« 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


« Última modificación: 28 Diciembre 2016, 17:57 pm por engel lex » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Congruencias DNI
« Respuesta #1 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


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Abenthy

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Congruencias DNI
« Respuesta #2 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
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Congruencias DNI
« Respuesta #3 en: 28 Diciembre 2016, 23:36 pm »

matrix es tipo char * en char '1' es representado por el numero 49



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

En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Congruencias DNI
« Respuesta #4 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines