1. Contenidos
1.1 Recordatorio: ¿qué es un algoritmo?
Un algoritmo es una secuencia ordenada de pasos que permite resolver un problema. En programación, esos pasos se escriben mediante instrucciones que el ordenador puede ejecutar.
Por ejemplo, si queremos calcular el total de ventas de una semana, el algoritmo podría ser:
- Guardar las ventas de cada día.
- Crear una variable para acumular el total.
- Recorrer todas las ventas.
- Sumar cada venta al total.
- Mostrar el resultado final.
Idea importante: Muchos problemas de programación se resuelven combinando unos pocos algoritmos básicos: contar, sumar, buscar, detectar si ocurre algo, calcular máximos, mínimos o medias.
1.2 El algoritmo contador
Un contador sirve para contar cuántas veces ocurre algo. Normalmente se inicializa a 0 y se incrementa en 1 cada vez que se cumple una condición.
Ejemplo profesional: una empresa de mantenimiento quiere saber cuántos días de una semana la temperatura de una sala de servidores ha superado o igualado los 30 grados.
Ejemplo en PSeInt:
Algoritmo ContadorTemperaturas
Definir temperaturas, i, contadorAltas Como Entero
Dimension temperaturas[7]
temperaturas[1] <- 28
temperaturas[2] <- 31
temperaturas[3] <- 29
temperaturas[4] <- 32
temperaturas[5] <- 30
temperaturas[6] <- 27
temperaturas[7] <- 33
contadorAltas <- 0
Para i <- 1 Hasta 7 Con Paso 1 Hacer
Si temperaturas[i] >= 30 Entonces
contadorAltas <- contadorAltas + 1
FinSi
FinPara
Escribir "Días con temperatura alta: ", contadorAltas
FinAlgoritmo
Diagrama de Flujo
Ejemplo en Java:
public class ContadorTemperaturas {
public static void main(String[] args) {
Integer[] temperaturas = {28, 31, 29, 32, 30, 27, 33};
Integer contadorAltas = 0;
for (Integer i = 0; i < temperaturas.length; i = i + 1) {
if (temperaturas[i] >= 30) {
contadorAltas = contadorAltas + 1;
}
}
System.out.println("Días con temperatura alta: " + contadorAltas);
}
}
Patrón del contador: inicializar a 0, recorrer los datos, comprobar una condición e incrementar cuando la condición se cumple.
1.3 El algoritmo sumador
Un sumador sirve para acumular valores. Normalmente se inicializa a 0 y se le van añadiendo los datos que interesan.
Ejemplo profesional: una aplicación de facturación necesita calcular el importe total de cinco facturas pendientes.
Ejemplo en PSeInt:
Algoritmo SumadorFacturas
Definir i Como Entero
Definir facturas, total Como Real
Dimension facturas[5]
facturas[1] <- 120.50
facturas[2] <- 75.25
facturas[3] <- 310.00
facturas[4] <- 45.80
facturas[5] <- 99.99
total <- 0
Para i <- 1 Hasta 5 Con Paso 1 Hacer
total <- total + facturas[i]
FinPara
Escribir "Total pendiente de cobro: ", total
FinAlgoritmo
Diagrama de Flujo
Ejemplo en Java:
public class SumadorFacturas {
public static void main(String[] args) {
Double[] facturas = {120.50, 75.25, 310.00, 45.80, 99.99};
Double total = 0.0;
for (Integer i = 0; i < facturas.length; i = i + 1) {
total = total + facturas[i];
}
System.out.println("Total pendiente de cobro: " + total + " €");
}
}
Patrón del sumador: inicializar a 0, recorrer los datos y acumular cada valor en una variable total.
1.4 El algoritmo bandera
Una bandera es una variable booleana que indica si ha ocurrido una situación determinada. Suele comenzar en false y cambia a true cuando se detecta el caso buscado.
Ejemplo profesional: un sistema de logística quiere comprobar si existe algún pedido con retraso.
Ejemplo en PSeInt:
Algoritmo BanderaPedidos
Definir diasRetraso, i Como Entero
Definir hayRetrasos Como Logico
Dimension diasRetraso[6]
diasRetraso[1] <- 0
diasRetraso[2] <- 0
diasRetraso[3] <- 2
diasRetraso[4] <- 0
diasRetraso[5] <- 1
diasRetraso[6] <- 0
hayRetrasos <- Falso
Para i <- 1 Hasta 6 Con Paso 1 Hacer
Si diasRetraso[i] > 0 Entonces
hayRetrasos <- Verdadero
FinSi
FinPara
Si hayRetrasos Entonces
Escribir "Hay pedidos con retraso."
SiNo
Escribir "No hay pedidos con retraso."
FinSi
FinAlgoritmo
Diagrama de Flujo
Ejemplo en Java:
public class BanderaPedidos {
public static void main(String[] args) {
Integer[] diasRetraso = {0, 0, 2, 0, 1, 0};
Boolean hayRetrasos = false;
for (Integer i = 0; i < diasRetraso.length; i = i + 1) {
if (diasRetraso[i] > 0) {
hayRetrasos = true;
}
}
if (hayRetrasos) {
System.out.println("Hay pedidos con retraso.");
} else {
System.out.println("No hay pedidos con retraso.");
}
}
}
Patrón de la bandera: crear una variable booleana, inicializarla a falso y cambiarla a verdadero cuando se detecta una condición relevante.
1.5 Búsqueda de máximo o mínimo
La búsqueda de máximo o mínimo sirve para localizar el valor más alto o más bajo dentro de un conjunto de datos. Es muy habitual en informes, estadísticas, control de stock o análisis de ventas.
El procedimiento habitual consiste en tomar el primer valor como máximo o mínimo inicial y compararlo con el resto de valores.
Ejemplo profesional: una empresa agrícola quiere saber la producción máxima y mínima registrada en varias parcelas.
Ejemplo en PSeInt:
Algoritmo MaximoMinimoProduccion
Definir produccion, i, maximo, minimo Como Entero
Dimension produccion[6]
produccion[1] <- 1200
produccion[2] <- 950
produccion[3] <- 1430
produccion[4] <- 1100
produccion[5] <- 870
produccion[6] <- 1320
maximo <- produccion[1]
minimo <- produccion[1]
Para i <- 2 Hasta 6 Con Paso 1 Hacer
Si produccion[i] > maximo Entonces
maximo <- produccion[i]
FinSi
Si produccion[i] < minimo Entonces
minimo <- produccion[i]
FinSi
FinPara
Escribir "Producción máxima: ", maximo
Escribir "Producción mínima: ", minimo
FinAlgoritmo
Diagrama de Flujo
Ejemplo en Java:
public class MaximoMinimoProduccion {
public static void main(String[] args) {
Integer[] produccion = {1200, 950, 1430, 1100, 870, 1320};
Integer maximo = produccion[0];
Integer minimo = produccion[0];
for (Integer i = 1; i < produccion.length; i = i + 1) {
if (produccion[i] > maximo) {
maximo = produccion[i];
}
if (produccion[i] < minimo) {
minimo = produccion[i];
}
}
System.out.println("Producción máxima: " + maximo);
System.out.println("Producción mínima: " + minimo);
}
}
Precaución: no conviene inicializar el máximo a 0 sin pensar. Si todos los datos fueran negativos, el resultado sería incorrecto. Por eso se suele inicializar con el primer valor del conjunto de datos.
1.6 Ejemplo final: cálculo de la media de unos datos
El cálculo de la media combina dos algoritmos básicos: un sumador para obtener el total y un contador para saber cuántos datos se han procesado.
Ejemplo profesional: una aplicación de atención al cliente quiere calcular el tiempo medio de resolución de varias incidencias.
Ejemplo en PSeInt:
Algoritmo MediaIncidencias
Definir tiempos, i, contador Como Entero
Definir suma, media Como Real
Dimension tiempos[5]
tiempos[1] <- 35
tiempos[2] <- 42
tiempos[3] <- 28
tiempos[4] <- 60
tiempos[5] <- 45
suma <- 0
contador <- 0
Para i <- 1 Hasta 5 Con Paso 1 Hacer
suma <- suma + tiempos[i]
contador <- contador + 1
FinPara
Si contador > 0 Entonces
media <- suma / contador
Escribir "Tiempo medio de resolución: ", media
SiNo
Escribir "No hay datos para calcular la media."
FinSi
FinAlgoritmo
Diagrama de Flujo
Ejemplo en Java:
public class MediaIncidencias {
public static void main(String[] args) {
Integer[] tiempos = {35, 42, 28, 60, 45};
Double suma = 0.0;
Integer contador = 0;
for (Integer i = 0; i < tiempos.length; i = i + 1) {
suma = suma + tiempos[i];
contador = contador + 1;
}
if (contador > 0) {
Double media = suma / contador;
System.out.println("Tiempo medio de resolución: " + media + " minutos");
} else {
System.out.println("No hay datos para calcular la media.");
}
}
}
1.7 Combinación de algoritmos básicos
La combinación de estos algoritmos básicos permite resolver problemas complejos. En una aplicación real rara vez usamos solo un contador, solo un sumador o solo una búsqueda de máximo. Lo habitual es combinarlos para obtener información útil.
Ejemplo profesional: una empresa con varios almacenes quiere analizar una matriz de stock. Cada fila representa un almacén y cada columna representa un producto. El programa debe calcular:
- El número de productos con stock crítico.
- El total de unidades almacenadas.
- Si existe algún producto agotado.
- El stock máximo y mínimo registrado.
- La media de unidades por producto y almacén.
Ejemplo en Java con matriz:
public class AnalisisStock {
public static void main(String[] args) {
Integer[][] stock = {
{12, 4, 18, 7},
{0, 9, 5, 11},
{20, 3, 14, 6}
};
Integer umbralCritico = 5;
Integer contadorCriticos = 0;
Integer contadorDatos = 0;
Integer sumaUnidades = 0;
Boolean hayAgotados = false;
Integer maximo = stock[0][0];
Integer minimo = stock[0][0];
for (Integer fila = 0; fila < stock.length; fila = fila + 1) {
for (Integer columna = 0; columna < stock[fila].length; columna = columna + 1) {
Integer unidades = stock[fila][columna];
sumaUnidades = sumaUnidades + unidades;
contadorDatos = contadorDatos + 1;
if (unidades <= umbralCritico) {
contadorCriticos = contadorCriticos + 1;
}
if (unidades == 0) {
hayAgotados = true;
}
if (unidades > maximo) {
maximo = unidades;
}
if (unidades < minimo) {
minimo = unidades;
}
}
}
Double media = sumaUnidades.doubleValue() / contadorDatos;
System.out.println("Productos con stock crítico: " + contadorCriticos);
System.out.println("Total de unidades: " + sumaUnidades);
System.out.println("¿Hay productos agotados?: " + hayAgotados);
System.out.println("Stock máximo: " + maximo);
System.out.println("Stock mínimo: " + minimo);
System.out.println("Media de unidades: " + media);
}
}
Observa: este programa usa contador, sumador, bandera, búsqueda de máximo, búsqueda de mínimo y cálculo de media. Con algoritmos básicos bien dominados se pueden construir soluciones mucho más completas.
2. Ejercicios
2.1 Contador de pedidos urgentes
Crea un programa en Java llamado ContadorPedidosUrgentes. El programa tendrá un array de prioridades de pedidos:
String[] prioridades = {"normal", "urgente", "normal", "urgente", "baja", "urgente"};
El programa debe contar cuántos pedidos tienen prioridad urgente y mostrar el resultado final.
Pista: para comparar textos en Java utiliza equals(), por ejemplo: prioridades[i].equals("urgente").
2.2 Sumador de importes de compra
Crea un programa en Java llamado TotalCompras. El programa tendrá un array con los importes de varias compras realizadas por una empresa:
Double[] compras = {45.90, 120.00, 18.50, 240.75, 33.30};
El programa debe calcular y mostrar el importe total.
2.3 Bandera de stock agotado
Crea un programa en Java llamado StockAgotado. El programa tendrá un array con las unidades disponibles de varios productos:
Integer[] unidades = {12, 5, 0, 8, 3, 0, 15};
El programa debe indicar si existe al menos un producto agotado. Para ello, utiliza una variable bandera de tipo Boolean.
2.4 Máximo, mínimo y media de puntuaciones
Crea un programa en Java llamado EstadisticasPuntuaciones. El programa tendrá un array con puntuaciones de satisfacción de clientes:
Integer[] puntuaciones = {8, 6, 10, 7, 9, 5, 8};
El programa debe calcular y mostrar:
- La puntuación máxima.
- La puntuación mínima.
- La media de las puntuaciones.
Reto: Informe de soporte técnico
Una empresa de desarrollo de software quiere analizar las incidencias recibidas por su departamento de soporte durante una semana. Crea un programa en Java llamado InformeSoporte que trabaje con los siguientes arrays:
String[] tipos = {"consulta", "error", "error", "mejora", "error", "consulta"};
Integer[] minutosResolucion = {15, 80, 45, 30, 120, 20};
Integer[] satisfaccion = {9, 5, 7, 8, 4, 10};
El programa debe generar un informe con los siguientes datos:
- Número total de incidencias de tipo
error.
- Tiempo total dedicado a resolver incidencias.
- Tiempo medio de resolución.
- Tiempo máximo de resolución.
- Tiempo mínimo de resolución.
- Indicar si existe alguna incidencia que haya tardado más de 60 minutos.
- Calcular la media de satisfacción de los usuarios.
Pista: necesitarás combinar contador, sumador, bandera, máximo, mínimo y media. Antes de programar, escribe en papel qué variable necesitas para cada resultado.