Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

EJERCICIO 1 - Documentación y Complejidad Algorítmica (25 puntos)

  • Dadas las clases Producto y Tienda, realiza la documentación JavaDoc completa y el análisis de complejidad algorítmica únicamente de la clase Tienda. Además, indica que el método listarProductosBasico está deprecado.
import java.util.ArrayList;
import java.util.List;

class Producto {
    private String codigo;
    private String nombre;
    private double precio;
    private int stock;
    
    public Producto(String codigo, String nombre, double precio, int stock) {
        this.codigo = codigo;
        this.nombre = nombre;
        this.precio = precio;
        this.stock = stock;
    }
    
    public String getCodigo() { return codigo; }
    public void setCodigo(String codigo) { this.codigo = codigo; }
    public String getNombre() { return nombre; }
    public void setNombre(String nombre) { this.nombre = nombre; }
    public double getPrecio() { return precio; }
    public void setPrecio(double precio) { this.precio = precio; }
    public int getStock() { return stock; }
    public void setStock(int stock) { this.stock = stock; }
}
public class Tienda {
    private ArrayList<Producto> productos = new ArrayList<>();
    
    public void agregarProducto(Producto producto) {
        productos.add(producto);
    }
    
    public boolean eliminarProducto(String codigo) {
        for (int i = 0; i < productos.size(); i++) {
            if (productos.get(i).getCodigo().equals(codigo)) {
                productos.remove(i);
                return true;
            }
        }
        return false;
    }
    
    public Producto buscarProducto(String codigo) {
        for (Producto p : productos) {
            if (p.getCodigo().equals(codigo)) {
                return p;
            }
        }
        return null;
    }
    
    public double calcularValorInventario() {
        double valorTotal = 0;
        for (Producto p : productos) {
            valorTotal += p.getPrecio() * p.getStock();
        }
        return valorTotal;
    }
    
    public int contarProductosCaros(double precioMinimo) {
        int contador = 0;
        for (Producto p : productos) {
            if (p.getPrecio() >= precioMinimo) {
                contador++;
            }
        }
        return contador;
    }
    
    public String listarProductosBasico() {
        StringBuilder sb = new StringBuilder();
        for (Producto p : productos) {
            sb.append(p.getNombre()).append(" - Precio: ").append(p.getPrecio()).append("€\n");
        }
        return sb.toString();
    }
    
    public String obtenerResumen() {
        return "Total productos: " + productos.size() + 
               ", Valor inventario: " + calcularValorInventario() + "€";
    }
}

EJERCICIO 2 - Optimización de Código (30 puntos)

  • Dada la clase AnalisisVentas, optimiza todos sus métodos e indica qué cambios específicos has realizado y por qué mejoran el rendimiento.
import java.util.ArrayList;
import java.util.List;

public class AnalisisVentas {
    double[] ventas = {120.5, 85.0, 200.3, 95.8, 150.0, 300.2, 85.0, 120.5, 200.3, 110.7, 120.5, 175.9, 85.0, 180.4};
    
    // Verifica si existe alguna venta superior a 100€
    boolean existeVentaAlta() {
        boolean encontrada = false;
        for (double venta : ventas) {
            if (venta > 100.0) {
                encontrada = true;
                break;
            }
        }
        return encontrada;
    }
    
    // Encuentra la venta de menor importe
    double ventaMinima() {
        double minima = ventas[0];
        for (double venta : ventas) {
            if (venta < minima) {
                minima = venta;
            }
        }
        return minima;
    }
    
    // Cuenta ventas que superan los 150€
    int contarVentasAltas() {
        int contador = 0;
        for (double venta : ventas) {
            if (venta > 150.0) {
                contador++;
            }
        }
        return contador;
    }
    
    // Calcula el promedio de ventas
    double promedioVentas() {
        double suma = 0;
        for (double venta : ventas) {
            suma += venta;
        }
        return suma / ventas.length;
    }
    
    // Calcula desviaciones respecto al promedio
    double[] desviacionesPromedio() {
        double promedio = promedioVentas();
        double[] resultado = new double[ventas.length];
        for (int i = 0; i < ventas.length; i++) {
            resultado[i] = ventas[i] - promedio;
        }
        return resultado;
    }
    
    // Encuentra la venta más repetida
    double ventaMasRepetida() {
        int maxRepeticiones = 0;
        double ventaFrec = ventas[0];
        for (int i = 0; i < ventas.length; i++) {
            int repeticiones = 0;
            for (int j = 0; j < ventas.length; j++) {
                if (ventas[i] == ventas[j]) {
                    repeticiones++;
                }
            }
            if (repeticiones > maxRepeticiones) {
                ventaFrec = ventas[i];
                maxRepeticiones = repeticiones;
            }
        }
        return ventaFrec;
    }
    
    // Análisis con múltiples ineficiencias
    double calculoComplejo() {
        double freq1 = ventaMasRepetida();
        double freq2 = ventaMasRepetida();
        double resultado = 0;
        double promedio = promedioVentas();
        for (int i = 0; i < ventas.length; i++) {
            resultado += ventas[i] + freq1 + freq2 + promedio;
        }
        return resultado / 100;
    }
}

EJERCICIO 3 - Testing con JUnit (20 puntos)

  • Crea los tests unitarios necesarios para los métodos ventaMinima, ventaMasRepetida y contarVentasAltas de la clase AnalisisVentas (usa la versión original, no la optimizada). Los tests deben cubrir:
    • Casos normales
    • Casos límite
    • Casos excepcionales
  • Incluye al menos 3 tests por cada método.

EJERCICIO 4 - Refactorización (25 puntos)

  • Refactoriza la siguiente clase Empleado aplicando buenas prácticas de programación:
public class Empleado {
    String nombre = "Sin nombre";
    String departamento;
    boolean activo = true;
    double salario = 25000.0;
    int experiencia = 0;
    CategoriaEmpleado categoria = CategoriaEmpleado.Junior;
    
    String[] proyectos;
    double[] bonificaciones;
    
    int antiguedad = 0; // años en la empresa
    
    enum CategoriaEmpleado {
        Becario, Junior, Senior, Lead, Manager
    }
    
    // Determina si el empleado puede recibir aumento
    boolean puedeRecibirAumento() {
        if (experiencia <= 2 || experiencia == 2) {
            if (!activo) {
                return false;
            } else {
                return false;
            }
        } else {
            if (!activo) {
                return false;
            } else {
                return true;
            }
        }
    }
    
    // Calcula el salario con aumento según categoría
    double calcularSalarioConAumentoYBonificacionSegunCategoria() {
        switch (categoria) {
            case Becario:
                if (!puedeRecibirAumento()) return salario;
                return salario + (salario * 0.05);
            case Junior:
                if (!puedeRecibirAumento()) return salario;
                return salario + (salario * 0.10);
            case Senior:
                if (!puedeRecibirAumento()) return salario;
                return salario + (salario * 0.15);
            case Lead:
                if (!puedeRecibirAumento()) return salario;
                return salario + (salario * 0.20);
            case Manager:
                if (!puedeRecibirAumento()) return salario;
                if (antiguedad <= 1) return salario + (salario * 0.25);
                return salario + (salario * 0.30);
            default:
                return salario;
        }
    }
    
    public static void main(String[] args) {
        Empleado e = new Empleado();
        e.categoria = CategoriaEmpleado.Senior;
        e.experiencia = 5;
        e.salario = 35000;
        System.out.println("Salario final: " + 
            e.calcularSalarioConAumentoYBonificacionSegunCategoria());
    }
}

About

Practica para el examen final de Contornos de 1ºDAM

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages