2. Enunciado Un libro de registro mensual consiste en una serie de entradas, una para cada día del mes, que pueden representar cualquier cosa: número de horas en clase, número de correos recibidos, número de cafés consumidos, etc. Realizar la especificación algebraica del TAD libro de registro mensual, incluyendo, entre otras, las operaciones de creación del libro para un mes determinado, registrar una entrada para un día determinado, consultar el registro de cierto día, proporcionar el mes del registro, el número de días del mes y el año correspondiente. Realizar la implementación de dicho TAD en JAVA
3. Especificación algebraica del TAD (I) Especificación sintáctica Nombre del tipo: LIBROREGISTRO Tipos auxiliares: NATURAL, VALOR Operaciones: CREARLIBRO: NATURALxNATURAL LIBROREGISTRO {CREALIBRO(m, a) : Crea un libro de registro correspondiente al mes m del año a} REGISTRAR: LIBROREGISTROx NATURALxVALOR LIBROREGISTRO {REGISTRAR(l, d, v): Registra en el día d del libro l el valor v} OBTENERENTRADA: LIBROREGISTROxNATURAL VALOR {OBTENERENTRADA(l, d): Devuelve el valor anotado en el día d del libro l } MES: LIBROREGISTRO NATURAL {MES(l): Devuelve el mes correspondiente al libro l}
4. Especificación algebraica del TAD (II) Especificación sintáctica (Cont,) MES: LIBROREGISTRO NATURAL {MES(l): Devuelve el mes correspondiente al libro l} AÑO: LIBROREGISTRO NATURAL {AÑO(l): Devuelve el año correspondiente al libro l} DÍASMES:LIBROREGISTRO NATURAL {DÍASMES(l): Devuelve el número de días del mes correspondiente al libro l} Término canónico: L LIBROREGISTRO, M, A NATURAL,, L=CREALIBRO(M,A) v L’ LIBROREGISTRO V VALOR,,L=REGISTRAR(L’,D,V)
5. Especificación algebraica del TAD (III) Especificación semántica CONJUNTO DE GENERADORAS NO LIBRE Axiomas de EQUIVALENCIA: (EQ1) REGISTRAR(REGISTRAR(L,D,V),D’,V’)= REGISTRAR(L,D,V’), si D=D’ REGISTRAR(REGISTRAR(L,D’,V’),D,V), c.c. (EQ2) REGISTRAR(L,D,V)=Error, si D [1,DIASMES(L)]
6. Axiomas de ACCESO: (OB1) OBTENERENTRADA(CREARLIBRO(M,A),D)=Error (OB2) OBTENERENTRADA(REGISTRAR(L,D,V),D’)= V, si D=D’ OBTENERENTRADA(L,D’), c.c. (M1) MES(CREALIBRO(M,A))=M (M2) MES(REGISTRAR(L,D,V))=MES(L) (A1) AÑO(CREALIBRO(M,A))=A (A2) AÑO(REGISTRAR(L,D,V))=AÑO(L) (D1) DIASMES(CREALIBRO(M,A))=DÍAS(M) (D2) DIASMES(REGISTRAR(L,D,V))=DÍASMES(L) operación auxiliar que nos devuelve el número de días del mes que representa el número natural M, siempre y cuando M [1,12] Especificación algebraica del TAD (IV)
7. Implementación Java (I) public class libroRegistro { private int mesRegistro; private int añoRegistro; private int[] entradas; public libroRegistro(int mes, int año) { mesRegistro=mes; añoRegistro=año; entradas=new int[díasMes()]; } Representación de los valores del TAD en memoria Constructor ≡ Op. Generadora
8. Implementación Java (II) public void registrar(int día, int valor){ if (día<1 || día>díasMes()) System.out.println("Día incorrecto"); else entradas[día]=valor; } public int obtenerEntrada(int día){ if (día<1 || día>díasMes()){ System.out.println("Día incorrecto"); return -1; } else return entradas[día]; } Op. Generadora Constructor ≡ Op. Generadora
9. Implementación Java (III) public int díasMes(){ int diasmes=0; switch ( mesRegistro) { case 4: case 6: case 9: case 11:{Abr, Jun, Sept y Nov} diasmes=30; break; case 2: {Febrero}if (esBisiesto(añoRegistro)) d iasmes= 29; else diasmes= 28; break; case 1: case 3: case 5: case 7: case 8: case 10: case 12: {resto de meses} diasmes= 31; break; } // fin switch return diasmes; }
10. Implementación en Java (IV) private boolean esBisiesto(int año){ if ( ( (año % 4 == 0) && ! (año % 100 == 0)) || ( (año % 400 == 0) && ! (año % 4000 == 0))) return true; else return false; } public int mes(){ return mesRegistro; } public int año(){ return añoRegistro; } }//fin de la clase libroRegistro Op. Auxiliar
11. Uso del TAD (I) public class Horas { private static Scanner teclado=new Scanner(System.in); public static void main(String[] args) throws IOException{ System.out.println("Elige año para crear el libro de registros"); int año=Integer.parseInt(teclado.readLine()); System.out.println("Elige mes para anotar las horas de estudio"); int mes=Integer.parseInt(teclado.readLine()); libroRegistro horas=new libroRegistro(mes, año); boolean fin=false; while (!fin){ mostrarOpciones(); int o=leerOpcion(); if (o!=5) procesarOpcion(horas, o); else fin=true; } }
12. Uso del TAD (II) private static void mostrarOpciones(){ System.out.println("1. Anotar entrada"); System.out.println("2. Obtener registro"); System.out.println("3. Mes y Año"); System.out.println("4. Días del mes"); System.out.println("5. Acabar"); } private static int leerOpcion() throws IOException{ System.out.print("Elige opción ...."); return Integer.parseInt(teclado.readLine()); }
13. Uso del TAD (y III) private static void procesarOpcion(libroRegistro horas, int opcion) throws IOException{ switch(opcion){ case 1: System.out.println("Elige día"); int día=Integer.parseInt(teclado.readLine()); System.out.println("¿Cuántas horas has estudiado el dia "+día+ "?"); horas.registrar(día, Integer.parseInt(teclado.readLine())); break; case 2: System.out.print("Elige día"); día=Integer.parseInt(teclado.readLine()); System.out.println(horas.obtenerEntrada(día)); break; case 3: System.out.println("Mes/Año : "+horas.mes()+ "/"+horas.año()); break; case 4: System.out.println("Dias del mes "+horas.mes()+" "+horas.díasMes()); } } }