# PR 3 [Volver a la página principal de "Fundamentos de la Programación"](../README.md) **Índice** - [PR 3](#pr-3) - [17. Esquemas de recorrido y búsqueda](#17-esquemas-de-recorrido-y-búsqueda) - [17.1. Aprocimación intuitiva](#171-aprocimación-intuitiva) - [17.1.1. Ejemplo temperatura media](#1711-ejemplo-temperatura-media) - [17.1.2. Ejemplo](#1712-ejemplo) - [17.2. Esquema de recorrido](#172-esquema-de-recorrido) - [17.3. Esquema de búsqueda](#173-esquema-de-búsqueda) - [17.3.1. Ejemplo](#1731-ejemplo) - [17.4. Ejercicios](#174-ejercicios) ## 17. Esquemas de recorrido y búsqueda Ya hemos visto las estructuras secuencial, alternatica e iterativa, con esto, ya podemos resolver cualquier problema. Ahora vamos a ver esquemas de recorrido y búsqueda, que son una especie de patrones o estructuras predeterminadas para diseñar algoritmos de manera más sistemática y ganar en eficiencia y fiabilidad. Un esquema es una especie de plantilla que nos permite solucionar un tipo de problema específico con adaptaciones a cada caso concreto. Un ejemplo de aplicación de esquemas de recorrido y búsqueda es para resolver problemas de tratamiento de secuencias de manera más eficiente y sistemática. ### 17.1. Aprocimación intuitiva La idea es que, en lugar de ir a ciegas, sigamos un esquema de recorrido o búsqueda que nos permita ir avanzando de manera sistemática y eficiente. Por ejemplo, si tenemos que recorrer una matriz, podemos hacerlo por filas o por columnas, o si tenemos que buscar un elemento en una lista, podemos hacerlo de manera secuencial o binaria. #### 17.1.1. Ejemplo temperatura media Vamos a calcular la temperatura media de todo el año suponiendo que vamos leyendo por el canal de entrada las temperaturas medias de cada día: ```alg algorithm averageTemp var temperature: real; average: real; i: integer; end var i:= 0; average:= 0; while i < 365 do temperature:= readReal(); average:= average + temperature; i:= i + 1; end while write(average / 365.0); end algorithm ``` ```c #include int main(int argc, char** argv) { float temperature; float average; int i; i = 0; average = 0; while (i < 365) { scanf("%f", &temperature); average = average + temperature; i = i + 1; } printf("%f\n", average / 365.0); return 0; } ``` #### 17.1.2. Ejemplo Cargamos los datos de una tabla de recaudaciones de una sala de cine a partir de lo leído por el canal de entrada estándar. ```alg const MAX_THEATERS: integer = 20; END_SEQ: real = -1.0; end const type tTheater = record collect: vector[MAX_THEATERS] real; numTheaters: integer; end record end type action fillTable(inout movieTheater:tTheater); var i: integer; temp: real; end var temp:= readReal(); {We read the first value} movieTheater.numTheaters:= 0; while temp ≠ END_SEQ do movieTheater.numTheaters:= movieTheater.numTheaters + 1; movieTheater.collect[movieTheater.numTheaters]:= temp; temp:= readReal(); end while end action ``` ```c #include #define END_SEQ -1 #define MAX_THEATERS 20 typedef struct { float collect[MAX_THEATERS]; int numTheaters; } tTheater; void fillTable(tTheater *movieTheater) { /* var definition */ int i; float temp; /* table initialization */ temp = 0; movieTheater->numTheaters = 0; scanf("%f", &temp); /* read the first value */ /* iteration while the read number is not -1 */ while (temp != END_SEQ) { /* Save the read number in the table */ movieTheater->collect[movieTheater->numTheaters] = temp; movieTheater->numTheaters = movieTheater->numTheaters + 1; scanf("%f", &temp); } } ``` ### 17.2. Esquema de recorrido ### 17.3. Esquema de búsqueda #### 17.3.1. Ejemplo ### 17.4. Ejercicios [Volver arriba](#pr-1)