Arbolito de navidad con C++

Ya que estamos en época navideña, saquemos el lado creativo y usemos la programación para hacer nuestro propio arbolito de navidad Je!. Vamos a ver el código del arbolito y a continuación una breve explicación de lo que hace cada una de las líneas que lo conforma, en tan solo 40 líneas de código!.

#include <iostream>
using namespace std;

#define URL "https://misfragmentosdecodigo.eu"

int main ()
{
    int acd = 1, numLineas;

    cout << "Ingrese el numero de lineas para su arbol: ";
    cin >> numLineas;

    for (int x = numLineas; x != 0; x--){
        cout.width(x);
        for (int n = 0; n < acd; n++){
            cout << "*";
        }
        acd += 2;
        cout << endl;
    }

    for (int x = ((acd - 2) / 2 - 3) / 2; x != 0; x--){
        cout.width((acd * 40) / 100);
        for (int n = 0; n < (acd * 20) / 100; n++){
            cout << "*";
        }
        cout << endl;
    }

    for (int x = 2; x != 0; x--){
        cout.width((acd * 30) / 100);
        for (int n = 0; n < (acd * 40) / 100; n++){
            cout << "*";
        }
        cout << endl;
    }

    cout << "\nFeliz navidad les desea " << endl;
    cout << URL << endl;
    return 0;
}

Este pequeño programa que tan solo posee 40 líneas de código ya las primeras líneas solo son comentarios ignorados por el compilador y es capaz de generar un arbolito de navidad totalmente dinámico; es decir, del tamaño que nosotros queramos o le indiquemos. Vamos por partes!.

#include <iostream>
using namespace std;

Bien, pienso que estas dos líneas no requieren una explicación detallada ya que fueron explicadas en una publicación anterior llamada Hola Mundo en C++; allí hago una breve explicación sobre la estructura básica que conforma a todo programa escrito en el lenguaje de programación C++. Recomiendo leerla.

#define URL "https://misfragmentosdecodigo.eu

Al igual que la línea #include, la línea anterior es una directiva del preprocesador que declara una constante que será evaluada por el compilador antes de compilar (valga la redundancia) el código con el identificador o nombre URL y contendrá la cadena de caracteres «https://misfragmentosdecodigo.eu».

La función int main() junto con las llave de apertura y de cierre {} también se explican en una publicación anterior; pero recordemos que ésta función es la función principal de todo programa escrito en C++ y es la única que se ejecuta de forma automática cuando el programa sea ejecutado.

Declaración de variables e ingreso de datos desde el teclado:
int acd = 1, numLineas;

cout << "Ingrese el numero de lineas para su arbol: ";
cin >> numLineas;

Aquí hay 3 líneas que realizan los procesos de creación, asignación y lectura de datos desde el teclado. La primera línea, declara las variables acd y numLineas; la primera variable se inicializa con el valor de 1, mientras que la segunda variable se inicializa con un valor indeterminado.

Las líneas con los objetos cout y cin son las que permiten realizar operaciones de ingreso y salida de datos, ambas sentencias forman parte la cabecera <iostream> y su uso común se realiza utilizando el cualificador std::por ejemplo: std::cout << "Hola Visitantes";Si desea usar cada sentencia sin cualificador o la forma corta, debe agregar el espacio de nombres std al espacio de nombres del archivo actual escribiendo using namespace std;. Como se puede notar en el código, hay 3 bucles for() y los explicare uno por uno.

Primer bucle for():
for (int x = numLineas; x != 0; x--){
   cout.width(x);
   for (int n = 0; n < acd; n++){
      cout << "*";
   }
   acd += 2;
   cout << endl;
}

¿Cómo funciona? El primer bucle for() se encarga de crear la parte superior del arbolito o el triángulo en forma de pino, posee en su interior tres sentencias cout, un bucle anidado y un acumulador. El bucle superior declara una variable (x) y le asigna el valor de la variable numLineas, este bucle itera en reversa reduciendo el valor de (x) por 1 hasta que sea diferente a 0; el método .width() es una función miembro que toma un valor entero y genera un espacio de ancho correspondiente al valor de (x) desde la margen izquierda de la terminal o consola, también se conoce como padding.

El bucle for anidado, itera desde 0 hasta el valor contenido en la variable acd; ésta variable se incrementa en 2 con cada iteración del bucle superior. La sentencia cout ubicada en el interior de bucle for anidado se encarga de imprimir en pantalla el signo «*» incrementado por 2 iniciando a partir de 1; por ejemplo, la primera iteración imprimirá un solo «*»; la segunda, imprimirá 3 «*» debido a que se incrementó por 2.

Segundo bucle for():
for (int x = ((acd - 2) / 2 - 3) / 2; x != 0; x--){
   cout.width((acd * 40) / 100);
   for (int n = 0; n < (acd * 20) / 100; n++){
      cout << "*";
   }
   cout << endl;
}

El segundo bucle for() tiene exactamente la misma estructura del bucle for() explicado anteriormente pero con varias diferencias ya que este bucle es el encargado de generar el tronco del arbolito y tiene un bucle anidado y 3 objetos cout, también.

¿En qué se diferencia del anterior bucle?. Básicamente tiene 3 diferencias, la primera está en la inicialización del bucle externo cuyo valor inicial corresponde a una operación matemática que nos permite determinar la altura del tronco del arbolito de navidad; la segunda está en el método .width() cuyo valor también es una operacion matematica proposicional para determinar a partir de qué punto se inicia la construcción del tronco; y, la última diferencia, se encuentra en el bucle anidado cuyo valor se genera de una operación matemática proporcional en porcentajes y permite determinar el ancho del tronco.

Tercer bucle for():
for (int x = 2; x != 0; x--){
   cout.width((acd * 30) / 100);
   for (int n = 0; n < (acd * 40) / 100; n++){
      cout << "*";
   }
   cout << endl;
}

El tercer bucle sigue el mismo diseño del primer bucle también con algunas diferencias; su misión, crear la base del arbolito. El primer bucle o bucle externo se inicializa un valor de 2, determina la altura de la base en solo 2 líneas mientras que el método .width() posee un valor de una operación matematica proposicional que determina a partir de qué punto se inicia la construcción de la base; el segundo bucle o bucle anidado, tiene una operación matemática proporcional en porcentajes y permite determinar el ancho de la base.

Al compilar y ejecutar el código completo nos produce un resultado como el siguiente:

Espero que les haya gustado esta publicación!!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *