Mayores y menores de un conjunto de números en PSeInt

Más ejercicios resueltos

Si deseas revisar más ejercicios resueltos, haz click en el siguiente botón. 

A continuación presentamos 2 alternativas de solución al problema de encontrar los mayores y menores números en un conjunto de números naturales en PSeInt. Si deseas ver el enunciado del problema, haz click en el siguiente enlace.

Lectura de un número

Empezamos el diseño algorítmico con la lectura de un número. Usamos para ello la instrucción \texttt{Leer} asignando el valor leído en la variable \texttt{n}. La variable \texttt{n} contendrá un número del conjunto que se solicitará.

pseudocódigo mayores y menores de una lista v1.1 paso 1
Lectura de un número

Control de flujo para la lectura de varios números

Con el paso anterior, podemos leer un número, pero en el enunciado del problema nos indican que debemos leer una lista de números. ¿Cómo hacemos para leer varios números? Pues la instrucción \texttt{Leer} en PSeInt solo nos permite leer un número a la vez, por lo tanto si queremos leer varios de ellos, debemos repetir la acción varias veces. ¿Cómo hacemos para repetir una instrucción varias veces? La respuesta es usando una estructura algorítmica iterativa o repetitiva.

Pero este caso es singular pues no sabemos cuántos números se leerán. Según el enunciado, la lectura de datos terminará cuando se lea un número negativo. Esta situación es típica para usar un control de flujo por centinela. El centinela es un valor o conjunto de valores que si son leídos por el algoritmo, indican que el flujo debe finalizar. Para nuestro ejercicio, el centinela será cualquier número menor que cero.

¿Cómo configuramos el centinela? Podemos usar un ciclo iterativo con entrada o salida controlada. En esta oportunidad hemos optado por la salida controlada pues debemos leer por lo menos un número. Esta situación es ideal para un control por salida controlada.

Usaremos la instrucción en PSeInt  \texttt{Repetir-Hasta\ Que}. La condición que usamos es \texttt{n<0}. Lo que significa que las instrucciones que se encuentran en el cuerpo de esta instrucción, se repetirán una y otra vez, hasta que se ingrese un número negativo.

Ahora, el siguiente paso es colocar la lectura de datos dentro de la iteración. Si no hacemos esto, solamente leeremos un número. La primera instrucción dentro del \texttt{Repetir-Hasta\ Que} debe ser la lectura presentada en el paso anterior.

Pero falta un detalle más. Como estamos haciendo el control a la salida, debemos de garantizar que lo que procesemos esté de acorde a los requerimientos del problema. Si leemos un número negativo, no lo debemos procesar pues es nuestro centinela. Por este motivo, debemos colocar una instrucción selectiva simple para que solamente hagamos el procesamiento si es que el dato leído no es un centinela. Esto se va a cumplir cuando \texttt{n>=0}. Si no colocamos esta selectiva simple, el algoritmo terminará con el flujo de lectura de datos, pero el centinela leído será considerado como un número valido y se procesará. Esto último lo debemos evitar. 

Todas las instrucciones que realizamos para determinar el mayor o menor número, deben ir dentro de esta selectiva simple. Analiza bien este control de flujo y no pases al siguiente paso hasta que lo hayas entendido por completo.

pseudocódigo mayores y menores de una lista v1.1 paso 2
Control de flujo para la lectura de varios números

Numeración de los números leídos

El siguiente paso corresponde con la numeración de los números leídos. Pero, ¿por qué es necesario este paso? Una de las versiones que resolveremos, se basa en la identificación del primer número leído. Por este motivo, se hace necesario numerarlos.

Para la numeración, usaremos la variable \texttt{i}. Inicializamos esta variable con el valor de \texttt{0} y apenas leamos un número «válido», incrementamos el valor de esta variable en uno. Recuerde que la inicialización de la variable se debe realizar fuera de la iteración.

Esto significa que cuando \texttt{i} vale \texttt{1}, \texttt{n} contendrá el valor del primer número leído. Cuando \texttt{i} vale \texttt{2}, \texttt{n} contendrá el valor del segundo número leído. Cuando \texttt{i} vale \texttt{3}, \texttt{n} contendrá el valor del tercer número leído. Y así sucesivamente. 

Hemos aprovechado que estamos numerando los números leídos para hacer más amigable el mensaje al usuario. 

pseudocódigo mayores y menores de una lista v1.1 paso 3
Control de flujo para la lectura de varios números

Inicialización del mayor

Ahora procederemos a hallar el mayor de todos los números que se vayan ingresando. Usaremos una variable adicional para que en ella se almacene el valor con mayor magnitud de todos los números «válidos» leídos. Esta variable la hemos identificado con el nombre de \texttt{mayor\_magnitud}.

¿Qúe vamos a hacer con este variable? Básicamente 3 cosas. En primer lugar le asignaremos un valor inicial. Luego, cada vez que se vaya leyendo un nuevo número, iremos actualizándola para que siempre contenga la mayor magnitud. Y finalmente, imprimiremos el valor hallado.

En este paso realizaremos la inicialización. Pero, ¿con qué valor inicializamos esta variable? En el diseño algorítmico que estamos desarrollando, hemos optado por inicializar esta variable con el primer número leído. Vamos a asumir que el primer valor es el mayor de todos. Si luego leemos otro número que sea mayor a este, pues simplemente lo actualizaremos. ¿Cómo sabemos cuál es el primer número? Pues para este fin usaremos la variable \texttt{i}, cuando \texttt{i} contenga el valor de \texttt{1}, significará que estaremos leyendo el primer número. Por este motivo haremos la inicialización dentro de una selectiva doble, pues la inicialización será un caso particular. Si hay un solo número, ese será el mayor.

pseudocódigo mayores y menores de una lista v1.1 paso 4
Inicialización del mayor

Actualización del mayor

Procedemos ahora a la actualización de la variable \texttt{mayor\_magnitud}. Recordemos que la idea de este algoritmo es que al final del mismo, en esta variable se quede almacenado el valor de mayor magnitud. Por lo que debemos ir actualizándola cada vez que leamos un valor mayor al valor almacenado en esta variable. 

¿A partir de qué número hacemos la actualización? Pues a partir del segundo número. No a partir del primero porque el primer número lo usamos para la inicialización. Entonces, no tendría sentido que lo actualicemos si es que ya le estamos dando un valor inicial. Es por este motivo que la actualización va en el bloque \texttt{SiNo} de la instrucción \texttt{Si} que realizaba la inicialización. Es decir, es excluyente con la inicialización.

¿Cómo hacemos la actualización? Pues con una selectiva simple, si se cumple la condición \texttt{n>mayor\_magnitud} quiere decir que hemos leído un valor que es mayor a la mayor magnitud conocida hasta el momento. En esa situación \texttt{mayor\_magnitud} se actualiza con el valor de \texttt{n}. Recuerden que \texttt{n} cambia en cada iteración.

pseudocódigo mayores y menores de una lista v1.1 paso 5
Actualización del mayor

Inicialización del menor

Ahora procederemos a hallar el menor de todos los números que se vayan ingresando. La lógica a seguir es muy similar al número mayor. Usaremos otra variable adicional para que en ella se almacene el valor con menor magnitud de todos los números «válidos» leídos. Esta variable la hemos identificado con el nombre de \texttt{menor\_magnitud}.

Vamos a inicializar esta variable con el primer número leído. Vamos a asumir que el primer valor es el menor de todos. Si luego leemos otro número que sea menor a este, pues simplemente lo actualizaremos. Usaremos la variable \texttt{i}, cuando \texttt{i} contenga el valor de \texttt{1}, significará que estaremos leyendo el primer número. Por este motivo haremos la inicialización dentro de una selectiva doble, pues la inicialización será un caso particular. Si hay un solo número, ese será el menor.

pseudocódigo mayores y menores de una lista v1.1 paso 6
Inicialización del menor

Actualización del menor

Procedemos ahora a la actualización de la variable \texttt{menor\_magnitud}. Recordemos que la idea de este algoritmo es que al final del mismo, en esta variable se quede almacenado el valor de menor magnitud. Por lo que debemos ir actualizándola cada vez que leamos un valor menor al valor almacenado en esta variable. 

La actualización la realizaremos a partir del segundo número. La actualización va en el bloque \texttt{SiNo} de la instrucción \texttt{Si} que realizaba la inicialización, puesto que es excluyente con la inicialización.

Haremos la actualización con una selectiva simple. Si se cumple la condición \texttt{n<menor\_magnitud} quiere decir que hemos leído un valor que es menor a la menor magnitud conocida hasta el momento. En esa situación \texttt{menor\_magnitud} se actualiza con el valor de \texttt{n}

Hay que tener cuidado en que la operación para actualizar el menor es una instrucción diferente a la que actualiza el mayor. No puede ser un bloque \texttt{SiNo} de la actualización del mayor. Es un error pensar que si no es el mayor entonces es el menor. Esto es un error de lógica. Puede entenderse que en este ejercicio estamos resolviendo dos problemas al mismo tiempo, uno para hallar el mayor y otro para hallar el mejor.

pseudocódigo mayores y menores de una lista v1.1 paso 7
Actualización del menor

Verificación de ingreso de números

Antes de imprimir el mayor y menor valor hallados, debemos verificar si es que se han ingresado números. ¿Cómo hacemos esta verificación? Es muy simple, si la variable \texttt{i} luego de la iteración tiene el valor de \texttt{0} significa que no se ha leído ningún número «válido». Esto se puede dar cuando el usuario ingresa como primer número el centinela.

pseudocódigo mayores y menores de una lista v1.1 paso 8
Verificación de ingreso de números

Impresión del mayor y del menor

Finalmente se procede a la impresión de los valores hallados. Esto lo haremos si y solo si, la variable \texttt{i} es mayor que cero.

pseudocódigo mayores y menores de una lista v1.1 paso 9
Impresión del mayor y del menor

Diseño algorítmico en pseudocódigo: caso dos mayores y dos menores

Control de flujo para la lectura de varios números

Procederemos ahora a diseñar el algoritmo para encontrar los dos mayores y los dos menores números de todos aquellos que serán leídos. Iniciamos con el control de flujo para lectura de números. Es similar al diseño algorítmico anterior pero en lugar de usar \texttt{Repetir-Hasta\ Que} hemos usado la instrucción \texttt{Repetir-Mientras\ Que}. La diferencia es que \texttt{Repetir-Mientras\ Que} realiza la repetición de la iteración mientras la condición asociada es verdadera. 

Si compara los ejemplos verá que el control de flujo es muy similar, solo cambia la condición, en este caso hemos usado la negación de la condición del ejercicio anterior.

pseudocódigo mayores y menores de una lista v1.1 paso 1
Control de flujo para la lectura de varios números

Numeración de los números leídos

La numeración de los números leídos sigue la misma lógica presentada en el problema anterior. Seguiremos usando la variable \texttt{i} para lograr dicho objetivo.

pseudocódigo mayores y menores de una lista v1.1 paso 2
Numeración de los números leídos

Inicialización del primer mayor

Procederemos ahora con la inicialización de las variables. La lógica a usar será similar al caso anterior con la diferencia que ahora tendremos dos variables, una para el número con mayor magnitud y otra para el segundo número con mayor magnitud. 

Usaremos la variable \texttt{mayor\_magnitud1} para almacenar el mayor número de todos los de la lista. Inicializamos este variable con el primer número leído. Como hicimos en el algoritmo anterior, usamos una instrucción selectiva verificando la condición \texttt{i=1}.

pseudocódigo mayores y menores de una lista v1.1 paso 3
Inicialización del primer mayor

Inicialización del segundo mayor

El siguiente paso es inicializar la variable que contendrá el segundo valor mayor. Usaremos la variable \texttt{mayor\_magnitud2} para almacenar el segundo mayor número de todos los de la lista. 

Acá es donde cambia la lógica del programa. ¿Exactamente en qué cambia? Pues vamos a inicializar esta variable cuando leamos el segundo número. Esto se puede detectar fácilmente verificando la condición \texttt{i=2}. Pero la inicialización no es tan simple con en el paso anterior. ¿Por qué? Pues porque pueden darse dos situaciones:

  1.  Que el segundo número sea mayor que el primero leído.
  2. Que el segundo número sea menor o igual que el primero leído.
 
¿Que hacemos si el segundo número es mayor que el primero? Bueno en este caso, la variable \texttt{mayor\_magnitud2} se inicializa con el valor de \texttt{mayor\_magnitud1} pues por la condición antes descrita este es el segundo mayor. La variable \texttt{mayor\_magnitud1} se actualiza con el valor del número \texttt{n} que se acaba de leer para que siempre contenga el mayor de todos. ¿Cómo detectamos que el segundo número es mayor que el primero? Pues con la condición \texttt{n>mayor\_magnitud1}. Recuerde que \texttt{n} acaba de ser leído.
 

¿Que hacemos si el segundo número es menor o igual que el primero? Este caso es más simple de tratar, basta con inicializar \texttt{mayor\_magnitud2} con el valor de \texttt{n}. Es el segundo número y si no es mayor que el primero, entonces no queda otra que sea el segundo mayor.

pseudocódigo mayores y menores de una lista v1.1 paso 4
Inicialización del segundo mayor

Actualización de mayores

¿Qué pasa cuando leemos desde el tercer número en adelante? Bueno, en este caso debemos de verificar si el número leído es mayor que alguno de los anteriores para proceder con la respectiva actualización. Deberemos hacer una actualización si es que el número leído \texttt{n} es mayor que los dos mayores conocidos. Para esto usamos la condición \texttt{n>mayor\_magnitud1\ o\ n>mayor\_magnitud2}. Si esta condición se cumple, deberemos actualizar una o las dos variables.

¿De qué depende que se actualice una o dos variables? Pues del valor leído y de su magnitud. Si el valor leído es mayor que \texttt{mayor\_magnitud1}, en este caso debemos actualizar tanto \texttt{mayor\_magnitud1} como \texttt{mayor\_magnitud2}. En este caso \texttt{mayor\_magnitud2} pasa a tener el valor de \texttt{mayor\_magnitud1} y \texttt{mayor\_magnitud1} pasa a tener el valor de \texttt{n}. Es importante que se realice en ese orden.

Si el valor leído solo es mayor que \texttt{mayor\_magnitud2}, en este caso debemos actualizar únicamente \texttt{mayor\_magnitud2} con \texttt{n}.

pseudocódigo mayores y menores de una lista v1.1 paso 5
Actualización de mayores

Inicialización del primer menor

Ahora procederemos a hallar el menor de todos los números que se vayan ingresando. La lógica a seguir es muy similar al número mayor. Usaremos otra variable adicional para que en ella se almacene el valor con menor magnitud de todos los números «válidos» leídos. Esta variable la hemos identificado con el nombre de \texttt{menor\_magnitud1}. De forma análoga al ejercicio anterior, vamos a inicializar esta variable con el primer número leído. 

pseudocódigo mayores y menores de una lista v1.1 paso 6
Inicialización del primer menor

Inicialización del segundo menor

El siguiente paso a realizar será la inicialización de la variable que contendrá el segundo valor menor. Usaremos la variable \texttt{menor\_magnitud2} para almacenar el segundo menor número de todos los de la lista. 

De forma análoga a la inicialización del segundo mayor, vamos a inicializar esta variable cuando leamos el segundo número. Para esto debemos tener en consideración las siguiente situaciones:

  1.  Que el segundo número sea menor que el primero leído.
  2. Que el segundo número sea mayor o igual que el primero leído.
 
¿Que hacemos si el segundo número es menor que el primero? Bueno en este caso, la variable \texttt{menor\_magnitud2} se inicializa con el valor de \texttt{menor\_magnitud1} pues por la condición antes descrita este es el segundo menor. La variable \texttt{menor\_magnitud1} se actualiza con el valor del número \texttt{n} que se acaba de leer para que siempre contenga el mayor de todos. 
 

¿Que hacemos si el segundo número es mayor o igual que el primero? Este caso es más simple de tratar, basta con inicializar \texttt{menor\_magnitud2} con el valor de \texttt{n}. Es el segundo número y si no es menor que el primero, entonces no queda otra que sea el segundo menor.

pseudocódigo mayores y menores de una lista v1.1 paso 7
Inicialización del segundo menor

Actualización de menores

Procedemos ahora actualizar las variables que contendrán los números menores. Como en el caso de los mayores, lo haremos desde el tercer número en adelante. Debemos de verificar si el número leído es menor que alguno de los anteriores para proceder con la respectiva actualización. Deberemos hacer una actualización si es que el número leído \texttt{n} es menor que los dos menores conocidos. Para esto usamos la condición \texttt{n<menor\_magnitud1\ o\ n<menor\_magnitud2}. Si esta condición se cumple, deberemos actualizar una o las dos variables.

Si el valor leído es menor que \texttt{menor\_magnitud1}, en este caso debemos actualizar tanto \texttt{menor\_magnitud1} como \texttt{menor\_magnitud2}. En este caso \texttt{menor\_magnitud2} pasa a tener el valor de \texttt{menor\_magnitud1} y \texttt{menor\_magnitud1} pasa a tener el valor de \texttt{n}

Si el valor leído solo es menor que \texttt{menor\_magnitud2}, en este caso debemos actualizar únicamente \texttt{menor\_magnitud2} con \texttt{n}.

pseudocódigo mayores y menores de una lista v1.1 paso 8
Actualización de menores

Verificación de ingreso de números

Antes de realizar la impresión de los resultados encontrados, debemos verificar si el usuario ha ingresado números. Para esto nos valemos nuevamente de la variable \texttt{i}. Si \texttt{i} contiene el valor de \texttt{0}, significa que no se han leído números «válidos».

pseudocódigo mayores y menores de una lista v1.1 paso 9
Verificación de ingreso de números

Impresión de los mayores y de los menores

Finalmente se procede a la impresión de los valores hallados. Esto lo haremos si y solo si, la variable \texttt{i} es mayor que cero. Pero a diferencia del ejercicio anterior, puede darse el caso que existe un solo mayor o un solo menor. Esto se va dar cuando el usuario ha ingresado un único valor.

Por este motivo, antes de imprimir el segundo mayor o el segundo menor, debemos de verificar si es que se han leído por lo menos dos número. Esto lo verificamos fácilmente con la condición \texttt{i>=2}.

pseudocódigo mayores y menores de una lista v1.1 paso 10
Impresión de los mayores y de los menores

Optimización de las estructuras selectivas

Si analiza bien el algoritmo, podrá notar que la lógica en la actualización de los mayores y menores es exactamente igual a la lógica en la inicialización del segundo mayor y segundo menor. Por este motivo se puede optimizar el algoritmo para juntar dichas estructuras. Vea el algoritmo a continuación y compárelo con el anterior. ¿Cuál es más fácil de entender?

pseudocódigo mayores y menores de una lista v2.2
Optimización de las estructuras selectivas

Conclusión

Hemos presentado en este artículo, propuestas de solución para la determinación de los mayores y menores números de un conjunto de números naturales. Se ha utilizado para el control de flujo la estructura iterativa y muchas decisiones usando estructuras selectivas. Podrá descargar la solución propuesta en el repositorio GitHub de iterando++ a través del siguiente enlace

Hemos preparado otros artículos adicionales en donde describimos al detalle la implementación de este problema en lenguajes de programación. Te invitamos a leer los siguientes artículos de iterando++

Si te interesa profundizar más sobre diseño algorítmico, te recomendamos el libro Foundations of Programming Languages de Kent D. D. Lee. En este libro encontrarás además información detallada sobre la programación orientada a objetos, funcional y lógica.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *