You are on page 1of 6

LSI - ETSEIAT Laboratorio de Informtica Tema 2: Secuencias

Sesin 3: Esquemas de Recorrido y Bsqueda


Definiciones previas. Secuencia: Sucesin de valores de un mismo tipo (caracteres, enteros, reales, booleanos,..) sobre la cual podemos: obtener el primer elemento, obtener el siguiente elemento al elemento actual y determinar el final de la misma. Acceso secuencial: El tipo de acceso a los elementos de una secuencia se realiza de forma secuencial. Las caractersticas de este tipo de acceso son las siguientes: Los elementos se obtienen uno detrs de otro Una vez obtenido un elemento no se puede volver a obtener Tratamiento de una secuencia. El tratamiento de una secuencia se realiza mediante la utilizacin de un conjunto de instrucciones (esquemas algortmicos) orientadas a la resolucin de un determinado problema. Cada elemento de la secuencia se trata de la misma forma. A continuacin representamos grficamente el estado de una secuencia y los conceptos relacionados con el mismo. Estado de una secuencia en un instante dado:

La existencia del centinela es obligatoria y debe ser un elemento del mismo tipo que el de los datos que forman la secuencia pero no es objeto de tratamiento. Por ejemplo: Un . o un \n (salto de lnea) en el caso de caracteres; Un 0 o un -1 en caso de enteros o reales; Si no hay ms elementos que el centinela, la secuencia se considera vaca. Esquemas de recorrido y bsqueda. Para el tratamiento de las secuencias disponemos de los dos esquemas algortmicos que definimos a continuacin. Esquema de recorrido: Necesariamente hay que tratar todos los elementos de la secuencia uno detrs del otro hasta el final de la misma. Ejemplos de recorrido: calcular la suma, la media o el producto de los elementos de una secuencia; contar los elementos de una secuencia; calcular el mximo o el mnimo de los elementos de una secuencia. Esquema de bsqueda: Hay que examinar los elementos de la secuencia hasta encontrar uno determinado que satisface la condicin de terminacin o hasta llegar al final de la misma. Ejemplos de bsqueda: encontrar el primer par en una secuencia de enteros, determinar si una secuencia contiene algn nmero primo, encontrar el primer mximo local en una secuencia de reales.

Estructura del esquema de recorrido. //Inicio del tratamiento //Obtener el primer elemento { while(elemento_actual != centinela) { //Tratar elemento //Obtener Siguiente elemento } //Tratamiento Final } Ejemplo de recorrido: Construir un programa que indica si cada elemento de la secuencia es creciente, constante o decreciente. #include <iostream> using namespace std; int main() { int n1,n2=-1, secuencia; cout << endl << "Introduzca un entero. Para acabar entre 0: "; cin >> n1; if (n1!=0) { cout << endl << "Introduzca un entero. Para acabar entre 0: "; cin >> n2; while (n2!=0) { if (n1==n2) {

cout << "secuencia constante " << endl; } else { if (n2>n1) { cout << "secuencia ascendente " << endl; } else { if (n2<n1) { cout << "secuencia descendente " << endl; } } } n1=n2; cout << endl << "Introduzca un entero. Para acabar entre 0: "; cin >> n2; } } system("pause"); } Estructura del esquema de bsqueda. //Inicio del tratamiento //Obtener primer elemento bool encontrado = false; while(!ultimo_elemento && !encontrado) { if(PropiedadElemento) { encontrado = true; } else { //tratar_elemento //obtener_Siguiente_elemento } } if(encontrado) { //tratar_elemento } else { //tratar_no_encontrado } Ejemplo de bsqueda: Encontrar el primer mnimo local en una secuencia terminada en cero. #include <iostream> using namespace std;

/* Zona de definicin de constantes */ const int centinela=0; /* Zona de definicion de la funcion principal (main) */ int main(void) { int n1, n2, n3, min; bool encontrado=false; cout << endl << "Introduzca un entero: "; cin >> n1; if (n1!=centinela) { cout << endl << "Introduzca un entero: "; cin >> n2; if (n2!=centinela) { cout << endl << "Introduzca un entero: "; cin >> n3; while (n3!=centinela && !encontrado) { if (n1>n2 && n2<n3) { min=n2; encontrado=true; } else { n1=n2; n2=n3; cout << endl << "Introduzca un entero: "; cin >> n3; } } } if (encontrado) { cout << "El minimo local es " << min << endl; } else { cout << "No se ha encontrado ningun minimo local." << endl; } } else { cout << "Secuencia vacia" << endl; } system("pause"); } Programas para completar. Modificar el programa de ejemplo con el esquema que necesitas para que calcule la media y el mximo de todos los nmeros impares introducidos en una secuencia de nmeros enteros terminada en cero. Modificar el programa de ejemplo con el esquema que necesitas para que muestre por pantalla la suma de los nmeros pares y el producto de nmeros impares de una secuencia de nmeros enteros terminada en -1. Modificar el programa de ejemplo con el esquema que necesitas para que muestre la posicin del primer nmero mltiplo de 5 de una secuencia de nmeros terminada en 0. Programas para desarrollar. Construir un programa que encuentra la posicin del primer 7 en una secuencia de enteros acabada en 0.

Construir un programa que busca el primer nmero que es igual a la suma de su antecesor y de su sucesor en una secuencia de enteros acabada en 0. o Visualizar por pantalla los siguientes mensajes: Si la secuencia es vaca. Si existe o no el primer nmero que cumple con la condicin. o Esquema general de bsqueda: Si se encuentra el elemento deseado en la secuencia no hay que continuar la bsqueda, slo hay que llegar al final si no se encuentra dicho elemento. Dada una secuencia de puntos en 2D determinar si son todos colineales. La secuencia termina con el punto (-1,-1). Los dos primeros puntos se toman como referencia. Construir un programa que lee una secuencia de enteros positivos acabada en cero y muestre por pantalla cuantas subsecuencias de tres elementos crecientes y decrecientes contiene. Una subsecuencia creciente significa que contiene res nmeros consecutivos crecientes y decrecientes que los tres nmero de la subsecuencia estn en orden decreciente. Por ejemplo la secuencia:12 23 34 45 32 33 15 13 0 contiene 2 subsecuencias crecientes y 1 decreciente. Suponemos que la secuencia contiene al menos dos elementos y el centinela. Constuir un programa que lle una secuencia de enteros positivos terminada en cero y muestra por pantalla si hay ms mnimos locales que mximos locales. Un mximo local se defina como un nmero que es mayor que su antecesor y sucesor, el mnimo local cuando es menor que su antecesor y sucesor. La secuencia deber contener al menos dos elementos y el centinela. Problemas Opcionales
Dada una secuencia de nmeros enteros de menos de cuatro cifra mostrar por pantalla al finalizar la media de los nmeros introducidos de una, dos y tres cifras respectivamente. Cuando introduce un cero termina. Si el usuario introduce un nmero de ms de tres cifras deber mostrar el mensaje: Error de entrada de datos y continuar.

Suponemos que tenemos una mquina expendedora con 100 bebidas del tipo A y 100 bebidas del tipo B. La bebida A tiene un precio de 0.75 euros, mientras que la bebida B tiene un precio de 0.95 euros. Cada vez que un usuario solicita una bebida se envia la seal (el carcter ) 'A' o 'B' dependiendo del tipo de bebida escogida. Adems, cuando la mquina no dispone de alguna de las dos bebidas deja de extraer calquier tipo de bebida. Al cabo de un tiempo se emite la seal 'F'. Se quiere saber qu beneficio ha proporcionado cada bebida. Para resolver este problema tenemos que basarnos en un esquema de bsqueda generalizado. Contabilizamos cuantas bebidas se venden de cada tipo (mientras haya en existencia de ambos tipos y calcularemos su beneficio. Suponemos que una empresa tiene N trabajadores que fichan cada dia al entrar y al salir de la empresa. La ficha contiene la hora en minutos absolutos, es decir, si un trabajador empieza a las 8:10 y termina a las 16:30, la ficha indicar 490 minutos al entrar y 990 minutos al salir. Al final de la jornada se tiene una secuencia de pares que indica a qu hora ha llegado y a qu hora se ha ido cada trabajador. Los dos ltimos datos de la secuencia que se entran son dos ceros: 0 0 Se quiere saber el porcentaje de trabajadores que

ha hecho como mnimo 8 horas = 480 minutos y la cantidad de minutos extras que se han hecho. Construir un programa que lee la secuencia de control de calidad de productos que un operador introduce por teclado: <cdigo del producto, calidad>, en el campo calidad se pueden introducir los valores B M, La letra B indica producto correcto y la M producto incorrecto. Cuando se introduce un cero en el cdigo del producto el programa termina y se muestra por pantalla, por cada cdigo de producto, el porcentaje respecto al total de productos que superan el control de calidad. El cdigo del producto tendr valores enteros entre 1 y 3. Se mostrar un mensaje de cdigo incorrecto si no se introducen estos valores y si el operador introduce en calidad un valor diferente a B o M. Si el valor de calidad no es correcto el programa pedir un nuevo cdigo del producto.

Ejemplo 1: Codigo producto: 1 Codigo de calidad B - correcto M Incorrecto B: B Codigo producto: 2 Codigo de calidad B - correcto M Incorrecto B : B Codigo producto: 3 Codigo de calidad B - correcto M - Incorrecto: B: B Codigo producto: 0 El % respecto el total del producto 1 que supera control de calidad es 33.3333 El % respecto el total del producto 2 que supera control de calidad es 33.3333 El % respecto el total del producto 3 que supera control de calidad es 33.3333 Ejemplo 2: Codigo producto: 4 Error Codigo producto incorrecto Codigo producto: 3 Codigo de calidad B - correcto M - Incorrecto: j Error Codigo de calidad incorrecto Codigo producto: 0

You might also like