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 mínim 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 : pràcticament un mandat imposat per l'ús habitual és utilitzar la lletra i Iterador com a variable de control, o bé les seves successores en cas de bucles niats. L'ús d'aquesta lletra críptica potser a primera vista és, però, una excel·lent forma d'aportar agilitat de lectura al codi pel seu ús tan extensiu. Com rares vegades els bucles niats superen les tres dimensions (per una senzilla qüestió d'explosió exponencial), les lletres i, j i k solen ser les úniques relacionades amb aquest ús. En C es defineix en el primer paràmetre de la instrucció juntament amb la inicialització (opcional).
  • Inicialització de la variable de control : en pseudolenguaje es demana explicitar (és la secció : = ValorInicial ), 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. En C es defineix en el primer paràmetre del bucle juntament amb la variable de control.
  • Condició de control : en pseudolenguaje es veu representat pel valor final que pot prendre la variable de control (la secció A ValorFinal ). En C és el segon paràmetre i pot ser qualsevol condició (ni tan sols és obligació que hi hagi la variable de control, encara que una vegada més, això no es considera una bona pràctica).
  • Increment : en pseudolenguaje es pren per defecte el valor 1, encara que pot explicitar mitjançant de la sentència PAS = ValorPaso qualsevol nombre enter (llegiu bé sencer, o sigui que tècnicament podem decrementar). En C és l'últim paràmetre.
  • Cos : és el que es farà en cada iteració, poden ser una o més instruccions. En pseudolenguaje pesa la restricció de no poder alterar el valor de la variable de control, això no és requerit en C, però no es considera una bona pràctica.

Usos[modifica | modifica el codi]

El seu ús principal s'orienta als vectors, podent modificar, afegir, eliminar o consultar dades que es trobin segons l'índex. Per això últim, una condició mínima del vector és que ha de ser ordenat, perquè si està llegint una dada inexistent, això genera un error de programació.

For en pseudolenguaje[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.

PSEUDOLENGUAJE

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 pseudolenguaje[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 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 pseudolenguaje) 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]