Tipos de estructuras de datos Estructuras de datos (primera parte) ● Formación (array) ● Clase de hoy ● ● Javier Miranda, Francisco Guerra, Luis Hernández [email protected] [email protected] [email protected] ● Sólo exite un índice asociado a la posición. Especialización de formación Datos heterogéneos Vectores en Ada procedure Ejemplo_Vectores is Vector_1 : array (1 .. 10) of Integer; Vector_2 : array (Positive range 1 .. 10) of Integer; A(2) A(3) A(4) A(5) A(6) Sueldo ● ● El tipo del índice debe ser enumerable (no puede ser Float) Cada elemento se puede procesar como una variable independiente. A (3) ● Valor En Ada seria: A : array (2 .. 6) of Integer; Ejemplo: Recorrido de un vector -- Ejemplo: Recorrido de un vector que contiene -- números naturales procedure Recorrer_Vector is Vector: array (2 .. 6) of Natural; begin for I in 2 .. 6 loop ... Vector (I) := 0; ... end loop; end Recorrer_Vector; ''En un lugar de la mancha ...'' Registro (record) ● Formación Unidimensional (Vector) Último Cadena de caracteres (string) ● ● Primero Datos homogéneos Orden por posición : array (2004 .. 2025) of Integer; Tabla_Reales : array (1 .. 30) of Float; Fíjate que puedes indicar el tipo de dato del indice ... y que puedes indicar cualquier rango de valores válidos para el índice ... y que el contenido de cada elemento del vector puede ser cualquier tipo de dato Tabla_Enteros : array (1 .. 4) of Integer := (1 => 10, 2 => 20, others => 0); begin ... Sueldo (2003) := 1000; end Ejemplo_Vectores; ... y que el puedes indicar el valor inicial del vector Si el programa intenta utilizar elementos del vector fuera del rango valido Ada eleva La excepción Constraint_Error Ejercicios: Recorrido de un vector 1. Escribe un programa que lea 10 números, los guarde en una tabla y calcule la suma de los 10 números. 2. Modifica el programa anterior para que nos diga cual es el número más grande que hay en la tabla. 3. Modifica el programa anterior para que nos diga cual es el la posición (dentro de la tabla) del número más pequeño. 1 Definición de tipo de dato: Vector Definición de tipo de dato: Vector • A veces necesitamos declarar varios vectores del mismo tamaño. Un error frecuente es que cuando modifiquemos el tamaño de uno tenemos que recordar modificarlos todos • Solución: Para evitar errores lo mejor es declarar un nuevo tipo de dato procedure Ejemplo is type T_Tabla is array (1 .. 30) of Integer; procedure Ejemplo is Tabla_1 : array (1 .. 30) of Integer; Tabla_2 : array (1 .. 30) of Integer; Tabla_3 : array (1 .. 30) of Integer; Tabla_4 : array (1 .. 30) of Integer; begin ... end Ejemplo; Tabla_1 : T_Tabla; Tabla_2 : T_Tabla; Tabla_3 : T_Tabla; Tabla_4 : T_Tabla; begin ... end Ejemplo; Uso de vectores con procedimientos y funciones Ejercicios: Uso de vectores con procedimientos y funciones procedure Ejemplo_Subprogramas is type T_Tabla is array (1 .. 5) of Integer; procedure Sumar (Tabla : in T_Tabla; Resultado : out Integer) is begin ... end Sumar; Para utilizar vectores con procedimientos y funciones siempre tenemos que declarar el tipo de dato (es obligatorio) function Maximo (Tabla : in T_Tabla) return Integer is begin ... end Maximo; Mi_Tabla : T_Tabla := (10, 2, 41, 99, 1); Valor_Maximo : Integer; begin Valor_Maximo := Maximo (Mi_Tabla); end Ejemplo_Subprogramas; Strings ● Ahora que conocemos los vectores vemos que las strings son vectores de caracteres type String is array (Positive range < >) of Character; Fíjate que el rango del índice de las strings no es fijo; < > significa que el rango no se sabe Aún y que hay indicarlo al declarar las strings Esta característica se conoce como definición de un array irrestringidos y puede utilizarse con cualquier tipo de vector, No solamente con los de caracteres (volveremos a verlo más adelante) Primero fijamos el nombre del nuevo tipo de dato; después lo utilizamos igual que utilizamos cualquiera de los tipos básicos de Ada Escribe un programa que contenga los siguientes subprogramas: 1. Procedimiento que calcula la suma de todos los números de una tabla 2. Función que calcula cual es el número más grande que hay en la tabla. 3. Función que recibe como parámetro una tabla y un número y calcula cual es la posición de dicho número dentro de la tabla (comenzando la búsqueda por el principio de la tabla). Si no encuentra el número la función devuelve el valor 0. 4. Función idéntica a la anterior pero que realiza la búsqueda desde el final de la tabla hacia el principio. 5. Función que recibe dos vectores de números enteros y devuelve el vector suma (un vector con la suma de los vectores, componente a componente) Ejemplo: Recorrido de Strings with Text_IO; procedure Ejemplo is Frase : String (1 .. 40); Longitud_Frase : Natural := 0; begin -- Lleno la frase de espacios en blanco for I in 1 .. 40 loop -- Cada una de las letras que componen la frase -- se trata como un “character” independiente; -- por eso se pone con comilla simple, no doble Frase (I) := ' '; end loop; -- Leo una frase desde teclado Text_IO.Get_Line (Frase, Longitud_Frase); -- Escribo cada letra en una linea for I in 1 .. Longitud_Frase loop Text_IO.Put ( Frase (I) ); Text_IO.New_Line; end loop; end Ejemplo; 2 Resumen First ● ● ● Formación (array) ● Datos homogéneos ● Orden por posición Last Range Hemos visto sólamente arrays unidimensionales Las cadenas de caracteres (strings) son un caso particular type String is array (Positive range < >) of Character; 3