1º Grado en Ingeniería Informática · UAX · Convocatoria extraordinaria · Formato del examen real ampliado: 5 bloques · SIN soluciones (están en Examen_Maestro_EDA_SOLUCIONES.html)
Examen_Maestro_EDA_SOLUCIONES.html.
| Bloque | Tema | Ejercicios |
|---|---|---|
| 1 | Abstracción y encapsulación | 1.1 – 1.4 |
| 2 | Orden de complejidad (9 fragmentos) | 2.1 – 2.2 |
| 3 | Métodos de ordenación | 3.1 – 3.7 |
| 4 | Estructuras de datos | 4.1 – 4.6 |
| 5 | Búsqueda y recursión | 5.1 – 5.3 |
CuentaBancariaencapsulaciónEscribe una clase CuentaBancaria correctamente encapsulada:
titular (String) y saldo (double).IllegalArgumentException si algo falla).setSaldo: razona en una línea por qué es buena idea.depositar(double): ignora (con aviso por pantalla) cantidades ≤ 0.retirar(double): devuelve boolean; solo permite retirar si 0 < cantidad ≤ saldo.toString().main que cree una cuenta con 100 €, deposite 50, intente retirar 500 (debe fallar),
retire 80 y deposite -10, imprimiendo el estado tras cada operación.Diseña la jerarquía:
Figura con atributo privado nombre, constructor, getter y
métodos abstractos double area() y double perimetro(). Añade un método CONCRETO
describir() que imprima nombre, área y perímetro (redondeados a 2 decimales) usando los abstractos.Circulo (radio) y Rectangulo (base, altura) que hereden de Figura con
extends, llamen a super(...) y sobrescriban los dos métodos con @Override.main que guarde varias figuras en un array de tipo Figura[], las recorra
llamando a describir() y acumule la suma de todas las áreas. Explica en 2 líneas qué es el
polimorfismo y dónde aparece exactamente en tu main.new Figura("x") no compila?Bonificable con un único método double bonus();Empleado: atributos privados nombre y salarioBase,
constructor, getters, método abstracto double salarioMensual(), y DOS métodos sobrecargados:
subirSalario(double cantidad) y subirSalario(double cantidad, int veces).
Sobrescribe toString() para que muestre el nombre y el salario mensual.EmpleadoFijo (con trienios): extiende Empleado e implementa Bonificable; su salario
mensual = base + 50·trienios + bonus() (bonus fijo de 100).
EmpleadoTemporal (con horasExtra): salario mensual = base + 15·horasExtra.main con un List<Empleado> que imprima cada empleado y, solo si es
instanceof Bonificable, su bonus. Prueba las dos sobrecargas.Dada esta clase:
class ProductoMal { // ASÍ NO: todo público, sin ningún control public String nombre; public double precio; public int stock; }
IllegalArgumentException) y un método
vender(int unidades) que rechace ventas imposibles.Para cada método, indica el orden de complejidad con su justificación completa. Si el método tiene mejor y peor caso distintos, analiza ambos.
public static int c1(int[] a) { int suma = 0; for (int i = 0; i < a.length; i++) { suma += a[i]; } return suma; }
public static int c2(int[] a, int x) { int veces = 0; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a.length && a[j] != x; j++) { veces++; } } return veces; }
public static long c3(int n) { long c = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { c++; } } } return c; }
public static int c4(int n) { int c = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { c++; } } return c; }
public static int c5(int n) { int c = 0; for (int j = 1; j <= n; j *= 2) { c++; } return c; }
Igual que el anterior. Ojo: dos de estos cuatro se parecen mucho y NO tienen la misma complejidad.
public static int c6(int n) { int c = 0; for (int i = 1; i <= n; i *= 2) { for (int k = 0; k < n; k++) { c++; } } return c; }
public static int c7(int n) { int c = 0; for (int i = 1; i <= n; i *= 2) { for (int k = 0; k < i; k++) { c++; } } return c; }
public static int c8(int n) { if (n <= 1) return 0; return 1 + c8(n / 2); }
public static long c9(int n) { if (n <= 1) return n; return c9(n - 1) + c9(n - 2); }
Para (h) e (i): indica también cuántas llamadas recursivas se generan en función de n.
public static void burbuja(int[] a).[1, 4, 8, 10, 2].public static void seleccion(int[] a).[29, 10, 14, 37, 13] (estado del array tras cada colocación).public static void insercion(int[] a).[25, 9, 14, 3, 20] mostrando el array tras insertar cada elemento.mergeSort(int[] a, int ini, int fin) y el método merge, comentando qué hace cada parte.[31, 7, 24, 9, 15, 2].quickSort(int[] a, int ini, int fin) y particionar con pivote = primer elemento.[35, 12, 48, 7, 29, 50, 18]: para cada partición indica menores, pivote colocado y mayores.heapSort(int[] a) con su método auxiliar hundir, explicando las dos fases.[19, 4, 27, 11, 8]: montículo construido y array tras cada extracción del máximo.shellSort(int[] a) con gaps n/2, n/4, ..., 1.[45, 23, 67, 12, 38, 7] mostrando el array tras cada pase de gap.Un módulo de software requiere almacenar un registro dinámico de identificadores únicos (sin duplicados). Es un requisito estricto que, tras cada inserción, la colección quede ordenada automáticamente y que insertar y comprobar existencia sea O(log n). ¿Qué estructura del framework de Java debe seleccionarse?
a) ArrayList b) HashSet c) LinkedList d) TreeSet
PilaArray sobre un array de int: atributos privados
(datos, tope), constructor con capacidad, y métodos push, pop,
peek, estaVacia, estaLlena, lanzando RuntimeException en pila
vacía/llena. Indica la complejidad de cada operación.public static boolean equilibrada(String expr) que use una pila
(ArrayDeque<Character>) para comprobar si (), [] y {} están
equilibrados. Casos: "{[()]}"→true, "([)]"→false, "((("→false.ColaEnlazada con una clase interna Nodo y referencias
primero y ultimo: métodos encolar, desencolar, frente,
estaVacia, tamano. TODAS las operaciones deben ser O(1): explica qué papel juega
ultimo para lograrlo y qué caso especial hay al encolar en vacía y al desencolar la última.encolar("Ana"), encolar("Luis"), desencolar(), encolar("Marta"),
encolar("Pedro"), frente(), desencolar(), desencolar(). Di qué devuelve cada operación y el contenido final.Nodo (dato, anterior, siguiente) y ListaDoble
(referencias primero y ultimo) con: insertarPrincipio, insertarFinal,
insertarDespuesDe(int ref, int valor) y eliminar(int valor).imprimirAdelante() e imprimirAtras() (este último recorre con
anterior desde ultimo: sirve para comprobar que las flechas de vuelta están bien).main que inserte 10, 20, 40 al final, inserte 30 después del 20, inserte 5 al principio,
imprima en ambos sentidos, elimine el 40 y vuelva a imprimir.ABB (con clase interna Nodo): método público
insertar(int) apoyado en un privado recursivo (sin duplicados), y los tres recorridos
preorden, inorden y postorden (patrón público lanzadera + privado recursivo con caso base).buscar(int) aprovechando el orden del ABB (que imprima los nodos que visita).45, 23, 67, 12, 38, 51, 89, 30. Dibuja el árbol y escribe los tres recorridos.public static Map<String,Integer> frecuencias(String[] nombres) que
devuelva cuántas veces aparece cada nombre (usa getOrDefault), y el código que recorre el mapa
imprimiendo nombre aparece N veces.Map y no dos ArrayList paralelos? ¿Qué complejidad tienen put y
get en un HashMap y gracias a qué mecanismo interno? ¿Qué es una colisión y cómo se resuelve?busquedaLineal(int[] a, int x) y busquedaBinaria(int[] a, int x)
(iterativa, devolviendo la posición o -1).[2, 5, 8, 12, 16, 23, 38, 56, 72, 91], escribe qué posiciones examina la binaria al buscar
23 y al buscar 7 (traza de ini, fin, mid).busquedaBinariaRec(int[] a, int x, int ini, int fin). Señala sus DOS casos base.factorial(int n) recursivo señalando caso base y caso recursivo.factorial(4): qué se apila y qué devuelve cada llamada al deshacerse.sumaArray(int[] a, int i): suma recursiva de los elementos (el elemento i + la suma del resto).