Está en la página 1de 12

Teoría de los Lenguajes y Algoritmos

Arreglos Estáticos

Necesidad de los Arreglos


Existen situaciones en las cuales el programa debe almacenar en memoria
muchas ocurrencias de datos similares (por ej. Ventas diarias del mes,
Nombres de 100 Personas, etc.). Además, se necesita que un programa se
mueva de manera "dinámica" entre estos datos, por lo que escribir el código
para dimensionar, grabar y leer 100 variables como “persona1”, “persona2”, …
“persona100”, es impracticable.

Otro ejemplo podría ser el de un menú de opciones que se desplegarán dentro


de una ventana para que el usuario pueda elegir una de éstas, en tales casos y
cuando las opciones son numerosas, solamente se ponen unas cuantas de
ellas dentro de la ventana, pero se le da al usuario la oportunidad de poder
subir y bajar a su antojo para ver el resto de opciones que, aunque no se vean
en la ventana, forman parte del menú.

Definición de Arreglos
En programación se le denomina arreglo a una serie de elementos (variables,
por ejemplo) que tienen un mismo nombre y son del mismo tipo. Como
comparten el mismo nombre, para leer o escribir elementos individuales de un
arreglo se utiliza un indicador adicional llamado "índice" (o también
"subíndice").
Los arreglos (o arrays en inglés) son usados extensamente por los
programadores para contener listas de datos en la memoria.

Índices de un array
Los índices son números que se utilizan para identificar a cada uno de los
componentes de un array. A modo de ejemplo, podemos pensar que los
índices son como los números de habitaciones de un hotel, es decir, para
poder dirigirnos a un hotel específico es necesario saber el nombre del mismo,
luego, si queremos llegar a una habitación específica de dicho hotel
necesitaremos, además del nombre del hotel, el número de habitación
deseado.

Página 1 de 12
Teoría de los Lenguajes y Algoritmos

Arreglos Estáticos

Dimensiones de un array
Cuando para acceder a cada posición del arreglo hace falta sólo un índice,
podemos decir que tiene una sola dimensión, y se lo puede llamar más
específicamente "vector". Podemos pensar como ejemplo de vector una lista de
números de lotería.
Vector NumLoteria
42

21

65

11

78

58

Decimos entonces que los vectores son arreglos “unidimensionales”.

Cuando para acceder a cada posición del arreglo hacen falta dos índices,
podemos imaginarlo como una cuadrícula y decir que el arreglo es más
específicamente una "matriz". Una matriz tiene entonces dos dimensiones.
Un ejemplo para imaginarlo podrían ser los asientos de una sala de teatro
(libres / ocupados):

X X X

Página 2 de 12
Teoría de los Lenguajes y Algoritmos

Arreglos Estáticos

También se pueden declarar arreglos de tres o más dimensiones, es decir con


tres o más índices necesarios para referirnos a una posición particular. Sin
embargo, los vectores (arreglos unidimensionales) y matrices (arreglos
bidimensionales) son los que se emplean con mucha más frecuencia.

Consideraciones sobre los arreglos en la memoria

Los elementos o "celdas" de los arreglos se almacenan en zonas contiguas de


la memoria. Esto, sumado a que siendo cada elemento del mismo tipo ocupará
el mismo espacio en memoria, acelera mucho su localización y por lo tanto su
rendimiento. Si bien esto es transparente para el programador, podemos
pensar un ejemplo para aclarar.

Si tenemos un vector de 2000 variables numéricas, conociendo la dirección de


memoria en donde inicia el arreglo (por simplificar digamos la posición número
5000), y cuánta memoria ocupa cada elemento (por ejemplo 32 bits), el sistema
puede saber por ejemplo la dirección de memoria de la celda 1300 calculando
5000 + 32 * 1300. Con arreglos de 2 o más dimensiones se aplica un enfoque
similar, pero más complicado según cómo transforme el sistema un arreglo de
varias dimensiones a posiciones contiguas de la memoria.

Diferencia entre arreglos estáticos y dinámicos


En el presente documento vamos a abarcar el uso de arreglos estáticos. Estos
son aquellos para los cuales se define inicialmente una cantidad de posiciones
disponibles que no se puede alterar durante la ejecución del programa.

Por el contrario se denomina arreglo dinámico a aquel para el cual se pueden


agregar posiciones adicionales durante la ejecución a medida que sea
necesario.

Nota:
Si bien C# tiene elementos de programación que se muestran al desarrollador
como arreglos dinámicos, en realidad no son arreglos y no comparten las
propiedades de memoria y rendimiento que se indicaron en el punto anterior.

Página 3 de 12
Teoría de los Lenguajes y Algoritmos

Arreglos Estáticos

Declarar un vector
Para declarar una vector en C #, puede usar la siguiente sintaxis:
datatype[ ] arrayName;

● datatype se utiliza para especificar el tipo de elementos en el vector.


● [ ] especifica el rango de la vector. El rango especifica el tamaño de la
vector.
● arrayName especifica el nombre de la vector.

Ejemplo:

String[ ] nombres;

Inicializando un Vector
Declarar un arreglo (en este caso un vector) no lo inicializa en la memoria.
Cuando la variable de arreglo se inicializa, puede asignar valores al mismo.
El arreglo es un tipo de referencia, por lo que necesita usar la nueva palabra
clave para crear una instancia del mismo. Por ejemplo:

String[ ] nombre = new String[10];

Página 4 de 12
Teoría de los Lenguajes y Algoritmos

Arreglos Estáticos

Asignando valores a un vector


Puede asignar valores a elementos de un vector, utilizando el número de
índice, como -

String[] nombre = new String[10];


nombre[0] = "Juan";
nombre[1] = "Pedro";
nombre[2] = "Sebastian";

Puede asignar valores al vector en el momento de la declaración, como se


muestra:
String[] nombre = { "Juan","Pedro","Sebastian"};

Cuando crea un vector, el compilador de C # inicializa implícitamente cada


elemento a un valor predeterminado dependiendo del tipo de dato del vector.
Por ejemplo, para un Matriz int todos los elementos se inicializan con valor 0.

Accediendo a los elementos de un vector


Se accede a un elemento indexando el nombre del vector. Esto se hace
colocando el índice del elemento entre corchetes después del nombre del
vector. Por ejemplo,
Console.WriteLine(nombre[1]);

El siguiente ejemplo muestra los conceptos mencionados anteriormente, la


asignación y el acceso a los elementos de un vector:

Página 5 de 12
Teoría de los Lenguajes y Algoritmos

Arreglos Estáticos

Ejemplo 1:

Ejemplo 2:

Resultado:

Página 6 de 12
Teoría de los Lenguajes y Algoritmos

Arreglos Estáticos

Declaración de una Matriz


Primero se declara el tipo de dato que contendrá, entre corchetes va un coma
[ , ], ​seguida del nombre del arreglo.
Luego del new se vuelva a declarar el tipo de datos que almacenara y entra
corchetes la numero de columnas y filas en este orden.
string​[,] matriz = ​new​ String[5, 3];

Como aquí estamos indicando el número de columnas y filas, y ambas


dimensiones inician en 0, entonces la última posición de cada dimensión será
igual al número indicado – 1. En nuestro ejemplo, será una matriz de 4 filas (0 a
4) y 3 columnas (0 a 3).

Aplicación de Matriz escribiendo y leyendo elementos


Ahora vamos a declarar una variable de texto e iniciarla vacía:
string​ cartel =​""​;

En una de las posiciones de la matriz vamos a poner una letra “​X”​; nótese que
ahora vamos a establecer dos índices para indicar la posición a escribir:
matriz[2, 1] = ​"X"​;

Ahora vamos a recorrer cada posición de la matriz, e ir guardando todo el


contenido en nuestra variable “cartel”:
​for​ (​int​ f = 0; f < 5; f++)
{
​for​ (​int​ c = 0; c < 3; c++)
{
​if​ (matriz[f, c] == ​null​)
{
cartel = cartel + ​"O-"​;
}
​else
{
cartel = cartel + matriz[f, c] + ​"-"​;
}
}
cartel = cartel + ​"\n"​;
}

Imprimirá la variable Cartel


Console.WriteLine(cartel);

Imprimirá el texto "Press any Key"


Console.WriteLine(​"Press any key"​);

Página 7 de 12
Teoría de los Lenguajes y Algoritmos

Arreglos Estáticos

El programa se detendrá hasta que presione una Tecla:


Console.ReadKey();

Lo ejecutamos y vemos el resultado:

Conocer dinámicamente el límite de un arreglo


Primeramente tengamos en cuenta que los índices utilizados para inicializar
arreglos nunca deberían tener un número directo como en los ejemplos
anteriores, sino utilizar una constante:

En nuestro ejemplo anterior, en lugar de tener:


string​[,] matriz = ​new​ String[5, 3];

Deberíamos tener:
const​ ​int​ ultFila = 5;
const​ ​int​ ultCol = 3;
string​[,] matriz = ​new​ String[ultFila, ultCol];

En este esquema, si necesitamos cortar los bucles en los límites máximos,


podríamos usar las mismas constantes. En lugar de:

​for​ (​int​ f = 0; f < 5; f++)


{
​for​ (​int​ c = 0; c < 3; c++)
{

Con constantes tendremos:


​for​ (​int​ f = 0; f < ultFila; f++)
{
​for​ (​int​ c = 0; c < ultCol; c++)
{

Página 8 de 12
Teoría de los Lenguajes y Algoritmos

Arreglos Estáticos

Cuando sea necesario conocer dinámicamente el número de posición máxima


de un arreglo (en temas posteriores veremos casos en donde resulta de
utilidad) podemos indicarlo con:

nombreArreglo.GetUpperBound(número dimensión)

En nuestro ejemplo:
matriz.GetUpperBound(0)

Resulta igual a 4, y:

matriz.GetUpperBound(1)
Resulta igual a 2

Nótese que devuelve la última posición y no la cantidad de posiciones. Por esta


razón es que para aplicarlo en nuestro ejemplo tenemos que cambiar los
operadores < por <=
​For​ (​int​ f = 0; f <= matriz.GetUpperBound(0); f++)
{
​for​ (​int​ c = 0; c <= matriz.GetUpperBound(1); c++)
{

Con esto obtenemos el mismo resultado original.

Valor original de las posiciones. Concepto de “Nulo”.

Cuando definíamos variables (sin arreglos) tomamos la precaución de “pisar” el


valor original antes de leerlo por primera vez. Esto fue sencillo realizándolo de
esta manera:

string​ variable = ​""​;

Ahora que definimos vectores, la única manera disponible en C# para “pisar”


todos los valores que contiene es recorriendo con un bucle y asignando ​"" a
cada una de ellas.

Veamos qué pasa si no lo hacemos, y comparamos una posición cualquiera


contra "​ "​:

String[] nombres;
nombres = ​new​ String[10];

Página 9 de 12
Teoría de los Lenguajes y Algoritmos

Arreglos Estáticos

​if​ (nombres[0] == ​""​)


{
Console.WriteLine(​"Es vacío"​);
} ​else
{
Console.WriteLine(​"No es vacío"​);
}
Console.Write(​"Presione una tecla para salir"​);
Console.ReadKey();

Ocurre que las posiciones se inicializan con un valor distinto a vacío, llamado
en programación “Nulo” (o “Null” en inglés). Agreguemos esta comparación y
observemos el resultado:

​if​ (nombres[0] == ​null​)


{
Console.WriteLine(​"Es nulo"​);
}
​else
{
Console.WriteLine(​"No es nulo"​);
}

Si quisiéramos una comparación que devuelva verdadero ya sea vacío o nulo


podemos usar:

string.IsNullOrEmpty(variable);

Página 10 de 12
Teoría de los Lenguajes y Algoritmos

Arreglos Estáticos

Por ejemplo:

​if​ (​string​.IsNullOrEmpty(nombres[0]))
{
Console.WriteLine(​"Es nulo o vacío"​);
}

nombres[0] = ​""​;
​if​ (​string​.IsNullOrEmpty(nombres[0]))
{
Console.WriteLine(​"Es nulo o vacío"​);
}

El comportamiento completo queda así:

Ordenamiento rápido de un vector

Si tenemos un vector con elementos que queremos ordenar de forma


ascendente podemos utilizar:

Array.Sort(nombreArreglo);

Tengamos en cuenta sin embargo que si tuviéramos un arreglo de texto con


posiciones vacías, las mismas quedarán al principio del resultado ordenado:

Arreglo original:

JOSE

ANA
DANIEL

Página 11 de 12
Teoría de los Lenguajes y Algoritmos

Arreglos Estáticos

Arreglo ordenado:

ANA
DANIEL
JOSE

Para poder obtener un resultado como el siguiente tenemos que armar una
lógica de recorrido y ordenamiento que veremos en documentos posteriores:

ANA
DANIEL
JOSE

Fuentes
https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Arrays_y_c
adenas_de_texto

https://docs.microsoft.com/en-us/dotnet/api/system.array.sort?view=netframewo
rk-4.7.2

Página 12 de 12

También podría gustarte