Programming
Examen Primer Trimestre
Enunciado
Al igual que sucede con los DNI, para controlar que las referencias catastrales sean correctas, se incluye algún carácter de control. A diferencia del DNI, las referencias catastrales llevan 2 caracteres de control.
Para el cálculo de los caracteres de control de las referencias catastrales, se extraen 2 String:
- Los caracteres del 0 al 6, concatenados con los caracteres del 14 al 17
- Los caracteres del 7 al 13, concatenados con los caracteres del 14 al 17
Cada una de estas cadenas de caracteres sirve para calcular cada uno de los dos caracteres de control.
La obtención del caracter correspondiente a cada una de las cadenas se obtiene:
- extrayendo, uno a uno, los caracteres de la cadena.
- el valor inicial del caracter dependerá de si es numérico o alfabético:
- alfabético: 'A' = 1, 'B' = 2, 'C' = 3,...
- numérico: '0' = 0, '1' = 1, '2' = 2,...
ten en cuenta que te puede ser útil la aritmética de caracteres:
- 'C' - 'A' = 2
- '3' - '0' = 3
- el valor anteriormente obtenido debe ser multiplicado por el peso correspondiente a la posición en la que se encuentra.
Los pesos de cada posición son los siguientes:
13, 15, 12, 5, 4, 17, 9, 21, 3, 7, 1- el resultado obtenido de multiplicar el valor del carácter por el peso de su posición se debe sumar a los resultados anteriormente obtenidos.
- tras haber recorrido toda la cadena de caracteres y haber sumado todos los resultados obtenidos, se debe dividir la suma entre 23 y obtener su resto.
- el resto así obtenido, indicará la posición que ocupa el carácter de control en la siguiente cadena de caracteres:
"MQWERTYUIOPASDFGHJKLBZX"Si el enunciado no es del todo clarificador, os paso 2 enlaces en distintos lenguajes que resuelven esos caracteres de control:
- http://bloginformaticoinaki.blogspot.com/2016/05/validar-referencia-catastral.html
- https://github.com/juanato/referenciacatastral/blob/master/valida-refcastv104.py
Nota: No se deben utilizar arrays.
Solución
package ayudaspalma;
import java.util.Scanner;
public class AyudasPalma {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
int tipoAyuda;
long cuantiaTotal = 0, cuantiaSolicitada;
do {
mostrarMenu();
tipoAyuda = sc.nextInt();
if(tipoAyuda >= 1 && tipoAyuda <= 3) {
System.out.println("Cantidad solicitada: ");
cuantiaSolicitada = sc.nextLong();
sc.nextLine();
System.out.println("Referencia catastral: ");
if(catastroValido(sc.nextLine())) {
cuantiaTotal += cuantiaOtorgada(tipoAyuda, cuantiaSolicitada);
}
}
} while (tipoAyuda != 0);
System.out.println("Se han concedido ayudas por un total de: " + cuantiaTotal);
}
static void mostrarMenu() {
System.out.println("MENU AYUDAS");
System.out.println("1.- Por destruccion total de la vivienda habitual");
System.out.println("2.- Por danos que afecten a la estructura de la vivienda habitual");
System.out.println("3.- Por danos que no afecten a la estructura de la vivienda habitual");
System.out.println("0.- Salir");
System.out.println("Elija un tipo de ayuda (0-3)");
}
static long cuantiaOtorgada(int tipoAyuda, long cuantiaSolicitada) {
long cuantiaMaxima = 0;
switch(tipoAyuda){
case 1:
cuantiaMaxima = 30240;
break;
case 2:
cuantiaMaxima = 20640;
break;
case 3:
cuantiaMaxima = 10320;
break;
}
if(cuantiaSolicitada > cuantiaMaxima) {
cuantiaSolicitada = cuantiaMaxima;
}
return cuantiaSolicitada;
}
private static boolean catastroValido(String refCatastral) {
boolean refValida = false;
int provincia = getProvincia(refCatastral);
if(provincia == 38) {
int municipio = getMunicipio(refCatastral);
if((municipio == 24) || (municipio == 27) || (municipio == 45)) {
if (validarAlgoritmoCatastro(refCatastral)) {
refValida = true;
}
}
}
return refValida;
}
private static int getProvincia(String refCatastral) {
return Integer.parseInt("" + refCatastral.charAt(0) + refCatastral.charAt(1));
}
private static int getMunicipio(String refCatastral) {
return Integer.parseInt("" + refCatastral.charAt(2) + refCatastral.charAt(3) + refCatastral.charAt(4));
}
private static boolean validarAlgoritmoCatastro(String refCatastral) {
boolean res = false;
//Sólo se comprueban las referencias catastrales con 20 carácteres alfanuméricos,
//los dos últimos corresponden a los dÃgitos de control.
if (refCatastral != null && refCatastral.length() == 20) {
refCatastral = refCatastral.toUpperCase();
//Para calcular cada dÃgito de control se utilizan siguientes subcadenas
String cadenaPrimerDC = (refCatastral.substring(0, 7) + refCatastral.substring(14, 18));
String cadenaSegundoDC = (refCatastral.substring(7, 14) + refCatastral.substring(14, 18));
String dcCalculado = "";
dcCalculado += getCaracterControl(cadenaPrimerDC);
dcCalculado += getCaracterControl(cadenaSegundoDC);
if (dcCalculado.equals(refCatastral.substring(18, 20))) {
res = true;
}
}
return res;
}
static char getCaracterControl(String cadenaCC) {
int sumaDigitos = 0;
String letraDc = "MQWERTYUIOPASDFGHJKLBZX";
/*
Para el cálculo de cada dÃgito de control, se deben de sumar cada
uno de los carácteres de cada cadena.
Si el carácter no es numérico el valor corresponde de la siguiente
manera: A = 1, B = 2, ..., Z = 27.
*/
for(int posicion = 0; posicion < cadenaCC.length(); posicion++) {
int caracter = cadenaCC.charAt(posicion);
if(caracter >= 'A' && caracter <= 'Z') {
caracter = caracter - 'A' + 1;
} else {
caracter = caracter - '0';
}
sumaDigitos += caracter * pesoPosicion(posicion);
}
sumaDigitos %= 23;
return letraDc.charAt(sumaDigitos);
}
static int pesoPosicion(int posicion) {
int peso = 0;
// 13, 15, 12, 5, 4, 17, 9, 21, 3, 7, 1
switch(posicion) {
case 0:
peso = 13;
break;
case 1:
peso = 15;
break;
case 2:
peso = 12;
break;
case 3:
peso = 5;
break;
case 4:
peso = 4;
break;
case 5:
peso = 17;
break;
case 6:
peso = 9;
break;
case 7:
peso = 21;
break;
case 8:
peso = 3;
break;
case 9:
peso = 7;
break;
case 10:
peso = 1;
break;
}
return peso;
}
}
Input
1 30000 38027A025000400000UI 2 20000 35013A004003870000PK 3 10000 38027A044001220000UU 3 8000 38027A044001220000UJ 3 8000 38009A006002300000TA 0
1 30000 38009A006002300000TA 2 20000 38027A025000400000UI 3 10000 35013A004003870000PK 2 20000 38024A025000400000UI 2 20000 38027A044001220000UJ 2 24000 38027A044001220000UU 3 30000 38027A025000400000UI 2 20000 38045A025000400000UI 0
Output
MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Cantidad solicitada: Referencia catastral: MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Cantidad solicitada: Referencia catastral: MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Cantidad solicitada: Referencia catastral: MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Cantidad solicitada: Referencia catastral: MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Cantidad solicitada: Referencia catastral: MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Se han concedido ayudas por un total de: 40000
MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Cantidad solicitada: Referencia catastral: MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Cantidad solicitada: Referencia catastral: MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Cantidad solicitada: Referencia catastral: MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Cantidad solicitada: Referencia catastral: MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Cantidad solicitada: Referencia catastral: MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Cantidad solicitada: Referencia catastral: MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Cantidad solicitada: Referencia catastral: MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Cantidad solicitada: Referencia catastral: MENU AYUDAS 1.- Por destruccion total de la vivienda habitual 2.- Por danos que afecten a la estructura de la vivienda habitual 3.- Por danos que no afecten a la estructura de la vivienda habitual 0.- Salir Elija un tipo de ayuda (0-3) Se han concedido ayudas por un total de: 50960

