martes, 17 de septiembre de 2019

Que es el Ciclo For




Bucle for


El bucle for es una estructura de control en programación en la que se puede indicar de antemano el número mínimo de iteraciones.1​ Está disponible en casi todos los lenguajes de programación imperativos.


  Resultado de imagen para ciclo for en programacion


Elementos del bucle.




  • Variable de control
  • prácticamente un mandato impuesto por el uso habitual es utilizar la letra i Iterador como variable de control, o bien sus sucesoras en caso de bucles anidados. El uso de esta letra críptica quizás a primera vista es sin embargo una excelente forma de aportar agilidad de lectura al código por su uso tan extensivo. Como raras veces los bucles anidados superan las tres dimensiones (por una sencilla cuestión de explosión exponencial), las letras i, j y k suelen ser las únicas relacionadas con este uso. En C se define en el primer parámetro de la instrucción junto con la inicialización (opcional).


  • Inicialización de la variable de control:
  •  en pseudolenguaje se pide explicitarlo (es la sección := ValorInicial), sin embargo, otros lenguajes más permisivos como C no lo requieren de forma obligatoria. De todos modos, la práctica de utilizar variables de control que no se inicializan en el bucle no es recomendada para la legibilidad del código. En C se define en el primer parámetro del bucle junto con la variable de control.

  • Condición de control:
  •  en pseudolenguaje se ve representado por el valor final que puede tomar la variable de control (la sección A ValorFinal). En C es el segundo parámetro y puede ser cualquier condición (ni siquiera es obligación que esté la variable de control, aunque una vez más, esto no se considera una buena práctica).

  • Incremento
  • en pseudolenguaje se toma por defecto el valor 1, aunque puede explicitarse por medio de la sentencia PASO = ValorPaso cualquier número entero (léase bien entero, o sea que técnicamente podemos decrementar). En C es el último parámetro.

  • Cuerpo:
  •  es lo que se hará en cada iteración, pueden ser una o más instrucciones. En pseudolenguaje pesa la restricción de no poder alterar el valor de la variable de control; esto no es requerido en C, pero no se considera una buena práctica.

Usos

Su uso principal se orienta a los vectores, pudiendo modificar, agregar, eliminar o consultar datos que se encuentren según el índice. Por esto último, una condición mínima del vector es que debe ser ordenado, porque si se intenta leer un dato inexistente, esto genera un error de programación. es una herramienta

For en Pseudolenguaje

La principal diferencia de un bucle PARA con respecto a los bucles MIENTRAS Y REPETIR, es que puede determinarse al comienzo del bucle cuántas veces se interará el mismo, lo cual muchas veces puede redundar en una optimización del código por parte de los compiladores. Los condicionales constituyen junto con los bucles los pilares de la programación estructurada, y su uso es una evolución de una sentencia de lenguaje ensamblador que ejecutaba la siguiente línea o no en función del valor de una condición.

El bucle PARA se ha convertido en el bucle más ampliamente utilizado en la programación, ya que con la evolución de los lenguajes la mayoría de las condiciones de fin.

MIENTRAS NoFinDeTabla(tabla) HACER
 PróximoRegistro(tabla)
 HacerAlgo(ElementoActual(tabla))
FIN MIENTRAS

Es lo mismo decir:

PARA i=0 a CantidadRegistros(tabla) - 1, PASO = 1
 PróximoRegistro(tabla)
 HacerAlgo(ElementoActual(tabla))
FIN PARA
Otro uso común es utilizar los bucles PARA para recorrer vectores de dos o más dimensiones, en cuyo caso se anidan estas iteraciones.

PSEUDOLENGUAJE
Vector a[3][4][2]. // Estamos indicando un vector de 3 dimensiones y 24 elementos en total.
PARA i:= 0 A 2 HACER
  PARA j:= 0 A 3 HACER
    PARA k:= 0 A 1 HACER
      HacerAlgo(a[i][j][k])
    FIN PARA
  FIN PARA
FIN PARA

Ejemplo de PARA en pseudocódigo


PARA VariableControl := ValorInicial A ValorFinal, PASO = Incremento 
  Instrucciones
FIN PARA


donde VariableControlValorInicialValorFinal y Paso son enteros. La(s) instrucción(es) del cuerpo se ejecutará(n) (ValorFinal - ValorInicial + 1) veces, o sea que va desde ValorInicial a ValorFinal inclusive.

Ejemplo en C++


#include <iostream>
#include <conio.h>
using namespace std;

int main(){
   int vector[10];
   for(int i=0; i<10; i++){
      vector[i] = i;
      cout<< i<<endl;
   }  
   system ("PAUSE"); 
   return 0;
}

En la definición del for, tenemos que la variable de control i se inicializa en un valor 0, luego se entrega la condición de control que debe ser falsa durante su ejecución, para completar el ciclo; y por último, tenemos el incrementador en una unidad.

Si por ejemplo en la condición colocamos i < 11, entonces el ciclo for se ejecutará desde [0...10], lo cual, al intentar acceder al elemento vector[10], esto generará error, ya que el vector (por definición) va desde [0..(n-1)].
Cualquiera de los componentes en el paréntesis se puede omitir, pero los separadores punto y coma deben aparecer siempre. El resultado es un bucle infinito.

Ejemplo anterior escrito en Lexico



tarea
{
los objetos vector[10], i son cantidades
variando i desde 0 hasta 9 haga
         copie i en vector[i]
}

Bucle Por Cada (For Each)


Este bucle es una evolución del concepto del bucle Para en algunos lenguajes. Se utiliza para recorrer estructuras repetitivas de datos de forma más simple y ágil. El bucle For Each puede describirse genéricamente (en pseudolenguaje) de la siguiente manera:

POR CADA elemento DE tipo EN conjunto HACER
  Cuerpo
FIN FOR EACH


  • Elemento:
  •  es el nombre de la variable u objeto que toma el elemento iterado en el cuerpo del bucle.

  • Tipo de Dato
  • es el tipo de variable o la clase a la que pertenece el objeto que se quiere iterar.

  • Conjunto:
  •  es la estructura de datos que se quiere iterar. El uso más típico es con vectores o -en programación orientada a objetos- clases del tipo Colección.

  • Cuerpo: es lo que se hará en cada iteración, pueden ser una o más instrucciones. Si bien no se impone una obligación al respecto, lo más común es que en este Cuerpo exista alguna operación sobre el elemento iterado.

Necesidad de una nueva estructura de control

Esta estructura surge como una innovación en los lenguajes para permitir un código más ágil y legible en una situación que es una de las principales causas del uso del bucle PARA: aplicar la misma operación sobre todos los elementos de un vector, y no necesitar conocer la posición del elemento en el vector. Esta estructura con el bucle PARA se resuelve de la siguiente manera:
Con el bucle POR CADA esto se reduce a:
POR CADA x DE tipo EN Vector HACER
 x = AlgunaOperación(x)
FIN PARA

Las ventajas de utilizar la estructura POR CADA son las siguientes:
  1. No es necesario llamar a una función que obtenga el tamaño del vector
  2. No es necesario utilizar la incómoda notación de sub-índices para referirnos al valor en cuestión, sobre todo teniendo en cuenta que si utilizamos esta estructura es porque no necesitamos el valor del índice.
  3. Nos permite hacer un chequeo en tiempo de compilación sobre el tipo de dato que representa el elemento.
El bucle POR CADAo no es un sustituto del PARA, es una mejora para el muy frecuente caso anteriormente mencionado.
La diferencia esencial entre el bucle PARA y el POR CADA es que en el primero guía su iteración por una variable que se incrementa hasta cierto punto de corte; en cambio en el segundo lo que guía la iteración es el recorrido de todos los elementos de un vector.
 Ciertamente podemos transformar cualquier POR CADA en un PARA, pero transformar un bucle PARA en un bucle POR CADA requeriría inicializar y controlar manualmente las variables de control, con lo cual se perdería nuevamente legibilidad en el código. 

Por tanto, cuando en un lenguaje se nos da la posibilidad de utilizar ambas estructuras, la elección del POR CADA debe hacerse en aquellos casos para los que fue pensado: aplicar la misma operación a todos los elementos de un vector sin importar el orden en que se hagan; si bien no es necesario que la variable elemento sea utilizada en el cuerpo del bucle, su ausencia denota con seguridad una mala elección de estructura de control.


   Resultado de imagen para interfaz ciclo for en programacion

Codificación y Estructuras del ciclo FOR

Ciclo for en C++. Estructura, sintaxis y uso de un ciclo for en C++

Los ciclos for son lo que se conoce como estructuras de control de flujo cíclicas o simplemente estructuras cíclicas, estos ciclos, como su nombre lo sugiere, nos permiten ejecutar una o varias líneas de código de forma iterativa, conociendo un valor especifico inicial y otro valor final, además nos permiten determinar el tamaño del paso entre cada "giro" o iteración del ciclo.
En resumen, un ciclo for es una estructura de control iterativa, que nos permite ejecutar de manera repetitiva un bloque de instrucciones, conociendo previamente un valor de inicio, un tamaño de paso y un valor final para el ciclo.

¿Cómo funciona un Ciclo For?

Para comprender mejor el funcionamiento del ciclo for, pongamos un ejemplo, supongamos que queremos mostrar los números pares entre el 50 y el 100, si imaginamos un poco como seria esto, podremos darnos cuenta que nuestro ciclo deberá mostrar una serie de números como la siguiente: 50 52 54 56 58 60 ... 96 98 100. Como podemos verificar, tenemos entonces los componentes necesarios para nuestro ciclo for, tenemos un valor inicial que sería el 50, tenemos también un valor final que sería el 100 y tenemos un tamaño de paso que es 2 (los números pares). Estamos ahora en capacidad de determinar los componentes esenciales para un ciclo for.
Vamos a ver ahora como es la sintaxis de un ciclo for en C++, así estaremos listos para usarlos en nuestros programas de ahora en adelante

Sintaxis del Ciclo For en C++:


La sintaxis de un ciclo for es simple en C++, en realidad en la mayoría de los lenguajes de alto nivel es incluso muy similar, de hecho, con tan solo tener bien claros los 3 componentes del ciclo for (inicio, final y tamaño de paso) tenemos prácticamente todo hecho

for(int i = valor inicial; i <= valor final; i = i + paso) { .... .... Bloque de Instrucciones.... .... .... }
Vamos ahora a ver línea por línea el anterior código para comprender todo y quedar claros. Posteriormente veremos un ejemplo con valores reales.

Línea 1:


En esta línea está prácticamente todo lo esencial de un ciclo for. La sintaxis es simple, tenemos una variable de control llamada i que es tipo entero (int), cabe notar que la variable se puede llamar como nosotros lo deseemos y puede ser del tipo de queramos también, sin embargo en la mayoría de los casos se usa la "i" como nombre y el entero como tipo, pero somos libres de modificar esto a nuestro gusto. Esta variable "i" se le asigna un valor inicial que puede ser cualquier número correspondiente al tipo de dato asignado. Posteriormente lo que haremos será especificar hasta donde irá nuestro ciclo por medio del valor final, ten en cuenta que cada uno de estos componentes es separado por un punto y coma ";", también es importante saber que la condición final puede ser cualquier cosa, mayor, menor, mayor o igual, menor o igual, sin embargo no tiene sentido que la condición sea por ejemplo un igual, pues nuestra variable de control siempre va a cambiar entre valores, menores o mayores que el valor final deseado, si fuera un igual no tendríamos un error de sintaxis, pero nuestro for básicamente no haría nada de nada. Finalmente el ultimo componente de esta primer línea es el tamaño del paso, este componente se especifica aumentando en la cantidad deseada la variable de control.

Línea 2:


En la línea 2 tenemos una llave abriendo "{" lo cual como seguramente ya sabrás indica que allí comienza el bloque de instrucciones que se ejecutaran cada vez que el ciclo de un "giro". Esta llave no es del todo obligatoria, sin embargo si no la ponemos solo se ejecutara dentro de nuestro ciclo la primera línea inmediatamente posterior a la declaración del ciclo, de modo que si deseamos que se ejecuten varias líneas dentro de nuestro ciclo, debemos usar las llaves

Línea 3 a 7:


En estas líneas es donde estarán todas las operaciones que queramos llevar a cabo de manera iterativa durante la ejecución del ciclo, este bloque podrá tener la cantidad de líneas necesarias incluso, como veremos más adelante dentro de estas podría haber uno o más ciclos, así que podrías tener todo un programa dentro de un ciclo.

Línea 8:


En esta última línea hacemos uso de la llave cerrando "}", una vez más como seguramente ya sabrás esta nos indica que allí termina el bloque del ciclo for y se dará por terminada la ejecución de este para continuar ejecutando el resto del algoritmo.
No te preocupes si no comprendiste muy bien lo que acabo de escribir, estoy seguro que con un par de ejemplos que veremos a continuación, te va a quedar todo claro

Ejemplos de Ciclo For en C++

A continuación vamos a ver unos cuantos ejemplos para comprender de manera adecuada el uso de los ciclos for en c++, recuerda que si no comprendes alguno de estos ejemplos o tienes alguna pregunta o sugerencia sobre estos o cualquier contenido de la sección, puedes dejarlas en la sección de comentarios

Ejemplo 1: Mostrar en pantalla los números pares


Vamos a retomar el ejemplo anterior, donde deseábamos sacar los números pares entre el numero 50 y el 100, es un ejemplo sencillo con el que nos aseguraremos de haber comprendido bien lo anterior:

Solución Ejemplo 1:


Como pudimos ver anteriormente, tenemos entonces que el valor inicial para nuestro ciclo es el numero 50 y el valor final es el 100, además, dado que necesitamos los números pares vamos a ir de dos en dos, así que el tamaño del paso va a ser 2, teniendo estos 3 componentes identificados, estamos listos para crear nuestro ciclo for así:

for(int i=50;i<=100;i+=2) {//Notemos que escribir i+=2 es similar a escribir i = i + 2 cout << i << endl; }
El código funcional completo sería el siguiente:
#include "iostream" using namespace std; int main() { for(int i=50;i<=100;i+=2) {//Notemos que escribir i+=2 es similar a escribir i = i + 2 cout << i << endl; } system("PAUSE"); return 0; }
Nota: Si no comprendes alguna de las líneas de estos códigos, te recomiendo visitar los contenidos anteriores (Entrada y Salida de DatosLibrerías ó ComentariosEstructura de un Programa) o también puedes dejar un comentario al final de la sección con tu pregunta.

Ejemplo 2: Cuenta regresiva en un ciclo for


Ahora veremos otro ejemplo sencillo en cual veremos que el ciclo for también puede iterar disminuyendo el valor del contador, para comprender esto, lo que haremos será imprimir por pantalla una cuenta regresiva desde el número diez hasta el cero, veamos:

Solución Ejemplo 2:


Para este caso, debido a que queremos ir de un número mayor a uno más pequeño, por lo tanto para este ejemplo el valor inicial será 10 y el valor final será cero. Adicional, el tamaño de paso será de 1 negativo, es decir, -1, así:
for(int i=10;i > 0; i--) {//Notemos que escribir i-- es similar a escribir i = i - 1 cout << i << endl; }
El código funcional completo sería el siguiente:
#include "iostream" using namespace std; int main() { for(int i=10; i > 0; i--) {//Notemos que escribir i-- es similar a escribir i = i - 1 cout << i << endl; } system("PAUSE"); return 0; }
Este código del ejemplo dos imprimirá por pantalla la serie numérica 10987654321

Ejemplo 3: Contador con un ciclo for


Para este ejemplo haremos algo un poco más complejo. El ejemplo consiste en contar al interior de un ciclo for, cuántos números entre el 0 y el 10.000 son múltiplos del 13. Para ello haremos uso del operador % (modulo) que obtiene el residuo de una división y también usaremos un pequeño condicional para verificar que el modulo sea cero al dividir por 13.

Solución Ejemplo 3:


Para este caso el valor inicial será 0 y el valor final será 10000. Adicional, el tamaño de paso será de 1. Al interior del ciclo, en cada iteración verificaremos si el número en el que estamos es divisible por trece o no y en caso afirmativo aumentaremos el contador en una unidad así:

int contador = 0; //Iniciamos el contador en cero for(int i = 0; i < 10000; i++) {//Notemos que escribir i++ es similar a escribir i = i + 1 if(i%13 == 0) //Si el residuo es cero es múltiplo de 13 { contador++; //Si es múltiplo aumentamos el contador en 1 } } //Mostramos el contador después de verificar todos los números cout << contador << endl;
El código funcional completo sería el siguiente:
#include "iostream" using namespace std; int main() { int contador = 0; //Iniciamos el contador en cero for(int i = 0; i < 10000; i++) {//Notemos que escribir i++ es similar a escribir i = i + 1 if(i%13 == 0) //Si el residuo es cero es múltiplo de 13 { contador++; //Si es múltiplo aumentamos el contador en 1 } } //Mostramos el contador después de verificar todos los números cout << contador << endl; system("PAUSE"); return 0; }
Este ciclo for nos permitirá saber que existen 770 múltiplos del 13 en los números del 0 al 10000.
En efecto los ciclos for, son bastante útiles, sin embargo desde el punto de vista de la eficiencia, es recomendable evitarlos en la medida de lo posible, siempre que vayas a usar un ciclo for, deberías preguntarte primero si es totalmente necesario o si existe una manera más efectiva de hacerlo. Evidentemente habrá situaciones en las que será casi que imprescindible usar el ciclo for, pues por algo existen. Está entonces en nuestra habilidad determinar cuándo usarlos y mejor aún cómo usarlos de manera efectiva.

Ventajas y Desventajas del Ciclo FOR


EL FOR EXTENDIDO O BUCLES FOR EACH EN JAVA
En las últimas versiones de Java se introdujo una nueva forma de uso del for, a la que se denomina “for extendido” o “for each”. Esta forma de uso del for, que ya existía en otros lenguajes, facilita el recorrido de objetos existentes en una colección sin necesidad de definir el número de elementos a recorrer. La sintaxis que se emplea es:
 

       for ( TipoARecorrer nombreVariableTemporal : nombreDeLaColección ) {
                                               Instrucciones
       }


Fíjate que en ningún momento se usa la palabra clave each que se usa en otros lenguajes, aunque al for muchas veces se le nombre como for each. Para saber si un for es un for extendido o un for normal hemos de fijarnos en la sintaxis que se emplea. La interpretación que podemos hacer de la sintaxis del for extendido es: “Para cada elemento del tipo TipoARecorrer que se encuentre dentro de la colección nombreDeLaColección ejecuta las instrucciones que se indican”. La variable local-temporal del ciclo almacena en cada paso el objeto que se visita y sólo existe durante la ejecución del ciclo y desaparece después. Debe ser del mismo tipo que los elementos a recorrer. Ejemplo
//Ejemplo aprenderaprogramar.com
public void listarTodosLosNombres () {
        for (String i: listaDeNombres) {
        System.out.println (i); //Muestra cada uno de los nombres dentro de listaDeNombres
    }
  }


En este tipo de ciclos podemos darle un nombre más descriptivo a la variable temporal, por ejemplo:
//Ejemplo aprenderaprogramar.com
public void listarTodosLosNombres () {
        for (String nombre: listaDeNombres) {
        System.out.println (nombre);              }
   }


Un ejemplo de llamada desde un método main (u otro lugar) sería:
//Ejemplo aprenderaprogramar.com
System.out.println ("Mostramos todos los nombres con un ciclo for-each");
lista1.listarTodosLosNombres();


El for extendido tiene algunas ventajas y algunos inconvenientes. No se debe usar siempre. Su uso no es obligatorio, de hecho, como hemos indicado, en versiones anteriores ni siquiera existía en el lenguaje. En vez de un for extendido podemos preferir usar un ciclo while. Lo haríamos así:
//Ejemplo aprenderaprogramar.com
int i = 0;
while (i < lista1.size() ) {        System.out.println (lista1.getNombre(i) );
                                           i++;                                                     }


El ciclo for-each es una herramienta muy útil cuando tenemos que realizar recorridos completos de colecciones, por lo que lo usaremos en numerosas ocasiones antes que ciclos for o while que nos obligan a estar pendientes de más cuestiones (por ejemplo en este caso con el while, de llevar un contador, llamar en cada iteración a un método, etc.). Un for extendido en principio recorre todos y cada uno de los elementos de una colección. Sin embargo, podemos introducir un condicional asociado a una sentencia break; que aborte el recorrido una vez se cumpla una determinada condición. Escribe y compila el siguiente código ejemplo de uso de un for extendido:
import java.util.ArrayList;
//Test del for extendido ejemplo aprenderaprogramar.com
public class TestForExtendido {
    public static void main (String [] Args) {
        ArrayList <String> jugadoresDeBaloncesto = new ArrayList<String> ();
        jugadoresDeBaloncesto.add ("Michael Jordan"); jugadoresDeBaloncesto.add ("Kobe Briant");
        jugadoresDeBaloncesto.add ("Pau Gasol"); jugadoresDeBaloncesto.add ("Drazen Petrovic");
        int i = 0;
        System.out.println ("Los jugadores de baloncesto en la lista son: ");

        for (String nombre : jugadoresDeBaloncesto) {  System.out.println ((i+1) + ".- " +nombre);
                                                                                       i++;  }
    } //Cierre del main
//Cierre de la clase


EJERCICIO
Crea una clase denominada ListaCantantesFamosos que al ser inicializada contenga un ArrayList con tres Strings que sean el nombre de cantantes famosos. Crea una clase test con el método main que inicialice un objeto ListaCantantesFamosos y usando un for extendido muestre los cantantes en la lista por pantalla. Se debe pedir al usuario un nombre más de cantante famoso, y una vez introducido mostrar la lista actualizada usando un for extendido. Una vez mostrada la lista actualizada, se debe dar opción a elegir entre volver a introducir otro cantante o salir del programa (se podrán introducir tantos cantantes como se desee, para ello usa un bucle while que dé opción a elegir al usuario). Puedes comprobar si tu código es correcto consultando en los foros aprenderaprogramar.com.