Arrays
En resumen: Un array es una secuencia de valores de un mismo tipo bajo un mismo nombre, en la que cada elemento tiene un número, su índice, que empieza en 0.
Problema
Treinta notas
Una profesora escribe un programa para las notas de un examen. Para cinco estudiantes crea cinco variables:
int score1 = 62;int score2 = 85;int score3 = 47;int score4 = 91;int score5 = 78;int sum = score1 + score2 + score3 + score4 + score5;Console.WriteLine(sum);363Pero en la clase hay treinta. Treinta variables, treinta sumandos. Y para la nota más alta hacen falta otras veintinueve comparaciones. El bucle de la lección anterior no ayuda: no puede recorrer score1, score2, score3, porque son nombres distintos. Necesitamos muchos valores bajo un solo nombre.
La idea
Un array: una fila de cajas
Un array (también llamado arreglo) es una fila de valores de un mismo tipo bajo un mismo nombre. Cada valor, un elemento del array, tiene un número: su índice. Los índices empiezan en 0.
int[] scores = { 62, 85, 47, 91, 78 };Console.WriteLine(scores[0]);Console.WriteLine(scores[4]);Console.WriteLine(scores.Length);scores[2] = 50;Console.WriteLine(scores[2]);6278550int[]es el tipo: «un array deint». Los valores van entre{ }.
scores[0]es el primer elemento,scores[4]el quinto. El último índice siempre es 1 menos que la cantidad.scores.Lengthes la cantidad de elementos. Aquí es 5.scores[2] = 50;cambia un elemento. Los demás siguen igual.
Si todavía no conoces los valores, creas el array indicando solo su tamaño. Entonces todos los elementos son 0:
int[] booked = new int[3];booked[1] = 2;Console.WriteLine(booked[0] + " " + booked[1] + " " + booked[2]);0 2 0El tamaño se fija al crear el array y después ya no cambia.
Más precisamente, para curiosos
- Los índices van solo de 0 a la cantidad menos 1. Un índice negativo está fuera del array.
Pruébalo
¿Cuál es cuál?
¿Qué imprimirá el programa?
int[] prices = { 12, 7, 30, 5 };Console.WriteLine(prices[1] + prices[3]);Contamos desde 0: prices[1] es 7 (el segundo), prices[3] es 5 (el cuarto). 7 + 5 = 12. Si cuentas desde 1, tomarás 12 y 30.
La idea
Un bucle por el array
Ahora el bucle sí ayuda. El contador i se convierte en el índice: va de 0 hasta el último y en cada vuelta toma scores[i].
int[] scores = { 62, 85, 47, 91, 78 };int sum = 0;for (int i = 0; i < scores.Length; i++){ sum += scores[i];}Console.WriteLine("Suma: " + sum);Console.WriteLine("Media: " + (double)sum / scores.Length);Suma: 363Media: 72.6La condición es i < scores.Length, no un número. Si pones las treinta notas entre { }, el bucle no cambia. Esto se llama recorrer el array.
(double) hace falta por la división entera: 363 / 5 es 72, y necesitamos 72,6.
Míralo
La nota más alta
¿Cómo encuentras el número más grande? Recuerdas el más grande hasta ahora y lo sustituyes en cuanto ves uno mayor.
int[] scores = { 62, 85, 47, 91, 78 };int max = scores[0];for (int i = 1; i < scores.Length; i++){ if (scores[i] > max) { max = scores[i]; }}Console.WriteLine(max); // 91Paso a paso, en palabras
- Cinco puntuaciones, una al lado de otra. Los números de abajo son los índices: de 0 a 4.
- max empieza por la primera: scores[0] es 62.
- i = 1: 85 > 62, así que max pasa a ser 85.
- i = 2: 47 no es mayor que 85. No cambia nada.
- i = 3: 91 > 85, así que max pasa a ser 91.
- i = 4: 78 < 91. Luego i pasa a ser 5, 5 < scores.Length es falso y el bucle se detiene.
- La puntuación más alta es 91.
max empieza por el primer elemento, no por 0. Si todas las notas fueran negativas, el 0 «ganaría» sin estar en el array. Por eso también el bucle empieza en i = 1: el primero ya está en max.
Pruébalo
Encuentra el error
El programa debería imprimir la suma 363. En cambio, se detiene con un error:
Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array.¿En qué línea está el error?
Elige la línea con el error.
<= el bucle da una vuelta más, con i = 5. Los índices de un array de 5 elementos van de 0 a 4, y no existe el elemento scores[5]. El programa no lee memoria ajena: se detiene con un error. Esto se llama salirse del array. La corrección es i < scores.Length.La idea
foreach: para cada elemento
Cuando solo necesitas los valores y no los índices, hay un bucle más corto. ¿Cuántos estudiantes aprobaron el examen (60 puntos o más)?
int[] scores = { 62, 85, 47, 91, 78 };int passed = 0;foreach (int score in scores){ if (score >= 60) { passed++; }}Console.WriteLine("Aprobaron el examen: " + passed);Aprobaron el examen: 4Se lee «para cada score de scores». Se llama foreach. No hay contador ni índice, así que no te puedes salir del array.
También tiene un límite: no sabes en qué índice estás y no puedes cambiar el elemento.
Más precisamente, para curiosos
- Si escribes
score = 0;en el cuerpo, el programa no compila: la variable delforeaches de solo lectura.
- Para cambiar elementos, o cuando necesitas el índice (por ejemplo, para el vecino
scores[i + 1]), usa unfornormal.
Pruébalo
Dos nombres, un array
¿Qué imprimirá el programa?
int[] prices = { 10, 20, 30 };int[] sale = prices;sale[0] = 5;Console.WriteLine(prices[0]);int b = a; copia el valor. Con los arrays no es así: sale = prices no crea un array nuevo, sino que da un segundo nombre al mismo. Por eso un cambio a través de sale también se ve a través de prices. Por qué es así lo verás en el módulo «Clases y objetos»: un array es un objeto, y la variable guarda dónde está.Más precisamente, para curiosos
Una copia de verdad se hace con un array nuevo y un bucle:
int[] prices = { 10, 20, 30 };int[] sale = new int[prices.Length];for (int i = 0; i < prices.Length; i++){ sale[i] = prices[i];}sale[0] = 5;Console.WriteLine(prices[0] + " " + sale[0]);10 5(int[])prices.Clone() hace lo mismo.
Pruébalo
Ordena las líneas
El programa debe encontrar el precio más bajo. Ordena sus líneas.
min = prices[i];Console.WriteLine(min);}int min = prices[0];int[] prices = { 18, 7, 25, 12 };{{for (int i = 1; i < prices.Length; i++)if (prices[i] < min)}
Ejercicio
Cálculos con un array
Resuelve los ejercicios en tu editor. Cada programa lee primero cuántos números hay y después los números, uno por línea:
int n = int.Parse(Console.ReadLine());int[] numbers = new int[n];for (int i = 0; i < n; i++){ numbers[i] = int.Parse(Console.ReadLine());}1. Suma, pares, impares. Imprime la suma de todos los números, la de los pares y la de los impares.
3123Suma: 6Pares: 2Impares: 42. Al revés. Crea un array nuevo con los mismos números en orden inverso e imprímelo en una línea.
5123455 4 3 2 13. Mínimo, máximo, media. Con una sola pasada por el array.
549274Mínimo: 2Máximo: 9Media: 5.2Ejercicio
Ordenar y contar
4. Ordenación. Ordena los números del más pequeño al más grande. Pista: recorre el array, y si dos vecinos están en el orden equivocado, intercámbialos (el intercambio es de la lección sobre variables). Repite hasta que no quede nada que intercambiar. Esto se llama ordenamiento de burbuja: los números grandes «suben como burbujas» hacia el final.
5427193253 7 19 25 425. La racha más larga. Encuentra la secuencia más larga de números iguales seguidos.
822555155El número 5, 3 veces seguidas6. Estadística de notas. Lee notas del 2 al 6 e imprime cuántas hay de cada tipo. Pista: un array counts de 7 elementos, en el que la nota es el índice: counts[grade]++.
864563265Excelente (6): 3Muy bien (5): 2Bien (4): 1Suficiente (3): 1Insuficiente (2): 1Más ejercicios
- Mediana. El número del medio del array ordenado. Para 3, 1, 4, 1, 5 la mediana es 3. Si la cantidad de números es par, la mediana es la media de los dos del medio: para 7, 1, 3, 9 es (3 + 7) / 2 = 5.
- Array simétrico. ¿Se lee igual de principio a fin que de fin a principio? 1 2 3 2 1 es simétrico, 1 2 3 1 no lo es.
- Números romanos. Lee un número del 1 al 3999 e imprímelo en números romanos: 2024 es MMXXIV, 1994 es MCMXCIV. Pista: dos arrays en paralelo, con los valores
1000, 900, 500, 400, 100, …, 1y con los símbolos"M", "CM", "D", "CD", "C", …, "I". Mientras el número sea al menos el valor actual, añade el símbolo y resta el valor.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: Entrada y salida · Operadores y aritmética · Condiciones · Bucles
- Continúa en: Arrays bidimensionales · Cadenas: trabajar con texto · Parámetros y return · Sobrecarga
- Ejercicios sobre el tema: Fundamentos del lenguaje