Problema 1 · Programació II UDL 2012
Tema: Diseño de clases y objetos en Java, herencia e igualdad · Del examen Examen Segundo Parcial (Curso 2012-2013) (2012)
Enunciado
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.

Solución
Según los criterios oficiales de corrección
Implementación de la clase Sexagesimal y justificación del diseño
Solución: ```java public class Sexagesimal { private int degrees; private int minutes; private int seconds; public Sexagesimal(int degrees, int minutes, int seconds) { normalize(degrees, minutes, seconds); } private void normalize(int deg, int min, int sec) { int totalSeconds = sec % 60; int extraMinutes = sec / 60; int totalMinutes = (min + extraMinutes) % 60; int extraDegrees = (min + extraMinutes) / 60; int totalDegrees = (deg + extraDegrees) % 360; this.seconds = totalSeconds; this.minutes = totalMinutes; this.degrees = totalDegrees; } public int getDegrees() { return this.degrees; } public int getMinutes() { return this.minutes; } public int getSeconds() { return this.seconds; } public void add(Sexagesimal other) { normalize(this.degrees + other.degrees, this.minutes + other.minutes, this.seconds + other.seconds); } public static Sexagesimal add(Sexagesimal a, Sexagesimal b) { return new Sexagesimal(a.degrees + b.degrees, a.minutes + b.minutes, a.seconds + b.seconds); } public double toRadians() { double totalDegrees = this.degrees + (this.minutes / 60.0) + (this.seconds / 3600.0); return totalDegrees * (Math.PI / 180.0); } public String toString() { String res = this.degrees + "°"; if (this.minutes != 0) { res += " " + this.minutes + "'"; } if (this.seconds != 0) { res += " " + this.seconds + "''"; } return res; } } ```
La explicación paso a paso, hecha con IA, es Premium. Premium
Resuélvelo aquí mismo: corrección automática, pistas y solución paso a paso.
‹ Pregunta 4 · 2021 · Problema 1 · 2011 ›