Almacenamiento de datos

Supongamos que ha desarrollado un juego de computadora llamado "Usuario hostil" en el que los jugadores compiten contra una interfaz de computadora intrincada y hostil. Ahora necesita escribir un programa que rastree las ventas mensuales de este juego durante un período de cinco años. O supongamos que necesita hacer un inventario de los cromos de Hacker Hero.
Muy pronto llegará a la conclusión de que necesita más que simples tipos de datos básicos para almacenar y procesar información.
 

Matrices (listas). Introducción

Para facilitar el trabajo con una gran cantidad de datos, a un grupo de celdas se le asigna un nombre común. Este grupo de celdas se denomina matriz
Array – es un grupo de celdas de memoria del mismo tipo, ubicadas una al lado de la otra y que tienen un nombre común. Cada celda del grupo tiene un número único.

Al trabajar con arreglos, debe aprender a resolver tres tareas:
X asignar memoria del tamaño requerido para una matriz
X escribir datos en la celda deseada
X leer datos de la celda


Matrices en Pascal


Tradicionalmente, Pascal usa matrices estáticas como

var a: matriz [1..10] de enteros;

Los límites de una matriz deben establecerse mediante constantes y no puede cambiar el tamaño de una matriz durante la operación del programa. Pero puede crear un índice no solo de un número entero, sino también, digamos, de un carácter o tipo enumerado. Por ejemplo, para contar la ocurrencia de cada letra, puede usar una matriz

var LettersCount: matriz ['a'..'z'] de enteros;

y trabaja con él al contenido de tu corazón:

Número de Letras['z'] := 1; Número de letras['d'] := Número de letras['d'] + 1;

Las desventajas de tales arreglos son conocidas: si no se sabe de antemano cuántos elementos se necesitarán usar, entonces se asigna el tamaño máximo de memoria para el arreglo. Como resultado, en la mayoría de los casos "abastecemos para el futuro" y, a veces, esta "reserva" resulta no ser suficiente. Es por eso que estas matrices se denominan  estáticas: su tamaño es estático y debe configurarse en la etapa de compilación del programa. Sin embargo, en Pascal existen  matrices dinámicas, cuyo tamaño no solo se puede establecer, sino también cambiar en el transcurso del programa. Son estas matrices y las ventajas de usarlas las que se discutirán más adelante.

Crear una matriz

Al crear una matriz, se asigna espacio en la memoria (una cierta cantidad de celdas) 1) Las matrices se pueden creado simplemente listando los elementos: var a: matriz de enteros; EstablecerLongitud(a, 3); a[0] := 1; a[1] := 2; a[2] := 3;
2) Las matrices pueden estar compuestas por datos de cualquier tipo: números enteros o reales, cadenas de caracteres  var a: matriz de caracteres; EstablecerLongitud(a, 3); a[0] := 'a'; a[1] := 'b'; a[2] := 'c'; 3) Una matriz siempre "sabe" tu talla. La función  length se utiliza para determinar el tamaño de una matriz. A menudo, el tamaño de la matriz se almacena en una variable separada para que el programa se pueda cambiar fácilmente para que funcione con un tamaño de matriz diferente. Ejemplo: N := 10; // en la variable N almacenamos el tamaño del arreglo EstablecerLongitud(a, N); // establecer matriz y tamaño N writeln(longitud(a)); //mostrar el tamaño de la matriz El tamaño de una matriz se puede establecer desde el teclado.

Hacer referencia a un elemento de matriz

Gran parte de la utilidad de las matrices proviene del hecho de que se puede acceder a sus elementos individualmente.
La forma de hacer esto es usar un índice para numerar los elementos.
Índice es un valor que apunta a un elemento de matriz específico

¡RECUERDA!
NUMERACION DE ARRAYS EN PASCAL COMIENZA DE CERO!

(Esto es obligatorio: debe comenzar desde cero. Es especialmente importante recordarlo)

Ejemplos de acceso a la matriz A: x := (A[3] + 5) * A[1] // lee los valores de A[3] y A[1] A[0] := x + 6 // escribe un nuevo valor en A[0] Analicemos el programa para trabajar con elementos de matriz. var i: entero; a: matriz de enteros; comenzar     yo := 1;     conjuntolongitud(a, 5); //crear una matriz de 5 elementos      a[0] := 23; // a cada uno de los 5 elementos de la matriz (índices de 0 a 4)     a[1] := 12; // escribir un valor específico     a[2] := 7;     a[3] := 43;     a[4] := 51;     a[2] := a[i] + 2 * a[i - 1] + a[2 * i]; // cambia el valor del elemento con índice 2 al resultado de la expresión     // porque i=1, entonces reemplazando el valor de la variable i en la expresión obtenemos     // siguiente expresión  a[2] := a[1] + 2*a[0] + a[2];     writeln(a[2] + a[4]); fin.
Como resultado de ejecutar este programa aparecerá en pantalla el valor de la suma de los elementos del arreglo con índice 2 y con índice 4 igual a 116. Como puede ver en el ejemplo, podemos acceder a cualquier elemento de la matriz . Y también calcule el número requerido del elemento usando varias fórmulas (por ejemplo, como en el programa A[i-1] o A[2*i], en estos casos, los índices de los elementos se calcularán y dependerán de la valor de i.)

Veamos un programa de ejemplo var a: matriz de enteros; comenzar     conjuntolongitud(a, 5);     a[5] := 5; a[-1] := 0; fin.

Porque la matriz se declara con 5 elementos, por lo que los elementos se enumerarán del 0 al 4. Vemos que el programa en la línea 6 se refiere a un elemento inexistente [5] y en la línea 7 a la también inexistente a[-1].

Resulta que el programa fue más allá de los límites de la matriz
La matriz fuera de los límites está accediendo a un elemento con un índice que no existe en la matriz.
En tales casos, el programa suele fallar con error de tiempo de ejecución


 
 

Cuando se trabaja con arreglos, por lo general tiene que trabajar con todos los elementos del arreglo a la vez.
Iterando a través de los elementos: miramos a través de todos los elementos de la matriz y, si es necesario, realizamos alguna operación en cada uno de ellos.
Para esto, se usa con mayor frecuencia un bucle con una variable, que cambia de 0 a N-1, donde N es el número de elementos de la matriz.
Bajo N consideraremos el tamaño actual de la matriz, es decir
N := longitud(A) ... para i := 0 a n - 1 empiezan // aquí trabajamos con a[i] fin; ... En el bucle especificado, la variable i tomará los valores 0, 1, 2, ..., N-1.  Así, en cada paso del ciclo, accedemos a un elemento específico de la matriz con el número i.
Por lo tanto, basta con describir lo que se debe hacer con un elemento de la matriz a[i] y colocar estas acciones dentro de dicho ciclo.

Escribamos un programa que llene la matriz con los primeros N números naturales, es decir, al final del programa, los elementos de la matriz deben volverse iguales un[0] = 1 un[1] = 2 un[2] = 3 ... a[N - 1] = N Es fácil ver el patrón: el valor de un elemento de matriz debe ser mayor en 1 que el índice del elemento.
El bucle se verá así para i := 1 a n - 1 hacer a[yo] := yo + 1; Completa la tarea.