2.1 — Algoritmos y pensamiento computacional
1. ¿Qué es programar?
Programar consiste en escribir una serie de instrucciones que un ordenador puede interpretar y ejecutar para resolver un problema o realizar una tarea.
Un programa puede ser tan sencillo como mostrar un mensaje en pantalla o tan complejo como gestionar una tienda online, controlar un robot o ejecutar un videojuego.
Antes de escribir código, debemos saber qué problema queremos resolver y qué pasos son necesarios.
2. ¿Qué es un algoritmo?
Un algoritmo es una secuencia ordenada y finita de instrucciones que permite resolver un problema.
Los algoritmos no son exclusivos de la informática. Los utilizamos continuamente en nuestra vida cotidiana.
Por ejemplo, para preparar un café:
- Preparar una taza.
- Calentar agua.
- Añadir café.
- Verter el agua.
- Remover.
- Servir.
Estas instrucciones forman un algoritmo sencillo.
Características de un algoritmo
- Debe tener un objetivo definido.
- Sus instrucciones deben ser claras.
- Los pasos deben seguir un orden lógico.
- Debe terminar después de un número finito de pasos.
- Debe producir un resultado esperado cuando recibe datos válidos.
3. Pensamiento computacional
El pensamiento computacional es una forma de analizar problemas y diseñar soluciones que pueden ser ejecutadas por una persona o un ordenador.
Se suele dividir en cuatro conceptos fundamentales.
Descomposición
Dividir un problema complejo en problemas más pequeños y sencillos.
Reconocimiento de patrones
Identificar similitudes entre problemas y soluciones conocidas.
Abstracción
Centrarse en la información importante y dejar de lado los detalles innecesarios.
Diseño de algoritmos
Establecer una secuencia de pasos para obtener la solución.
4. Representar algoritmos
Podemos representar algoritmos de diferentes maneras.
Lenguaje natural
Explicamos los pasos utilizando palabras.
Ejemplo: calcular el precio de tres productos.
- Obtener el precio de cada producto.
- Sumar los tres precios.
- Mostrar el resultado.
Pseudocódigo
El pseudocódigo utiliza una escritura parecida a un lenguaje de programación, pero sin las reglas estrictas de Java.
INICIO
precio1 = 10
precio2 = 20
precio3 = 15
total = precio1 + precio2 + precio3
MOSTRAR total
FIN
Diagrama de flujo

El algoritmo convertido a Java
public class PrimerAlgoritmo {
public static void main(String[] args) {
int precio1 = 10;
int precio2 = 20;
int precio3 = 15;
int total = precio1 + precio2 + precio3;
System.out.println("Total: " + total);
}
}
Resultado:
Total: 45
Todavía no es necesario comprender cada instrucción. Lo importante es observar que el código Java reproduce los pasos que hemos diseñado anteriormente.
5. Actividad para los alumnos
Diseña un algoritmo que calcule cuántos minutos hay en un determinado número de horas.
Primero escribe los pasos en lenguaje natural, después en pseudocódigo y finalmente intenta representarlos mediante un diagrama de flujo.
Explicar qué es un algoritmo, resolver el ejemplo de las tres compras y mostrar cómo se transforma el pseudocódigo en código Java.
2.2 — Instrucciones y flujo de ejecución
1. ¿Qué es una instrucción?
Una instrucción es una orden que escribimos en un lenguaje de programación para indicar al ordenador qué debe hacer.
En Java, muchas instrucciones terminan con punto y coma (;).
int edad = 20;
Esta instrucción declara una variable llamada edad y le asigna el valor 20.
System.out.println("Hola mundo");
Esta instrucción muestra un mensaje en la consola.
2. Estructura básica de un programa Java
public class MiPrograma {
public static void main(String[] args) {
System.out.println("Hola mundo");
}
}
Vamos a identificar sus elementos:
| Elemento | Función |
|---|---|
public class MiPrograma | Define una clase llamada MiPrograma |
{ } | Delimitan bloques de código |
public static void main(String[] args) | Método desde el que comienza la ejecución de este programa |
System.out.println() | Muestra información por consola |
; | Finaliza una instrucción |
En este momento del curso no necesitamos profundizar en los conceptos de clases, métodos o programación orientada a objetos. Los estudiaremos posteriormente.
3. Flujo secuencial
Por defecto, Java ejecuta las instrucciones de un método de forma secuencial: desde la primera hasta la última, respetando el orden escrito.
public class Secuencia {
public static void main(String[] args) {
System.out.println("Primera instrucción");
System.out.println("Segunda instrucción");
System.out.println("Tercera instrucción");
}
}

Primera instrucción
Segunda instrucción
Tercera instrucción
4. El orden de las instrucciones importa
Observa este ejemplo:
int numero = 10;
System.out.println(numero);
numero = 25;
System.out.println(numero);
Resultado:
10
25
La primera salida muestra 10 porque todavía no se ha modificado la variable.
La segunda salida muestra 25 porque hemos cambiado su contenido.
5. Operaciones aritméticas básicas
Java permite realizar operaciones matemáticas utilizando operadores.
| Operador | Operación | Ejemplo | Resultado |
|---|---|---|---|
+ | Suma | 10 + 5 | 15 |
- | Resta | 10 - 5 | 5 |
* | Multiplicación | 10 * 5 | 50 |
/ | División | 10 / 5 | 2 |
% | Resto | 10 % 3 | 1 |
Ejemplo:
int a = 10;
int b = 3;
System.out.println(a + b);
System.out.println(a - b);
System.out.println(a * b);
System.out.println(a / b);
System.out.println(a % b);
Resultado:
13
7
30
3
1
Observa que 10 / 3 produce 3, no 3.3333. Esto ocurre porque ambos operandos son enteros. Veremos este comportamiento con más detalle al estudiar los tipos de datos.
6. Actividad
Crea un programa llamado OperacionesBasicas que declare dos números y muestre su suma, resta, multiplicación y división.
Antes de ejecutarlo, escribe en papel qué resultados esperas obtener.
2.3 — Datos, memoria y variables
1. ¿Qué es una variable?
Una variable es un elemento identificado por un nombre que utilizamos para almacenar y manejar un valor durante la ejecución de un programa.
Por ejemplo:
int edad = 25;
Esta instrucción significa:
int: tipo de dato.edad: nombre de la variable.=: operador de asignación.25: valor que se almacena.
2. Comprender las variables visualmente
REPRESENTACIÓN CONCEPTUAL DE UNA VARIABLE

La variable conserva su nombre, pero su valor puede cambiar.
Esta es una representación simplificada para aprender. La organización real de la memoria de Java depende de la JVM y del tipo de dato.
3. Declaración, inicialización y asignación
Declaración
int edad;
Creamos una variable local, pero todavía no le hemos asignado un valor.
Inicialización
edad = 20;
Le asignamos su primer valor.
Declaración e inicialización juntas
int edad = 20;
Modificación del valor
edad = 30;
No escribimos int nuevamente porque la variable ya está declarada.
4. Ejemplo práctico
public class Variables {
public static void main(String[] args) {
int vidas = 3;
System.out.println("Vidas iniciales: " + vidas);
vidas = vidas - 1;
System.out.println("Vidas restantes: " + vidas);
vidas = vidas + 2;
System.out.println("Vidas finales: " + vidas);
}
}
Resultado:
Vidas iniciales: 3
Vidas restantes: 2
Vidas finales: 4
5. Reglas para nombrar variables
En Java debemos respetar ciertas reglas:
- No pueden comenzar por un número.
- No pueden contener espacios.
- No pueden utilizar palabras reservadas como
classoint. - Distinguen entre mayúsculas y minúsculas.
- Pueden contener letras, números,
_y$, aunque estos dos últimos caracteres no suelen utilizarse en nombres normales.
Además, se recomienda utilizar la convención camelCase.
int edadAlumno = 20;
double precioProducto = 15.50;
int numeroDeIntentos = 3;
Evita nombres que no expliquen su significado:
int x = 20;
int a1 = 15;
6. Actividad
Crea un programa para un videojuego que tenga las variables nombreJugador, vidas, puntuacion y nivel.
Asigna valores iniciales, muestra el estado del jugador y modifica su puntuación y sus vidas.
2.4 — Tipos de datos primitivos en Java
Java es un lenguaje de tipado estático. Esto significa que cada variable tiene un tipo definido que determina qué valores puede almacenar y qué operaciones admite.
1. Los ocho tipos primitivos
| Tipo | Tamaño | Uso habitual |
|---|---|---|
byte | 8 bits | Enteros pequeños |
short | 16 bits | Enteros de rango reducido |
int | 32 bits | Enteros habituales |
long | 64 bits | Enteros grandes |
float | 32 bits | Decimales de precisión simple |
double | 64 bits | Decimales de precisión doble |
char | 16 bits | Unidad de código UTF-16 |
boolean | No fijado en bytes por Java | Valores true o false |
2. Números enteros
byte edad = 20;
short temperatura = -150;
int habitantes = 500000;
long distancia = 9000000000L;
La letra L indica que el literal numérico es de tipo long.
Para la mayoría de los ejercicios iniciales utilizaremos int.
3. Números decimales
float altura = 1.75f;
double precio = 19.99;
La letra f indica que el literal decimal es de tipo float.
Habitualmente utilizaremos double para los cálculos decimales de aprendizaje. Para cantidades monetarias que exijan exactitud decimal, Java dispone de BigDecimal, que veremos en un nivel posterior.
4. Caracteres
char letra = 'A';
char respuesta = 'S';
Los caracteres se escriben entre comillas simples.
5. Booleanos
boolean encendido = true;
boolean terminado = false;
Solo admiten los valores true y false.
6. ¿Y String?
Aunque lo utilizamos constantemente, String no es un tipo primitivo, sino una clase de Java que representa cadenas de texto.
String nombre = "Carlos";
String ciudad = "Madrid";
La diferencia entre char y String es importante:
char inicial = 'C';
String nombre = "Carlos";
7. Programa de ejemplo
public class TiposDatos {
public static void main(String[] args) {
String nombre = "Laura";
int edad = 19;
double altura = 1.68;
char grupo = 'A';
boolean matriculado = true;
System.out.println("Nombre: " + nombre);
System.out.println("Edad: " + edad);
System.out.println("Altura: " + altura);
System.out.println("Grupo: " + grupo);
System.out.println("Matriculado: " + matriculado);
}
}
8. Actividad
Representa los datos de un ordenador mediante variables: fabricante, memoria RAM en GB, precio, letra de unidad y estado de encendido.
Escoge el tipo adecuado para cada dato.
2.5 — Constantes
1. ¿Qué es una constante?
En programación llamamos constante a un valor que no debe cambiar durante la ejecución.
En Java utilizamos la palabra reservada final para impedir que una variable reciba otra asignación después de inicializarse.
final double IVA = 0.21;
Si intentamos modificarla:
IVA = 0.10;
Eclipse mostrará un error de compilación.
2. ¿Por qué utilizar constantes?
Las constantes permiten evitar números repetidos en el código y facilitan su mantenimiento.
Ejemplo:
public class CalcularIVA {
public static void main(String[] args) {
final double IVA = 0.21;
double precio = 100;
double impuesto = precio * IVA;
double total = precio + impuesto;
System.out.println("Precio: " + precio);
System.out.println("IVA: " + impuesto);
System.out.println("Total: " + total);
}
}
Resultado:
Precio: 100.0
IVA: 21.0
Total: 121.0
Por convención, los nombres de constantes suelen escribirse en mayúsculas, separando las palabras mediante guiones bajos.
final int MAX_INTENTOS = 3;
final double DESCUENTO_MAXIMO = 0.25;
3. Actividad
Crea un programa que calcule el área de un círculo utilizando una constante PI y una variable radio.
Fórmula:

2.6 — Conversión de tipos
1. ¿Qué significa convertir un dato?
Convertir un tipo consiste en transformar un valor para utilizarlo como otro tipo de dato.
En Java existen conversiones automáticas y conversiones explícitas.
2. Conversión automática
Java puede realizar algunas conversiones cuando el tipo de destino admite el tipo de origen.
int numero = 25;
double decimal = numero;
System.out.println(decimal);
Resultado:
25.0
Aunque estas conversiones están permitidas, no todas garantizan conservar exactamente el valor. Por ejemplo, convertir un long muy grande a float puede perder precisión.
3. Conversión explícita o casting
Para realizar determinadas conversiones debemos indicar el tipo deseado.
double precio = 19.95;
int entero = (int) precio;
System.out.println(entero);
Resultado:
19
El casting a int elimina la parte decimal. No redondea.
4. División de enteros y decimales
int a = 10;
int b = 4;
double resultado1 = a / b;
double resultado2 = (double) a / b;
System.out.println(resultado1);
System.out.println(resultado2);
Resultado:
2.0
2.5
En la primera división, Java opera con enteros y después convierte el resultado a double.
En la segunda, convertimos uno de los operandos antes de realizar la división.
5. Convertir texto en números
Es frecuente recibir datos como texto y necesitar transformarlos.
String texto = "125";
int numero = Integer.parseInt(texto);
System.out.println(numero + 10);
Resultado:
135
Para números decimales:
String texto = "12.5";
double numero = Double.parseDouble(texto);
Si el texto no representa un número válido, Java lanzará una excepción NumberFormatException.
6. Convertir números en texto
int edad = 25;
String texto = String.valueOf(edad);
7. Actividad
Declara dos variables enteras, divide una entre otra y muestra la diferencia entre la división entera y la división decimal.
2.7 — Salida de datos por consola
La consola permite mostrar información durante la ejecución de nuestros programas.
En Eclipse aparece normalmente en la vista Console.
1. System.out.print()
Muestra información sin añadir un salto de línea al final.
System.out.print("Hola ");
System.out.print("mundo");
Resultado:
Hola mundo
2. System.out.println()
Muestra información y añade un salto de línea.
System.out.println("Hola");
System.out.println("Mundo");
Resultado:
Hola
Mundo
3. System.out.printf()
Permite mostrar información con un formato determinado.
String nombre = "Ana";
int edad = 20;
double nota = 8.75;
System.out.printf(
"Nombre: %s, Edad: %d, Nota: %.2f%n",
nombre, edad, nota
);
Especificadores habituales:
| Especificador | Significado |
|---|---|
%s | Texto |
%d | Entero |
%f | Decimal |
%.2f | Decimal con dos posiciones |
%n | Salto de línea |
El separador decimal mostrado por printf depende de la configuración regional del entorno.
4. Secuencias de escape
System.out.println("Primera línea\nSegunda línea");
System.out.println("Nombre:\tCarlos");
System.out.println("Mensaje: \"Hola\"");
System.out.println("Ruta: C:\\Java");
| Secuencia | Función |
|---|---|
\n | Salto de línea |
\t | Tabulación |
\" | Comillas dobles |
\\ | Barra invertida |
5. Actividad
Crea un programa que muestre una factura sencilla con el nombre del producto, precio, cantidad y total.
Utiliza printf para mostrar los importes con dos decimales.
2.8 — Entrada de datos por teclado con Scanner
Hasta ahora hemos trabajado con datos escritos directamente en el código.
Pero un programa resulta mucho más interesante cuando puede solicitar información al usuario.
Para ello utilizaremos la clase Scanner.
1. Importar Scanner
import java.util.Scanner;
Esta instrucción debe escribirse antes de la declaración de la clase.
2. Crear un Scanner
Scanner teclado = new Scanner(System.in);
Este objeto nos permite leer información introducida desde la entrada estándar.
3. Leer un número entero
import java.util.Scanner;
public class LeerEdad {
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
System.out.print("Introduce tu edad: ");
int edad = teclado.nextInt();
System.out.println("Tienes " + edad + " años");
teclado.close();
}
}
4. Métodos principales
| Método | Qué lee |
|---|---|
nextInt() | Un entero |
nextDouble() | Un decimal |
nextFloat() | Un float |
next() | Una palabra |
nextLine() | Una línea completa |
nextBoolean() | Un booleano |
5. Leer texto
Scanner teclado = new Scanner(System.in);
System.out.print("Introduce tu nombre: ");
String nombre = teclado.nextLine();
System.out.println("Hola " + nombre);
teclado.close();
6. Leer varios datos
import java.util.Scanner;
public class DatosAlumno {
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
System.out.print("Edad: ");
int edad = teclado.nextInt();
System.out.print("Nota: ");
double nota = teclado.nextDouble();
System.out.println("----- DATOS -----");
System.out.println("Nombre: " + nombre);
System.out.println("Edad: " + edad);
System.out.println("Nota: " + nota);
teclado.close();
}
}
nextDouble() interpreta el separador decimal según la configuración regional del Scanner. En un entorno español puede esperar una coma en lugar de un punto.
7. Problema frecuente: nextInt() y nextLine()
Observa este código:
int edad = teclado.nextInt();
String nombre = teclado.nextLine();
Puede ocurrir que nextLine() lea el salto de línea que quedó pendiente tras introducir la edad, en lugar de esperar un nombre.
Una solución sencilla es consumir ese salto de línea:
int edad = teclado.nextInt();
teclado.nextLine(); // Consumir el salto de línea pendiente
String nombre = teclado.nextLine();
Otra opción es leer todos los datos mediante nextLine() y convertir los valores numéricos con Integer.parseInt() o Double.parseDouble().
8. Actividad
Crea un programa que solicite el nombre del alumno y tres notas de examen.
El programa debe calcular y mostrar la nota media.
Vídeo propuesto — 2.8
12–15 min
Demostración en Eclipse: crear un proyecto, importar Scanner, leer datos de distintos tipos, calcular una media y solucionar el problema del salto de línea pendiente.
2.9 — Comentarios y buenas prácticas iniciales
1. ¿Qué son los comentarios?
Los comentarios permiten añadir explicaciones al código fuente. El compilador los ignora.
Comentario de una línea
// Declaramos la edad del alumno
int edad = 20;
Comentario de varias líneas
/*
Este programa calcula
el precio total de una compra.
*/
Comentarios de documentación
Java también dispone de comentarios Javadoc.
/**
* Programa de ejemplo para calcular una suma.
*/
public class Suma {
}
2. Buenas prácticas
Un programa no solo debe funcionar: también debe ser fácil de leer, comprender y mantener.
Recomendaciones iniciales:
- Utilizar nombres descriptivos.
- Mantener una indentación uniforme.
- Evitar instrucciones innecesariamente largas.
- Dejar espacios alrededor de operadores.
- Comentar el propósito de operaciones que no resulten evidentes.
- No repetir código sin necesidad.
- Utilizar constantes para valores fijos significativos.
- Probar los programas con diferentes datos.
Código poco legible
int a=10;int b=20;int c=a+b;System.out.println(c);
Código mejor organizado
int primerNumero = 10;
int segundoNumero = 20;
int suma = primerNumero + segundoNumero;
System.out.println("Resultado: " + suma);
3. Formatear código en Eclipse
Eclipse dispone de una función para organizar automáticamente la indentación y el formato del código.
Ctrl + Shift + F
Windows y Linux
⌘ + Shift + F
macOS, con atajos predeterminados
También puede accederse desde el menú Source → Format.
4. Actividad
Reescribe el siguiente código aplicando las buenas prácticas explicadas.
public class prueba{
public static void main(String[]args){
int a=5;int b=8;int c=a*b;
System.out.println(c);
}}
2.10 — Errores comunes al empezar a programar
Al aprender programación es normal cometer errores. Lo importante es aprender a identificarlos, comprender sus causas y corregirlos.
1. Tipos de errores
Errores de compilación
Impiden que Java compile el programa.
int edad = 20
Falta el punto y coma.
Errores de ejecución
Aparecen mientras el programa está funcionando.
int numero = 10;
int divisor = 0;
System.out.println(numero / divisor);
Provoca una ArithmeticException porque intentamos dividir un entero entre cero.
Errores lógicos
El programa se ejecuta, pero produce un resultado incorrecto.
int precio = 100;
int descuento = 20;
int total = precio + descuento;
Si queremos aplicar un descuento, deberíamos restarlo, no sumarlo.
2. Errores frecuentes
| Error | Causa habitual |
|---|---|
cannot find symbol | Nombre incorrecto o elemento no declarado |
Syntax error | Error en la sintaxis |
Type mismatch | Tipos incompatibles |
NumberFormatException | Texto que no puede convertirse al número solicitado |
InputMismatchException | Entrada incompatible con lo esperado por Scanner |
ArithmeticException | Operación aritmética no válida, como división entera entre cero |
3. Java distingue mayúsculas y minúsculas
int edad = 20;
System.out.println(Edad);
Este código produce un error porque edad y Edad son identificadores distintos.
4. Confundir = con ==
El operador = sirve para asignar valores.
int numero = 10;
El operador == sirve para comparar valores.
System.out.println(numero == 10);
Resultado:
true
Estudiaremos las comparaciones con mayor profundidad en el bloque de estructuras condicionales.
5. Aprender a depurar con Eclipse
Eclipse permite ejecutar programas paso a paso utilizando el depurador.
Procedimiento básico:
- Abrir el archivo Java.
- Hacer doble clic en el margen izquierdo junto a una instrucción para colocar un breakpoint.
- Seleccionar
Debug As → Java Application. - Observar cómo se detiene la ejecución.
- Utilizar
Step Overpara avanzar instrucción por instrucción. - Examinar los valores de las variables en la vista
Variables.
Vídeo propuesto — 2.10
10–12 min
Provocar varios errores intencionadamente, explicar los mensajes de Eclipse y demostrar cómo utilizar breakpoints y la vista de variables.
Proyecto práctico final del Bloque 2
Mi primer programa interactivo: ficha de un videojuego
El objetivo es crear una pequeña aplicación de consola utilizando los conocimientos adquiridos durante el bloque.
Requisitos
El programa debe solicitar:
- Nombre del videojuego.
- Nombre del jugador.
- Precio del videojuego.
- Número de unidades que desea comprar.
- Edad del jugador.
El programa calculará el importe total de la compra, aplicará un IVA constante del 21 % (suponiendo que el precio introducido no lo incluye) y mostrará una ficha con los datos y resultados.
Ejemplo de ejecución
===== TIENDA DE VIDEOJUEGOS =====
Nombre del juego: Minecraft
Nombre del jugador: Carlos
Precio del juego: 25
Unidades: 2
Edad del jugador: 19
========== RESUMEN ==========
Juego: Minecraft
Jugador: Carlos
Edad: 19
Precio unitario: 25.00
Unidades: 2
Subtotal: 50.00
IVA (21%): 10.50
Total: 60.50
Solución de referencia
import java.util.Scanner;
public class TiendaVideojuegos {
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
final double IVA = 0.21;
System.out.println("===== TIENDA DE VIDEOJUEGOS =====");
System.out.print("Nombre del juego: ");
String juego = teclado.nextLine();
System.out.print("Nombre del jugador: ");
String jugador = teclado.nextLine();
System.out.print("Precio del juego: ");
double precio = Double.parseDouble(teclado.nextLine());
System.out.print("Unidades: ");
int unidades = Integer.parseInt(teclado.nextLine());
System.out.print("Edad del jugador: ");
int edad = Integer.parseInt(teclado.nextLine());
// Calculamos los importes
double subtotal = precio * unidades;
double impuesto = subtotal * IVA;
double total = subtotal + impuesto;
// Mostramos el resumen
System.out.println();
System.out.println("========== RESUMEN ==========");
System.out.println("Juego: " + juego);
System.out.println("Jugador: " + jugador);
System.out.println("Edad: " + edad);
System.out.printf("Precio unitario: %.2f%n", precio);
System.out.println("Unidades: " + unidades);
System.out.printf("Subtotal: %.2f%n", subtotal);
System.out.printf("IVA (21%%): %.2f%n", impuesto);
System.out.printf("Total: %.2f%n", total);
teclado.close();
}
}
Para esta primera versión, se supone que el usuario introduce números válidos y cantidades positivas. La validación de entradas se incorporará en los siguientes bloques.



















