Estructuras repetitivas (bucles)

(Este artículo forma parte del Curso de Programación en C)

Los ordenadores se diseñaron inicialmente para realizar tareas sencillas y repetitivas. El ser humano es de lo más torpe acometiendo tareas repetitivas: pronto le falla la concentración y comienza a tener descuidos. Los ordenadores programables, en cambio, pueden realizar la misma tarea muchas veces por segundo durante años y nunca se aburren (o, al menos, hasta hoy no se ha tenido constancia de ello)

La estructura repetitiva, por tanto, reside en la naturaleza misma de los ordenadores y consiste, simplemente, en repetir varias veces un conjunto de instrucciones. Las estructuras repetitivas también se llaman bucles, lazos o iteraciones. Nosotros preferiremos la denominación bucle.

(Recuerde que la estructura repetitiva o bucle es una de las estructuras permitidas en la programación estructurada)

Los bucles tienen que repetir un conjunto de instrucciones un número finito de veces. Si no, nos encontraremos con un bucle infinito y el algoritmo no funcionará. En rigor, ni siquiera será un algoritmo, ya que no cumplirá la condición de finitud.

El bucle infinito es un peligro que acecha constantemente a los programadores y nos toparemos con él muchas veces a lo largo de este curso. Para conseguir que el bucle se repita sólo un número finito de veces, tiene que existir una condición de salida del mismo, es decir, una situación en la que ya no sea necesario seguir repitiendo las instrucciones.

Por tanto, los bucles se componen, básicamente, de dos elementos:

  • un cuerpo del bucle o conjunto de instrucciones que se ejecutan repetidamente
  • una condición de salida para dejar de repetir las instrucciones y continuar con el resto del algoritmo

Dependiendo de dónde se coloque la condición de salida (al principio o al final del conjunto de instrucciones repetidas), y de la forma de realizarla, existen tres tipos de bucles, aunque hay que resaltar que, con el primer tipo, se puede programar cualquier estructura iterativa. Pero con los otros dos, a veces el programa resulta más claro y legible. Los tres tipos de bucle se denominan:

  • Bucle “mientras“: la condición de salida está al principio del bucle.
  • Bucle “repetir“: la condición de salida está al final del bucle.
  • Bucle “para“: la condición de salida está al principio y se realiza con un contador automático.

El bucle “mientras”

El bucle “mientras” es una estructura que se repite mientras una condición sea verdadera. La condición, en forma de expresión lógica, se escribe en la cabecera del bucle, y a continuación aparecen las acciones que se repiten (cuerpo del bucle):

mientras (condición) hacer
inicio
   acciones (cuerpo del bucle)
fin

Cuando se llega a una instrucción mientras, se evalúa la condición. Si es verdadera, se realizan las acciones y, al terminar el bloque de acciones, se regresa a la instrucción mientras (he aquí el bucle o lazo). Se vuelve a evaluar la condición y, si sigue siendo verdadera, vuelve a repetirse el bloque de acciones. Y así, sin parar, hasta que la condición se haga falsa.

Por ejemplo, vamos a escribir un algoritmo que muestre en la pantalla todos los números enteros entre 1 y 100

algoritmo contar
variables
  cont es entero
inicio
  cont = 0
  mientras (cont <= 100) hacer
  inicio
    cont = cont + 1
    escribir (cont)
  fin
fin

Aquí observamos el uso de un contador en la condición de salida de un bucle, un elemento muy común en estas estructuras. Observe la evolución del algoritmo:

  • cont = 0. Se le asigna el valor 0 a la variable cont (contador)
  • mientras (cont <= 100) hacer. Condición de salida del bucle. Es verdadera porque cont vale 0, y por lo tanto es menor o igual que 100.
  • cont = cont + 1. Se incrementa el valor de cont en una unidad. Como valía 0, ahora vale 1.
  • escribir(cont). Se escribe el valor de cont, que será 1.

Después, el flujo del programa regresa a la instrucción mientras, ya que estamos en un bucle, y se vuelve a evaluar la condición. Ahora cont vale 1, luego sigue siendo verdadera. Se repiten las intrucciones del bucle, y cont se incrementa de nuevo, pasando a valer 2. Luego valdrá 3, luego 4, y así sucesivamente.

La condición de salida del bucle hace que éste se repita mientras cont valga menos de 101. De este modo nos aseguramos de escribir todos los números hasta el 100.

Lo más problemático a la hora de diseñar un bucle es, por lo tanto, pensar bien su condición de salida, porque si la condición de salida nunca se hiciera falsa, caeríamos en un bucle infinito. Por lo tanto, la variable implicada en la condición de salida debe sufrir alguna modificación en el interior del bucle; si no, la condición siempre sería verdadera. En nuestro ejemplo, la variable cont se modifica en el interior del bucle: por eso llega un momento, después de 100 repeticiones, en el que la condición se hace falsa y el bucle termina.

El bucle “repetir”

El bucle de tipo “repetir” es muy similar al bucle “mientras”, con la salvedad de que la condición de salida se evalúa al final del bucle, y no al principio, como a continuación veremos. Todo bucle “repetir” puede escribirse como un bucle “mientras”, pero al revés no siempre sucede.

La forma de la estructura “repetir” es la que sigue:

repetir
inicio
   acciones
fin

Cuando el ordenador encuentra un bucle de este tipo, ejecuta las acciones escritas entre inicio y fin y, después, evalúa la condición, que debe ser de tipo lógico. Si el resultado es falso, se vuelven a repetir las acciones. Si el resultado es verdadero, el bucle se repite. Si es falso, se sale del bucle y se continúa ejecutando la siguiente instrucción.Existe, pues, una diferencia fundamental con respecto al bucle “mientras”: la condición se evalúa al final. Por lo tanto, las acciones del cuerpo de un bucle “repetir” se ejecutan al menos una vez, cuando en un bucle “mientras” es posible que no se ejecuten ninguna (si la condición de salida es falsa desde el principio)

Ejemplo: Escribir un algoritmo que escriba todos los números enteros entre 1 y 100, pero esta vez utilizando un bucle “repetir” en lugar de un bucle “mientras”

algoritmo contar
variables
  cont es entero
inicio
  cont = 0
  repetir
  inicio
    cont = cont + 1
    escribir (cont)
  fin
  mientras que (cont <= 100)
fin

Observa que el algoritmo es básicamente el mismo que en el ejemplo anterior, pero hemos cambiado el lugar de la condición de salida.

El bucle “para”

En muchas ocasiones se conoce de antemano el número de veces que se desean ejecutar las acciones del cuerpo del bucle. Cuando el número de repeticiones es fijo, lo más cómodo es usar un bucle “para”, aunque sería perfectamente posible sustituirlo por uno “mientras”.

La estructura “para” repite las acciones del bucle un número prefijado de veces e incrementa automáticamente una variable contador en cada repetición. Su forma general es:

para cont desde valor_inicial hasta valor_final hacer
inicio
   acciones
fin

cont es la variable contador. La primera vez que se ejecutan las acciones situadas entre inicio y fin, la variable cont tiene el valor especificado en la expresión valor_inicial. En la siguiente repetición, cont se incrementa en una unidad, y así sucesivamente, hasta alcanzar el valor_final. Cuando esto ocurre, el bucle se ejecuta por última vez y después el programa continúa por la instrucción que haya a continuación.El incremento de la variable cont siempre es de 1 en cada repetición del bucle, salvo que se indique otra cosa. Por esta razón, la estructura “para ” tiene una sintaxis alternativa:

para cont desde valor_inicial hasta valor_final inc|dec paso hacer
inicio
   acciones
fin

De esta forma, se puede especificar si la variable cont debe incrementarse (inc) o decrementarse (dec) en cada repetición, y en qué cantidad (paso).

Ejemplo 1: Escribir un algoritmo que escriba todos los números enteros entre 1 y 100, utilizando un bucle “para”

algoritmo contar
variables
  cont es entero
inicio
  para cont desde 1 hasta 100 hacer
  inicio
    escribir (cont)
  fin
fin

De nuevo, lo más interesante es observar las diferencias de este algoritmo con los dos ejemplos anteriores. Advierta que ahora no es necesario asignar un valor inicial de 0 a cont, ya que se hace implícitamente en el mismo bucle; y tampoco es necesario incrementar el valor de cont en el cuerpo del bucle (cont = cont + 1), ya que de eso se encarga el propio bucle “para”. Por último, no hay que escribir condición de salida, ya que el bucle “para” se repite hasta que cont vale 100 (inclusive)

Ejemplo 2: Escribir un algoritmo que escriba todos los números enteros impares entre 1 y 100, utilizando un bucle “para”:

algoritmo contar
variables
  cont es entero
inicio
  para cont desde 1 hasta 100 inc 2 hacer
  inicio
    escribir (cont)
  fin
fin

Este ejemplo, similar al anterior, sirve para ver el uso de la sintaxis anternativa del bucle “para”. La variable cont se incrementará en 2 unidades en cada repetición del bucle.

Categorías

Licencia

ClustrMaps

henry rey ruiz

Soy estudiante de análisis y desarrollo de sistemas.

Tengo algunos problemas para entender los algoritmos
“hacer para”, “hacer mientras” y “repetir mientras”.

Por favor, ¿puede ayudarme añadiendo los diagramas de flujo?

En esencia, los tres bucles hacen lo mismo (repetir un conjunto de instrucciones) y sólo cambia la forma y el lugar de la condición de salida.

De todas formas, anoto su petición y completaré el artículo con los correspondientes diagramas de flujo en cuanto tenga un rato para ello. Entre tanto, puede usted consultar los diagramas en muchos otros sitios de internet, ya que es una simbología muy extendida. Aquí le dejo un enlace como ejemplo:

http://dcb.fi-c.unam.mx/users/alejandromra/Secuencial.pdf

excelente explicación! me ha sido de gran ayuda ya que me estoy iniciando en el mundo de la programación. Gracias!!!

como puedo resolver este problema donde me piden q use la sentencia mientras y luego la sentencia repetir…..
el problema dice : realizar el algoritmo para obtener la suma de los números pares hasta 1000.

Ese problema, Ramy, es un ejercicio típico de introducción a la programación. Se utiliza, junto con otros por el estilo, para que el alumno/a aprenda los fundamentos de la utilización de los bucles. Si está usted siguiend un curso de programación es altamente recomendable que trate de resolverlo, porque necesitará comprender bien cómo funcionan los bucles si quiere pasar con éxito a resolver problemas más complejos.

A estas alturas ya habrá supuesto que no voy a proporcionarle la solución. No le serviría de nada. Yo también soy profesor.

Pero sí intentaré darle una pista para que pueda resolverlo por sí mismo (cuando lo consiga, verá que es mucho más gratificante): piense en cómo lo haría usted manualmente.

Cogería el primer número par (el 2). Luego el siguiente (el 4), y lo sumaría con el 2. Llamemos X a esa suma: ahora mismo, X vale 6.

Después, pasaría al siguiente número par (el 6) y lo sumaría al resultado que ya tiene: ahora X ya vale 12.

Repetiría el proceso con el siguiente par (el 8). X vale 20.

Y así seguiría repitiendo el proceso con todos los pares, hasta 1000.

Tratemos de escribir este proceso en pseudocódigo:

X = 2
X = X + 4
X = X + 6
X = X + 8
X = X + 10
…etc…
X = X + 998
X = X + 1000

Es un programa sencillo, pero muy tedioso de escribir. Se trata de repetir un montón de veces la misma instrucción (X = X + algo), donde sólo cambia ese “algo”: primero es 4, después 6, después 8, y así hasta 1000.

Cuando una (o varias) instrucciones se repiten muchas veces con un pequeño cambio, como es el caso, se pueden resolver con un bucle. Trate de plantear un bucle con una variable que inicialmente valga 4 y que, en cada repetición, cambie de manera que adquiera el siguiente valor que usted necesita (el 6, el 8, el 10…)

Bueno, ya casi lo tiene. Le queda por hacer lo más divertido: escribir el programa, probarlo y conseguir que funcione. Eso es muy gratificante, ya lo verá. Ánimo.

me pusieron de tarea el “cilo condicional”
y esa es la que no he encontrado….
espero una respuesta pronta..
para saber como es…aunque me dificulte un
poco lo de sistemas..
la profesora me va a explicar…

Verá, Fernanda, los ciclos o bucles los hemos bautizado como “bucle mientras”, “bucle repetir” y “bucle para” por ponerles un nombre. Realmente, no tienen ningún nombre “oficial”. En otros lugares los puede encontrar como “bucle con condicional al principio” y “bucle con condicional al final”, por ejemplo.

Lo que quiero decir es que ciclos condicionales son TODOS, ya que la repetición del conjunto de instrucciones que hay dentro del cuerpo del bucle viene determinada por una condición, que en el artículo llamamos “condición de salida”

Así, el “bucle mientras” es un ciclo condicional con la condición situada al principio, y el “bucle repetir” es un ciclo condicional con la condición al final. El “bucle para” es un poco más particular, porque la condición se refiere siempre a una variable contador cuya actualización se explicita en la misma instrucción “para”, pero en el fondo es idéntico a un bucle mientras. En el artículo tiene todas estas ideas desarrolladas con más tranquilidad.

randall herradora camacho

esta muy bueno este articulo respecto a los bucles

tania alayo caminero

hola deceo saber donde o con quien puedo acceder a un curso de progarmacion en C++ este es mi correo por favor la persona que tenga informacion que se comunique conmigo este es mi correo

tania2419@gmail.com

Hacia rato no encontraba un tema tan bien explicado… Gracias me sirvió de mucho.

gracias fue de gran ayuda , me lo encargaron de tarea y me fue muy util

bien es manifico tener una pagina que nos pueda enriquecer en estos temas y ademas nos sirvan de gran ayuda para resolver algunos ejercicios que anteriormente no eran imposibles de resolver

Pruebe con Google. Encontrará montañas de cursos sobre C++. Así, a bote pronto, recuerdo algunos muy buenos en http://www.lawebdelprogramador.com y en c con clase (www.cconclase.net)

Me estoy iniciando en el estudio de la programaciòn de sistema, actaulmente estudio metodologìa de la programaciòn y tengo una inquietud en cuanto al desarrollo de los algoritmos, ¿se deben plantear las ecuaciones para resolver las operaciones en los algoritmos?, por ejemplo tengo que desarrollar un algoritmo para calcular el mìnimo comùn mùltiplo cuando se ingresan dos nùmeros, utilizando repetir (for), existe alguna ecuaciòn qe me permita calcular mcm, porque lo que conozco es que tradicionalmente hay que hallar los mùltiplos y luego escoger de entre los comunes el menor. le agradezco su ayuda.

No hay una ecuación para obtener el mcm, sino un MÉTODO, es decir, un conjunto de pasos que, seguidos en el orden debido, conducen a la solución (obtener el mcm de dos números). Usted mismo esboza cuál es ese método al final de su comentario.

Pues bien, programar consiste en traducir ese método a un lenguaje comprensible por el ordenador. Al “método” para resolver el problema lo llamamos, en realidad, ALGORITMO. Y al lenguaje, LENGUAJE DE PROGRAMACIÓN. Usted mismo puede ejecutar “a mano” el algoritmo para calcular el mcm y obtener la solución para cualquier pareja de números dados. La dificultad de escribir un programa estriba en ser capaz de traducir esas instrucciones del algoritmo a instrucciones comprensibles por la máquina.

chvere io buske un monton de pajinas relacionadas kon el c++ ke te expliken de una manera facil hasta ke encontre esta y es wenasa ……..gracias xD

Me gustaría que me ayudase en el siguiente problema en C:
En un bucle do…while, usado para darle la opción al usuario que si desea salir, uso:
char seguir;
do{

printf (“Pulse s si desea salir u otra tecla para continuar:\n”);
fflush (stdin);
scanf (“%c”, &seguir);
}while (seguir!=’s’||seguir !=’S');

Uso el compilador Dev C++y da problemas cuando se introduce por ejemplo un número por ejemplo. He probado con la función getchar, etc pero no encuentro la manera de dar al usuario la posibilidad de salir usando caracteres.
He visto otros códigos que usan exactamente esta fórmula. ¿Es problema del compilador?
Gracias, espero haberlo explicado bien.

Desconozco a qué se debe su problema pero sé a qué se refiere. Tengo una teoría, aunque no la he encontrado demostrada en ningún sitio.

Si usted hace un scanf() sobre una variable numérica (digamos scanf(“%i”, &n), siendo n de tipo int), la función captura la entrada por teclado y la asigna a la variable n, pero no puede asignar el carácter de retorno de carro, puesto que la variable es numérica. Ese retorno de carro se queda “estancado” en el buffer de entrada.

Si luego hace otro scanf() sobre otra variable numérica, funciona perfectamente: el retorno de carro “estancado” no le afecta, porque es otro número.

Pero si intenta hacer un scanf() sobre una variable carácter o cadena de caracteres, automáticamente se le asigna el salto de línea que andaba esperando en el buffer de entrada. Así que a la variable de tipo carácter se le asigna un ‘\n’ sin más contemplaciones, y el programa continúa ejecutándose.

La solución es limpiar el buffer de entrada antes del scanf(), usando fflush(stdin), como usted acertadamente intenta en su programa. ¡Pero esto a veces tampoco funciona! Y aquí sí que no tengo ninguna teoría.

Cuando todo falla, se puede optar por dar un rodeo para llegar al mismo sitio. Pruebe con esto:

char aux[10], seguir;
do{

printf (”Pulse s si desea salir u otra tecla para continuar:\n”);
gets(aux)
seguir = aux[0];
}while ((seguir!=’s’)||(seguir !=’S’));

Vale, no es muy elegante, pero funciona. A gets() no parece afectarle este problema (ni siquiera necesita un fflush() previo). Es cierto que es peligrosa (puede desbordar la variable aux), pero se puede usar en su lugar fgets(), que limita el número de caracteres asignados a la variable.

Espero que le sirva. Y si alguien conoce la causa última de este desagradable comportamiento de scanf(), por favor, que nos la explique.

Excelente curso. Muy bueno
Felicitaciones

como puedo hacer para resolver este algoritmo que no lo entiendo mucho

realizar la salida de este algoritmo

for(i= 3; i>0; I–)
imprimir (i);
For (j=I; j<=3; j++)
imprimir (i,j)

y otro que es

cont=0;
while (cont<3){
imprimir(*);
for (k=0; k <2;k++)
imprimir (“hola”);
}
cont++;
}

Explique de forma más detallada lo que tiene que hacer el algoritmo, haber si así podemos ayudarle.
Gracias.

También puede probar a ejecutarlo “a mano”. Es una grata experiencia y a lo mejor averigua usted sólo qué hace el algoritmo.

das unas excelente informacion.he estudiado con todo lo que has publicado,espero poner en practica todo esto.ya que mañana presento una evaluacion

¿estudiante de sistema podrian resolverme esto en sentensia repetision o bucles???
2) DECLARACIÓN DEL PROBLEMA

Supóngase que usted es el encargado del área de preparación de sándwiches en una cafetería; Los tipos de sándwiches que usted prepara son:

1) Cubano; 2) Hawaiano; 3) Tropical; 4) Olímpico; 5) Completo

A usted le pasan la orden para la preparación y despacho de los sándwiches en la cual se especifica el tipo. Esto es, usted recibe como ENTRADA a su proceso el tipo de sándwich a preparar; Luego de preparado usted realiza el despacho para lo cual de ESCRIBIR el mensaje, por ejemplo, “Sándwich Tropical, El Precio es: ” y, a continuación muestra el precio que deberá estar almacenado en la variable real precio3; Similar para los otros tipos de sándwiches; Luego debe ESCRIBIR el mensaje “Listo para el siguiente pedido”. Usted deberá HACER todo ese proceso MIENTRAS su respuesta a la pregunta QUEDAN MAS MATERIALES? Sea “SI, QueDan”, cualquier otra respuesta lleva el algoritmo a ESCRIBIR dejando tres líneas en blanco, el mensaje “Hecho por: “, el cual estará almacenado en la variable hecho _ por y, luego a TERMINAR, expresamente, su ejecución.