Curso-lenguaje-C/fundamentos-programacion/PR4
2024-06-02 19:51:39 +02:00
..
README.md Update PR4 2024-06-02 19:51:39 +02:00

PR 3

Volver a la página principal de "Fundamentos de la Programación"

Índice

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:

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
#include <stdio.h>

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.

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
#include <stdio.h>
#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