1. 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.
2. 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:
3. 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;
4. 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;
5. 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
6. 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
7. 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.