Download Tema 7: Estructuras de datos: Repaso parte 1 + atributos
Document related concepts
no text concepts found
Transcript
Estructuras de datos: Vectores y Matrices (Repaso clase anterior + Atributos First y Last) Vectores Matrices Indice Columna A(1) A(2) A(3) A(4) A(5) Fila A(1,2) A(1,3) A(1,4) A(2,2) A(2,3) A(2,4) Javier Miranda, Luis Hernández, Francisco Guerra jmiranda@iuma.ulpgc.es lhernandez@dit.ulpgc.es A(3,2) A(3,3) A(3,4) ● El tipo del índice debe ser enumerable (entero, positivo, natural, o carácter; no puede ser Float ni String) fguerra@iuma.ulpgc.es ● Vectores en Ada procedure Ejemplo_Vectores is Vector_1 : array (1 .. 10) of Integer; Vector_2 : array (Positive range 1 .. 10) of Integer; Sueldo : array (2004 .. 2025) of Integer; Tabla_Reales : array (1 .. 30) of Float; Ejemplo: Recorrido de un vector Fíjate que puedes indicar el tipo de dato del indice -- Ejemplo: Recorrido de un vector que contiene -- números naturales ... y que puedes indicar cualquier rango de valores válidos para el índice 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; ... 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; Cada elemento se trata como una variable independiente ... 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 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 Vector’First .. Vector’Last loop ... Vector (I) := 0; ... end loop; end Recorrer_Vector; 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 la posición (dentro de la tabla) del número más pequeño. 1 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 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 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; Formación bidimensional (Matriz) Existen dos índices asociados a cada elemento. A(1,2) A(1,3) A(1,4) A(2,2) A(2,3) A(2,4) ● En Ada sería: Primero fijamos el nombre del nuevo tipo de dato; después lo utilizamos igual que utilizamos cualquiera de los tipos básicos de Ada Ejercicios: Uso de vectores con procedimientos y funciones procedure Ejemplo_Subprogramas is type T_Tabla is array (1 .. 5) of Integer; ● • 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; procedure Sumar (Tabla : in T_Tabla; Resultado : out Integer) is begin ... end Sumar; Definición de tipo de dato: Vector A(3,2) A(3,3) A(3,4) A: array (Integer range 1 .. 3, Integer range 2 .. 4) of T_Elemento; 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 X y calcula cual es la posición de X 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 que recibe dos vectores con coordenadas cartesianas y devuelve el vector suma. Recorrido de una matriz procedure Ejemplo is Matriz : array (1 .. 3, 2 .. 4) of Positive; begin for I in 1 .. 3 loop ... for J in 2 .. 4 loop ... Matriz (I , J) := Valor; ... end loop; ... end loop; end Ejemplo; 2 Recorrido de una matriz procedure Ejemplo is Matriz : array (1 .. 3, 2 .. 4) of Positive; begin for I in Matriz’First (1) .. Matriz’Last (1) loop ... for J in Matriz’First (2) .. Matriz’Last (2) loop ... Matriz (I , J) := Valor; ... end loop; ... end loop; end Ejemplo; procedure Ejemplo_Subprogramas is type T_Tabla is array (1 .. 3, 1 .. 3) of Integer; procedure Sumar (Tabla : in T_Tabla; Resultado : out Integer) is begin ... end Sumar; function Maximo (Tabla : in T_Tabla) return Integer is begin ... end Maximo; Mi_Tabla : T_Tabla := (1 => (1, 2, 3), 2 => (4, 5, 6), 3 => (7, 8, 9)); Valor_Maximo : Integer; begin Valor_Maximo := Maximo (Mi_Tabla); end Ejemplo_Subprogramas; Ejercicios: Uso de matrices con procedimientos y funciones Escribe un programa que contenga los siguientes subprogramas: 1. Procedimiento que calcula la suma de todos los números de una matriz 2. Función que calcula cual es el número más grande que hay en la matriz 3. Funcion que calcula la suma de todos los números que hay en el borde de una matriz 4. Función que recibe como parámetro una matriz y un número y calcula cual es la posición de dicho número dentro de la matriz. La búsqueda debe comenzar por la esquina superior izquierda de la matriz, o sea por el elemento (1,1), y se hace un recorrido por filas hasta el (N,N). Si no encuentra el número la función devuelve el valor 0. 5. Función idéntica a la anterior pero que realiza la búsqueda desde la esquina inferior derecha de la matriz, o sea por el elemento (N,N) hasta el (1,1) y hace el recorrido por columnas en vez de por filas. 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; Uso de matrices con procedimientos y funciones Fíjate cómo puedes inicializar una matriz; cada fila se comporta como un vector. 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) Ejercicios: Uso de strings con procedimientos y funciones Escribe un programa que contenga los siguientes subprogramas: 1. Procedimiento que recibe una frase y cambia todas las vocales por otra letra que tú elijas. 2. Función que devuelva verdadero si el contenido de un frase es un número entero (de esta forma podemos utilizarla en nuestros programas para comprobar que Integer’Value no va a dar ningún error). 3. Procedimiento que recibe como parámetro una palabra y devuelve la palabra escrita justo al revés. 4. Función que recibe como parámetro una palabra y devuelve verdadero si es palíndroma (o sea que se escribe igual de derecha a izquierda que de izquierda a derecha). 5. Función que calcula la posición de una palabra dentro de una frase. 6. Procedimiento que recibe como parámetros una frase y una palabra y borra dicha palabra de la frase; si no encuentra la frase simplemente devuelve la frase sin ninguna modificación. 3 Matrices Irrestringidas Matrices Irrestringidas type T_Matriz is array (Positive range < >, Positive range < >) of Integer; Fíjate que el rango de los índices no es fijo; < > significa que el rango no se sabe aún y que se fijará cuando declares la matriz Matriz_1 : T_Matriz (1 .. 10, 1 .. 20); Matriz_2 : T_Matriz (1 .. 3, 1 .. 4); type T_Matriz is array (Positive range < >, Positive range < >) of Integer; Matriz : T_Matriz (1 .. 10, 1 .. 20); Para que sea más fácil programar con matrices irrestringidas debes utilizar los atributos ‘First y ‘Last, que te permiten saber cuales son los valores que se utilizaron cuando se declaró la matriz. Recuerda que el número indica si quieres el valor del primer indice o el segundo: Ejemplo de uso Matrices Irrestringidas : Ejemplo type T_Matriz is array (Positive range < >, Positive range < >) of Integer; function Suma (Matriz : in T_Matriz) return Integer is Total : Integer := 0; begin for I in Matriz’First (1) .. Matriz’Last (1) loop for J in Matriz’First (2) .. Matriz’Last (2) loop Total := Total + Matriz (I, J); end loop; end loop; return Total; Suma todos los valores end Suma; almacenados en la matriz Matriz’First (1) Matriz’Last (1) Matriz’First (2) Matriz’Last (2) AVISO IMPORTANTE PARA PRÁCTICAS type T_Matriz is array (Positive range < >, Positive range < >) of Integer; Debes modificar la declaración del tipo matriz de tu práctica para que sea exactamente el que hemos utilizado en estos ejemplos. También tienes que modificar todos tus procedimientos Para que tu programa sume, reste y multiplique matrices de CUALQUIER TAMAÑO. 4