Codificación aprenderaprogramar.com: CU00153A
USO Y MAL USO DE LA INTRUCCIÓN DESDE … SIGUIENTE
La instrucción Desde ... Siguiente tiene una sintaxis y funcionamiento que aconsejan estar muy despiertos a la hora de su uso. El problema puede venir por varios motivos: valores inicial y final poco coherentes, uso de un paso inapropiado, manipulaciones del contador indebidas, etc. El resultado puede ser un error, funcionamiento incorrecto o inesperado, etc.
La solución a estos problemas pasa por:
a) Hacer un buen uso de la instrucción Desde, evitando las prácticas inadecuadas que describiremos a continuación.
b) Elegir otro tipo de estructura de repetición cuando resulte ventajoso.
c) Programas limpios, ordenados, etc. desde el principio contribuyen a instrucciones limpias y ordenadas hasta el final.
En cuanto a lo que describiremos como “malos usos de la instrucción Desde” hay que tener en cuenta que algunas de las situaciones planteadas son aceptables cuando son situaciones controladas. Vendría a ser equivalente a circular con un coche a 200 Km/h. Si la situación es controlada (circuito cerrado, piloto profesional, etc.) es asumible. En cambio, en una situación no controlada o imprevista (carretera convencional, piloto no profesional) la situación es indeseable.
· Caso valor final menor que valor inicial y variantes
[Ejemplo aprenderaprogramar.com] Desde VAR = Vi hasta Vf Hacer Mostrar “Mensaje” Siguiente |
Si resulta que Vi es mayor que Vf el bucle se ejecutará cero veces. Si en toda circunstancia se produce Vi > Vf resultaría que nos encontramos con un fragmento de código muerto, y que resulta totalmente indeseable. Un programa debe contener cero código muerto. En cambio, si Vi > Vf sólo circunstancialmente y de forma controlada, es asumible.
Con el uso de pasos negativos, nos encontraríamos en situación equivalente cuando Vi es menor que Vf.
· Caso valor inicial igual al valor final
Desde VAR = Vi hasta Vf Hacer Mostrar “Mensaje” Siguiente |
Si Vi es igual a Vf el bucle se ejecutará una única vez. Si en toda cirscuntancia se produce Vi = Vf resultaría que nos encontramos con una estructura repetitiva funcionando a modo de estructura secuencial. Algo indeseable por cuanto pueden aparecer errores, mal funcionamiento, etc. y, aún en caso de que no hubiera ningún problema indeseable, por ir en contra de la claridad, economía y eficiencia del programa. Las instrucciones deben ser las justas y necesarias y lo más claras posibles.
· Caso de paso más grande que el intervalo
Desde VAR = Vi hasta Vf Paso = Inc Hacer Mostrar “Mensaje” Siguiente |
Llamamos intervalo al valor del paso que permite al menos una repetición del bucle. Por ejemplo: Si Vi = 1 y Vf = 10, el valor del paso para que se repita dos veces el proceso es 10 – 1 = 9. En este caso:
1ª Iteración: VAR = 1 |
2ª Iteración: VAR = 10 |
3ª Iteración: al ser VAR = 19 se sale del bucle. |
Si se diera Vi = 1, Vf = 10, paso = 10 tendríamos:
1ª Iteración: VAR = 1 |
2ª Iteración: VAR = 11 y se sale del bucle sin que se haya dado siquiera una repetición del mismo. |
Esta situación de “ejecución una única vez” es análoga a la comentada en el caso anterior. Por lo tanto, sólo es aceptable cuando se produce de forma circunstancial y controlada.
· Caso manipulación del contador externa al Desde
Cuando el contador de una instrucción Desde va tomando sucesivos valores decimos que sufre variaciones internas. Si durante la ejecución de un Desde otras instrucciones afectan al valor del contador decimos que se ha producido una manipulación externa. Esta actuación supone que la instrucción deja de ejecutarse como sería previsible y precisamente los resultados pasan a ser eso: imprevisibles. Por ello pondremos un “prohibido” a esta práctica, y a partir de aquí cada cual que obre en consecuencia.
Como sabemos que hay mucho amante de lo prohibido supongamos un:
Desde i = 1 hasta 20 Hacer Mostrar i i = i + 2 Siguiente |
La instrucción i = i + 2 supone una manipulación del contador. En teoría entramos con i = 1, muestra i, i pasa a valer 3, itera y suma uno pasando i a valer 4, muestra i = 4, i pasa a valer 6 y suma uno pasando i a valer 7... y así sucesivamente. Nos mostraría 1, 4, 7, 10, 13, 16, 19... en teoría.
En la práctica, veremos que hay formas más claras y elegantes de hacer esto así que... no lo hagas por favor.
· Caso Paso con valor impropio
Desde VAR = Vi hasta Vf Paso = Inc Hacer Mostrar “Mensaje” Siguiente |
Si Vi <= Vf y Inc = 0 nos encontramos con que cada repetición del bucle Vi = Vi + 0 con lo cual nunca se llegará a producir la condición para salida del bucle. Esta situación se llama de “bucle infinito” y resulta altamente indeseable. Por supuesto, que se produzca una situación como la descrita es un fallo del programador por un mal diseño, una mala previsión de procesos internos o entradas inesperadas del usuario. Cuando se produce un bucle infinito es habitual que el ordenador se quede “colgado”, pues lo que está haciendo es repetir el mismo proceso una y otra vez. Para evitarlo será el diseño del algoritmo y el seguir las pautas de buena programación lo más efectivo. También podremos disponer, como veremos más adelante, mecanismos de seguridad.
Una variante de este caso es tener un valor inicial inferior al final y un paso negativo. Si esto ocurre se evalúa si el valor inicial es menor que el final, y al ser así, el bucle se ejecuta cero veces. Los comentarios que venimos haciendo son válidos al respecto.
Los valores más habituales del paso serán números enteros. Usar números fraccionarios será, en general, menos deseable. De cualquier forma, en caso de usar fracciones se buscará que el número sea decimal exacto. Por ejemplo: 3 / 5 = 0,6. El uso de números decimales periódicos se considerará indeseable (p. ej. 2 / 3 = 0,666666...) pues supone una indefinición de fondo. Remitimos a lo expuesto en el apartado de “Herramientas lógicas y matemáticas” (paradoja de los decimales finitos).
· Caso de usos impropios de variable contador o variable de paso
Siempre que sea posible, las variables que se usen para definir el contador y el paso no deben usarse para otras funciones ni dentro de la instrucción Desde ni en el resto del programa.
Ejemplo:
a)
[Ejemplo aprenderaprogramar.com] Desde i = 1 hasta 5 Hacer Mostrar “Por favor introduzca su edad” Pedir i Mostrar “Usted nació en” 2005 – i Siguiente |
¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
b)
Desde i = 1 hasta 5 Hacer Mostrar “Contando” Siguiente Mostrar “Por favor introduzca su edad” Pedir i |
Ambas situaciones son indeseables. Las variables deben estar ordenadas, y no usarse “al boleo”. El caso a) es más grave si cabe, pues está modificando el contador de una forma que produce escalofríos. Hay formas mucho más razonables de pedir 5 veces una edad.
Con el paso puede suceder otro tanto:
a)
Desde i = 1 hasta 10 Paso = P Hacer Mostrar “Introduzca el número de pisos del edifico” Pedir P Si P > 10 Entonces Mostrar “El edificio es alto” SiNo Mostrar “El edificio es bajo” FinSi Siguiente |
¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
b)
[Ejemplo aprenderaprogramar.com] Desde i = 1 hasta 10 Paso = P Hacer Mostrar “Contando” Siguiente Mostrar “Introduzca el número de pisos del edifico” Pedir P Si P > 10 Entonces Mostrar “El edificio es alto” SiNo Mostrar “El edificio es bajo” FinSi |
La situación a) es relativamente distinta cuando se afecta al paso respecto a cuando se afecta al contador. La variación radica en que cuando se entra en el bucle, el valor de paso queda fijado y es inamovible, de modo que aunque la variable sufra modificaciones el bucle en teoría sigue su funcionamiento previsto. Sin embargo, esto no modifica para nada nuestra indicación de que este tipo de uso de variables debe ser evitado a toda costa.
Para acceder a la información general sobre este curso y al listado completo de entregas pulsa en este link: Ver curso completo.
Para hacer un comentario o consulta utiliza los foros aprenderaprogramar.com, abiertos a cualquier persona independientemente de su nivel de conocimiento.