Congruencias DNI

Iniciado por Abenthy, 28 Diciembre 2016, 17:56 PM

0 Miembros y 1 Visitante están viendo este tema.

Abenthy

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:
#include<stdio.h>

int main(){

int N,i,j,cont,R;
char matrix[200],letras[200];
printf("Bienvenido a este programa, que calcula la letra correspondiente a un NIE o DNI determinado\n");
printf("Cuantos documentos quieres comprobar?\n");
scanf("%d",&N);

if(N>200) {
printf("\nExceso de documentos permitidos");
return 0;}
cont=1;
for(i=0;(i<N);i++){

printf("\nIntroduce el documento numero %d\n",cont);
cont++;
scanf("%s",&matrix[i]);

}

printf("Estos son los documentos que has introducido:\n");

for(i=0;(i<N);i++){
printf("%s \n",&matrix[i]);
}


for(j=0;(j<N);j++){

R=matrix[j]%23;

switch (R){

case 0:
letras[j]='T';

case 1:
letras[j]='R';
break;
case 2:
letras[j]='W';
break;
case 3:
letras[j]='A';
break;
case 4:
letras[j]='G';
break;
case 5:
letras[j]='M';
break;
case 6:
letras[j]='Y';
break;
case 7:
letras[j]='F';
break;
case 8:
letras[j]='P';
break;
case 9:
letras[j]='D';
break;
case 10:
letras[j]='X';
break;
case 11:
letras[j]='B';
break;
case 12:
letras[j]='N';
break;
case 13:
letras[j]='J';
break;
case 14:
letras[j]='Z';
break;
case 15:
letras[j]='S';
break;
case 16:
letras[j]='Q';
break;
case 17:
letras[j]='V';
break;
case 18:
letras[j]='H';
break;
case 19:
letras[j]='L';
break;
case 20:
letras[j]='C';
break;
case 21:
letras[j]='K';
break;
case 22:
letras[j]='E';
break;
}


}
printf("\n Las letras correspondientes a los documentos introducidos son:\n");
for(i=0;(i<N);i++){
printf("%s",&letras[i]);
}


return 0;

}


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

engel lex

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...


printf("\nIntroduce el documento numero %d\n",cont);
cont++;
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
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

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

engel lex

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

1 % 23 = 1
49 % 23 = 3


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

No solo ese, tienes muchos fallos.
Usas char matrix[200] para guardar cadenas de texto de los DNIs introducidos y esa declaración permite guardar una única cadena.

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

Usas 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í:
letras[i] = "TRWAGMYFPDXBNJZSQVHLCKE"[matrix[i]%23]; si usaras matrix como un array de números.