Hasta ahora trabajaste muchas veces con una variable por vez.
Por ejemplo:
int edad;
float precio;
char inicial;
Eso está bien cuando necesitás guardar un solo dato.
Pero, ¿qué pasa si necesitás guardar:
- 5 notas
- 10 edades
- 30 temperaturas
- 7 números ingresados por el usuario
¿Vas a crear una variable para cada dato?
int nota1;
int nota2;
int nota3;
int nota4;
int nota5;
Podrías hacerlo, sí. Pero sería incómodo, desordenado y poco práctico.
Ahí es donde aparecen los arreglos.
¿Qué es un arreglo?
Un arreglo es una estructura que permite guardar varios datos del mismo tipo bajo un mismo nombre.
Cada dato se guarda en una posición y se accede a esa posición mediante un índice.
Ejemplo simple
int notas[5];
Esto significa:
intes el tipo de dato de cada elementonotases el nombre del arreglo5es la cantidad de posiciones reservadas
O sea: notas puede guardar 5 valores enteros.
¿Por qué un arreglo es útil?
Porque te permite agrupar muchos datos relacionados.
Por ejemplo, si querés guardar 5 notas, en vez de tener:
int nota1, nota2, nota3, nota4, nota5;
podés tener:
int notas[5];
Eso organiza mejor el programa y facilita muchísimo el trabajo posterior.
Todos los elementos deben ser del mismo tipo
En un arreglo, todos los elementos tienen el mismo tipo.
Por ejemplo:
int numeros[4];
acá todos los elementos son int.
Y en:
char letras[6];
acá todos los elementos son char.
No podés guardar en el mismo arreglo un int, un float y un char mezclados.
Índices: las posiciones del arreglo
En C, los arreglos empiezan en el índice 0.
Esto es FUNDAMENTAL. Si no entendés esto bien, después todo se empieza a romper.
Si tenemos:
int notas[5];
las posiciones válidas son:
notas[0]notas[1]notas[2]notas[3]notas[4]
Ojo con esto
Si el arreglo tiene 5 elementos:
- la cantidad de elementos es
5 - el último índice es
4
No es lo mismo.
Forma mental de imaginar un arreglo
Podés pensar un arreglo como una fila de casilleros.
Indice: 0 1 2 3 4
Valor: [ ] [ ] [ ] [ ] [ ]
Cada casillero tiene:
- una posición
- un valor posible
Declaración de un arreglo
Declarar un arreglo significa reservar espacio para sus elementos.
int numeros[5];
Acá reservamos espacio para 5 enteros.
Asignar valores a las posiciones
Después de declarar el arreglo, podemos cargar valores en sus posiciones.
#include <stdio.h>
int main() {
int numeros[5];
numeros[0] = 10;
numeros[1] = 20;
numeros[2] = 30;
numeros[3] = 40;
numeros[4] = 50;
printf("Primer valor: %d\n", numeros[0]);
printf("Ultimo valor: %d\n", numeros[4]);
return 0;
}
Inicialización de un arreglo
También podemos declarar y cargar valores al mismo tiempo.
int numeros[5] = {10, 20, 30, 40, 50};
Eso significa exactamente esto:
numeros[0] = 10numeros[1] = 20numeros[2] = 30numeros[3] = 40numeros[4] = 50
Acceso a los elementos
Para leer o usar un valor del arreglo, escribimos el nombre del arreglo y entre corchetes el índice.
int primero = numeros[0];
int tercero = numeros[2];
Ejemplo completo con acceso a posiciones
#include <stdio.h>
int main() {
int edades[4] = {15, 18, 20, 22};
printf("Edad en la posicion 0: %d\n", edades[0]);
printf("Edad en la posicion 1: %d\n", edades[1]);
printf("Edad en la posicion 2: %d\n", edades[2]);
printf("Edad en la posicion 3: %d\n", edades[3]);
return 0;
}
Modificar un elemento del arreglo
Los valores del arreglo también pueden cambiar.
#include <stdio.h>
int main() {
int notas[3] = {6, 7, 8};
printf("Antes: %d\n", notas[1]);
notas[1] = 10;
printf("Despues: %d\n", notas[1]);
return 0;
}
Arreglo unidimensional
Un arreglo unidimensional es el arreglo más simple.
Tiene una sola dimensión y se puede imaginar como una fila de elementos.
[10, 20, 30, 40, 50]
O más visualmente:
Indice: 0 1 2 3 4
Valor: 10 20 30 40 50
Ejemplo con float
#include <stdio.h>
int main() {
float precios[3] = {1250.5, 980.0, 1500.75};
printf("Precio 1: %.2f\n", precios[0]);
printf("Precio 2: %.2f\n", precios[1]);
printf("Precio 3: %.2f\n", precios[2]);
return 0;
}
Esto muestra algo importante:
un arreglo no tiene que ser siempre de enteros. Puede ser de cualquier tipo, siempre que todos sus elementos sean del mismo tipo.
Cargar datos en un arreglo con un ciclo
Una de las grandes ventajas de los arreglos es que se combinan muy bien con estructuras repetitivas.
#include <stdio.h>
int main() {
int numeros[5];
int i;
for (i = 0; i < 5; i = i + 1) {
printf("Ingresa un numero: ");
scanf("%d", &numeros[i]);
}
printf("\nValores guardados:\n");
for (i = 0; i < 5; i = i + 1) {
printf("numeros[%d] = %d\n", i, numeros[i]);
}
return 0;
}
¿Qué tiene de bueno este ejemplo?
Muchísimo.
Porque te muestra que no hace falta escribir:
scanf("%d", &numeros[0]);
scanf("%d", &numeros[1]);
scanf("%d", &numeros[2]);
Eso sería repetitivo e incómodo. Con un ciclo, trabajamos todas las posiciones de forma ordenada.
Arreglos multidimensionales
Un arreglo multidimensional es un arreglo con más de una dimensión.
El caso más común cuando se empieza a programar es el arreglo bidimensional, también llamado matriz.
¿Qué es una matriz?
Una matriz organiza los datos en:
- filas
- columnas
Entonces, en vez de imaginar una sola fila de casilleros, imaginamos una tabla.
Declaración de una matriz
int matriz[2][3];
Esto significa:
- 2 filas
- 3 columnas
O sea, hay lugar para 6 enteros en total.
Forma mental de imaginar una matriz
Columna 0 Columna 1 Columna 2
Fila 0 [ ] [ ] [ ]
Fila 1 [ ] [ ] [ ]
Inicialización de una matriz
int matriz[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
Esto significa:
matriz[0][0] = 1matriz[0][1] = 2matriz[0][2] = 3matriz[1][0] = 4matriz[1][1] = 5matriz[1][2] = 6
Acceso a un elemento de la matriz
Para acceder a un elemento de una matriz necesitamos dos índices:
- uno para la fila
- otro para la columna
int valor = matriz[1][2];
Ese valor es 6.
¿Por qué?
Porque:
- fila
1es la segunda fila - columna
2es la tercera columna
Ejemplo completo con matriz
#include <stdio.h>
int main() {
int matriz[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
printf("matriz[0][0] = %d\n", matriz[0][0]);
printf("matriz[0][2] = %d\n", matriz[0][2]);
printf("matriz[1][1] = %d\n", matriz[1][1]);
printf("matriz[1][2] = %d\n", matriz[1][2]);
return 0;
}
Modificar una posición en una matriz
También podemos cambiar un valor de la matriz.
#include <stdio.h>
int main() {
int tablero[2][2] = {
{1, 0},
{0, 1}
};
tablero[0][1] = 9;
printf("Nuevo valor: %d\n", tablero[0][1]);
return 0;
}
¿Para qué sirven los arreglos multidimensionales?
Sirven cuando los datos tienen organización de tabla.
Por ejemplo:
- notas de varios alumnos en varias materias
- asientos de una sala
- tablero de juego
- matrices matemáticas
- temperaturas por día y por turno
Ejemplo conceptual: notas por alumno y materia
int notas[3][2];
Podría significar:
- 3 alumnos
- 2 materias
Entonces:
notas[0][0]= nota del alumno 1 en la materia 1notas[0][1]= nota del alumno 1 en la materia 2notas[1][0]= nota del alumno 2 en la materia 1- y así sucesivamente
Diferencia entre arreglo unidimensional y multidimensional
Unidimensional
Tiene una sola línea de posiciones.
int numeros[5];
Se accede con un solo índice.
numeros[2]
Multidimensional
Tiene más de una dimensión.
int matriz[2][3];
Se accede con más de un índice.
matriz[1][2]
Errores comunes
Olvidar que el índice empieza en 0
Este es el error clásico.
Si el arreglo tiene 5 elementos, el último índice es 4, no 5.
Acceder a una posición que no existe
Esto está mal:
int numeros[5];
int x = numeros[5];
Porque numeros[5] queda fuera del arreglo.
Confundir cantidad con último índice
Si hay 3 filas y 2 columnas:
int notas[3][2];
las filas válidas son:
012
Y las columnas válidas son:
01
Pensar que una matriz se maneja igual que un arreglo simple
No. En una matriz necesitás dos índices.
Resumen
- un arreglo permite guardar varios datos del mismo tipo
- cada elemento se identifica por su índice
- en C, el primer índice siempre es
0 - un arreglo unidimensional se parece a una fila de datos
- un arreglo bidimensional se parece a una tabla con filas y columnas
- para acceder a una matriz se necesitan dos índices
Idea final
Los arreglos son una de las primeras herramientas realmente poderosas para trabajar con varios datos relacionados.
Si entendés bien estas tres ideas:
- que los datos comparten un mismo nombre
- que cada posición se identifica por un índice
- que una matriz agrega filas y columnas
entonces ya tenés una base muy sólida para todo lo que viene después.