arreglos busquedas

7
INSTITUCIÓN UNIVERSITARIA DE ENVIGADO FACULTAD DE INGENIERÍAS LÓGICA DE PROGRAMACIÓN Nivel I BÚSQUEDA LINEAL: Pueden darse los siguientes casos Recorrido único por dato único Recorrido repetido por dato único Recorrido único por dato repetido Recorrido repetido por dato repetido DEFINICION: Cuando se necesita hallar uno o varios elementos que cumplan una determinada característica dentro de un vector se emplean dos tipos de búsqueda: Lineal o Binaria.

Upload: memoralesiue

Post on 28-Jul-2015

215 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Arreglos busquedas

INSTITUCIÓN UNIVERSITARIA DE ENVIGADO

FACULTAD DE INGENIERÍAS

LÓGICA DE PROGRAMACIÓN – Nivel I

BÚSQUEDA LINEAL: Pueden darse los siguientes casos

Recorrido único por dato único

Recorrido repetido por dato único

Recorrido único por dato repetido

Recorrido repetido por dato repetido

DEFINICION:

Cuando se necesita hallar uno o varios elementos que cumplan una determinada característica dentro de un vector se emplean dos

tipos de búsqueda: Lineal o Binaria.

Page 2: Arreglos busquedas

INSTITUCIÓN UNIVERSITARIA DE ENVIGADO

FACULTAD DE INGENIERÍAS

LÓGICA DE PROGRAMACIÓN – Nivel I

Denominamos DATO ÚNICO a aquel que no se repite dentro del vector, por ejemplo, dependiendo de la finalidad de los registros, puede ser dato único el número de cédula, el código de un estudiante, el número de cuenta bancaria, etc. Cuando se busca un dato único, se controla el ciclo con doble condición: que recorra el vector (contador menor o igual al registro identificador X <= N) y que el dato no haya sido encontrado (o sea que la variable suiche sea negativa sw == ‘n’), de tal modo que cuando encuentra el dato se sale por el cambio de valor del suiche o busca hasta el final si no encuentra el dato.

Denominamos DATO REPETIDO a aquel que es susceptible de ser repetido en el vector, por ejemplo, las edades, el sexo, el estado civil, el nombre, la profesión, etc.

Cuando recorremos el vector una sola vez para buscar un dato, hablamos de BÚSQUEDA ÚNICA. Cuando utilizamos ciclos anidados, de modo que permita realizar varias búsquedas en el vector, hablamos de BÚSQUEDA REPETIDA

Toda búsqueda hace uso de una variable suiche que permita informar al usuario si el dato fue encontrado o no. El suiche siempre se evalúa fuera del ciclo de búsqueda.

Ejemplo de Búsqueda ÚNICA por campo ÚNICO: El vector documento almacena el número de cédula de 20 personas. Informar si se encuentra o no una cédula ingresada por teclado: Sub_buscardoc () Inicio

Const Int: N [20]; String Vdoc [N][11], doc_b [11]; //documento a buscar Int x = 1; Char sw = ‘n’; Esc “Digite No. De documento a buscar: “; Lea doc_b; MQ ((x < N) && (sw == ‘n’)) HAGA Si (Vdoc [x] == doc_b) Ent Sw = ‘s’; Sino x = x + 1; fin-si Fin-MQ //Al salir de la búsqueda SIEMPRE se evalúa el suiche para determinar si el dato

fue encontrado o no:

Page 3: Arreglos busquedas

INSTITUCIÓN UNIVERSITARIA DE ENVIGADO

FACULTAD DE INGENIERÍAS

LÓGICA DE PROGRAMACIÓN – Nivel I

Si (sw == ‘s’) Ent Esc “Cédula encontrada”; Sino Esc “Dato no encontrado”; Fin-si

Fin-Subprograma Ejemplo de Búsqueda REPETIDA por campo ÙNICO: El vector documento almacena el número de cédula de 20 personas. Permitir buscar si se encuentran o no n cédulas ingresadas por teclado: Sub_buscardoc () Inicio

Const Int: N [20]; String Vdoc [N][11], doc_b [11]; //documento a buscar Int x; Char sw; Esc “Digite No. De documento a buscar o 0 para salir: “; Lea doc_b; //en este

caso se maneja ciclo externo con centinela: MQ (doc_b <> “0”) HAGA //Antes del ciclo de búsqueda se inicializa el suiche y el contador de

búsqueda: x = 1; sw = ‘n’; MQ ((x < N) && (sw == ‘n’)) HAGA Si (Vdoc [x] == doc_b) Ent Sw = ‘s’; Sino x = x + 1; fin-si Fin-MQ //Al salir de la búsqueda SIEMPRE se evalúa el suiche para determinar si el dato

fue encontrado o no: Si (sw == ‘s’) Ent Esc “Cédula encontrada”; Sino Esc “Dato no encontrado”; Fin-si // Se lee de nuevo la variable centinela: Esc “Digite No. De documento a buscar o 0 para salir: “; Lea doc_b;

Page 4: Arreglos busquedas

INSTITUCIÓN UNIVERSITARIA DE ENVIGADO

FACULTAD DE INGENIERÍAS

LÓGICA DE PROGRAMACIÓN – Nivel I

Fin-MQ Fin-Subprograma Ejemplo de Búsqueda ÚNICA por campo REPETIDO: El vector EC almacena el estado civil de 20 personas. Informar cuántas personas son casadas: Sub_buscarEC () Inicio

Const Int: N [20]; Char VecEC [N], ec_b = ‘c’; //estado civil a buscar igual a ‘c’ de Casado. Int x = 1, cont = 0; Char sw = ‘n’; MQ (x < N) HAGA Si (VecEC [x] == ec_b) Ent Sw = ‘s’; cont = cont + 1; Fin-si x = x + 1; Fin-MQ //Al salir de la búsqueda SIEMPRE se evalúa el suiche para determinar si el dato

fue encontrado o no: Si (sw == ‘s’) Ent Esc “Personas casadas”, cont; Sino Esc “No hay personas casadas”; Fin-si

Fin-Subprograma

Ejemplo de Búsqueda REPETIDA por campo REPETIDO: El vector EC almacena el estado civil de 20 personas. Permitir realizar búsquedas para determinar cuántas personas hay con un estado civil leído desde teclado: Sub_buscarEC () Inicio

Const Int: N [20]; Char VecEC [N], ec_b; Int x, cont; Char sw;

Page 5: Arreglos busquedas

INSTITUCIÓN UNIVERSITARIA DE ENVIGADO

FACULTAD DE INGENIERÍAS

LÓGICA DE PROGRAMACIÓN – Nivel I

Llamar sub_validarEC (ec_b); //en este caso se maneja ciclo externo con centinela y se manda a validar que el estado civil a buscar sea correcto:

MQ (ec_b <> ‘*’) HAGA //Antes del ciclo de búsqueda se inicializan el suiche, el contador de

búsqueda y el contador que cuenta las personas con el estado civil a buscar: x = 1; cont = 0; sw = ‘n’; MQ (x < N) HAGA Si (VecEC [x] == ec_b) Ent Sw = ‘s’; cont = cont + 1; Fin-si x = x + 1; Fin-MQ //Al salir de la búsqueda SIEMPRE se evalúa el suiche para determinar si el dato

fue encontrado o no: Si (sw == ‘s’) Ent Esc “Personas con el estado civil buscado”, cont; Sino Esc “Ninguna persona tiene ese estado civil”; Fin-si // Se lee de nuevo la variable centinela, en este caso, se invoca de nuevo el

subprograma de validación: Llamar sub_validarEC (ec_b);

Fin-MQ Fin-Subprograma Sub_validarEC (char: ec_b) Inicio Ec_b= ‘1’; //se le lleva dato erróneo para obligarlo a entrar al ciclo de validación: MQ ((ec_b <> ‘*’) || (ec_b <> ‘s’) || (ec_b <> ‘c’) || (ec_b <> ‘d’) || (ec_b <> ‘v’)) HAGA Esc “Ingrese estado civil a buscar: s para soltero, c para casado, d para divorciado, v para viudo o * para salir: “; Lea ec_b; Fin-MQ Fin-sub_validarEC

Page 6: Arreglos busquedas

INSTITUCIÓN UNIVERSITARIA DE ENVIGADO

FACULTAD DE INGENIERÍAS

LÓGICA DE PROGRAMACIÓN – Nivel I

BÚSQUEDA LINEAL:

En este caso podemos hallar la posición de un elemento dentro de un vector ordenado. El Método es el siguiente:

1. Se halla el elemento central del vector

2. Si coincide con elemento a buscar termina la búsqueda (rompimiento de control).

3. Si el elemento buscado es menor que el central se sabe que está en la primera mitad del vector.

4. Si el elemento buscado es mayor que el central se sabe que está en la segunda mitad del vector.

5. Se selecciona la mitad del vector en la cual se cree se halla el elemento y se repite todo el proceso anterior.

6. Si en la mitad donde se supone que se encuentra el elemento es menor que uno el elemento no se encuentra en el vector y termina la búsqueda.

Sub_Busquedabinaria () Inicio

Const Int: N [20]; Char Vec [N], dato_b; //Se asume que el vector está lleno y ordenado. Int x = 1, cont = 0; Int bajo; //limite inferior del vector Int alto; //limite superior Int central; //limite central

bajo = 1; alto = N; central = (alto + bajo) div 2; MQ ((bajo <= alto) && (Vec[central] <> dato_b)) HAGA Si (dato_b < vector [central]) Ent alto = (central – 1); Sino bajo = central + 1; Fin-si central = (alto + bajo) div 2; Fin_MQ Si (dato == vector [central]) Ent Esc “ valor encontrado en: “, central; SINO Esc “ valor no encontrado“; Fin-si Fin_Sub_Busquedabinaria

Page 7: Arreglos busquedas

INSTITUCIÓN UNIVERSITARIA DE ENVIGADO

FACULTAD DE INGENIERÍAS

LÓGICA DE PROGRAMACIÓN – Nivel I

TALLER DE BÚSQUEDA EN VECTORES:

1. Se tienen vectores paralelos de 50 posiciones, permitir almacenar la

información correspondiente a N vuelos diarios de una aerolínea: número de

vuelo (no repetido), trayecto (validar menú 1. Medellín – Bogotá, 2. Medellín –

Cali, 3. Medellín – San Andrés). Permitir consultar por número de vuelo y por

trayecto.

2. Almacenar en vectores paralelos de 500 posiciones la información

correspondiente a los automotores vendidos por Sofasa: serial del motor (no

repetido), marca, modelo, categoría (T. Turismo – F. Familiar – D. Deportivo – S

Transporte), tipo de combustible (gas o gasolina). Permitir realizar consultas

por serial del motor y por modelo. Mostrar cuántos vehículos se vendieron de

cada categoría.

3. De 100 inscritos y preseleccionados para una maratón internacional, se desean

seleccionar los atletas que cumplan con las siguientes condiciones: haber

terminado el maratón de selección en un tiempo determinado. Los tiempos son

150 minutos para hombres menores de 20 años; 160 minutos para hombres

con una edad mayor o igual a 20 y menor de 40 años y 180 minutos para

hombres mayores de 40. Almacenar en vectores paralelos de 100 posiciones los

datos de todos los atletas que fueron seleccionados por cumplir las

condiciones: documento de identidad (no repetido), edad, ciudad de origen

(validar un menú de 5 opciones posibles). Permitir realizar consultas de los

datos de los atletas por: documento y ciudad de origen. Imprimir el promedio

de edad de los atletas seleccionados.

4. Una librería maneja los siguientes datos de los libros a la venta: código (no

repetido), nombre, autor, editorial. Permitir ingresar en vectores paralelos de

1000 posiciones, los datos de los N libros adquiridos para la venta. Permitir

realizar consultas repetidas por código y autor.

5. Una empresa maneja registros con los datos de sus empleados: documento (no

repetido), cargo, salario mensual. Permitir realizar consultas repetidas por los

tres campos.