Bucle For

De Viquipèdia
Dreceres ràpides: navegació, cerca

El bucle for o cicle for és una estructura de control en la qual es pot indicar el nombre exacte d'iteracions. Està disponible en gairebé tots els llenguatges de programació imperatius.

Elements del bucle[modifica | modifica el codi]


 {\color{Sepia}\mathit{per}}\;
 {\color{OliveGreen}\mathit{i}}\;
 {\color{BlueViolet}\mathit{\gets}}\;
 {\color{OliveGreen}\mathit{x}}\;
 {\color{Sepia}\mathit{fins}}\;
 {\color{OliveGreen}\mathit{n}}\;
 {\color{Sepia}\mathit{a \; increments \, de}}\;
 {\color{OliveGreen}\mathit{s}}\;
 {\color{Sepia}\mathit{fer}}

 {\color{BlueViolet}\mathit{instruccions}}

 {\color{Sepia}\mathit{fi \; per}}
  • Variable de control: habitualment s'utilitza la lletra i com a variable de control, o bé les seves successores (j, k, ...) en cas de bucles niats. L'ús d'aquesta lletra pot semblar arbitrari a primera vista però en la pràctica és una excel·lent forma d'aportar agilitat de lectura al codi, pel seu ús tan comú. Com rares vegades els bucles niats superen les tres dimensions o nivells (per una senzilla qüestió d'explosió exponencial), les lletres i, j, k solen ser les úniques relacionades amb aquest ús. La raó, però, és que en Fortran per defecte les variables que començaven a partir de la I es declaraven com a enteres (Integer) i aquest costum s'ha traslladat a altres llenguatges de programació. En C, la variable de control s'especifica com a primer paràmetre de la instrucció for juntament amb la seva inicialització (opcionalment).
  • Inicialització de la variable de control: en pseudocodi es demana explicitar (és la secció i \leftarrow x), però, altres llenguatges més permissius com C no ho requereixen de manera obligatòria. De tota manera, la pràctica d'utilitzar variables de control que no s'inicialitzen en el bucle no és recomanada per a la llegibilitat del codi.
  • Condició de control: en pseudocodi es veu representada pel valor final que pot prendre la variable de control (la secció fins \ n). En C és el segon paràmetre de la instrucció for i pot ser qualsevol condició (ni tan sols és obligatori que hi aparegui la variable de control, tot i que això no es considera una bona pràctica ja que dificulta la legibilitat del codi).
  • Increment: en pseudocodi es pren per defecte el valor 1, encara que es pot fer explícit mitjançant la sentència a \ increments \ de \ s qualsevol nombre enter (és a dir, tècnicament també es podria ecrementar). En C és l'últim paràmetre de la sentència for.
  • Cos: és el conjunt d'instruccions que es repetirà a cada iteració. Se suposa que dintre del cos no s'hauria d'alterar el valor de la variable de control, ja que no es considera una bona pràctica i pot dificultar la legibilitat del bucle.

Usos[modifica | modifica el codi]

El seu ús principal s'orienta a operacions on es coneix a priori la mida o nombre de cops que s'haurà de repetir el cos d'instruccions, com ara les relacionades amb vectors. Si el nombre d'operacions pot variar en funció d'una condició, és millor usar altres tipus de bucle com ara MENTRE o REPETIR.

For en pseudocodi[modifica | modifica el codi]

La principal diferència d'un bucle PER pel que fa als bucles MENTRE I REPETIR, és que pot determinar al començament del bucle quantes vegades es iterar el mateix, la qual cosa moltes vegades pot redundar en una optimització del codi per part dels compiladors. Els condicionals constitueixen juntament amb els bucles els pilars de la programació estructurada, i el seu ús és una evolució d'una sentència de llenguatge d'assemblador que executava la següent línia o no en funció del valor d'una condició.

El bucle PER s'ha convertit en el bucle més àmpliament utilitzat en la programació, ja que amb l'evolució dels llenguatges la majoria de les condicions de fi

MENTRE NoFinDeTabla (taula) FER
PróximoRegistro (taula)
HacerAlgo (ElementoActual (taula))
FI MENTRE

És el mateix dir:

PER i: = 0 a CantidadRegistros (taula) - 1, PAS = 1
PróximoRegistro (taula)
HacerAlgo (ElementoActual (taula))
FI PER

Un altre ús comú és utilitzar els bucles PER per recórrer vectors de dues o més dimensions, en aquest cas es nien aquestes iteracions.

PSEUDOCODI

Vector a [3] [4] [2].//Estem indicant un vector de 3 dimensions i 24 elements en total.
PER i: = 0 A 2 FER
PER j: = 0 A 3 FER
PER k: = 0 A 1 FER
HacerAlgo (a [i] [j] [k])
FI PER
FI PER
FI PER

Exemple de PER en pseudocodi[modifica | modifica el codi]

PER VariableControl: = ValorInicial A ValorFinal, PAS = Increment
Cos
FI PER

on VariableControl , ValorInicial , ValorFinal i Pas són sencers. La (s) instrucció (s) del cos s'executarà (n) (ValorFinal - ValorInicial+1) vegades, o sigui que va des ValorInicial a ValorFinal inclusivament.

Exemple en C[modifica | modifica el codi]

int main () {

int vector [10], i;
for (i = 0; i <10; i++)
{
vector [i] = i;
}

}

En la definició del for , tenim que la variable de control i s'inicialitza en un valor 0, després es comprova la condició de control que ha de ser certa durant la seva execució, per completar el cicle, i, finalment, tenim l'increment, en aquest cas en una unitat. Quan la condició i<10 deixa de ser certa (quan i=10), el bucle finalitza.

Si, per exemple, en la condició col·loquem i <11, llavors el cicle for s'executarà des [0 ... 10], la qual cosa, en intentar accedir a l'element vector [10], generarà un error, ja que en C (per definició) els vectors de mida N van des de la posició 0 fins a la N-1.

Exemple anterior escrit en Lexico[modifica | modifica el codi]

tasca

{

els objectes vector [10], i són quantitats
variant i des 0-9 faci
copieu i en vector [i]

}

Bucle Per Cada (For Each)[modifica | modifica el codi]

Aquest bucle és una evolució del concepte del bucle Per a alguns llenguatges. S'utilitza per recórrer estructures repetitives de dades de forma més simple i àgil. El bucle For Each pot descriure genèricament (en pseudocodi) de la següent manera:

PER CADA element DE tipus A conjunt FER
 Cos
FI FOR each
  • Element : és el nom de la variable o objecte que pren l'element iterat en el cos del bucle.
  • Tipus de Dada : és el tipus de variable o la classe a la qual pertany l'objecte que es vol iterar.
  • Conjunt : és l'estructura de dades que es vol iterar. L'ús més típic és amb vectors o-en programació orientada a objectes-classes del tipus Col·lecció.
  • Cos : és el que es farà en cada iteració, poden ser una o més instruccions. Si bé no s'imposa una obligació sobre això, el més comú és que en aquest cos hi hagi alguna operació sobre l'element iterat.

Necessitat d'una nova estructura de control[modifica | modifica el codi]

Aquesta estructura sorgeix com una innovació en els llenguatges per permetre un codi més àgil i llegible en una situació que és una de les principals causes de l'ús del bucle PER: aplicar la mateixa operació sobre tots els elements d'un vector, i no necessitar conèixer la posició de l'element en el vector. Aquesta estructura amb el bucle PER es resol de la següent manera:

Amb el bucle PER CADA això es redueix a:

PER CADA x DE tipus A Vector FER
 x = AlgunaOperación (x)
FI PER

Els avantatges d'utilitzar l'estructura PER CADA són les següents:

  1. No cal cridar a una funció que obtingui la mida del vector
  2. No és necessari utilitzar la incòmoda notació de subíndexs per referir-nos al valor en qüestió, sobretot tenint en compte que si utilitzem aquesta estructura és perquè no necessitem el valor de l'índex.
  3. Ens permet fer una revisió en temps de compilació sobre el tipus de dada que representa l'element.

El bucle PER CADA no és un substitut del PER, és una millora per al molt freqüent cas anteriorment esmentat. La diferència essencial entre el bucle PER i el PER CADA és que en el primer guia la seva iteració per una variable que s'incrementa fins a cert punt de tall, en canvi en el segon el que guia la iteració és el recorregut de tots els elements d'un vector. Certament podem transformar qualsevol PER CADA en un PER, però transformar un bucle PER en un bucle PER CADA requeriria inicialitzar i controlar manualment les variables de control, amb la qual cosa es perdria novament llegibilitat en el codi. Per tant, quan en un llenguatge se'ns dóna la possibilitat d'utilitzar les dues estructures, l'elecció del PER CADA s'ha de fer en aquells casos per als quals va ser pensat: aplicar la mateixa operació a tots els elements d'un vector sense importar l'ordre en què es facin, si bé no és necessari que la variable element sigui utilitzada en el cos del bucle, la seva absència denota amb seguretat una mala elecció d'estructura de control.

Vegeu també[modifica | modifica el codi]

Referències[modifica | modifica el codi]