Ejercicios Resueltos de Programación Java: Arrays, Imágenes y Algoritmos

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 13,82 KB

Ejercicio 7 (2016): Gestión de un Sistema de Notas

Enunciado

Se desea gestionar un sistema de notas en la Escuela Técnica Superior de Ingeniería de Telecomunicación. Para ello, se guarda la información de las mismas en un array bidimensional de números reales.

Apartados

  • a) (2 puntos) Implementar una función mediaEstudiante que reciba como argumentos una referencia al sistema de notas.
  • b) (3 puntos) Implementar una función obtenerSuspensos que reciba como argumento una referencia al sistema de notas.

Solución en Java

a) Función mediaEstudiante

public static double mediaEstudiante(double[][] a, int n) {
    if (a == null || a.length == 0 || n < 0 || n >= a.length)
        return -1;

    double suma = 0;
    for (int i = 0; i < a[n].length; i++)
        suma += a[n][i];

    return suma / a[n].length;
}

b) Función obtenerSuspensos

public static double[][] obtenerSuspensos(double[][] a, int n) {
    if (a == null || a.length == 0 || n < 0 || n >= a.length)
        return null;

    int contador = 0;
    for (int i = 0; i < a[n].length; i++)
        if (a[n][i] < 5.0) contador++;

    double[][] suspensos = new double[contador][2];
    int j = 0;
    for (int i = 0; i < a[n].length; i++)
        if (a[n][i] < 5.0) {
            suspensos[j][0] = i;
            suspensos[j][1] = a[n][i];
            j++;
        }

    return suspensos;
}

Ejercicio 8 (2016): Procesamiento de Imágenes BMP en Java

Enunciado

Se quiere implementar una serie de métodos en Java para trabajar con imágenes en formato BMP. Suponga que un fichero BMP es una matriz.

Apartados

  • a) Implementar un método blancoNegro.
  • b) Implementar un método calculoHistograma a partir de una imagen tomada como argumento.
  • c) Implementar un método calculoColorMasFrecuente a partir de un histograma.
  • d) Implementar un método filtroColor que tome como argumento una imagen y un color.

Solución en Java

a) Método blancoNegro

public byte[][] blancoNegro(byte[][] imagen, byte umbral) {
    if (imagen == null || imagen.length == 0)
        return null;

    for (int i = 0; i < imagen.length; i++)
        if (imagen[i].length != imagen[0].length)
            return null;

    byte[][] imagenBN = new byte[imagen.length][imagen[0].length];
    for (int i = 0; i < imagen.length; i++)
        for (int j = 0; j < imagen[i].length; j++)
            if (imagen[i][j] <= umbral)
                imagenBN[i][j] = 0;
            else
                imagenBN[i][j] = (byte) 255;

    return imagenBN;
}

b) Método calculoHistograma

public int[] calculoHistograma(byte[][] imagen) {
    if (imagen == null || imagen.length == 0)
        return null;

    for (int i = 0; i < imagen.length; i++)
        if (imagen[i].length != imagen[0].length)
            return null;

    int[] histograma = new int[256];
    for (int i = 0; i < histograma.length; i++)
        histograma[i] = 0;

    for (int i = 0; i < imagen.length; i++)
        for (int j = 0; j < imagen[i].length; j++)
            histograma[imagen[i][j]]++;

    return histograma;
}

c) Método calculoColorMasFrecuente

public int calculoColorMasFrecuente(byte[] histograma) {
    if (histograma == null || histograma.length == 0)
        return -1;

    int maximo = histograma[0];
    for (int i = 0; i < histograma.length; i++)
        if (histograma[i] > maximo)
            maximo = histograma[i];

    return maximo;
}

d) Método filtroColor

public byte[][] filtroColor(byte[][] imagen, byte color) {
    if (imagen == null || imagen.length == 0)
        return null;

    for (int i = 0; i < imagen.length; i++)
        if (imagen[i].length != imagen[0].length)
            return null;

    byte[][] imagenFiltrada = new byte[imagen.length][imagen[0].length];
    for (int i = 0; i < imagen.length; i++)
        for (int j = 0; j < imagen[i].length; j++)
            if (imagen[i][j] == color)
                imagenFiltrada[i][j] = color;
            else
                imagenFiltrada[i][j] = 0;

    return imagenFiltrada;
}

Ejercicio 9 (2016): Operaciones con Arrays de Enteros

Enunciado

Apartados

  • a) (1 punto) Implementar una función hayRepetido que tome como argumento un array de enteros positivos y devuelva el primer elemento que aparezca repetido en el array.
  • b) (1,5 puntos) Implementar una función numeroOcurrencias que tome como argumento un array bidimensional de números enteros y devuelva el número de ocurrencias de un elemento en el array.
  • c) (2,5 puntos) Implementar una función devuelvePosicion que tome como argumentos un array bidimensional de números enteros y un número entero, y devuelva otro array bidimensional con las posiciones (fila, columna) de dicho número en el array original.

Solución en Java

a) Función hayRepetido

/**
 * Método que comprueba si hay elementos repetidos en un array de enteros positivos.
 * @return Devuelve el primer elemento repetido. Si no encuentra repetidos, devuelve -1.
 */
public static int hayRepetido(int a[]) {
    if (a == null || a.length == 0 || a.length == 1)
        return -1;

    for (int i = 0; i < a.length; i++)
        for (int j = i + 1; j < a.length; j++)
            if (a[i] == a[j]) {
                return a[i];
            }

    return -1;
}

b) Función numeroOcurrencias

/**
 * Devuelve el número de ocurrencias de un elemento en un array bidimensional.
 */
public static int numeroOcurrencias(int a[][], int elemento) {
    if (a == null || a.length == 0)
        return -1;

    int contador = 0;
    for (int i = 0; i < a.length; i++)
        for (int j = 0; j < a[i].length; j++)
            if (a[i][j] == elemento)
                contador++;

    return contador;
}

c) Función devuelvePosicion

/**
 * Devuelve un array bidimensional con la posición (fila, columna) de un elemento
 * en el array original.
 */
public static int[][] devuelvePosicion(int[][] a, int elemento) {
    if (a == null || a.length == 0)
        return null;

    int numero = numeroOcurrencias(a, elemento);
    if (numero == 0)
        return new int[0][0];

    int[][] b = new int[numero][2];
    int indice = 0;
    for (int i = 0; i < a.length; i++)
        for (int j = 0; j < a[i].length; j++)
            if (a[i][j] == elemento) {
                b[indice][0] = i;
                b[indice][1] = j;
                indice++;
            }

    return b;
}

Ejercicio 10 (2016): Cálculo del Mínimo Número de Monedas

Enunciado

Escriba un programa que, dada una cantidad de dinero introducida por el usuario, calcule cuál es el número mínimo de monedas.

Solución en Java

public static void main(String[] args) {
    System.out.print("Introduzca cantidad de dinero: ");
    int dinero = Teclado.readInt(); // Asumimos una clase Teclado para la entrada
    int monedas = 0;

    if (dinero > 0) {
        while (dinero >= 200) { monedas++; dinero -= 200; }
        while (dinero >= 100) { monedas++; dinero -= 100; }
        while (dinero >= 50) { monedas++; dinero -= 50; }
        while (dinero >= 20) { monedas++; dinero -= 20; }
        while (dinero >= 10) { monedas++; dinero -= 10; }
        while (dinero >= 5) { monedas++; dinero -= 5; }
        while (dinero >= 2) { monedas++; dinero -= 2; }
        while (dinero >= 1) { monedas++; dinero -= 1; }
        System.out.println("El número de monedas es: " + monedas);
    } else {
        System.out.println("Cantidad cero o negativa");
    }
}

Ejercicio 11 (2016): Estadísticas de una Lista de Números

Enunciado

Escriba un programa que calcule el mínimo, el máximo y la media de una lista de números enteros positivos introducidos por el usuario.

Solución en Java

public static void main(String[] args) {
    System.out.print("Introduzca un número: ");
    int numero = Teclado.readInt(); // Asumimos una clase Teclado para la entrada
    int minimo = numero;
    int maximo = numero;

    if (numero < 0) {
        System.out.print("El primer número es negativo");
    } else {
        int suma = 0;
        int numElementos = 0;
        while (numero >= 0) {
            if (numero < minimo) minimo = numero;
            if (numero > maximo) maximo = numero;
            suma += numero;
            numElementos++;
            System.out.print("Introduzca otro número: ");
            numero = Teclado.readInt();
        }
        System.out.println("El mínimo es: " + minimo);
        System.out.println("El máximo es: " + maximo);
        System.out.println("La media es: " + (double) suma / numElementos);
    }
}

Ejercicio 12 (2015): Conversión de Decimal a Binario

Enunciado

Para pasar un número entero decimal a binario, se realiza el siguiente procedimiento:

Apartados

  • a) Implemente una función iterativa que tome como argumento un número entero positivo y lo convierta a binario.
  • b) Implemente una función recursiva que tome como argumento un número entero positivo y lo convierta a binario.

Solución en Java

a) Versión Iterativa

public static void convertirBinarioIterativo(int num) {
    if (num < 0) {
        System.out.println("El número es negativo");
        return;
    }

    int exp = 0;
    double binario = 0;
    while (num != 0) {
        int digito = num % 2;
        binario += digito * Math.pow(10, exp);
        exp++;
        num = num / 2;
    }
    System.out.println("Binario: " + (long) binario);
}

b) Versión Recursiva

public static void convertirBinarioRecursivo(int num) {
    if (num < 0) {
        System.out.println("El número es negativo");
        return;
    }

    if (num < 2) {
        System.out.print(num);
    } else {
        convertirBinarioRecursivo(num / 2);
        System.out.print(num % 2);
    }
}

Ejercicio 13 (2015): Gestión de Exámenes de una Asignatura

Enunciado

La universidad está interesada en el desarrollo de un sistema de gestión de los distintos exámenes de los estudiantes de una asignatura.

Apartados

  • a) Implemente una función calcularMedias que reciba como argumento una referencia al sistema de gestión y devuelva como resultado una referencia a un array unidimensional.
  • b) Implemente una función calcularNotas que reciba como argumentos una referencia al sistema de gestión.
  • c) Implemente una función calcularEstudiante que reciba como argumento una referencia al sistema de gestión.

Solución en Java

a) Función calcularMedias

public static double[] calcularMedias(double[][] a) {
    if (a == null || a.length == 0)
        return null;

    double[] resultado = new double[a.length];
    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < a[i].length; j++)
            resultado[i] += a[i][j];
        resultado[i] /= a[i].length;
    }
    return resultado;
}

b) Función calcularNotas

public static double[] calcularNotas(double[][] a, int b) {
    if (a == null || a.length == 0)
        return null;

    double[] resultado = new double[a[b].length];
    for (int i = 0; i < a[b].length; i++) {
        resultado[i] = a[b][i];
    }
    return resultado;
}

c) Función calcularEstudiante

public static int calcularEstudiante(double[][] a) {
    if (a == null || a.length == 0)
        return -1;

    double[] medias = calcularMedias(a);
    double maxima = medias[0];
    int indice = 0; // Se inicializa a 0 para el caso de un solo estudiante

    for (int i = 1; i < medias.length; i++)
        if (medias[i] > maxima) {
            maxima = medias[i];
            indice = i;
        }

    return indice;
}

Ejercicio 14 (2015): Alcance de Variables en Java

Enunciado

Considere el siguiente código en Java. ¿Qué imprime el método main?

Código

public class Alcance {
    static int x = 1;
    static int y = 2;

    static int metodo1(int x) {
        x = 2;
        return x * x * x;
    }

    static void metodo2() {
        ++x;
    }

    static void metodo3() {
        int x = 3;
        Alcance.x = x * Alcance.x;
    }

    public static void main(String[] args) {
        int x = 1;
        metodo3();
        System.out.println("x = " + x);
        System.out.println("x = " + Alcance.x);
        metodo2();
        x = metodo1(Alcance.x);
        System.out.println("x = " + x);
        System.out.println("x = " + Alcance.x);
        Alcance.x = metodo1(x);
        System.out.println("x = " + x);
        System.out.println("x = " + Alcance.x);
    }
}

Salida del Programa

La salida que se imprime por consola es la siguiente:

x = 1
x = 3
x = 8
x = 4
x = 8
x = 8

Entradas relacionadas: