Programming
T03-001-03 Modificación de requisitos de una aplicación.
Enunciado
Una de las ventajas más importantes de la descomposición funcional es la de adaptarse a nuevos requisitos.
El código que se muestra a continuación solicita DNI o NIE y nos indica si la letra final que contiene es válida o no es válida.
package validadni;
import java.util.Scanner;
public class ValidaDNI {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
String dni_nie, tipo, dni;
long numero;
char letra;
while (!(dni_nie = leeDniNie()).equals("0")) {
if (esNIE(dni_nie)) {
dni = convierteNIE(dni_nie);
tipo = "NIE";
} else {
dni = dni_nie;
tipo = "DNI";
}
if (esValido(dni)) {
escribeMensajeValido(tipo);
} else {
escribeMensajeNoValido(tipo);
}
}
}
static String leeDniNie() {
return (sc.nextLine()).toUpperCase();
}
static boolean esNIE(String dni_nie) {
char primera;
boolean esNieBoolean = false;
primera = dni_nie.charAt(0);
if (primera == 'X' || primera == 'Y' || primera == 'Z') {
esNieBoolean = true;
}
return esNieBoolean;
}
static String convierteNIE(String dni_nie) {
String numeroLetra;
char letraNIE = dni_nie.charAt(0);
switch (letraNIE) {
case 'X':
numeroLetra = "0";
break;
case 'Y':
numeroLetra = "1";
break;
case 'Z':
numeroLetra = "2";
break;
default:
numeroLetra = "9999";
}
return numeroLetra + dni_nie.substring(1);
}
static long getNumero(String dni) {
return Integer.parseInt(dni.substring(0, dni.length() - 1));
}
static char getLetra(String dni) {
return dni.charAt(dni.length() - 1);
}
static boolean esValido(String dni) {
char letraControl;
long numero = getNumero(dni);
char letra = getLetra(dni);
boolean valido = false;
if (numero <= 99999999) {
int resto = (int) numero % 23;
String letras = "TRWAGMYFPDXBNJZSQVHLCKE";
letraControl = letras.charAt(resto);
valido = (letra == letraControl);
}
return valido;
}
static void escribeMensajeValido(String tipo) {
System.out.println(tipo + " Validado");
}
static void escribeMensajeNoValido(String tipo) {
System.out.println(tipo + " No validado");
}
}Atención
Fíjate en la declaración y en la posición del objeto Scanner.
static Scanner sc = new Scanner(System.in);Con esa instanciación del objeto Scanner, podemos usar
scen cualquier método de la clase.Ejercicio
Nos piden modificar la aplicación para que, en lugar de que la letra final la facilite el usuario, será el programa el que la asocie al final del número que escribe el usuario.
Crea la función letraDNI que recibe un String con un NIE o DNI, los cuales no incluyen la letra final y devuelve la letra que le corresponde a ese número.
De momento, la función mostrará, en el OUTPUT, el DNI o NIE completo.
Además deberás invocar a dicha función en el lugar apropiado para que siempre indique que el DNI o NIE es válido.
Si necesitas transformar el String que contiene el DNI en su valor numérico puedes utilizar
Integer.parseInt(dni).
Solución
package validadni;
import java.util.Scanner;
public class ValidaDNI {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
String dni_nie, tipo, dni;
long numero;
char letra;
while (!(dni_nie = leeDniNie()).equals("0")) {
if (esNIE(dni_nie)) {
dni = convierteNIE(dni_nie);
tipo = "NIE";
} else {
dni = dni_nie;
tipo = "DNI";
}
dni = dni + letraControl(dni);
if (esValido(dni)) {
escribeMensajeValido(tipo);
} else {
escribeMensajeNoValido(tipo);
}
}
}
static String leeDniNie() {
return (sc.nextLine()).toUpperCase();
}
static boolean esNIE(String dni_nie) {
char primera;
boolean esNieBoolean = false;
primera = dni_nie.charAt(0);
if (primera == 'X' || primera == 'Y' || primera == 'Z') {
esNieBoolean = true;
}
return esNieBoolean;
}
static String convierteNIE(String dni_nie) {
String numeroLetra;
char letraNIE = dni_nie.charAt(0);
switch (letraNIE) {
case 'X':
numeroLetra = "0";
break;
case 'Y':
numeroLetra = "1";
break;
case 'Z':
numeroLetra = "2";
break;
default:
numeroLetra = "9999";
}
return numeroLetra + dni_nie.substring(1);
}
static long getNumero(String dni) {
return Integer.parseInt(dni.substring(0, dni.length() - 1));
}
static char getLetra(String dni) {
return dni.charAt(dni.length() - 1);
}
static char letraControl(String dni) {
char letraControl = '*';
long numero = Integer.parseInt(dni);
if (numero <= 99999999) {
int resto = (int) numero % 23;
String letras = "TRWAGMYFPDXBNJZSQVHLCKE";
letraControl = letras.charAt(resto);
}
System.out.println(dni + letraControl);
return letraControl;
}
static boolean esValido(String dni) {
char letraControl;
long numero = getNumero(dni);
char letra = getLetra(dni);
boolean valido = false;
if (numero <= 99999999) {
int resto = (int) numero % 23;
String letras = "TRWAGMYFPDXBNJZSQVHLCKE";
letraControl = letras.charAt(resto);
valido = (letra == letraControl);
}
return valido;
}
static void escribeMensajeValido(String tipo) {
System.out.println(tipo + " Validado");
}
static void escribeMensajeNoValido(String tipo) {
System.out.println(tipo + " No validado");
}
}
Input
Y2345678 12345678 X2345678 23456789 0
Y2345678 X2345678 23456789 12345678 0
Output
12345678Z NIE Validado 12345678Z DNI Validado 02345678T NIE Validado 23456789D DNI Validado
12345678Z NIE Validado 02345678T NIE Validado 23456789D DNI Validado 12345678Z DNI Validado

