Aprendiendo terminaciones anormales de un ciclo y uso de centinelas (Lenguaje C)

in #stem-espanol7 years ago

Bienvenidos a un nuevo post


En esta oportunidad quiero traerles una continuación de lo que son los ciclos repetitivos pero esta vez estudiando un poco más a fondo este tema fundamental, mi ausencia en toda la semana se debe a las pasantias que estoy realizando en una organización y mi tiempo se ve un poco limitado últimamente, sin embargo aquí estoy trayendoles contenido cada semana para que no digan que no los quiero, sin más que añadir empecemos.

Fuente: Imagen creada por mi @greylml haciendo uso de la plataforma Canva

Terminaciones anormales de un ciclo


En el momento que estamos programando, podemos encontrarnos errores comunes ubicados en nuestros ciclos, específicamente en la manera que lo estamos diseñando, un ejemplo de esto sería en una sentencia while, el error se produce cuando el bucle solamente le agregamos una sentencia en vez de varias sentencias como lo hemos planeado, vamos a visualizar el siguiente ejemplo para analizar lo que podría o no podría ocurrir:

contador = 1;
while (contador < 25)
printf ("%d\n",contador);
contador++;

Este programa básicamente lo que nos va a imprimir como resultado es un montón de 1 infinitamente, lo que entra en un bucle infinito del cual nunca va a salir ya que no se modifica la variable de control contador, podemos ver que en la tercera línea de código existe un punto y coma que termina con el ciclo, al escribir correctamente el programa podemos darnos cuenta de una manera más rápida del error, haciendo uso de una correcta sintaxis con respecto a la sangría.

Diagnóstico del error y solución


Como programador es muy importante tener un uso correcto de la sangría, las buenas prácticas nos permiten escribir un programa más funcional y profesional, vamos a escribir de nuevo el programa y cerraremos con llaves el cuerpo de el bucle, ya que de aquí radica el problema, abrimos nuestro Dev C++ y veremos que sucede al hacer las cosas bien.


Resultado



De haberlo dejado como lo teniamos nos habria ocurrido un error al momento de ejecutar el programa ya que no habíamos hecho uso de las llaves en la sentencia compuesta.

Nos preguntamos: ¿Cómo diseñamos correctamente un bucle?


Tenemos que tener en cuenta que es analizar y diseñar, para el análisis de nuestras operaciones en un bucle y para el diseño de nuestros propios bucles y determinar su eficiencia, los principios que vamos a resaltar son los siguientes:

  • Análisis de requisitos para un nuevo bucle para determinar su inicialización

  • Desarrollar patrones estructurales de los bucles que se usan frecuentemente

Vamos a tomar como ejemplo los bucles while con cero iteraciones, como ya hemos venido diciendo el cuerpo de un bucle nunca se va a ejecutar si la condición de repetición no es la correcta, veamos como es el código de una condición que no es correcta.

contador = 10;
while (contador > 100)
{
...
}

El ejemplo es muy claro... contador es igual a 10 y la condición se podría compilar solo si contador es mayor que 100, lo que es falso, el programa no nos arrojará nada en pantalla, son pequeños detalles que debemos de tomar en cuenta al momento de estructurar correctamente nuestros bucles.

Bucles controlados por centinelas


Al momento de escribir código no se conoce con exactitud cuantos elementos de datos se van a procesar antes de comenzar la ejecución del programa, una forma de medir correctamente esta situación sería instruir al usuario para que introduzca un único dato definido y específico. Este valor sería nuestra centinela, debemos tomar en cuenta que la condición del bucle comprueba cada dato y este finalizará cuando se lea el valor centinela, este se debe seleccionar con mucho cuidado y debe ser un valor que no pueda producirse como dato, el centinela es un dato que nos permita acabar con el proceso del bucle. Para nuestro siguiente ejemplo vamos a integrar un bucle con centinela, vamos a ir introduciendo notas mientras que ésta sea distinta de centinela.

Código


int main(){
/*entrada de datos numéricos
centinela -1*/
const int centinela = -1;
printf("Introduzca primera nota: ");
scanf("%d",&nota);
while(nota != centinela)
{
cuenta++;
suma += nota;
printf("Introduzca la siquiente nota: ");
scanf("%d",&nota);
}/* fin de while */
puts("Final");
return 0;
}

Para la ejecución de este pequeño ejemplo se lee el primer valor de nota, como por ejemplo 25, luego se ejecuta la salida que podría ser la siguiente:

Introduzca primera nota: 25
Introduzca siguiente nota: 30
Introduzca siguiente nota: 90
Introduzca siguiente nota: -1 /* Valor del centinela */
Final

Fuente y despedida

Esto es todo de momento, espero que tengan en cuenta estos fundamentos básicos al momento de diseñar y analizar sus bucles, próximamente veremos mucho más de C no olviden comentar si tienen dudas, los dejo con la fuente de esta información, nos vemos en una próxima oportunidad... se despide @greylml

  • Libro: Programación en C: Metodología, algoritmos y estructura de datos
  • Autor: Luis Joyanes Aguilar

Sort:  

Definitivamente es una temática interesante @greylml
Muy bien expuesta por tí. Haciéndola más comprensible. Gracias...y éxitos.

A la orden @tomastonyperez me alegra saber que mis seguidores les sirve y gustan de ver este tipo de contenido.

You got a 2.91% upvote from @postpromoter courtesy of @greylml!

Want to promote your posts too? Check out the Steem Bot Tracker website for more info. If you would like to support the development of @postpromoter and the bot tracker please vote for @yabapmatt for witness!

Congratulations @greylml! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of upvotes

Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

Upvote this notification to help all Steemit users. Learn why here!

Coin Marketplace

STEEM 0.21
TRX 0.20
JST 0.035
BTC 90834.37
ETH 3151.05
USDT 1.00
SBD 3.01