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
[email protected]
[email protected]
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)
[email protected]
●
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