stringtranslate.com

En bucle

Diagrama de flujo del siguiente código de bucle:
para ( yo = 0 ; yo < 5 ; yo ++ ) printf ( "*" );        
El bucle hará que se impriman cinco asteriscos.

En informática, un bucle for o bucle for es una declaración de flujo de control para especificar la iteración . Específicamente, un bucle for funciona ejecutando una sección de código repetidamente hasta que se cumple una determinada condición.

Los bucles For tienen dos partes: un encabezado y un cuerpo. El encabezado define la iteración y el cuerpo es el código que se ejecuta una vez por iteración. El encabezado a menudo declara un contador de bucle explícito o una variable de bucle . Esto le permite al cuerpo saber qué iteración se está ejecutando. Los bucles For se utilizan normalmente cuando se conoce el número de iteraciones antes de ingresar al bucle. Los bucles For pueden considerarse como abreviaturas de bucles while que incrementan y prueban una variable de bucle.

Se utilizan varias palabras clave para indicar el uso de un bucle for: los descendientes de ALGOL usan " for ", mientras que los descendientes de Fortran usan " do ". Hay otras posibilidades, por ejemplo COBOL que usa .PERFORM VARYING

El nombre bucle for proviene de la palabra for. For se utiliza como palabra reservada (o palabra clave) en muchos lenguajes de programación para introducir un bucle for. El término en inglés data de ALGOL 58 y se popularizó en ALGOL 60 . Es la traducción directa del anterior alemán für y fue utilizado en Superplan (1949-1951) por Heinz Rutishauser . Rutishauser participó en la definición de ALGOL 58 y ALGOL 60. [1] El cuerpo del bucle se ejecuta "para" los valores dados de la variable del bucle. Esto es más explícito en las versiones ALGOL de la declaración for donde se puede especificar una lista de posibles valores e incrementos.

En Fortran y PL/I , la palabra clave DO se usa para lo mismo y se denomina bucle do ; esto es diferente de un bucle do- while .

PARA

Para la ilustración del bucle, de i=0 a i=2, lo que da como resultado data1=200

Una declaración de bucle for está disponible en la mayoría de los lenguajes de programación imperativos . Incluso ignorando diferencias menores en la sintaxis , existen muchas diferencias en cómo funcionan estas declaraciones y el nivel de expresividad que admiten. Generalmente, los bucles for se clasifican en una de cuatro categorías:

Bucles for tradicionales

El bucle for de lenguajes como ALGOL , Simula , BASIC , Pascal , Modula , Oberon , Ada , MATLAB , OCaml , F# , etc., requiere una variable de control con valores iniciales y finales, que se parece a esto:

for i = primera a última declaración do (* o simplemente *) for i = primera ... última declaración do            

Dependiendo del idioma, se puede usar un signo de asignación explícito en lugar del signo igual (y algunos idiomas requieren la palabra intincluso en el caso numérico). También se puede incluir un valor de paso opcional (un incremento o decremento ≠ 1), aunque la sintaxis exacta utilizada para esto difiere un poco más entre los idiomas. Algunos lenguajes requieren una declaración separada de la variable de control, otros no.

Otra forma fue popularizada por el lenguaje C. Requiere 3 partes: la inicialización ( variante de bucle ), la condición y el avance a la siguiente iteración. Estas tres partes son opcionales. [2] Este tipo de "bucles de punto y coma" proviene del lenguaje de programación B y fue inventado originalmente por Stephen Johnson . [3]

En la parte de inicialización, se declaran las variables necesarias (y generalmente se les asignan valores). Si se declaran varias variables, todas deben ser del mismo tipo. La parte de condición verifica una determinada condición y sale del bucle si es falsa, incluso si el bucle nunca se ejecuta. Si la condición es verdadera, se ejecutan las líneas de código dentro del bucle. El avance a la siguiente parte de la iteración se realiza exactamente una vez cada vez que finaliza el ciclo. Luego, el ciclo se repite si la condición se evalúa como verdadera.

A continuación se muestra un ejemplo del bucle for tradicional estilo C en Java .

// Imprime los números del 0 al 99 (y no el 100), cada uno seguido de un espacio.para ( int i = 0 ; i < 100 ; i ++ ) { System . afuera . imprimir ( yo ); Sistema . afuera . imprimir ( ' ' ); } Sistema . afuera . imprimir ();      

Estos bucles a veces también se denominan bucles for numéricos en comparación con los bucles foreach (ver más abajo).

Bucles for basados ​​en iteradores

Este tipo de bucle for es una generalización del tipo de bucle for de rango numérico, ya que permite la enumeración de conjuntos de elementos distintos de secuencias numéricas. Suele caracterizarse por el uso de un iterador implícito o explícito , en el que la variable de bucle toma cada uno de los valores de una secuencia u otra colección de datos. Un ejemplo representativo en Python es:

para  el elemento  en  some_iterable_object :  hacer_algo ()  hacer_algo_else ()

¿Dónde some_iterable_objecthay una recopilación de datos que admite la iteración implícita (como una lista de nombres de empleados) o, de hecho, puede ser un iterador en sí? Algunos idiomas tienen esto además de otra sintaxis de bucle for; En particular, PHP tiene este tipo de bucle bajo el nombre for each, así como un bucle for de tres expresiones (ver más abajo) bajo el nombre for.

Bucles for vectorizados

Algunos lenguajes ofrecen un bucle for que actúa como si procesara todas las iteraciones en paralelo , como la for allpalabra clave en Fortran 95 , que tiene la interpretación de que todas las expresiones del lado derecho se evalúan antes de realizar cualquier asignación, a diferencia de la iteración explícita. forma. Por ejemplo, en la fordeclaración del siguiente fragmento de pseudocódigo, al calcular el nuevo valor para A(i), excepto para el primero (con i = 2), la referencia a A(i - 1)obtendrá el nuevo valor que se había colocado allí en el paso anterior. En la for allversión, sin embargo, cada cálculo se refiere únicamente al original, inalterado A.

para i := 2 : N - 1 hacer A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3; siguiente yo;para todo i := 2 : N - 1 hacer A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3;

La diferencia puede ser significativa.

Algunos lenguajes (como PL/I, Fortran 95) también ofrecen declaraciones de asignación de matrices, que permiten omitir muchos bucles for. Por lo tanto, un pseudocódigo como el que A := 0;establecería todos los elementos de la matriz A en cero, sin importar su tamaño o dimensionalidad. El bucle de ejemplo podría representarse como

 A ( 2 : N - 1 ) : = [ A ( 1 : N - 2 ) + A ( 2 : N - 1 ) + A ( 3 : N )] / 3 ;                      

Pero es posible que no se describa claramente en el manual del compilador si eso se representaría en el estilo del bucle for o del bucle for all o algo más.

Bucles for compuestos

Introducido con ALGOL 68 y seguido por PL/I, esto permite combinar la iteración de un bucle con una prueba, como en

para i := 1 : N mientras que A(i) > 0 lo hace , etc.

Es decir, se asigna un valor a la variable del bucle i y sólo si la expresión while es verdadera se ejecutará el cuerpo del bucle. Si el resultado fuera falso , la ejecución del bucle for se detiene en seco. Suponiendo que el valor de la variable del bucle se define después de la terminación del bucle, entonces la declaración anterior encontrará el primer elemento no positivo en la matriz A (y si no existe tal, su valor será N + 1 ), o, con variaciones adecuadas , el primer carácter que no esté en blanco en una cadena, y así sucesivamente.

Contadores de bucle

En programación de computadoras , un contador de bucle es una variable de control que controla las iteraciones de un bucle (una construcción del lenguaje de programación de computadoras ). Se llama así porque la mayoría de los usos de esta construcción dan como resultado que la variable tome un rango de valores enteros en algunas secuencias ordenadas (por ejemplo, comenzando en 0 y terminando en 10 en incrementos de 1).

Los contadores de bucle cambian con cada iteración de un bucle, proporcionando un valor único para cada iteración individual. El contador de bucle se utiliza para decidir cuándo debe terminar el bucle y para que el flujo del programa continúe con la siguiente instrucción después del bucle.

Una convención de nomenclatura de identificadores común es que el contador de bucles utilice los nombres de variables i , j y k (y así sucesivamente si es necesario), donde i sería el bucle más externo, j el siguiente bucle interno, etc. El orden inverso es También utilizado por algunos programadores. En general, se acepta que este estilo se originó en la programación temprana de Fortran [ cita necesaria ] , donde estos nombres de variables que comenzaban con estas letras se declaraban implícitamente como de tipo entero, por lo que eran opciones obvias para contadores de bucles que solo se requerían temporalmente. La práctica se remonta a la notación matemática , donde los índices para sumas y multiplicaciones suelen ser i , j , etc. Una convención variante es el uso de letras duplicadas para el índice, ii , jj y kk , ya que esto permite una búsqueda más fácil. reemplazar que usar una sola letra. [4]

Ejemplo

Un ejemplo de código C que involucra bucles for anidados, donde las variables del contador de bucles son i y j :

para ( i = 0 ; i < 100 ; i ++ ) { para ( j = i ; j < 10 ; j ++ ) { alguna_función ( i , j ); } }                    

Los bucles For en C también se pueden utilizar para imprimir el reverso de una palabra. Como:

para ( i = 0 ; i < 6 ; i ++ ) { scanf ( "%c" , &a [ i ]); } for ( i = 4 ; i >= 0 ; i - ) { printf ( "%c" , a [ i ]); }                    

Aquí, si la entrada es apple, la salida será elppa.

Semántica y construcciones adicionales.

Usar como bucles infinitos

Este bucle for estilo C suele ser la fuente de un bucle infinito , ya que los pasos fundamentales de la iteración están completamente bajo el control del programador. De hecho, cuando se pretende realizar bucles infinitos, se puede utilizar este tipo de bucle for (con expresiones vacías), como por ejemplo:

para (;;) //cuerpo del bucle  

Este estilo se utiliza en lugar de while (1)bucles infinitos para evitar una advertencia de conversión de tipos en algunos compiladores de C/C++. [5] Algunos programadores prefieren la for (;;)forma más sucinta a la while (true)forma semánticamente equivalente pero más detallada.

Salida anticipada y continuación.

Algunos lenguajes también pueden proporcionar otras declaraciones de respaldo, que cuando están presentes pueden alterar la forma en que se desarrolla la iteración del bucle for. Entre ellas, las más comunes son las declaraciones de interrupción y continuación que se encuentran en C y sus derivados. La instrucción break hace que el bucle más interno finalice inmediatamente cuando se ejecuta. La declaración de continuación pasará inmediatamente a la siguiente iteración sin avanzar más a través del cuerpo del bucle para la iteración actual. Una declaración for también termina cuando se ejecuta una declaración break, goto o return dentro del cuerpo de la declaración. [Wells] Otros lenguajes pueden tener declaraciones similares o proporcionar medios para alterar el progreso del bucle for; por ejemplo en Fortran 95:

¡DO I = 1 , N declaraciones ! Ejecutado para todos los valores de "I", hasta un desastre, si lo hubiera. SI ( no es bueno ) ¡ CICLO ! Omita este valor de "I", continúe con el siguiente. Declaraciones !Ejecutadas sólo donde prevalece la bondad. SI ( desastre ) SALIR ! Abandonar el bucle. Declaraciones !Aunque bueno y, no hay desastre. FIN DO ! Debe alinearse con el "DO".                   

Algunos lenguajes ofrecen funciones adicionales, como nombrar las distintas declaraciones de bucle, de modo que con múltiples bucles anidados no haya dudas sobre qué bucle está involucrado. Fortran 95, por ejemplo:

X1 : DO I = 1 , N sentencias X2 : DO J = 1 , M sentencias IF ( problema ) CICLO X1 sentencias END DO X2 sentencias END DO X1              

Por lo tanto, cuando se detecta un "problema" en el bucle interno, el CICLO X1 (no X2) significa que el salto será a la siguiente iteración para I, no para J. El compilador también verificará que cada END DO tenga la etiqueta apropiada por su posición: no se trata sólo de una ayuda para la documentación. El programador aún debe codificar el problema correctamente, pero se bloquearán algunos posibles errores.

Alcance y semántica de la variable de bucle

Los diferentes idiomas especifican diferentes reglas sobre el valor que mantendrá la variable del bucle al finalizar su bucle y, de hecho, algunos sostienen que "se vuelve indefinido". Esto permite que un compilador genere código que deje cualquier valor en la variable del bucle, o tal vez incluso lo deje sin cambios porque el valor del bucle se mantuvo en un registro y nunca se almacenó en la memoria. El comportamiento real puede incluso variar según la configuración de optimización del compilador, como ocurre con el compilador Honywell Fortran66.

En algunos lenguajes (no C o C++ ), la variable del bucle es inmutable dentro del alcance del cuerpo del bucle, y cualquier intento de modificar su valor se considera un error semántico. Estas modificaciones a veces son consecuencia de un error del programador, que puede ser muy difícil de identificar una vez realizado. Sin embargo, es probable que el compilador sólo detecte cambios evidentes. Las situaciones en las que la dirección de la variable del bucle se pasa como argumento a una subrutina hacen que sea muy difícil de comprobar, porque el comportamiento de la rutina en general es desconocido para el compilador. Algunos ejemplos al estilo de Fortran:

DO I = 1 , N I = 7 !Ajuste excesivo de la variable del bucle. Es probable que se produzca una queja del compilador. Z = AJUSTAR ( I ) !La función "AJUSTAR" podría alterar "I", con efectos inciertos. declaraciones normales ! La memoria puede desvanecerse porque "I" es la variable del bucle. PRINT ( A ( I ), B ( I ), I = 1 , N , 2 ) !Bucle for implícito para imprimir elementos impares de los arreglos A y B, reutilizando "I"... PRINT I !Qué valor se presentará ? END DO !¿Cuántas veces se ejecutará el bucle?                          

Un enfoque común es calcular el recuento de iteraciones al inicio de un bucle (con especial atención al desbordamiento como en la for i := 0 : 65535 do ... ;aritmética de enteros de dieciséis bits) y con cada iteración disminuir este recuento y al mismo tiempo ajustar el valor de I : resultados del doble recuento. Sin embargo, los ajustes al valor de I dentro del bucle no cambiarán el número de iteraciones ejecutadas.

Otra posibilidad más es que el código generado pueda emplear una variable auxiliar como variable de bucle, posiblemente mantenida en un registro de máquina, cuyo valor puede copiarse o no en I en cada iteración. Nuevamente, las modificaciones de I no afectarían el control del bucle, pero ahora es posible una disyunción: dentro del bucle, las referencias al valor de I podrían ser al valor actual (posiblemente alterado) de I o a la variable auxiliar (mantenida). a salvo de modificaciones inadecuadas) y se garantizan resultados confusos. Por ejemplo, dentro del bucle, una referencia al elemento I de una matriz probablemente emplearía la variable auxiliar (especialmente si estuviera contenida en un registro de máquina), pero si I es un parámetro de alguna rutina (por ejemplo, una declaración de impresión para revelar su valor), probablemente sería una referencia a la variable adecuada I. Lo mejor es evitar tales posibilidades.

Ajuste de límites

Así como la variable de índice puede modificarse dentro de un bucle for, también pueden modificarse sus límites y dirección. Pero con un efecto incierto. Un compilador puede impedir tales intentos, puede que no tengan ningún efecto o incluso que funcionen correctamente, aunque muchos declararían que hacerlo sería un error. Considere una afirmación como

para i := primero : último : paso hacer A(i) := A(i) / A(último);

Si el enfoque para compilar dicho bucle fuera la evaluación de first , last y step y el cálculo de un recuento de iteraciones mediante algo así como una sola vez al inicio, entonces si esos elementos fueran variables simples y sus valores se ajustaran de alguna manera durante el proceso. iteraciones, esto no tendría ningún efecto en el recuento de iteraciones incluso si el elemento seleccionado para la división cambiara .(last - first)/stepA(last)

Lista de rangos de valores

PL/I y ALGOL 68 permiten bucles en los que la variable de bucle se itera sobre una lista de rangos de valores en lugar de un solo rango. El siguiente ejemplo de PL/I ejecutará el bucle con seis valores de i: 1, 7, 12, 13, 14, 15:

hacer  i = 1 , 7 , 12 a 15 ; /*declaraciones*/ fin ;       

Equivalencia con bucles while

Un bucle for es generalmente equivalente a un bucle while:

factores := 1 para contador de 2 a 5 factorial := factorial * contadorcontador := contador - 1imprimir contador + "! es igual a " + factorial

es equivalente a:

factores := 1contador := 1 mientras contador < 5 contador := contador + 1 factorial := factorial * contadorimprimir contador + "! es igual a " + factorial

como lo demuestra la salida de las variables.

Cronología de la sintaxis del bucle for en varios lenguajes de programación

Dada una acción que debe repetirse, por ejemplo, cinco veces, los bucles for de diferentes idiomas se escribirán de forma diferente. La sintaxis de un bucle for de tres expresiones es casi idéntica en todos los lenguajes que lo tienen, después de tener en cuenta diferentes estilos de terminación de bloque, etc.

1957: FORTRAN

El equivalente de Fortran del bucle for es el bucle DO , utilizando la palabra clave do en lugar de for. La sintaxis del bucle DO de Fortran es:

   DO etiqueta contador = primer , último , declaraciones de paso declaración de etiqueta          

Los siguientes dos ejemplos se comportan de manera equivalente al bucle for de tres argumentos en otros lenguajes, inicializando la variable contador a 1, incrementando en 1 cada iteración del bucle y deteniéndose en cinco (inclusive).

   HACER 9 , CONTADOR = 1 , 5 , 1 ESCRIBIR ( 6 , 8 ) CONTADOR  8 FORMATAR ( I2 )  9 CONTINUAR                

En Fortran 77 (o posterior), esto también puede escribirse como:

hacer contador = 1 , 5 escribir ( * , '(i2)' ) fin del contador hacer      

La parte del paso puede omitirse si el paso es uno. Ejemplo:

* Ejemplo de bucle DO. PROGRAMA PRINCIPAL SUM SQ = 0 DO 199 I = 1 , 9999999 IF ( SUM SQ . GT . 1000 ) IR A 200 199 SUM SQ = SUM SQ + I ** 2 200 IMPRIMIR 206 , SUMSQ 206 FORMATO ( I2 ) FIN                                      

Los espacios son irrelevantes en declaraciones Fortran de forma fija, por lo que SUM SQ es lo mismo que SUMSQ . En el estilo moderno de Fortran de forma libre, los espacios en blanco son importantes.

En Fortran 90, GO TO se puede evitar utilizando una declaración EXIT .

* Ejemplo de bucle DO. programa principal implícito ninguno         entero :: sumaq entero :: i          sumasq = 0 hacer i = 1 , 9999999 if ( sumasq > 100 0.0 ) salir sumasq = sumasq + i ** 2 fin imprimir * , sumasq                                 programa final

1958: ALGOL

ALGOL 58 introdujo el forcomunicado, utilizando la forma como Superplan:

FOR Identificador = Límite base ( diferencia )

Por ejemplo, para imprimir de 0 a 10 incrementado en 1:

PARA x = 0 (1) 10 COMENZARIMPRIMIR (FL) = x FIN

1960: COBOL

COBOL se formalizó a finales de 1959 y ha tenido muchas elaboraciones. Utiliza el verbo PERFORM que tiene muchas opciones. Originalmente, todos los bucles tenían que estar fuera de línea y el código iterado ocupaba un párrafo separado. Ignorando la necesidad de declarar e inicializar variables, el equivalente COBOL de un bucle for sería.

 REALIZAR SQ-RUTINA VARIANDO I DE 1 A 1 HASTA I > 1000          RUTINA SQ AÑADIR I ** 2 A SUM-SQ .    

En la década de 1980, la adición de bucles en línea y declaraciones de programación estructuradas como END-PERFORM dieron como resultado un bucle for con una estructura más familiar.

 REALIZAR VARIAR I DE 1 POR 1 HASTA I > 1000 AÑADIR I ** 2 A SUM-SQ . FINAL DE RENDIMIENTO            

Si el verbo PERFORM tiene la cláusula opcional TEST AFTER, el bucle resultante es ligeramente diferente: el cuerpo del bucle se ejecuta al menos una vez, antes de cualquier prueba.

1964: BÁSICO

En BASIC , un bucle a veces se denomina bucle for-next .

10 REM ESTE PARA BUCLE IMPRIME NÚMEROS IMPARES DEL 1 AL 15 20 FOR I = 1 AL 15 PASO 2 30 IMPRIMIR I 40 SIGUIENTE I             

El marcador de final de bucle especifica el nombre de la variable de índice, que debe corresponder al nombre de la variable de índice al inicio del bucle for. Algunos lenguajes (PL/I, Fortran 95 y posteriores) permiten una etiqueta de declaración al inicio de un bucle for que el compilador puede comparar con el mismo texto en la declaración de final de bucle correspondiente. Fortran también permite que las EXITdeclaraciones CYCLEy nombren este texto; en un nido de bucles esto deja claro qué bucle se pretende. Sin embargo, en estos lenguajes las etiquetas deben ser únicas, por lo que los bucles sucesivos que involucran la misma variable de índice no pueden usar el mismo texto ni una etiqueta puede ser el mismo que el nombre de una variable, como la variable de índice del bucle.

1964: PL/I

hacer  contador = 1 a 5 por 1 ; /* "por 1" es el valor predeterminado si no se especifica */ /*declaraciones*/ ; fin ;         

La declaración LEAVE se puede utilizar para salir del ciclo. Los bucles se pueden etiquetar y dejar puede dejar un bucle etiquetado específico en un grupo de bucles anidados. Algunos dialectos PL/I incluyen la instrucción ITERATE para finalizar la iteración del bucle actual y comenzar la siguiente.

1968: ALGOL 68

ALGOL 68 tiene lo que se consideraba el bucle universal, la sintaxis completa es:

PARA i DE 1 POR 2 A 3 MIENTRAS i≠4 DO ~ OD

Además, el rango de iteración única podría reemplazarse por una lista de dichos rangos. Hay varios aspectos inusuales de la construcción.

INT suma cuadrada: = 0;PARA YO MIENTRAS print(("Hasta ahora:", i, nueva línea)); # Interpuesto con fines de rastreo. # suma cuadrada ≠ 70 ↑2 # Esta es la prueba para MIENTRAS #HACER suma cuadrada +:= i ↑2sobredosis

Las posteriores ampliaciones del estándar ALGOL 68 permitieron tosustituir el elemento sintáctico uptoy downtolograr una pequeña optimización. Los mismos compiladores también incorporaron:

until
para la terminación tardía del bucle.
foreach
para trabajar en matrices en paralelo .

1970: Pascal

para Contador := 1 a 5 hacer (*declaración*) ;       

Decrementar (contar hacia atrás) es usar downtouna palabra clave en lugar de to, como en:

para Contador := 5 hasta 1 hacer (*declaración*) ;       

El bucle for de rango numérico varía algo más.

1972: C, C ++

for ( inicialización ; condición ; incremento / decremento ) declaración    

La declaración es a menudo una declaración en bloque; un ejemplo de esto sería:

//Usando bucles for para sumar números del 1 al 5 int sum = 0 ; for ( int i = 1 ; i <= 5 ; ++ i ) { suma += i ; }               

La publicación ISO/IEC 9899:1999 (comúnmente conocida como C99 ) también permite declaraciones iniciales en forbucles. Las tres secciones del bucle for son opcionales, con una condición vacía equivalente a verdadero.

1972: pequeña charla

1  a:  5  hacer: [ : contador  |  "declaraciones" ]

A diferencia de otros lenguajes, en Smalltalk un bucle for no es una construcción del lenguaje , sino que se define en la clase Número como un método con dos parámetros, el valor final y un cierre , usando self como valor inicial.

1980: Ada

para  Contador  en  1  ..  5  bucles  - las declaraciones finalizan  el bucle ;

La declaración de salida se puede utilizar para salir del bucle. Los bucles se pueden etiquetar y la salida puede dejar un bucle específicamente etiquetado en un grupo de bucles anidados:

Contando :  para  Contador  en  1  ..  5  bucles  Triángulo :  para  Secondary_Index  en  2  ..  Contador  de bucles  - declaraciones  salen  Contando ;  -- sentencias  que finalizan  el bucle  Triángulo ;  finalizar  el ciclo  Contando ;

1980: arce

Maple tiene dos formas de bucle for, una para iterar un rango de valores y la otra para iterar sobre el contenido de un contenedor. La forma del rango de valores es la siguiente:

para  i  desde  f  por  b  hasta  t  mientras  w  hacemos  # cuerpo del bucle od ;

Todas las piezas excepto doy odson opcionales. La pieza, si está presente, debe ser lo primero. Las partes restantes ( , , , ) pueden aparecer en cualquier orden.for ifrom fby bto twhile w

La iteración sobre un contenedor se realiza mediante esta forma de bucle:

for  e  in  c  while  w  hacer  # cuerpo del bucle od ;

La cláusula especifica el contenedor, que puede ser una lista, un conjunto, una suma, un producto, una función no evaluada, una matriz o un objeto que implementa un iterador.in c

Un bucle for puede terminar con od, endo end do.

1982: Máxima CAS

En Maxima CAS, también se pueden utilizar valores no enteros:

para x : 0.5 paso 0.1 a 0.9 do /* "Hacer algo con x" */       

1982: posdata

El bucle for, escrito como [initial] [increment] [limit] { ... } forinicializa una variable interna, ejecuta el cuerpo siempre que la variable interna no supere el límite (o no sea menor, si el incremento es negativo) y, al final de cada iteración, incrementa la variable interna. Antes de cada iteración, el valor de la variable interna se coloca en la pila. [6]

1  1  6  { DECLARACIONES }  para

También hay un bucle de repetición simple. El bucle de repetición, escrito como X { ... } repeat, repite el cuerpo exactamente X veces. [7]

5  {  DECLARACIONES  }  repetir

1983: Ada 83 y superior

El procedimiento  principal  es  Sum_Sq  :  Entero  : =  0 ; comience  para  I  en  1  ..  9999999  bucle  si  Sum_Sq  <=  1000  entonces  Sum_Sq  :=  Sum_Sq  +  I ** 2  finalice  si ;  bucle final  ; fin ;

1984:MATLAB

para n = 1 : 5 - fin de las declaraciones     

Después del bucle, nen este ejemplo sería 5.

Como ise utiliza para la unidad Imaginaria , se desaconseja su uso como variable de bucle.

1987: perla

for ( $contador = 1 ; $contador <= 5 ; $contador ++ ) { # variables implícitas o predefinidas # declaraciones; } for ( mi $contador = 1 ; $contador <= 5 ; $contador ++ ) { # variable privada para el bucle # declaraciones; } for ( 1 .. 5 ) { # variable llamada implícitamente $_; 1..5 crea una lista de estos 5 elementos # declaraciones; } declaración para 1 .. 5 ; # casi lo mismo (solo 1 declaración) con orden en lenguaje natural para mi $contador ( 1 .. 5 ) { # variable privada para el bucle # declaraciones; }                                  

" Hay más de una forma de hacerlo " es un lema de la programación en Perl.

1988: Matemáticas

La construcción correspondiente al bucle for de la mayoría de los demás lenguajes se denomina Do en Mathematica.

Hacer [ f [ x ] , { x , 0 , 1 , 0 . 1 } ]    

Mathematica también tiene una construcción For que imita el bucle for de lenguajes tipo C.

Para [ x = 0 , x <= 1 , x += 0 . 1 , f [ x ] ]         

1989: fiesta

# primer formulario para  i en 1 2 3 4 5 do # debe tener al menos un comando en el bucle echo $i # simplemente imprime el valor de i done          
# segunda forma para (( i = 1 ; i < = 5 ; i++ )) do # debe tener al menos un comando en el bucle echo $i # simplemente imprime el valor de i done             

Un bucle vacío (es decir, uno sin comandos entre doy done) es un error de sintaxis. Si los bucles anteriores contuvieran solo comentarios, la ejecución daría como resultado el mensaje "error de sintaxis cerca del token inesperado 'hecho'".

1990: Haskel

El imperativo incorporado forM_ asigna una expresión monádica a una lista, como

forM_ [ 1 .. 5 ] $ \ indx -> hacer declaraciones      

u obtener el resultado de cada iteración como una lista en

declaraciones_result_list <- forM [ 1 .. 5 ] $ \ indx -> hacer declaraciones        

Pero, para ahorrar espacio en la lista [1..5], se puede definir una construcción forLoop_ monádica más auténtica como

importar Control.Monad como M   forLoopM_ :: Monad m => a -> ( a -> Bool ) -> ( a -> a ) -> ( a -> m () ) -> m () forLoopM_ indx prop incr f = do f indx M . cuando ( prop siguiente ) $ forLoopM_ siguiente prop incr f donde siguiente = incr indx                                           

y utilizado como:

 forLoopM_ ( 0 :: Int ) ( < len ) ( + 1 ) $ \ indx -> hacer - lo que sea con el índice         

1991: Oberon-2, Oberon-07, componente Pascal

FOR  Contador  :=  1  A  5  DO  (* secuencia de instrucciones *) FINAL

En el lenguaje original de Oberon, el bucle for se omitió en favor de la construcción de bucle Oberon más general. El bucle for se reintrodujo en Oberon-2.

1991: pitón

Python no contiene el bucle for clásico, sino que foreachse utiliza un bucle para iterar sobre la salida de la función incorporada range()que devuelve una secuencia iterable de números enteros.

para  i  en el  rango ( 1 ,  6 ):  # da valores de i del 1 al 5 inclusive (pero no 6)  # declaraciones  imprimen ( i ) # si queremos 6 debemos hacer lo siguiente para  i  en el  rango ( 1 ,  6  +  1 ):  # da valores i del 1 al 6  # declaraciones  imprimen ( i )

Usar range(6)ejecutaría el ciclo de 0 a 5.

1993: AppleScript

repetir  con  i  del  1  al  5 - registro de declaraciones  i terminar  repetir

También puede iterar a través de una lista de elementos, similar a lo que se puede hacer con matrices en otros lenguajes:

establezca  x  en  { 1 ,  "waffles" ,  "tocino" ,  5.1 ,  false } repita  con  i  en  x log  i finalice  la repetición

A exit repeattambién se puede utilizar para salir de un bucle en cualquier momento. A diferencia de otros lenguajes, AppleScript actualmente no tiene ningún comando para continuar con la siguiente iteración de un bucle.

1993: cristal

for  i  =  inicio ,  parada ,  intervalo  do  - las declaraciones terminan

Entonces, este código

para  i  =  1 ,  5 ,  2  imprima  ( i ) final _

imprimirá:

1  3  5

Los bucles For también pueden recorrer una tabla usando

pares ()

iterar numéricamente a través de matrices y

pares ()

para iterar aleatoriamente a través de diccionarios.

Bucle for genérico que utiliza cierres:

para  nombre ,  teléfono ,  dirección  en  contactos ()  hacer  : contactos () debe ser un fin de función iterador

1995: Lenguaje de marcado ColdFusion (CFML)

Sintaxis de secuencia de comandos

Bucle de índice simple:

for  ( i  =  1 ;  i  <=  5 ;  i ++ )  { // declaraciones }

Usando una matriz:

for  ( i  en  [ 1 , 2 , 3 , 4 , 5 ])  { // declaraciones }

Usando una lista de valores de cadena:

 índice de bucle = "i"  lista = "1;2,3;4,5"  delimitadores = ",";"  { // declaraciones }

El listejemplo anterior sólo está disponible en el dialecto CFML utilizado por Lucee y Railo .

Sintaxis de etiquetas

Bucle de índice simple:

<cfloop  index = "i"  de = "1"  a = "5" > <!--- declaraciones ---> </cfloop>

Usando una matriz:

<cfloop  index = "i"  array = " #[1,2,3,4,5]# " > <!--- declaraciones ---> </cfloop>

Usando una "lista" de valores de cadena:

<cfloop  index = "i"  list = "1;2,3;4,5"  delimitadores = ",";" > <!--- declaraciones ---> </cfloop>

1995: java

for ( int i = 0 ; i < 5 ; i ++ ) { //realiza funciones dentro del bucle; //puede usar la declaración 'break;' salir temprano; //puedo usar la declaración 'continuar;' para omitir la iteración actual }            

Para el bucle for extendido, consulte Bucle Foreach § Java .

1995: JavaScript

JavaScript admite bucles de "tres expresiones" estilo C. Las declaraciones breaky continuese admiten dentro de bucles.

para ( var i = 0 ; i < 5 ; i ++ ) { // ... }          

Alternativamente, es posible iterar sobre todas las claves de una matriz.

for ( var key in array ) { // también funciona para assoc. matrices // usar matriz[clave] ... }        

1995: PHP

Esto imprime un triángulo de *

para  ( $i  =  0 ;  $i  <=  5 ;  $i ++ )  {  para  ( $j  =  0 ;  $j  <=  $i ;  $j ++ )  {  echo  "*" ;  }  eco  "<br /> \n " ; }

1995: Rubí

para contador en 1 .. 5 # fin de declaraciones    5 . veces lo hacen | mostrador | # el contador itera de 0 a 4 # las sentencias finalizan    1 . hasta ( 5 ) hacer | mostrador | # declaraciones terminan   

Ruby tiene varias sintaxis posibles, incluidos los ejemplos anteriores.

1996: OCaml

Ver sintaxis de expresión. [8]

 (* for_statement := "para" ident '=' expr ( "a" ∣ "downto") expr "hacer" expr "hecho" *)para  i  =  1  a  5  do  (*declaraciones*)  hecho  ;;para  j  =  5  hasta  0  hacer  (* declaraciones *)  hecho  ;;

1998: ActionScript 3

for ( var contador : uint = 1 ; contador <= 5 ; contador ++){ //declaración; }         

2008: Pequeño Básico

Para i = 1 a 10 ' Declaraciones EndFor      

2008: Nim

Nim tiene un foreachbucle de tipo y varias operaciones para crear iteradores. [9]

para i en 5 .. 10 : # declaraciones      

2009: ir

para yo : = 0 ; yo <= 10 ; i ++ { // declaraciones }         

2010: óxido

para i en 0 .. 10 { // declaraciones }     

2012: Julia

para j = 1 : 10 # fin de declaraciones    

Ver también

Referencias

  1. ^ Wirth, Niklaus (1973). "Prefacio". Programación sistemática: una introducción . págs. xiii. ISBN 0138803692.
  2. ^ "Para bucles en C++". Aprende C++ .
  3. ^ Thompson, Ken . VCF East 2019: Brian Kernighan entrevista a Ken Thompson. YouTube . Archivado desde el original el 12 de diciembre de 2021 . Consultado el 16 de noviembre de 2020 . Vi la versión de punto y coma de Johnson del bucle for y la puse en [B], la robé.
  4. ^ http://www.knosof.co.uk/vulnerabilities/loopcntrl.pdf Análisis de variables de control de bucle en C
  5. ^ "Advertencia del compilador (nivel 4) C4127". Microsoft . Consultado el 29 de junio de 2011 .
  6. ^ Referencia del lenguaje PostScript . Compañía editorial Addison-Wesley. 1999. pág. 596.ISBN _ 0-201-37922-8.
  7. ^ "Tutorial de PostScript: bucles".
  8. ^ "Sintaxis de expresión OCaml". Archivado desde el original el 12 de abril de 2013 . Consultado el 19 de marzo de 2013 .
  9. ^ https://nim-lang.org/docs/system.html#...i%2CT%2CT ".. iterador"