ESTRUCTURAS DE CONTROL REPETITIVA (PARTE III)
En la anterior entrega hemos visto la estructura for, continuando con las estructuras repetitivas veremos en este post lo que es el while (mientras).
ESTRUCTURA DE CONTROL REPETITIVA while
Cuando se trata de bucles o ciclos, la estructura repetitiva while es una de las alternativas más utilizadas, recordemos que el for es una estructura repetitiva que sólo funciona como un contador, mientras que el while puede hace lo mismo que el for y cualquier repetición de instrucciones bajo una condición que no sólo sea controlado por un contador, sino también por una comparación con cualquier tipo de datos (númericos, alfanuméricos, booleanos, cadenas, objetos, etc.) como interruptores o banderas, entradas controladas por el usuario, etc.
La condición se comprueba al inicio del bucle por la cual la nube de instrucciones se pueden ejecutar cero o más veces.
Representación gráfica
La estructura repetitiva while cuenta con una variable inicial de cualquier tipo de datos, ésta variable inicial participa en la condición del bucle while, y en la nube de instrucciones dentro del bucle cabe aclarar que esta variable inicial tiene que tomar diferentes valores para que en algún momento cumpla la condición del bucle y sea finito.
Reitero lo siquiente: "No olviden que una estructura repetitiva tiene que ser finita, sino no habría lógica al realizar un programa donde no muestre un resultado específico".
Bucle while controlado por contador
Se utiliza un bucle controlado por contador cuando queremos ejecutar un número de veces un conjunto de instrucciones, cabe mencionar que este bucle controlador por contador trabaja de igual manera que la estructura for.
Bucle while controlado por interruptor o bandera
Cuando usamos el bucle while controlado por un interruptor, necesitamos la variable bandera que comúnmente tiene los nombres de ban(bandera), sw(switch), flag y otros(opcional), esta variable es un valor booleano inicializado con un valor true(verdadero o uno) o false(falso o cero) e indicar en nuestra condición que mientras sea verdadera ejecuta un conjunto de instrucciones, esta variable bandera en algún momento de la ejecución del programa la condición cambiará a otro estado por una estructura condicional if.
Cabe aclarar que la variable bandera podemos inicializar en falso, lo mismo en la comparación (condición) y en el cambio de estado obviamente a verdadero.
Se utiliza un bucle controlado por interruptor o bandera cuando queremos ejecutar un conjunto de instrucciones tantas veces sea posible mientras cumpla la condición que la variable bandera sea igual al valor inicial, de lo contrario el bucle finaliza. Cabe mencionar que este bucle controlado por interruptor no se puede implementar con la estructura for.
Bucle while controlado por el usuario
Cuando usamos el bucle while controlado por un usuario, necesitamos la variable centinela que comúnmente tiene los nombres de cent o centinela (opcional) y un valor a comparar que le llamaremos en este caso valorAComparar, ya sea números, cadenas de caracteres, caracteres y otros, pero no booleanos sino ya sería controlado por interruptor o bandera, la variable centinela es un valor especial usado para señalar el final de la ejecución del bucle, este(estos) valor(es) elegido(s) es necesario que sean distintos a un posible rango de valores para que se pueda utilizar para señalar el final del bucle, en otras palabras, no debe pertenecer al rango de valores válidos.
Se utiliza un bucle controlado por el usuario cuando queremos ejecutar un conjunto de instrucciones tantas veces sea posible mientras cumpla la condición que la variable a comparar sea distinta a la variable centinela, de lo contrario el bucle finaliza. Cabe mencionar que este bucle controlado por el usuario no se puede implementar con la estructura for.
EJEMPLOS DE ALGORITMOS CON SUS RESPECTIVOS DIAGRAMAS DE FLUJO
Implementaremos a continuación algoritmos de contadores, acumuladores, interruptores o banderas, controlados por el usuario y otros más utilizando la estructura repetitiva while.
Ejercicio 001.
Realizar un algoritmo que permita imprimir n veces en pantalla cualquier mensaje ingresado por teclado. (bucle controlado por contador)
Ejercicio 002.
Realizar un algoritmo que permita contar desde un número m hasta otro número n sin importar cuál de los dos sea mayor, con un intervalo ingresado por el usuario. (bucle controlado por contador)
Ejercicio 003.
Determinar si un número natural ingresado por el usuario es primo. Elaborar el diagrama de flujo. (bucle controlado por contador y por interruptor)
Analizando este ejemplo: La definición de número primo es: Todo número natural, mayor que uno, divisible por 1 y por sí mismo, es un NÚMERO PRIMO. A la hora de programar la lógica de este ejercicio sería verificar si es divisible desde 2 hasta el número primo / 2, es decir, para saber si el 17 es un número primo, entonces tenemos que analizar si es divisible por 2, 3, 4, 5, 6, 7 y 8. Podemos optimizar más aún este algoritmo, verificar si es divisible desde 2 hasta la raíz cuadrada del número primo, por lo tanto tenemos que analizar si es divisile por 2, 3, 4 porque la raíz cuadrada de 17 es 4.12 y es suficiente para la retroalimentación del bucle.
17 / 2 NO ES DIVISIBLE 21 / 2 NO ES DIVISIBLE
17 / 3 NO ES DIVISIBLE 21 / 3 SI ES DIVISIBLE
17 / 4 NO ES DIVISIBLE 21 / 4 NO ES DIVISIBLE
Como vemos en la imagen es un bucle controlado por contador y controlado por interruptor o bandera. Entonces necesitamos una variable contador n que empiece en 2 hasta la raíz cuadrada del número, por otra parte necesitamos una variable bandera sw que se inicializará en Verdadero, esto quiere decir, que suponemos que el número ES PRIMO, si es Falso NO ES PRIMO.
La función rc([número]) es una función que viene predefinida en el programa del PseInt y devuelve la raíz cuadrada de un número.
Ejercicio 004.
Confeccionar un algoritmo que permita ingresar varios números mientras no ingrese un número que sea múltiplo de 5.
Analizando este ejemplo: Primeramente lo diseñaremos como un bucle controlado por interruptor. Necesitaremos una variable bandera sw que se pueda iniciar en Falso y dentro del bucle nos preguntaremos si el número que estamos ingresando es múltiplo de 5 entonces el estado de sw cambia a Verdadero y saldrá del bucle.
Adicionalmente podemos diseñarlo como un bucle controlado por el usuario. El bucle se retroalimentará cuando el usuario ingrese un número que sea múltiplo de 5. En la condición se controla si la variable centinela es múltiplo de 5.
Ejercicio 005.
Desarrollar un algoritmo que ingrese diversos números cualesquiera, siempre y cuando el programa solicite al usuario si quiere seguir ingresando más números presionando la tecla 's'. (bucle controlado por usuario)
Analizando este ejemplo: Es un bucle controlado por el usuario, la condición de nuestro bucle while depende de la entrada del usuario, llamaremos car a la variable que almacenará lo que ingresa el usuario, n que representa el número que nos pedirá.
Ejercicio 006.
Escribir un programa para calcular la potencia de dos números (base y exponente), éstos serán ingresados por el usuario y positivos.
Analizando este ejemplo: Por ejemplo 43 = 4x4x4. El exponente indica la cantidad de veces que se tiene que multiplicar la base. Por esta razón es que es un bucle controlado por contador y también utiliza un acumulador de producto que se inicia en 1.
Ejercicio 007.
Elaborar un diagrama de flujo que permita mostrar la cantidad de dígitos que tiene un número natural ingresado por teclado.
Analizando este ejemplo: Para mostrar la cantidad necesitamos de un contador, pero esto no significa que sea un bucle controlado por contador, es un bucle controlado por cambio de variable.
La función trunc([número_real]) es una función que viene predefinida en el programa del PseInt y devuelve la parte entera del número real, es decir, trunca el número a su parte entera.
Ejercicio 008.
Ejercicio 008.
Desarrollar un algoritmo que muestre n términos de la serie Fibonacci.
Analizando este ejemplo: Es un bucle controlado por contador, ya que pide mostrar la cantidad de términos de la serie. La serie Fibonacci tiene el sgte. formato:
0; 1; 1; 2; 3; 5; 8; 13; 21; 34; 55; 89; ...Cada término se calcula de la suma de los dos anteriores términos, pero en el caso del primer que no hay los términos anteriores y el segundo término solo tiene 1 término anterior. La lógica es la sgte: Primer término = 0, que resulta de la suma de -1 y 1, este último 1 se sumaría con el primer término, lo que daría +1 + 0 = 1:
a b
-1; 1; 0; 1; 1; 2; 3; 5; 8; 13; 21; 34; 55; 89; ...
valores Serie Fibonacci
iniciales
iniciales
Necesitamos dos variables a y b con los valores -1 y 1 y una variable c = a +b, y actualizamos valores de a y b.
Ejercicio 009.
Elaborar un DFD para calcula el factorial de un número entero n.
Analizando este ejemplo: Para calcular el Factorial de un número entero, se basa en lo siguiente:
Por ejemplo: Factorial(5) = 5! = 5x4x3x2x1 = 120
Según el ejemplo, podemos ver que es un bucle controlado por contador. El factorial (fact) lo iniciamos en 2 (ignoramos el 1), porque sabemos muy bien que cualquier número multiplicado por 1 es el mismo número.
Tomar en cuenta que el factorial de 0 y 1 es 1.
Aumenté la variable cad para que la salida del programa se vea con más estética.
Como siempre lo hago en cada uno de mis post, ofrezco mi ayuda por si quieren que les resuelva algunos algoritmos sólo solicítenlo que yo responderé.
buenisimo gracias por el programa
ResponderEliminar