Examen de Programació II UDL 2012 · Segundo Parcial (Curso 2012-2013)
Examen de Programació II de la UDL (Grado en Ingeniería Informática) 2012, Segundo Parcial (Curso 2012-2013): 2 problemas con solución. Gratis.
Temas del examen: Diseño de clases y objetos en Java, herencia e igualdad · Ficheros en Java: texto secuencial y acceso directo binario
Problema 1 · Diseño de clases y objetos en Java, herencia e igualdad
Segundo parcial de Programación 2 (Curso 2012/2013)
A continuación se facilita información sobre el tamaño de los tipos primitivos en Java y una referencia de las clases y utilidades disponibles para la resolución del examen:
byte
char
int
long
float
double
8 bits
16 bits
32 bits
64 bits
32 bits
64 bits
Resumen de clases y métodos disponibles
Conversiones de tipo: (double) unEntero, (int) unLong.
class ConsoleProgram: void println(String msg), int readInt(String msg).
class Math: static final double PI = 3.141592...
class PackUtils: métodos estáticos de empaquetado y desempaquetado de tipos básicos y cadenas con límite:
packBoolean(boolean, byte[], int offset), unpackBoolean(byte[], int offset)
packChar(char, byte[], int offset), unpackChar(byte[], int offset)
packInt(int, byte[], int offset), unpackInt(byte[], int offset)
packLong(long, byte[], int offset), unpackLong(byte[], int offset)
packDouble(double, byte[], int offset), unpackDouble(byte[], int offset)
packLimitedString(String s, int maxLength, byte[] buffer, int offset)
unpackLimitedString(int maxLength, byte[] buffer, int offset)
class RandomAccessFile (todas sus operaciones lanzan IOException):
new RandomAccessFile(String fileName, String mode)
void close(), long length(), void seek(long pos), void setLength(long newLength)
int read(byte[] buff), int read(byte[] buff, int offset, int length)
void write(byte[] buff), void write(byte[] buff, int offset, int length)
class RandomGenerator: static RandomGenerator getInstance(), int nextInt(int n).
class String: static String valueOf(int i).
Problema 1 (4 puntos). Clase Sexagesimal
Se desea implementar una clase Java denominada Sexagesimal para representar y operar con ángulos en el sistema sexagesimal, donde se cumplen las siguientes equivalencias:
1 vuelta completa = 360 grados
1 grado = 60 minutos
1 minuto = 60 segundos
El siguiente fragmento ilustra los métodos que debe proporcionar la clase y el comportamiento esperado:
Sexagesimal angle = new Sexagesimal(390, 72, 80);
int degrees = angle.getDegrees(); // degrees = 31
int minutes = angle.getMinutes(); // minutes = 13
int seconds = angle.getSeconds(); // seconds = 20
Sexagesimal right = new Sexagesimal(90, 0, 0);
angle.add(right); // angle pasa a ser 121° 13' 20''
half = Sexagesimal.add(right, right);
double pi = half.toRadians(); // radians = 3.141592...
String str = angle.toString(); // str = "121° 13' 20''" Requisitos y consideraciones:
Se puede asumir que los valores numéricos suministrados al constructor nunca serán negativos.
El constructor debe encargarse de normalizar cualquier exceso de segundos, minutos o grados: El sobrante de múltiplos de 60 segundos se traslada como minutos.
El sobrante de múltiplos de 60 minutos se traslada como grados.
Los múltiplos de 360 grados se descartan (se calcula módulo 360).
La suma (tanto de instancia como estática) debe gestionar de igual manera los posibles excesos. Se valorará la ausencia de duplicación de código.
El método toRadians() calcula el ángulo equivalente en radianes ( radianes corresponden a 360 grados). Pista: pase primero los grados, minutos y segundos a grados totales en valor decimal (1 minuto equivale a de grado y 1 segundo a de grado) y posteriormente efectúe la conversión a radianes.
En el método toString(), los minutos y segundos solo se concatenan si su valor es distinto de cero (por ejemplo, para half la salida ha de ser "180°").
Acompañe el código con una breve explicación del diseño y razonamiento adoptado.
Problema 2 · Ficheros en Java: texto secuencial y acceso directo binario
Segundo parcial de Programación 2 (Curso 2012/2013)
A continuación se facilita información sobre el tamaño de los tipos primitivos en Java y una referencia de las clases y utilidades disponibles para la resolución del examen:
byte
char
int
long
float
double
8 bits
16 bits
32 bits
64 bits
32 bits
64 bits
Resumen de clases y métodos disponibles
Conversiones de tipo: (double) unEntero, (int) unLong.
class ConsoleProgram: void println(String msg), int readInt(String msg).
class Math: static final double PI = 3.141592...
class PackUtils: métodos estáticos de empaquetado y desempaquetado de tipos básicos y cadenas con límite:
packBoolean(boolean, byte[], int offset), unpackBoolean(byte[], int offset)
packChar(char, byte[], int offset), unpackChar(byte[], int offset)
packInt(int, byte[], int offset), unpackInt(byte[], int offset)
packLong(long, byte[], int offset), unpackLong(byte[], int offset)
packDouble(double, byte[], int offset), unpackDouble(byte[], int offset)
packLimitedString(String s, int maxLength, byte[] buffer, int offset)
unpackLimitedString(int maxLength, byte[] buffer, int offset)
class RandomAccessFile (todas sus operaciones lanzan IOException):
new RandomAccessFile(String fileName, String mode)
void close(), long length(), void seek(long pos), void setLength(long newLength)
int read(byte[] buff), int read(byte[] buff, int offset, int length)
void write(byte[] buff), void write(byte[] buff, int offset, int length)
class RandomGenerator: static RandomGenerator getInstance(), int nextInt(int n).
class String: static String valueOf(int i).
Problema 2 (6 puntos). Sorteos con RandomAccessFile
Se requiere desarrollar una aplicación para gestionar sorteos utilizando un fichero binario de acceso directo ( people.dat), en el cual no existen registros vacíos o huecos intermedios y que contiene los datos de todos los participantes.
El programa debe seleccionar al azar una serie de ganadores según la cantidad solicitada. Con el fin de evitar registros no válidos, cada persona premiada debe eliminarse del fichero sustituyendo su posición por la de la última persona almacenada en el archivo y truncando acto seguido la longitud del fichero.
La clase base para los registros es Person, cuya estructura original es:
public class Person {
private String name;
private String address;
private int age;
private boolean married;
public Person(String name, String address, int age, boolean married) {
this.name = name;
this.address = address;
this.age = age;
this.married = married;
}
public String toString() {
return this.name;
}
}
Requisitos y consideraciones:
Descomponga la solución en subproblemas y métodos auxiliares modulares antes de redactar el código definitivo.
Extienda la clase Person para incorporar las siguientes utilidades de serialización:
public static final int SIZE: constante pública con el número de bytes que ocupa un registro completo. En el fichero, las cadenas name y address tienen una longitud fija reservada de 20 y 50 caracteres, respectivamente.
public static Person fromBytes(byte[] record): método de factoría para reconstruir una persona a partir de su array de bytes.
public byte[] toBytes(): método para convertir la instancia actual a su representación en array de bytes.
El programa principal debe heredar de ConsoleProgram. Solicitará por teclado el número de premios a repartir y mostrará por pantalla el nombre de las personas seleccionadas.
Puede suponerse que el número de premios introducido es un entero estrictamente positivo y menor que el total de registros existentes en el fichero.
El número total de registros presentes en el fichero puede representarse sin pérdida mediante un dato de tipo int.
Acompañe el código con una breve explicación del diseño y razonamiento adoptado.
1.
2.
3.
También puedes estudiar por temas
Practica un tema con ejercicios de los exámenes de todos los años, mezclados.
- Diseño de clases y objetos en Java, herencia e igualdad · 7 problemas · 35 % de que salga
- Recursión: diseño, traza y diagramas de llamadas · 10 problemas · 25 % de que salga
- Ficheros en Java: texto secuencial y acceso directo binario · 5 problemas · 25 % de que salga
- Árboles binarios y heaps · 2 problemas · 40 % de que salga
- Tablas hash · 1 problema · 40 % de que salga
- Listas en Java: uso de la API, implementación enlazada y coste · 3 problemas · 35 % de que salga