Las tablas y las estructuras
Presentación
1. Principio y definición
a. Simplificar los variables
Hasta ahora, los tipos de datos que ha visto eran escalares, salvo para las cadenas de caracteres. Recuerde que un escalar es un tipo de dato que solo representa una única variable al mismo tiempo: la variable solo representa uno y solo un dato. Un entero, un carácter, un real, un buleano, etc., estos son los escalares. Una cadena de caracteres no es un escalar: se trata de una sucesión o lista de caracteres, unos detrás de otros. Por lo tanto, una cadena es una lista de escalares ordenada por usted mismo. Los lenguajes normalmente ofrecen un tipo específico para las cadenas de caracteres, pero es una facilidad ofrecida por estos. Un lenguaje como C no lo ofrece: el lenguaje solo reserva la memoria que recibirá cada carácter, uno a uno. Nada impide introducir otra cosa. En algoritmia se utiliza el tipo alfanumérico, por lo que será necesario prestar atención durante la conversión en C. Afortunadamente, Python ofrece un tipo así, incluso si como normalmente, detrás de las apariencias se oculta una realidad tramposa...
Pero entonces, ¿cómo se representa una cadena de caracteres con un tipo escalar? Para esto es necesario recordar cómo se sitúa la información en memoria. La memoria del ordenador está compuesta por casillas que pueden contener determinada información. Estas casillas están numeradas (se habla de dirección de la casilla o de dirección de memoria simplemente) y contienen datos. Estos datos representan lo que quiera, según el contexto de su uso. Por ejemplo pueden partir del principio de que contienen escalares. Si una casilla de memoria contiene el número 65, este puede ser el valor entero 65 o el código ASCII del carácter "A". Una casilla de memoria puede perfectamente contener la dirección de otra casilla de memoria: en realidad es un poco más complicado y este será el objeto de una explicación más amplia, más adelante en este libro.
Por lo tanto, una cadena de caracteres es una sucesión de escalares de tipo carácter, una detrás de otras, en casillas de memoria en principio contiguas. Según el mismo principio, si se retoma el ejemplo del capítulo anterior que consistía en introducir...
Operaciones sencillas
1. Búsqueda de un elemento
Dispone de una tabla de n elementos, con los nombres de sus amigos. Quiere saber si uno de ellos está presente en su tabla. Para esto, es necesario buscarlo. El principio consiste en recorrer toda la tabla con ayuda de una estructura iterativa y salir cuando se encuentre el elemento o se alcanza el número máximo de índice. En la salida del bucle, será necesario comprobar de nuevo para saber si se ha encontrado el elemento o no. En efecto puede ser que se haya recorrido toda la tabla y que esta sea la razón de la salida del bucle.
PROGRAMA BUSQUEDA
VAR
Tabla nombres:tabla[1..10] cadenas
busq:cadena
i:entero
INICIO
i←1
MientrasQue i<=10 y nombres[i]<>busq Hacer
i←i+1
FinMientrasQue
i←i-1
Si nombre[i]=busq Entonces
Mostrar "Encontrado"
EnOtroCaso
Mostrar "Ausente"
FinSi
FIN
Se puede hacer de manera diferente con un flag:
PROGRAMA BUSQUEDA2
VAR
Tabla nombres:tabla[1..10] de cadenas
busq:cadena
i:entero
encontrado:buleano
INICIO
i←1
encontrado←FALSO
MientrasQue i<=10 y encontrado=FALSO Hacer
Si nombre[i]=busq Entonces
encontrado←VERDADERO
FinSi
i←i+1
FinMientrasQue
Si encontrado Entonces
Mostrar "Encontrado"
EnOtroCaso
Mostrar "Ausente"
FinSi
FIN
En Python:
t=[10,20,14,25,17,8,10,12,15,5,41,19,2,6,21]
i=0
encontrado=False
busq=15
while i < len(t) and not encontrado:
if t[i]==busq:
encontrado=True
i=i+1
if encontrado:
print("Encontrado en la posición",i-1)
else:
print("")

Observe que es el caso típico...
Algoritmos avanzados
1. Los algoritmos de las ordenaciones
a. El principio
En los ejemplos anteriores, ha podido ver el interés de las tablas para el almacenamiento de valores múltiples. Pero en el siguiente caso puede ser útil necesitar obtener una lista ordenada de valores, por orden creciente o decreciente. Dicho de otra manera, quiere ordenar el contenido de la tabla. Considere el caso de un profesor que desea ordenar las notas de sus estudiantes, desde la más baja hasta la más alta, o los resultados de un sorteo de lotería para hacerla más legible.
Imagine un sorteo de lotería de cinco números, evidentemente todos diferentes. Los posibles valores están comprendidos entre 1 y 49. A continuación se muestra el estado inicial de la tabla resultado del sorteo:
48 |
17 |
25 |
9 |
34 |
Existen varios métodos que permiten ordenar estos diferentes valores. Todos ellos tienen sus ventajas y sus inconvenientes. De esta manera, un método será lento, el otro consumirá más memoria y así sucesivamente. Es su complejidad la que determina su uso principalmente para grandes rangos de valores.
En los siguientes algoritmos, la variable Cnt contiene el número de elementos de la tabla inicial y t[] es la tabla.
Es interesante tener en cuenta la complejidad de estos diversos algoritmos, aunque esta noción presentada en el primer capítulo, normalmente no se aborde (o poco) en los primeros años de estudio en informática. Los algoritmos normalmente tienen una complejidad parecida. Sin embargo, usar una ordenación shell es más rápido que una ordenación por selección, dependiendo del número de elementos y el eventual orden inicial de estos.
b. La ordenación por creación
La ordenación por creación solo se abordará desde el punto de vista teórico. En efecto, si este método parece sencillo, de hecho es pesado y complicado. Si preguntamos a un principiante en programación cómo ordenar una tabla, seguramente nos ofrecerá una solución basada en la creación de una segunda tabla en la que ir situando los elementos de la primera tabla en la orden creciente.
Es una muy mala idea por múltiples razones, entre las que figuran:
-
Añadir una segunda tabla duplica la memoria necesaria.
-
La búsqueda del elemento...
Estructuras y registros
1. Principio
Las tablas ciertamente son muy prácticas, pero no siempre permiten responder de manera eficaz a todas las necesidades de almacenamiento. Una tabla es una estructura de datos cuyos elementos son del mismo tipo. ¿Qué hacer cuando necesita situar algo en una estructura de tipo tabla de registros de diferentes tipos?
Como ejemplo concreto, piense en un catálogo de productos en una tienda especializada. Un artículo se describe con ayuda de una referencia, un nombre (etiqueta) y un precio. Los dos primeros son cadenas de caracteres, el último un número real. ¿Cómo representar esto con las tablas? Serían necesarias tres tablas: una para las referencias, otra para las etiquetas y una tercera para los precios. El índice del artículo debería ser idéntico para las tres tablas.
Es posible, se puede hacer, pero en la práctica es totalmente inmanejable desde el momento en que se trata de ir un poco más allá que de sencillas operaciones. ¿Qué piensa de las ordenaciones? ¿Y de las búsquedas? Esto sería complicado. Por lo tanto, sería necesario un tipo de meta-tipo particular, que podría agrupar en un único conjunto variables de diferentes tipos.
Estos meta-tipos existen. Se llaman estructuras o tipos estructurados y permiten describir registros. De hecho, los registros son estructuras de datos compuestas de elementos de diferentes tipos o no. Estas estructuras compuestas por varios elementos, forman una entidad única que se llama tipo estructurado.
Dicho de otra manera, puede crear sus propios tipos de datos combinando otros elementos de diferentes tipos o no, crear variables de este nuevo tipo, que llamamos registros. Los diferentes elementos contenidos en un tipo estructurado se llaman campos.
2. Declaración
a. Tipo estructurado
El tipo estructurado es opuesto a los tipos llamados primitivos vistos hasta ahora. Un tipo estructurado puede contener elementos de tipos primitivos (enteros, reales, cadenas, caracteres), tablas, así como elementos de otros tipos estructurados. Esto permite infinidad de nuevos tipos para todos los supuestos.
Un tipo estructurado se debe declarar y definir antes que las variables para que se pueda utilizar para definir registros. Por lo tanto, el tipo estructurado se declara entre las constantes y las variables....
Ejercicios
Ejercicio 1
Proporcione un algoritmo (y el código Python asociado) que permita encontrar el número de ocurrencias de un valor entero en una tabla de 20 valores.
Ejercicio 2
¿Cómo determinar si una tabla de enteros de una dimensión está ordenada crecientemente? Proporcione el algoritmo y el código Python.
Ejercicio 3
Una matriz matemática se puede representar por una tabla de dos dimensiones. La suma de dos matrices matemáticas del mismo tipo es la suma de cada elemento de la primera, con el elemento correspondiente de la segunda.
Indique cómo representar una matriz.
Realice la suma de dos matrices de tamaño idéntico (por ejemplo, de un tamaño de 3 x 2) y guarde el resultado en una tercera matriz.
Ejercicio 4
Retome el algoritmo de ordenación por inserción, pero para una ordenación decreciente (desde el más grande hasta el más pequeño). Después, con ayuda de un buleano llamado creciente, modifique el algoritmo y el código Python para aceptar los dos tipos de ordenación.
Ejercicio 5
En un colegio de primaria, una clase tiene un nivel, un profesor y contiene 20 estudiantes. Cada estudiante tiene un nombre, unos apellidos, una fecha de nacimiento y tendrá diez notas en el año. Hay cinco clases.
Proporcione las estructuras de los registros clase y estudiantes.
Escriba un algoritmo que muestre...