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