1

Buenas, alguien me podría ayudar a como realizar el código para esta pirámide en entorno consola por favor. Con lenguaje C++.

          1
        1 2 1
      1 2 3 2 1
    1 2 3 4 3 2 1
  1 2 3 4 5 4 3 2 1 
1 2 3 4 5 6 5 4 3 2 1

Solo logré hacer esto

#include <iostream>
#include <conio.h>
#include <stdio.h>

using namespace std;
using namespace System;

int main()
{
    int  *n, *x, *y;
    x = new int;
    y = new int;    
    n = new int;

    cout << "Ingrese un numero : ";
    cin >> *n;

    for (*x = 1; *x <= *n ; *x = *x + 1)
    {
        for ( *y = 1; *y <= *n - *x ; *y = *y + 1)
        { 
            cout << "   ";          
        }

        for ( *y = 1; *y < *x + 1; *y = *y + 1)
        {
            cout << "  " << *y;
        }

        cout << endl << "\n";
    }

    getch();
    delete n;
    return 0;
}

LO CUAL IMPRIME LA MITAD DE LA PIRAMIDE. (La variable "*n" está con un valor de 6)

          1
        1 2
      1 2 3
    1 2 3 4
  1 2 3 4 5
1 2 3 4 5 6
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
Joan
  • 13
  • 1
  • 6

2 Answers2

4

No te voy a hacer la tarea, la magia de estos ejercicios esta en pasarsela pensando, sin complicarse haciendolo de la forma mas simple posible.

Estoy suponiendo que tu frustracion te trajo a este sitio(que no es un foro comun y corriente como otros), te recomiendo encarecidamente que leas:

Bien pues ahora volvamos a tu ejercicio:
Te voy a ayudar con la logica por un momento... Cuando escribes codigo, tienes que hacerlo lo mas bonito que te parece. ¿Por que? porque en algun momento de tu vida tienes q releer ese codigo y creeme si no esta bonito no te va a dar ganas de leerlo ni de estudiarlo, etc.

Para aprender C++ nesesitas practica, al igual que con las matematicas, esta sucecion es simple, tienes que recorrer hasta el numero y luego en reversa, en el codigo de abajo estoy representando este numero como la variable numerica entera int pisos, luego utilizo los bucles for para iterar o recorrer la condicion dada, que se lee asi:

Desde el numero i que valdra 1, quiero que recorra hasta el la variable pisos que es 6, siempre y cuando i al incrementarse, siga siendo menor igual a pisos; luego ejecuta por cada vez que i se incremente, un for que dira; hasta que j que vale 1 sea menor a i, imprime la diferencia entre i e j. Luego imprime un salto de linea cout << endl; cuando acabes de hacer el for con j, el bucle for con k solo imprime la parte acendiente, hasta antes del numero .

#include <iostream>
using namespace std;

int main() {
    int pisos = 6;
    for (int i = 1; i <= pisos; i++) {
        for (int k = 1; k < i ;k++) {
            cout << k << " ";
        }
        
        for (int j = 0; j < i; j++) {
            cout << i-j << " ";
        }
        cout << endl;
    }

    return 0;
}

El codigo que te escribi resuelve, a la mitad tu ejercicio, te lo pongo todo porque hay mas dificultad en manipular los espacios " ".
Buena suerte!

Resolucion

Te recomiendo que veas eso solo cuando hayas intentado de todoy aun asi no hayas conseguido sacar la piramide.

#include <iostream>
using namespace std;

int main() {
    int pisos = 6;
    for (int i = 1; i <= pisos; i++) {
        //calcula los espacios a imprimir por la izquierda
        for (int x = 0; x < pisos -i; x++) {
            cout << "  ";
        }
        //imprime crecientemente los numeros hasta 1 antes del limite
        for (int k = 1; k < i ;k++) {
            cout << k << " ";
        }
        //imprime los elementos desde el limite decrecientemente hasta 1
        for (int j = 0; j < i; j++) {
            cout << i-j << " ";
        }
        cout << endl;
    }

    return 0;
}

Efectivamente todo lo que dice PaperBirdMaster es correcto, estas usando librerias inutiles, que nisiquiera son de C++, y el uso de punteros es basicamtente ahogarse en un vaso de agua, como puedes notar en mi resolucion, puedes tener la solucion al problema sencillamente, no deseo usar string porque no quiero sumergirme en C++, lo hago solo usando matematica sencilla.

El ultimo for que agregue con x lo que hace es imprimir la cantidad de espacios que nesesitamos, si te dijas la logica esta en que es el mismo triangulo pero invertido(volteado de cabeza) en espacios, si teniamos el limite que era 6, entonces imprimimos 5 espacios, porque son los 6 menos el caracter, salen 5. Y asi sucecivamente, hasta que el limite es 0 espacios y lleno de caracteres. Yo te pongo " " porque le agregamos un espacio a cada caracter o numero por elemento, asi que para que se acomode en la consola, le puse 2 espacios para asi verlo legible.

Egon Stetmann.
  • 565
  • 4
  • 20
4

Tienes una serie de problemas y fallos de concepto que te conviene abordar.

Incluyes cabeceras incorrectas, que no usas.

Tanto <conio.h> <stdio.h> son cabeceras del lenguaje no de y no deben ser usadas si compilas como C++ (en ocasiones ni siquiera podrán ser usadas). Para más detalles acerca de ello consulta esta pregunta. Además de ser cabeceras que no corresponden con el lenguaje que pretendes usar, no usas ninguna de sus utilidades que contienen.

El espacio de nombres Sytem no existe.

No se qué significa using namespace System; pero ese espacio de nombres ni existe ni está contenido en ninguna de las cabeceras que incluyes, tal vez se trate de algo que no has compartido en tu código.

No necesitas punteros, pero si los necesitas debes borrarlos al final.

El lenguaje C++ moderno está intentando que los punteros en crudo queden en desuso. Tus variables x, y y n son punteros en crudo que podrían ser substituidas por enteros (int) normales. Si por algún motivo tienes que usarlas como punteros al final no debes borrar (delete) sólo n, deberás borrar todas ellas:

int main()
{
    int  *n, *x, *y;
    x = new int;
    y = new int;    
    n = new int;

    // Hacer cosas...

    delete n;
    delete x; // <-- borrar x
    delete y; // <-- borrar y
    return 0;
}

Pero si quieres programar C++ moderno deberías substituir los punteros por std::unique_ptr de la cabecera <memory>:

using pint = std::unique_ptr<int>;

pint  n, x, y;
x.reset(new int);
y.reset(new int);
n.reset(new int);

Usando std::unique_ptr sólo debes preocuparte de solicitar la memoria, que el propio objeto se ocupa de liberarla, está preparado para funcionar de la misma manera que un puntero por lo que el resto del código que escribiste funcionará igual.

Solución.

El ejercicio de la pirámide de números es sencillo una vez se descubre el patrón:

  1. La cantidad de espacios a la izquierda de cada piso de la pirámide es siempre (n - piso - 1) * 2 (asumiendo que los pisos se indexan en 0).
  2. Los números incrementan desde el valor 1 siempre en hasta alcanzar el valor piso, tras ello decrementan hasta alcanzar el valor 1.

Para conseguir el primer punto, puedes usar la clase std::string, que dispone de un constructor que te permite construir una cadena mediante la repetición de una cantidad de caracteres:

//                                           vvv <-- Queremos una cadena de espacios
std::cout << std::string((n - piso - 1) * 2, ' ');
//                       ^^^^^^^^^^^^^^^^^^ <-- La cadena tiene todos estos elementos

Para el segundo punto un par de bucles anidados en el bucle de piso sería suficiente:

    // Bucle ascendente:
    for (; valor <= limite; ++valor) std::cout << ' ' << valor;
    // Bucle descendente:
    for (valor -= 2; valor >= 1; --valor) std::cout << ' ' << valor;

La variable limite será el valor del piso incrementado en uno y el valor siempre debería empezar en 1.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82