El código, como siempre hago, va comentado explicando las partes del código, pero si alguno no entiende algo puede dejar un comentario.
Veamos el código:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DniCompleto {
/*
Creamos 3 variables, dniIntroducido que almacena el dni que introduzcamos en
un String, luego en un entero guardamos sólo el número del Dni, no la letra
y por último un char letIntro que almacenará la letra.
*/
private String dniIntroducido;
private int dni;
private char letIntro;
/*
Método getLetraIntroducida lo que hace es separar la letra del número del dni
introducido. También convierte en mayúscula la letra
*/
void getLetraIntroducida(){
letIntro = Character.toUpperCase(dniIntroducido.charAt(dniIntroducido.length()-1));
}
/*
Se establece el patrón del Dni, en este caso tiene que contener 7 u 8 números
y una letra, ya sea mayúscula o minúscula. Luego si se cumple el patrón
devuelve true.
*/
public boolean patron () {
Pattern pat = Pattern.compile("[0-9]{7,8}[A-Za-z]");
Matcher mat = pat.matcher(dniIntroducido);
boolean cumplePatron = mat.matches();
return cumplePatron;
}
/*
Este método pasa el valor introducide por consola del dni a la variable
dniIntroducido
*/
void setDniIntroducido(String dniIntroducido) {
this.dniIntroducido = dniIntroducido;
}
/*
convierte a número el dni eliminando la letra.
*/
void setDniNumero(String dni) {
this.dni = Integer.parseInt(dniIntroducido.substring(0, dniIntroducido.length()-1));
}
String getDniIntroducido() {
return dniIntroducido;
}
char getLetIntro() {
return letIntro;
}
/*
En el método getLetraDni se crea la variable resto y la variable letra. Lo
que hace este método es dividir el dni (pasado a entero eliminando la letra)
entre 23 y el resto se guarda en la variable de tipo entero. Se hace uso de
un condicional switch para obtener la letra que le corresponde al Dni
*/
char getLetraDni() {
int resto;
resto = dni % 23;
char letra = 0;
switch(resto) {
case 0:
letra = 'T';
break;
case 1:
letra = 'R';
break;
case 2:
letra = 'W';
break;
case 3:
letra = 'A';
break;
case 4:
letra = 'G';
break;
case 5:
letra = 'M';
break;
case 6:
letra = 'Y';
break;
case 7:
letra = 'F';
break;
case 8:
letra = 'P';
break;
case 9:
letra = 'D';
break;
case 10:
letra = 'X';
break;
case 11:
letra = 'B';
break;
case 12:
letra = 'N';
break;
case 13:
letra = 'J';
break;
case 14:
letra = 'Z';
break;
case 15:
letra = 'S';
break;
case 16:
letra = 'Q';
break;
case 17:
letra = 'V';
break;
case 18:
letra = 'H';
break;
case 19:
letra = 'L';
break;
case 20:
letra = 'C';
break;
case 21:
letra = 'K';
break;
case 22:
letra = 'E';
break;
}
return letra;
}
}
/*
Se crea el programa para crear objetos de la clase DniCompleto
*/
class Programa {
public static void main(String[] args) {
Scanner miScanner = new Scanner(System.in);
DniCompleto unDni = new DniCompleto();
System.out.print("Introduzca un Dni válido: ");
//llamada al método para almacenar el Dni introducido
unDni.setDniIntroducido(miScanner.nextLine());
/*
bucle while que comprueba que el patrón se cumple.
*/
while(unDni.patron() == false) {
System.out.println("El Dni introducido no contiene "
+ "un patrón valido");
System.out.print("Introduzca un Dni válido: ");
unDni.setDniIntroducido(miScanner.nextLine());
}
/*
Las dos sentencias siguientes hacen una llamada al método getLetraIntroducida();
para obtener la letra que se ha introducido en el dni por consola y
el método setDniNumero(unDni.getDniIntroducido()); para obtener el dni
pero con la letra separada
*/
unDni.getLetraIntroducida();
unDni.setDniNumero(unDni.getDniIntroducido());
/*
Otro bucle while para comprobar que la letra introducida es la que le
corresponde a ese número de Dni.
*/
while(unDni.getLetIntro() != unDni.getLetraDni()) {
System.out.println("La letra introducida en el Dni "
+ "no coincide con la verdadera letra");
System.out.print("Introduzca un Dni válido: ");
unDni.setDniIntroducido(miScanner.nextLine());
unDni.getLetraIntroducida();
unDni.setDniNumero(unDni.getDniIntroducido());
}
System.out.println("Bien, el dni " + unDni.getDniIntroducido() +
" es un Dni válido");
}
}
No hay comentarios:
Publicar un comentario