No entiendo el uso de std::setw

publicado por: Anonymous

Estoy haciendo un ejercicio de un libro de C++ que utilizo para aprender el lenguaje, y no consigo comprender del todo el uso de std::setw y su uso conjunto con std::left (por defecto) y std::right. De hecho, no se como, he dado con la clave para realizar lo que queria hacer, pero no entiendo por que funciona..

Diganme si estoy equivocado, por favor, pero segun lo que yo pienso:

  • El bucle for j hace que se despliegue el primer triangulo de *.
  • La linea cout << right << setw(16 – i); hace que se vayan separando las b de los * en cada linea hacia la derecha de cada *, en 16 -i espacios, partiendo del caracter inmediato a cada *.
  • El bucle for z añade el triangulo compuesto por letras b.
  • La instruccion cout << right << setw(4 + i * 2); es donde ya me pierdo, porque no conseguia que saliese ese resultado que es el que yo quiero, y no me digais por que, si fue intuicion o que, pero me dio por ponerle el “* 2” y asi si que salio xD

Por favor, se que es mucho pedir, pero si alguien pudiese explicarme el por que funciona y por que me lio tanto con esa instruccion se lo agradeceria enormemente.

    #include <iostream>

    using std::cout;
    using std::endl;

    #include <iomanip>

    using std::setw;
    using std::right;
    using std::left;

    int main() {
        for(int i = 1; i <= 10; i++) {
            for(int j = i; j >=1; j--)
                cout << '*';

            cout << right << setw(16 - i);

            for(int z = 11 - i; z >= 1; z--)
                cout  << 'b';

            cout << right << setw(4 + i * 2);

            for(int y = 11 - i; y >= 1; y--)
                cout << 'a';

            cout << endl;
        }

        return 0;
    }

Tambien pongo la salida que me da a mi, por si no fuese portable.

*              bbbbbbbbbb     aaaaaaaaaa
**             bbbbbbbbb       aaaaaaaaa
***            bbbbbbbb         aaaaaaaa
****           bbbbbbb           aaaaaaa
*****          bbbbbb             aaaaaa
******         bbbbb               aaaaa
*******        bbbb                 aaaa
********       bbb                   aaa
*********      bb                     aa
**********     b                       a

solución

Si entendí tu pregunta cout << right << setw(4 + i * 2); forma la pirámide de espacios en medio por que el espacio que incrementas a 4 por la suma de i es duplicado, piensa que si tuvieras esta instrucción cout << right << setw(4 + i); tu resultado sería algo como:

*              bbbbbbbbbb    aaaaaaaaaa
**             bbbbbbbbb     aaaaaaaaa
***            bbbbbbbb      aaaaaaaa
****           bbbbbbb       aaaaaaa
*****          bbbbbb        aaaaaa
******         bbbbb         aaaaa
*******        bbbb          aaaa
********       bbb           aaa
*********      bb            aa
**********     b             a

Al multiplicar i por 2 el espacio que dejas para cada línea entre la b y la a es duplicado, cuando i = 1 va a dejar 6 espacios, en la siguiente línea dejará 8y así progresivamente.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *