lunes, 12 de septiembre de 2016

Código Java que verifica un Dni sea correcto (Un patrón establecido y que la letra sea la correcta).

Anteriormente habíamos creado un programa para obtener la letra de un Dni introduciendo su número y también habíamos creado un programa que establecía un patrón de un Dni para que se cumpliera. Esta vez os dejo el código de un programa que va a realizar todas estas tareas. El programa pedirá la introducción por teclado de un Dni y comprobará que cumple con un patrón establecido y, si es así, luego comprobará que la letra introducida es la letra que le corresponde a ese número de Dni.
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

Related Posts Plugin for WordPress, Blogger...