diff --git a/fundamentos-programacion/PR3/README.md b/fundamentos-programacion/PR3/README.md index 530fd87..84517f4 100644 --- a/fundamentos-programacion/PR3/README.md +++ b/fundamentos-programacion/PR3/README.md @@ -19,7 +19,6 @@ - [16.6.2 Algoritmo de ordenación](#1662-algoritmo-de-ordenación) - [16.6.3 Importancia del orden en las tablas](#1663-importancia-del-orden-en-las-tablas) - [16.6.3.1 Ejemplo](#16631-ejemplo) - - [16.6.3.2 Ejemplo](#16632-ejemplo) - [16.7 Tabla de tipos estructurados](#167-tabla-de-tipos-estructurados) - [16.7.1 Tablas de tuplas](#1671-tablas-de-tuplas) - [16.7.2 Tabla de tablas](#1672-tabla-de-tablas) @@ -994,27 +993,201 @@ int main(int argc, char** argv) { ### 16.6.3 Importancia del orden en las tablas +Si analizamos el anterior algoritmo de búsqueda, podemos ver que, en el peor de los casos, cuando el elemento buscado no se encuentra en la tabla se debe recorrer la tabla entera. Es una búsqueda de orden lineal, es decir, recorre todos los elementos. +Hay maneras más óptimas de buscar elementos dentro de una tabla, pero requieren que la tabla esté ordenada, cosa que podemos obtener o bien insertando los elementos en orden o bien ordenando la tabla posteriormente. + +Con una tabla ordenada se puede plantear otra forma, no empezando en la primera posición sino empezando por el medio: +1. Calculamos la posición que está en el medio. +2. Comparamos su contenido con el valor buscado. +3. Si el contenido es el valor buscado, hemos terminado. Si no, hacemos los siguiente + 1. Si el elemento del medio es mayor podemos descartar la segunda mitad de la tabla y buscamos en la primera mitad. + 2. En caso contrario, pues viceversa. +4. Aplicamos el mismo procedimiento pero trabajando con la mitad de la tabal que no hemos descartado. #### 16.6.3.1 Ejemplo +Siguiendo el ejemplo de los cines, sunpogamos que queremos buscar si ha habido alguna sala con una recaudación de 100€, suponiendo que la tabla está ordenada. +```alg +const + MAX_THEATERS: integer = 20; +end const +type + tTheater = record + collect: vector[MAX_THEATERS] of real; + numTheaters: integer; + end record +end type -#### 16.6.3.2 Ejemplo +action searchValue(in movieTheater: tTheater, in value: real, out position: integer) + var + i: integer; + first, last, middle: integer; + end var + first:= 1; + position:= -1; + last:= movieTheater.numTheaters; + while (first≠last) do + middle:= (first + last) div 2; + if movieTheater.collect[middle] < value then + first:= middle + 1; + else + last:= middle - 1; + end if + end while + + if movieTheater.collect[first] = value then + position:= first; + end if +end action +``` + +```c +#include +/* type definition for a table of 20 elements */ +#define MAX_THEATERS 20 + +typedef struct { + float collect[MAX_THEATERS]; + int numTheaters; +} tTheater; + +void searchValue(tTheater movieTheater, float value, int *position) { + /* var definition */ + int i; + int first, last, middle; + + first = 0; + *position = -1; + last = movieTheater.numTheaters-1; + + while (first != last) { + middle = (first + last) / 2; + + if (movieTheater.collect[middle] < value) { + first = middle + 1; + } else { + last = middle; + } + } + + if (movieTheater.collect[first] == value) { + *position = first; + } +} +``` ## 16.7 Tabla de tipos estructurados - - - ### 16.7.1 Tablas de tuplas +Las tablas pueden ser de cualquier tipo de datos, ya sean tipos básicos del lenguaje de programación o tipos estructurados definidos por el usuario. +Siguiendo con el ejemplo de los cines, vamos a suponer que, además de la recaudación, queremos guardar más información de cada sala. + +Tal y como trabajabamos hasta ahora se podía suponer que la posición 1 correspondía a la sala 1, la posición 2 a la sala 2, etc. Pero cuando hemos ordenado los importes hemos perdido está información. + +Podemos definir una tupla con la información de cada sala, por ejemplo, que tenga un entero para la capacidad de la sala, una cadena de caracteres para identificar el nombre de la sala, un real para la recaudación y la fecha de la recaudación. De esta forma, si movemos los elementos de la tabla no perderemos información. + +```alg +const + MAX_THEATERS: integer = 20; +end const + + +type + {declaration of a type for dates} + tDate = record + day: integer; + month: integer; + year: integer; + end record; + + {declaration of type for theater information} + tTheaterDescription = record + name: string; + capaciy:integer; + collect: real; + date: tDate + end record; + + {table with the information of each theater} + tTheater = record + movieTheaters: vector[MAX_THEATERS] of tTheaterDescription; + numTheaters: integer; + end record; + +end type + +algorithm movieTheater + var + santalo: tTheater; + k: integer; + end var + + {we can access the information in the folowing way} + {to access to the name of the third theater in santalo} + santalo.movieTheaters[3].name; + + {to access to the filed collect of the k th theater in santalo} + santalo.movieTheaters[k].collect; + + {to access to the capacity of the last theater stored in the table santalo} + santalo.movieTheaters[santalo.numTheaters].capacity; +end algorithm +``` + +```c +#include +#define MAX_THEATERS 20 +#define MAX_NAME 50 + +typedef struct { + int day; + int month; + int year; +} tDate; + +typedef struct { + char name[MAX_NAME]; + int capacity; + float collect; + tDate date; +} tTheaterDescription; + +typedef struct { + tTheaterDescription movieTheaters[MAX_THEATERS]; + int numTheaters; +} tTheater; + +int main(int argc, char** argv) { + tTheater santalo; + int k; + + /* we can access the information in the folowing way */ + /* to access to the name of the third theater in santalo */ + santalo.movieTheaters[2].name; + + /* to access to the filed collect of the k th theater in santalo */ + santalo.movieTheaters[k-1].collect; + + /* to access to the capacity of the last theater stored in the table santalo */ + santalo.movieTheaters[santalo.numTheaters-1].capacity; + + return 0; +} + +``` + +Comentarios: +- Podemos ver que se ha definido una tabla igual que antes, pero ahora cada elemento es una estructura con varios campos. +- Con una variable del tipo tTheater podemos acceder a toda la información siguiendo la misma notación que para las tablas y las tuplas. ### 16.7.2 Tabla de tablas @@ -1022,4 +1195,5 @@ int main(int argc, char** argv) { + [Volver arriba](#pr-1)