C++ Bucles for

Enviado por jvilella el Lun, 23/09/2019 - 04:00

Requisitos:

for nos permite hacer repeticiones poniendo en una sola línea el valor inicial del contador, la condición y como varía (normalmente es un incremento) este valor cada vez que llega al final de una vuelta del bucle.

for (inicializacion; condicion; incremento) {
    ....
}

Por ejemplo:

for (int i = 0; i < 10; i = i + 1) {
    cout << i << endl;
}

Es equivalente a:

int i = 0;
while (i < 10) {
    cout << i << endl;
    i = i + 1;
}

Todo lo que se puede hacer con while se puede hacer con for y viceversa, es solo una manera más rápida de escribirlo (y a veces más clara). Es muy habitual usar for para recorrer un vector, por ejemplo en el siguiente ejemplo se pide al usuario que introduzca todos los valores de un vector y luego los muestra por pantalla en orden inverso:

vector<int> dorsales_corredores(10);
for (int i = 0; i < dorsales_corredores.size(); i++) {
    cout << "Dorsale de corredor que ha cruzado la meta: ";
    cin >> dorsales_corredores[i];
}
cout << "Clasificación de los 10 primeros ganadores en el orden en que daremos las medallas:" << endl;
for (int i = dorsales_corredores.size() - 1; i >= 0; i--) {
    cout << dorsales_corredores[i] << endl;
}

Fíjate que en el segundo for se recorre el vector dorsales_corredores desde la última posición a la primera, y que la última posición es dorsales_corredores.size()-1 (no dorsales_corredores.size()).

 

Nota: El último código que hemos escrito para recorrer un vector en orden inverso fallará si el vector está vacío por una razón técnica: el valor que devuelve la función .size() es de tipo entero sin signo, por lo que al restar uno al valor cero se producirá un subdesbordamiento (underflow), ya que un entero sin signo no puede tener valores negativos. Una forma de solucionar esto es hacer un cast a entero con signo:

cout << "Clasificación de los 10 primeros ganadores en el orden en que daremos las medallas:" << endl;
for (int i = ((int)dorsales_corredores.size()) - 1; i >= 0; i--) {
    cout << dorsales_corredores[i] << endl;
}

 

Printer Friendly, PDF & Email

Comentarios

vector<int> dorsales_corredores(10);
for (int i=0; i<dorsales_corredores.size(); i++) {
cout << "Dorsale de corredor que ha cruzado la meta: " ;
dorsales_corredores[i] = i+1;
cout << dorsales_corredores[i] << endl;
}
cout << "Clasificación de los 10 primeros ganadores en el orden en que daremos las medallas:" << endl;
for (int i=dorsales_corredores.size()-1; i>=0; i--) {
cout << dorsales_corredores[i] << endl;
}

Tu código no es correcto. Al poner en el primer for() la línea

dorsales_corredores[i] = i+1;

estás diciendo que el primero en cruzar (i = 0) es el que tiene el dorsal 1, el segundo en cruzar (i = 1) es el que tiene el dorsal 2, etc.
La idea del código es que el que está en la meta va introduciendo los dorsales de los corredores a medida que cruzan la meta, por eso la línea dentro del primer for() es

cin >> dorsales_corredores[i];

Añadir nuevo comentario

Texto sin formato

  • No se permiten etiquetas HTML.
  • Saltos automáticos de líneas y de párrafos.
  • Las direcciones de correos electrónicos y páginas web se convierten en enlaces automáticamente.