Update PR3

This commit is contained in:
Manuel Vergara 2024-05-21 19:23:18 +02:00
parent d051891be2
commit 036bb9d949

View File

@ -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 <stdio.h>
/* 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 <stdio.h>
#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)