5. Arrays unidimensionales
UD2 — Control de Flujo y Depuración · RA3 — Escribe y depura código, analizando y utilizando las estructuras de control del lenguaje
| Aspecto | Valor |
|---|---|
| Resultado de aprendizaje | RA: 3 — Escribe y depura código, analizando y utilizando las estructuras de control del lenguaje. |
| Criterios de evaluación a los que contribuye esta sección | CE 3.5 (crea programas ejecutables combinando estructuras de control y datos compuestos) CE 3.7 (comenta y documenta el código). |
| Marco normativo | RD 405/2023 · RD 450/2010 · RD 659/2023 |
| Tecnología base | Java 25 LTS (OpenJDK Temurin 25) — soporte hasta 2030+ |
| Horas estimadas | ~3 h (de las 30 h de la UD2). |
Requisitos previos (lo que ya sabes): condiciones booleanas y operadores lógicos (sección 1 de UD2);
if/else if/else, early return, validación conIO.readln;switchexpression con flecha y múltiples etiquetas (sección 3 de UD2);whileydo-while(sección 4 de UD2). Tipos primitivos,var,String(con.equals(),.equalsIgnoreCase(),.length(),.trim(),.toLowerCase(),.charAt()),text blocks,finalpara constantes y operador ternario (de UD1). Método estático comoMath.sqrt()oInteger.parseInt()(de UD1): aquí verás más métodos estáticos, los dejava.util.Arrays.
5.1 ¿De qué va esta sección? — Un solo nombre para muchos datos
Hasta ahora, todas tus variables eran simples: una int edad, un String nombre, un double precio. Cada variable contenía un solo valor. Eso está bien para muchos programas, pero hay un momento en que no basta.
Imagina que quieres guardar las 5 notas de un alumno, los 7 días de la semana, o los 30 alumnos de una clase. Si tuvieras que declarar nota1, nota2, nota3, nota4, nota5... te volverías loco. Y peor aún: ¿qué pasa si son 100 notas? ¿Y si el número lo decide el usuario en tiempo de ejecución?
Para eso existen los arrays (también llamados "arreglos" o "vectores" en español): un tipo compuesto que permite guardar varios valores del mismo tipo bajo un solo nombre, accesibles por su posición. Java los tiene desde la versión 1.0, son el tipo compuesto más básico del lenguaje, y son la base sobre la que se construyen todas las colecciones modernas (que verás en UD6).
En esta sección vas a aprender el tipo array en sí: cómo se declara, cómo se inicializa y cómo se accede a sus elementos. No verás todavía cómo recorrerlos con un bucle: eso es contenido de la sección 6, donde se introduce el for clásico, la herramienta natural para recorrer arrays. Aquí nos limitamos a la estructura de datos: crearla, llenarla y consultar elementos sueltos.
Cubriremos, en este orden:
- Qué es un array y sus tres propiedades clave.
- Declaración e inicialización: con valores literales y con tamaño fijo.
.lengthy acceso por índice (lectura y escritura).- Valores por defecto en arrays.
- Tipos de arrays:
int[],double[],String[],char[],boolean[]. String.toCharArray()como puente entreStringychar[].- Operaciones básicas con elementos sueltos (sin recorrido): lectura, escritura, swap.
- Pequeños recorridos con
while(el bucle que ya conoces de la sección 4) para inicializar arrays pidiendo datos al usuario. - Trampas clásicas con arrays.
- Ejemplos resueltos paso a paso.
Analogía del archivador
Piensa en una variable simple como una carpeta con un folio dentro: solo cabe un dato. Un array es como un archivador con varias carpetas etiquetadas por número: carpeta 0, carpeta 1, carpeta 2... Cada carpeta contiene un dato, pero todas comparten el mismo "apellido" (el nombre del array). Para referirte a un dato, dices el nombre del archivador y el número de carpeta: notas[3] es "el dato de la carpeta 3 del archivador notas".
Vamos a empezar por definir qué es un array con precisión.
5.2 ¿Qué es un array? Sus tres propiedades clave
Un array es una secuencia fija de elementos del mismo tipo, almacenados contiguamente en memoria y accesibles por un índice numérico que empieza en 0. De esa definición se desprenden tres propiedades clave que vas a recordar toda tu vida como programador:
5.2.1 Propiedad 1: tamaño fijo
Una vez creado un array, no se puede cambiar su tamaño. Si declaras int[] nums = new int[5], ese array tendrá 5 elementos para siempre: no se puede ampliar a 6 ni reducir a 4. Si necesitas más tamaño, tienes que crear un array nuevo y copiar los elementos (lo verás en la sección 6 con Arrays.copyOf).
Si necesitas una estructura que crezca o encoja dinámicamente, espera a UD6: las colecciones (ArrayList, LinkedList) hacen exactamente eso. Pero los arrays son fijos.
5.2.2 Propiedad 2: mismo tipo
Todos los elementos de un array son del mismo tipo. Si declaras int[] nums, los 5 elementos son int. No puedes mezclar: no puedes tener nums[0] = 5 y nums[1] = "hola". El compilador te da error.
Si necesitas mezclar tipos, normalmente no es un array lo que necesitas: es una clase (lo verás en UD4) o un Object[] con pattern matching (UD7).
5.2.3 Propiedad 3: índice desde 0
Los elementos se acceden por un índice numérico que empieza en 0. El primer elemento es arr[0], el segundo es arr[1], el tercero es arr[2], etc. El último es arr[arr.length - 1].
flowchart LR
subgraph Array ["int[] nums = {10, 20, 30, 40, 50}"]
P0["nums[0] = 10"]
P1["nums[1] = 20"]
P2["nums[2] = 30"]
P3["nums[3] = 40"]
P4["nums[4] = 50"]
end
Esta convención "índice desde 0" es universal en programación (no solo en Java: C, C++, Python, JavaScript, C#, todos la usan). ¿Por qué? Porque el índice es en realidad un desplazamiento desde el inicio del array: arr[0] está a 0 posiciones del inicio, arr[1] a 1 posición, arr[2] a 2 posiciones... Es una decisión histórica que viene del lenguaje C y que se ha mantenido por eficiencia.
Cuidado con el último índice
El último índice válido de un array de 5 elementos es 4, no 5. Intentar acceder a nums[5] lanza ArrayIndexOutOfBoundsException. Verás cómo manejar esa excepción en la sección 9; por ahora, simplemente recuerda: índices válidos van de 0 a array.length - 1.
5.2.4 Representación visual
Un array de 5 enteros se suele representar así:
- La fila de arriba son los valores almacenados.
- La fila de abajo son los índices (de 0 a 4).
- El array tiene
length = 5(5 elementos).
Memoriza esta imagen: cuando pienses en un array, dibújalo mentalmente así.
5.3 Declaración e inicialización
5.3.1 Forma 1: con valores literales (la más simple)
La forma más simple de crear un array es declararlo con los valores entre llaves:
Sintaxis:
Tipo[]indica "array de Tipo". Los corchetes pueden ir después del tipo o después del nombre (Tipo nombre[]), pero la convención en Java es ponerlos después del tipo:int[] nums, noint nums[].{ ... }contiene los valores separados por comas. Java cuenta cuántos hay y crea el array con ese tamaño automáticamente.
5.3.2 Forma 2: con tamaño fijo (sin valores iniciales)
Si no sabes los valores iniciales (porque los vas a pedir al usuario o a calcular), declaras el array con un tamaño fijo usando new:
Sintaxis:
new Tipo[tamaño]reserva espacio paratamañoelementos.- Los elementos se inicializan al valor por defecto del tipo (ver sección 5.5).
- Después puedes asignar valores a cada posición:
edades[0] = 25; edades[1] = 30; ....
5.3.3 Forma 3: declarar y luego inicializar (en dos pasos)
También puedes declarar primero y asignar después, pero hay un detalle: cuando asignas después, la sintaxis con { } ya no funciona directamente; tienes que usar new:
Esta tercera forma es menos habitual y la verás sobre todo cuando un método devuelve un array. Por ahora, quédate con las dos primeras: declarar con valores literales ({ ... }) si los conoces, o con new Tipo[n] si no.
5.3.4 ¿Cuándo usar cada forma?
| Situación | Forma recomendada |
|---|---|
| Conoces los valores iniciales (constantes). | Tipo[] arr = { v1, v2, v3 }; |
| No los conoces, pero sabes cuántos necesitas. | Tipo[] arr = new Tipo[n]; + asignación posterior |
| No los conoces y el tamaño depende de cálculos. | Calcula el tamaño, luego new Tipo[tamaño]; |
| El método recibe el array como parámetro y solo lo declara. | Tipo[] arr; (declarar sin inicializar) |
En la mayoría de ejercicios de esta sección usaremos la forma 1 (con valores literales) para que el código sea claro. La forma 2 la usarás cuando pidas datos al usuario: preguntas cuántos elementos, creas el array con new Tipo[n], y vas rellenando (en la sección 5.8 verás cómo hacerlo con un while).
5.4 .length y acceso por índice
5.4.1 .length: cuántos elementos tiene
Cada array tiene un campo llamado .length (¡sin paréntesis!) que indica cuántos elementos contiene:
.length es un campo, no un método. Por eso no lleva paréntesis. Esta es la diferencia más comúnmente confundida con String.length(), que sí lleva paréntesis porque es un método.
| Tipo | Sintaxis | Paréntesis |
|---|---|---|
| Array | arr.length |
Sin paréntesis (es un campo público). |
String |
s.length() |
Con paréntesis (es un método). |
Memoriza esta diferencia: array → length, String → length(). Te la vas a encontrar miles de veces.
5.4.2 Acceso por índice: lectura y escritura
Para leer o escribir un elemento concreto, usa array[indice]:
Detalles:
primos[0]accede al primer elemento (índice 0).primos.length - 1es el truco estándar para el último elemento. Memorízalo.primos[0] = 13es escritura: modifica el valor de esa posición.
5.4.3 Trampas con el índice
Los índices válidos van de 0 a array.length - 1. Cualquier índice fuera de ese rango lanza ArrayIndexOutOfBoundsException (una excepción que verás cómo manejar en la sección 9; por ahora, si la ves, es que te has salido del rango).
Por qué el índice máximo es length - 1
Si el array tiene 5 elementos, sus índices son 0, 1, 2, 3, 4 (cinco índices). El máximo índice es 4, que es length - 1 = 5 - 1 = 4. Es una aritmética simple, pero fácil de confundir cuando vas rápido.
5.4.4 Modificar un elemento concreto
Modificar un elemento suelto no requiere ningún bucle: solo accedes por índice y asignas. Es la operación más básica con arrays.
5.4.5 Swap: intercambiar dos elementos
El swap (intercambiar dos valores) es un patrón clásico que usa una variable temp para no perder el valor:
Paso a paso del swap:
temp = arr[0]guarda el valor original dearr[0](10).arr[0] = arr[4]sobrescribearr[0]con el valor dearr[4](50).arr[4] = temppone enarr[4]el valor original (10).
Sin temp, al hacer arr[0] = arr[4] perderías el valor original de arr[0] y no podrías usarlo después. Lo verás mucho en algoritmos de ordenación (UD6).
5.4.6 Acceso por índice calculado
El índice puede ser cualquier expresión que devuelva un int, no solo un literal:
Esto te da mucha flexibilidad: puedes pedir al usuario la posición que quiere consultar, calcular índices con expresiones, etc.
5.5 Valores por defecto en arrays
Cuando creas un array con new Tipo[n], Java inicializa los elementos al valor por defecto del tipo:
| Tipo de elementos | Valor por defecto |
|---|---|
int, long, short, byte |
0 |
double, float |
0.0 |
boolean |
false |
char |
'\u0000' (carácter nulo, invisible) |
String y cualquier objeto |
null |
5.5.1 Ejemplo práctico
Esto es útil porque significa que no tienes que inicializar todos los elementos a mano: el array ya viene "preparado" con valores razonables para tipos primitivos.
5.5.2 Trampa con null en arrays de String
Si creas String[] palabras = new String[5], los 5 elementos son null, no "". Llamar a palabras[0].length() lanza NullPointerException porque estás llamando a un método sobre null.
Solución: si necesitas strings vacíos en vez de null, los inicializas uno a uno (verás cómo hacerlo con un while en la sección 5.8) o declaras con valores literales desde el principio si los conoces.
5.5.3 Diferencia entre array vacío y array null
Hay dos formas distintas de "no tener elementos":
- Un array vacío (
{}onew int[0]) es un array legítimo con 0 elementos. Si accedes avacio.lengthte da0. No da error (aunque obviamente no puedes acceder avacio[0]). - Un array
nullno es un array: es una variable que apunta a "nada". Intentar acceder anulo.lengtho anulo[0]lanzaNullPointerException.
Esta distinción es importante: si recibes un array como parámetro y puede ser null, comprueba antes de usarlo:
5.6 Tipos de arrays
Puedes declarar arrays de cualquier tipo. Veamos los más comunes.
5.6.1 Arrays de tipos primitivos
Cada tipo primitivo tiene su propia sintaxis de array. Los valores literales de cada tipo siguen las mismas reglas que ya viste en UD1: sufijo L para long, sufijo f para float, etc.
5.6.2 Array de String
Un String[] es un array de referencias a objetos String. Cada elemento es una referencia (no el objeto directamente). Esto significa que:
- Si no inicializas el array con
new, los elementos sonnull(ver 5.5.2). - Los elementos
Stringson inmutables: no puedes cambiar el contenido de unString, pero sí reemplazarlo por otro (arr[i] = arr[i].toUpperCase();).
5.6.3 Array de char
Los arrays de char son especialmente útiles porque son la "materia prima" para procesar texto carácter a carácter (ver 5.7).
5.6.4 Tabla resumen
| Tipo | Sintaxis | Ejemplo |
|---|---|---|
int |
int[] |
{1, 2, 3} |
double |
double[] |
{1.5, 2.5} |
boolean |
boolean[] |
{true, false} |
char |
char[] |
{'a', 'b'} |
String |
String[] |
{"Ana", "Juan"} |
| Cualquier otro | Tipo[] |
Depende del tipo |
La regla general: pon corchetes después del tipo para indicar que es un array.
5.7 String.toCharArray(): el puente entre String y char[]
Hay un caso especial muy útil: cuando quieres trabajar con los caracteres de un String como si fueran un array. Aquí surge un pequeño problema:
String no es un array de caracteres desde el punto de vista de Java. No puedes escribir texto[0] para obtener el primer carácter de un String; tienes que usar el método charAt(0):
Y para convertir un String en un array de caracteres, usas toCharArray():
5.7.1 ¿Por qué usar toCharArray()?
Porque los arrays de char son más cómodos de manejar cuando quieres:
- Acceder a caracteres por índice (
letras[i]). - Modificar caracteres (los
Stringson inmutables; loschar[]no). - Aplicar algoritmos de búsqueda o conteo sobre los caracteres (en la sección 6 verás cómo recorrerlos con
for).
5.7.2 Ejemplo: consultar caracteres sueltos
Aquí accedemos a elementos sueltos sin recorrer todo el array. Cuando veas el for clásico en la sección 6, podrás pasar por todos ellos en bucle.
5.7.3 charAt(i) como alternativa sin crear array
charAt(i) te devuelve el carácter en la posición i sin crear un array nuevo. Es más eficiente en memoria. En la sección 6 verás cómo combinar charAt con un for para recorrer el String directamente sin convertirlo.
5.8 Pequeños recorridos con while
Aunque el recorrido completo de arrays se ve en la sección 6 con for clásico, hay un caso donde necesitas un bucle ahora mismo: cuando pides datos al usuario para rellenar un array. Vamos a verlo con while (el bucle que ya conoces de la sección 4).
5.8.1 Patrón: pedir N datos y guardarlos en un array
Salida de ejemplo:
Detalles importantes:
int i = 0se declara fuera delwhileporque elwhileno tiene inicialización propia (a diferencia delfor, que verás en la sección 6).i < nombres.lengthes la condición: seguimos mientrasisea menor que el tamaño del array. Es<, no<=(la trampa nº 1 con arrays, ya la verás en la sección 6).nombres[i] = IO.readln().trim()guarda la entrada del usuario en la posiciónidel array.i++al final del cuerpo: obligatorio. Si lo olvidas, el bucle se queda colgado eni = 0para siempre (bucle infinito).i + 1al mostrar el mensaje: como los índices empiezan en 0, sumamos 1 para que el usuario vea "1, 2, 3..." (no "0, 1, 2...").
5.8.2 Ejemplo: pedir 5 edades con while
Salida de ejemplo:
Puntos clave:
- Dos
whiledistintos: uno para pedir datos, otro para sumarlos. Cada uno tiene su propio índice (iyj). En la sección 6 verás cómo elforclásico simplifica esto. edades[0]yedades[edades.length - 1]para acceder al primero y al último sin recorrer todo el array.
5.9 Errores típicos con arrays
Antes de pasar a los ejemplos, repasamos las trampas más típicas.
5.9.1 length con paréntesis
Solución: memoriza array → length, String → length().
5.9.2 índice fuera de rango
Solución: los índices válidos van de 0 a array.length - 1. Antes de acceder a arr[i], asegúrate de que i está en ese rango.
5.9.3 array null vs array vacío
Si accedes a nulo.length o nulo[0], se lanza NullPointerException. Antes de usar un array que puede ser null, comprueba:
5.9.4 null en arrays de String
Los arrays de String inicializados con new tienen null en cada posición, no "". Antes de usar un elemento, comprueba o inicializa a "".
5.9.5 olvidar i++ en el while al recorrer un array
Solución: siempre que uses while con un índice, asegúrate de incrementar el índice en algún punto del cuerpo. Si no, bucle infinito. Esta trampa desaparece con el for clásico de la sección 6, porque la actualización va en la propia cabecera del for y no puedes olvidarla.
5.9.6 intentar imprimir un array directamente
Si imprimes un array con IO.println(arr), verás algo como [I@1b6d3586 (para int[]) o [Ljava.lang.String;@1540e19d (para String[]). Eso es la representación por defecto del objeto array, no sus contenidos.
Solución temporal (sección 5): imprime los elementos sueltos:
Solución definitiva (sección 6): Arrays.toString(arr) te da [1, 2, 3] en una sola línea. La verás en la sección 6 con las utilidades de java.util.Arrays.
5.10 Ejemplos resueltos paso a paso
Cinco ejemplos completos que integran todo lo aprendido.
5.10.1 Ejemplo 1: crear y consultar un array de Strings
Salida:
Puntos clave:
- Creación con
{ }: 7 valores literales, sinnew. - Acceso suelto por índice:
dias[0],dias[length - 1],dias[length / 2]. - Modificación de un elemento:
dias[0] = "LUNES". - Sin recorrer el array: solo consultas sueltas. Para recorrerlo entero, esperamos a la sección 6.
5.10.2 Ejemplo 2: pedir 5 edades con while y mostrar la suma
Salida de ejemplo:
Puntos clave:
new int[NUM_EDADES]crea el array con tamaño fijo, todos a0por defecto.- Dos
whiledistintos para dos recorridos distintos: uno para pedir, otro para sumar. Cada uno con su propio índice (iyj). (double) suma / edades.lengthcast adoublepara que la división sea decimal.- Acceso al primero y al último sin recorrer:
edades[0]yedades[edades.length - 1].
5.10.3 Ejemplo 3: análisis de caracteres con toCharArray
Salida con "Programacion":
Puntos clave:
texto.toCharArray()convierte elStringen unchar[].- Consultas sueltas sin recorrer:
letras[0],letras[length - 1],letras[length / 2]. - Recorrido con
whilepara contar vocales: el patrón "pedir/recorrer elemento a elemento" con un índiceique empieza en 0 y sube hastalength - 1.
5.10.4 Ejemplo 4: swap de dos elementos y comprobación
Salida:
Puntos clave:
- Swap sin bucle: solo acceso por índice y una variable
tempauxiliar. numeros.length - 1para acceder al último elemento sin saber el tamaño de memoria.- El swap es la base de muchos algoritmos de ordenación (UD6).
5.10.5 Ejemplo 5: menú con array de opciones
Salida de ejemplo:
Puntos clave:
- Array de Strings con valores literales para definir el menú.
- Mostrar el menú con
while: recorre el array imprimiendo cada elemento. - Buscar la opción con
while: recorre el array comprobando si alguna empieza por"3.". En la sección 8 verásbreakpara salir en cuanto se encuentre. opciones[j].startsWith(opcion + ".")comprueba si el elemento empieza por el número introducido + punto. El métodostartsWithse ve en UD 3.
5.11 Buenas prácticas con arrays
5.11.1 Las 10 reglas del buen uso de arrays
- Indica el tipo con corchetes después del tipo:
int[] nums, noint nums[]. - Inicializa con
{ }si conoces los valores; connew Tipo[n]si no. .lengthsin paréntesis en arrays;.length()con paréntesis enString.- Índices válidos:
0aarray.length - 1. El último índice siempre eslength - 1. - Comprueba
nullantes de usar si el array puede sernull. - En
String[]inicializado connew, los elementos sonnull, no"". - Para swap, usa siempre
temp: sintemp, pierdes un valor. - Con
while, nunca olvidesi++al final del cuerpo. Bucle infinito si lo olvidas. - Imprime elementos sueltos o espera a
Arrays.toStringen la sección 6; nuncaIO.println(array)directo. - Pide datos al usuario con validación en el
while: solo avanzasisi la entrada es válida.
5.11.2 Cuándo refactorizar (a partir de la sección 6)
| Síntoma | Refactoriza a |
|---|---|
while con int i = 0; ... i++; para recorrer un array. |
for clásico (sección 6). |
| Imprimir elementos sueltos manualmente. | Arrays.toString(arr) (sección 6). |
Copiar elementos a un array nuevo con while. |
Arrays.copyOf (sección 6). |
Buscar elemento a elemento con while. |
Arrays.binarySearch (sección 6, si está ordenado). |
5.11.3 Comentar el acceso a arrays
Los comentarios buenos explican qué estás haciendo con el array, no el acceso en sí:
5.12 Resumen y mapa conceptual
5.12.1 Las 12 ideas que no debes olvidar
- Un array es una secuencia fija de elementos del mismo tipo, accesibles por índice (desde 0).
- Tamaño fijo: no se puede cambiar una vez creado.
- Índices válidos:
0aarray.length - 1. Tipo[] nombre = { v1, v2, v3 };inicializa con valores;new Tipo[n]crea con tamaño fijo y valores por defecto..lengthsin paréntesis en arrays;.length()con paréntesis enString. Memorízalo.- Valores por defecto:
0para numéricos,falseparaboolean,nullparaStringy objetos. - El último índice siempre es
length - 1: usaarr[arr.length - 1]como truco para el último. - Swap con
temp: para intercambiar dos valores sin perder ninguno. String.toCharArray()convierte unStringenchar[]para poder acceder por índice.charAt(i)es una alternativa sin crear array nuevo (más eficiente en memoria).- Con
while, eli++va al final del cuerpo: si lo olvidas, bucle infinito. Elforde la sección 6 te salvará de eso. - No imprimas un array con
IO.println(arr): verás[I@1b6d3586. Imprime elementos sueltos o espera aArrays.toStringen la sección 6.
5.12.2 Glosario rápido
| Término | Significado |
|---|---|
| Array | Estructura de datos de tamaño fijo que contiene elementos del mismo tipo, accesibles por índice. |
| Array unidimensional | Array de una sola dimensión, una secuencia lineal de elementos. |
| Tipo compuesto | Tipo que agrupa varios valores bajo un mismo nombre (como el array). |
| Elemento | Cada uno de los valores almacenados en un array. |
| Índice | Posición de un elemento en el array. Empieza en 0. |
length |
Campo de los arrays (sin paréntesis) que indica cuántos elementos tienen. |
length() |
Método de String (con paréntesis) que indica cuántos caracteres tiene. |
| Valor por defecto | El valor inicial que Java asigna a los elementos de un array creado con new: 0, false, null, etc. |
ArrayIndexOutOfBoundsException |
Excepción que lanza Java al acceder a un índice fuera de rango. |
NullPointerException |
Excepción que lanza Java al usar una referencia null (por ejemplo, llamar a .length() sobre un String nulo o acceder a un array null). |
toCharArray() |
Método de String que devuelve un char[] con todos los caracteres. |
charAt(i) |
Método de String que devuelve el carácter en la posición i (sin crear un array nuevo). |
| Swap | Intercambio de dos valores usando una variable temp auxiliar. |
| Array vacío | Array con 0 elementos ({} o new int[0]). Es un array legítimo, length = 0. |
Array null |
Variable que apunta a "nada"; no es un array, y acceder a él lanza NullPointerException. |
5.13 Actividades propuestas
Cinco actividades graduadas. Hazlas en orden. Las soluciones se publicarán en Aules.
5.13.1 Actividad 1 — Crear y consultar un array de Strings
Objetivo: practicar la creación con valores literales y el acceso por índice (sin recorrer).
Enunciado: Crea un array de Strings con los 12 meses del año:
Pide al usuario un número de mes (1-12), y muestra:
- El nombre del mes correspondiente (con
meses[numero - 1], ya que el usuario escribe 1-12 pero los índices son 0-11). - El mes anterior y el mes siguiente si existen (cuidado con enero y diciembre).
- El número de letras del nombre del mes (con
meses[numero - 1].length()).
Requisitos:
- No uses bucles. Solo acceso por índice.
- Valida que el número esté entre 1 y 12.
- Si el mes es enero, "mes anterior: no hay (es el primero)". Si es diciembre, "mes siguiente: no hay (es el último)".
Entrega: archivo ConsultarMes.java en el paquete jams.programacion.ud2.
Criterios evaluados: CE 3.5, CE 3.7.
5.13.2 Actividad 2 — Pedir 5 edades con while y mostrar resultados
Objetivo: practicar el patrón "pedir N datos con while y rellenar un array".
Enunciado: Escribe un programa que:
- Pida al usuario 5 edades.
- Las guarde en un array
int[] edades = new int[5];. - Calcule y muestre:
- La suma de las edades (con
while). - La media (con 2 decimales, usando
String.format). - La primera edad y la última.
- Cuántos alumnos son mayores de edad (>= 18), con
while.
Requisitos:
- Crea el array con
new int[5]. - Usa
whilepara pedir. - Usa
whilepara sumar y contar.
Entrega: archivo PedirEdades.java en el paquete jams.programacion.ud2.
Criterios evaluados: CE 3.5, CE 3.7.
5.13.3 Actividad 3 — Analizar caracteres con toCharArray
Objetivo: practicar la conversión String → char[] y el acceso por índice.
Enunciado: Pide al usuario una palabra con IO.readln().trim(). Conviértela en char[] con toCharArray() y muestra:
- Total de caracteres (
letras.length). - Primera letra (
letras[0]). - Última letra (
letras[letras.length - 1]). - Letra del medio (
letras[letras.length / 2]). - Número de vocales (con un
whileque recorra el array).
Requisitos:
- Comprueba que la palabra no esté vacía antes de acceder a
letras[0](si lo está, muestra error y sale). - Para contar vocales, usa
whilecon un índicei(nofor, que se ve en la sección 6).
Entrega: archivo AnalizarPalabra.java en el paquete jams.programacion.ud2.
Criterios evaluados: CE 3.5, CE 3.7.
5.13.4 Actividad 4 — Swap de dos posiciones
Objetivo: practicar el swap y el acceso por índice.
Enunciado: Dado un array:
Pide al usuario dos posiciones i y j (entre 0 y numeros.length - 1) e intercambia los elementos en esas posiciones usando el patrón swap con temp. Muestra el array antes y después imprimiendo elementos sueltos (no Arrays.toString, que se ve en la sección 6).
Requisitos:
- Valida que ambas posiciones estén en el rango [0, length-1].
- Usa el patrón swap:
temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;. - Para imprimir el array "antes" y "después", concatena los elementos con
+en una sola línea. Por ejemplo:"10, 20, 30, 40, 50, 60, 70, 80, 90, 100".
Entrega: archivo SwapPosiciones.java en el paquete jams.programacion.ud2.
Criterios evaluados: CE 3.5, CE 3.7.
5.13.5 Actividad 5 — Cuestionario de repaso
Responde por escrito:
- ¿Qué es un array y qué tres propiedades lo definen?
- Escribe la sintaxis para declarar un array con valores literales y con tamaño fijo.
- ¿Por qué
numeros.lengthno lleva paréntesis perotexto.length()sí? - ¿Cuál es el rango de índices válidos de un array de 5 elementos?
- ¿Qué valor por defecto tienen los elementos de
new int[3],new boolean[3]ynew String[3]? - ¿Cuál es la diferencia entre un array vacío (
{}) y un arraynull? - ¿Cómo se escribe el "truco del último elemento"? ¿Por qué es necesario?
- Escribe el patrón swap para intercambiar dos elementos de un array.
- ¿Qué hace
String.toCharArray()y para qué sirve? - ¿Qué hace
String.charAt(i)y en qué se diferencia detoCharArray()? - ¿Por qué hay que poner
i++al final del cuerpo de unwhileque recorre un array? ¿Qué pasa si lo olvidas? - ¿Por qué no debes imprimir un array con
IO.println(arr)? ¿Qué verías?
Entrega: archivo cuestionario_seccion5.md con tus respuestas.
Criterios evaluados: CE 3.5, CE 3.7.
5.14 Lo que NO hemos visto (y dónde verlo)
Esta sección te ha enseñado los arrays unidimensionales como tipo compuesto: cómo se crean, cómo se inicializan y cómo se accede a sus elementos sueltos. Hay varias cosas relacionadas que se reservan para secciones/unidades posteriores:
| Concepto | ¿Por qué no aquí? | ¿Dónde se ve? |
|---|---|---|
Recorrido con for clásico |
El for se introduce en la sección 6. |
Sección 6 de UD2. |
for-each (recorrido sin índice) |
Bucle distinto al for clásico. |
Sección 7 de UD2. |
Utilidades de Arrays (copyOf, sort, binarySearch, toString) |
Se introducen junto con el for clásico (muchas necesitan o producen arrays que luego recorrerás). |
Sección 6 de UD2. |
Variantes avanzadas del for (decreciente, saltos, múltiples variables, comparativa con while) |
Profundización del for. |
Sección 6 de UD2. |
Matrices bidimensionales int[][] |
Arrays de arrays. | Sección 8 de UD2. |
| Bucles anidados (for dentro de for) | Necesitan matrices o combinaciones. | Sección 8 de UD2. |
break y continue |
Sentencias de salto de bucle. | Sección 8 de UD2. |
try-catch para manejar ArrayIndexOutOfBoundsException y NullPointerException |
Manejo de excepciones. | Sección 9 de UD2. |
| Arrays dentados (jagged arrays) | Cada fila tiene distinta longitud. | UD6. |
Más utilidades de Arrays (fill, equals, compare, mismatch, copyOfRange, asList) |
Avanzadas. | UD6. |
Colecciones (List, Set, Map, Queue) |
Estructuras dinámicas; necesitan POO y genéricos. | UD6. |
Iterable<T> y Iterator<T> |
Interfaces, genéricos y POO. | UD6. |
Genéricos (<T>, List<String>) |
Concepto avanzado de tipos parametrizados. | UD6. |
StringBuilder para concatenación eficiente |
En bucles de mucha concatenación. | UD 3 (POO con la API de Java). |
Cierre de la sección. Llegar hasta aquí es mérito. Acabas de aprender la primera estructura de datos del curso: el array. Es la más simple, pero también la más usada. Casi cualquier programa que maneje más de un dato del mismo tipo acaba teniendo un array por algún sitio. Y ahora ya sabes crearlos, inicializarlos, acceder a sus elementos y hacer operaciones básicas como el swap. Hemos usado
whilepara los pocos recorridos necesarios, pero habrás notado que es algo verboso (declararint i = 0, escribiri < arr.length, acordarse deli++...). Eso es a propósito: en la sección 6 vas a conocer elforclásico y vas a ver cómo toda esa maquinaria se simplifica en una sola línea. Es como pasar de un coche manual a uno automático: hace lo mismo, pero con menos esfuerzo y menos posibilidades de equivocarte. La regla más importante que te llevas de esta sección es **array →length, String →length()**: la confundes miles de veces a lo largo del curso. Nos vemos en la sección 6, donde elfor` clásico te va a cambiar la vida como programador.